/* Replayable replacements for global functions */

/***************************************************************
 * BEGIN STABLE.JS
 **************************************************************/
//! stable.js 0.1.3, https://github.com/Two-Screen/stable
//! © 2012 Stéphan Kochen, Angry Bytes. MIT licensed.
(function() {

// A stable array sort, because `Array#sort()` is not guaranteed stable.
// This is an implementation of merge sort, without recursion.

var stable = function(arr, comp) {
    if (typeof(comp) !== 'function') {
        comp = function(a, b) {
            a = String(a);
            b = String(b);
            if (a < b) return -1;
            if (a > b) return 1;
            return 0;
        };
    }

    var len = arr.length;

    if (len <= 1) return arr;

    // Rather than dividing input, simply iterate chunks of 1, 2, 4, 8, etc.
    // Chunks are the size of the left or right hand in merge sort.
    // Stop when the left-hand covers all of the array.
    var oarr = arr;
    for (var chk = 1; chk < len; chk *= 2) {
        arr = pass(arr, comp, chk);
    }
    for (var i = 0; i < len; i++) {
        oarr[i] = arr[i];
    }
    return oarr;
};

// Run a single pass with the given chunk size. Returns a new array.
var pass = function(arr, comp, chk) {
    var len = arr.length;
    // Output, and position.
    var result = new Array(len);
    var i = 0;
    // Step size / double chunk size.
    var dbl = chk * 2;
    // Bounds of the left and right chunks.
    var l, r, e;
    // Iterators over the left and right chunk.
    var li, ri;

    // Iterate over pairs of chunks.
    for (l = 0; l < len; l += dbl) {
        r = l + chk;
        e = r + chk;
        if (r > len) r = len;
        if (e > len) e = len;

        // Iterate both chunks in parallel.
        li = l;
        ri = r;
        while (true) {
            // Compare the chunks.
            if (li < r && ri < e) {
                // This works for a regular `sort()` compatible comparator,
                // but also for a simple comparator like: `a > b`
                if (comp(arr[li], arr[ri]) <= 0) {
                    result[i++] = arr[li++];
                }
                else {
                    result[i++] = arr[ri++];
                }
            }
            // Nothing to compare, just flush what's left.
            else if (li < r) {
                result[i++] = arr[li++];
            }
            else if (ri < e) {
                result[i++] = arr[ri++];
            }
            // Both iterators are at the chunk ends.
            else {
                break;
            }
        }
    }

    return result;
};

var arrsort = function(comp) {
    return stable(this, comp);
};

if (Object.defineProperty) {
    Object.defineProperty(Array.prototype, "sort", {
        configurable: true, writable: true, enumerable: false,
        value: arrsort
    });
} else {
    Array.prototype.sort = arrsort;
}

})();
/***************************************************************
 * END STABLE.JS
 **************************************************************/

/*
 * In a generated replay, this file is partially common, boilerplate code
 * included in every replay, and partially generated replay code. The following
 * header applies to the boilerplate code. A comment indicating "Auto-generated
 * below this comment" marks the separation between these two parts.
 *
 * Copyright (C) 2011, 2012 Purdue University
 * Written by Gregor Richards
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

(function() {
    // global eval alias
    var geval = eval;

    // detect if we're in a browser or not
    var inbrowser = false;
    var inharness = false;
    var finished = false;
    if (typeof window !== "undefined" && "document" in window) {
        inbrowser = true;
        if (window.parent && "JSBNG_handleResult" in window.parent) {
            inharness = true;
        }
    } else if (typeof global !== "undefined") {
        window = global;
        window.top = window;
    } else {
        window = (function() { return this; })();
        window.top = window;
    }

    if ("console" in window) {
        window.JSBNG_Console = window.console;
    }

    var callpath = [];

    // global state
    var JSBNG_Replay = window.top.JSBNG_Replay = {
        push: function(arr, fun) {
            arr.push(fun);
            return fun;
        },

        path: function(str) {
            verifyPath(str);
        },

        forInKeys: function(of) {
            var keys = [];
            for (var k in of)
                keys.push(k);
            return keys.sort();
        }
    };

    var currentTimeInMS;
    if (inharness) {
        currentTimeInMS = window.parent.currentTimeInMS;
    } else {
        if (window.performance && window.performance.now)
            currentTimeInMS = function() { return window.performance.now() };
        else if (typeof preciseTime !== 'undefined')
            currentTimeInMS = function() { return preciseTime() * 1000; };
        else
            currentTimeInMS = function() { return Date.now(); };
    }

    // the actual replay runner
    function onload() {
        try {
            delete window.onload;
        } catch (ex) {}

        var jr = JSBNG_Replay$;
        var cb = function() {
            var end = currentTimeInMS();
            finished = true;

            var msg = "Time: " + (end - st) + "ms";
    
            if (inharness) {
                window.parent.JSBNG_handleResult({error:false, time:(end - st)});
            } else if (inbrowser) {
                var res = document.createElement("div");
    
                res.style.position = "fixed";
                res.style.left = "1em";
                res.style.top = "1em";
                res.style.width = "35em";
                res.style.height = "5em";
                res.style.padding = "1em";
                res.style.backgroundColor = "white";
                res.style.color = "black";
                res.appendChild(document.createTextNode(msg));
    
                document.body.appendChild(res);
            } else if (typeof console !== "undefined") {
                console.log(msg);
            } else if (typeof print !== "undefined") {
                // hopefully not the browser print() function :)
                print(msg);
            }
        };

        // force it to JIT
        jr(false);

        // then time it
        var st = currentTimeInMS();
        while (jr !== null) {
            jr = jr(true, cb);
        }
    }

    // add a frame at replay time
    function iframe(pageid) {
        var iw;
        if (inbrowser) {
            // represent the iframe as an iframe (of course)
            var iframe = document.createElement("iframe");
            iframe.style.display = "none";
            document.body.appendChild(iframe);
            iw = iframe.contentWindow;
            iw.document.write("<script type=\"text/javascript\">var JSBNG_Replay_geval = eval;</script>");
            iw.document.close();
        } else {
            // no general way, just lie and do horrible things
            var topwin = window;
            (function() {
                var window = {};
                window.window = window;
                window.top = topwin;
                window.JSBNG_Replay_geval = function(str) {
                    eval(str);
                }
                iw = window;
            })();
        }
        return iw;
    }

    // called at the end of the replay stuff
    function finalize() {
        if (inbrowser) {
            setTimeout(onload, 0);
        } else {
            onload();
        }
    }

    // verify this recorded value and this replayed value are close enough
    function verify(rep, rec) {
        if (rec !== rep &&
            (rep === rep || rec === rec) /* NaN test */) {
            // FIXME?
            if (typeof rec === "function" && typeof rep === "function") {
                return true;
            }
            if (typeof rec !== "object" || rec === null ||
                !(("__JSBNG_unknown_" + typeof(rep)) in rec)) {
                return false;
            }
        }
        return true;
    }

    // general message
    var firstMessage = true;
    function replayMessage(msg) {
        if (inbrowser) {
            if (firstMessage)
                document.open();
            firstMessage = false;
            document.write(msg);
        } else {
            console.log(msg);
        }
    }

    // complain when there's an error
    function verificationError(msg) {
        if (finished) return;
        if (inharness) {
            window.parent.JSBNG_handleResult({error:true, msg: msg});
        } else replayMessage(msg);
        throw new Error();
    }

    // to verify a set
    function verifySet(objstr, obj, prop, gvalstr, gval) {
        if (/^on/.test(prop)) {
            // these aren't instrumented compatibly
            return;
        }

        if (!verify(obj[prop], gval)) {
            var bval = obj[prop];
            var msg = "Verification failure! " + objstr + "." + prop + " is not " + gvalstr + ", it's " + bval + "!";
            verificationError(msg);
        }
    }

    // to verify a call or new
    function verifyCall(iscall, func, cthis, cargs) {
        var ok = true;
        var callArgs = func.callArgs[func.inst];
        iscall = iscall ? 1 : 0;
        if (cargs.length !== callArgs.length - 1) {
            ok = false;
        } else {
            if (iscall && !verify(cthis, callArgs[0])) ok = false;
            for (var i = 0; i < cargs.length; i++) {
                if (!verify(cargs[i], callArgs[i+1])) ok = false;
            }
        }
        if (!ok) {
            var msg = "Call verification failure!";
            verificationError(msg);
        }

        return func.returns[func.inst++];
    }

    // to verify the callpath
    function verifyPath(func) {
        var real = callpath.shift();
        if (real !== func) {
            var msg = "Call path verification failure! Expected " + real + ", found " + func;
            verificationError(msg);
        }
    }

    // figure out how to define getters
    var defineGetter;
    if (Object.defineProperty) {
        var odp = Object.defineProperty;
        defineGetter = function(obj, prop, getter, setter) {
            if (typeof setter === "undefined") setter = function(){};
            odp(obj, prop, {"enumerable": true, "configurable": true, "get": getter, "set": setter});
        };
    } else if (Object.prototype.__defineGetter__) {
        var opdg = Object.prototype.__defineGetter__;
        var opds = Object.prototype.__defineSetter__;
        defineGetter = function(obj, prop, getter, setter) {
            if (typeof setter === "undefined") setter = function(){};
            opdg.call(obj, prop, getter);
            opds.call(obj, prop, setter);
        };
    } else {
        defineGetter = function() {
            verificationError("This replay requires getters for correct behavior, and your JS engine appears to be incapable of defining getters. Sorry!");
        };
    }

    var defineRegetter = function(obj, prop, getter, setter) {
        defineGetter(obj, prop, function() {
            return getter.call(this, prop);
        }, function(val) {
            // once it's set by the client, it's claimed
            setter.call(this, prop, val);
            Object.defineProperty(obj, prop, {
                "enumerable": true, "configurable": true, "writable": true,
                "value": val
            });
        });
    }

    // for calling events
    var fpc = Function.prototype.call;

// resist the urge, don't put a })(); here!
/******************************************************************************
 * Auto-generated below this comment
 *****************************************************************************/
var ow920654002 = window;
var f920654002_0;
var o0;
var o1;
var o2;
var f920654002_4;
var f920654002_7;
var f920654002_11;
var f920654002_12;
var f920654002_13;
var f920654002_14;
var f920654002_15;
var o3;
var o4;
var o5;
var o6;
var f920654002_50;
var f920654002_56;
var f920654002_57;
var f920654002_143;
var f920654002_257;
var f920654002_417;
var f920654002_418;
var f920654002_419;
var f920654002_420;
var o7;
var f920654002_422;
var o8;
var o9;
var f920654002_425;
var f920654002_427;
var o10;
var f920654002_429;
var f920654002_432;
var f920654002_433;
var o11;
var o12;
var o13;
var o14;
var o15;
var o16;
var o17;
var f920654002_453;
var f920654002_456;
var f920654002_458;
var f920654002_461;
var f920654002_462;
var f920654002_464;
var f920654002_465;
var f920654002_467;
var o18;
var o19;
var f920654002_471;
var o20;
var o21;
var o22;
var o23;
var o24;
var o25;
var o26;
var o27;
var o28;
var o29;
var o30;
var o31;
var fo920654002_576_firstChild;
var o32;
var o33;
var f920654002_584;
var f920654002_587;
var f920654002_588;
var o34;
var o35;
var o36;
var fo920654002_595_firstChild;
var f920654002_602;
var o37;
var o38;
var o39;
var o40;
var o41;
var o42;
var f920654002_646;
var o43;
var o44;
var o45;
var o46;
var fo920654002_600_firstChild;
var o47;
var o48;
var o49;
var o50;
var o51;
var o52;
var o53;
var o54;
var fo920654002_872_firstChild;
var o55;
var o56;
var o57;
var o58;
var o59;
var fo920654002_1_cookie;
var f920654002_1015;
var f920654002_1016;
var f920654002_1017;
var f920654002_1038;
var o60;
var o61;
var o62;
var o63;
var f920654002_1117;
var o64;
var o65;
var o66;
var o67;
var o68;
var o69;
var o70;
var o71;
var fo920654002_1155_firstChild;
var o72;
var o73;
var o74;
var o75;
var o76;
var fo920654002_1385_firstChild;
var o77;
var o78;
var o79;
var o80;
var o81;
var o82;
var o83;
var o84;
var fo920654002_1402_firstChild;
var o85;
var o86;
var f920654002_1447;
var f920654002_1448;
var f920654002_1449;
var f920654002_1451;
var f920654002_1453;
var f920654002_1454;
var f920654002_1457;
var f920654002_1458;
var f920654002_1459;
var f920654002_1461;
var f920654002_1462;
var f920654002_1466;
var f920654002_1467;
var f920654002_1468;
var f920654002_1470;
var f920654002_1478;
var o87;
var o88;
var f920654002_1519;
var o89;
var o90;
var o91;
var o92;
var o93;
var f920654002_1530;
var fo920654002_1554_firstChild;
var f920654002_1560;
var fo920654002_1590_firstChild;
var f920654002_1639;
var o94;
var o95;
var o96;
var o97;
var f920654002_1658;
var o98;
var o99;
var o100;
var o101;
var o102;
var o103;
var o104;
var o105;
var o106;
var o107;
var f920654002_1989;
var f920654002_2005;
var f920654002_2006;
var f920654002_2017;
var f920654002_2023;
var o108;
var o109;
var o110;
var o111;
var f920654002_2136;
var f920654002_2150;
var f920654002_2151;
var o112;
var o113;
var fo920654002_2171_firstChild;
var f920654002_2177;
var f920654002_2354;
var f920654002_2377;
var f920654002_2378;
var f920654002_2410;
var fo920654002_2413_firstChild;
var fo920654002_2418_firstChild;
var fo920654002_2425_firstChild;
var f920654002_2430;
var f920654002_2432;
var f920654002_2433;
var f920654002_2435;
var f920654002_2436;
var f920654002_2438;
var f920654002_2440;
var f920654002_2448;
var f920654002_2450;
var f920654002_2451;
var f920654002_2452;
var f920654002_2453;
var f920654002_2455;
var f920654002_2456;
var f920654002_2457;
var f920654002_2460;
var f920654002_2461;
var f920654002_2462;
var f920654002_2463;
var fo920654002_2467_firstChild;
var f920654002_2473;
var f920654002_2474;
var f920654002_2475;
var f920654002_2477;
var f920654002_2478;
var f920654002_2479;
var f920654002_2480;
var f920654002_2481;
var f920654002_2482;
var f920654002_2483;
var f920654002_2485;
var f920654002_2489;
var f920654002_2490;
var f920654002_2491;
var f920654002_2492;
var f920654002_2493;
var f920654002_2494;
var f920654002_2495;
var f920654002_2496;
var f920654002_2497;
var f920654002_2498;
var f920654002_2499;
var f920654002_2505;
var fo920654002_2524_firstChild;
var fo920654002_2529_firstChild;
var fo920654002_2536_firstChild;
var f920654002_2555;
var o114;
var o115;
var f920654002_2559;
var f920654002_2560;
var f920654002_2566;
var o116;
var o117;
var o118;
var o119;
var f920654002_2573;
var f920654002_2574;
var f920654002_2575;
var f920654002_2577;
var o120;
var o121;
var o122;
var o123;
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_222 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_166 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_225 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_169 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_171 = [];
JSBNG_Replay.s89b45f8367840725134eb4d5bfbd7b4248c14bdd_89 = [];
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_845 = [];
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_523 = [];
JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_96 = [];
JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_512 = [];
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757 = [];
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361 = [];
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_2 = [];
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_739 = [];
JSBNG_Replay.s48bc6385ad36661d437816c45525368eecdb65f2_257 = [];
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839 = [];
JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545 = [];
JSBNG_Replay.sedba73fa8ed79e84359ef405d7a57caf24a0f008_91 = [];
JSBNG_Replay.scb38ed7c6aaa195a276ac7856568a7b9e8f51b72_133 = [];
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_226 = [];
// 1
// record generated by JSBench 8fa236f2f0ec at 2013-07-10T21:27:49.218Z
// 2
// 3
f920654002_0 = function() { return f920654002_0.returns[f920654002_0.inst++]; };
f920654002_0.returns = [];
f920654002_0.inst = 0;
// 4
ow920654002.JSBNG__Date = f920654002_0;
// 5
o0 = {};
// 6
ow920654002.JSBNG__document = o0;
// 7
o1 = {};
// 8
ow920654002.JSBNG__sessionStorage = o1;
// 9
o2 = {};
// 10
ow920654002.JSBNG__localStorage = o2;
// 11
f920654002_4 = function() { return f920654002_4.returns[f920654002_4.inst++]; };
f920654002_4.returns = [];
f920654002_4.inst = 0;
// 12
ow920654002.JSBNG__getComputedStyle = f920654002_4;
// 17
f920654002_7 = function() { return f920654002_7.returns[f920654002_7.inst++]; };
f920654002_7.returns = [];
f920654002_7.inst = 0;
// 18
ow920654002.JSBNG__addEventListener = f920654002_7;
// 19
ow920654002.JSBNG__top = ow920654002;
// 24
ow920654002.JSBNG__scrollX = 0;
// 25
ow920654002.JSBNG__scrollY = 0;
// 28
f920654002_11 = function() { return f920654002_11.returns[f920654002_11.inst++]; };
f920654002_11.returns = [];
f920654002_11.inst = 0;
// 29
ow920654002.JSBNG__scrollBy = f920654002_11;
// 30
f920654002_12 = function() { return f920654002_12.returns[f920654002_12.inst++]; };
f920654002_12.returns = [];
f920654002_12.inst = 0;
// 31
ow920654002.JSBNG__setTimeout = f920654002_12;
// 32
f920654002_13 = function() { return f920654002_13.returns[f920654002_13.inst++]; };
f920654002_13.returns = [];
f920654002_13.inst = 0;
// 33
ow920654002.JSBNG__setInterval = f920654002_13;
// 34
f920654002_14 = function() { return f920654002_14.returns[f920654002_14.inst++]; };
f920654002_14.returns = [];
f920654002_14.inst = 0;
// 35
ow920654002.JSBNG__clearTimeout = f920654002_14;
// 36
f920654002_15 = function() { return f920654002_15.returns[f920654002_15.inst++]; };
f920654002_15.returns = [];
f920654002_15.inst = 0;
// 37
ow920654002.JSBNG__clearInterval = f920654002_15;
// 42
ow920654002.JSBNG__frames = ow920654002;
// 45
ow920654002.JSBNG__self = ow920654002;
// 46
o3 = {};
// 47
ow920654002.JSBNG__navigator = o3;
// 50
o4 = {};
// 51
ow920654002.JSBNG__history = o4;
// 62
ow920654002.JSBNG__closed = false;
// 65
ow920654002.JSBNG__opener = null;
// 66
ow920654002.JSBNG__defaultStatus = "";
// 67
o5 = {};
// 68
ow920654002.JSBNG__location = o5;
// 69
ow920654002.JSBNG__innerWidth = 1024;
// 70
ow920654002.JSBNG__innerHeight = 702;
// 71
ow920654002.JSBNG__outerWidth = 1024;
// 72
ow920654002.JSBNG__outerHeight = 774;
// 73
ow920654002.JSBNG__screenX = 79;
// 74
ow920654002.JSBNG__screenY = 22;
// 75
ow920654002.JSBNG__pageXOffset = 0;
// 76
ow920654002.JSBNG__pageYOffset = 0;
// 101
ow920654002.JSBNG__frameElement = null;
// 110
o6 = {};
// 111
ow920654002.JSBNG__webkitNotifications = o6;
// 112
ow920654002.JSBNG__screenLeft = 79;
// 113
ow920654002.JSBNG__clientInformation = o3;
// 114
ow920654002.JSBNG__defaultstatus = "";
// 119
ow920654002.JSBNG__devicePixelRatio = 1;
// 122
ow920654002.JSBNG__offscreenBuffering = true;
// 123
ow920654002.JSBNG__screenTop = 22;
// 126
f920654002_50 = function() { return f920654002_50.returns[f920654002_50.inst++]; };
f920654002_50.returns = [];
f920654002_50.inst = 0;
// 127
ow920654002.JSBNG__webkitRequestAnimationFrame = f920654002_50;
// 138
f920654002_56 = function() { return f920654002_56.returns[f920654002_56.inst++]; };
f920654002_56.returns = [];
f920654002_56.inst = 0;
// 139
ow920654002.JSBNG__XMLHttpRequest = f920654002_56;
// 140
f920654002_57 = function() { return f920654002_57.returns[f920654002_57.inst++]; };
f920654002_57.returns = [];
f920654002_57.inst = 0;
// 141
ow920654002.JSBNG__Image = f920654002_57;
// 142
ow920654002.JSBNG__name = "_e_06rS";
// 149
ow920654002.JSBNG__status = "";
// 314
f920654002_143 = function() { return f920654002_143.returns[f920654002_143.inst++]; };
f920654002_143.returns = [];
f920654002_143.inst = 0;
// 315
ow920654002.JSBNG__Document = f920654002_143;
// 542
f920654002_257 = function() { return f920654002_257.returns[f920654002_257.inst++]; };
f920654002_257.returns = [];
f920654002_257.inst = 0;
// 543
ow920654002.JSBNG__Event = f920654002_257;
// 588
ow920654002.JSBNG__XMLDocument = f920654002_143;
// 863
ow920654002.JSBNG__onerror = null;
// 864
f920654002_417 = function() { return f920654002_417.returns[f920654002_417.inst++]; };
f920654002_417.returns = [];
f920654002_417.inst = 0;
// 865
ow920654002.Math.JSBNG__random = f920654002_417;
// 866
// 870
f920654002_418 = function() { return f920654002_418.returns[f920654002_418.inst++]; };
f920654002_418.returns = [];
f920654002_418.inst = 0;
// 871
f920654002_0.now = f920654002_418;
// 872
f920654002_418.returns.push(1373491946288);
// 873
o5.search = "";
// 889
// 890
// 892
f920654002_419 = function() { return f920654002_419.returns[f920654002_419.inst++]; };
f920654002_419.returns = [];
f920654002_419.inst = 0;
// 893
o0.JSBNG__addEventListener = f920654002_419;
// 894
o3.userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13";
// 896
f920654002_419.returns.push(undefined);
// 897
f920654002_420 = function() { return f920654002_420.returns[f920654002_420.inst++]; };
f920654002_420.returns = [];
f920654002_420.inst = 0;
// 898
ow920654002.JSBNG__onload = f920654002_420;
// 906
o7 = {};
// 913
o0.documentMode = void 0;
// 915
f920654002_422 = function() { return f920654002_422.returns[f920654002_422.inst++]; };
f920654002_422.returns = [];
f920654002_422.inst = 0;
// 916
o0.getElementsByTagName = f920654002_422;
// 917
o8 = {};
// 918
f920654002_422.returns.push(o8);
// 919
o8.length = 1;
// 920
o9 = {};
// 921
o8["0"] = o9;
// undefined
o8 = null;
// 922
f920654002_425 = function() { return f920654002_425.returns[f920654002_425.inst++]; };
f920654002_425.returns = [];
f920654002_425.inst = 0;
// 923
o0.createDocumentFragment = f920654002_425;
// 924
o8 = {};
// 925
f920654002_425.returns.push(o8);
// 927
f920654002_418.returns.push(1373491946328);
// 928
f920654002_427 = function() { return f920654002_427.returns[f920654002_427.inst++]; };
f920654002_427.returns = [];
f920654002_427.inst = 0;
// 929
o0.createElement = f920654002_427;
// 930
o10 = {};
// 931
f920654002_427.returns.push(o10);
// 932
// 933
// 934
// 935
// 936
// 937
// 938
f920654002_429 = function() { return f920654002_429.returns[f920654002_429.inst++]; };
f920654002_429.returns = [];
f920654002_429.inst = 0;
// 939
o8.appendChild = f920654002_429;
// 940
f920654002_429.returns.push(o10);
// undefined
o10 = null;
// 942
f920654002_418.returns.push(1373491946330);
// 944
o10 = {};
// 945
f920654002_427.returns.push(o10);
// 946
// 947
// 948
// 949
// 950
// 951
// 953
f920654002_429.returns.push(o10);
// undefined
o10 = null;
// 955
f920654002_418.returns.push(1373491946331);
// 957
o10 = {};
// 958
f920654002_427.returns.push(o10);
// 959
// 960
// 961
// 962
// 963
// 964
// 966
f920654002_429.returns.push(o10);
// undefined
o10 = null;
// 967
o9.appendChild = f920654002_429;
// 968
f920654002_429.returns.push(o8);
// undefined
o8 = null;
// 977
f920654002_417.returns.push(0.7085472359322011);
// 978
f920654002_432 = function() { return f920654002_432.returns[f920654002_432.inst++]; };
f920654002_432.returns = [];
f920654002_432.inst = 0;
// 979
ow920654002.JSBNG__onunload = f920654002_432;
// 981
f920654002_418.returns.push(1373491946359);
// 982
f920654002_433 = function() { return f920654002_433.returns[f920654002_433.inst++]; };
f920654002_433.returns = [];
f920654002_433.inst = 0;
// 983
o1.getItem = f920654002_433;
// 984
f920654002_433.returns.push(null);
// 986
f920654002_418.returns.push(1373491946360);
// 987
f920654002_14.returns.push(undefined);
// 988
f920654002_12.returns.push(1198);
// 992
o8 = {};
// 993
o0.documentElement = o8;
// 994
o8.className = "no_js";
// 995
// 997
o0.domain = "jsbngssl.www.facebook.com";
// 998
// 1000
o5.href = "https://www.facebook.com/LawlabeeTheWallaby";
// 1005
// 1006
o10 = {};
// 1007
f920654002_257.prototype = o10;
// 1009
// 1010
// 1011
// 1012
// 1013
// 1014
// 1016
// 1017
// 1018
// 1019
// 1020
// 1021
// undefined
o10 = null;
// 1022
// 1023
// 1024
// 1025
// 1026
// 1027
// 1028
// 1029
// 1030
// 1031
// 1032
// 1033
o3.msPointerEnabled = void 0;
// 1035
// 1036
// 1042
o10 = {};
// 1043
o11 = {};
// 1045
o10.length = 1;
// 1046
o10["0"] = "AyUu6";
// 1051
o12 = {};
// 1052
o13 = {};
// 1054
o12.length = 1;
// 1055
o12["0"] = "KPZ5T";
// 1061
o14 = {};
// 1062
o15 = {};
// 1064
o14.length = 1;
// 1065
o14["0"] = "OJTM4";
// 1105
o16 = {};
// 1106
f920654002_422.returns.push(o16);
// 1107
o16.length = 9;
// 1108
o17 = {};
// 1109
o16["0"] = o17;
// 1110
o17.rel = "alternate";
// undefined
o17 = null;
// 1112
o17 = {};
// 1113
o16["1"] = o17;
// 1114
o17.rel = "stylesheet";
// 1116
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/eyHNmBC9R-J.css";
// undefined
o17 = null;
// 1131
o17 = {};
// 1132
o16["2"] = o17;
// 1133
o17.rel = "stylesheet";
// 1135
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/IvWip7NpvOi.css";
// undefined
o17 = null;
// 1146
o17 = {};
// 1147
o16["3"] = o17;
// 1148
o17.rel = "stylesheet";
// 1150
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/VgK6Ft5dJnU.css";
// undefined
o17 = null;
// 1159
o17 = {};
// 1160
o16["4"] = o17;
// 1161
o17.rel = "stylesheet";
// 1163
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/XgHKKUyeHiu.css";
// undefined
o17 = null;
// 1166
o17 = {};
// 1167
o16["5"] = o17;
// 1168
o17.rel = "stylesheet";
// 1170
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y5/r/PLl1cXAaYdQ.css";
// undefined
o17 = null;
// 1173
o17 = {};
// 1174
o16["6"] = o17;
// 1175
o17.rel = "shortcut icon";
// undefined
o17 = null;
// 1177
o17 = {};
// 1178
o16["7"] = o17;
// 1179
o17.rel = "stylesheet";
// 1181
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css";
// undefined
o17 = null;
// 1184
o17 = {};
// 1185
o16["8"] = o17;
// undefined
o16 = null;
// 1186
o17.rel = "stylesheet";
// 1188
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/9oANojUgSFt.css";
// undefined
o17 = null;
// 1216
o16 = {};
// 1217
f920654002_427.returns.push(o16);
// 1218
// 1219
// 1220
f920654002_453 = function() { return f920654002_453.returns[f920654002_453.inst++]; };
f920654002_453.returns = [];
f920654002_453.inst = 0;
// 1221
o16.getElementsByTagName = f920654002_453;
// 1222
o17 = {};
// 1223
f920654002_453.returns.push(o17);
// 1224
o17.length = 0;
// undefined
o17 = null;
// 1226
o17 = {};
// 1227
o16.childNodes = o17;
// undefined
o16 = null;
// 1228
f920654002_456 = function() { return f920654002_456.returns[f920654002_456.inst++]; };
f920654002_456.returns = [];
f920654002_456.inst = 0;
// 1229
o17.item = f920654002_456;
// 1230
o17.length = 1;
// 1231
o16 = {};
// 1232
o17["0"] = o16;
// undefined
o17 = null;
// 1233
f920654002_458 = function() { return f920654002_458.returns[f920654002_458.inst++]; };
f920654002_458.returns = [];
f920654002_458.inst = 0;
// 1234
o16.getAttributeNode = f920654002_458;
// undefined
o16 = null;
// 1236
o16 = {};
// 1237
f920654002_458.returns.push(o16);
// 1238
o16.value = "u_0_1";
// undefined
o16 = null;
// 1285
f920654002_418.returns.push(1373491948334);
// 1287
f920654002_418.returns.push(1373491948334);
// 1288
f920654002_14.returns.push(undefined);
// 1289
f920654002_12.returns.push(1199);
// 1294
f920654002_418.returns.push(1373491948335);
// 1295
o16 = {};
// 1296
o0.body = o16;
// 1297
o16.getElementsByTagName = f920654002_453;
// 1298
f920654002_461 = function() { return f920654002_461.returns[f920654002_461.inst++]; };
f920654002_461.returns = [];
f920654002_461.inst = 0;
// 1299
o0.querySelectorAll = f920654002_461;
// 1300
f920654002_462 = function() { return f920654002_462.returns[f920654002_462.inst++]; };
f920654002_462.returns = [];
f920654002_462.inst = 0;
// 1301
o16.querySelectorAll = f920654002_462;
// 1302
o17 = {};
// 1303
f920654002_462.returns.push(o17);
// 1304
o17.length = 0;
// undefined
o17 = null;
// 1305
f920654002_14.returns.push(undefined);
// 1306
f920654002_12.returns.push(1200);
// 1310
o8.clientWidth = 1024;
// 1326
o8.JSBNG__addEventListener = f920654002_419;
// 1328
f920654002_419.returns.push(undefined);
// 1330
f920654002_419.returns.push(undefined);
// 1338
o8.nodeName = "HTML";
// 1339
o8.__FB_TOKEN = void 0;
// 1340
// 1341
f920654002_464 = function() { return f920654002_464.returns[f920654002_464.inst++]; };
f920654002_464.returns = [];
f920654002_464.inst = 0;
// 1342
o8.getAttribute = f920654002_464;
// 1343
f920654002_465 = function() { return f920654002_465.returns[f920654002_465.inst++]; };
f920654002_465.returns = [];
f920654002_465.inst = 0;
// 1344
o8.hasAttribute = f920654002_465;
// 1346
f920654002_465.returns.push(false);
// 1349
f920654002_419.returns.push(undefined);
// 1350
o8.JSBNG__onmousewheel = null;
// 1362
// 1363
// 1364
// 1367
f920654002_419.returns.push(undefined);
// 1376
f920654002_418.returns.push(1373491950555);
// 1382
f920654002_418.returns.push(1373491950557);
// 1384
f920654002_418.returns.push(1373491950559);
// 1388
f920654002_418.returns.push(1373491950561);
// 1391
f920654002_418.returns.push(1373491950562);
// 1394
f920654002_418.returns.push(1373491950563);
// 1396
f920654002_418.returns.push(1373491950564);
// 1400
o17 = {};
// 1401
f920654002_425.returns.push(o17);
// 1403
f920654002_429.returns.push(o17);
// undefined
o17 = null;
// 1406
f920654002_418.returns.push(1373491950610);
// 1412
f920654002_418.returns.push(1373491950611);
// 1414
f920654002_418.returns.push(1373491950612);
// 1418
f920654002_418.returns.push(1373491950613);
// 1421
f920654002_418.returns.push(1373491950613);
// 1424
f920654002_418.returns.push(1373491950613);
// 1425
f920654002_467 = function() { return f920654002_467.returns[f920654002_467.inst++]; };
f920654002_467.returns = [];
f920654002_467.inst = 0;
// 1426
o0.getElementById = f920654002_467;
// 1427
o17 = {};
// 1428
f920654002_467.returns.push(o17);
// 1430
o18 = {};
// 1431
f920654002_467.returns.push(o18);
// 1432
o19 = {};
// 1433
o18.firstChild = o19;
// 1435
o19.nodeType = 8;
// 1437
o19.nodeValue = " <div id=\"pagelet_main_column_personal\" data-referrer=\"pagelet_main_column_personal_timeline\"></div> ";
// undefined
o19 = null;
// 1438
o18.parentNode = o16;
// 1439
f920654002_471 = function() { return f920654002_471.returns[f920654002_471.inst++]; };
f920654002_471.returns = [];
f920654002_471.inst = 0;
// 1440
o16.removeChild = f920654002_471;
// 1441
f920654002_471.returns.push(o18);
// undefined
o18 = null;
// 1442
// 1443
o17.getAttribute = f920654002_464;
// 1444
f920654002_464.returns.push("pagelet_timeline_main_column");
// 1447
f920654002_418.returns.push(1373491950615);
// 1451
o18 = {};
// 1452
f920654002_425.returns.push(o18);
// 1454
f920654002_429.returns.push(o18);
// undefined
o18 = null;
// 1460
f920654002_418.returns.push(1373491950628);
// 1462
f920654002_418.returns.push(1373491950628);
// 1466
f920654002_418.returns.push(1373491950629);
// 1470
o18 = {};
// 1471
f920654002_425.returns.push(o18);
// 1473
f920654002_418.returns.push(1373491950630);
// 1474
o0.createStyleSheet = void 0;
// 1476
o19 = {};
// 1477
f920654002_427.returns.push(o19);
// 1478
// 1479
// 1480
// 1482
o20 = {};
// 1483
f920654002_427.returns.push(o20);
// 1484
// 1485
o18.appendChild = f920654002_429;
// 1486
f920654002_429.returns.push(o20);
// 1488
f920654002_418.returns.push(1373491950632);
// 1489
f920654002_13.returns.push(1201);
// 1491
o21 = {};
// 1492
f920654002_427.returns.push(o21);
// 1493
// 1494
// 1495
// 1497
f920654002_429.returns.push(o21);
// 1499
f920654002_429.returns.push(o19);
// undefined
o19 = null;
// 1501
f920654002_429.returns.push(o18);
// undefined
o18 = null;
// 1507
f920654002_418.returns.push(1373491950642);
// 1509
f920654002_418.returns.push(1373491950643);
// 1512
f920654002_418.returns.push(1373491950643);
// 1515
f920654002_418.returns.push(1373491950644);
// 1519
o18 = {};
// 1520
f920654002_425.returns.push(o18);
// 1522
f920654002_429.returns.push(o18);
// undefined
o18 = null;
// 1528
f920654002_418.returns.push(1373491950656);
// 1530
f920654002_418.returns.push(1373491950656);
// 1533
f920654002_418.returns.push(1373491950657);
// 1536
f920654002_418.returns.push(1373491950658);
// 1540
o18 = {};
// 1541
f920654002_425.returns.push(o18);
// 1543
f920654002_429.returns.push(o18);
// undefined
o18 = null;
// 1549
f920654002_418.returns.push(1373491950664);
// 1551
f920654002_418.returns.push(1373491950665);
// 1554
f920654002_418.returns.push(1373491950665);
// 1557
f920654002_418.returns.push(1373491950666);
// 1561
o18 = {};
// 1562
f920654002_425.returns.push(o18);
// 1564
f920654002_429.returns.push(o18);
// undefined
o18 = null;
// 1570
f920654002_418.returns.push(1373491950667);
// 1572
f920654002_418.returns.push(1373491950668);
// 1579
f920654002_418.returns.push(1373491950669);
// 1581
f920654002_418.returns.push(1373491950670);
// 1587
f920654002_418.returns.push(1373491950701);
// 1589
f920654002_418.returns.push(1373491950702);
// 1595
f920654002_418.returns.push(1373491950724);
// 1597
f920654002_418.returns.push(1373491950725);
// 1604
f920654002_418.returns.push(1373491950727);
// 1606
f920654002_418.returns.push(1373491950739);
// 1613
f920654002_418.returns.push(1373491950741);
// 1615
f920654002_418.returns.push(1373491950741);
// 1622
f920654002_418.returns.push(1373491950777);
// 1624
f920654002_418.returns.push(1373491950778);
// 1631
f920654002_418.returns.push(1373491950779);
// 1633
f920654002_418.returns.push(1373491950780);
// 1640
f920654002_418.returns.push(1373491950790);
// 1642
f920654002_418.returns.push(1373491950791);
// 1649
f920654002_418.returns.push(1373491950798);
// 1651
f920654002_418.returns.push(1373491950798);
// 1658
f920654002_418.returns.push(1373491950800);
// 1660
f920654002_418.returns.push(1373491950801);
// 1667
f920654002_418.returns.push(1373491950803);
// 1669
f920654002_418.returns.push(1373491950804);
// 1676
f920654002_418.returns.push(1373491950825);
// 1678
f920654002_418.returns.push(1373491950825);
// 1684
f920654002_418.returns.push(1373491950827);
// 1686
f920654002_418.returns.push(1373491950827);
// 1688
o18 = {};
// 1690
o19 = {};
// 1692
o21.parentNode = o9;
// 1693
o9.removeChild = f920654002_471;
// 1694
f920654002_471.returns.push(o21);
// 1695
o22 = {};
// 1697
f920654002_420.returns.push(undefined);
// 1700
f920654002_418.returns.push(1373491950857);
// 1701
o23 = {};
// 1702
f920654002_4.returns.push(o23);
// 1703
o23.height = "42px";
// undefined
o23 = null;
// 1704
o20.parentNode = o9;
// undefined
o9 = null;
// 1706
f920654002_471.returns.push(o20);
// undefined
o20 = null;
// 1709
f920654002_418.returns.push(1373491950858);
// 1712
f920654002_418.returns.push(1373491950859);
// 1714
o9 = {};
// 1715
f920654002_467.returns.push(o9);
// 1717
o20 = {};
// 1718
f920654002_467.returns.push(o20);
// 1719
o23 = {};
// 1720
o20.firstChild = o23;
// 1722
o23.nodeType = 8;
// 1724
o23.nodeValue = " <div class=\"fbTimelineTopSectionBase -cx-PRIVATE-fbTimelineLightHeader__root -cx-PUBLIC-fbTimelineLightHeader__loading\"><div id=\"pagelet_above_header_timeline\" data-referrer=\"pagelet_above_header_timeline\"></div><div id=\"above_header_timeline_placeholder\"></div><div class=\"fbTimelineSection mtm fbTimelineTopSection\"><div id=\"fbProfileCover\"><div class=\"cover\" id=\"u_0_g\"><a class=\"coverWrap coverImage\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-ash3%2F1017486_10200268472248551_842609840_n.jpg&amp;size=851%2C315&amp;source=10\" id=\"fbCoverImageContainer\"><img class=\"coverPhotoImg photo img\" src=\"http://jsbngssl.sphotos-a.xx.fbcdn.net/hphotos-ash3/1017486_10200268472248551_842609840_n.jpg\" alt=\"Cover Photo\" style=\"top:0px;width:100%\" data-fbid=\"10200268472248551\" /><div class=\"coverBorder\"></div><img class=\"coverChangeThrobber img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\" alt=\"\" width=\"16\" height=\"16\" /></a><div class=\"-cx-PRIVATE-fbTimelineLightHeader__headline\"><h2 class=\"-cx-PRIVATE-fbTimelineLightHeader__name\"><a class=\"-cx-PRIVATE-fbTimelineLightHeader__namelink\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\">Gregor Richards</a></h2></div></div><div id=\"fbTimelineHeadline\" class=\"clearfix\"><div class=\"-cx-PRIVATE-fbTimelineLightHeader__actionbuttonswrap\"><div class=\"actions -cx-PRIVATE-fbTimelineLightHeader__actionbuttons\"><div class=\"actionsDropdown\" id=\"pagelet_timeline_profile_actions\" data-referrer=\"pagelet_timeline_profile_actions\"></div></div></div><div class=\"-cx-PRIVATE-fbTimelineLightHeader__navwrapper\"><div class=\"-cx-PRIVATE-fbTimelineNavLight__root clearfix\" data-referrer=\"timeline_light_nav_top\" id=\"u_0_h\"><a class=\"-cx-PRIVATE-fbTimelineNavLight__item -cx-PRIVATE-fbTimelineNavLight__activeitem\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\">Timeline<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><a class=\"-cx-PRIVATE-fbTimelineNavLight__item\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/about\" data-medley-id=\"pagelet_timeline_medley_about\">About<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><a class=\"-cx-PRIVATE-fbTimelineNavLight__item\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\" data-medley-id=\"pagelet_timeline_medley_photos\">Photos<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><a class=\"-cx-PRIVATE-fbTimelineNavLight__item\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/friends\" data-medley-id=\"pagelet_timeline_medley_friends\">Friends<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><div class=\"-cx-PRIVATE-uiInlineBlock__root uiPopover -cx-PRIVATE-fbTimelineNavLight__item -cx-PRIVATE-fbTimelineNavLight__itemdropdown\" id=\"u_0_i\"><a class=\"-cx-PRIVATE-fbTimelineNavLight__dropdownitembutton -cx-PRIVATE-uiPopover__trigger\" href=\"#\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" role=\"button\" id=\"u_0_j\">More<i class=\"-cx-PRIVATE-fbTimelineNavLight__dropdownitemarrow img sp_4p6kmz sx_4f53fc\"></i></a></div></div></div><div class=\"name\"><div class=\"photoContainer\"><a class=\"profilePicThumb\" id=\"profile_pic_education\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1&amp;source=11\" rel=\"theater\"><img class=\"profilePic img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-frc3/c55.0.552.552/s160x160/993004_10200268473688587_517108607_n.jpg\" alt=\"Gregor Richards\" /></a><meta itemprop=\"image\" content=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" /></div></div></div><div id=\"timeline_sticky_header\" data-referrer=\"timeline_sticky_header\"></div></div><div id=\"fbSuggestionsPlaceHolder\"></div></div><div id=\"pagelet_escape_hatch\" data-referrer=\"pagelet_escape_hatch\"></div></div><div id=\"timeline_tab_content\"><div id=\"pagelet_timeline_recent\" data-referrer=\"pagelet_timeline_recent\"></div><div id=\"timeline_tab_content_extra\"></div></div> ";
// undefined
o23 = null;
// 1725
o20.parentNode = o16;
// 1727
f920654002_471.returns.push(o20);
// undefined
o20 = null;
// 1728
// 1729
o9.getAttribute = f920654002_464;
// 1730
f920654002_464.returns.push("pagelet_main_column_personal_timeline");
// 1740
o20 = {};
// 1741
f920654002_427.returns.push(o20);
// 1742
// 1743
// 1744
o20.getElementsByTagName = f920654002_453;
// 1745
o23 = {};
// 1746
f920654002_453.returns.push(o23);
// 1747
o23.length = 0;
// undefined
o23 = null;
// 1749
o23 = {};
// 1750
o20.childNodes = o23;
// undefined
o20 = null;
// 1751
o23.item = f920654002_456;
// 1752
o23.length = 1;
// 1753
o20 = {};
// 1754
o23["0"] = o20;
// undefined
o23 = null;
// 1755
o20.getAttributeNode = f920654002_458;
// 1757
f920654002_458.returns.push(null);
// 1758
o20.getElementsByTagName = f920654002_453;
// 1760
o23 = {};
// 1761
f920654002_453.returns.push(o23);
// 1762
o23.length = 73;
// 1763
o24 = {};
// 1764
o23["0"] = o24;
// 1765
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1767
f920654002_458.returns.push(null);
// 1769
o24 = {};
// 1770
o23["1"] = o24;
// 1771
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1773
f920654002_458.returns.push(null);
// 1775
o24 = {};
// 1776
o23["2"] = o24;
// 1777
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1779
f920654002_458.returns.push(null);
// 1781
o24 = {};
// 1782
o23["3"] = o24;
// 1783
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1785
o24 = {};
// 1786
f920654002_458.returns.push(o24);
// 1787
o24.value = "fullScreenSwitch";
// undefined
o24 = null;
// 1789
o24 = {};
// 1790
o23["4"] = o24;
// 1791
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1793
o24 = {};
// 1794
f920654002_458.returns.push(o24);
// 1795
o24.value = "fbPhotoSnowliftFullScreenSwitch";
// undefined
o24 = null;
// 1797
o24 = {};
// 1798
o23["5"] = o24;
// 1799
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1801
o24 = {};
// 1802
f920654002_458.returns.push(o24);
// 1803
o24.value = "fbPhotoSnowliftFullScreenClose";
// undefined
o24 = null;
// 1805
o24 = {};
// 1806
o23["6"] = o24;
// 1807
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1809
f920654002_458.returns.push(null);
// 1811
o24 = {};
// 1812
o23["7"] = o24;
// 1813
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1815
o24 = {};
// 1816
f920654002_458.returns.push(o24);
// 1817
o24.value = "fbPhotoSnowliftWantButton";
// undefined
o24 = null;
// 1819
o24 = {};
// 1820
o23["8"] = o24;
// 1821
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1823
f920654002_458.returns.push(null);
// 1825
o24 = {};
// 1826
o23["9"] = o24;
// 1827
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1829
o24 = {};
// 1830
f920654002_458.returns.push(o24);
// 1831
o24.value = "fbPhotoSnowliftTagBoxes";
// undefined
o24 = null;
// 1833
o24 = {};
// 1834
o23["10"] = o24;
// 1835
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1837
o24 = {};
// 1838
f920654002_458.returns.push(o24);
// 1839
o24.value = "fbPhotoSnowliftTagApproval";
// undefined
o24 = null;
// 1841
o24 = {};
// 1842
o23["11"] = o24;
// 1843
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1845
o24 = {};
// 1846
f920654002_458.returns.push(o24);
// 1847
o24.value = "fbPhotoSnowliftComputerVisionInfo";
// undefined
o24 = null;
// 1849
o24 = {};
// 1850
o23["12"] = o24;
// 1851
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1853
f920654002_458.returns.push(null);
// 1855
o24 = {};
// 1856
o23["13"] = o24;
// 1857
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1859
o24 = {};
// 1860
f920654002_458.returns.push(o24);
// 1861
o24.value = "snowliftStageActions";
// undefined
o24 = null;
// 1863
o24 = {};
// 1864
o23["14"] = o24;
// 1865
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1867
f920654002_458.returns.push(null);
// 1869
o24 = {};
// 1870
o23["15"] = o24;
// 1871
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1873
f920654002_458.returns.push(null);
// 1875
o24 = {};
// 1876
o23["16"] = o24;
// 1877
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1879
o24 = {};
// 1880
f920654002_458.returns.push(o24);
// 1881
o24.value = "fbPhotoSnowliftActions";
// undefined
o24 = null;
// 1883
o24 = {};
// 1884
o23["17"] = o24;
// 1885
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1887
o24 = {};
// 1888
f920654002_458.returns.push(o24);
// 1889
o24.value = "fbPhotoSnowliftButtons";
// undefined
o24 = null;
// 1891
o24 = {};
// 1892
o23["18"] = o24;
// 1893
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1895
f920654002_458.returns.push(null);
// 1897
o24 = {};
// 1898
o23["19"] = o24;
// 1899
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1901
f920654002_458.returns.push(null);
// 1903
o24 = {};
// 1904
o23["20"] = o24;
// 1905
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1907
o24 = {};
// 1908
f920654002_458.returns.push(o24);
// 1909
o24.value = "fbPhotoSnowliftMediaTitle";
// undefined
o24 = null;
// 1911
o24 = {};
// 1912
o23["21"] = o24;
// 1913
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1915
o24 = {};
// 1916
f920654002_458.returns.push(o24);
// 1917
o24.value = "fbPhotoSnowliftPositionAndCount";
// undefined
o24 = null;
// 1919
o24 = {};
// 1920
o23["22"] = o24;
// 1921
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1923
f920654002_458.returns.push(null);
// 1925
o24 = {};
// 1926
o23["23"] = o24;
// 1927
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1929
f920654002_458.returns.push(null);
// 1931
o24 = {};
// 1932
o23["24"] = o24;
// 1933
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1935
f920654002_458.returns.push(null);
// 1937
o24 = {};
// 1938
o23["25"] = o24;
// 1939
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1941
f920654002_458.returns.push(null);
// 1943
o24 = {};
// 1944
o23["26"] = o24;
// 1945
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1947
f920654002_458.returns.push(null);
// 1949
o24 = {};
// 1950
o23["27"] = o24;
// 1951
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1953
f920654002_458.returns.push(null);
// 1955
o24 = {};
// 1956
o23["28"] = o24;
// 1957
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1959
f920654002_458.returns.push(null);
// 1961
o24 = {};
// 1962
o23["29"] = o24;
// 1963
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1965
f920654002_458.returns.push(null);
// 1967
o24 = {};
// 1968
o23["30"] = o24;
// 1969
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1971
f920654002_458.returns.push(null);
// 1973
o24 = {};
// 1974
o23["31"] = o24;
// 1975
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1977
f920654002_458.returns.push(null);
// 1979
o24 = {};
// 1980
o23["32"] = o24;
// 1981
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1983
f920654002_458.returns.push(null);
// 1985
o24 = {};
// 1986
o23["33"] = o24;
// 1987
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1989
f920654002_458.returns.push(null);
// 1991
o24 = {};
// 1992
o23["34"] = o24;
// 1993
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 1995
f920654002_458.returns.push(null);
// 1997
o24 = {};
// 1998
o23["35"] = o24;
// 1999
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2001
o24 = {};
// 2002
f920654002_458.returns.push(o24);
// 2003
o24.value = "fbPhotoSnowliftError";
// undefined
o24 = null;
// 2005
o24 = {};
// 2006
o23["36"] = o24;
// 2007
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2009
f920654002_458.returns.push(null);
// 2011
o24 = {};
// 2012
o23["37"] = o24;
// 2013
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2015
f920654002_458.returns.push(null);
// 2017
o24 = {};
// 2018
o23["38"] = o24;
// 2019
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2021
f920654002_458.returns.push(null);
// 2023
o24 = {};
// 2024
o23["39"] = o24;
// 2025
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2027
f920654002_458.returns.push(null);
// 2029
o24 = {};
// 2030
o23["40"] = o24;
// 2031
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2033
f920654002_458.returns.push(null);
// 2035
o24 = {};
// 2036
o23["41"] = o24;
// 2037
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2039
o24 = {};
// 2040
f920654002_458.returns.push(o24);
// 2041
o24.value = "fbPhotoSnowliftInlineEditor";
// undefined
o24 = null;
// 2043
o24 = {};
// 2044
o23["42"] = o24;
// undefined
o23 = null;
// 2045
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 2047
o23 = {};
// 2048
f920654002_458.returns.push(o23);
// 2049
o23.value = "u_0_l";
// undefined
o23 = null;
// 2060
o23 = {};
// 2061
f920654002_467.returns.push(o23);
// 2065
o16.scrollWidth = 1024;
// 2066
o16.scrollHeight = 702;
// 2068
f920654002_467.returns.push(o17);
// 2069
o24 = {};
// 2070
o17.style = o24;
// 2071
// undefined
o24 = null;
// 2072
f920654002_11.returns.push(undefined);
// 2082
f920654002_418.returns.push(1373491950943);
// 2086
f920654002_418.returns.push(1373491950956);
// 2088
o24 = {};
// 2089
f920654002_467.returns.push(o24);
// 2091
o25 = {};
// 2092
f920654002_467.returns.push(o25);
// 2093
o26 = {};
// 2094
o25.firstChild = o26;
// 2096
o26.nodeType = 8;
// 2098
o26.nodeValue = " <div class=\"escapeHatchMinimal -cx-PRIVATE-fbTimelineEscapeHatch__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root -cx-PRIVATE-fbTimelineEscapeHatch__header\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><div class=\"fsm fwn fcg\"><span class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\"><span>Do you know Gregor?</span></span></div></div></div><div class=\"pam uiBoxWhite noborder\"><div><div class=\"-cx-PRIVATE-fbTimelineEscapeHatch__addfriendbutton\"><div class=\"FriendButton\" id=\"u_0_n\"><label class=\"FriendRequestAdd addButton selected uiButton uiButtonSpecial uiButtonLarge\" for=\"u_0_o\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_o\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem selected uiButton uiButtonSpecial uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"escape_hatch\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></div><div class=\"phs pbs -cx-PRIVATE-fbTimelineEscapeHatch__noticetext\"><div class=\"pbs prm fsl\"></div><span class=\"fsl fcg\"><span id=\"u_0_p\"><span class=\"addFriendText\">To see what he shares with friends, <a class=\"addButton\" href=\"#\" role=\"button\">send him a friend request.</a></span><span class=\"hidden_elem enableFriendListFlyout outgoingButton\" data-profileid=\"1055580469\">Request Sent.</span></span></span></div></div></div><div id=\"fbSuggestionsHatchPlaceHolder\"></div></div> ";
// undefined
o26 = null;
// 2099
o25.parentNode = o16;
// 2101
f920654002_471.returns.push(o25);
// undefined
o25 = null;
// 2102
// 2103
o24.getAttribute = f920654002_464;
// 2104
f920654002_464.returns.push("pagelet_escape_hatch");
// 2115
f920654002_418.returns.push(1373491950960);
// 2119
f920654002_418.returns.push(1373491950962);
// 2121
o25 = {};
// 2122
f920654002_467.returns.push(o25);
// 2123
o25.getAttribute = f920654002_464;
// 2124
f920654002_464.returns.push("pagelet_above_header_timeline");
// 2140
f920654002_418.returns.push(1373491950972);
// 2144
f920654002_418.returns.push(1373491950973);
// 2146
o26 = {};
// 2147
f920654002_467.returns.push(o26);
// 2149
o27 = {};
// 2150
f920654002_467.returns.push(o27);
// 2151
o28 = {};
// 2152
o27.firstChild = o28;
// 2154
o28.nodeType = 8;
// 2156
o28.nodeValue = " <span class=\"uiButtonGroup uiButtonGroupOverlay\" id=\"u_0_r\"><span class=\"firstItem lastItem uiButtonGroupItem buttonItem\"><div class=\"profileHeaderButton FriendButton\" id=\"u_0_13\"><label class=\"FriendRequestAdd addButton uiButton uiButtonOverlay uiButtonLarge\" for=\"u_0_14\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_14\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"fbx_top_bar\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></span></span><span class=\"uiButtonGroup uiButtonGroupOverlay\" id=\"u_0_s\"><span class=\"firstItem lastItem uiButtonGroupItem buttonItem\"><span class=\"-cx-PRIVATE-uiSwapButton__root -cx-PRIVATE-fbSubscribeButton__root profileHeaderButton\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" ajaxify=\"/ajax/follow/follow_profile.php?profile_id=1055580469&amp;location=1\" rel=\"async-post\" id=\"u_0_z\"><i class=\"mrs img sp_3fr8aa sx_3f5e05\"></i><span class=\"uiButtonText\">Follow</span></a><label class=\"profileFollowButton -cx-PUBLIC-uiHoverButton__root -cx-PRIVATE-uiSwapButton__secondbutton hidden_elem uiButton uiButtonOverlay uiButtonLarge\" id=\"u_0_10\" for=\"u_0_12\"><i class=\"mrs img sp_3fr8aa sx_0bef0b\"></i><input value=\"Following\" aria-haspopup=\"1\" data-profileid=\"1055580469\" type=\"submit\" id=\"u_0_12\" /></label></span></span></span><span class=\"uiButtonGroup actionsContents uiButtonGroupOverlay\" id=\"u_0_t\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"/messages/LawlabeeTheWallaby\" role=\"button\" ajaxify=\"/ajax/messaging/composer.php?ids%5B0%5D=1055580469&amp;ref=timeline\" rel=\"dialog\"><span class=\"uiButtonText\">Message</span></a></span><span class=\"lastItem uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock fbTimelineActionSelector uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"fbTimelineActionSelectorButton uiSelectorButton uiButton uiButtonOverlay uiButtonLarge uiButtonNoText\" href=\"#\" role=\"button\" aria-label=\"Other actions\" aria-haspopup=\"1\" rel=\"toggle\"><i class=\"mrs img sp_3fr8aa sx_da9635\"></i><span class=\"uiButtonText\"></span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div class=\"uiMenuContainer uiSelectorMenu\"><div role=\"menu\" class=\"uiMenu\" id=\"u_0_v\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem\" data-label=\"Add to Interest Lists...\" id=\"u_0_w\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"0\" href=\"#\"><span class=\"itemLabel fsm\">Add to Interest Lists...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem\" data-label=\"Report/Block...\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"-1\" href=\"/ajax/report/social.php?content_type=0&amp;cid=1055580469&amp;rid=1055580469&amp;from_gear=timeline\" rel=\"dialog\"><span class=\"itemLabel fsm\">Report/Block...</span></a></li></ul></div><div role=\"menu\" class=\"uiMenu hidden_elem\" id=\"u_0_u\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem\" data-label=\"Go Back\" id=\"u_0_x\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"0\" href=\"#\"><span class=\"itemLabel fsm\">Go Back</span></a></li><li class=\"uiMenuSeparator\"></li><img class=\"mal pal center img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\" alt=\"\" id=\"u_0_y\" width=\"16\" height=\"16\" /></ul></div></div></div></div></div></span></span> ";
// undefined
o28 = null;
// 2157
o27.parentNode = o16;
// 2159
f920654002_471.returns.push(o27);
// undefined
o27 = null;
// 2160
// 2161
o26.getAttribute = f920654002_464;
// undefined
o26 = null;
// 2162
f920654002_464.returns.push("pagelet_timeline_profile_actions");
// 2172
o26 = {};
// 2173
f920654002_427.returns.push(o26);
// 2174
// 2175
// 2176
o26.getElementsByTagName = f920654002_453;
// 2177
o27 = {};
// 2178
f920654002_453.returns.push(o27);
// 2179
o27.length = 0;
// undefined
o27 = null;
// 2181
o27 = {};
// 2182
o26.childNodes = o27;
// undefined
o26 = null;
// 2183
o27.item = f920654002_456;
// 2184
o27.length = 1;
// 2185
o26 = {};
// 2186
o27["0"] = o26;
// undefined
o27 = null;
// 2187
o26.getAttributeNode = f920654002_458;
// 2189
f920654002_458.returns.push(null);
// 2190
o26.getElementsByTagName = f920654002_453;
// 2192
o27 = {};
// 2193
f920654002_453.returns.push(o27);
// 2194
o27.length = 4;
// 2195
o28 = {};
// 2196
o27["0"] = o28;
// 2197
o28.getAttributeNode = f920654002_458;
// undefined
o28 = null;
// 2199
f920654002_458.returns.push(null);
// 2201
o28 = {};
// 2202
o27["1"] = o28;
// 2203
o28.getAttributeNode = f920654002_458;
// undefined
o28 = null;
// 2205
f920654002_458.returns.push(null);
// 2207
o28 = {};
// 2208
o27["2"] = o28;
// undefined
o27 = null;
// 2209
o28.getAttributeNode = f920654002_458;
// undefined
o28 = null;
// 2211
o27 = {};
// 2212
f920654002_458.returns.push(o27);
// 2213
o27.value = "u_0_11";
// undefined
o27 = null;
// 2238
f920654002_418.returns.push(1373491951009);
// 2241
f920654002_418.returns.push(1373491951010);
// 2244
f920654002_418.returns.push(1373491951011);
// 2247
f920654002_418.returns.push(1373491951012);
// 2250
f920654002_418.returns.push(1373491951012);
// 2252
o27 = {};
// 2253
f920654002_467.returns.push(o27);
// 2255
o28 = {};
// 2256
f920654002_467.returns.push(o28);
// 2257
o29 = {};
// 2258
o28.firstChild = o29;
// 2260
o29.nodeType = 8;
// 2262
o29.nodeValue = " <div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\" id=\"u_0_17\"><div class=\"fbTimelineCapsule clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" data-start=\"1359228987\" data-end=\"1375340399\" id=\"u_0_16\"><div class=\"-cx-PUBLIC-timelineOneColMin__leftcapsulecontainer\"><ol class=\"-cx-PUBLIC-timelineOneColMin__leftcapsule clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" id=\"u_0_16_left\"></ol><div id=\"pagelet_timeline_recent_more_pager\"></div></div><div class=\"-cx-PUBLIC-timelineOneColMin__rightcapsulecontainer\"><ol class=\"-cx-PUBLIC-timelineOneColMin__rightcapsule clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" id=\"u_0_16_right\"></ol></div></div><div class=\"fbTimelineSubSections\"></div></div><div class=\"hidden_elem fbTimelineSectionExpandPager fbTimelineShowOlderSections\" id=\"u_0_17_scroll_trigger\"><div class=\"uiMorePager\"><a class=\"uiMorePagerPrimary\" href=\"#\" role=\"button\">Show Older Stories</a></div></div> ";
// undefined
o29 = null;
// 2263
o28.parentNode = o16;
// 2265
f920654002_471.returns.push(o28);
// undefined
o28 = null;
// 2266
// 2267
o27.getAttribute = f920654002_464;
// 2268
f920654002_464.returns.push("pagelet_timeline_recent");
// 2276
f920654002_418.returns.push(1373491951031);
// 2281
o28 = {};
// 2282
f920654002_425.returns.push(o28);
// 2284
f920654002_429.returns.push(o28);
// undefined
o28 = null;
// 2287
f920654002_418.returns.push(1373491951034);
// 2290
f920654002_418.returns.push(1373491951034);
// 2293
f920654002_418.returns.push(1373491951035);
// 2295
o28 = {};
// 2296
f920654002_467.returns.push(o28);
// 2297
o28.getAttribute = f920654002_464;
// 2298
f920654002_464.returns.push("pagelet_timeline_recent_ocm");
// 2300
f920654002_418.returns.push(1373491951035);
// 2305
o29 = {};
// 2306
f920654002_425.returns.push(o29);
// 2308
f920654002_429.returns.push(o29);
// undefined
o29 = null;
// 2311
f920654002_418.returns.push(1373491951038);
// 2314
f920654002_418.returns.push(1373491951039);
// 2317
f920654002_418.returns.push(1373491951039);
// 2319
f920654002_467.returns.push(o28);
// 2321
o29 = {};
// 2322
f920654002_467.returns.push(o29);
// 2323
o30 = {};
// 2324
o29.firstChild = o30;
// 2326
o30.nodeType = 8;
// 2328
o30.nodeValue = " <li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_2953496614934485437\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1k\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491942&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;2953496614934485437&quot;,&quot;timeline_unit_type&quot;:&quot;StatusMessageUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1373055341\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200350995551582\"><abbr title=\"Friday, July 5, 2013 at 4:15pm\" data-utime=\"1373066141\">July 5</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"-cx-PRIVATE-fbTimelineStatusUnit__root\"><div class=\"userContentWrapper\"><div class=\"-cx-PRIVATE-fbTimelineText__featured\"><span data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\" class=\"userContent\">In the Place de la Comédie, there was an accordionist with a very nice, presumably authentic French, Musette accordion. A very French scene.<br /> <br /> This man could not play the Musette if his life depended on it. It made me sad. The twit didn&#039;t even TOUCH the bass manual. What an incompetent imbecile.</span></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e6ab0ef79bc2c59a966c8cac52a3b07d9cd5f6010(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s3a38060f315673e90e4bf6588d73e574017a4419\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e6ab0ef79bc2c59a966c8cac52a3b07d9cd5f6010(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s3a38060f315673e90e4bf6588d73e574017a4419_0\"), (s3a38060f315673e90e4bf6588d73e574017a4419_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s3a38060f315673e90e4bf6588d73e574017a4419_0_instance;\n    ((s3a38060f315673e90e4bf6588d73e574017a4419_0_instance) = ((JSBNG_Record.eventInstance)((\"s3a38060f315673e90e4bf6588d73e574017a4419_0\"))));\n    ((JSBNG_Record.markFunction)((e6ab0ef79bc2c59a966c8cac52a3b07d9cd5f6010)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200350995551582_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200350995551582_4955918&quot;&#125;\" onsubmit=\"return e6ab0ef79bc2c59a966c8cac52a3b07d9cd5f6010.call(this, event);\" id=\"u_0_1v\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200350995551582&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1373055341&quot;,&quot;check_hash&quot;:&quot;AQCBBladrqmNC16S&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQAL6BzquKdEOsowbM5EApJSTx6t3cX6HciBVTv0b5LrvxxIJCzjrIRDfSJQkmNYNpWRY9gmo4wEeKJRhKK4-l-Zoo7Qh0CHqMJoeS3abWLYVH2-tpPv_e1Dbt9VoF2V6POO7o3hDHFz3c-RSnP8jxUtjwGPFaxac69dWJ7JOEwHvXuJX7DnZtIcQ2c_SQCaqKmp4ImCjp_sSYLsZEsVwMSuvj4Vvum_4gbcfb8NyXWOoohbGwhVMcFZAIew_h7I6wjgKjs2ynj7Yv0m2S2f2gAtU3214N_hc7rKEwpq6HwD2ZXxju5LX2BYY5CMi3boX9ne0xwjcPN_ptGl5Mf9X2Jf5GC7DB11C04H8LqGRB7DoA7BI5mLlEaVU23XihhNJRr3Gr3e8CanKSIyt5LwwdCt\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=22&amp;appid=25554907596&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200350995551582&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1r\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle mtm mrs uiPopover -cx-PRIVATE-fbTimelineLightCloseButton__root lfloat\" id=\"u_0_1l\"><a class=\"-cx-PRIVATE-uiPopover__trigger uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1m\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_4498726532280095426\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1h\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491942&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;4498726532280095426&quot;,&quot;timeline_unit_type&quot;:&quot;StatusMessageUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1372923465\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200343222477260\"><abbr title=\"Thursday, July 4, 2013 at 3:37am\" data-utime=\"1372934265\">July 4</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"-cx-PRIVATE-fbTimelineStatusUnit__root\"><div class=\"userContentWrapper\"><div class=\"-cx-PRIVATE-fbTimelineText__featured\"><span data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\" class=\"userContent\">This is the second time I&#039;ve been in France on American Independence Day...</span></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ed0c4f9a9badafa0845fabe4bc83aa09c16e36ee0(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s8717ee975af0206ac7bf6a28c5c8027d7411c13d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ed0c4f9a9badafa0845fabe4bc83aa09c16e36ee0(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s8717ee975af0206ac7bf6a28c5c8027d7411c13d_0\"), (s8717ee975af0206ac7bf6a28c5c8027d7411c13d_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s8717ee975af0206ac7bf6a28c5c8027d7411c13d_0_instance;\n    ((s8717ee975af0206ac7bf6a28c5c8027d7411c13d_0_instance) = ((JSBNG_Record.eventInstance)((\"s8717ee975af0206ac7bf6a28c5c8027d7411c13d_0\"))));\n    ((JSBNG_Record.markFunction)((ed0c4f9a9badafa0845fabe4bc83aa09c16e36ee0)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200343222477260_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200343222477260_4950571&quot;&#125;\" onsubmit=\"return ed0c4f9a9badafa0845fabe4bc83aa09c16e36ee0.call(this, event);\" id=\"u_0_1w\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200343222477260&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1372923465&quot;,&quot;check_hash&quot;:&quot;AQA0MfY19rbYGyj6&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQC1ajTXRDAv2wZzRUQ-G1KuB_j2Ydk0o99-s0DfIrW3cEC8EBlrci94wT46S1ENWJhhyDAhp4bST94TloNAKLx6tdfZIWHfu8RmsxRdWGcByUX-EIwNoPoeRR-sY3mXdJ72ams13WH-zUj60bdWPnFRXyEpNMCR7ciJ4z8AMbiDbKhfut2t2Vn4Jki69lK6ZsFw-T6sYVNa6Lj-UF9TJSdnScEziwiE6YdI6DC-PoCxGCC_Ntu7LtFa7kJuLcOgBliX_FkGFVu6PR-g-ixwHMHYpI7c7FHuNsOlZFQaX2zoBMffqwMrQhRkgLzltSL3nEQjBX3KSM_AMm64tnSMj0iXWK_Zux1sXie2Ml8Z8jCPS3K6CDSBwo3MKgs2LUD_UJecJAlv7ZspNwT9YGc6MVlE\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=22&amp;appid=25554907596&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200343222477260&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1u\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle mtm mrs uiPopover -cx-PRIVATE-fbTimelineLightCloseButton__root lfloat\" id=\"u_0_1i\"><a class=\"-cx-PRIVATE-uiPopover__trigger uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1j\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_-6185676099150237519\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1e\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491942&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;-6185676099150237519&quot;,&quot;timeline_unit_type&quot;:&quot;BestPostedLinkUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1372627013\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469\">Gregor Richards</a></span> shared a <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ebfd69ee22627690bc1f7772e620a44d1ac8e09e0(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\");\\u000a};\"), (\"s6090eddf34bf022e9915eaecba52739d7b44a34e\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ebfd69ee22627690bc1f7772e620a44d1ac8e09e0(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s6090eddf34bf022e9915eaecba52739d7b44a34e_0\"), (s6090eddf34bf022e9915eaecba52739d7b44a34e_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\");\n    };\n    var s6090eddf34bf022e9915eaecba52739d7b44a34e_0_instance;\n    ((s6090eddf34bf022e9915eaecba52739d7b44a34e_0_instance) = ((JSBNG_Record.eventInstance)((\"s6090eddf34bf022e9915eaecba52739d7b44a34e_0\"))));\n    ((JSBNG_Record.markFunction)((ebfd69ee22627690bc1f7772e620a44d1ac8e09e0)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e96c9509d0e047acad6912da6507c0b47b2d84665(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=https\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253DGWZ0pN_T9AA&h=ZAQHk7a_HAQHmg__7E-hB4OVBt1kcRWOT9wqa79rS3dim1g&enc=AZNgKXh0PrzLcUPEdysmKm59c6iVLjuqp4nc-Co4NqVgUbeWL5SYqNTn5AdWuRAkPuKxm3XQd5buwDu3tenV3de3&s=1\\\");\\u000a};\"), (\"sfb17860fe0cb3dd3cb1c4998a94dea9ad3df297b\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e96c9509d0e047acad6912da6507c0b47b2d84665(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sfb17860fe0cb3dd3cb1c4998a94dea9ad3df297b_0\"), (sfb17860fe0cb3dd3cb1c4998a94dea9ad3df297b_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=https\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253DGWZ0pN_T9AA&h=ZAQHk7a_HAQHmg__7E-hB4OVBt1kcRWOT9wqa79rS3dim1g&enc=AZNgKXh0PrzLcUPEdysmKm59c6iVLjuqp4nc-Co4NqVgUbeWL5SYqNTn5AdWuRAkPuKxm3XQd5buwDu3tenV3de3&s=1\");\n    };\n    var sfb17860fe0cb3dd3cb1c4998a94dea9ad3df297b_0_instance;\n    ((sfb17860fe0cb3dd3cb1c4998a94dea9ad3df297b_0_instance) = ((JSBNG_Record.eventInstance)((\"sfb17860fe0cb3dd3cb1c4998a94dea9ad3df297b_0\"))));\n    ((JSBNG_Record.markFunction)((e96c9509d0e047acad6912da6507c0b47b2d84665)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a href=\"http://www.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGWZ0pN_T9AA&amp;h=ZAQHk7a_HAQHmg__7E-hB4OVBt1kcRWOT9wqa79rS3dim1g&amp;enc=AZNgKXh0PrzLcUPEdysmKm59c6iVLjuqp4nc-Co4NqVgUbeWL5SYqNTn5AdWuRAkPuKxm3XQd5buwDu3tenV3de3&amp;s=1\" rel=\"nofollow\" onmouseover=\"return ebfd69ee22627690bc1f7772e620a44d1ac8e09e0.call(this, event);\" onclick=\"return e96c9509d0e047acad6912da6507c0b47b2d84665.call(this, event);\" target=\"_blank\">link</a>.</span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200325012062011\"><abbr title=\"Sunday, June 30, 2013 at 5:16pm\" data-utime=\"1372637813\">June 30</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"userContentWrapper aboveUnitContent\" data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\"><div class=\"-cx-PRIVATE-fbTimelineText__featured mbm\"><span class=\"userContent\">OK everyone who wants me to talk more about travel, I made a travel vlog JUST FOR YOU: <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ec9fb5d88126fe2671bda92d81eda27246989550c(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\");\\u000a};\"), (\"s2dd564bb3ba3beaf51c79be8cae04ee32b4065d4\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ec9fb5d88126fe2671bda92d81eda27246989550c(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s2dd564bb3ba3beaf51c79be8cae04ee32b4065d4_0\"), (s2dd564bb3ba3beaf51c79be8cae04ee32b4065d4_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\");\n    };\n    var s2dd564bb3ba3beaf51c79be8cae04ee32b4065d4_0_instance;\n    ((s2dd564bb3ba3beaf51c79be8cae04ee32b4065d4_0_instance) = ((JSBNG_Record.eventInstance)((\"s2dd564bb3ba3beaf51c79be8cae04ee32b4065d4_0\"))));\n    ((JSBNG_Record.markFunction)((ec9fb5d88126fe2671bda92d81eda27246989550c)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e0e6b22055c41334741397157b9f310d7a09279ae(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=https\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253DGWZ0pN_T9AA&h=cAQGbNaRw&s=1\\\");\\u000a};\"), (\"sc95353c32f8e9e9e24b5a327276cbe0379e2cc71\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e0e6b22055c41334741397157b9f310d7a09279ae(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc95353c32f8e9e9e24b5a327276cbe0379e2cc71_0\"), (sc95353c32f8e9e9e24b5a327276cbe0379e2cc71_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=https\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253DGWZ0pN_T9AA&h=cAQGbNaRw&s=1\");\n    };\n    var sc95353c32f8e9e9e24b5a327276cbe0379e2cc71_0_instance;\n    ((sc95353c32f8e9e9e24b5a327276cbe0379e2cc71_0_instance) = ((JSBNG_Record.eventInstance)((\"sc95353c32f8e9e9e24b5a327276cbe0379e2cc71_0\"))));\n    ((JSBNG_Record.markFunction)((e0e6b22055c41334741397157b9f310d7a09279ae)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a href=\"http://www.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGWZ0pN_T9AA&amp;h=cAQGbNaRw&amp;s=1\" rel=\"nofollow nofollow\" onmouseover=\"return ec9fb5d88126fe2671bda92d81eda27246989550c.call(this, event);\" onclick=\"return e0e6b22055c41334741397157b9f310d7a09279ae.call(this, event);\" target=\"_blank\">http://jsbngssl.www.youtube.com/watch?v=GWZ0pN_T9AA</a></span></div></div><div class=\"shareUnit\"><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__wrapper\"><div><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__root shareLink -cx-PRIVATE-fbTimelineExternalShareUnit__hasimage\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e89084e7a3517e8678024fec7869e857c8adb123e(event) {\\u000a    CSS.addClass(this, \\\"-cx-PRIVATE-fbTimelineExternalShareUnit__loading\\\");\\u000a    CSS.removeClass(this, \\\"-cx-PRIVATE-fbTimelineExternalShareUnit__video\\\");\\u000a};\"), (\"s443d0052684fc06fb97e128c4c09efdbcc1c62cb\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e89084e7a3517e8678024fec7869e857c8adb123e(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s443d0052684fc06fb97e128c4c09efdbcc1c62cb_0\"), (s443d0052684fc06fb97e128c4c09efdbcc1c62cb_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(CSS, (\"addClass\")))[(\"addClass\")])(this, \"-cx-PRIVATE-fbTimelineExternalShareUnit__loading\");\n        (((JSBNG_Record.get)(CSS, (\"removeClass\")))[(\"removeClass\")])(this, \"-cx-PRIVATE-fbTimelineExternalShareUnit__video\");\n    };\n    var s443d0052684fc06fb97e128c4c09efdbcc1c62cb_0_instance;\n    ((s443d0052684fc06fb97e128c4c09efdbcc1c62cb_0_instance) = ((JSBNG_Record.eventInstance)((\"s443d0052684fc06fb97e128c4c09efdbcc1c62cb_0\"))));\n    ((JSBNG_Record.markFunction)((e89084e7a3517e8678024fec7869e857c8adb123e)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__video -cx-PRIVATE-fbTimelineExternalShareUnit__image -cx-PRIVATE-fbTimelineExternalShareUnit__content\" ajaxify=\"/ajax/flash/expand_inline.php?target_div=u_0_1d&amp;share_id=10200325012062011&amp;max_width=504&amp;max_height=378&amp;context=timelineOC\" rel=\"async\" href=\"#\" onclick=\"return e89084e7a3517e8678024fec7869e857c8adb123e.call(this, event);\" role=\"button\"><i class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__play\"></i><img class=\"-cx-PRIVATE-uiExternalImage__image img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" height=\"116\" width=\"116\" style=\"background-image: url(http://jsbngssl.fbexternal-a.akamaihd.net/safe_image.php?d=AQBNVc6yXNVNFDHH&amp;w=116&amp;h=116&amp;url=http%3A%2F%2Fi1.ytimg.com%2Fvi%2FGWZ0pN_T9AA%2Fmaxresdefault.jpg%3Ffeature%3Dog&amp;cfs=1);\" /></a><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e54e3657f3071a09b7950362fe5231c265dbfab76(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\");\\u000a};\"), (\"sa35bae7a665a2340b491023aedc360a01dcb953f\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e54e3657f3071a09b7950362fe5231c265dbfab76(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sa35bae7a665a2340b491023aedc360a01dcb953f_0\"), (sa35bae7a665a2340b491023aedc360a01dcb953f_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\");\n    };\n    var sa35bae7a665a2340b491023aedc360a01dcb953f_0_instance;\n    ((sa35bae7a665a2340b491023aedc360a01dcb953f_0_instance) = ((JSBNG_Record.eventInstance)((\"sa35bae7a665a2340b491023aedc360a01dcb953f_0\"))));\n    ((JSBNG_Record.markFunction)((e54e3657f3071a09b7950362fe5231c265dbfab76)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef1bbe94dba3ff786f9dd593adac6bef8374dbcf3(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=https\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253DGWZ0pN_T9AA&h=GAQHBfoWSAQFV99ui-LWPQRq8Oe_04wFDlJ6FjuPhT5gpxg&enc=AZOJUPS21MjhODClWdk8-QBDMefIA5UCSnGR6xXHE0NFKTplvqErRcB-4QeDrTWshviGI9z5QAjlLksCECMikurY&s=1\\\");\\u000a};\"), (\"s9641cf74c8ec91adfa7c4d28f11c632c7ef4d566\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef1bbe94dba3ff786f9dd593adac6bef8374dbcf3(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s9641cf74c8ec91adfa7c4d28f11c632c7ef4d566_0\"), (s9641cf74c8ec91adfa7c4d28f11c632c7ef4d566_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=https\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253DGWZ0pN_T9AA&h=GAQHBfoWSAQFV99ui-LWPQRq8Oe_04wFDlJ6FjuPhT5gpxg&enc=AZOJUPS21MjhODClWdk8-QBDMefIA5UCSnGR6xXHE0NFKTplvqErRcB-4QeDrTWshviGI9z5QAjlLksCECMikurY&s=1\");\n    };\n    var s9641cf74c8ec91adfa7c4d28f11c632c7ef4d566_0_instance;\n    ((s9641cf74c8ec91adfa7c4d28f11c632c7ef4d566_0_instance) = ((JSBNG_Record.eventInstance)((\"s9641cf74c8ec91adfa7c4d28f11c632c7ef4d566_0\"))));\n    ((JSBNG_Record.markFunction)((ef1bbe94dba3ff786f9dd593adac6bef8374dbcf3)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__content -cx-PRIVATE-fbTimelineExternalShareUnit__textwrapper\" href=\"http://www.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGWZ0pN_T9AA&amp;h=GAQHBfoWSAQFV99ui-LWPQRq8Oe_04wFDlJ6FjuPhT5gpxg&amp;enc=AZOJUPS21MjhODClWdk8-QBDMefIA5UCSnGR6xXHE0NFKTplvqErRcB-4QeDrTWshviGI9z5QAjlLksCECMikurY&amp;s=1\" target=\"_blank\" rel=\"nofollow\" onmouseover=\"return e54e3657f3071a09b7950362fe5231c265dbfab76.call(this, event);\" onclick=\"return ef1bbe94dba3ff786f9dd593adac6bef8374dbcf3.call(this, event);\"><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__text\"><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__itemlink fwb\" dir=\"ltr\">My first travel vlog!</div><div class=\"fsm fwn fcg\">www.youtube.com</div><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__previewtext fsm fwn fcg\" dir=\"ltr\">I hope you enjoy my first travel vlog RATE COMMENT SHARE SUBSCRIBE WORSHIP</div></div></a></div></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e69cfae81ca475473c88864a78d73d448dfd55225(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s9bc11910d3b6467064ecd742e56dc3ae759328b8\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e69cfae81ca475473c88864a78d73d448dfd55225(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s9bc11910d3b6467064ecd742e56dc3ae759328b8_0\"), (s9bc11910d3b6467064ecd742e56dc3ae759328b8_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s9bc11910d3b6467064ecd742e56dc3ae759328b8_0_instance;\n    ((s9bc11910d3b6467064ecd742e56dc3ae759328b8_0_instance) = ((JSBNG_Record.eventInstance)((\"s9bc11910d3b6467064ecd742e56dc3ae759328b8_0\"))));\n    ((JSBNG_Record.markFunction)((e69cfae81ca475473c88864a78d73d448dfd55225)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200325012062011_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:0&#125;\" onsubmit=\"return e69cfae81ca475473c88864a78d73d448dfd55225.call(this, event);\" id=\"u_0_1x\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200325012062011&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;17&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1372627013&quot;,&quot;check_hash&quot;:&quot;AQCDUFoJLtB65-Ke&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQACFgRImnzTiCidDckAnsXMzyyCTp2xlEkdxtLDdjHBxnem9BliGg5LEnDunnxvmLZ3fMMKmsD9ygBkRtmsP85o7-LYCuNIPaMahgk_-xIrgFtyL9LKNnaZOTTudzDfOens6YeAmPC3QnUyvB9IFKVci93BAZKWzKC4DehohxvbuKn4zcIyhG59kU5yOHk03PO-Ue-AKD7ZnJCSIAIhhmY4Y5d6S202CjqJdFJJaP_Y4tzOOgekKxAKONhL4W0mrsdASIKsmRQiuj-3UIAJSOvDnyAjBoy0RSsF1zLIfRPWpsBvEpJd7WDG4iCUccj0Lfglb3yuGtH1Om1AGO6fAJTHLuCvnR7BpptYndMLrEkD9JxBA2kaJHmCzYiTqHSEHHe8sKqwiBEgruorRn6UD6iKpV5vptKAUqIESRSKWUJqNQ\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=99&amp;appid=2309869772&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200325012062011&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1s\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle mtm mrs uiPopover -cx-PRIVATE-fbTimelineLightCloseButton__root lfloat\" id=\"u_0_1f\"><a class=\"-cx-PRIVATE-uiPopover__trigger uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1g\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_3857418892059122853\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1a\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491942&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;3857418892059122853&quot;,&quot;timeline_unit_type&quot;:&quot;BestPostedLinkUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1372262734\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469\">Gregor Richards</a></span> shared a <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2f9c02801bf68a83e0948bcb6e67499eebde044d(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\");\\u000a};\"), (\"s8b960e8363cbc6022ffb2e3f4bab262eb4d5de2f\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2f9c02801bf68a83e0948bcb6e67499eebde044d(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s8b960e8363cbc6022ffb2e3f4bab262eb4d5de2f_0\"), (s8b960e8363cbc6022ffb2e3f4bab262eb4d5de2f_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\");\n    };\n    var s8b960e8363cbc6022ffb2e3f4bab262eb4d5de2f_0_instance;\n    ((s8b960e8363cbc6022ffb2e3f4bab262eb4d5de2f_0_instance) = ((JSBNG_Record.eventInstance)((\"s8b960e8363cbc6022ffb2e3f4bab262eb4d5de2f_0\"))));\n    ((JSBNG_Record.markFunction)((e2f9c02801bf68a83e0948bcb6e67499eebde044d)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e6866db5eb3ead42effdd00e6a75c33709e4eabd5(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=http\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253Di6cb0ggl8bQ\\\\\\\\u002526feature\\\\\\\\u00253Dshare&h=VAQEr7B7BAQHs7983YyXmXQCnT8EvhMZew8WxR9Z12BzI0A&enc=AZMpiQRxefwDdxZgdOAXpe6JNXrgpzqHcELLwbAD-qVRo_f494wBi85zAUob-RXVHmMzlt2IDZTeh_XX1XtOZkuD&s=1\\\");\\u000a};\"), (\"s8130875b141336d822719e55a942028ac44c581d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e6866db5eb3ead42effdd00e6a75c33709e4eabd5(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s8130875b141336d822719e55a942028ac44c581d_0\"), (s8130875b141336d822719e55a942028ac44c581d_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=http\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253Di6cb0ggl8bQ\\\\u002526feature\\\\u00253Dshare&h=VAQEr7B7BAQHs7983YyXmXQCnT8EvhMZew8WxR9Z12BzI0A&enc=AZMpiQRxefwDdxZgdOAXpe6JNXrgpzqHcELLwbAD-qVRo_f494wBi85zAUob-RXVHmMzlt2IDZTeh_XX1XtOZkuD&s=1\");\n    };\n    var s8130875b141336d822719e55a942028ac44c581d_0_instance;\n    ((s8130875b141336d822719e55a942028ac44c581d_0_instance) = ((JSBNG_Record.eventInstance)((\"s8130875b141336d822719e55a942028ac44c581d_0\"))));\n    ((JSBNG_Record.markFunction)((e6866db5eb3ead42effdd00e6a75c33709e4eabd5)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a href=\"http://www.facebook.com/l.php?u=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Di6cb0ggl8bQ%26feature%3Dshare&amp;h=VAQEr7B7BAQHs7983YyXmXQCnT8EvhMZew8WxR9Z12BzI0A&amp;enc=AZMpiQRxefwDdxZgdOAXpe6JNXrgpzqHcELLwbAD-qVRo_f494wBi85zAUob-RXVHmMzlt2IDZTeh_XX1XtOZkuD&amp;s=1\" rel=\"nofollow\" onmouseover=\"return e2f9c02801bf68a83e0948bcb6e67499eebde044d.call(this, event);\" onclick=\"return e6866db5eb3ead42effdd00e6a75c33709e4eabd5.call(this, event);\" target=\"_blank\">link</a>.</span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200303357400658\"><abbr title=\"Wednesday, June 26, 2013 at 12:05pm\" data-utime=\"1372273534\">June 26</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"userContentWrapper aboveUnitContent\" data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\"><div class=\"-cx-PRIVATE-fbTimelineText__featured mbm\"><span class=\"userContent\">Last one&#039;s the best.</span></div></div><div class=\"shareUnit\"><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__wrapper\"><div><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__root shareLink -cx-PRIVATE-fbTimelineExternalShareUnit__hasimage\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef3a329de94f37212ac4302e421e4666987481044(event) {\\u000a    CSS.addClass(this, \\\"-cx-PRIVATE-fbTimelineExternalShareUnit__loading\\\");\\u000a    CSS.removeClass(this, \\\"-cx-PRIVATE-fbTimelineExternalShareUnit__video\\\");\\u000a};\"), (\"s21e28a68f076a75fc54423dc3cfd60bd6f6cab55\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef3a329de94f37212ac4302e421e4666987481044(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s21e28a68f076a75fc54423dc3cfd60bd6f6cab55_0\"), (s21e28a68f076a75fc54423dc3cfd60bd6f6cab55_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(CSS, (\"addClass\")))[(\"addClass\")])(this, \"-cx-PRIVATE-fbTimelineExternalShareUnit__loading\");\n        (((JSBNG_Record.get)(CSS, (\"removeClass\")))[(\"removeClass\")])(this, \"-cx-PRIVATE-fbTimelineExternalShareUnit__video\");\n    };\n    var s21e28a68f076a75fc54423dc3cfd60bd6f6cab55_0_instance;\n    ((s21e28a68f076a75fc54423dc3cfd60bd6f6cab55_0_instance) = ((JSBNG_Record.eventInstance)((\"s21e28a68f076a75fc54423dc3cfd60bd6f6cab55_0\"))));\n    ((JSBNG_Record.markFunction)((ef3a329de94f37212ac4302e421e4666987481044)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__video -cx-PRIVATE-fbTimelineExternalShareUnit__image -cx-PRIVATE-fbTimelineExternalShareUnit__content\" ajaxify=\"/ajax/flash/expand_inline.php?target_div=u_0_19&amp;share_id=10200303357400658&amp;max_width=504&amp;max_height=378&amp;context=timelineOC\" rel=\"async\" href=\"#\" onclick=\"return ef3a329de94f37212ac4302e421e4666987481044.call(this, event);\" role=\"button\"><i class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__play\"></i><img class=\"-cx-PRIVATE-uiExternalImage__image img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" height=\"116\" width=\"116\" style=\"background-image: url(http://jsbngssl.fbexternal-a.akamaihd.net/safe_image.php?d=AQA7R5r-YEOUHY7V&amp;w=116&amp;h=116&amp;url=http%3A%2F%2Fi1.ytimg.com%2Fvi%2Fi6cb0ggl8bQ%2Fhqdefault.jpg%3Ffeature%3Dog&amp;cfs=1);\" /></a><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e4678d09bb370018636ffb09026b9b5db5ae76a77(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\");\\u000a};\"), (\"sd7b3d4476f908c682124c87a4e8b7773760357ee\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e4678d09bb370018636ffb09026b9b5db5ae76a77(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sd7b3d4476f908c682124c87a4e8b7773760357ee_0\"), (sd7b3d4476f908c682124c87a4e8b7773760357ee_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\");\n    };\n    var sd7b3d4476f908c682124c87a4e8b7773760357ee_0_instance;\n    ((sd7b3d4476f908c682124c87a4e8b7773760357ee_0_instance) = ((JSBNG_Record.eventInstance)((\"sd7b3d4476f908c682124c87a4e8b7773760357ee_0\"))));\n    ((JSBNG_Record.markFunction)((e4678d09bb370018636ffb09026b9b5db5ae76a77)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e823d0311194ec414bfba9afb0f34b69cdf003789(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=http\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253Di6cb0ggl8bQ\\\\\\\\u002526feature\\\\\\\\u00253Dshare&h=FAQFyjVVkAQENT8aVvtLdDM9V4f1bxvXEGM3qvi3ThKOy7Q&enc=AZO5WFHaANvpR_irk829CDl6cU9Z3zvT7IlcZbrgEPqTDg3jFL-0WNXKK1pRGqwYh-YN22GZktbxfwdN8naRj-tU&s=1\\\");\\u000a};\"), (\"sec484fa24fedb26e78fb21ef3cb2b64a42ac68bd\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e823d0311194ec414bfba9afb0f34b69cdf003789(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sec484fa24fedb26e78fb21ef3cb2b64a42ac68bd_0\"), (sec484fa24fedb26e78fb21ef3cb2b64a42ac68bd_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=http\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253Di6cb0ggl8bQ\\\\u002526feature\\\\u00253Dshare&h=FAQFyjVVkAQENT8aVvtLdDM9V4f1bxvXEGM3qvi3ThKOy7Q&enc=AZO5WFHaANvpR_irk829CDl6cU9Z3zvT7IlcZbrgEPqTDg3jFL-0WNXKK1pRGqwYh-YN22GZktbxfwdN8naRj-tU&s=1\");\n    };\n    var sec484fa24fedb26e78fb21ef3cb2b64a42ac68bd_0_instance;\n    ((sec484fa24fedb26e78fb21ef3cb2b64a42ac68bd_0_instance) = ((JSBNG_Record.eventInstance)((\"sec484fa24fedb26e78fb21ef3cb2b64a42ac68bd_0\"))));\n    ((JSBNG_Record.markFunction)((e823d0311194ec414bfba9afb0f34b69cdf003789)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__content -cx-PRIVATE-fbTimelineExternalShareUnit__textwrapper\" href=\"http://www.facebook.com/l.php?u=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Di6cb0ggl8bQ%26feature%3Dshare&amp;h=FAQFyjVVkAQENT8aVvtLdDM9V4f1bxvXEGM3qvi3ThKOy7Q&amp;enc=AZO5WFHaANvpR_irk829CDl6cU9Z3zvT7IlcZbrgEPqTDg3jFL-0WNXKK1pRGqwYh-YN22GZktbxfwdN8naRj-tU&amp;s=1\" target=\"_blank\" rel=\"nofollow\" onmouseover=\"return e4678d09bb370018636ffb09026b9b5db5ae76a77.call(this, event);\" onclick=\"return e823d0311194ec414bfba9afb0f34b69cdf003789.call(this, event);\"><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__text\"><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__itemlink fwb\" dir=\"ltr\">Exploding Actresses 03 - Disney Princesses</div><div class=\"fsm fwn fcg\">www.youtube.com</div><div class=\"-cx-PRIVATE-fbTimelineExternalShareUnit__previewtext fsm fwn fcg\" dir=\"ltr\">by Simone Rovellini http://explodingactresses.tumblr.com/ info&#064;simonerovellini.com</div></div></a></div></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e70ce6299eb46c7fa1a32d354f6a2b4471b55465b(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s8b1cd9a9bfbe6b1fcb683e51b8b42056e2e2c30e\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e70ce6299eb46c7fa1a32d354f6a2b4471b55465b(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s8b1cd9a9bfbe6b1fcb683e51b8b42056e2e2c30e_0\"), (s8b1cd9a9bfbe6b1fcb683e51b8b42056e2e2c30e_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s8b1cd9a9bfbe6b1fcb683e51b8b42056e2e2c30e_0_instance;\n    ((s8b1cd9a9bfbe6b1fcb683e51b8b42056e2e2c30e_0_instance) = ((JSBNG_Record.eventInstance)((\"s8b1cd9a9bfbe6b1fcb683e51b8b42056e2e2c30e_0\"))));\n    ((JSBNG_Record.markFunction)((e70ce6299eb46c7fa1a32d354f6a2b4471b55465b)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200303357400658_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200303357400658_4912511&quot;&#125;\" onsubmit=\"return e70ce6299eb46c7fa1a32d354f6a2b4471b55465b.call(this, event);\" id=\"u_0_1y\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200303357400658&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;17&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1372262734&quot;,&quot;check_hash&quot;:&quot;AQBLYqqsJU1aAE5L&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQBjxP4ev5UbI41Cf_ownvAK5wSwcSjK7GAWYTU8KnSqn2t_Ypp37x3IDlNc_BfBV4dfFe9GoUYgha-VTRMVz3dpkGjnczfoKm9Pc6q6ltIGpCpq8Os8MurGA6X0p6eYzwbjx5UdQyoSubsx3-KC0EyYoXAi7ZVuT9S94NilBKTEVjQrE1zHUdDW3oCqnX12h-NmlSSLEK8-Zl3GeZvMl9oT6OGOtjBCcadbLFoeTRhTBDVyFlSa9CmPwLENPJCuWg-BJ8y0THv-2L-2VxhG2yOpLvF6Q_QPCS5wQ3K3VGMlxqwfMEod7ukeqHfRhh9KxZx1QW7CvIb81bQYQqnrlJ1t5uNzW6C4ITbNOkYKkspVSGIQ5m9fGIutgw4H-9BVufuWZXNN4e8lUk-hy9ugyPiP\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=99&amp;appid=2309869772&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200303357400658&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1o\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle mtm mrs uiPopover -cx-PRIVATE-fbTimelineLightCloseButton__root lfloat\" id=\"u_0_1b\"><a class=\"-cx-PRIVATE-uiPopover__trigger uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1c\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li> ";
// undefined
o30 = null;
// 2329
o29.parentNode = o16;
// 2331
f920654002_471.returns.push(o29);
// undefined
o29 = null;
// 2333
o29 = {};
// 2334
f920654002_427.returns.push(o29);
// 2335
// 2337
o30 = {};
// 2338
f920654002_425.returns.push(o30);
// 2339
o31 = {};
// undefined
fo920654002_576_firstChild = function() { return fo920654002_576_firstChild.returns[fo920654002_576_firstChild.inst++]; };
fo920654002_576_firstChild.returns = [];
fo920654002_576_firstChild.inst = 0;
defineGetter(o29, "firstChild", fo920654002_576_firstChild, undefined);
// undefined
o29 = null;
// undefined
fo920654002_576_firstChild.returns.push(o31);
// 2341
o30.appendChild = f920654002_429;
// undefined
fo920654002_576_firstChild.returns.push(o31);
// 2343
f920654002_429.returns.push(o31);
// 2344
o29 = {};
// undefined
fo920654002_576_firstChild.returns.push(o29);
// undefined
fo920654002_576_firstChild.returns.push(o29);
// 2348
f920654002_429.returns.push(o29);
// 2349
o32 = {};
// undefined
fo920654002_576_firstChild.returns.push(o32);
// undefined
fo920654002_576_firstChild.returns.push(o32);
// 2353
f920654002_429.returns.push(o32);
// undefined
o32 = null;
// 2354
o32 = {};
// undefined
fo920654002_576_firstChild.returns.push(o32);
// undefined
fo920654002_576_firstChild.returns.push(o32);
// 2358
f920654002_429.returns.push(o32);
// undefined
fo920654002_576_firstChild.returns.push(null);
// 2360
o28.appendChild = f920654002_429;
// 2361
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 2363
f920654002_464.returns.push("pagelet_timeline_recent_ocm");
// 2421
o30 = {};
// 2422
f920654002_427.returns.push(o30);
// 2423
o33 = {};
// 2424
o0.implementation = o33;
// 2426
f920654002_584 = function() { return f920654002_584.returns[f920654002_584.inst++]; };
f920654002_584.returns = [];
f920654002_584.inst = 0;
// 2427
o33.hasFeature = f920654002_584;
// undefined
o33 = null;
// 2430
f920654002_584.returns.push(false);
// 2432
o33 = {};
// 2433
f920654002_427.returns.push(o33);
// undefined
o33 = null;
// 2435
o33 = {};
// 2436
f920654002_427.returns.push(o33);
// 2437
f920654002_587 = function() { return f920654002_587.returns[f920654002_587.inst++]; };
f920654002_587.returns = [];
f920654002_587.inst = 0;
// 2438
o33.setAttribute = f920654002_587;
// 2439
f920654002_587.returns.push(undefined);
// 2440
o33.JSBNG__onchange = null;
// 2442
// 2443
f920654002_588 = function() { return f920654002_588.returns[f920654002_588.inst++]; };
f920654002_588.returns = [];
f920654002_588.inst = 0;
// 2444
o33.removeAttribute = f920654002_588;
// undefined
o33 = null;
// 2445
f920654002_588.returns.push(undefined);
// 2447
o33 = {};
// 2448
f920654002_427.returns.push(o33);
// 2449
o33.setAttribute = f920654002_587;
// 2450
f920654002_587.returns.push(undefined);
// 2451
o33.JSBNG__oninput = null;
// 2453
// 2454
o33.removeAttribute = f920654002_588;
// undefined
o33 = null;
// 2455
f920654002_588.returns.push(undefined);
// 2456
o33 = {};
// 2457
f920654002_56.returns.push(o33);
// undefined
o33 = null;
// 2458
ow920654002.JSBNG__attachEvent = undefined;
// 2459
f920654002_417.returns.push(0.7880629152059555);
// 2461
o33 = {};
// 2462
f920654002_427.returns.push(o33);
// 2463
// 2464
// 2465
o33.getElementsByTagName = f920654002_453;
// 2466
o34 = {};
// 2467
f920654002_453.returns.push(o34);
// 2468
o34.length = 0;
// undefined
o34 = null;
// 2470
o34 = {};
// 2471
o33.childNodes = o34;
// undefined
o33 = null;
// 2472
o34.item = f920654002_456;
// 2473
o34.length = 1;
// 2474
o33 = {};
// 2475
o34["0"] = o33;
// undefined
o34 = null;
// undefined
o33 = null;
// 2477
o33 = {};
// 2478
f920654002_467.returns.push(o33);
// 2479
o33.id = "u_0_1o";
// 2480
o33.getElementsByTagName = f920654002_453;
// 2481
o34 = {};
// 2482
o33.parentNode = o34;
// 2498
f920654002_418.returns.push(1373491951301);
// 2503
o35 = {};
// 2504
f920654002_462.returns.push(o35);
// 2505
o35.length = 0;
// undefined
o35 = null;
// 2506
f920654002_14.returns.push(undefined);
// 2507
f920654002_12.returns.push(1202);
// 2514
f920654002_12.returns.push(1203);
// 2518
o35 = {};
// 2519
f920654002_425.returns.push(o35);
// 2521
f920654002_418.returns.push(1373491951309);
// 2523
o36 = {};
// 2524
f920654002_427.returns.push(o36);
// 2525
// 2526
// 2527
// 2528
// 2529
// 2530
// 2531
o35.appendChild = f920654002_429;
// 2532
f920654002_429.returns.push(o36);
// undefined
o36 = null;
// 2534
f920654002_429.returns.push(o35);
// undefined
o35 = null;
// 2538
o35 = {};
// 2539
f920654002_467.returns.push(o35);
// 2540
o35.id = "u_0_1r";
// 2541
o35.getElementsByTagName = f920654002_453;
// 2542
o36 = {};
// 2543
o35.parentNode = o36;
// undefined
fo920654002_595_firstChild = function() { return fo920654002_595_firstChild.returns[fo920654002_595_firstChild.inst++]; };
fo920654002_595_firstChild.returns = [];
fo920654002_595_firstChild.inst = 0;
defineGetter(o33, "firstChild", fo920654002_595_firstChild, undefined);
// undefined
fo920654002_595_firstChild.returns.push(null);
// undefined
fo920654002_595_firstChild.returns.push(null);
// 2565
f920654002_7.returns.push(undefined);
// 2566
ow920654002.JSBNG__onJSBNG__scroll = undefined;
// 2567
f920654002_7.returns.push(undefined);
// 2568
f920654002_602 = function() { return f920654002_602.returns[f920654002_602.inst++]; };
f920654002_602.returns = [];
f920654002_602.inst = 0;
// 2569
ow920654002.JSBNG__onresize = f920654002_602;
// 2572
o0.nodeName = "#document";
// 2573
o0.__FB_TOKEN = void 0;
// 2574
// 2575
o0.getAttribute = void 0;
// 2578
f920654002_419.returns.push(undefined);
// 2579
o0.JSBNG__onmouseover = null;
// 2584
f920654002_419.returns.push(undefined);
// 2585
o0.JSBNG__onmousedown = null;
// 2590
f920654002_419.returns.push(undefined);
// 2591
o0.JSBNG__onmouseup = null;
// 2596
f920654002_419.returns.push(undefined);
// 2597
o0.JSBNG__onmousemove = null;
// 2602
f920654002_419.returns.push(undefined);
// 2603
o0.JSBNG__onmouseout = null;
// 2608
f920654002_419.returns.push(undefined);
// 2609
o0.JSBNG__onclick = null;
// 2614
f920654002_419.returns.push(undefined);
// 2615
o0.JSBNG__ondblclick = null;
// 2620
f920654002_419.returns.push(undefined);
// 2621
o0.JSBNG__onkeyup = null;
// 2626
f920654002_419.returns.push(undefined);
// 2627
o0.JSBNG__onkeypress = null;
// 2632
f920654002_419.returns.push(undefined);
// 2633
o0.JSBNG__onkeydown = null;
// 2638
f920654002_419.returns.push(undefined);
// 2639
o0.JSBNG__oninput = null;
// 2644
f920654002_419.returns.push(undefined);
// 2645
o0.JSBNG__onchange = null;
// 2650
f920654002_419.returns.push(undefined);
// 2651
o0.JSBNG__onselectionchange = null;
// 2656
f920654002_419.returns.push(undefined);
// 2657
o0.JSBNG__onDOMCharacterDataModified = void 0;
// 2660
o37 = {};
// 2661
f920654002_427.returns.push(o37);
// 2662
o37.setAttribute = f920654002_587;
// 2663
f920654002_587.returns.push(undefined);
// 2664
o37.JSBNG__ondrag = null;
// 2666
// 2667
o37.removeAttribute = f920654002_588;
// undefined
o37 = null;
// 2668
f920654002_588.returns.push(undefined);
// 2670
o37 = {};
// 2671
f920654002_427.returns.push(o37);
// 2672
o37.setAttribute = f920654002_587;
// 2673
f920654002_587.returns.push(undefined);
// 2674
o37.JSBNG__onwheel = void 0;
// 2676
o37.removeAttribute = f920654002_588;
// undefined
o37 = null;
// 2677
f920654002_588.returns.push(undefined);
// 2680
f920654002_584.returns.push(false);
// 2682
o37 = {};
// 2683
f920654002_427.returns.push(o37);
// 2684
o37.setAttribute = f920654002_587;
// 2685
f920654002_587.returns.push(undefined);
// 2686
o37.JSBNG__onmousewheel = null;
// 2688
// 2689
o37.removeAttribute = f920654002_588;
// undefined
o37 = null;
// 2690
f920654002_588.returns.push(undefined);
// 2694
f920654002_419.returns.push(undefined);
// 2695
o0.JSBNG__onDOMMouseScroll = void 0;
// 2697
o30.JSBNG__addEventListener = f920654002_419;
// undefined
o30 = null;
// 2699
o30 = {};
// 2700
f920654002_427.returns.push(o30);
// 2701
o30.setAttribute = f920654002_587;
// 2702
f920654002_587.returns.push(undefined);
// 2703
o30.JSBNG__onJSBNG__scroll = void 0;
// 2705
o30.removeAttribute = f920654002_588;
// undefined
o30 = null;
// 2706
f920654002_588.returns.push(undefined);
// 2712
o30 = {};
// 2713
f920654002_427.returns.push(o30);
// 2714
o30.setAttribute = f920654002_587;
// 2715
f920654002_587.returns.push(undefined);
// 2716
o30.JSBNG__onJSBNG__focus = void 0;
// 2718
o30.removeAttribute = f920654002_588;
// undefined
o30 = null;
// 2719
f920654002_588.returns.push(undefined);
// 2721
o30 = {};
// 2722
f920654002_427.returns.push(o30);
// 2723
o30.setAttribute = f920654002_587;
// 2724
f920654002_587.returns.push(undefined);
// 2725
o30.JSBNG__onfocusin = void 0;
// 2727
o30.removeAttribute = f920654002_588;
// undefined
o30 = null;
// 2728
f920654002_588.returns.push(undefined);
// undefined
fo920654002_595_firstChild.returns.push(null);
// 2730
f920654002_417.returns.push(0.7156839284580201);
// 2732
f920654002_418.returns.push(1373491951348);
// 2734
f920654002_418.returns.push(1373491951348);
// 2735
o0.activeElement = o16;
// 2736
o16.nodeName = "BODY";
// 2738
o16.contentEditable = "inherit";
// 2740
f920654002_418.returns.push(1373491951348);
// 2742
f920654002_418.returns.push(1373491951349);
// 2744
f920654002_418.returns.push(1373491951354);
// 2746
f920654002_418.returns.push(1373491951354);
// 2748
f920654002_418.returns.push(1373491951354);
// 2749
o33.nodeType = 1;
// 2751
f920654002_418.returns.push(1373491951355);
// 2755
o30 = {};
// 2756
f920654002_425.returns.push(o30);
// 2758
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 2760
f920654002_418.returns.push(1373491951394);
// 2764
o30 = {};
// 2765
f920654002_425.returns.push(o30);
// 2767
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 2769
f920654002_418.returns.push(1373491951405);
// 2773
o30 = {};
// 2774
f920654002_425.returns.push(o30);
// 2776
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 2778
f920654002_418.returns.push(1373491951440);
// 2782
o30 = {};
// 2783
f920654002_425.returns.push(o30);
// 2785
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 2787
f920654002_418.returns.push(1373491951448);
// 2789
f920654002_418.returns.push(1373491951451);
// 2791
f920654002_418.returns.push(1373491951451);
// 2793
o33.nextSibling = null;
// 2794
o34.removeChild = f920654002_471;
// 2795
f920654002_471.returns.push(o33);
// 2796
// 2797
o34.appendChild = f920654002_429;
// 2798
f920654002_429.returns.push(o33);
// 2800
f920654002_418.returns.push(1373491951460);
// 2802
f920654002_418.returns.push(1373491951460);
// 2804
f920654002_418.returns.push(1373491951460);
// 2807
f920654002_418.returns.push(1373491951461);
// 2809
f920654002_418.returns.push(1373491951461);
// 2811
f920654002_418.returns.push(1373491951461);
// 2813
f920654002_418.returns.push(1373491951461);
// 2814
o30 = {};
// undefined
fo920654002_595_firstChild.returns.push(o30);
// 2816
o30.getAttributeNode = f920654002_458;
// 2818
o37 = {};
// 2819
f920654002_458.returns.push(o37);
// 2820
o37.value = ".r[49e93]";
// 2821
o38 = {};
// 2822
o30.firstChild = o38;
// 2823
o38.getAttributeNode = f920654002_458;
// 2825
o39 = {};
// 2826
f920654002_458.returns.push(o39);
// 2827
o39.value = ".r[49e93].[1][4][0]";
// 2828
o40 = {};
// 2829
o38.firstChild = o40;
// undefined
o40 = null;
// 2830
o40 = {};
// 2831
o38.nextSibling = o40;
// undefined
o38 = null;
// 2832
o40.getAttributeNode = f920654002_458;
// 2834
o38 = {};
// 2835
f920654002_458.returns.push(o38);
// 2836
o38.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}";
// 2837
o41 = {};
// 2838
o40.firstChild = o41;
// 2839
o41.getAttributeNode = f920654002_458;
// 2841
o42 = {};
// 2842
f920654002_458.returns.push(o42);
// 2843
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0]";
// undefined
o42 = null;
// 2844
o42 = {};
// 2845
o41.firstChild = o42;
// undefined
o41 = null;
// 2846
o42.getAttributeNode = f920654002_458;
// 2848
o41 = {};
// 2849
f920654002_458.returns.push(o41);
// 2850
o41.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[left]";
// undefined
o41 = null;
// 2851
o41 = {};
// 2852
o42.firstChild = o41;
// undefined
o41 = null;
// 2853
o41 = {};
// 2854
o42.nextSibling = o41;
// undefined
o42 = null;
// 2855
o41.getAttributeNode = f920654002_458;
// 2857
o42 = {};
// 2858
f920654002_458.returns.push(o42);
// 2859
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right]";
// undefined
o42 = null;
// 2860
o42 = {};
// 2861
o41.firstChild = o42;
// undefined
o41 = null;
// 2862
o42.getAttributeNode = f920654002_458;
// 2864
o41 = {};
// 2865
f920654002_458.returns.push(o41);
// 2866
o41.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0]";
// undefined
o41 = null;
// 2867
o41 = {};
// 2868
o42.firstChild = o41;
// undefined
o42 = null;
// 2869
o41.getAttributeNode = f920654002_458;
// 2871
o42 = {};
// 2872
f920654002_458.returns.push(o42);
// 2873
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left]";
// undefined
o42 = null;
// 2874
o42 = {};
// 2875
o41.firstChild = o42;
// undefined
o41 = null;
// 2876
o42.getAttributeNode = f920654002_458;
// 2878
o41 = {};
// 2879
f920654002_458.returns.push(o41);
// 2880
o41.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0]";
// undefined
o41 = null;
// 2881
o41 = {};
// 2882
o42.firstChild = o41;
// undefined
o42 = null;
// 2883
o41.getAttributeNode = f920654002_458;
// 2885
o42 = {};
// 2886
f920654002_458.returns.push(o42);
// 2887
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0]";
// undefined
o42 = null;
// 2888
o42 = {};
// 2889
o41.firstChild = o42;
// undefined
o41 = null;
// 2890
o42.getAttributeNode = f920654002_458;
// 2892
o41 = {};
// 2893
f920654002_458.returns.push(o41);
// 2894
o41.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o41 = null;
// 2895
o41 = {};
// 2896
o42.firstChild = o41;
// undefined
o41 = null;
// 2897
o41 = {};
// 2898
o42.nextSibling = o41;
// undefined
o42 = null;
// 2899
o41.getAttributeNode = f920654002_458;
// 2901
o42 = {};
// 2902
f920654002_458.returns.push(o42);
// 2903
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o42 = null;
// 2904
o42 = {};
// 2905
o41.firstChild = o42;
// undefined
o42 = null;
// 2906
o42 = {};
// 2907
o41.nextSibling = o42;
// undefined
o41 = null;
// 2908
o42.getAttributeNode = f920654002_458;
// 2910
o41 = {};
// 2911
f920654002_458.returns.push(o41);
// 2912
o41.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o41 = null;
// 2913
o41 = {};
// 2914
o42.firstChild = o41;
// undefined
o41 = null;
// 2915
o41 = {};
// 2916
o42.nextSibling = o41;
// undefined
o42 = null;
// 2917
o41.getAttributeNode = f920654002_458;
// undefined
o41 = null;
// 2919
o41 = {};
// 2920
f920654002_458.returns.push(o41);
// 2921
o41.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o41 = null;
// 2924
f920654002_458.returns.push(o38);
// 2926
f920654002_646 = function() { return f920654002_646.returns[f920654002_646.inst++]; };
f920654002_646.returns = [];
f920654002_646.inst = 0;
// 2927
o33.contains = f920654002_646;
// 2929
f920654002_646.returns.push(true);
// undefined
fo920654002_595_firstChild.returns.push(o30);
// 2933
f920654002_458.returns.push(o37);
// 2938
f920654002_458.returns.push(o39);
// 2944
f920654002_458.returns.push(o38);
// 2947
o41 = {};
// 2948
o40.nextSibling = o41;
// undefined
o40 = null;
// 2949
o41.getAttributeNode = f920654002_458;
// 2951
o40 = {};
// 2952
f920654002_458.returns.push(o40);
// 2953
o40.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}";
// 2954
o42 = {};
// 2955
o41.firstChild = o42;
// 2956
o42.getAttributeNode = f920654002_458;
// 2958
o43 = {};
// 2959
f920654002_458.returns.push(o43);
// 2960
o43.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0]";
// undefined
o43 = null;
// 2961
o43 = {};
// 2962
o42.firstChild = o43;
// undefined
o42 = null;
// 2963
o43.getAttributeNode = f920654002_458;
// 2965
o42 = {};
// 2966
f920654002_458.returns.push(o42);
// 2967
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[left]";
// undefined
o42 = null;
// 2968
o42 = {};
// 2969
o43.firstChild = o42;
// undefined
o42 = null;
// 2970
o42 = {};
// 2971
o43.nextSibling = o42;
// undefined
o43 = null;
// 2972
o42.getAttributeNode = f920654002_458;
// 2974
o43 = {};
// 2975
f920654002_458.returns.push(o43);
// 2976
o43.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right]";
// undefined
o43 = null;
// 2977
o43 = {};
// 2978
o42.firstChild = o43;
// undefined
o42 = null;
// 2979
o43.getAttributeNode = f920654002_458;
// 2981
o42 = {};
// 2982
f920654002_458.returns.push(o42);
// 2983
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0]";
// undefined
o42 = null;
// 2984
o42 = {};
// 2985
o43.firstChild = o42;
// undefined
o43 = null;
// 2986
o42.getAttributeNode = f920654002_458;
// 2988
o43 = {};
// 2989
f920654002_458.returns.push(o43);
// 2990
o43.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left]";
// undefined
o43 = null;
// 2991
o43 = {};
// 2992
o42.firstChild = o43;
// undefined
o42 = null;
// 2993
o43.getAttributeNode = f920654002_458;
// 2995
o42 = {};
// 2996
f920654002_458.returns.push(o42);
// 2997
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0]";
// undefined
o42 = null;
// 2998
o42 = {};
// 2999
o43.firstChild = o42;
// 3000
o42.getAttributeNode = f920654002_458;
// 3002
o44 = {};
// 3003
f920654002_458.returns.push(o44);
// 3004
o44.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0]";
// undefined
o44 = null;
// 3005
o44 = {};
// 3006
o42.firstChild = o44;
// undefined
o42 = null;
// 3007
o44.getAttributeNode = f920654002_458;
// 3009
o42 = {};
// 3010
f920654002_458.returns.push(o42);
// 3011
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o42 = null;
// 3012
o42 = {};
// 3013
o44.firstChild = o42;
// undefined
o42 = null;
// 3014
o42 = {};
// 3015
o44.nextSibling = o42;
// undefined
o44 = null;
// 3016
o42.getAttributeNode = f920654002_458;
// 3018
o44 = {};
// 3019
f920654002_458.returns.push(o44);
// 3020
o44.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o44 = null;
// 3021
o44 = {};
// 3022
o42.firstChild = o44;
// undefined
o44 = null;
// 3023
o44 = {};
// 3024
o42.nextSibling = o44;
// undefined
o42 = null;
// 3025
o44.getAttributeNode = f920654002_458;
// 3027
o42 = {};
// 3028
f920654002_458.returns.push(o42);
// 3029
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o42 = null;
// 3030
o42 = {};
// 3031
o44.firstChild = o42;
// 3032
o45 = {};
// 3033
o44.nextSibling = o45;
// undefined
o44 = null;
// 3034
o45.getAttributeNode = f920654002_458;
// undefined
o45 = null;
// 3036
o44 = {};
// 3037
f920654002_458.returns.push(o44);
// 3038
o44.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o44 = null;
// 3041
f920654002_458.returns.push(o40);
// 3045
f920654002_646.returns.push(true);
// undefined
fo920654002_595_firstChild.returns.push(o30);
// 3049
f920654002_458.returns.push(o37);
// 3054
f920654002_458.returns.push(o39);
// 3060
f920654002_458.returns.push(o38);
// 3066
f920654002_458.returns.push(o40);
// 3069
o44 = {};
// 3070
o41.nextSibling = o44;
// undefined
o41 = null;
// 3071
o44.getAttributeNode = f920654002_458;
// 3073
o41 = {};
// 3074
f920654002_458.returns.push(o41);
// 3075
o41.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}";
// 3076
o45 = {};
// 3077
o44.firstChild = o45;
// 3078
o45.getAttributeNode = f920654002_458;
// 3080
o46 = {};
// 3081
f920654002_458.returns.push(o46);
// 3082
o46.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0]";
// undefined
o46 = null;
// 3083
o46 = {};
// 3084
o45.firstChild = o46;
// undefined
o45 = null;
// 3085
o46.getAttributeNode = f920654002_458;
// 3087
o45 = {};
// 3088
f920654002_458.returns.push(o45);
// 3089
o45.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[left]";
// undefined
o45 = null;
// 3090
o45 = {};
// 3091
o46.firstChild = o45;
// undefined
o45 = null;
// 3092
o45 = {};
// 3093
o46.nextSibling = o45;
// undefined
o46 = null;
// 3094
o45.getAttributeNode = f920654002_458;
// 3096
o46 = {};
// 3097
f920654002_458.returns.push(o46);
// 3098
o46.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right]";
// undefined
o46 = null;
// 3099
o46 = {};
// 3100
o45.firstChild = o46;
// undefined
o45 = null;
// 3101
o46.getAttributeNode = f920654002_458;
// 3103
o45 = {};
// 3104
f920654002_458.returns.push(o45);
// 3105
o45.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0]";
// undefined
o45 = null;
// 3106
o45 = {};
// 3107
o46.firstChild = o45;
// undefined
o46 = null;
// 3108
o45.getAttributeNode = f920654002_458;
// 3110
o46 = {};
// 3111
f920654002_458.returns.push(o46);
// 3112
o46.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left]";
// undefined
o46 = null;
// 3113
o46 = {};
// 3114
o45.firstChild = o46;
// undefined
o45 = null;
// 3115
o46.getAttributeNode = f920654002_458;
// 3117
o45 = {};
// 3118
f920654002_458.returns.push(o45);
// 3119
o45.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0]";
// undefined
o45 = null;
// 3120
o45 = {};
// 3121
o46.firstChild = o45;
// undefined
o46 = null;
// 3122
o45.getAttributeNode = f920654002_458;
// 3124
o46 = {};
// 3125
f920654002_458.returns.push(o46);
// 3126
o46.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0]";
// undefined
o46 = null;
// 3127
o46 = {};
// 3128
o45.firstChild = o46;
// undefined
o45 = null;
// 3129
o46.getAttributeNode = f920654002_458;
// 3131
o45 = {};
// 3132
f920654002_458.returns.push(o45);
// 3133
o45.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o45 = null;
// 3134
o45 = {};
// 3135
o46.firstChild = o45;
// undefined
o45 = null;
// 3136
o45 = {};
// 3137
o46.nextSibling = o45;
// undefined
o46 = null;
// 3138
o45.getAttributeNode = f920654002_458;
// 3140
o46 = {};
// 3141
f920654002_458.returns.push(o46);
// 3142
o46.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o46 = null;
// 3143
o46 = {};
// 3144
o45.firstChild = o46;
// undefined
o46 = null;
// 3145
o46 = {};
// 3146
o45.nextSibling = o46;
// undefined
o45 = null;
// 3147
o46.getAttributeNode = f920654002_458;
// 3149
o45 = {};
// 3150
f920654002_458.returns.push(o45);
// 3151
o45.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o45 = null;
// 3152
o45 = {};
// 3153
o46.firstChild = o45;
// undefined
o45 = null;
// 3154
o45 = {};
// 3155
o46.nextSibling = o45;
// undefined
o46 = null;
// 3156
o45.getAttributeNode = f920654002_458;
// undefined
o45 = null;
// 3158
o45 = {};
// 3159
f920654002_458.returns.push(o45);
// 3160
o45.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o45 = null;
// 3163
f920654002_458.returns.push(o41);
// 3167
f920654002_646.returns.push(true);
// undefined
fo920654002_595_firstChild.returns.push(o30);
// undefined
o30 = null;
// 3171
f920654002_458.returns.push(o37);
// undefined
o37 = null;
// 3176
f920654002_458.returns.push(o39);
// undefined
o39 = null;
// 3182
f920654002_458.returns.push(o38);
// undefined
o38 = null;
// 3188
f920654002_458.returns.push(o40);
// undefined
o40 = null;
// 3194
f920654002_458.returns.push(o41);
// undefined
o41 = null;
// 3197
o30 = {};
// 3198
o44.nextSibling = o30;
// undefined
o44 = null;
// 3199
o30.getAttributeNode = f920654002_458;
// 3201
o37 = {};
// 3202
f920654002_458.returns.push(o37);
// 3203
o37.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}";
// 3204
o38 = {};
// 3205
o30.firstChild = o38;
// undefined
o30 = null;
// 3206
o38.getAttributeNode = f920654002_458;
// 3208
o30 = {};
// 3209
f920654002_458.returns.push(o30);
// 3210
o30.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0]";
// undefined
o30 = null;
// 3211
o30 = {};
// 3212
o38.firstChild = o30;
// undefined
o38 = null;
// 3213
o30.getAttributeNode = f920654002_458;
// 3215
o38 = {};
// 3216
f920654002_458.returns.push(o38);
// 3217
o38.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[left]";
// undefined
o38 = null;
// 3218
o38 = {};
// 3219
o30.firstChild = o38;
// undefined
o38 = null;
// 3220
o38 = {};
// 3221
o30.nextSibling = o38;
// undefined
o30 = null;
// 3222
o38.getAttributeNode = f920654002_458;
// 3224
o30 = {};
// 3225
f920654002_458.returns.push(o30);
// 3226
o30.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right]";
// undefined
o30 = null;
// 3227
o30 = {};
// 3228
o38.firstChild = o30;
// undefined
o38 = null;
// 3229
o30.getAttributeNode = f920654002_458;
// 3231
o38 = {};
// 3232
f920654002_458.returns.push(o38);
// 3233
o38.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0]";
// undefined
o38 = null;
// 3234
o38 = {};
// 3235
o30.firstChild = o38;
// undefined
o30 = null;
// 3236
o38.getAttributeNode = f920654002_458;
// 3238
o30 = {};
// 3239
f920654002_458.returns.push(o30);
// 3240
o30.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left]";
// undefined
o30 = null;
// 3241
o30 = {};
// 3242
o38.firstChild = o30;
// undefined
o38 = null;
// 3243
o30.getAttributeNode = f920654002_458;
// 3245
o38 = {};
// 3246
f920654002_458.returns.push(o38);
// 3247
o38.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0]";
// undefined
o38 = null;
// 3248
o38 = {};
// 3249
o30.firstChild = o38;
// undefined
o30 = null;
// 3250
o38.getAttributeNode = f920654002_458;
// 3252
o30 = {};
// 3253
f920654002_458.returns.push(o30);
// 3254
o30.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0]";
// undefined
o30 = null;
// 3255
o30 = {};
// 3256
o38.firstChild = o30;
// undefined
o38 = null;
// 3257
o30.getAttributeNode = f920654002_458;
// 3259
o38 = {};
// 3260
f920654002_458.returns.push(o38);
// 3261
o38.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o38 = null;
// 3262
o38 = {};
// 3263
o30.firstChild = o38;
// undefined
o38 = null;
// 3264
o38 = {};
// 3265
o30.nextSibling = o38;
// undefined
o30 = null;
// 3266
o38.getAttributeNode = f920654002_458;
// 3268
o30 = {};
// 3269
f920654002_458.returns.push(o30);
// 3270
o30.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o30 = null;
// 3271
o30 = {};
// 3272
o38.firstChild = o30;
// undefined
o30 = null;
// 3273
o30 = {};
// 3274
o38.nextSibling = o30;
// undefined
o38 = null;
// 3275
o30.getAttributeNode = f920654002_458;
// 3277
o38 = {};
// 3278
f920654002_458.returns.push(o38);
// 3279
o38.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o38 = null;
// 3280
o38 = {};
// 3281
o30.firstChild = o38;
// undefined
o38 = null;
// 3282
o38 = {};
// 3283
o30.nextSibling = o38;
// undefined
o30 = null;
// 3284
o38.getAttributeNode = f920654002_458;
// undefined
o38 = null;
// 3286
o30 = {};
// 3287
f920654002_458.returns.push(o30);
// 3288
o30.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o30 = null;
// 3291
f920654002_458.returns.push(o37);
// undefined
o37 = null;
// 3295
f920654002_646.returns.push(true);
// 3297
f920654002_418.returns.push(1373491951502);
// 3302
o30 = {};
// 3303
f920654002_462.returns.push(o30);
// 3304
o30.length = 4;
// 3305
o37 = {};
// 3306
o30["0"] = o37;
// 3307
o38 = {};
// 3308
o30["1"] = o38;
// 3309
o39 = {};
// 3310
o30["2"] = o39;
// 3311
o40 = {};
// 3312
o30["3"] = o40;
// undefined
o30 = null;
// 3313
f920654002_14.returns.push(undefined);
// 3314
f920654002_12.returns.push(1204);
// 3315
o33.nodeName = "DIV";
// undefined
o33 = null;
// 3317
o34.nodeName = "DIV";
// 3318
o30 = {};
// 3319
o34.parentNode = o30;
// undefined
o34 = null;
// 3320
o30.nodeName = "FORM";
// 3322
f920654002_418.returns.push(1373491951508);
// 3327
o33 = {};
// 3328
f920654002_462.returns.push(o33);
// 3329
o33.length = 4;
// 3330
o33["0"] = o37;
// 3331
o33["1"] = o38;
// 3332
o33["2"] = o39;
// 3333
o33["3"] = o40;
// undefined
o33 = null;
// 3334
f920654002_14.returns.push(undefined);
// 3335
f920654002_12.returns.push(1205);
// undefined
fo920654002_600_firstChild = function() { return fo920654002_600_firstChild.returns[fo920654002_600_firstChild.inst++]; };
fo920654002_600_firstChild.returns = [];
fo920654002_600_firstChild.inst = 0;
defineGetter(o35, "firstChild", fo920654002_600_firstChild, undefined);
// undefined
fo920654002_600_firstChild.returns.push(null);
// undefined
fo920654002_600_firstChild.returns.push(null);
// undefined
fo920654002_600_firstChild.returns.push(null);
// 3348
f920654002_417.returns.push(0.002091239904984832);
// 3350
f920654002_418.returns.push(1373491951512);
// 3352
f920654002_418.returns.push(1373491951512);
// 3358
f920654002_418.returns.push(1373491951512);
// 3360
f920654002_418.returns.push(1373491951512);
// 3362
f920654002_418.returns.push(1373491951512);
// 3364
f920654002_418.returns.push(1373491951512);
// 3366
f920654002_418.returns.push(1373491951512);
// 3367
o35.nodeType = 1;
// 3369
f920654002_418.returns.push(1373491951512);
// 3373
o33 = {};
// 3374
f920654002_425.returns.push(o33);
// 3376
f920654002_429.returns.push(o33);
// undefined
o33 = null;
// 3380
o33 = {};
// 3381
f920654002_425.returns.push(o33);
// 3383
f920654002_429.returns.push(o33);
// undefined
o33 = null;
// 3385
f920654002_418.returns.push(1373491951537);
// 3389
o33 = {};
// 3390
f920654002_425.returns.push(o33);
// 3392
f920654002_429.returns.push(o33);
// undefined
o33 = null;
// 3394
f920654002_418.returns.push(1373491951565);
// 3398
o33 = {};
// 3399
f920654002_425.returns.push(o33);
// 3401
f920654002_429.returns.push(o33);
// undefined
o33 = null;
// 3403
f920654002_418.returns.push(1373491951574);
// 3407
o33 = {};
// 3408
f920654002_425.returns.push(o33);
// 3410
f920654002_429.returns.push(o33);
// undefined
o33 = null;
// 3412
f920654002_418.returns.push(1373491951585);
// 3414
f920654002_418.returns.push(1373491951586);
// 3416
f920654002_418.returns.push(1373491951586);
// 3418
o35.nextSibling = null;
// 3419
o36.removeChild = f920654002_471;
// 3420
f920654002_471.returns.push(o35);
// 3421
// 3422
o36.appendChild = f920654002_429;
// 3423
f920654002_429.returns.push(o35);
// 3425
f920654002_418.returns.push(1373491951596);
// 3427
f920654002_418.returns.push(1373491951596);
// 3429
f920654002_418.returns.push(1373491951596);
// 3432
f920654002_418.returns.push(1373491951596);
// 3434
f920654002_418.returns.push(1373491951596);
// 3436
f920654002_418.returns.push(1373491951597);
// 3438
f920654002_418.returns.push(1373491951597);
// 3439
o33 = {};
// undefined
fo920654002_600_firstChild.returns.push(o33);
// 3441
o33.getAttributeNode = f920654002_458;
// 3443
o34 = {};
// 3444
f920654002_458.returns.push(o34);
// 3445
o34.value = ".r[g4x]";
// 3446
o41 = {};
// 3447
o33.firstChild = o41;
// 3448
o41.getAttributeNode = f920654002_458;
// 3450
o44 = {};
// 3451
f920654002_458.returns.push(o44);
// 3452
o44.value = ".r[g4x].[1][0]";
// 3453
o45 = {};
// 3454
o41.firstChild = o45;
// undefined
o45 = null;
// 3455
o45 = {};
// 3456
o41.nextSibling = o45;
// undefined
o41 = null;
// 3457
o45.getAttributeNode = f920654002_458;
// 3459
o41 = {};
// 3460
f920654002_458.returns.push(o41);
// 3461
o41.value = ".r[g4x].[1][4][0]";
// 3462
o46 = {};
// 3463
o45.firstChild = o46;
// undefined
o46 = null;
// 3464
o46 = {};
// 3465
o45.nextSibling = o46;
// undefined
o45 = null;
// 3466
o46.getAttributeNode = f920654002_458;
// 3468
o45 = {};
// 3469
f920654002_458.returns.push(o45);
// 3470
o45.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}";
// 3471
o47 = {};
// 3472
o46.firstChild = o47;
// 3473
o47.getAttributeNode = f920654002_458;
// 3475
o48 = {};
// 3476
f920654002_458.returns.push(o48);
// 3477
o48.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0]";
// undefined
o48 = null;
// 3478
o48 = {};
// 3479
o47.firstChild = o48;
// undefined
o47 = null;
// 3480
o48.getAttributeNode = f920654002_458;
// 3482
o47 = {};
// 3483
f920654002_458.returns.push(o47);
// 3484
o47.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[left]";
// undefined
o47 = null;
// 3485
o47 = {};
// 3486
o48.firstChild = o47;
// undefined
o47 = null;
// 3487
o47 = {};
// 3488
o48.nextSibling = o47;
// undefined
o48 = null;
// 3489
o47.getAttributeNode = f920654002_458;
// 3491
o48 = {};
// 3492
f920654002_458.returns.push(o48);
// 3493
o48.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right]";
// undefined
o48 = null;
// 3494
o48 = {};
// 3495
o47.firstChild = o48;
// 3496
o48.getAttributeNode = f920654002_458;
// 3498
o49 = {};
// 3499
f920654002_458.returns.push(o49);
// 3500
o49.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0]";
// undefined
o49 = null;
// 3501
o49 = {};
// 3502
o48.firstChild = o49;
// 3503
o49.getAttributeNode = f920654002_458;
// 3505
o50 = {};
// 3506
f920654002_458.returns.push(o50);
// 3507
o50.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left]";
// undefined
o50 = null;
// 3508
o50 = {};
// 3509
o49.firstChild = o50;
// undefined
o49 = null;
// 3510
o50.getAttributeNode = f920654002_458;
// 3512
o49 = {};
// 3513
f920654002_458.returns.push(o49);
// 3514
o49.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0]";
// undefined
o49 = null;
// 3515
o49 = {};
// 3516
o50.firstChild = o49;
// undefined
o50 = null;
// 3517
o49.getAttributeNode = f920654002_458;
// 3519
o50 = {};
// 3520
f920654002_458.returns.push(o50);
// 3521
o50.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0]";
// undefined
o50 = null;
// 3522
o50 = {};
// 3523
o49.firstChild = o50;
// undefined
o49 = null;
// 3524
o50.getAttributeNode = f920654002_458;
// 3526
o49 = {};
// 3527
f920654002_458.returns.push(o49);
// 3528
o49.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o49 = null;
// 3529
o49 = {};
// 3530
o50.firstChild = o49;
// undefined
o49 = null;
// 3531
o49 = {};
// 3532
o50.nextSibling = o49;
// undefined
o50 = null;
// 3533
o49.getAttributeNode = f920654002_458;
// 3535
o50 = {};
// 3536
f920654002_458.returns.push(o50);
// 3537
o50.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o50 = null;
// 3538
o50 = {};
// 3539
o49.firstChild = o50;
// undefined
o50 = null;
// 3540
o50 = {};
// 3541
o49.nextSibling = o50;
// undefined
o49 = null;
// 3542
o50.getAttributeNode = f920654002_458;
// 3544
o49 = {};
// 3545
f920654002_458.returns.push(o49);
// 3546
o49.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o49 = null;
// 3547
o49 = {};
// 3548
o50.firstChild = o49;
// undefined
o49 = null;
// 3549
o49 = {};
// 3550
o50.nextSibling = o49;
// undefined
o50 = null;
// 3551
o49.getAttributeNode = f920654002_458;
// undefined
o49 = null;
// 3553
o49 = {};
// 3554
f920654002_458.returns.push(o49);
// 3555
o49.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o49 = null;
// 3558
f920654002_458.returns.push(o45);
// 3560
o35.contains = f920654002_646;
// 3562
f920654002_646.returns.push(true);
// undefined
fo920654002_600_firstChild.returns.push(o33);
// 3566
f920654002_458.returns.push(o34);
// 3571
f920654002_458.returns.push(o44);
// 3577
f920654002_458.returns.push(o41);
// 3583
f920654002_458.returns.push(o45);
// 3586
o49 = {};
// 3587
o46.nextSibling = o49;
// undefined
o46 = null;
// 3588
o49.getAttributeNode = f920654002_458;
// 3590
o46 = {};
// 3591
f920654002_458.returns.push(o46);
// 3592
o46.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}";
// 3593
o50 = {};
// 3594
o49.firstChild = o50;
// 3595
o50.getAttributeNode = f920654002_458;
// 3597
o51 = {};
// 3598
f920654002_458.returns.push(o51);
// 3599
o51.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0]";
// undefined
o51 = null;
// 3600
o51 = {};
// 3601
o50.firstChild = o51;
// undefined
o50 = null;
// 3602
o51.getAttributeNode = f920654002_458;
// 3604
o50 = {};
// 3605
f920654002_458.returns.push(o50);
// 3606
o50.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[left]";
// undefined
o50 = null;
// 3607
o50 = {};
// 3608
o51.firstChild = o50;
// undefined
o50 = null;
// 3609
o50 = {};
// 3610
o51.nextSibling = o50;
// undefined
o51 = null;
// 3611
o50.getAttributeNode = f920654002_458;
// 3613
o51 = {};
// 3614
f920654002_458.returns.push(o51);
// 3615
o51.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right]";
// undefined
o51 = null;
// 3616
o51 = {};
// 3617
o50.firstChild = o51;
// undefined
o50 = null;
// 3618
o51.getAttributeNode = f920654002_458;
// 3620
o50 = {};
// 3621
f920654002_458.returns.push(o50);
// 3622
o50.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0]";
// undefined
o50 = null;
// 3623
o50 = {};
// 3624
o51.firstChild = o50;
// undefined
o51 = null;
// 3625
o50.getAttributeNode = f920654002_458;
// 3627
o51 = {};
// 3628
f920654002_458.returns.push(o51);
// 3629
o51.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left]";
// undefined
o51 = null;
// 3630
o51 = {};
// 3631
o50.firstChild = o51;
// undefined
o50 = null;
// 3632
o51.getAttributeNode = f920654002_458;
// 3634
o50 = {};
// 3635
f920654002_458.returns.push(o50);
// 3636
o50.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0]";
// undefined
o50 = null;
// 3637
o50 = {};
// 3638
o51.firstChild = o50;
// 3639
o50.getAttributeNode = f920654002_458;
// 3641
o52 = {};
// 3642
f920654002_458.returns.push(o52);
// 3643
o52.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0]";
// undefined
o52 = null;
// 3644
o52 = {};
// 3645
o50.firstChild = o52;
// 3646
o52.getAttributeNode = f920654002_458;
// 3648
o53 = {};
// 3649
f920654002_458.returns.push(o53);
// 3650
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o53 = null;
// 3651
o53 = {};
// 3652
o52.firstChild = o53;
// undefined
o53 = null;
// 3653
o53 = {};
// 3654
o52.nextSibling = o53;
// undefined
o52 = null;
// 3655
o53.getAttributeNode = f920654002_458;
// 3657
o52 = {};
// 3658
f920654002_458.returns.push(o52);
// 3659
o52.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o52 = null;
// 3660
o52 = {};
// 3661
o53.firstChild = o52;
// undefined
o52 = null;
// 3662
o52 = {};
// 3663
o53.nextSibling = o52;
// undefined
o53 = null;
// 3664
o52.getAttributeNode = f920654002_458;
// 3666
o53 = {};
// 3667
f920654002_458.returns.push(o53);
// 3668
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o53 = null;
// 3669
o53 = {};
// 3670
o52.firstChild = o53;
// undefined
o53 = null;
// 3671
o53 = {};
// 3672
o52.nextSibling = o53;
// undefined
o52 = null;
// 3673
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 3675
o52 = {};
// 3676
f920654002_458.returns.push(o52);
// 3677
o52.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o52 = null;
// 3680
f920654002_458.returns.push(o46);
// 3684
f920654002_646.returns.push(true);
// undefined
fo920654002_600_firstChild.returns.push(o33);
// 3688
f920654002_458.returns.push(o34);
// 3693
f920654002_458.returns.push(o44);
// 3699
f920654002_458.returns.push(o41);
// 3705
f920654002_458.returns.push(o45);
// 3711
f920654002_458.returns.push(o46);
// 3714
o52 = {};
// 3715
o49.nextSibling = o52;
// undefined
o49 = null;
// 3716
o52.getAttributeNode = f920654002_458;
// 3718
o49 = {};
// 3719
f920654002_458.returns.push(o49);
// 3720
o49.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}";
// 3721
o53 = {};
// 3722
o52.firstChild = o53;
// 3723
o53.getAttributeNode = f920654002_458;
// 3725
o54 = {};
// 3726
f920654002_458.returns.push(o54);
// 3727
o54.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0]";
// undefined
o54 = null;
// 3728
o54 = {};
// 3729
o53.firstChild = o54;
// undefined
o53 = null;
// 3730
o54.getAttributeNode = f920654002_458;
// 3732
o53 = {};
// 3733
f920654002_458.returns.push(o53);
// 3734
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[left]";
// undefined
o53 = null;
// 3735
o53 = {};
// 3736
o54.firstChild = o53;
// undefined
o53 = null;
// 3737
o53 = {};
// 3738
o54.nextSibling = o53;
// undefined
o54 = null;
// 3739
o53.getAttributeNode = f920654002_458;
// 3741
o54 = {};
// 3742
f920654002_458.returns.push(o54);
// 3743
o54.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right]";
// undefined
o54 = null;
// 3744
o54 = {};
// 3745
o53.firstChild = o54;
// undefined
o53 = null;
// 3746
o54.getAttributeNode = f920654002_458;
// 3748
o53 = {};
// 3749
f920654002_458.returns.push(o53);
// 3750
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0]";
// undefined
o53 = null;
// 3751
o53 = {};
// 3752
o54.firstChild = o53;
// undefined
o54 = null;
// 3753
o53.getAttributeNode = f920654002_458;
// 3755
o54 = {};
// 3756
f920654002_458.returns.push(o54);
// 3757
o54.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left]";
// undefined
o54 = null;
// 3758
o54 = {};
// 3759
o53.firstChild = o54;
// undefined
o53 = null;
// 3760
o54.getAttributeNode = f920654002_458;
// 3762
o53 = {};
// 3763
f920654002_458.returns.push(o53);
// 3764
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0]";
// undefined
o53 = null;
// 3765
o53 = {};
// 3766
o54.firstChild = o53;
// undefined
o54 = null;
// 3767
o53.getAttributeNode = f920654002_458;
// 3769
o54 = {};
// 3770
f920654002_458.returns.push(o54);
// 3771
o54.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0]";
// undefined
o54 = null;
// 3772
o54 = {};
// 3773
o53.firstChild = o54;
// undefined
o53 = null;
// 3774
o54.getAttributeNode = f920654002_458;
// 3776
o53 = {};
// 3777
f920654002_458.returns.push(o53);
// 3778
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o53 = null;
// 3779
o53 = {};
// 3780
o54.firstChild = o53;
// undefined
o53 = null;
// 3781
o53 = {};
// 3782
o54.nextSibling = o53;
// undefined
o54 = null;
// 3783
o53.getAttributeNode = f920654002_458;
// 3785
o54 = {};
// 3786
f920654002_458.returns.push(o54);
// 3787
o54.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o54 = null;
// 3788
o54 = {};
// 3789
o53.firstChild = o54;
// undefined
o54 = null;
// 3790
o54 = {};
// 3791
o53.nextSibling = o54;
// undefined
o53 = null;
// 3792
o54.getAttributeNode = f920654002_458;
// 3794
o53 = {};
// 3795
f920654002_458.returns.push(o53);
// 3796
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o53 = null;
// 3797
o53 = {};
// 3798
o54.firstChild = o53;
// undefined
o53 = null;
// 3799
o53 = {};
// 3800
o54.nextSibling = o53;
// undefined
o54 = null;
// 3801
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 3803
o53 = {};
// 3804
f920654002_458.returns.push(o53);
// 3805
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o53 = null;
// 3808
f920654002_458.returns.push(o49);
// 3812
f920654002_646.returns.push(true);
// undefined
fo920654002_600_firstChild.returns.push(o33);
// undefined
o33 = null;
// 3816
f920654002_458.returns.push(o34);
// undefined
o34 = null;
// 3821
f920654002_458.returns.push(o44);
// undefined
o44 = null;
// 3827
f920654002_458.returns.push(o41);
// undefined
o41 = null;
// 3833
f920654002_458.returns.push(o45);
// undefined
o45 = null;
// 3839
f920654002_458.returns.push(o46);
// undefined
o46 = null;
// 3845
f920654002_458.returns.push(o49);
// undefined
o49 = null;
// 3848
o33 = {};
// 3849
o52.nextSibling = o33;
// undefined
o52 = null;
// 3850
o33.getAttributeNode = f920654002_458;
// 3852
o34 = {};
// 3853
f920654002_458.returns.push(o34);
// 3854
o34.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}";
// 3855
o41 = {};
// 3856
o33.firstChild = o41;
// undefined
o33 = null;
// 3857
o41.getAttributeNode = f920654002_458;
// 3859
o33 = {};
// 3860
f920654002_458.returns.push(o33);
// 3861
o33.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0]";
// undefined
o33 = null;
// 3862
o33 = {};
// 3863
o41.firstChild = o33;
// undefined
o41 = null;
// 3864
o33.getAttributeNode = f920654002_458;
// 3866
o41 = {};
// 3867
f920654002_458.returns.push(o41);
// 3868
o41.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[left]";
// undefined
o41 = null;
// 3869
o41 = {};
// 3870
o33.firstChild = o41;
// undefined
o41 = null;
// 3871
o41 = {};
// 3872
o33.nextSibling = o41;
// undefined
o33 = null;
// 3873
o41.getAttributeNode = f920654002_458;
// 3875
o33 = {};
// 3876
f920654002_458.returns.push(o33);
// 3877
o33.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right]";
// undefined
o33 = null;
// 3878
o33 = {};
// 3879
o41.firstChild = o33;
// undefined
o41 = null;
// 3880
o33.getAttributeNode = f920654002_458;
// 3882
o41 = {};
// 3883
f920654002_458.returns.push(o41);
// 3884
o41.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0]";
// undefined
o41 = null;
// 3885
o41 = {};
// 3886
o33.firstChild = o41;
// undefined
o33 = null;
// 3887
o41.getAttributeNode = f920654002_458;
// 3889
o33 = {};
// 3890
f920654002_458.returns.push(o33);
// 3891
o33.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left]";
// undefined
o33 = null;
// 3892
o33 = {};
// 3893
o41.firstChild = o33;
// undefined
o41 = null;
// 3894
o33.getAttributeNode = f920654002_458;
// 3896
o41 = {};
// 3897
f920654002_458.returns.push(o41);
// 3898
o41.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0]";
// undefined
o41 = null;
// 3899
o41 = {};
// 3900
o33.firstChild = o41;
// undefined
o33 = null;
// 3901
o41.getAttributeNode = f920654002_458;
// 3903
o33 = {};
// 3904
f920654002_458.returns.push(o33);
// 3905
o33.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0]";
// undefined
o33 = null;
// 3906
o33 = {};
// 3907
o41.firstChild = o33;
// undefined
o41 = null;
// 3908
o33.getAttributeNode = f920654002_458;
// 3910
o41 = {};
// 3911
f920654002_458.returns.push(o41);
// 3912
o41.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o41 = null;
// 3913
o41 = {};
// 3914
o33.firstChild = o41;
// undefined
o41 = null;
// 3915
o41 = {};
// 3916
o33.nextSibling = o41;
// undefined
o33 = null;
// 3917
o41.getAttributeNode = f920654002_458;
// 3919
o33 = {};
// 3920
f920654002_458.returns.push(o33);
// 3921
o33.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o33 = null;
// 3922
o33 = {};
// 3923
o41.firstChild = o33;
// undefined
o33 = null;
// 3924
o33 = {};
// 3925
o41.nextSibling = o33;
// undefined
o41 = null;
// 3926
o33.getAttributeNode = f920654002_458;
// 3928
o41 = {};
// 3929
f920654002_458.returns.push(o41);
// 3930
o41.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o41 = null;
// 3931
o41 = {};
// 3932
o33.firstChild = o41;
// undefined
o41 = null;
// 3933
o41 = {};
// 3934
o33.nextSibling = o41;
// undefined
o33 = null;
// 3935
o41.getAttributeNode = f920654002_458;
// undefined
o41 = null;
// 3937
o33 = {};
// 3938
f920654002_458.returns.push(o33);
// 3939
o33.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o33 = null;
// 3942
f920654002_458.returns.push(o34);
// undefined
o34 = null;
// 3946
f920654002_646.returns.push(true);
// 3948
f920654002_418.returns.push(1373491951646);
// 3953
o33 = {};
// 3954
f920654002_462.returns.push(o33);
// 3955
o33.length = 8;
// 3956
o34 = {};
// 3957
o33["0"] = o34;
// 3958
o41 = {};
// 3959
o33["1"] = o41;
// 3960
o44 = {};
// 3961
o33["2"] = o44;
// 3962
o45 = {};
// 3963
o33["3"] = o45;
// 3964
o33["4"] = o37;
// 3965
o33["5"] = o38;
// 3966
o33["6"] = o39;
// 3967
o33["7"] = o40;
// undefined
o33 = null;
// 3968
f920654002_14.returns.push(undefined);
// 3969
f920654002_12.returns.push(1206);
// 3970
o35.nodeName = "DIV";
// undefined
o35 = null;
// 3972
o36.nodeName = "DIV";
// 3973
o33 = {};
// 3974
o36.parentNode = o33;
// undefined
o36 = null;
// 3975
o33.nodeName = "FORM";
// 3979
o35 = {};
// 3980
f920654002_425.returns.push(o35);
// 3982
f920654002_429.returns.push(o35);
// undefined
o35 = null;
// 3985
o35 = {};
// 3986
f920654002_467.returns.push(o35);
// 3987
o35.id = "u_0_1s";
// 3988
o35.getElementsByTagName = f920654002_453;
// 3989
o36 = {};
// 3990
o35.parentNode = o36;
// undefined
o35 = null;
// undefined
o36 = null;
// 3995
o35 = {};
// 3996
f920654002_467.returns.push(o35);
// 3997
o35.id = "u_0_1u";
// 3998
o35.getElementsByTagName = f920654002_453;
// 3999
o36 = {};
// 4000
o35.parentNode = o36;
// 4018
f920654002_418.returns.push(1373491952289);
// 4023
o46 = {};
// 4024
f920654002_462.returns.push(o46);
// 4025
o46.length = 8;
// 4026
o46["0"] = o34;
// 4027
o46["1"] = o41;
// 4028
o46["2"] = o44;
// 4029
o46["3"] = o45;
// 4030
o46["4"] = o37;
// 4031
o46["5"] = o38;
// 4032
o46["6"] = o39;
// 4033
o46["7"] = o40;
// undefined
o46 = null;
// 4034
f920654002_14.returns.push(undefined);
// 4035
f920654002_12.returns.push(1207);
// undefined
fo920654002_872_firstChild = function() { return fo920654002_872_firstChild.returns[fo920654002_872_firstChild.inst++]; };
fo920654002_872_firstChild.returns = [];
fo920654002_872_firstChild.inst = 0;
defineGetter(o35, "firstChild", fo920654002_872_firstChild, undefined);
// undefined
fo920654002_872_firstChild.returns.push(null);
// undefined
fo920654002_872_firstChild.returns.push(null);
// undefined
fo920654002_872_firstChild.returns.push(null);
// 4051
f920654002_417.returns.push(0.9937345795333385);
// 4053
f920654002_418.returns.push(1373491952298);
// 4055
f920654002_418.returns.push(1373491952298);
// 4061
f920654002_418.returns.push(1373491952298);
// 4063
f920654002_418.returns.push(1373491952298);
// 4065
f920654002_418.returns.push(1373491952298);
// 4067
f920654002_418.returns.push(1373491952298);
// 4069
f920654002_418.returns.push(1373491952298);
// 4070
o35.nodeType = 1;
// 4072
f920654002_418.returns.push(1373491952298);
// 4076
o46 = {};
// 4077
f920654002_425.returns.push(o46);
// 4079
f920654002_429.returns.push(o46);
// undefined
o46 = null;
// 4081
o46 = {};
// 4082
f920654002_427.returns.push(o46);
// 4083
// 4084
// 4086
o49 = {};
// 4087
f920654002_427.returns.push(o49);
// 4088
o49.firstChild = null;
// 4089
o46.__html = void 0;
// undefined
o46 = null;
// 4091
o46 = {};
// 4092
f920654002_425.returns.push(o46);
// 4094
o49.appendChild = f920654002_429;
// 4095
f920654002_429.returns.push(o46);
// undefined
o46 = null;
// 4096
o49.innerHTML = "";
// undefined
o49 = null;
// 4098
f920654002_418.returns.push(1373491952343);
// 4102
o46 = {};
// 4103
f920654002_425.returns.push(o46);
// 4105
f920654002_429.returns.push(o46);
// undefined
o46 = null;
// 4107
f920654002_418.returns.push(1373491952353);
// 4111
o46 = {};
// 4112
f920654002_425.returns.push(o46);
// 4114
f920654002_429.returns.push(o46);
// undefined
o46 = null;
// 4116
f920654002_418.returns.push(1373491952365);
// 4120
o46 = {};
// 4121
f920654002_425.returns.push(o46);
// 4123
f920654002_429.returns.push(o46);
// undefined
o46 = null;
// 4125
f920654002_418.returns.push(1373491952373);
// 4127
f920654002_418.returns.push(1373491952374);
// 4129
f920654002_418.returns.push(1373491952374);
// 4131
o35.nextSibling = null;
// 4132
o36.removeChild = f920654002_471;
// 4133
f920654002_471.returns.push(o35);
// 4134
// 4135
o36.appendChild = f920654002_429;
// 4136
f920654002_429.returns.push(o35);
// 4138
f920654002_418.returns.push(1373491952385);
// 4140
f920654002_418.returns.push(1373491952385);
// 4142
f920654002_418.returns.push(1373491952385);
// 4145
f920654002_418.returns.push(1373491952385);
// 4147
f920654002_418.returns.push(1373491952386);
// 4149
f920654002_418.returns.push(1373491952386);
// 4151
f920654002_418.returns.push(1373491952386);
// 4152
o46 = {};
// undefined
fo920654002_872_firstChild.returns.push(o46);
// 4154
o46.getAttributeNode = f920654002_458;
// 4156
o49 = {};
// 4157
f920654002_458.returns.push(o49);
// 4158
o49.value = ".r[5wzpd]";
// 4159
o52 = {};
// 4160
o46.firstChild = o52;
// 4161
o52.getAttributeNode = f920654002_458;
// 4163
o53 = {};
// 4164
f920654002_458.returns.push(o53);
// 4165
o53.value = ".r[5wzpd].[1][0]";
// 4166
o54 = {};
// 4167
o52.firstChild = o54;
// undefined
o54 = null;
// 4168
o54 = {};
// 4169
o52.nextSibling = o54;
// undefined
o52 = null;
// 4170
o54.getAttributeNode = f920654002_458;
// 4172
o52 = {};
// 4173
f920654002_458.returns.push(o52);
// 4174
o52.value = ".r[5wzpd].[1][4][0]";
// 4175
o55 = {};
// 4176
o54.firstChild = o55;
// undefined
o55 = null;
// 4177
o55 = {};
// 4178
o54.nextSibling = o55;
// undefined
o54 = null;
// 4179
o55.getAttributeNode = f920654002_458;
// 4181
o54 = {};
// 4182
f920654002_458.returns.push(o54);
// 4183
o54.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}";
// 4184
o56 = {};
// 4185
o55.firstChild = o56;
// 4186
o56.getAttributeNode = f920654002_458;
// 4188
o57 = {};
// 4189
f920654002_458.returns.push(o57);
// 4190
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0]";
// undefined
o57 = null;
// 4191
o57 = {};
// 4192
o56.firstChild = o57;
// undefined
o56 = null;
// 4193
o57.getAttributeNode = f920654002_458;
// 4195
o56 = {};
// 4196
f920654002_458.returns.push(o56);
// 4197
o56.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[left]";
// undefined
o56 = null;
// 4198
o56 = {};
// 4199
o57.firstChild = o56;
// undefined
o56 = null;
// 4200
o56 = {};
// 4201
o57.nextSibling = o56;
// undefined
o57 = null;
// 4202
o56.getAttributeNode = f920654002_458;
// 4204
o57 = {};
// 4205
f920654002_458.returns.push(o57);
// 4206
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right]";
// undefined
o57 = null;
// 4207
o57 = {};
// 4208
o56.firstChild = o57;
// undefined
o56 = null;
// 4209
o57.getAttributeNode = f920654002_458;
// 4211
o56 = {};
// 4212
f920654002_458.returns.push(o56);
// 4213
o56.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0]";
// undefined
o56 = null;
// 4214
o56 = {};
// 4215
o57.firstChild = o56;
// undefined
o57 = null;
// 4216
o56.getAttributeNode = f920654002_458;
// 4218
o57 = {};
// 4219
f920654002_458.returns.push(o57);
// 4220
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left]";
// undefined
o57 = null;
// 4221
o57 = {};
// 4222
o56.firstChild = o57;
// undefined
o56 = null;
// 4223
o57.getAttributeNode = f920654002_458;
// 4225
o56 = {};
// 4226
f920654002_458.returns.push(o56);
// 4227
o56.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0]";
// undefined
o56 = null;
// 4228
o56 = {};
// 4229
o57.firstChild = o56;
// undefined
o57 = null;
// 4230
o56.getAttributeNode = f920654002_458;
// 4232
o57 = {};
// 4233
f920654002_458.returns.push(o57);
// 4234
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0]";
// undefined
o57 = null;
// 4235
o57 = {};
// 4236
o56.firstChild = o57;
// undefined
o56 = null;
// 4237
o57.getAttributeNode = f920654002_458;
// 4239
o56 = {};
// 4240
f920654002_458.returns.push(o56);
// 4241
o56.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o56 = null;
// 4242
o56 = {};
// 4243
o57.firstChild = o56;
// undefined
o56 = null;
// 4244
o56 = {};
// 4245
o57.nextSibling = o56;
// undefined
o57 = null;
// 4246
o56.getAttributeNode = f920654002_458;
// 4248
o57 = {};
// 4249
f920654002_458.returns.push(o57);
// 4250
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o57 = null;
// 4251
o57 = {};
// 4252
o56.firstChild = o57;
// undefined
o57 = null;
// 4253
o57 = {};
// 4254
o56.nextSibling = o57;
// undefined
o56 = null;
// 4255
o57.getAttributeNode = f920654002_458;
// 4257
o56 = {};
// 4258
f920654002_458.returns.push(o56);
// 4259
o56.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o56 = null;
// 4260
o56 = {};
// 4261
o57.firstChild = o56;
// undefined
o56 = null;
// 4262
o56 = {};
// 4263
o57.nextSibling = o56;
// undefined
o57 = null;
// 4264
o56.getAttributeNode = f920654002_458;
// undefined
o56 = null;
// 4266
o56 = {};
// 4267
f920654002_458.returns.push(o56);
// 4268
o56.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o56 = null;
// 4271
f920654002_458.returns.push(o54);
// 4273
o35.contains = f920654002_646;
// 4275
f920654002_646.returns.push(true);
// undefined
fo920654002_872_firstChild.returns.push(o46);
// 4279
f920654002_458.returns.push(o49);
// 4284
f920654002_458.returns.push(o53);
// 4290
f920654002_458.returns.push(o52);
// 4296
f920654002_458.returns.push(o54);
// 4299
o56 = {};
// 4300
o55.nextSibling = o56;
// undefined
o55 = null;
// 4301
o56.getAttributeNode = f920654002_458;
// 4303
o55 = {};
// 4304
f920654002_458.returns.push(o55);
// 4305
o55.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}";
// 4306
o57 = {};
// 4307
o56.firstChild = o57;
// 4308
o57.getAttributeNode = f920654002_458;
// 4310
o58 = {};
// 4311
f920654002_458.returns.push(o58);
// 4312
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0]";
// undefined
o58 = null;
// 4313
o58 = {};
// 4314
o57.firstChild = o58;
// undefined
o57 = null;
// 4315
o58.getAttributeNode = f920654002_458;
// 4317
o57 = {};
// 4318
f920654002_458.returns.push(o57);
// 4319
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[left]";
// undefined
o57 = null;
// 4320
o57 = {};
// 4321
o58.firstChild = o57;
// undefined
o57 = null;
// 4322
o57 = {};
// 4323
o58.nextSibling = o57;
// undefined
o58 = null;
// 4324
o57.getAttributeNode = f920654002_458;
// 4326
o58 = {};
// 4327
f920654002_458.returns.push(o58);
// 4328
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right]";
// undefined
o58 = null;
// 4329
o58 = {};
// 4330
o57.firstChild = o58;
// undefined
o57 = null;
// 4331
o58.getAttributeNode = f920654002_458;
// 4333
o57 = {};
// 4334
f920654002_458.returns.push(o57);
// 4335
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0]";
// undefined
o57 = null;
// 4336
o57 = {};
// 4337
o58.firstChild = o57;
// undefined
o58 = null;
// 4338
o57.getAttributeNode = f920654002_458;
// 4340
o58 = {};
// 4341
f920654002_458.returns.push(o58);
// 4342
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left]";
// undefined
o58 = null;
// 4343
o58 = {};
// 4344
o57.firstChild = o58;
// undefined
o57 = null;
// 4345
o58.getAttributeNode = f920654002_458;
// 4347
o57 = {};
// 4348
f920654002_458.returns.push(o57);
// 4349
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0]";
// undefined
o57 = null;
// 4350
o57 = {};
// 4351
o58.firstChild = o57;
// undefined
o58 = null;
// 4352
o57.getAttributeNode = f920654002_458;
// 4354
o58 = {};
// 4355
f920654002_458.returns.push(o58);
// 4356
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]";
// undefined
o58 = null;
// 4357
o58 = {};
// 4358
o57.firstChild = o58;
// undefined
o57 = null;
// 4359
o58.getAttributeNode = f920654002_458;
// 4361
o57 = {};
// 4362
f920654002_458.returns.push(o57);
// 4363
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o57 = null;
// 4364
o57 = {};
// 4365
o58.firstChild = o57;
// undefined
o57 = null;
// 4366
o57 = {};
// 4367
o58.nextSibling = o57;
// undefined
o58 = null;
// 4368
o57.getAttributeNode = f920654002_458;
// 4370
o58 = {};
// 4371
f920654002_458.returns.push(o58);
// 4372
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o58 = null;
// 4373
o58 = {};
// 4374
o57.firstChild = o58;
// undefined
o58 = null;
// 4375
o58 = {};
// 4376
o57.nextSibling = o58;
// undefined
o57 = null;
// 4377
o58.getAttributeNode = f920654002_458;
// 4379
o57 = {};
// 4380
f920654002_458.returns.push(o57);
// 4381
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o57 = null;
// 4382
o57 = {};
// 4383
o58.firstChild = o57;
// undefined
o57 = null;
// 4384
o57 = {};
// 4385
o58.nextSibling = o57;
// undefined
o58 = null;
// 4386
o57.getAttributeNode = f920654002_458;
// undefined
o57 = null;
// 4388
o57 = {};
// 4389
f920654002_458.returns.push(o57);
// 4390
o57.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o57 = null;
// 4393
f920654002_458.returns.push(o55);
// 4397
f920654002_646.returns.push(true);
// undefined
fo920654002_872_firstChild.returns.push(o46);
// 4401
f920654002_458.returns.push(o49);
// 4406
f920654002_458.returns.push(o53);
// 4412
f920654002_458.returns.push(o52);
// 4418
f920654002_458.returns.push(o54);
// 4424
f920654002_458.returns.push(o55);
// 4427
o57 = {};
// 4428
o56.nextSibling = o57;
// undefined
o56 = null;
// 4429
o57.getAttributeNode = f920654002_458;
// 4431
o56 = {};
// 4432
f920654002_458.returns.push(o56);
// 4433
o56.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}";
// 4434
o58 = {};
// 4435
o57.firstChild = o58;
// 4436
o58.getAttributeNode = f920654002_458;
// 4438
o59 = {};
// 4439
f920654002_458.returns.push(o59);
// 4440
o59.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0]";
// undefined
o59 = null;
// 4441
o59 = {};
// 4442
o58.firstChild = o59;
// undefined
o58 = null;
// 4443
o59.getAttributeNode = f920654002_458;
// 4445
o58 = {};
// 4446
f920654002_458.returns.push(o58);
// 4447
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[left]";
// undefined
o58 = null;
// 4448
o58 = {};
// 4449
o59.firstChild = o58;
// undefined
o58 = null;
// 4450
o58 = {};
// 4451
o59.nextSibling = o58;
// undefined
o59 = null;
// 4452
o58.getAttributeNode = f920654002_458;
// 4454
o59 = {};
// 4455
f920654002_458.returns.push(o59);
// 4456
o59.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right]";
// undefined
o59 = null;
// 4457
o59 = {};
// 4458
o58.firstChild = o59;
// undefined
o58 = null;
// 4459
o59.getAttributeNode = f920654002_458;
// 4461
o58 = {};
// 4462
f920654002_458.returns.push(o58);
// 4463
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0]";
// undefined
o58 = null;
// 4464
o58 = {};
// 4465
o59.firstChild = o58;
// undefined
o59 = null;
// 4466
o58.getAttributeNode = f920654002_458;
// 4468
o59 = {};
// 4469
f920654002_458.returns.push(o59);
// 4470
o59.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left]";
// undefined
o59 = null;
// 4471
o59 = {};
// 4472
o58.firstChild = o59;
// undefined
o58 = null;
// 4473
o59.getAttributeNode = f920654002_458;
// 4475
o58 = {};
// 4476
f920654002_458.returns.push(o58);
// 4477
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0]";
// undefined
o58 = null;
// 4478
o58 = {};
// 4479
o59.firstChild = o58;
// undefined
o59 = null;
// 4480
o58.getAttributeNode = f920654002_458;
// 4482
o59 = {};
// 4483
f920654002_458.returns.push(o59);
// 4484
o59.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0]";
// undefined
o59 = null;
// 4485
o59 = {};
// 4486
o58.firstChild = o59;
// undefined
o58 = null;
// 4487
o59.getAttributeNode = f920654002_458;
// 4489
o58 = {};
// 4490
f920654002_458.returns.push(o58);
// 4491
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o58 = null;
// 4492
o58 = {};
// 4493
o59.firstChild = o58;
// undefined
o58 = null;
// 4494
o58 = {};
// 4495
o59.nextSibling = o58;
// undefined
o59 = null;
// 4496
o58.getAttributeNode = f920654002_458;
// 4498
o59 = {};
// 4499
f920654002_458.returns.push(o59);
// 4500
o59.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o59 = null;
// 4501
o59 = {};
// 4502
o58.firstChild = o59;
// undefined
o59 = null;
// 4503
o59 = {};
// 4504
o58.nextSibling = o59;
// undefined
o58 = null;
// 4505
o59.getAttributeNode = f920654002_458;
// 4507
o58 = {};
// 4508
f920654002_458.returns.push(o58);
// 4509
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o58 = null;
// 4510
o58 = {};
// 4511
o59.firstChild = o58;
// undefined
o58 = null;
// 4512
o58 = {};
// 4513
o59.nextSibling = o58;
// undefined
o59 = null;
// 4514
o58.getAttributeNode = f920654002_458;
// undefined
o58 = null;
// 4516
o58 = {};
// 4517
f920654002_458.returns.push(o58);
// 4518
o58.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o58 = null;
// 4521
f920654002_458.returns.push(o56);
// 4525
f920654002_646.returns.push(true);
// undefined
fo920654002_872_firstChild.returns.push(o46);
// undefined
o46 = null;
// 4529
f920654002_458.returns.push(o49);
// undefined
o49 = null;
// 4534
f920654002_458.returns.push(o53);
// undefined
o53 = null;
// 4540
f920654002_458.returns.push(o52);
// undefined
o52 = null;
// 4546
f920654002_458.returns.push(o54);
// undefined
o54 = null;
// 4552
f920654002_458.returns.push(o55);
// undefined
o55 = null;
// 4558
f920654002_458.returns.push(o56);
// undefined
o56 = null;
// 4561
o46 = {};
// 4562
o57.nextSibling = o46;
// undefined
o57 = null;
// 4563
o46.getAttributeNode = f920654002_458;
// 4565
o49 = {};
// 4566
f920654002_458.returns.push(o49);
// 4567
o49.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}";
// 4568
o52 = {};
// 4569
o46.firstChild = o52;
// undefined
o46 = null;
// 4570
o52.getAttributeNode = f920654002_458;
// 4572
o46 = {};
// 4573
f920654002_458.returns.push(o46);
// 4574
o46.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0]";
// undefined
o46 = null;
// 4575
o46 = {};
// 4576
o52.firstChild = o46;
// undefined
o52 = null;
// 4577
o46.getAttributeNode = f920654002_458;
// 4579
o52 = {};
// 4580
f920654002_458.returns.push(o52);
// 4581
o52.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[left]";
// undefined
o52 = null;
// 4582
o52 = {};
// 4583
o46.firstChild = o52;
// undefined
o52 = null;
// 4584
o52 = {};
// 4585
o46.nextSibling = o52;
// undefined
o46 = null;
// 4586
o52.getAttributeNode = f920654002_458;
// 4588
o46 = {};
// 4589
f920654002_458.returns.push(o46);
// 4590
o46.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right]";
// undefined
o46 = null;
// 4591
o46 = {};
// 4592
o52.firstChild = o46;
// undefined
o52 = null;
// 4593
o46.getAttributeNode = f920654002_458;
// 4595
o52 = {};
// 4596
f920654002_458.returns.push(o52);
// 4597
o52.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0]";
// undefined
o52 = null;
// 4598
o52 = {};
// 4599
o46.firstChild = o52;
// undefined
o46 = null;
// 4600
o52.getAttributeNode = f920654002_458;
// 4602
o46 = {};
// 4603
f920654002_458.returns.push(o46);
// 4604
o46.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left]";
// undefined
o46 = null;
// 4605
o46 = {};
// 4606
o52.firstChild = o46;
// undefined
o52 = null;
// 4607
o46.getAttributeNode = f920654002_458;
// 4609
o52 = {};
// 4610
f920654002_458.returns.push(o52);
// 4611
o52.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0]";
// undefined
o52 = null;
// 4612
o52 = {};
// 4613
o46.firstChild = o52;
// undefined
o46 = null;
// 4614
o52.getAttributeNode = f920654002_458;
// 4616
o46 = {};
// 4617
f920654002_458.returns.push(o46);
// 4618
o46.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0]";
// undefined
o46 = null;
// 4619
o46 = {};
// 4620
o52.firstChild = o46;
// undefined
o52 = null;
// 4621
o46.getAttributeNode = f920654002_458;
// 4623
o52 = {};
// 4624
f920654002_458.returns.push(o52);
// 4625
o52.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o52 = null;
// 4626
o52 = {};
// 4627
o46.firstChild = o52;
// undefined
o52 = null;
// 4628
o52 = {};
// 4629
o46.nextSibling = o52;
// undefined
o46 = null;
// 4630
o52.getAttributeNode = f920654002_458;
// 4632
o46 = {};
// 4633
f920654002_458.returns.push(o46);
// 4634
o46.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o46 = null;
// 4635
o46 = {};
// 4636
o52.firstChild = o46;
// undefined
o46 = null;
// 4637
o46 = {};
// 4638
o52.nextSibling = o46;
// undefined
o52 = null;
// 4639
o46.getAttributeNode = f920654002_458;
// 4641
o52 = {};
// 4642
f920654002_458.returns.push(o52);
// 4643
o52.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o52 = null;
// 4644
o52 = {};
// 4645
o46.firstChild = o52;
// undefined
o52 = null;
// 4646
o52 = {};
// 4647
o46.nextSibling = o52;
// undefined
o46 = null;
// 4648
o52.getAttributeNode = f920654002_458;
// undefined
o52 = null;
// 4650
o46 = {};
// 4651
f920654002_458.returns.push(o46);
// 4652
o46.value = ".r[5wzpd].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o46 = null;
// 4655
f920654002_458.returns.push(o49);
// undefined
o49 = null;
// 4659
f920654002_646.returns.push(true);
// 4661
f920654002_418.returns.push(1373491952433);
// 4666
o46 = {};
// 4667
f920654002_462.returns.push(o46);
// 4668
o46.length = 12;
// 4669
o46["0"] = o34;
// undefined
o34 = null;
// 4670
o46["1"] = o41;
// undefined
o41 = null;
// 4671
o46["2"] = o44;
// undefined
o44 = null;
// 4672
o46["3"] = o45;
// undefined
o45 = null;
// 4673
o34 = {};
// 4674
o46["4"] = o34;
// undefined
o34 = null;
// 4675
o34 = {};
// 4676
o46["5"] = o34;
// undefined
o34 = null;
// 4677
o34 = {};
// 4678
o46["6"] = o34;
// undefined
o34 = null;
// 4679
o34 = {};
// 4680
o46["7"] = o34;
// undefined
o34 = null;
// 4681
o46["8"] = o37;
// undefined
o37 = null;
// 4682
o46["9"] = o38;
// undefined
o38 = null;
// 4683
o46["10"] = o39;
// undefined
o39 = null;
// 4684
o46["11"] = o40;
// undefined
o46 = null;
// undefined
o40 = null;
// 4685
f920654002_14.returns.push(undefined);
// 4686
f920654002_12.returns.push(1208);
// 4687
o35.nodeName = "DIV";
// undefined
o35 = null;
// 4689
o36.nodeName = "DIV";
// 4690
o34 = {};
// 4691
o36.parentNode = o34;
// undefined
o36 = null;
// 4692
o34.nodeName = "FORM";
// 4696
o35 = {};
// 4697
f920654002_425.returns.push(o35);
// 4699
f920654002_429.returns.push(o35);
// undefined
o35 = null;
// 4701
f920654002_418.returns.push(1373491952461);
// 4704
f920654002_418.returns.push(1373491952462);
// 4706
f920654002_418.returns.push(1373491952462);
// 4709
f920654002_418.returns.push(1373491952463);
// 4713
o35 = {};
// 4714
f920654002_425.returns.push(o35);
// 4716
f920654002_418.returns.push(1373491952463);
// 4719
o36 = {};
// 4720
f920654002_427.returns.push(o36);
// 4721
// 4722
// 4723
// 4724
// 4725
// 4726
o35.appendChild = f920654002_429;
// 4727
f920654002_429.returns.push(o36);
// 4729
f920654002_429.returns.push(o35);
// undefined
o35 = null;
// 4732
f920654002_418.returns.push(1373491952465);
// 4736
o35 = {};
// 4737
f920654002_425.returns.push(o35);
// 4739
f920654002_418.returns.push(1373491952466);
// 4742
o37 = {};
// 4743
f920654002_427.returns.push(o37);
// 4744
// 4745
// 4746
// 4747
// 4748
// 4749
o35.appendChild = f920654002_429;
// 4750
f920654002_429.returns.push(o37);
// 4752
f920654002_429.returns.push(o35);
// undefined
o35 = null;
// 4756
o35 = {};
// 4757
f920654002_425.returns.push(o35);
// 4759
f920654002_429.returns.push(o35);
// undefined
o35 = null;
// 4761
f920654002_418.returns.push(1373491952471);
// 4762
f920654002_15.returns.push(undefined);
// 4768
o5.protocol = "https:";
// undefined
fo920654002_1_cookie = function() { return fo920654002_1_cookie.returns[fo920654002_1_cookie.inst++]; };
fo920654002_1_cookie.returns = [];
fo920654002_1_cookie.inst = 0;
defineGetter(o0, "cookie", fo920654002_1_cookie, undefined);
// undefined
fo920654002_1_cookie.returns.push("p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 4771
f920654002_418.returns.push(1373491952591);
// 4772
o35 = {};
// 4773
f920654002_0.returns.push(o35);
// 4774
f920654002_1015 = function() { return f920654002_1015.returns[f920654002_1015.inst++]; };
f920654002_1015.returns = [];
f920654002_1015.inst = 0;
// 4775
o35.toGMTString = f920654002_1015;
// undefined
o35 = null;
// 4776
f920654002_1015.returns.push("Wed, 17 Jul 2013 21:32:32 GMT");
// 4777
o5.hostname = "jsbngssl.www.facebook.com";
// undefined
fo920654002_1_cookie.returns.push("p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 4780
f920654002_418.returns.push(1373491952592);
// 4782
f920654002_433.returns.push("4;1");
// 4794
f920654002_419.returns.push(undefined);
// 4795
o8.JSBNG__oninput = null;
// 4800
f920654002_419.returns.push(undefined);
// 4801
o8.JSBNG__onkeyup = null;
// 4808
f920654002_419.returns.push(undefined);
// 4809
f920654002_1016 = function() { return f920654002_1016.returns[f920654002_1016.inst++]; };
f920654002_1016.returns = [];
f920654002_1016.inst = 0;
// 4810
o8.JSBNG__onsubmit = f920654002_1016;
// 4813
// 4820
// 4826
f920654002_419.returns.push(undefined);
// 4827
o8.JSBNG__onkeydown = null;
// 4837
f920654002_419.returns.push(undefined);
// 4838
f920654002_1017 = function() { return f920654002_1017.returns[f920654002_1017.inst++]; };
f920654002_1017.returns = [];
f920654002_1017.inst = 0;
// 4839
o8.JSBNG__onclick = f920654002_1017;
// 4842
// 4846
o35 = {};
// 4847
f920654002_427.returns.push(o35);
// 4852
f920654002_419.returns.push(undefined);
// 4853
o8.JSBNG__onmousedown = null;
// 4858
o38 = {};
// 4859
f920654002_467.returns.push(o38);
// 4861
o39 = {};
// 4862
f920654002_467.returns.push(o39);
// 4863
o39.nodeName = "A";
// 4864
o39.rel = "toggle";
// 4866
o39.__FB_TOKEN = void 0;
// 4867
// 4868
o39.getAttribute = f920654002_464;
// 4869
o39.hasAttribute = f920654002_465;
// 4871
f920654002_465.returns.push(false);
// 4872
o39.JSBNG__addEventListener = f920654002_419;
// 4874
f920654002_419.returns.push(undefined);
// 4875
o39.JSBNG__onkeydown = null;
// 4877
o39.setAttribute = f920654002_587;
// 4878
f920654002_587.returns.push(undefined);
// 4879
o38.__FB_TOKEN = void 0;
// 4880
// 4890
o40 = {};
// 4891
f920654002_427.returns.push(o40);
// undefined
o40 = null;
// 4893
o40 = {};
// 4894
f920654002_427.returns.push(o40);
// undefined
o40 = null;
// 4897
o40 = {};
// 4898
f920654002_467.returns.push(o40);
// 4899
o40.getElementsByTagName = f920654002_453;
// 4901
o40.querySelectorAll = f920654002_462;
// 4902
o41 = {};
// 4903
f920654002_462.returns.push(o41);
// 4904
o41.length = 1;
// 4905
o44 = {};
// 4906
o41["0"] = o44;
// undefined
o41 = null;
// 4907
o44.getElementsByTagName = f920654002_453;
// 4909
o44.querySelectorAll = f920654002_462;
// 4910
o41 = {};
// 4911
f920654002_462.returns.push(o41);
// 4912
o41.length = 1;
// 4913
o45 = {};
// 4914
o41["0"] = o45;
// undefined
o41 = null;
// 4915
o45.getElementsByTagName = f920654002_453;
// 4917
o45.querySelectorAll = f920654002_462;
// undefined
o45 = null;
// 4918
o41 = {};
// 4919
f920654002_462.returns.push(o41);
// 4920
o41.length = 1;
// 4921
o45 = {};
// 4922
o41["0"] = o45;
// undefined
o41 = null;
// 4926
o41 = {};
// 4927
f920654002_462.returns.push(o41);
// 4928
o41.length = 1;
// 4929
o46 = {};
// 4930
o41["0"] = o46;
// undefined
o41 = null;
// 4931
o46.getElementsByTagName = f920654002_453;
// 4933
o46.querySelectorAll = f920654002_462;
// 4934
o41 = {};
// 4935
f920654002_462.returns.push(o41);
// 4936
o41.length = 1;
// 4937
o49 = {};
// 4938
o41["0"] = o49;
// undefined
o41 = null;
// 4939
f920654002_12.returns.push(1209);
// 4940
o44.nodeName = "DIV";
// 4941
o44.__FB_TOKEN = void 0;
// 4942
// 4943
o44.getAttribute = f920654002_464;
// 4944
o44.hasAttribute = f920654002_465;
// 4946
f920654002_465.returns.push(false);
// 4947
o44.JSBNG__addEventListener = f920654002_419;
// 4949
f920654002_419.returns.push(undefined);
// 4950
o44.JSBNG__onJSBNG__scroll = void 0;
// 4952
o40.nodeName = "DIV";
// 4953
o40.__FB_TOKEN = void 0;
// 4954
// 4955
o40.getAttribute = f920654002_464;
// 4956
o40.hasAttribute = f920654002_465;
// 4958
f920654002_465.returns.push(false);
// 4959
o40.JSBNG__addEventListener = f920654002_419;
// 4961
f920654002_419.returns.push(undefined);
// 4962
o40.JSBNG__onmousemove = null;
// 4964
o46.nodeName = "DIV";
// 4965
o46.__FB_TOKEN = void 0;
// 4966
// 4967
o46.getAttribute = f920654002_464;
// 4968
o46.hasAttribute = f920654002_465;
// 4970
f920654002_465.returns.push(false);
// 4971
o46.JSBNG__addEventListener = f920654002_419;
// 4973
f920654002_419.returns.push(undefined);
// 4974
o46.JSBNG__onclick = null;
// 4976
o41 = {};
// 4977
o35.style = o41;
// 4979
// 4981
// undefined
o41 = null;
// 4983
o35.__html = void 0;
// 4985
o41 = {};
// 4986
f920654002_425.returns.push(o41);
// 4988
o8.appendChild = f920654002_429;
// 4989
f920654002_429.returns.push(o41);
// undefined
o41 = null;
// 4990
o41 = {};
// 4991
f920654002_4.returns.push(o41);
// 4992
o41.pointerEvents = "";
// undefined
o41 = null;
// 4993
o35.parentNode = null;
// undefined
o35 = null;
// 4997
f920654002_419.returns.push(undefined);
// 4998
o40.JSBNG__onmouseover = null;
// 5003
f920654002_419.returns.push(undefined);
// 5004
o40.JSBNG__onmouseout = null;
// 5009
f920654002_419.returns.push(undefined);
// 5010
o40.JSBNG__onfocusin = void 0;
// 5015
f920654002_419.returns.push(undefined);
// 5016
o40.JSBNG__onfocusout = void 0;
// 5021
f920654002_419.returns.push(undefined);
// 5022
o40.JSBNG__onmousedown = null;
// 5024
o49.nodeName = "DIV";
// 5025
o49.__FB_TOKEN = void 0;
// 5026
// 5027
o49.getAttribute = f920654002_464;
// 5028
o49.hasAttribute = f920654002_465;
// 5030
f920654002_465.returns.push(false);
// 5031
o49.JSBNG__addEventListener = f920654002_419;
// 5033
f920654002_419.returns.push(undefined);
// 5034
o49.JSBNG__onmousedown = null;
// 5036
o35 = {};
// 5037
o40.classList = o35;
// 5039
f920654002_1038 = function() { return f920654002_1038.returns[f920654002_1038.inst++]; };
f920654002_1038.returns = [];
f920654002_1038.inst = 0;
// 5040
o35.add = f920654002_1038;
// 5041
f920654002_1038.returns.push(undefined);
// 5044
o41 = {};
// 5045
f920654002_467.returns.push(o41);
// 5046
o41.getElementsByTagName = f920654002_453;
// 5048
o41.querySelectorAll = f920654002_462;
// 5049
o52 = {};
// 5050
f920654002_462.returns.push(o52);
// 5051
o52.length = 1;
// 5052
o53 = {};
// 5053
o52["0"] = o53;
// undefined
o52 = null;
// 5054
o53.getElementsByTagName = f920654002_453;
// 5056
o53.querySelectorAll = f920654002_462;
// 5057
o52 = {};
// 5058
f920654002_462.returns.push(o52);
// 5059
o52.length = 1;
// 5060
o54 = {};
// 5061
o52["0"] = o54;
// undefined
o52 = null;
// 5062
o54.getElementsByTagName = f920654002_453;
// 5064
o54.querySelectorAll = f920654002_462;
// undefined
o54 = null;
// 5065
o52 = {};
// 5066
f920654002_462.returns.push(o52);
// 5067
o52.length = 1;
// 5068
o54 = {};
// 5069
o52["0"] = o54;
// undefined
o52 = null;
// 5073
o52 = {};
// 5074
f920654002_462.returns.push(o52);
// 5075
o52.length = 1;
// 5076
o55 = {};
// 5077
o52["0"] = o55;
// undefined
o52 = null;
// 5078
o55.getElementsByTagName = f920654002_453;
// 5080
o55.querySelectorAll = f920654002_462;
// 5081
o52 = {};
// 5082
f920654002_462.returns.push(o52);
// 5083
o52.length = 1;
// 5084
o56 = {};
// 5085
o52["0"] = o56;
// undefined
o52 = null;
// 5086
f920654002_12.returns.push(1210);
// 5087
o53.nodeName = "DIV";
// 5088
o53.__FB_TOKEN = void 0;
// 5089
// 5090
o53.getAttribute = f920654002_464;
// 5091
o53.hasAttribute = f920654002_465;
// 5093
f920654002_465.returns.push(false);
// 5094
o53.JSBNG__addEventListener = f920654002_419;
// 5096
f920654002_419.returns.push(undefined);
// 5097
o53.JSBNG__onJSBNG__scroll = void 0;
// 5099
o41.nodeName = "DIV";
// 5100
o41.__FB_TOKEN = void 0;
// 5101
// 5102
o41.getAttribute = f920654002_464;
// 5103
o41.hasAttribute = f920654002_465;
// 5105
f920654002_465.returns.push(false);
// 5106
o41.JSBNG__addEventListener = f920654002_419;
// 5108
f920654002_419.returns.push(undefined);
// 5109
o41.JSBNG__onmousemove = null;
// 5111
o55.nodeName = "DIV";
// 5112
o55.__FB_TOKEN = void 0;
// 5113
// 5114
o55.getAttribute = f920654002_464;
// 5115
o55.hasAttribute = f920654002_465;
// 5117
f920654002_465.returns.push(false);
// 5118
o55.JSBNG__addEventListener = f920654002_419;
// 5120
f920654002_419.returns.push(undefined);
// 5121
o55.JSBNG__onclick = null;
// 5126
f920654002_419.returns.push(undefined);
// 5127
o41.JSBNG__onmouseover = null;
// 5132
f920654002_419.returns.push(undefined);
// 5133
o41.JSBNG__onmouseout = null;
// 5138
f920654002_419.returns.push(undefined);
// 5139
o41.JSBNG__onfocusin = void 0;
// 5144
f920654002_419.returns.push(undefined);
// 5145
o41.JSBNG__onfocusout = void 0;
// 5150
f920654002_419.returns.push(undefined);
// 5151
o41.JSBNG__onmousedown = null;
// 5153
o56.nodeName = "DIV";
// 5154
o56.__FB_TOKEN = void 0;
// 5155
// 5156
o56.getAttribute = f920654002_464;
// 5157
o56.hasAttribute = f920654002_465;
// 5159
f920654002_465.returns.push(false);
// 5160
o56.JSBNG__addEventListener = f920654002_419;
// 5162
f920654002_419.returns.push(undefined);
// 5163
o56.JSBNG__onmousedown = null;
// 5165
o52 = {};
// 5166
o41.classList = o52;
// 5168
o52.add = f920654002_1038;
// 5169
f920654002_1038.returns.push(undefined);
// 5172
o57 = {};
// 5173
f920654002_467.returns.push(o57);
// 5175
o58 = {};
// 5176
f920654002_467.returns.push(o58);
// 5177
o58.nodeName = "A";
// 5178
o58.rel = "toggle";
// 5180
o58.__FB_TOKEN = void 0;
// 5181
// 5182
o58.getAttribute = f920654002_464;
// 5183
o58.hasAttribute = f920654002_465;
// 5185
f920654002_465.returns.push(false);
// 5186
o58.JSBNG__addEventListener = f920654002_419;
// 5188
f920654002_419.returns.push(undefined);
// 5189
o58.JSBNG__onkeydown = null;
// 5191
o58.setAttribute = f920654002_587;
// 5192
f920654002_587.returns.push(undefined);
// 5193
o57.__FB_TOKEN = void 0;
// 5194
// undefined
o57 = null;
// 5197
o57 = {};
// 5198
f920654002_467.returns.push(o57);
// 5200
o59 = {};
// 5201
f920654002_467.returns.push(o59);
// 5202
o59.nodeName = "A";
// 5203
o59.rel = "toggle";
// 5205
o59.__FB_TOKEN = void 0;
// 5206
// 5207
o59.getAttribute = f920654002_464;
// 5208
o59.hasAttribute = f920654002_465;
// 5210
f920654002_465.returns.push(false);
// 5211
o59.JSBNG__addEventListener = f920654002_419;
// 5213
f920654002_419.returns.push(undefined);
// 5214
o59.JSBNG__onkeydown = null;
// 5216
o59.setAttribute = f920654002_587;
// 5217
f920654002_587.returns.push(undefined);
// 5218
o57.__FB_TOKEN = void 0;
// 5219
// undefined
o57 = null;
// 5222
o57 = {};
// 5223
f920654002_467.returns.push(o57);
// 5225
o60 = {};
// 5226
f920654002_467.returns.push(o60);
// 5227
o60.nodeName = "A";
// 5228
o60.rel = "toggle";
// 5230
o60.__FB_TOKEN = void 0;
// 5231
// 5232
o60.getAttribute = f920654002_464;
// 5233
o60.hasAttribute = f920654002_465;
// 5235
f920654002_465.returns.push(false);
// 5236
o60.JSBNG__addEventListener = f920654002_419;
// 5238
f920654002_419.returns.push(undefined);
// 5239
o60.JSBNG__onkeydown = null;
// 5241
o60.setAttribute = f920654002_587;
// 5242
f920654002_587.returns.push(undefined);
// 5243
o57.__FB_TOKEN = void 0;
// 5244
// undefined
o57 = null;
// 5247
o57 = {};
// 5248
f920654002_467.returns.push(o57);
// 5250
o61 = {};
// 5251
f920654002_467.returns.push(o61);
// 5252
o61.nodeName = "A";
// 5253
o61.rel = "toggle";
// 5255
o61.__FB_TOKEN = void 0;
// 5256
// 5257
o61.getAttribute = f920654002_464;
// 5258
o61.hasAttribute = f920654002_465;
// 5260
f920654002_465.returns.push(false);
// 5261
o61.JSBNG__addEventListener = f920654002_419;
// 5263
f920654002_419.returns.push(undefined);
// 5264
o61.JSBNG__onkeydown = null;
// 5266
o61.setAttribute = f920654002_587;
// 5267
f920654002_587.returns.push(undefined);
// 5268
o57.__FB_TOKEN = void 0;
// 5269
// undefined
o57 = null;
// 5272
o57 = {};
// 5273
f920654002_427.returns.push(o57);
// 5274
// 5275
// 5276
o57.getElementsByTagName = f920654002_453;
// 5277
o62 = {};
// 5278
f920654002_453.returns.push(o62);
// 5279
o62.length = 0;
// undefined
o62 = null;
// 5281
o62 = {};
// 5282
o57.childNodes = o62;
// undefined
o57 = null;
// 5283
o62.item = f920654002_456;
// 5284
o62.length = 1;
// 5285
o57 = {};
// 5286
o62["0"] = o57;
// undefined
o62 = null;
// 5287
o57.getElementsByTagName = f920654002_453;
// 5289
o57.querySelectorAll = f920654002_462;
// 5290
o62 = {};
// 5291
f920654002_462.returns.push(o62);
// 5292
o62.length = 0;
// undefined
o62 = null;
// 5293
o57.__html = void 0;
// 5294
o57.mountComponentIntoNode = void 0;
// 5295
o62 = {};
// 5296
o57.classList = o62;
// undefined
o57 = null;
// 5298
o62.add = f920654002_1038;
// undefined
o62 = null;
// 5299
f920654002_1038.returns.push(undefined);
// 5301
o57 = {};
// 5302
f920654002_427.returns.push(o57);
// 5303
// 5304
o57.firstChild = null;
// 5307
o62 = {};
// 5308
f920654002_425.returns.push(o62);
// 5310
o57.appendChild = f920654002_429;
// 5311
f920654002_429.returns.push(o62);
// undefined
o62 = null;
// 5313
o62 = {};
// 5314
f920654002_427.returns.push(o62);
// 5315
// 5316
o62.firstChild = null;
// 5317
o57.__html = void 0;
// 5319
o63 = {};
// 5320
f920654002_425.returns.push(o63);
// 5322
o62.appendChild = f920654002_429;
// 5323
f920654002_429.returns.push(o63);
// undefined
o63 = null;
// 5324
o63 = {};
// 5325
o62.classList = o63;
// 5327
o63.add = f920654002_1038;
// undefined
o63 = null;
// 5328
f920654002_1038.returns.push(undefined);
// 5329
o63 = {};
// 5330
o57.style = o63;
// undefined
o57 = null;
// 5331
// undefined
o63 = null;
// 5335
f920654002_1038.returns.push(undefined);
// 5336
o62.__FB_TOKEN = void 0;
// 5337
// 5338
o62.nodeName = "DIV";
// 5339
o62.getAttribute = f920654002_464;
// 5340
o62.hasAttribute = f920654002_465;
// 5342
f920654002_465.returns.push(false);
// 5343
o62.JSBNG__addEventListener = f920654002_419;
// 5345
f920654002_419.returns.push(undefined);
// 5346
o62.JSBNG__onclick = null;
// 5351
f920654002_419.returns.push(undefined);
// 5352
o62.JSBNG__onsubmit = null;
// 5357
f920654002_419.returns.push(undefined);
// 5358
o62.JSBNG__onsuccess = void 0;
// 5363
f920654002_419.returns.push(undefined);
// 5364
o62.JSBNG__onerror = null;
// undefined
o62 = null;
// 5366
f920654002_12.returns.push(1211);
// 5369
o57 = {};
// 5370
f920654002_427.returns.push(o57);
// 5371
// 5372
// 5373
o57.getElementsByTagName = f920654002_453;
// 5374
o62 = {};
// 5375
f920654002_453.returns.push(o62);
// 5376
o62.length = 0;
// undefined
o62 = null;
// 5378
o62 = {};
// 5379
o57.childNodes = o62;
// undefined
o57 = null;
// 5380
o62.item = f920654002_456;
// 5381
o62.length = 1;
// 5382
o57 = {};
// 5383
o62["0"] = o57;
// undefined
o62 = null;
// 5384
o57.getElementsByTagName = f920654002_453;
// 5386
o57.querySelectorAll = f920654002_462;
// 5387
o62 = {};
// 5388
f920654002_462.returns.push(o62);
// 5389
o62.length = 0;
// undefined
o62 = null;
// 5390
o57.__html = void 0;
// 5391
o57.mountComponentIntoNode = void 0;
// 5392
o62 = {};
// 5393
o57.classList = o62;
// undefined
o57 = null;
// 5395
o62.add = f920654002_1038;
// undefined
o62 = null;
// 5396
f920654002_1038.returns.push(undefined);
// 5398
o57 = {};
// 5399
f920654002_427.returns.push(o57);
// 5400
// 5401
o57.firstChild = null;
// 5404
o62 = {};
// 5405
f920654002_425.returns.push(o62);
// 5407
o57.appendChild = f920654002_429;
// 5408
f920654002_429.returns.push(o62);
// undefined
o62 = null;
// 5410
o62 = {};
// 5411
f920654002_427.returns.push(o62);
// 5412
// 5413
o62.firstChild = null;
// 5414
o57.__html = void 0;
// 5416
o63 = {};
// 5417
f920654002_425.returns.push(o63);
// 5419
o62.appendChild = f920654002_429;
// 5420
f920654002_429.returns.push(o63);
// undefined
o63 = null;
// 5421
o63 = {};
// 5422
o62.classList = o63;
// 5424
o63.add = f920654002_1038;
// undefined
o63 = null;
// 5425
f920654002_1038.returns.push(undefined);
// 5426
o63 = {};
// 5427
o57.style = o63;
// undefined
o57 = null;
// 5428
// undefined
o63 = null;
// 5432
f920654002_1038.returns.push(undefined);
// 5433
o62.__FB_TOKEN = void 0;
// 5434
// undefined
o62 = null;
// 5437
o57 = {};
// 5438
f920654002_427.returns.push(o57);
// 5439
// 5440
// 5441
o57.getElementsByTagName = f920654002_453;
// 5442
o62 = {};
// 5443
f920654002_453.returns.push(o62);
// 5444
o62.length = 0;
// undefined
o62 = null;
// 5446
o62 = {};
// 5447
o57.childNodes = o62;
// undefined
o57 = null;
// 5448
o62.item = f920654002_456;
// 5449
o62.length = 1;
// 5450
o57 = {};
// 5451
o62["0"] = o57;
// undefined
o62 = null;
// 5452
o57.getElementsByTagName = f920654002_453;
// 5454
o57.querySelectorAll = f920654002_462;
// 5455
o62 = {};
// 5456
f920654002_462.returns.push(o62);
// 5457
o62.length = 1;
// 5458
o63 = {};
// 5459
o62["0"] = o63;
// undefined
o62 = null;
// undefined
o63 = null;
// 5460
o57.__html = void 0;
// 5461
o57.mountComponentIntoNode = void 0;
// 5462
o62 = {};
// 5463
o57.classList = o62;
// undefined
o57 = null;
// 5465
o62.add = f920654002_1038;
// undefined
o62 = null;
// 5466
f920654002_1038.returns.push(undefined);
// 5468
o57 = {};
// 5469
f920654002_427.returns.push(o57);
// 5470
// 5471
o57.firstChild = null;
// 5474
o62 = {};
// 5475
f920654002_425.returns.push(o62);
// 5477
o57.appendChild = f920654002_429;
// 5478
f920654002_429.returns.push(o62);
// undefined
o62 = null;
// 5480
o62 = {};
// 5481
f920654002_427.returns.push(o62);
// 5482
// 5483
o62.firstChild = null;
// 5484
o57.__html = void 0;
// 5486
o63 = {};
// 5487
f920654002_425.returns.push(o63);
// 5489
o62.appendChild = f920654002_429;
// 5490
f920654002_429.returns.push(o63);
// undefined
o63 = null;
// 5491
o63 = {};
// 5492
o62.classList = o63;
// 5494
o63.add = f920654002_1038;
// undefined
o63 = null;
// 5495
f920654002_1038.returns.push(undefined);
// 5496
o63 = {};
// 5497
o57.style = o63;
// undefined
o57 = null;
// 5498
// undefined
o63 = null;
// 5502
f920654002_1038.returns.push(undefined);
// 5503
o62.__FB_TOKEN = void 0;
// 5504
// undefined
o62 = null;
// 5507
o57 = {};
// 5508
f920654002_427.returns.push(o57);
// 5509
// 5510
// 5511
o57.getElementsByTagName = f920654002_453;
// 5512
o62 = {};
// 5513
f920654002_453.returns.push(o62);
// 5514
o62.length = 0;
// undefined
o62 = null;
// 5516
o62 = {};
// 5517
o57.childNodes = o62;
// undefined
o57 = null;
// 5518
o62.item = f920654002_456;
// 5519
o62.length = 1;
// 5520
o57 = {};
// 5521
o62["0"] = o57;
// undefined
o62 = null;
// 5522
o57.getElementsByTagName = f920654002_453;
// 5524
o57.querySelectorAll = f920654002_462;
// 5525
o62 = {};
// 5526
f920654002_462.returns.push(o62);
// 5527
o62.length = 1;
// 5528
o63 = {};
// 5529
o62["0"] = o63;
// undefined
o62 = null;
// undefined
o63 = null;
// 5530
o57.__html = void 0;
// 5531
o57.mountComponentIntoNode = void 0;
// 5532
o62 = {};
// 5533
o57.classList = o62;
// undefined
o57 = null;
// 5535
o62.add = f920654002_1038;
// undefined
o62 = null;
// 5536
f920654002_1038.returns.push(undefined);
// 5538
o57 = {};
// 5539
f920654002_427.returns.push(o57);
// 5540
// 5541
o57.firstChild = null;
// 5544
o62 = {};
// 5545
f920654002_425.returns.push(o62);
// 5547
o57.appendChild = f920654002_429;
// 5548
f920654002_429.returns.push(o62);
// undefined
o62 = null;
// 5550
o62 = {};
// 5551
f920654002_427.returns.push(o62);
// 5552
// 5553
o62.firstChild = null;
// 5554
o57.__html = void 0;
// 5556
o63 = {};
// 5557
f920654002_425.returns.push(o63);
// 5559
o62.appendChild = f920654002_429;
// 5560
f920654002_429.returns.push(o63);
// undefined
o63 = null;
// 5561
o63 = {};
// 5562
o62.classList = o63;
// 5564
o63.add = f920654002_1038;
// undefined
o63 = null;
// 5565
f920654002_1038.returns.push(undefined);
// 5566
o63 = {};
// 5567
o57.style = o63;
// undefined
o57 = null;
// 5568
// undefined
o63 = null;
// 5572
f920654002_1038.returns.push(undefined);
// 5573
o62.__FB_TOKEN = void 0;
// 5574
// undefined
o62 = null;
// 5578
o26.querySelectorAll = f920654002_462;
// 5579
o57 = {};
// 5580
f920654002_462.returns.push(o57);
// 5581
o57.length = 0;
// undefined
o57 = null;
// 5582
o26.__html = void 0;
// 5583
o26.mountComponentIntoNode = void 0;
// 5584
o57 = {};
// 5585
o26.classList = o57;
// undefined
o26 = null;
// 5587
o57.add = f920654002_1038;
// undefined
o57 = null;
// 5588
f920654002_1038.returns.push(undefined);
// 5590
o26 = {};
// 5591
f920654002_427.returns.push(o26);
// 5592
// 5593
o26.firstChild = null;
// 5596
o57 = {};
// 5597
f920654002_425.returns.push(o57);
// 5599
o26.appendChild = f920654002_429;
// 5600
f920654002_429.returns.push(o57);
// undefined
o57 = null;
// 5602
o57 = {};
// 5603
f920654002_427.returns.push(o57);
// 5604
// 5605
o57.firstChild = null;
// 5606
o26.__html = void 0;
// 5608
o62 = {};
// 5609
f920654002_425.returns.push(o62);
// 5611
o57.appendChild = f920654002_429;
// 5612
f920654002_429.returns.push(o62);
// undefined
o62 = null;
// 5613
o62 = {};
// 5614
o57.classList = o62;
// 5616
o62.add = f920654002_1038;
// undefined
o62 = null;
// 5617
f920654002_1038.returns.push(undefined);
// 5618
o62 = {};
// 5619
o26.style = o62;
// undefined
o26 = null;
// 5620
// undefined
o62 = null;
// 5624
f920654002_1038.returns.push(undefined);
// 5625
o57.__FB_TOKEN = void 0;
// 5626
// undefined
o57 = null;
// 5632
f920654002_419.returns.push(undefined);
// 5633
f920654002_1117 = function() { return f920654002_1117.returns[f920654002_1117.inst++]; };
f920654002_1117.returns = [];
f920654002_1117.inst = 0;
// 5634
o8.JSBNG__onmouseover = f920654002_1117;
// 5637
// 5649
f920654002_419.returns.push(undefined);
// 5650
o58.JSBNG__onmouseover = null;
// undefined
o58 = null;
// 5658
f920654002_419.returns.push(undefined);
// 5659
o59.JSBNG__onmouseover = null;
// undefined
o59 = null;
// 5667
f920654002_419.returns.push(undefined);
// 5668
o60.JSBNG__onmouseover = null;
// undefined
o60 = null;
// 5676
f920654002_419.returns.push(undefined);
// 5677
o61.JSBNG__onmouseover = null;
// undefined
o61 = null;
// 5681
o26 = {};
// 5682
o57 = {};
// 5684
o26.length = 1;
// 5685
o26["0"] = "AsDOA";
// 5703
o58 = {};
// 5705
// 5706
// 5709
f920654002_418.returns.push(1373491954996);
// 5712
f920654002_418.returns.push(1373491954996);
// 5714
o59 = {};
// 5715
f920654002_467.returns.push(o59);
// 5717
o60 = {};
// 5718
f920654002_467.returns.push(o60);
// 5719
o61 = {};
// 5720
o60.firstChild = o61;
// 5722
o61.nodeType = 8;
// 5724
o61.nodeValue = " <div class=\"fbChatSidebar fixed_always hidden_elem\" id=\"u_0_21\"><div class=\"fbChatSidebarBody\"><div class=\"uiScrollableArea scrollableOrderedList fade\" style=\"width:205px;\" id=\"u_0_22\"><div class=\"uiScrollableAreaWrap scrollable\" aria-label=\"Scrollable region\" tabindex=\"0\"><div class=\"uiScrollableAreaBody\" style=\"width:205px;\"><div class=\"uiScrollableAreaContent\"><div id=\"u_0_28\"><ul class=\"fbChatOrderedList clearfix\"><li><div class=\"phs fcg\"><span data-jsid=\"message\">Loading...</span></div></li></ul></div></div></div></div><div class=\"uiScrollableAreaTrack invisible_elem\"><div class=\"uiScrollableAreaGripper\"></div></div></div><div class=\"fbChatTypeaheadView hidden_elem\" id=\"u_0_20\"></div></div><div class=\"fbChatSidebarMessage clearfix\"><img class=\"img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><div class=\"message fcg\"></div></div><table class=\"uiGrid -cx-PRIVATE-fbChatSidebarFooter__root\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td><div class=\"uiTypeahead uiClearableTypeahead fbChatTypeahead\" id=\"u_0_23\"><div class=\"wrap\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e60c09c9ab7e6496279a78ecf506afa21e56dec95(event) {\\u000a\\u000a};\"), (\"sf29a5cbb51863307ff917759ad248929e02f8543\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e60c09c9ab7e6496279a78ecf506afa21e56dec95(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sf29a5cbb51863307ff917759ad248929e02f8543_0\"), (sf29a5cbb51863307ff917759ad248929e02f8543_0_instance), (this), (arguments)))\n        };\n        (null);\n    ;\n    };\n    var sf29a5cbb51863307ff917759ad248929e02f8543_0_instance;\n    ((sf29a5cbb51863307ff917759ad248929e02f8543_0_instance) = ((JSBNG_Record.eventInstance)((\"sf29a5cbb51863307ff917759ad248929e02f8543_0\"))));\n    ((JSBNG_Record.markFunction)((e60c09c9ab7e6496279a78ecf506afa21e56dec95)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><button class=\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-xuiCloseButton__root clear uiTypeaheadCloseButton -cx-PRIVATE-xuiCloseButton__medium -cx-PRIVATE-xuiCloseButton__dark\" title=\"Remove\" onclick=\"return e60c09c9ab7e6496279a78ecf506afa21e56dec95.call(this, event);\" type=\"button\" id=\"u_0_24\">Remove</button><input type=\"hidden\" autocomplete=\"off\" class=\"hiddenInput\" /><div class=\"innerWrap\"><input type=\"text\" class=\"inputtext inputsearch textInput DOMControl_placeholder\" autocomplete=\"off\" placeholder=\"Search\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-owns=\"typeahead_list_u_0_23\" role=\"combobox\" spellcheck=\"false\" value=\"Search\" aria-label=\"Search\" id=\"u_0_25\" /></div><img class=\"throbber uiLoadingIndicatorAsync img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div></div></td><td><div><div class=\"uiSelector inlineBlock fbChatSidebarDropdown button uiSelectorBottomUp uiSelectorRight\" id=\"u_0_26\" data-multiple=\"1\"><div class=\"uiToggle wrap\"><a data-hover=\"tooltip\" aria-label=\"Options\" class=\"uiSelectorButton uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"1\" rel=\"toggle\"></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption checked\" data-label=\"Chat Sounds\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Chat Sounds</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption\" data-label=\"Advanced Settings...\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/settings_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Advanced Settings...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOnlineItem\" data-label=\"Turn On Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn On Chat</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOfflineItem\" data-label=\"Turn Off Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn Off Chat</span></a></li></ul></div></div></div><select multiple=\"1\"><option value=\"\" disabled=\"1\"></option><option value=\"sound\" selected=\"1\">Chat Sounds</option><option value=\"advanced_settings\">Advanced Settings...</option><option value=\"online\">Turn On Chat</option><option value=\"offline\">Turn Off Chat</option></select></div></div></td><td><div></div></td><td><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e6776ed841051448820650f687dfb9bef57315240(event) {\\u000a    Chat.toggleSidebar();\\u000a};\"), (\"sf8d2e69ee531f03b97d24b337f62a4efb6df10be\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e6776ed841051448820650f687dfb9bef57315240(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sf8d2e69ee531f03b97d24b337f62a4efb6df10be_0\"), (sf8d2e69ee531f03b97d24b337f62a4efb6df10be_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(Chat, (\"toggleSidebar\")))[(\"toggleSidebar\")])();\n    };\n    var sf8d2e69ee531f03b97d24b337f62a4efb6df10be_0_instance;\n    ((sf8d2e69ee531f03b97d24b337f62a4efb6df10be_0_instance) = ((JSBNG_Record.eventInstance)((\"sf8d2e69ee531f03b97d24b337f62a4efb6df10be_0\"))));\n    ((JSBNG_Record.markFunction)((e6776ed841051448820650f687dfb9bef57315240)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a data-hover=\"tooltip\" aria-label=\"Hide sidebar\" data-tooltip-alignh=\"right\" class=\"toggle button\" href=\"#\" onclick=\"return e6776ed841051448820650f687dfb9bef57315240.call(this, event);\" role=\"button\"></a></td></tr></tbody></table></div> ";
// undefined
o61 = null;
// 5725
o60.parentNode = o16;
// 5727
f920654002_471.returns.push(o60);
// undefined
o60 = null;
// 5728
// 5729
o59.getAttribute = f920654002_464;
// 5730
f920654002_464.returns.push("pagelet_sidebar");
// 5759
o60 = {};
// 5760
f920654002_427.returns.push(o60);
// 5761
// 5762
// 5763
o60.getElementsByTagName = f920654002_453;
// 5764
o61 = {};
// 5765
f920654002_453.returns.push(o61);
// 5766
o61.length = 0;
// undefined
o61 = null;
// 5768
o61 = {};
// 5769
o60.childNodes = o61;
// undefined
o60 = null;
// 5770
o61.item = f920654002_456;
// 5771
o61.length = 1;
// 5772
o60 = {};
// 5773
o61["0"] = o60;
// undefined
o61 = null;
// 5774
o60.getAttributeNode = f920654002_458;
// undefined
o60 = null;
// 5776
o60 = {};
// 5777
f920654002_458.returns.push(o60);
// 5778
o60.value = "u_0_2a";
// undefined
o60 = null;
// 5781
o60 = {};
// 5782
f920654002_427.returns.push(o60);
// 5783
// 5784
// 5785
o60.getElementsByTagName = f920654002_453;
// 5786
o61 = {};
// 5787
f920654002_453.returns.push(o61);
// 5788
o61.length = 0;
// undefined
o61 = null;
// 5790
o61 = {};
// 5791
o60.childNodes = o61;
// undefined
o60 = null;
// 5792
o61.item = f920654002_456;
// 5793
o61.length = 1;
// 5794
o60 = {};
// 5795
o61["0"] = o60;
// undefined
o61 = null;
// 5796
o60.getAttributeNode = f920654002_458;
// undefined
o60 = null;
// 5798
o60 = {};
// 5799
f920654002_458.returns.push(o60);
// 5800
o60.value = "u_0_2b";
// undefined
o60 = null;
// 5803
o60 = {};
// 5804
f920654002_427.returns.push(o60);
// 5805
// 5806
// 5807
o60.getElementsByTagName = f920654002_453;
// 5808
o61 = {};
// 5809
f920654002_453.returns.push(o61);
// 5810
o61.length = 0;
// undefined
o61 = null;
// 5812
o61 = {};
// 5813
o60.childNodes = o61;
// undefined
o60 = null;
// 5814
o61.item = f920654002_456;
// 5815
o61.length = 1;
// 5816
o60 = {};
// 5817
o61["0"] = o60;
// undefined
o61 = null;
// 5818
o60.getAttributeNode = f920654002_458;
// undefined
o60 = null;
// 5820
o60 = {};
// 5821
f920654002_458.returns.push(o60);
// 5822
o60.value = "u_0_2c";
// undefined
o60 = null;
// 5841
o60 = {};
// 5842
f920654002_467.returns.push(o60);
// 5843
o60.getElementsByTagName = f920654002_453;
// 5845
o60.querySelectorAll = f920654002_462;
// 5846
o61 = {};
// 5847
f920654002_462.returns.push(o61);
// 5848
o61.length = 1;
// 5849
o62 = {};
// 5850
o61["0"] = o62;
// undefined
o61 = null;
// 5851
o62.getElementsByTagName = f920654002_453;
// 5853
o62.querySelectorAll = f920654002_462;
// 5854
o61 = {};
// 5855
f920654002_462.returns.push(o61);
// 5856
o61.length = 1;
// 5857
o63 = {};
// 5858
o61["0"] = o63;
// undefined
o61 = null;
// 5859
o63.getElementsByTagName = f920654002_453;
// 5861
o63.querySelectorAll = f920654002_462;
// 5862
o61 = {};
// 5863
f920654002_462.returns.push(o61);
// 5864
o61.length = 1;
// 5865
o64 = {};
// 5866
o61["0"] = o64;
// undefined
o61 = null;
// 5870
o61 = {};
// 5871
f920654002_462.returns.push(o61);
// 5872
o61.length = 1;
// 5873
o65 = {};
// 5874
o61["0"] = o65;
// undefined
o61 = null;
// 5875
o65.getElementsByTagName = f920654002_453;
// 5877
o65.querySelectorAll = f920654002_462;
// 5878
o61 = {};
// 5879
f920654002_462.returns.push(o61);
// 5880
o61.length = 1;
// 5881
o66 = {};
// 5882
o61["0"] = o66;
// undefined
o61 = null;
// 5883
f920654002_12.returns.push(1212);
// 5884
o62.nodeName = "DIV";
// 5885
o62.__FB_TOKEN = void 0;
// 5886
// 5887
o62.getAttribute = f920654002_464;
// 5888
o62.hasAttribute = f920654002_465;
// 5890
f920654002_465.returns.push(false);
// 5891
o62.JSBNG__addEventListener = f920654002_419;
// 5893
f920654002_419.returns.push(undefined);
// 5894
o62.JSBNG__onJSBNG__scroll = void 0;
// 5896
o60.nodeName = "DIV";
// 5897
o60.__FB_TOKEN = void 0;
// 5898
// 5899
o60.getAttribute = f920654002_464;
// 5900
o60.hasAttribute = f920654002_465;
// 5902
f920654002_465.returns.push(false);
// 5903
o60.JSBNG__addEventListener = f920654002_419;
// 5905
f920654002_419.returns.push(undefined);
// 5906
o60.JSBNG__onmousemove = null;
// 5908
o65.nodeName = "DIV";
// 5909
o65.__FB_TOKEN = void 0;
// 5910
// 5911
o65.getAttribute = f920654002_464;
// 5912
o65.hasAttribute = f920654002_465;
// 5914
f920654002_465.returns.push(false);
// 5915
o65.JSBNG__addEventListener = f920654002_419;
// 5917
f920654002_419.returns.push(undefined);
// 5918
o65.JSBNG__onclick = null;
// 5923
f920654002_419.returns.push(undefined);
// 5924
o60.JSBNG__onmouseover = null;
// 5929
f920654002_419.returns.push(undefined);
// 5930
o60.JSBNG__onmouseout = null;
// 5935
f920654002_419.returns.push(undefined);
// 5936
o60.JSBNG__onfocusin = void 0;
// 5941
f920654002_419.returns.push(undefined);
// 5942
o60.JSBNG__onfocusout = void 0;
// 5947
f920654002_419.returns.push(undefined);
// 5948
o60.JSBNG__onmousedown = null;
// 5950
o66.nodeName = "DIV";
// 5951
o66.__FB_TOKEN = void 0;
// 5952
// 5953
o66.getAttribute = f920654002_464;
// 5954
o66.hasAttribute = f920654002_465;
// 5956
f920654002_465.returns.push(false);
// 5957
o66.JSBNG__addEventListener = f920654002_419;
// 5959
f920654002_419.returns.push(undefined);
// 5960
o66.JSBNG__onmousedown = null;
// 5962
o61 = {};
// 5963
o60.classList = o61;
// 5965
o61.add = f920654002_1038;
// 5966
f920654002_1038.returns.push(undefined);
// 5976
f920654002_418.returns.push(1373491955042);
// 5977
o67 = {};
// 5979
// 5980
// 5983
f920654002_418.returns.push(1373491955043);
// 5986
f920654002_418.returns.push(1373491955044);
// 5988
o68 = {};
// 5989
f920654002_467.returns.push(o68);
// 5991
o69 = {};
// 5992
f920654002_467.returns.push(o69);
// 5993
o70 = {};
// 5994
o69.firstChild = o70;
// 5996
o70.nodeType = 8;
// 5998
o70.nodeValue = " <li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_380562705353186_recent\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer\" id=\"u_0_2g\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491943&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;TimelineAboutReportUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" role=\"complementary\"><div class=\"\"><div role=\"article\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__backgroundanchor\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/info\"></a><div class=\"fsm fwn fcg\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/info\">About</a></div></div></div><div class=\"timelineReportContent timelineNoSubheaderReport\"><div class=\"timelineUnitContainer -cx-PRIVATE-fbTimelineAboutUnit__root ogProfileLastUnit\" id=\"timeline_about_unit\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491943&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;TimelineAboutUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div><ul><li data-token=\"1\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2j\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/3LFVMmKZeUX.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Works at <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/PurdueUniversity?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=100526673914\">Purdue University</a></li><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__subtitle\">September 2008 to present</li></ul></div></div></div></li><li data-token=\"2\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2k\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/wKvDSXpnqkB.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Studies Computer Science at <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/PurdueUniversity?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=100526673914\">Purdue University</a></li><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__subtitle\">Past: <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Portland-State-University/113512491992878\" data-hovercard=\"/ajax/hovercard/page.php?id=113512491992878\">Portland State University</a> and <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Milwaukie-High-School/109486142404101\" data-hovercard=\"/ajax/hovercard/page.php?id=109486142404101\">Milwaukie High School</a></li></ul></div></div></div></li><li data-token=\"3\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2l\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yI/r/jg7lQrpjdKk.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-fbTimelineAboutUnit__nosubtitle -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Lives in <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/West-Lafayette-Indiana/112305682116972?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=112305682116972\">West Lafayette, Indiana</a></li></ul></div></div></div></li><li data-token=\"4\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2m\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/kBTlO7fdcY0.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-fbTimelineAboutUnit__nosubtitle -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">From <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Portland-Oregon/112548152092705?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=112548152092705\">Portland, Oregon</a></li></ul></div></div></div></li><li data-token=\"6\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2n\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/kz0_p5XcuSq.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-fbTimelineAboutUnit__nosubtitle -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Followed by <a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/followers\">9 people</a></li></ul></div></div></div></li></ul></div></div></div></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"u_0_2e\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer -cx-PRIVATE-fbTimelineAppSectionEgo__photos\" id=\"u_0_2h\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491943&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;AppSectionEgoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;,&quot;timeline_og_unit_click&quot;:&quot;1&quot;,&quot;unit_id&quot;:&quot;288381481237582&quot;,&quot;event_source&quot;:&quot;38&quot;,&quot;app_id&quot;:&quot;2305272732&quot;,&quot;action_type_id&quot;:&quot;&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__backgroundanchor\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\"></a><div class=\"fsm fwn fcg\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\">Photos</a> · <span class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\"><span class=\"fwn fcg\">241</span></a></span></div></div></div><div id=\"pagelet_timeline_app_collection_report_5\" class=\"-cx-PRIVATE-fbTimelineAppSectionEgo__collectioncontent\"><div data-referrer=\"photos_ego\"><table class=\"uiGrid -cx-PRIVATE-fbTimelinePhotosEgo__root -cx-PRIVATE-fbTimelineAppSectionEgo__photogrid\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-b-a.akamaihd.net%2Fhphotos-ak-frc3%2F993004_10200268473688587_517108607_n.jpg&amp;size=640%2C640&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.fbcdn-photos-b-a.akamaihd.net/hphotos-ak-frc3/p110x80/993004_10200268473688587_517108607_a.jpg\" alt=\"Gregor Richards&#039;s photo.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-ash3%2F1017486_10200268472248551_842609840_n.jpg&amp;size=851%2C315&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.sphotos-a.xx.fbcdn.net/hphotos-ash3/s280x280/1017486_10200268472248551_842609840_n.jpg\" style=\"left:-88px;\" alt=\"Gregor Richards&#039;s photo.\" width=\"280\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4986916864790&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4986916864790&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-b.xx.fbcdn.net%2Fhphotos-frc1%2F913679_4986916864790_91703778_o.jpg&amp;smallsrc=https%3A%2F%2Fsphotos-b.xx.fbcdn.net%2Fhphotos-prn2%2F178992_4986916864790_91703778_n.jpg&amp;size=2048%2C1536&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.sphotos-b.xx.fbcdn.net/hphotos-prn2/p118x118/178992_4986916864790_91703778_n.jpg\" alt=\"Today I learned that Dr. Gorman is actually another alternate identity for Clark Kent.\" width=\"138\" height=\"103\" /></div></a></td></tr><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897864518537&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897864518537&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-c-a.akamaihd.net%2Fhphotos-ak-frc1%2F422167_4897864518537_1503459754_n.jpg&amp;size=538%2C404&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-frc1/p118x118/422167_4897864518537_1503459754_n.jpg\" style=\"left:-17px;\" alt=\"No parking gais. For realsies. They&#039;ll tow your boat.\" width=\"138\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897839437910&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897839437910&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-frc1%2F920971_4897839437910_1063615079_o.jpg&amp;smallsrc=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-frc1%2F644616_4897839437910_1063615079_n.jpg&amp;size=2048%2C473&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-frc1/s480x480/644616_4897839437910_1063615079_n.jpg\" style=\"left:-173px;\" alt=\"So yeah, there&#039;s a LITTLE bit of flooding &#039;round these parts.\" width=\"450\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4875948970662&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4875948970662&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-b.xx.fbcdn.net%2Fhphotos-ash3%2F150431_4875948970662_1470457029_n.jpg&amp;size=944%2C834&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"-cx-PRIVATE-fbCroppedImage__container\" style=\"width:103px;height:103px;\"><img class=\"-cx-PRIVATE-fbCroppedImage__image img\" src=\"http://jsbngssl.photos-b.xx.fbcdn.net/hphotos-ash3/p118x90/150431_4875948970662_1470457029_a.jpg\" style=\"left:-7px; top:0px;\" alt=\"Anyone who can spot the delightful (and delicious!) irony in this photo gets ten Internet points.\" width=\"118\" height=\"104\" /></div></a></td></tr><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4691723285135&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4691723285135&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-f-a.akamaihd.net%2Fhphotos-ak-ash3%2F577358_4691723285135_528345851_n.jpg&amp;size=600%2C600&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.fbcdn-photos-f-a.akamaihd.net/hphotos-ak-ash3/p110x80/577358_4691723285135_528345851_a.jpg\" alt=\"I, for one, blame my parents.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4441724315317&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4441724315317&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-prn1%2F793914_4441724315317_424104454_o.jpg&amp;smallsrc=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-prn1%2F74137_4441724315317_424104454_n.jpg&amp;size=1024%2C1024&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.photos-a.xx.fbcdn.net/hphotos-prn1/p110x80/74137_4441724315317_424104454_a.jpg\" alt=\"Bought myself some nostalgia in the form of a watch.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4158049383621&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4158049383621&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-g-a.akamaihd.net%2Fhphotos-ak-prn1%2F73038_4158049383621_1395344823_n.jpg&amp;size=851%2C315&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-prn1/s280x280/73038_4158049383621_1395344823_n.jpg\" style=\"left:-88px;\" alt=\"Gregor Richards&#039;s photo.\" width=\"280\" height=\"103\" /></div></a></td></tr></tbody></table></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"u_0_2f\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer\" id=\"u_0_2i\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491943&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;23c8a629&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;AppSectionEgoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;,&quot;timeline_og_unit_click&quot;:&quot;1&quot;,&quot;unit_id&quot;:&quot;288381481237582&quot;,&quot;event_source&quot;:&quot;38&quot;,&quot;app_id&quot;:&quot;2361831622&quot;,&quot;action_type_id&quot;:&quot;&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__backgroundanchor\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\"></a><div class=\"fsm fwn fcg\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\">Groups</a> · <span class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\"><span class=\"fwn fcg\">1</span></a></span></div></div></div><div id=\"pagelet_timeline_app_collection_report_66\" class=\"-cx-PRIVATE-fbTimelineAppSectionEgo__collectioncontent\"><div class=\"-cx-PRIVATE-ogAppReport__listview\"><ul class=\"uiList -cx-PRIVATE-uiList__vert -cx-PRIVATE-uiList__mediumborder\"><li><div class=\"clearfix\" data-ft=\"&#123;&quot;tn&quot;:&quot;l&quot;&#125;\"><div class=\"listMemberFacepileLargeCollection listMemberFacepile -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__largeimage lfloat\"><img class=\"firstImg img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /><img class=\"img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /><img class=\"img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /><img class=\"lastImg img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /></div><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-ogAppReport__caption\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\" style=\"height:64px\"></div><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\"><a href=\"/groups/26418081870/\" data-hovercard=\"/ajax/hovercard/group.php?id=26418081870\">Purdue Extreme Croquet</a><div><div class=\"fcg\">1 member</div></div><span class=\"-cx-PRIVATE-fbTimelineGroupsCollection__desc\">Enjoy the civilized and gentlemanly...</span></div></div></div></div></li></ul></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"-cx-PUBLIC-timelineOneColMin__endmarker hidden_elem\" data-endmarker=\"recent\" data-pageindex=\"0\"></li> ";
// undefined
o70 = null;
// 5999
o69.parentNode = o16;
// 6001
f920654002_471.returns.push(o69);
// undefined
o69 = null;
// 6003
o69 = {};
// 6004
f920654002_427.returns.push(o69);
// 6005
// 6007
o70 = {};
// 6008
f920654002_425.returns.push(o70);
// 6009
o71 = {};
// undefined
fo920654002_1155_firstChild = function() { return fo920654002_1155_firstChild.returns[fo920654002_1155_firstChild.inst++]; };
fo920654002_1155_firstChild.returns = [];
fo920654002_1155_firstChild.inst = 0;
defineGetter(o69, "firstChild", fo920654002_1155_firstChild, undefined);
// undefined
o69 = null;
// undefined
fo920654002_1155_firstChild.returns.push(o71);
// 6011
o70.appendChild = f920654002_429;
// undefined
fo920654002_1155_firstChild.returns.push(o71);
// 6013
f920654002_429.returns.push(o71);
// undefined
o71 = null;
// 6014
o69 = {};
// undefined
fo920654002_1155_firstChild.returns.push(o69);
// undefined
fo920654002_1155_firstChild.returns.push(o69);
// 6018
f920654002_429.returns.push(o69);
// undefined
o69 = null;
// 6019
o69 = {};
// undefined
fo920654002_1155_firstChild.returns.push(o69);
// undefined
fo920654002_1155_firstChild.returns.push(o69);
// 6023
f920654002_429.returns.push(o69);
// undefined
o69 = null;
// 6024
o69 = {};
// undefined
fo920654002_1155_firstChild.returns.push(o69);
// undefined
fo920654002_1155_firstChild.returns.push(o69);
// 6028
f920654002_429.returns.push(o69);
// undefined
fo920654002_1155_firstChild.returns.push(null);
// 6030
o68.appendChild = f920654002_429;
// 6031
f920654002_429.returns.push(o70);
// undefined
o70 = null;
// 6032
o68.getAttribute = f920654002_464;
// 6033
f920654002_464.returns.push("pagelet_timeline_recent_ocm");
// 6038
f920654002_418.returns.push(1373491955071);
// 6041
f920654002_418.returns.push(1373491955072);
// 6044
f920654002_418.returns.push(1373491955073);
// 6047
f920654002_418.returns.push(1373491955074);
// 6050
f920654002_418.returns.push(1373491955074);
// 6052
o70 = {};
// 6053
f920654002_467.returns.push(o70);
// 6055
o71 = {};
// 6056
f920654002_467.returns.push(o71);
// 6057
o72 = {};
// 6058
o71.firstChild = o72;
// 6060
o72.nodeType = 8;
// 6062
o72.nodeValue = " <div class=\"-cx-PRIVATE-fbTimelineStyleAds__root -cx-PRIVATE-fbTimelineStyleAds__vertical -cx-PRIVATE-fbTimelineStyleAds__offscreen\" id=\"u_0_2p\" data-referrer=\"u_0_2p\"></div> ";
// undefined
o72 = null;
// 6063
o71.parentNode = o16;
// 6065
f920654002_471.returns.push(o71);
// undefined
o71 = null;
// 6066
// 6067
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 6068
f920654002_464.returns.push("pagelet_side_ads");
// 6072
f920654002_418.returns.push(1373491955076);
// 6077
o70 = {};
// 6078
f920654002_425.returns.push(o70);
// 6080
f920654002_429.returns.push(o70);
// undefined
o70 = null;
// 6083
f920654002_418.returns.push(1373491955078);
// 6086
f920654002_418.returns.push(1373491955079);
// 6089
f920654002_418.returns.push(1373491955079);
// 6091
o70 = {};
// 6092
f920654002_467.returns.push(o70);
// 6094
o71 = {};
// 6095
f920654002_467.returns.push(o71);
// 6096
o72 = {};
// 6097
o71.firstChild = o72;
// 6099
o72.nodeType = 8;
// 6101
o72.nodeValue = " <div class=\"-cx-PRIVATE-fbDock__root fbDockWrapper fbDockWrapperRight\" id=\"u_0_2r\"><div class=\"fbDock clearfix\"><div class=\"clearfix nubContainer rNubContainer\"><div id=\"ChatTabsPagelet\" data-referrer=\"ChatTabsPagelet\"><div class=\"fbNubGroup clearfix -cx-PUBLIC-fbMercuryChatTab__container\" id=\"u_0_2s\"><div class=\"fbNubGroup clearfix\" id=\"u_0_2t\"></div></div></div><div id=\"BuddylistPagelet\" data-referrer=\"BuddylistPagelet\"><div class=\"-cx-PUBLIC-fbDockChatBuddyListNub__container\"><div class=\"uiToggle -cx-PRIVATE-fbNub__root fbNub -cx-PUBLIC-fbDockChatBuddyListNub__root hide_on_presence_error\" id=\"fbDockChatBuddylistNub\"><a class=\"fbNubButton\" tabindex=\"0\" href=\"#\" rel=\"toggle\" role=\"button\"><span class=\"-cx-PRIVATE-fbDockChatBuddyListNub__unreadcount rfloat\"></span><img class=\"icon lfloat img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><span class=\"label\">Chat<span class=\"count\"> (<strong>0</strong>)</span></span></a><div class=\"fbNubFlyout uiToggleFlyout\"><div class=\"fbNubFlyoutOuter\"><div class=\"fbNubFlyoutInner\"><div class=\"clearfix fbNubFlyoutTitlebar\" data-jsid=\"nubFlyoutTitlebar\"><div class=\"uiSelector inlineBlock fbChatSidebarDropdown button rfloat uiSelectorRight\" id=\"u_0_2y\" data-multiple=\"1\"><div class=\"uiToggle wrap\"><a data-hover=\"tooltip\" aria-label=\"Options\" class=\"uiSelectorButton uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"1\" rel=\"toggle\"></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption checked\" data-label=\"Chat Sounds\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Chat Sounds</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption\" data-label=\"Advanced Settings...\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/settings_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Advanced Settings...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOnlineItem\" data-label=\"Turn On Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn On Chat</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOfflineItem\" data-label=\"Turn Off Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/turn_off_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Turn Off Chat</span></a></li></ul></div></div></div><select multiple=\"1\"><option value=\"\" disabled=\"1\"></option><option value=\"sound\" selected=\"1\">Chat Sounds</option><option value=\"advanced_settings\">Advanced Settings...</option><option value=\"online\">Turn On Chat</option><option value=\"turn_off_dialog\">Turn Off Chat</option></select></div><div class=\"titlebarLabel clearfix\"><div class=\"titlebarTextWrapper\">Chat</div></div></div><div class=\"fbNubFlyoutBody scrollable\"><div class=\"fbNubFlyoutBodyContent\"><div id=\"u_0_30\"><ul class=\"fbChatOrderedList clearfix\"><li><div class=\"phs fcg\"><span data-jsid=\"message\">Loading...</span></div></li></ul></div><div class=\"fbChatTypeaheadView hidden_elem\" id=\"u_0_2u\"></div></div></div><div class=\"fbNubFlyoutFooter\"><div class=\"-cx-PRIVATE-fbDockChatBuddyListNub__messageouter clearfix\"><img class=\"img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><div class=\"-cx-PRIVATE-fbDockChatBuddyListNub__message fcg\"></div></div><div class=\"uiTypeahead uiClearableTypeahead fbChatTypeahead\" id=\"u_0_2v\"><div class=\"wrap\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function eb4bf535e5190464c44a0f021f2808d69318a73b8(event) {\\u000a\\u000a};\"), (\"s3e52b29419e05bdea1000c4e485e78b61e7e09a9\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function eb4bf535e5190464c44a0f021f2808d69318a73b8(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s3e52b29419e05bdea1000c4e485e78b61e7e09a9_0\"), (s3e52b29419e05bdea1000c4e485e78b61e7e09a9_0_instance), (this), (arguments)))\n        };\n        (null);\n    ;\n    };\n    var s3e52b29419e05bdea1000c4e485e78b61e7e09a9_0_instance;\n    ((s3e52b29419e05bdea1000c4e485e78b61e7e09a9_0_instance) = ((JSBNG_Record.eventInstance)((\"s3e52b29419e05bdea1000c4e485e78b61e7e09a9_0\"))));\n    ((JSBNG_Record.markFunction)((eb4bf535e5190464c44a0f021f2808d69318a73b8)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><button class=\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-xuiCloseButton__root clear uiTypeaheadCloseButton -cx-PRIVATE-xuiCloseButton__medium -cx-PRIVATE-xuiCloseButton__dark\" title=\"Remove\" onclick=\"return eb4bf535e5190464c44a0f021f2808d69318a73b8.call(this, event);\" type=\"button\" id=\"u_0_2w\">Remove</button><input type=\"hidden\" autocomplete=\"off\" class=\"hiddenInput\" /><div class=\"innerWrap\"><input type=\"text\" class=\"inputtext inputsearch textInput DOMControl_placeholder\" autocomplete=\"off\" placeholder=\"Search\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-owns=\"typeahead_list_u_0_2v\" role=\"combobox\" spellcheck=\"false\" value=\"Search\" aria-label=\"Search\" id=\"u_0_2x\" /></div><img class=\"throbber uiLoadingIndicatorAsync img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div></div></div></div></div></div></div></div></div></div></div></div><div id=\"u_0_31\"></div> ";
// undefined
o72 = null;
// 6102
o71.parentNode = o16;
// 6104
f920654002_471.returns.push(o71);
// undefined
o71 = null;
// 6105
// 6106
o70.getAttribute = f920654002_464;
// 6107
f920654002_464.returns.push("pagelet_dock");
// 6171
o71 = {};
// 6172
f920654002_427.returns.push(o71);
// 6173
// 6174
// 6175
o71.getElementsByTagName = f920654002_453;
// 6176
o72 = {};
// 6177
f920654002_453.returns.push(o72);
// 6178
o72.length = 0;
// undefined
o72 = null;
// 6180
o72 = {};
// 6181
o71.childNodes = o72;
// undefined
o71 = null;
// 6182
o72.item = f920654002_456;
// 6183
o72.length = 1;
// 6184
o71 = {};
// 6185
o72["0"] = o71;
// undefined
o72 = null;
// 6186
o71.getAttributeNode = f920654002_458;
// 6188
f920654002_458.returns.push(null);
// 6189
o71.getElementsByTagName = f920654002_453;
// undefined
o71 = null;
// 6191
o71 = {};
// 6192
f920654002_453.returns.push(o71);
// 6193
o71.length = 138;
// 6194
o72 = {};
// 6195
o71["0"] = o72;
// 6196
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6198
f920654002_458.returns.push(null);
// 6200
o72 = {};
// 6201
o71["1"] = o72;
// 6202
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6204
f920654002_458.returns.push(null);
// 6206
o72 = {};
// 6207
o71["2"] = o72;
// 6208
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6210
f920654002_458.returns.push(null);
// 6212
o72 = {};
// 6213
o71["3"] = o72;
// 6214
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6216
f920654002_458.returns.push(null);
// 6218
o72 = {};
// 6219
o71["4"] = o72;
// 6220
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6222
f920654002_458.returns.push(null);
// 6224
o72 = {};
// 6225
o71["5"] = o72;
// 6226
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6228
f920654002_458.returns.push(null);
// 6230
o72 = {};
// 6231
o71["6"] = o72;
// 6232
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6234
f920654002_458.returns.push(null);
// 6236
o72 = {};
// 6237
o71["7"] = o72;
// 6238
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6240
f920654002_458.returns.push(null);
// 6242
o72 = {};
// 6243
o71["8"] = o72;
// 6244
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6246
f920654002_458.returns.push(null);
// 6248
o72 = {};
// 6249
o71["9"] = o72;
// 6250
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6252
f920654002_458.returns.push(null);
// 6254
o72 = {};
// 6255
o71["10"] = o72;
// 6256
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6258
f920654002_458.returns.push(null);
// 6260
o72 = {};
// 6261
o71["11"] = o72;
// 6262
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6264
f920654002_458.returns.push(null);
// 6266
o72 = {};
// 6267
o71["12"] = o72;
// 6268
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6270
f920654002_458.returns.push(null);
// 6272
o72 = {};
// 6273
o71["13"] = o72;
// 6274
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6276
f920654002_458.returns.push(null);
// 6278
o72 = {};
// 6279
o71["14"] = o72;
// 6280
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6282
f920654002_458.returns.push(null);
// 6284
o72 = {};
// 6285
o71["15"] = o72;
// 6286
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6288
f920654002_458.returns.push(null);
// 6290
o72 = {};
// 6291
o71["16"] = o72;
// 6292
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6294
f920654002_458.returns.push(null);
// 6296
o72 = {};
// 6297
o71["17"] = o72;
// 6298
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6300
f920654002_458.returns.push(null);
// 6302
o72 = {};
// 6303
o71["18"] = o72;
// 6304
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6306
f920654002_458.returns.push(null);
// 6308
o72 = {};
// 6309
o71["19"] = o72;
// 6310
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6312
f920654002_458.returns.push(null);
// 6314
o72 = {};
// 6315
o71["20"] = o72;
// 6316
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6318
f920654002_458.returns.push(null);
// 6320
o72 = {};
// 6321
o71["21"] = o72;
// 6322
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6324
f920654002_458.returns.push(null);
// 6326
o72 = {};
// 6327
o71["22"] = o72;
// 6328
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6330
f920654002_458.returns.push(null);
// 6332
o72 = {};
// 6333
o71["23"] = o72;
// 6334
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6336
f920654002_458.returns.push(null);
// 6338
o72 = {};
// 6339
o71["24"] = o72;
// 6340
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6342
o72 = {};
// 6343
f920654002_458.returns.push(o72);
// 6344
o72.value = "u_0_36";
// undefined
o72 = null;
// 6349
f920654002_458.returns.push(null);
// 6352
f920654002_453.returns.push(o71);
// 6357
f920654002_458.returns.push(null);
// 6362
f920654002_458.returns.push(null);
// 6367
f920654002_458.returns.push(null);
// 6372
f920654002_458.returns.push(null);
// 6377
f920654002_458.returns.push(null);
// 6382
f920654002_458.returns.push(null);
// 6387
f920654002_458.returns.push(null);
// 6392
f920654002_458.returns.push(null);
// 6397
f920654002_458.returns.push(null);
// 6402
f920654002_458.returns.push(null);
// 6407
f920654002_458.returns.push(null);
// 6412
f920654002_458.returns.push(null);
// 6417
f920654002_458.returns.push(null);
// 6422
f920654002_458.returns.push(null);
// 6427
f920654002_458.returns.push(null);
// 6432
f920654002_458.returns.push(null);
// 6437
f920654002_458.returns.push(null);
// 6442
f920654002_458.returns.push(null);
// 6447
f920654002_458.returns.push(null);
// 6452
f920654002_458.returns.push(null);
// 6457
f920654002_458.returns.push(null);
// 6462
f920654002_458.returns.push(null);
// 6467
f920654002_458.returns.push(null);
// 6472
f920654002_458.returns.push(null);
// 6477
o72 = {};
// 6478
f920654002_458.returns.push(o72);
// 6479
o72.value = "u_0_36";
// undefined
o72 = null;
// 6481
o72 = {};
// 6482
o71["25"] = o72;
// 6483
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6485
f920654002_458.returns.push(null);
// 6487
o72 = {};
// 6488
o71["26"] = o72;
// 6489
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6491
f920654002_458.returns.push(null);
// 6493
o72 = {};
// 6494
o71["27"] = o72;
// 6495
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6497
f920654002_458.returns.push(null);
// 6499
o72 = {};
// 6500
o71["28"] = o72;
// 6501
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6503
f920654002_458.returns.push(null);
// 6505
o72 = {};
// 6506
o71["29"] = o72;
// 6507
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6509
f920654002_458.returns.push(null);
// 6511
o72 = {};
// 6512
o71["30"] = o72;
// 6513
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6515
f920654002_458.returns.push(null);
// 6517
o72 = {};
// 6518
o71["31"] = o72;
// 6519
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6521
f920654002_458.returns.push(null);
// 6523
o72 = {};
// 6524
o71["32"] = o72;
// 6525
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6527
f920654002_458.returns.push(null);
// 6529
o72 = {};
// 6530
o71["33"] = o72;
// 6531
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6533
f920654002_458.returns.push(null);
// 6535
o72 = {};
// 6536
o71["34"] = o72;
// 6537
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6539
f920654002_458.returns.push(null);
// 6541
o72 = {};
// 6542
o71["35"] = o72;
// 6543
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6545
f920654002_458.returns.push(null);
// 6547
o72 = {};
// 6548
o71["36"] = o72;
// 6549
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6551
f920654002_458.returns.push(null);
// 6553
o72 = {};
// 6554
o71["37"] = o72;
// 6555
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6557
f920654002_458.returns.push(null);
// 6559
o72 = {};
// 6560
o71["38"] = o72;
// 6561
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6563
f920654002_458.returns.push(null);
// 6565
o72 = {};
// 6566
o71["39"] = o72;
// 6567
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6569
f920654002_458.returns.push(null);
// 6571
o72 = {};
// 6572
o71["40"] = o72;
// 6573
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6575
f920654002_458.returns.push(null);
// 6577
o72 = {};
// 6578
o71["41"] = o72;
// 6579
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6581
f920654002_458.returns.push(null);
// 6583
o72 = {};
// 6584
o71["42"] = o72;
// 6585
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6587
f920654002_458.returns.push(null);
// 6589
o72 = {};
// 6590
o71["43"] = o72;
// 6591
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6593
f920654002_458.returns.push(null);
// 6595
o72 = {};
// 6596
o71["44"] = o72;
// 6597
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6599
f920654002_458.returns.push(null);
// 6601
o72 = {};
// 6602
o71["45"] = o72;
// 6603
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6605
f920654002_458.returns.push(null);
// 6607
o72 = {};
// 6608
o71["46"] = o72;
// 6609
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6611
f920654002_458.returns.push(null);
// 6613
o72 = {};
// 6614
o71["47"] = o72;
// 6615
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6617
f920654002_458.returns.push(null);
// 6619
o72 = {};
// 6620
o71["48"] = o72;
// 6621
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6623
f920654002_458.returns.push(null);
// 6625
o72 = {};
// 6626
o71["49"] = o72;
// 6627
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6629
f920654002_458.returns.push(null);
// 6631
o72 = {};
// 6632
o71["50"] = o72;
// 6633
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6635
f920654002_458.returns.push(null);
// 6637
o72 = {};
// 6638
o71["51"] = o72;
// 6639
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6641
o72 = {};
// 6642
f920654002_458.returns.push(o72);
// 6643
o72.value = "u_0_34";
// undefined
o72 = null;
// 6645
o72 = {};
// 6646
o71["52"] = o72;
// 6647
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6649
f920654002_458.returns.push(null);
// 6651
o72 = {};
// 6652
o71["53"] = o72;
// 6653
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6655
f920654002_458.returns.push(null);
// 6657
o72 = {};
// 6658
o71["54"] = o72;
// 6659
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6661
f920654002_458.returns.push(null);
// 6663
o72 = {};
// 6664
o71["55"] = o72;
// 6665
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6667
f920654002_458.returns.push(null);
// 6669
o72 = {};
// 6670
o71["56"] = o72;
// 6671
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6673
f920654002_458.returns.push(null);
// 6675
o72 = {};
// 6676
o71["57"] = o72;
// 6677
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6679
f920654002_458.returns.push(null);
// 6681
o72 = {};
// 6682
o71["58"] = o72;
// 6683
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6685
f920654002_458.returns.push(null);
// 6687
o72 = {};
// 6688
o71["59"] = o72;
// 6689
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6691
f920654002_458.returns.push(null);
// 6693
o72 = {};
// 6694
o71["60"] = o72;
// 6695
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6697
f920654002_458.returns.push(null);
// 6699
o72 = {};
// 6700
o71["61"] = o72;
// 6701
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6703
f920654002_458.returns.push(null);
// 6705
o72 = {};
// 6706
o71["62"] = o72;
// 6707
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6709
f920654002_458.returns.push(null);
// 6711
o72 = {};
// 6712
o71["63"] = o72;
// 6713
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6715
o72 = {};
// 6716
f920654002_458.returns.push(o72);
// 6717
o72.value = "u_0_35";
// undefined
o72 = null;
// 6719
o72 = {};
// 6720
o71["64"] = o72;
// 6721
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6723
f920654002_458.returns.push(null);
// 6725
o72 = {};
// 6726
o71["65"] = o72;
// 6727
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6729
f920654002_458.returns.push(null);
// 6731
o72 = {};
// 6732
o71["66"] = o72;
// 6733
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6735
f920654002_458.returns.push(null);
// 6737
o72 = {};
// 6738
o71["67"] = o72;
// 6739
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6741
f920654002_458.returns.push(null);
// 6743
o72 = {};
// 6744
o71["68"] = o72;
// 6745
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6747
f920654002_458.returns.push(null);
// 6749
o72 = {};
// 6750
o71["69"] = o72;
// 6751
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6753
f920654002_458.returns.push(null);
// 6755
o72 = {};
// 6756
o71["70"] = o72;
// 6757
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6759
f920654002_458.returns.push(null);
// 6761
o72 = {};
// 6762
o71["71"] = o72;
// 6763
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6765
f920654002_458.returns.push(null);
// 6767
o72 = {};
// 6768
o71["72"] = o72;
// 6769
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6771
f920654002_458.returns.push(null);
// 6773
o72 = {};
// 6774
o71["73"] = o72;
// undefined
o71 = null;
// 6775
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6777
o71 = {};
// 6778
f920654002_458.returns.push(o71);
// 6779
o71.value = "u_0_37";
// undefined
o71 = null;
// 6783
o71 = {};
// 6784
f920654002_427.returns.push(o71);
// 6785
// 6786
// 6787
o71.getElementsByTagName = f920654002_453;
// 6788
o72 = {};
// 6789
f920654002_453.returns.push(o72);
// 6790
o72.length = 0;
// undefined
o72 = null;
// 6792
o72 = {};
// 6793
o71.childNodes = o72;
// undefined
o71 = null;
// 6794
o72.item = f920654002_456;
// 6795
o72.length = 1;
// 6796
o71 = {};
// 6797
o72["0"] = o71;
// undefined
o72 = null;
// 6798
o71.getAttributeNode = f920654002_458;
// 6800
f920654002_458.returns.push(null);
// 6801
o71.getElementsByTagName = f920654002_453;
// undefined
o71 = null;
// 6803
o71 = {};
// 6804
f920654002_453.returns.push(o71);
// 6805
o71.length = 11;
// 6806
o72 = {};
// 6807
o71["0"] = o72;
// 6808
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6810
f920654002_458.returns.push(null);
// 6812
o72 = {};
// 6813
o71["1"] = o72;
// 6814
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6816
f920654002_458.returns.push(null);
// 6818
o72 = {};
// 6819
o71["2"] = o72;
// 6820
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6822
f920654002_458.returns.push(null);
// 6824
o72 = {};
// 6825
o71["3"] = o72;
// 6826
o72.getAttributeNode = f920654002_458;
// undefined
o72 = null;
// 6828
f920654002_458.returns.push(null);
// 6830
o72 = {};
// 6831
o71["4"] = o72;
// 6832
o72.getAttributeNode = f920654002_458;
// 6834
o73 = {};
// 6835
f920654002_458.returns.push(o73);
// 6836
o73.value = "u_0_38";
// 6841
f920654002_458.returns.push(null);
// 6844
f920654002_453.returns.push(o71);
// 6849
f920654002_458.returns.push(null);
// 6854
f920654002_458.returns.push(null);
// 6859
f920654002_458.returns.push(null);
// 6864
f920654002_458.returns.push(null);
// 6869
f920654002_458.returns.push(o73);
// undefined
o73 = null;
// 6872
o73 = {};
// 6873
o71["5"] = o73;
// 6874
o73.getAttributeNode = f920654002_458;
// undefined
o73 = null;
// 6876
f920654002_458.returns.push(null);
// 6878
o73 = {};
// 6879
o71["6"] = o73;
// 6880
o73.getAttributeNode = f920654002_458;
// undefined
o73 = null;
// 6882
f920654002_458.returns.push(null);
// 6884
o73 = {};
// 6885
o71["7"] = o73;
// 6886
o73.getAttributeNode = f920654002_458;
// undefined
o73 = null;
// 6888
f920654002_458.returns.push(null);
// 6890
o73 = {};
// 6891
o71["8"] = o73;
// undefined
o71 = null;
// 6892
o73.getAttributeNode = f920654002_458;
// 6894
o71 = {};
// 6895
f920654002_458.returns.push(o71);
// 6896
o71.value = "u_0_39";
// undefined
o71 = null;
// 6900
o71 = {};
// 6901
f920654002_427.returns.push(o71);
// 6902
// 6903
// 6904
o71.getElementsByTagName = f920654002_453;
// 6905
o74 = {};
// 6906
f920654002_453.returns.push(o74);
// 6907
o74.length = 0;
// undefined
o74 = null;
// 6909
o74 = {};
// 6910
o71.childNodes = o74;
// undefined
o71 = null;
// 6911
o74.item = f920654002_456;
// 6912
o74.length = 1;
// 6913
o71 = {};
// 6914
o74["0"] = o71;
// undefined
o74 = null;
// 6915
o71.getAttributeNode = f920654002_458;
// 6917
f920654002_458.returns.push(null);
// 6918
o71.getElementsByTagName = f920654002_453;
// undefined
o71 = null;
// 6920
o71 = {};
// 6921
f920654002_453.returns.push(o71);
// 6922
o71.length = 143;
// 6923
o74 = {};
// 6924
o71["0"] = o74;
// 6925
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6927
f920654002_458.returns.push(null);
// 6929
o74 = {};
// 6930
o71["1"] = o74;
// 6931
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6933
f920654002_458.returns.push(null);
// 6935
o74 = {};
// 6936
o71["2"] = o74;
// 6937
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6939
f920654002_458.returns.push(null);
// 6941
o74 = {};
// 6942
o71["3"] = o74;
// 6943
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6945
f920654002_458.returns.push(null);
// 6947
o74 = {};
// 6948
o71["4"] = o74;
// 6949
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6951
f920654002_458.returns.push(null);
// 6953
o74 = {};
// 6954
o71["5"] = o74;
// 6955
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6957
f920654002_458.returns.push(null);
// 6959
o74 = {};
// 6960
o71["6"] = o74;
// 6961
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6963
f920654002_458.returns.push(null);
// 6965
o74 = {};
// 6966
o71["7"] = o74;
// 6967
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6969
f920654002_458.returns.push(null);
// 6971
o74 = {};
// 6972
o71["8"] = o74;
// 6973
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6975
f920654002_458.returns.push(null);
// 6977
o74 = {};
// 6978
o71["9"] = o74;
// 6979
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6981
f920654002_458.returns.push(null);
// 6983
o74 = {};
// 6984
o71["10"] = o74;
// 6985
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6987
f920654002_458.returns.push(null);
// 6989
o74 = {};
// 6990
o71["11"] = o74;
// 6991
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6993
f920654002_458.returns.push(null);
// 6995
o74 = {};
// 6996
o71["12"] = o74;
// 6997
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 6999
f920654002_458.returns.push(null);
// 7001
o74 = {};
// 7002
o71["13"] = o74;
// 7003
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7005
f920654002_458.returns.push(null);
// 7007
o74 = {};
// 7008
o71["14"] = o74;
// 7009
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7011
f920654002_458.returns.push(null);
// 7013
o74 = {};
// 7014
o71["15"] = o74;
// 7015
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7017
f920654002_458.returns.push(null);
// 7019
o74 = {};
// 7020
o71["16"] = o74;
// 7021
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7023
f920654002_458.returns.push(null);
// 7025
o74 = {};
// 7026
o71["17"] = o74;
// 7027
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7029
f920654002_458.returns.push(null);
// 7031
o74 = {};
// 7032
o71["18"] = o74;
// 7033
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7035
f920654002_458.returns.push(null);
// 7037
o74 = {};
// 7038
o71["19"] = o74;
// 7039
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7041
f920654002_458.returns.push(null);
// 7043
o74 = {};
// 7044
o71["20"] = o74;
// 7045
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7047
f920654002_458.returns.push(null);
// 7049
o74 = {};
// 7050
o71["21"] = o74;
// 7051
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7053
f920654002_458.returns.push(null);
// 7055
o74 = {};
// 7056
o71["22"] = o74;
// 7057
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7059
o74 = {};
// 7060
f920654002_458.returns.push(o74);
// 7061
o74.value = "u_0_3d";
// 7066
f920654002_458.returns.push(null);
// 7069
f920654002_453.returns.push(o71);
// 7074
f920654002_458.returns.push(null);
// 7079
f920654002_458.returns.push(null);
// 7084
f920654002_458.returns.push(null);
// 7089
f920654002_458.returns.push(null);
// 7094
f920654002_458.returns.push(null);
// 7099
f920654002_458.returns.push(null);
// 7104
f920654002_458.returns.push(null);
// 7109
f920654002_458.returns.push(null);
// 7114
f920654002_458.returns.push(null);
// 7119
f920654002_458.returns.push(null);
// 7124
f920654002_458.returns.push(null);
// 7129
f920654002_458.returns.push(null);
// 7134
f920654002_458.returns.push(null);
// 7139
f920654002_458.returns.push(null);
// 7144
f920654002_458.returns.push(null);
// 7149
f920654002_458.returns.push(null);
// 7154
f920654002_458.returns.push(null);
// 7159
f920654002_458.returns.push(null);
// 7164
f920654002_458.returns.push(null);
// 7169
f920654002_458.returns.push(null);
// 7174
f920654002_458.returns.push(null);
// 7179
f920654002_458.returns.push(null);
// 7184
f920654002_458.returns.push(o74);
// undefined
o74 = null;
// 7187
o74 = {};
// 7188
o71["23"] = o74;
// 7189
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7191
f920654002_458.returns.push(null);
// 7193
o74 = {};
// 7194
o71["24"] = o74;
// 7195
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7197
f920654002_458.returns.push(null);
// 7199
o74 = {};
// 7200
o71["25"] = o74;
// 7201
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7203
f920654002_458.returns.push(null);
// 7205
o74 = {};
// 7206
o71["26"] = o74;
// 7207
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7209
f920654002_458.returns.push(null);
// 7211
o74 = {};
// 7212
o71["27"] = o74;
// 7213
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7215
f920654002_458.returns.push(null);
// 7217
o74 = {};
// 7218
o71["28"] = o74;
// 7219
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7221
f920654002_458.returns.push(null);
// 7223
o74 = {};
// 7224
o71["29"] = o74;
// 7225
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7227
f920654002_458.returns.push(null);
// 7229
o74 = {};
// 7230
o71["30"] = o74;
// 7231
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7233
f920654002_458.returns.push(null);
// 7235
o74 = {};
// 7236
o71["31"] = o74;
// 7237
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7239
f920654002_458.returns.push(null);
// 7241
o74 = {};
// 7242
o71["32"] = o74;
// 7243
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7245
f920654002_458.returns.push(null);
// 7247
o74 = {};
// 7248
o71["33"] = o74;
// 7249
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7251
f920654002_458.returns.push(null);
// 7253
o74 = {};
// 7254
o71["34"] = o74;
// 7255
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7257
f920654002_458.returns.push(null);
// 7259
o74 = {};
// 7260
o71["35"] = o74;
// 7261
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7263
f920654002_458.returns.push(null);
// 7265
o74 = {};
// 7266
o71["36"] = o74;
// 7267
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7269
f920654002_458.returns.push(null);
// 7271
o74 = {};
// 7272
o71["37"] = o74;
// 7273
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7275
f920654002_458.returns.push(null);
// 7277
o74 = {};
// 7278
o71["38"] = o74;
// 7279
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7281
f920654002_458.returns.push(null);
// 7283
o74 = {};
// 7284
o71["39"] = o74;
// 7285
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7287
f920654002_458.returns.push(null);
// 7289
o74 = {};
// 7290
o71["40"] = o74;
// 7291
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7293
f920654002_458.returns.push(null);
// 7295
o74 = {};
// 7296
o71["41"] = o74;
// 7297
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7299
f920654002_458.returns.push(null);
// 7301
o74 = {};
// 7302
o71["42"] = o74;
// 7303
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7305
f920654002_458.returns.push(null);
// 7307
o74 = {};
// 7308
o71["43"] = o74;
// 7309
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7311
f920654002_458.returns.push(null);
// 7313
o74 = {};
// 7314
o71["44"] = o74;
// 7315
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7317
f920654002_458.returns.push(null);
// 7319
o74 = {};
// 7320
o71["45"] = o74;
// 7321
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7323
f920654002_458.returns.push(null);
// 7325
o74 = {};
// 7326
o71["46"] = o74;
// 7327
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7329
f920654002_458.returns.push(null);
// 7331
o74 = {};
// 7332
o71["47"] = o74;
// 7333
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7335
f920654002_458.returns.push(null);
// 7337
o74 = {};
// 7338
o71["48"] = o74;
// 7339
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7341
f920654002_458.returns.push(null);
// 7343
o74 = {};
// 7344
o71["49"] = o74;
// 7345
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7347
f920654002_458.returns.push(null);
// 7349
o74 = {};
// 7350
o71["50"] = o74;
// 7351
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7353
f920654002_458.returns.push(null);
// 7355
o74 = {};
// 7356
o71["51"] = o74;
// 7357
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7359
f920654002_458.returns.push(null);
// 7361
o74 = {};
// 7362
o71["52"] = o74;
// 7363
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7365
f920654002_458.returns.push(null);
// 7367
o74 = {};
// 7368
o71["53"] = o74;
// 7369
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7371
f920654002_458.returns.push(null);
// 7373
o74 = {};
// 7374
o71["54"] = o74;
// 7375
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7377
f920654002_458.returns.push(null);
// 7379
o74 = {};
// 7380
o71["55"] = o74;
// 7381
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7383
f920654002_458.returns.push(null);
// 7385
o74 = {};
// 7386
o71["56"] = o74;
// 7387
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7389
o74 = {};
// 7390
f920654002_458.returns.push(o74);
// 7391
o74.value = "u_0_3b";
// undefined
o74 = null;
// 7393
o74 = {};
// 7394
o71["57"] = o74;
// 7395
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7397
f920654002_458.returns.push(null);
// 7399
o74 = {};
// 7400
o71["58"] = o74;
// 7401
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7403
f920654002_458.returns.push(null);
// 7405
o74 = {};
// 7406
o71["59"] = o74;
// 7407
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7409
f920654002_458.returns.push(null);
// 7411
o74 = {};
// 7412
o71["60"] = o74;
// 7413
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7415
f920654002_458.returns.push(null);
// 7417
o74 = {};
// 7418
o71["61"] = o74;
// 7419
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7421
f920654002_458.returns.push(null);
// 7423
o74 = {};
// 7424
o71["62"] = o74;
// 7425
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7427
f920654002_458.returns.push(null);
// 7429
o74 = {};
// 7430
o71["63"] = o74;
// 7431
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7433
f920654002_458.returns.push(null);
// 7435
o74 = {};
// 7436
o71["64"] = o74;
// 7437
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7439
f920654002_458.returns.push(null);
// 7441
o74 = {};
// 7442
o71["65"] = o74;
// 7443
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7445
f920654002_458.returns.push(null);
// 7447
o74 = {};
// 7448
o71["66"] = o74;
// 7449
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7451
f920654002_458.returns.push(null);
// 7453
o74 = {};
// 7454
o71["67"] = o74;
// 7455
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7457
f920654002_458.returns.push(null);
// 7459
o74 = {};
// 7460
o71["68"] = o74;
// 7461
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7463
o74 = {};
// 7464
f920654002_458.returns.push(o74);
// 7465
o74.value = "u_0_3c";
// undefined
o74 = null;
// 7467
o74 = {};
// 7468
o71["69"] = o74;
// 7469
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7471
f920654002_458.returns.push(null);
// 7473
o74 = {};
// 7474
o71["70"] = o74;
// 7475
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7477
f920654002_458.returns.push(null);
// 7479
o74 = {};
// 7480
o71["71"] = o74;
// 7481
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7483
f920654002_458.returns.push(null);
// 7485
o74 = {};
// 7486
o71["72"] = o74;
// 7487
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7489
f920654002_458.returns.push(null);
// 7491
o74 = {};
// 7492
o71["73"] = o74;
// 7493
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7495
f920654002_458.returns.push(null);
// 7497
o74 = {};
// 7498
o71["74"] = o74;
// 7499
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7501
f920654002_458.returns.push(null);
// 7503
o74 = {};
// 7504
o71["75"] = o74;
// 7505
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7507
f920654002_458.returns.push(null);
// 7509
o74 = {};
// 7510
o71["76"] = o74;
// 7511
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7513
f920654002_458.returns.push(null);
// 7515
o74 = {};
// 7516
o71["77"] = o74;
// 7517
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7519
f920654002_458.returns.push(null);
// 7521
o74 = {};
// 7522
o71["78"] = o74;
// undefined
o71 = null;
// 7523
o74.getAttributeNode = f920654002_458;
// undefined
o74 = null;
// 7525
o71 = {};
// 7526
f920654002_458.returns.push(o71);
// 7527
o71.value = "u_0_3e";
// undefined
o71 = null;
// 7598
f920654002_418.returns.push(1373491955373);
// 7602
o71 = {};
// 7603
f920654002_425.returns.push(o71);
// 7605
f920654002_429.returns.push(o71);
// undefined
o71 = null;
// 7608
f920654002_418.returns.push(1373491955375);
// 7611
f920654002_418.returns.push(1373491955376);
// 7614
f920654002_418.returns.push(1373491955376);
// 7616
o71 = {};
// 7617
f920654002_467.returns.push(o71);
// 7619
o74 = {};
// 7620
f920654002_467.returns.push(o74);
// 7621
o75 = {};
// 7622
o74.firstChild = o75;
// 7624
o75.nodeType = 8;
// 7626
o75.nodeValue = " <div id=\"fbRequestsJewelLoading\"><div id=\"fbRequestsJewelLoadingContent\"><div class=\"uiHeader uiHeaderBottomBorder jewelHeader\"><div class=\"clearfix uiHeaderTop\"><div class=\"rfloat\"><h3 class=\"accessible_elem\">Friend Requests</h3><div class=\"uiHeaderActions fsm fwn fcg\"><a href=\"http://jsbngssl.www.facebook.com/?sk=ff\" accesskey=\"3\">Find Friends</a> · <a ajaxify=\"/ajax/settings/granular_privacy/can_friend.php\" rel=\"dialog\" href=\"#\" role=\"button\">Settings</a></div></div><div><h3 class=\"uiHeaderTitle\" aria-hidden=\"true\">Friend Requests</h3></div></div></div><img class=\"jewelLoading img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"jewelFooter\"><a class=\"seeMore\" href=\"/friends/requests/\"><span>See All</span></a></div></div> ";
// undefined
o75 = null;
// 7627
o74.parentNode = o16;
// 7629
f920654002_471.returns.push(o74);
// undefined
o74 = null;
// 7630
// 7631
o71.getAttribute = f920654002_464;
// 7632
f920654002_464.returns.push(null);
// 7633
o71.setAttribute = f920654002_587;
// undefined
o71 = null;
// 7634
f920654002_587.returns.push(undefined);
// 7636
f920654002_418.returns.push(1373491955378);
// 7640
o71 = {};
// 7641
f920654002_425.returns.push(o71);
// 7643
f920654002_429.returns.push(o71);
// undefined
o71 = null;
// 7646
f920654002_418.returns.push(1373491955379);
// 7649
f920654002_418.returns.push(1373491955380);
// 7652
f920654002_418.returns.push(1373491955387);
// 7654
o71 = {};
// 7655
f920654002_467.returns.push(o71);
// 7657
o74 = {};
// 7658
f920654002_467.returns.push(o74);
// 7659
o75 = {};
// 7660
o74.firstChild = o75;
// 7662
o75.nodeType = 8;
// 7664
o75.nodeValue = " <div class=\"fbTimelineStickyHeader fixed_elem fbTimelineStickyHeaderHidden\" aria-hidden=\"true\" id=\"u_0_3p\"><div class=\"stickyHeaderWrap clearfix\"><div class=\"back\"></div><div class=\"name\"><a class=\"profileThumb\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><span class=\"uiButtonGroup fbStickyHeaderBreadcrumb uiButtonGroupOverlay\" id=\"u_0_3o\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><a class=\"nameButton uiButton uiButtonOverlay\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" role=\"button\"><span class=\"uiButtonText\">Gregor Richards</span></a></span><span class=\"uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock pageMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"pageMenuButton uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-label=\"Timeline\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Timeline</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox checked\" data-label=\"Timeline\"><a class=\"itemAnchor itemWithIcon\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" aria-checked=\"true\"><i class=\"mrs itemIcon img sp_3fr8aa sx_22ecb2\"></i><span class=\"itemLabel fsm\">Timeline</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox\" data-label=\"About\"><a class=\"itemAnchor itemWithIcon\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/about\" aria-checked=\"false\"><i class=\"mrs itemIcon img sp_4p6kmz sx_fb2987\"></i><span class=\"itemLabel fsm\">About</span></a></li><li class=\"uiMenuSeparator separator hidden_elem\"></li></ul></div></div></div></div></span><span class=\"lastItem uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock sectionMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Now</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption checked\" data-label=\"Now\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"0\" href=\"#\" aria-checked=\"true\" data-key=\"recent\"><span class=\"itemLabel fsm\">Now</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2013\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2013\"><span class=\"itemLabel fsm\">2013</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2012\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2012\"><span class=\"itemLabel fsm\">2012</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2011\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2011\"><span class=\"itemLabel fsm\">2011</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2010\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2010\"><span class=\"itemLabel fsm\">2010</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2009\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2009\"><span class=\"itemLabel fsm\">2009</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2008\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2008\"><span class=\"itemLabel fsm\">2008</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"Born\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"way_back\"><span class=\"itemLabel fsm\">Born</span></a></li></ul></div></div></div><select><option value=\"\"></option><option value=\"recent\" selected=\"1\">Now</option><option value=\"year_2013\">2013</option><option value=\"year_2012\">2012</option><option value=\"year_2011\">2011</option><option value=\"year_2010\">2010</option><option value=\"year_2009\">2009</option><option value=\"year_2008\">2008</option><option value=\"way_back\">Born</option></select></div></span><span class=\"uiButtonGroupItem selectorItem hidden_elem\"><div class=\"uiSelector inlineBlock subsectionMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Highlights</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption highlights checked\" data-label=\"Highlights\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Highlights</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption allStories\" data-label=\"All Stories\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">All Stories</span></a></li><li class=\"uiMenuSeparator separator hidden_elem\"></li></ul></div></div></div><select><option value=\"\"></option><option value=\"highlights\" selected=\"1\">Highlights</option><option value=\"allStories\">All Stories</option></select></div></span></span></div><div class=\"actions\"><span class=\"uiButtonGroup fbTimelineConnectButtonGroup uiButtonGroupOverlay\" id=\"u_0_3h\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><div class=\"FriendButton\" id=\"u_0_3m\"><label class=\"FriendRequestAdd addButton uiButton uiButtonOverlay uiButtonLarge\" for=\"u_0_3n\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_3n\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"sticky_header\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></span><span class=\"lastItem uiButtonGroupItem buttonItem\"><span class=\"-cx-PRIVATE-uiSwapButton__root -cx-PRIVATE-fbSubscribeButton__root\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" ajaxify=\"/ajax/follow/follow_profile.php?profile_id=1055580469&amp;location=1\" rel=\"async-post\" id=\"u_0_3i\"><i class=\"mrs img sp_3fr8aa sx_3f5e05\"></i><span class=\"uiButtonText\">Follow</span></a><label class=\"profileFollowButton -cx-PUBLIC-uiHoverButton__root -cx-PRIVATE-uiSwapButton__secondbutton hidden_elem uiButton uiButtonOverlay uiButtonLarge\" id=\"u_0_3j\" for=\"u_0_3l\"><i class=\"mrs img sp_3fr8aa sx_0bef0b\"></i><input value=\"Following\" aria-haspopup=\"1\" data-profileid=\"1055580469\" type=\"submit\" id=\"u_0_3l\" /></label></span></span></span></div></div></div> ";
// undefined
o75 = null;
// 7665
o74.parentNode = o16;
// 7667
f920654002_471.returns.push(o74);
// undefined
o74 = null;
// 7668
// 7669
o71.getAttribute = f920654002_464;
// undefined
o71 = null;
// 7670
f920654002_464.returns.push("timeline_sticky_header");
// 7677
o71 = {};
// 7678
f920654002_427.returns.push(o71);
// 7679
// 7680
// 7681
o71.getElementsByTagName = f920654002_453;
// 7682
o74 = {};
// 7683
f920654002_453.returns.push(o74);
// 7684
o74.length = 0;
// undefined
o74 = null;
// 7686
o74 = {};
// 7687
o71.childNodes = o74;
// undefined
o71 = null;
// 7688
o74.item = f920654002_456;
// 7689
o74.length = 1;
// 7690
o71 = {};
// 7691
o74["0"] = o71;
// undefined
o74 = null;
// 7692
o71.getAttributeNode = f920654002_458;
// 7694
f920654002_458.returns.push(null);
// 7695
o71.getElementsByTagName = f920654002_453;
// 7697
o74 = {};
// 7698
f920654002_453.returns.push(o74);
// 7699
o74.length = 4;
// 7700
o75 = {};
// 7701
o74["0"] = o75;
// 7702
o75.getAttributeNode = f920654002_458;
// undefined
o75 = null;
// 7704
f920654002_458.returns.push(null);
// 7706
o75 = {};
// 7707
o74["1"] = o75;
// 7708
o75.getAttributeNode = f920654002_458;
// undefined
o75 = null;
// 7710
f920654002_458.returns.push(null);
// 7712
o75 = {};
// 7713
o74["2"] = o75;
// undefined
o74 = null;
// 7714
o75.getAttributeNode = f920654002_458;
// undefined
o75 = null;
// 7716
o74 = {};
// 7717
f920654002_458.returns.push(o74);
// 7718
o74.value = "u_0_3k";
// undefined
o74 = null;
// 7736
o71.querySelectorAll = f920654002_462;
// 7737
o74 = {};
// 7738
f920654002_462.returns.push(o74);
// 7739
o74.length = 0;
// undefined
o74 = null;
// 7740
o71.__html = void 0;
// 7741
o71.mountComponentIntoNode = void 0;
// 7742
o74 = {};
// 7743
o71.classList = o74;
// undefined
o71 = null;
// 7745
o74.add = f920654002_1038;
// undefined
o74 = null;
// 7746
f920654002_1038.returns.push(undefined);
// 7748
o71 = {};
// 7749
f920654002_427.returns.push(o71);
// 7750
// 7751
o71.firstChild = null;
// 7754
o74 = {};
// 7755
f920654002_425.returns.push(o74);
// 7757
o71.appendChild = f920654002_429;
// 7758
f920654002_429.returns.push(o74);
// undefined
o74 = null;
// 7760
o74 = {};
// 7761
f920654002_427.returns.push(o74);
// 7762
// 7763
o74.firstChild = null;
// 7764
o71.__html = void 0;
// 7766
o75 = {};
// 7767
f920654002_425.returns.push(o75);
// 7769
o74.appendChild = f920654002_429;
// 7770
f920654002_429.returns.push(o75);
// undefined
o75 = null;
// 7771
o75 = {};
// 7772
o74.classList = o75;
// 7774
o75.add = f920654002_1038;
// undefined
o75 = null;
// 7775
f920654002_1038.returns.push(undefined);
// 7776
o75 = {};
// 7777
o71.style = o75;
// undefined
o71 = null;
// 7778
// undefined
o75 = null;
// 7782
f920654002_1038.returns.push(undefined);
// 7783
o74.__FB_TOKEN = void 0;
// 7784
// undefined
o74 = null;
// 7790
f920654002_418.returns.push(1373491956107);
// 7794
o71 = {};
// 7795
f920654002_425.returns.push(o71);
// 7797
f920654002_429.returns.push(o71);
// undefined
o71 = null;
// 7800
f920654002_418.returns.push(1373491956109);
// 7803
f920654002_418.returns.push(1373491956110);
// 7806
f920654002_418.returns.push(1373491956110);
// 7808
o71 = {};
// 7809
f920654002_467.returns.push(o71);
// 7811
o74 = {};
// 7812
f920654002_467.returns.push(o74);
// 7813
o75 = {};
// 7814
o74.firstChild = o75;
// 7816
o75.nodeType = 8;
// 7818
o75.nodeValue = " <div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_current\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">Earlier in 2013</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3r\"><span class=\"sectionLabel fwb\" data-year=\"2013\">Show 2013</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_last\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2012</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3s\"><span class=\"sectionLabel fwb\" data-year=\"2012\">Show 2012</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2011\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2011</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3t\"><span class=\"sectionLabel fwb\" data-year=\"2011\">Show 2011</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2010\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2010</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3x\"><span class=\"sectionLabel fwb\" data-year=\"2010\">Show 2010</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2009\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2009</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3w\"><span class=\"sectionLabel fwb\" data-year=\"2009\">Show 2009</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2008\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2008</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3u\"><span class=\"sectionLabel fwb\" data-year=\"2008\">Show 2008</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_wayback\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">Born</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3v\"><span class=\"sectionLabel fwb\" data-year=\"2007\">Show 2007</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div> ";
// undefined
o75 = null;
// 7819
o74.parentNode = o16;
// 7821
f920654002_471.returns.push(o74);
// undefined
o74 = null;
// 7823
o74 = {};
// 7824
f920654002_427.returns.push(o74);
// 7825
// 7827
o75 = {};
// 7828
f920654002_425.returns.push(o75);
// 7829
o76 = {};
// undefined
fo920654002_1385_firstChild = function() { return fo920654002_1385_firstChild.returns[fo920654002_1385_firstChild.inst++]; };
fo920654002_1385_firstChild.returns = [];
fo920654002_1385_firstChild.inst = 0;
defineGetter(o74, "firstChild", fo920654002_1385_firstChild, undefined);
// undefined
o74 = null;
// undefined
fo920654002_1385_firstChild.returns.push(o76);
// 7831
o75.appendChild = f920654002_429;
// undefined
fo920654002_1385_firstChild.returns.push(o76);
// 7833
f920654002_429.returns.push(o76);
// 7834
o74 = {};
// undefined
fo920654002_1385_firstChild.returns.push(o74);
// undefined
fo920654002_1385_firstChild.returns.push(o74);
// 7838
f920654002_429.returns.push(o74);
// 7839
o77 = {};
// undefined
fo920654002_1385_firstChild.returns.push(o77);
// undefined
fo920654002_1385_firstChild.returns.push(o77);
// 7843
f920654002_429.returns.push(o77);
// 7844
o78 = {};
// undefined
fo920654002_1385_firstChild.returns.push(o78);
// undefined
fo920654002_1385_firstChild.returns.push(o78);
// 7848
f920654002_429.returns.push(o78);
// 7849
o79 = {};
// undefined
fo920654002_1385_firstChild.returns.push(o79);
// undefined
fo920654002_1385_firstChild.returns.push(o79);
// 7853
f920654002_429.returns.push(o79);
// 7854
o80 = {};
// undefined
fo920654002_1385_firstChild.returns.push(o80);
// undefined
fo920654002_1385_firstChild.returns.push(o80);
// 7858
f920654002_429.returns.push(o80);
// 7859
o81 = {};
// undefined
fo920654002_1385_firstChild.returns.push(o81);
// undefined
fo920654002_1385_firstChild.returns.push(o81);
// 7863
f920654002_429.returns.push(o81);
// undefined
fo920654002_1385_firstChild.returns.push(null);
// 7865
o71.appendChild = f920654002_429;
// 7866
f920654002_429.returns.push(o75);
// undefined
o75 = null;
// 7867
o71.getAttribute = f920654002_464;
// 7868
f920654002_464.returns.push(null);
// 7869
o71.setAttribute = f920654002_587;
// undefined
o71 = null;
// 7870
f920654002_587.returns.push(undefined);
// 7906
f920654002_418.returns.push(1373491956129);
// 7910
o71 = {};
// 7911
f920654002_425.returns.push(o71);
// 7913
f920654002_429.returns.push(o71);
// undefined
o71 = null;
// 7916
f920654002_418.returns.push(1373491956131);
// 7919
f920654002_418.returns.push(1373491956131);
// 7922
f920654002_418.returns.push(1373491956131);
// 7924
o71 = {};
// 7925
f920654002_467.returns.push(o71);
// 7927
o75 = {};
// 7928
f920654002_467.returns.push(o75);
// 7929
o82 = {};
// 7930
o75.firstChild = o82;
// 7932
o82.nodeType = 8;
// 7934
o82.nodeValue = " <div class=\"fbTimelineSectionExpander fbTimelineHiddenPager stat_elem\" id=\"pagelet_timeline_recent_pager_1\"><div class=\"fbTimelineSectionExpandPager fbTimelineShowOlder\" data-gt=\"&#123;&quot;timeline_pager&quot;:&quot;1&quot;,&quot;profile_id&quot;:&quot;1055580469&quot;,&quot;page_index&quot;:&quot;1&quot;,&quot;query_type&quot;:&quot;39&quot;&#125;\" id=\"u_0_3z\"><div class=\"clearfix uiMorePager stat_elem\"><a class=\"-cx-PUBLIC-timelineOneColMin__caret uiMorePagerSecondary rfloat\" href=\"#\" role=\"button\"></a><div><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e133df59483d63ceb936461d3e85f6a139e94d8f8(event) {\\u000a    ((JSCC.get(\\\"jo1oWy2UhFj8B4qShTN0\\\") && JSCC.get(\\\"jo1oWy2UhFj8B4qShTN0\\\").getHandler()))();\\u000a    return false;\\u000a};\"), (\"s49041a8f35ce423b4a9da85c344de6f11744aba4\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e133df59483d63ceb936461d3e85f6a139e94d8f8(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s49041a8f35ce423b4a9da85c344de6f11744aba4_0\"), (s49041a8f35ce423b4a9da85c344de6f11744aba4_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((((JSBNG_Record.get)(JSCC, (\"get\")))[(\"get\")])(\"jo1oWy2UhFj8B4qShTN0\") && (((JSBNG_Record.get)((((JSBNG_Record.get)(JSCC, (\"get\")))[(\"get\")])(\"jo1oWy2UhFj8B4qShTN0\"), (\"getHandler\")))[(\"getHandler\")])()))();\n        return false;\n    };\n    var s49041a8f35ce423b4a9da85c344de6f11744aba4_0_instance;\n    ((s49041a8f35ce423b4a9da85c344de6f11744aba4_0_instance) = ((JSBNG_Record.eventInstance)((\"s49041a8f35ce423b4a9da85c344de6f11744aba4_0\"))));\n    ((JSBNG_Record.markFunction)((e133df59483d63ceb936461d3e85f6a139e94d8f8)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"pam uiBoxLightblue uiMorePagerPrimary\" onclick=\"return e133df59483d63ceb936461d3e85f6a139e94d8f8.call(this, event);\" href=\"#\" role=\"button\">See More Recent Stories</a><span class=\"uiMorePagerLoader pam uiBoxLightblue\"><img class=\"img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></span></div></div></div></div> ";
// undefined
o82 = null;
// 7935
o75.parentNode = o16;
// 7937
f920654002_471.returns.push(o75);
// undefined
o75 = null;
// 7938
// 7939
o71.getAttribute = f920654002_464;
// 7940
f920654002_464.returns.push(null);
// 7941
o71.setAttribute = f920654002_587;
// 7942
f920654002_587.returns.push(undefined);
// 7946
f920654002_418.returns.push(1373491956145);
// 7950
o75 = {};
// 7951
f920654002_425.returns.push(o75);
// 7953
f920654002_429.returns.push(o75);
// undefined
o75 = null;
// 7956
f920654002_418.returns.push(1373491956147);
// 7959
f920654002_418.returns.push(1373491956148);
// 7962
f920654002_418.returns.push(1373491956148);
// 7964
o75 = {};
// 7965
f920654002_467.returns.push(o75);
// 7967
o82 = {};
// 7968
f920654002_467.returns.push(o82);
// 7969
o83 = {};
// 7970
o82.firstChild = o83;
// 7972
o83.nodeType = 8;
// 7974
o83.nodeValue = " <ul class=\"fbTimelineScrubber hidden_elem\" role=\"navigation\" data-gt=\"&#123;&quot;timeline_scrubber&quot;:&quot;1&quot;,&quot;profile_id&quot;:&quot;1055580469&quot;&#125;\" id=\"u_0_41\"><li data-key=\"recent\" class=\"selected\"><a href=\"/LawlabeeTheWallaby/timeline\" rel=\"ignore\">Now</a></li><li data-key=\"year_2013\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2013\"><a href=\"/LawlabeeTheWallaby/timeline/2013\" rel=\"ignore\" tabindex=\"-1\">2013</a><ul class=\"clearfix\"><li data-key=\"month_2013_1\"><a href=\"/LawlabeeTheWallaby/timeline/2013/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2012\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2012\"><a href=\"/LawlabeeTheWallaby/timeline/2012\" rel=\"ignore\" tabindex=\"-1\">2012</a><ul class=\"clearfix\"><li data-key=\"month_2012_12\"><a href=\"/LawlabeeTheWallaby/timeline/2012/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2012_11\"><a href=\"/LawlabeeTheWallaby/timeline/2012/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2012_10\"><a href=\"/LawlabeeTheWallaby/timeline/2012/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2012_9\"><a href=\"/LawlabeeTheWallaby/timeline/2012/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2012_8\"><a href=\"/LawlabeeTheWallaby/timeline/2012/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2012_7\"><a href=\"/LawlabeeTheWallaby/timeline/2012/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2012_6\"><a href=\"/LawlabeeTheWallaby/timeline/2012/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2012_5\"><a href=\"/LawlabeeTheWallaby/timeline/2012/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2012_4\"><a href=\"/LawlabeeTheWallaby/timeline/2012/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2012_3\"><a href=\"/LawlabeeTheWallaby/timeline/2012/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2012_2\"><a href=\"/LawlabeeTheWallaby/timeline/2012/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2012_1\"><a href=\"/LawlabeeTheWallaby/timeline/2012/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2011\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2011\"><a href=\"/LawlabeeTheWallaby/timeline/2011\" rel=\"ignore\" tabindex=\"-1\">2011</a><ul class=\"clearfix\"><li data-key=\"month_2011_12\"><a href=\"/LawlabeeTheWallaby/timeline/2011/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2011_11\"><a href=\"/LawlabeeTheWallaby/timeline/2011/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2011_10\"><a href=\"/LawlabeeTheWallaby/timeline/2011/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2011_9\"><a href=\"/LawlabeeTheWallaby/timeline/2011/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2011_8\"><a href=\"/LawlabeeTheWallaby/timeline/2011/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2011_7\"><a href=\"/LawlabeeTheWallaby/timeline/2011/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2011_6\"><a href=\"/LawlabeeTheWallaby/timeline/2011/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2011_5\"><a href=\"/LawlabeeTheWallaby/timeline/2011/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2011_4\"><a href=\"/LawlabeeTheWallaby/timeline/2011/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2011_3\"><a href=\"/LawlabeeTheWallaby/timeline/2011/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2011_2\"><a href=\"/LawlabeeTheWallaby/timeline/2011/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2011_1\"><a href=\"/LawlabeeTheWallaby/timeline/2011/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2010\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2010\"><a href=\"/LawlabeeTheWallaby/timeline/2010\" rel=\"ignore\" tabindex=\"-1\">2010</a><ul class=\"clearfix\"><li data-key=\"month_2010_12\"><a href=\"/LawlabeeTheWallaby/timeline/2010/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2010_11\"><a href=\"/LawlabeeTheWallaby/timeline/2010/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2010_10\"><a href=\"/LawlabeeTheWallaby/timeline/2010/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2010_9\"><a href=\"/LawlabeeTheWallaby/timeline/2010/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2010_8\"><a href=\"/LawlabeeTheWallaby/timeline/2010/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2010_7\"><a href=\"/LawlabeeTheWallaby/timeline/2010/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2010_6\"><a href=\"/LawlabeeTheWallaby/timeline/2010/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2010_5\"><a href=\"/LawlabeeTheWallaby/timeline/2010/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2010_4\"><a href=\"/LawlabeeTheWallaby/timeline/2010/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2010_3\"><a href=\"/LawlabeeTheWallaby/timeline/2010/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2010_2\"><a href=\"/LawlabeeTheWallaby/timeline/2010/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2010_1\"><a href=\"/LawlabeeTheWallaby/timeline/2010/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2009\" class=\"clearfix\" data-rollup=\"2000s\" data-year=\"2009\"><a href=\"/LawlabeeTheWallaby/timeline/2009\" rel=\"ignore\" tabindex=\"-1\">2009</a><ul class=\"clearfix\"><li data-key=\"month_2009_12\"><a href=\"/LawlabeeTheWallaby/timeline/2009/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2009_11\"><a href=\"/LawlabeeTheWallaby/timeline/2009/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2009_10\"><a href=\"/LawlabeeTheWallaby/timeline/2009/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2009_9\"><a href=\"/LawlabeeTheWallaby/timeline/2009/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2009_8\"><a href=\"/LawlabeeTheWallaby/timeline/2009/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2009_7\"><a href=\"/LawlabeeTheWallaby/timeline/2009/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2009_6\"><a href=\"/LawlabeeTheWallaby/timeline/2009/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2009_5\"><a href=\"/LawlabeeTheWallaby/timeline/2009/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2009_4\"><a href=\"/LawlabeeTheWallaby/timeline/2009/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2009_3\"><a href=\"/LawlabeeTheWallaby/timeline/2009/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2009_2\"><a href=\"/LawlabeeTheWallaby/timeline/2009/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2009_1\"><a href=\"/LawlabeeTheWallaby/timeline/2009/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2008\" class=\"clearfix\" data-rollup=\"2000s\" data-year=\"2008\"><a href=\"/LawlabeeTheWallaby/timeline/2008\" rel=\"ignore\" tabindex=\"-1\">2008</a><ul class=\"clearfix\"><li data-key=\"month_2008_12\"><a href=\"/LawlabeeTheWallaby/timeline/2008/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2008_11\"><a href=\"/LawlabeeTheWallaby/timeline/2008/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2008_10\"><a href=\"/LawlabeeTheWallaby/timeline/2008/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2008_9\"><a href=\"/LawlabeeTheWallaby/timeline/2008/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2008_8\"><a href=\"/LawlabeeTheWallaby/timeline/2008/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2008_7\"><a href=\"/LawlabeeTheWallaby/timeline/2008/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2008_6\"><a href=\"/LawlabeeTheWallaby/timeline/2008/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2008_5\"><a href=\"/LawlabeeTheWallaby/timeline/2008/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2008_4\"><a href=\"/LawlabeeTheWallaby/timeline/2008/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2008_3\"><a href=\"/LawlabeeTheWallaby/timeline/2008/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2008_2\"><a href=\"/LawlabeeTheWallaby/timeline/2008/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2008_1\"><a href=\"/LawlabeeTheWallaby/timeline/2008/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"way_back\"><a href=\"/LawlabeeTheWallaby/timeline#way_back\" rel=\"ignore\" tabindex=\"-1\">Born</a></li></ul> ";
// undefined
o83 = null;
// 7975
o82.parentNode = o16;
// 7977
f920654002_471.returns.push(o82);
// undefined
o82 = null;
// 7979
o82 = {};
// 7980
f920654002_427.returns.push(o82);
// 7981
// 7983
o83 = {};
// 7984
f920654002_425.returns.push(o83);
// 7985
o84 = {};
// undefined
fo920654002_1402_firstChild = function() { return fo920654002_1402_firstChild.returns[fo920654002_1402_firstChild.inst++]; };
fo920654002_1402_firstChild.returns = [];
fo920654002_1402_firstChild.inst = 0;
defineGetter(o82, "firstChild", fo920654002_1402_firstChild, undefined);
// undefined
o82 = null;
// undefined
fo920654002_1402_firstChild.returns.push(o84);
// 7987
o83.appendChild = f920654002_429;
// undefined
fo920654002_1402_firstChild.returns.push(o84);
// 7989
f920654002_429.returns.push(o84);
// undefined
fo920654002_1402_firstChild.returns.push(null);
// 7991
o75.appendChild = f920654002_429;
// 7992
f920654002_429.returns.push(o83);
// undefined
o83 = null;
// 7993
o75.getAttribute = f920654002_464;
// 7994
f920654002_464.returns.push(null);
// 7995
o75.setAttribute = f920654002_587;
// 7996
f920654002_587.returns.push(undefined);
// 7998
f920654002_418.returns.push(1373491956167);
// 8002
o82 = {};
// 8003
f920654002_425.returns.push(o82);
// 8005
f920654002_429.returns.push(o82);
// undefined
o82 = null;
// 8008
f920654002_418.returns.push(1373491956168);
// 8011
f920654002_418.returns.push(1373491956169);
// 8014
f920654002_418.returns.push(1373491956169);
// 8016
o82 = {};
// 8017
f920654002_467.returns.push(o82);
// 8019
o83 = {};
// 8020
f920654002_467.returns.push(o83);
// 8021
o85 = {};
// 8022
o83.firstChild = o85;
// 8024
o85.nodeType = 8;
// 8026
o85.nodeValue = " <div class=\"ego_column\"><div class=\"ego_section\" id=\"u_0_43\"><div class=\"uiHeader uiHeaderTopBorder mbs uiSideHeader\"><div class=\"clearfix uiHeaderTop\"><div class=\"rfloat\"><h6 class=\"accessible_elem\"><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><span class=\"adsCategoryTitleLink\">Sponsored</span></a></h6><a class=\"uiHeaderActions\" href=\"/ads/adboard/?type=normal\">See All</a></div><div><h6 class=\"uiHeaderTitle\" aria-hidden=\"true\"><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><span class=\"adsCategoryTitleLink\">Sponsored</span></a><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><i class=\"mls adsCategoryIcon img sp_9kaae3 sx_5f2560\"></i></a></h6></div></div></div><div class=\"ego_unit_container\"><div class=\"ego_unit\" data-ego-fbid=\"6008291652839\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6008291652839,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6008291652839-id_51ddd2e771eda6d54118611\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y-\\-\\El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA&amp;f=0&amp;ui=6008291652839-id_51ddd2e771eda6d54118611&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e6bfe0e5d9b269df6d42d72baf766d17092c5950d(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s5a02449fac5784b39e418919b809fd172268edbb\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e6bfe0e5d9b269df6d42d72baf766d17092c5950d(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5a02449fac5784b39e418919b809fd172268edbb_0\"), (s5a02449fac5784b39e418919b809fd172268edbb_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s5a02449fac5784b39e418919b809fd172268edbb_1_instance;\n            ((s5a02449fac5784b39e418919b809fd172268edbb_1_instance) = ((JSBNG_Record.eventInstance)((\"s5a02449fac5784b39e418919b809fd172268edbb_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5a02449fac5784b39e418919b809fd172268edbb_1\"), (s5a02449fac5784b39e418919b809fd172268edbb_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s5a02449fac5784b39e418919b809fd172268edbb_0_instance;\n    ((s5a02449fac5784b39e418919b809fd172268edbb_0_instance) = ((JSBNG_Record.eventInstance)((\"s5a02449fac5784b39e418919b809fd172268edbb_0\"))));\n    ((JSBNG_Record.markFunction)((e6bfe0e5d9b269df6d42d72baf766d17092c5950d)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y-\\-\\El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA&amp;f=1&amp;ui=6008291652839-id_51ddd2e771eda6d54118611&amp;en=1&amp;a=0&amp;sig=108870&amp;__tn__=wv\" onmousedown=\"return e6bfe0e5d9b269df6d42d72baf766d17092c5950d.call(this, event);\">Ready for Takeoff</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef824721c418800897226c991819206fa3cea1ea7(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef824721c418800897226c991819206fa3cea1ea7(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_0\"), (s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_1_instance;\n            ((s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_1_instance) = ((JSBNG_Record.eventInstance)((\"s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_1\"), (s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_0_instance;\n    ((s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_0_instance) = ((JSBNG_Record.eventInstance)((\"s4d625c1eb2c69da8a28a0d721ca7bc2326dd7f4d_0\"))));\n    ((JSBNG_Record.markFunction)((ef824721c418800897226c991819206fa3cea1ea7)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y-\\-\\El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA&amp;f=1&amp;ui=6008291652839-id_51ddd2e771eda6d54118611&amp;en=1&amp;a=0&amp;sig=94957&amp;__tn__=ywv\" onmousedown=\"return ef824721c418800897226c991819206fa3cea1ea7.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-prn1/s110x80/735355_6008290657639_943178325_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e55fc1c4dbbda9a35d76368974d9bcd03ce41d451(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s013320b82612f0b2d53068019d0ec1ff7abc062b\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e55fc1c4dbbda9a35d76368974d9bcd03ce41d451(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s013320b82612f0b2d53068019d0ec1ff7abc062b_0\"), (s013320b82612f0b2d53068019d0ec1ff7abc062b_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s013320b82612f0b2d53068019d0ec1ff7abc062b_1_instance;\n            ((s013320b82612f0b2d53068019d0ec1ff7abc062b_1_instance) = ((JSBNG_Record.eventInstance)((\"s013320b82612f0b2d53068019d0ec1ff7abc062b_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s013320b82612f0b2d53068019d0ec1ff7abc062b_1\"), (s013320b82612f0b2d53068019d0ec1ff7abc062b_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s013320b82612f0b2d53068019d0ec1ff7abc062b_0_instance;\n    ((s013320b82612f0b2d53068019d0ec1ff7abc062b_0_instance) = ((JSBNG_Record.eventInstance)((\"s013320b82612f0b2d53068019d0ec1ff7abc062b_0\"))));\n    ((JSBNG_Record.markFunction)((e55fc1c4dbbda9a35d76368974d9bcd03ce41d451)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y-\\-\\El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA&amp;f=1&amp;ui=6008291652839-id_51ddd2e771eda6d54118611&amp;en=1&amp;a=0&amp;sig=103873&amp;__tn__=xywv\" onmousedown=\"return e55fc1c4dbbda9a35d76368974d9bcd03ce41d451.call(this, event);\">Let imaginations soar with Walmart toys. &quot;Like&quot; us if you love to see them smile.</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y-\\-\\El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA&amp;f=0&amp;ui=6008291652839-id_51ddd2e771eda6d54118611&amp;en=fad_fan&amp;ed=159616034235&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">30,985,451 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e27807a6bb70bad21ce5501c50599fb08db1cda64(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e27807a6bb70bad21ce5501c50599fb08db1cda64(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_0\"), (sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_1_instance;\n            ((sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_1_instance) = ((JSBNG_Record.eventInstance)((\"sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_1\"), (sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_0_instance;\n    ((sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_0_instance) = ((JSBNG_Record.eventInstance)((\"sc226f6fd493e97d406bcf0b1739bf3f336a3d6a6_0\"))));\n    ((JSBNG_Record.markFunction)((e27807a6bb70bad21ce5501c50599fb08db1cda64)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y-\\-\\El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA&amp;f=1&amp;ui=6008291652839-id_51ddd2e771eda6d54118611&amp;en=fad_pageclick&amp;ed=159616034235&amp;a=0&amp;mac=AQLIi5fWBZIv4QdB&amp;sig=70741&amp;__tn__=zwv\" onmousedown=\"return e27807a6bb70bad21ce5501c50599fb08db1cda64.call(this, event);\">Walmart</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6008916062718\" id=\"u_0_44\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6008916062718,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6008916062718-id_51ddd2e771fc95836769755\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4&amp;f=0&amp;ui=6008916062718-id_51ddd2e771fc95836769755&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function effb6f66c2f8bfa9c774de0572f1f4b903d33c736(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s87f3a557196ecbac4a972c7bc3e40ea844054f22\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function effb6f66c2f8bfa9c774de0572f1f4b903d33c736(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s87f3a557196ecbac4a972c7bc3e40ea844054f22_0\"), (s87f3a557196ecbac4a972c7bc3e40ea844054f22_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s87f3a557196ecbac4a972c7bc3e40ea844054f22_1_instance;\n            ((s87f3a557196ecbac4a972c7bc3e40ea844054f22_1_instance) = ((JSBNG_Record.eventInstance)((\"s87f3a557196ecbac4a972c7bc3e40ea844054f22_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s87f3a557196ecbac4a972c7bc3e40ea844054f22_1\"), (s87f3a557196ecbac4a972c7bc3e40ea844054f22_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s87f3a557196ecbac4a972c7bc3e40ea844054f22_0_instance;\n    ((s87f3a557196ecbac4a972c7bc3e40ea844054f22_0_instance) = ((JSBNG_Record.eventInstance)((\"s87f3a557196ecbac4a972c7bc3e40ea844054f22_0\"))));\n    ((JSBNG_Record.markFunction)((effb6f66c2f8bfa9c774de0572f1f4b903d33c736)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4&amp;f=1&amp;ui=6008916062718-id_51ddd2e771fc95836769755&amp;en=1&amp;a=0&amp;sig=104055&amp;__tn__=wv\" onmousedown=\"return effb6f66c2f8bfa9c774de0572f1f4b903d33c736.call(this, event);\">Stop Obama&#039;s Surveillance</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e3b143759a1cfa03e377f1a8538d00ea03b2c292b(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s5c5b242bfc6c5ea276344b386d87baeb4aceb352\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e3b143759a1cfa03e377f1a8538d00ea03b2c292b(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5c5b242bfc6c5ea276344b386d87baeb4aceb352_0\"), (s5c5b242bfc6c5ea276344b386d87baeb4aceb352_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s5c5b242bfc6c5ea276344b386d87baeb4aceb352_1_instance;\n            ((s5c5b242bfc6c5ea276344b386d87baeb4aceb352_1_instance) = ((JSBNG_Record.eventInstance)((\"s5c5b242bfc6c5ea276344b386d87baeb4aceb352_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5c5b242bfc6c5ea276344b386d87baeb4aceb352_1\"), (s5c5b242bfc6c5ea276344b386d87baeb4aceb352_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s5c5b242bfc6c5ea276344b386d87baeb4aceb352_0_instance;\n    ((s5c5b242bfc6c5ea276344b386d87baeb4aceb352_0_instance) = ((JSBNG_Record.eventInstance)((\"s5c5b242bfc6c5ea276344b386d87baeb4aceb352_0\"))));\n    ((JSBNG_Record.markFunction)((e3b143759a1cfa03e377f1a8538d00ea03b2c292b)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4&amp;f=1&amp;ui=6008916062718-id_51ddd2e771fc95836769755&amp;en=1&amp;a=0&amp;sig=91146&amp;__tn__=ywv\" onmousedown=\"return e3b143759a1cfa03e377f1a8538d00ea03b2c292b.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.creative.xx.fbcdn.net/hads-prn1/s110x80/735332_6008915475118_1747800754_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2031d54daade93ed16cad9ff678f2016a98f92d4(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sfae6173a136b3aafe016eedddee0ed89b733c52c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2031d54daade93ed16cad9ff678f2016a98f92d4(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sfae6173a136b3aafe016eedddee0ed89b733c52c_0\"), (sfae6173a136b3aafe016eedddee0ed89b733c52c_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sfae6173a136b3aafe016eedddee0ed89b733c52c_1_instance;\n            ((sfae6173a136b3aafe016eedddee0ed89b733c52c_1_instance) = ((JSBNG_Record.eventInstance)((\"sfae6173a136b3aafe016eedddee0ed89b733c52c_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sfae6173a136b3aafe016eedddee0ed89b733c52c_1\"), (sfae6173a136b3aafe016eedddee0ed89b733c52c_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sfae6173a136b3aafe016eedddee0ed89b733c52c_0_instance;\n    ((sfae6173a136b3aafe016eedddee0ed89b733c52c_0_instance) = ((JSBNG_Record.eventInstance)((\"sfae6173a136b3aafe016eedddee0ed89b733c52c_0\"))));\n    ((JSBNG_Record.markFunction)((e2031d54daade93ed16cad9ff678f2016a98f92d4)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4&amp;f=1&amp;ui=6008916062718-id_51ddd2e771fc95836769755&amp;en=1&amp;a=0&amp;sig=94289&amp;__tn__=xywv\" onmousedown=\"return e2031d54daade93ed16cad9ff678f2016a98f92d4.call(this, event);\">Do You Support Obama’s Violation of Our Civil Liberties? Restrain the NSA – VOTE NOW!</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4&amp;f=0&amp;ui=6008916062718-id_51ddd2e771fc95836769755&amp;en=fad_fan&amp;ed=161616200566899&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">13,054 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e5abce5180d9019e145a117b6a019398ab614d9ee(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"scf08c5734aa03100f4a950513898b23061d3fd69\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e5abce5180d9019e145a117b6a019398ab614d9ee(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"scf08c5734aa03100f4a950513898b23061d3fd69_0\"), (scf08c5734aa03100f4a950513898b23061d3fd69_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var scf08c5734aa03100f4a950513898b23061d3fd69_1_instance;\n            ((scf08c5734aa03100f4a950513898b23061d3fd69_1_instance) = ((JSBNG_Record.eventInstance)((\"scf08c5734aa03100f4a950513898b23061d3fd69_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"scf08c5734aa03100f4a950513898b23061d3fd69_1\"), (scf08c5734aa03100f4a950513898b23061d3fd69_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var scf08c5734aa03100f4a950513898b23061d3fd69_0_instance;\n    ((scf08c5734aa03100f4a950513898b23061d3fd69_0_instance) = ((JSBNG_Record.eventInstance)((\"scf08c5734aa03100f4a950513898b23061d3fd69_0\"))));\n    ((JSBNG_Record.markFunction)((e5abce5180d9019e145a117b6a019398ab614d9ee)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4&amp;f=1&amp;ui=6008916062718-id_51ddd2e771fc95836769755&amp;en=fad_pageclick&amp;ed=161616200566899&amp;a=0&amp;mac=AQL09Nd4ZLGM81zn&amp;sig=66233&amp;__tn__=zwv\" onmousedown=\"return e5abce5180d9019e145a117b6a019398ab614d9ee.call(this, event);\">Jim Sensenbrenner for Congress</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6008172951099\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6008172951099,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6008172951099-id_51ddd2e77201f0726775246\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ&amp;f=0&amp;ui=6008172951099-id_51ddd2e77201f0726775246&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function edbc83e9ef5cc69370e74fd0915b06927ca713247(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s102fa6a6638895f5584a8c5945b76450de64a5c3\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function edbc83e9ef5cc69370e74fd0915b06927ca713247(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s102fa6a6638895f5584a8c5945b76450de64a5c3_0\"), (s102fa6a6638895f5584a8c5945b76450de64a5c3_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s102fa6a6638895f5584a8c5945b76450de64a5c3_1_instance;\n            ((s102fa6a6638895f5584a8c5945b76450de64a5c3_1_instance) = ((JSBNG_Record.eventInstance)((\"s102fa6a6638895f5584a8c5945b76450de64a5c3_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s102fa6a6638895f5584a8c5945b76450de64a5c3_1\"), (s102fa6a6638895f5584a8c5945b76450de64a5c3_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s102fa6a6638895f5584a8c5945b76450de64a5c3_0_instance;\n    ((s102fa6a6638895f5584a8c5945b76450de64a5c3_0_instance) = ((JSBNG_Record.eventInstance)((\"s102fa6a6638895f5584a8c5945b76450de64a5c3_0\"))));\n    ((JSBNG_Record.markFunction)((edbc83e9ef5cc69370e74fd0915b06927ca713247)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ&amp;f=1&amp;ui=6008172951099-id_51ddd2e77201f0726775246&amp;en=1&amp;a=0&amp;sig=108970&amp;__tn__=wv\" onmousedown=\"return edbc83e9ef5cc69370e74fd0915b06927ca713247.call(this, event);\">Wealthy College Generation</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ec2ade218d8e5d9f6bf01d071f2655dc684e74eb9(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s998c590a11b5311badf122a97660b1fdce90b929\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ec2ade218d8e5d9f6bf01d071f2655dc684e74eb9(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s998c590a11b5311badf122a97660b1fdce90b929_0\"), (s998c590a11b5311badf122a97660b1fdce90b929_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s998c590a11b5311badf122a97660b1fdce90b929_1_instance;\n            ((s998c590a11b5311badf122a97660b1fdce90b929_1_instance) = ((JSBNG_Record.eventInstance)((\"s998c590a11b5311badf122a97660b1fdce90b929_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s998c590a11b5311badf122a97660b1fdce90b929_1\"), (s998c590a11b5311badf122a97660b1fdce90b929_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s998c590a11b5311badf122a97660b1fdce90b929_0_instance;\n    ((s998c590a11b5311badf122a97660b1fdce90b929_0_instance) = ((JSBNG_Record.eventInstance)((\"s998c590a11b5311badf122a97660b1fdce90b929_0\"))));\n    ((JSBNG_Record.markFunction)((ec2ade218d8e5d9f6bf01d071f2655dc684e74eb9)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ&amp;f=1&amp;ui=6008172951099-id_51ddd2e77201f0726775246&amp;en=1&amp;a=0&amp;sig=90799&amp;__tn__=ywv\" onmousedown=\"return ec2ade218d8e5d9f6bf01d071f2655dc684e74eb9.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-ash3/s110x80/735327_6008172945099_561769449_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e388bf5e3f36d4cc50f6e2eb37d11123b9e8b1260(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s56a0c87931bc8b2b25dd117951d3814b39d7d45b\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e388bf5e3f36d4cc50f6e2eb37d11123b9e8b1260(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s56a0c87931bc8b2b25dd117951d3814b39d7d45b_0\"), (s56a0c87931bc8b2b25dd117951d3814b39d7d45b_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s56a0c87931bc8b2b25dd117951d3814b39d7d45b_1_instance;\n            ((s56a0c87931bc8b2b25dd117951d3814b39d7d45b_1_instance) = ((JSBNG_Record.eventInstance)((\"s56a0c87931bc8b2b25dd117951d3814b39d7d45b_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s56a0c87931bc8b2b25dd117951d3814b39d7d45b_1\"), (s56a0c87931bc8b2b25dd117951d3814b39d7d45b_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s56a0c87931bc8b2b25dd117951d3814b39d7d45b_0_instance;\n    ((s56a0c87931bc8b2b25dd117951d3814b39d7d45b_0_instance) = ((JSBNG_Record.eventInstance)((\"s56a0c87931bc8b2b25dd117951d3814b39d7d45b_0\"))));\n    ((JSBNG_Record.markFunction)((e388bf5e3f36d4cc50f6e2eb37d11123b9e8b1260)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ&amp;f=1&amp;ui=6008172951099-id_51ddd2e77201f0726775246&amp;en=1&amp;a=0&amp;sig=78305&amp;__tn__=xywv\" onmousedown=\"return e388bf5e3f36d4cc50f6e2eb37d11123b9e8b1260.call(this, event);\">Wealthy College Generation Group was created to assist college students to achieve...</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ&amp;f=0&amp;ui=6008172951099-id_51ddd2e77201f0726775246&amp;en=fad_fan&amp;ed=157994701055147&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">6 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ee16a43e82f518883a9f578b830c41b5362be08af(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sa835c1aa3289ddc54adf1094671cee5988d2ae3a\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ee16a43e82f518883a9f578b830c41b5362be08af(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sa835c1aa3289ddc54adf1094671cee5988d2ae3a_0\"), (sa835c1aa3289ddc54adf1094671cee5988d2ae3a_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sa835c1aa3289ddc54adf1094671cee5988d2ae3a_1_instance;\n            ((sa835c1aa3289ddc54adf1094671cee5988d2ae3a_1_instance) = ((JSBNG_Record.eventInstance)((\"sa835c1aa3289ddc54adf1094671cee5988d2ae3a_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sa835c1aa3289ddc54adf1094671cee5988d2ae3a_1\"), (sa835c1aa3289ddc54adf1094671cee5988d2ae3a_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sa835c1aa3289ddc54adf1094671cee5988d2ae3a_0_instance;\n    ((sa835c1aa3289ddc54adf1094671cee5988d2ae3a_0_instance) = ((JSBNG_Record.eventInstance)((\"sa835c1aa3289ddc54adf1094671cee5988d2ae3a_0\"))));\n    ((JSBNG_Record.markFunction)((ee16a43e82f518883a9f578b830c41b5362be08af)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ&amp;f=1&amp;ui=6008172951099-id_51ddd2e77201f0726775246&amp;en=fad_pageclick&amp;ed=157994701055147&amp;a=0&amp;mac=AQLDK5Go4LfJbf16&amp;sig=120040&amp;__tn__=zwv\" onmousedown=\"return ee16a43e82f518883a9f578b830c41b5362be08af.call(this, event);\">Wealthy College Generation</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6006539945625\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6006539945625,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6006539945625-id_51ddd2e7720713614103777\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL&amp;f=0&amp;ui=6006539945625-id_51ddd2e7720713614103777&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e73c0a262d69dbfedd0e7e81969a65d3cbc65dfb1(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sfdcd79359680d8d3090be69d2da45f6dc03b08c5\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e73c0a262d69dbfedd0e7e81969a65d3cbc65dfb1(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sfdcd79359680d8d3090be69d2da45f6dc03b08c5_0\"), (sfdcd79359680d8d3090be69d2da45f6dc03b08c5_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sfdcd79359680d8d3090be69d2da45f6dc03b08c5_1_instance;\n            ((sfdcd79359680d8d3090be69d2da45f6dc03b08c5_1_instance) = ((JSBNG_Record.eventInstance)((\"sfdcd79359680d8d3090be69d2da45f6dc03b08c5_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sfdcd79359680d8d3090be69d2da45f6dc03b08c5_1\"), (sfdcd79359680d8d3090be69d2da45f6dc03b08c5_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sfdcd79359680d8d3090be69d2da45f6dc03b08c5_0_instance;\n    ((sfdcd79359680d8d3090be69d2da45f6dc03b08c5_0_instance) = ((JSBNG_Record.eventInstance)((\"sfdcd79359680d8d3090be69d2da45f6dc03b08c5_0\"))));\n    ((JSBNG_Record.markFunction)((e73c0a262d69dbfedd0e7e81969a65d3cbc65dfb1)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL&amp;f=1&amp;ui=6006539945625-id_51ddd2e7720713614103777&amp;en=1&amp;a=0&amp;sig=82468&amp;__tn__=wv\" onmousedown=\"return e73c0a262d69dbfedd0e7e81969a65d3cbc65dfb1.call(this, event);\">Ray Catena Motor Cars</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ecf1f234b6a307a981b3f87ffe6c03ce8184e8d51(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ecf1f234b6a307a981b3f87ffe6c03ce8184e8d51(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_0\"), (s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_1_instance;\n            ((s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_1_instance) = ((JSBNG_Record.eventInstance)((\"s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_1\"), (s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_0_instance;\n    ((s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_0_instance) = ((JSBNG_Record.eventInstance)((\"s96faef1e3b1cf5dc90cf32721dc6a2c72e1f7f7f_0\"))));\n    ((JSBNG_Record.markFunction)((ecf1f234b6a307a981b3f87ffe6c03ce8184e8d51)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL&amp;f=1&amp;ui=6006539945625-id_51ddd2e7720713614103777&amp;en=1&amp;a=0&amp;sig=73696&amp;__tn__=ywv\" onmousedown=\"return ecf1f234b6a307a981b3f87ffe6c03ce8184e8d51.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.creative.xx.fbcdn.net/hads-prn1/s110x80/735350_6006539577425_227762081_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e1ccb2776f71320f127d454d22336570030b2aa0e(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"se496d78b62c7998f8d53a078c3380ddcb65294a1\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e1ccb2776f71320f127d454d22336570030b2aa0e(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"se496d78b62c7998f8d53a078c3380ddcb65294a1_0\"), (se496d78b62c7998f8d53a078c3380ddcb65294a1_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var se496d78b62c7998f8d53a078c3380ddcb65294a1_1_instance;\n            ((se496d78b62c7998f8d53a078c3380ddcb65294a1_1_instance) = ((JSBNG_Record.eventInstance)((\"se496d78b62c7998f8d53a078c3380ddcb65294a1_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"se496d78b62c7998f8d53a078c3380ddcb65294a1_1\"), (se496d78b62c7998f8d53a078c3380ddcb65294a1_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var se496d78b62c7998f8d53a078c3380ddcb65294a1_0_instance;\n    ((se496d78b62c7998f8d53a078c3380ddcb65294a1_0_instance) = ((JSBNG_Record.eventInstance)((\"se496d78b62c7998f8d53a078c3380ddcb65294a1_0\"))));\n    ((JSBNG_Record.markFunction)((e1ccb2776f71320f127d454d22336570030b2aa0e)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL&amp;f=1&amp;ui=6006539945625-id_51ddd2e7720713614103777&amp;en=1&amp;a=0&amp;sig=85217&amp;__tn__=xywv\" onmousedown=\"return e1ccb2776f71320f127d454d22336570030b2aa0e.call(this, event);\">Click LIKE if you love Ray Catena Luxury Cars!</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL&amp;f=0&amp;ui=6006539945625-id_51ddd2e7720713614103777&amp;en=fad_fan&amp;ed=330682376841&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">4,965 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e846eefcd45bdf96471a3f34a68a9fb858f03c3b4(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s4af9a2d65f831c36f9dae6c3137028f34ae20495\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e846eefcd45bdf96471a3f34a68a9fb858f03c3b4(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s4af9a2d65f831c36f9dae6c3137028f34ae20495_0\"), (s4af9a2d65f831c36f9dae6c3137028f34ae20495_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s4af9a2d65f831c36f9dae6c3137028f34ae20495_1_instance;\n            ((s4af9a2d65f831c36f9dae6c3137028f34ae20495_1_instance) = ((JSBNG_Record.eventInstance)((\"s4af9a2d65f831c36f9dae6c3137028f34ae20495_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s4af9a2d65f831c36f9dae6c3137028f34ae20495_1\"), (s4af9a2d65f831c36f9dae6c3137028f34ae20495_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s4af9a2d65f831c36f9dae6c3137028f34ae20495_0_instance;\n    ((s4af9a2d65f831c36f9dae6c3137028f34ae20495_0_instance) = ((JSBNG_Record.eventInstance)((\"s4af9a2d65f831c36f9dae6c3137028f34ae20495_0\"))));\n    ((JSBNG_Record.markFunction)((e846eefcd45bdf96471a3f34a68a9fb858f03c3b4)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL&amp;f=1&amp;ui=6006539945625-id_51ddd2e7720713614103777&amp;en=fad_pageclick&amp;ed=330682376841&amp;a=0&amp;mac=AQI8mnXpaORVsnGY&amp;sig=116121&amp;__tn__=zwv\" onmousedown=\"return e846eefcd45bdf96471a3f34a68a9fb858f03c3b4.call(this, event);\">Ray Catena Motor Cars</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6006155772461\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6006155772461,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6006155772461-id_51ddd2e7720bd7886061668\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM&amp;f=0&amp;ui=6006155772461-id_51ddd2e7720bd7886061668&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e4f6e0405a7f318ffbe101402f0ab7bcf31151734(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e4f6e0405a7f318ffbe101402f0ab7bcf31151734(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_0\"), (see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_1_instance;\n            ((see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_1_instance) = ((JSBNG_Record.eventInstance)((\"see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_1\"), (see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_0_instance;\n    ((see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_0_instance) = ((JSBNG_Record.eventInstance)((\"see5f12d05b0ca8d8ef7de2fe883b33a3ad259bf6_0\"))));\n    ((JSBNG_Record.markFunction)((e4f6e0405a7f318ffbe101402f0ab7bcf31151734)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM&amp;f=1&amp;ui=6006155772461-id_51ddd2e7720bd7886061668&amp;en=1&amp;a=0&amp;sig=105945&amp;__tn__=wv\" onmousedown=\"return e4f6e0405a7f318ffbe101402f0ab7bcf31151734.call(this, event);\">Win a Free iPad Mini!</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e3b6b4eb89d43d026096846f61d8b544aff40f239(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sc621c473d5a98e769ed1abe041d9c2b9d2c2be15\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e3b6b4eb89d43d026096846f61d8b544aff40f239(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_0\"), (sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_1_instance;\n            ((sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_1_instance) = ((JSBNG_Record.eventInstance)((\"sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_1\"), (sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_0_instance;\n    ((sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_0_instance) = ((JSBNG_Record.eventInstance)((\"sc621c473d5a98e769ed1abe041d9c2b9d2c2be15_0\"))));\n    ((JSBNG_Record.markFunction)((e3b6b4eb89d43d026096846f61d8b544aff40f239)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM&amp;f=1&amp;ui=6006155772461-id_51ddd2e7720bd7886061668&amp;en=1&amp;a=0&amp;sig=99173&amp;__tn__=ywv\" onmousedown=\"return e3b6b4eb89d43d026096846f61d8b544aff40f239.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-prn1/s110x80/735332_6006155739861_1453658194_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef287de8819702c3bf54eda33ee7f3ebd2326ed9d(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s945a018ef0e7a0d2e5c497f0771f529e542bb812\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef287de8819702c3bf54eda33ee7f3ebd2326ed9d(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s945a018ef0e7a0d2e5c497f0771f529e542bb812_0\"), (s945a018ef0e7a0d2e5c497f0771f529e542bb812_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s945a018ef0e7a0d2e5c497f0771f529e542bb812_1_instance;\n            ((s945a018ef0e7a0d2e5c497f0771f529e542bb812_1_instance) = ((JSBNG_Record.eventInstance)((\"s945a018ef0e7a0d2e5c497f0771f529e542bb812_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s945a018ef0e7a0d2e5c497f0771f529e542bb812_1\"), (s945a018ef0e7a0d2e5c497f0771f529e542bb812_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s945a018ef0e7a0d2e5c497f0771f529e542bb812_0_instance;\n    ((s945a018ef0e7a0d2e5c497f0771f529e542bb812_0_instance) = ((JSBNG_Record.eventInstance)((\"s945a018ef0e7a0d2e5c497f0771f529e542bb812_0\"))));\n    ((JSBNG_Record.markFunction)((ef287de8819702c3bf54eda33ee7f3ebd2326ed9d)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM&amp;f=1&amp;ui=6006155772461-id_51ddd2e7720bd7886061668&amp;en=1&amp;a=0&amp;sig=68854&amp;__tn__=xywv\" onmousedown=\"return ef287de8819702c3bf54eda33ee7f3ebd2326ed9d.call(this, event);\">Scorpion is giving away a free iPad Mini every month in 2013. No purchase necesary! </a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM&amp;f=0&amp;ui=6006155772461-id_51ddd2e7720bd7886061668&amp;en=fad_fan&amp;ed=210600052308280&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">24,085 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ea6ae2936d4eaff4b5a7076032ea79a1dc460f0df(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sce07dc94c3083a90abc567460b9dcc48d5b56ffe\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ea6ae2936d4eaff4b5a7076032ea79a1dc460f0df(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sce07dc94c3083a90abc567460b9dcc48d5b56ffe_0\"), (sce07dc94c3083a90abc567460b9dcc48d5b56ffe_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sce07dc94c3083a90abc567460b9dcc48d5b56ffe_1_instance;\n            ((sce07dc94c3083a90abc567460b9dcc48d5b56ffe_1_instance) = ((JSBNG_Record.eventInstance)((\"sce07dc94c3083a90abc567460b9dcc48d5b56ffe_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sce07dc94c3083a90abc567460b9dcc48d5b56ffe_1\"), (sce07dc94c3083a90abc567460b9dcc48d5b56ffe_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sce07dc94c3083a90abc567460b9dcc48d5b56ffe_0_instance;\n    ((sce07dc94c3083a90abc567460b9dcc48d5b56ffe_0_instance) = ((JSBNG_Record.eventInstance)((\"sce07dc94c3083a90abc567460b9dcc48d5b56ffe_0\"))));\n    ((JSBNG_Record.markFunction)((ea6ae2936d4eaff4b5a7076032ea79a1dc460f0df)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM&amp;f=1&amp;ui=6006155772461-id_51ddd2e7720bd7886061668&amp;en=fad_pageclick&amp;ed=210600052308280&amp;a=0&amp;mac=AQITWq7zvAzL-bPl&amp;sig=79697&amp;__tn__=zwv\" onmousedown=\"return ea6ae2936d4eaff4b5a7076032ea79a1dc460f0df.call(this, event);\">Scorpion Window Film</a>.</span></div></div></div></div></div></div></div></div> ";
// undefined
o85 = null;
// 8027
o83.parentNode = o16;
// 8029
f920654002_471.returns.push(o83);
// undefined
o83 = null;
// 8030
// 8031
o82.getAttribute = f920654002_464;
// 8032
f920654002_464.returns.push("u_0_2p");
// 8042
o83 = {};
// 8043
f920654002_467.returns.push(o83);
// 8044
o83.getAttribute = f920654002_464;
// 8045
f920654002_464.returns.push(null);
// 8046
o83.setAttribute = f920654002_587;
// 8047
f920654002_587.returns.push(undefined);
// 8048
f920654002_12.returns.push(1213);
// 8051
f920654002_418.returns.push(1373491956267);
// 8055
o85 = {};
// 8056
f920654002_425.returns.push(o85);
// 8058
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8061
f920654002_418.returns.push(1373491956269);
// 8064
f920654002_418.returns.push(1373491956269);
// 8067
f920654002_418.returns.push(1373491956270);
// 8070
f920654002_418.returns.push(1373491956271);
// 8074
f920654002_418.returns.push(1373491956273);
// 8079
o85 = {};
// 8080
f920654002_425.returns.push(o85);
// 8082
f920654002_418.returns.push(1373491956276);
// 8084
o86 = {};
// 8085
f920654002_427.returns.push(o86);
// 8086
// 8087
// 8088
// 8089
// 8090
// 8091
// 8092
o85.appendChild = f920654002_429;
// 8093
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8095
f920654002_418.returns.push(1373491956277);
// 8097
o86 = {};
// 8098
f920654002_427.returns.push(o86);
// 8099
// 8100
// 8101
// 8102
// 8103
// 8104
// 8106
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8108
f920654002_418.returns.push(1373491956278);
// 8110
o86 = {};
// 8111
f920654002_427.returns.push(o86);
// 8112
// 8113
// 8114
// 8115
// 8116
// 8117
// 8119
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8121
f920654002_418.returns.push(1373491956279);
// 8123
o86 = {};
// 8124
f920654002_427.returns.push(o86);
// 8125
// 8126
// 8127
// 8128
// 8129
// 8130
// 8132
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8134
f920654002_418.returns.push(1373491956287);
// 8136
o86 = {};
// 8137
f920654002_427.returns.push(o86);
// 8138
// 8139
// 8140
// 8141
// 8142
// 8143
// 8145
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8147
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8150
f920654002_418.returns.push(1373491956290);
// 8154
o85 = {};
// 8155
f920654002_425.returns.push(o85);
// 8157
f920654002_418.returns.push(1373491956291);
// 8159
o86 = {};
// 8160
f920654002_427.returns.push(o86);
// 8161
// 8162
// 8163
// 8164
// 8165
// 8166
// 8167
o85.appendChild = f920654002_429;
// 8168
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8170
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8173
f920654002_418.returns.push(1373491956293);
// 8177
o85 = {};
// 8178
f920654002_425.returns.push(o85);
// 8180
f920654002_418.returns.push(1373491956293);
// 8182
o86 = {};
// 8183
f920654002_427.returns.push(o86);
// 8184
// 8185
// 8186
// 8187
// 8188
// 8189
// 8190
o85.appendChild = f920654002_429;
// 8191
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8193
f920654002_418.returns.push(1373491956294);
// 8195
o86 = {};
// 8196
f920654002_427.returns.push(o86);
// 8197
// 8198
// 8199
// 8200
// 8201
// 8202
// 8204
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8206
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8209
f920654002_418.returns.push(1373491956296);
// 8213
o85 = {};
// 8214
f920654002_425.returns.push(o85);
// 8216
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8219
f920654002_418.returns.push(1373491956297);
// 8223
o85 = {};
// 8224
f920654002_425.returns.push(o85);
// 8226
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8229
f920654002_418.returns.push(1373491956308);
// 8233
o85 = {};
// 8234
f920654002_425.returns.push(o85);
// 8236
f920654002_418.returns.push(1373491956309);
// 8238
o86 = {};
// 8239
f920654002_427.returns.push(o86);
// 8240
// 8241
// 8242
// 8243
// 8244
// 8245
// 8246
o85.appendChild = f920654002_429;
// 8247
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8249
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8252
f920654002_418.returns.push(1373491956311);
// 8256
o85 = {};
// 8257
f920654002_425.returns.push(o85);
// 8259
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8262
f920654002_418.returns.push(1373491956312);
// 8265
f920654002_418.returns.push(1373491956317);
// 8269
o85 = {};
// 8270
f920654002_425.returns.push(o85);
// 8272
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8275
f920654002_418.returns.push(1373491956318);
// 8279
o85 = {};
// 8280
f920654002_425.returns.push(o85);
// 8282
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8285
f920654002_418.returns.push(1373491956320);
// 8289
o85 = {};
// 8290
f920654002_425.returns.push(o85);
// 8292
f920654002_418.returns.push(1373491956321);
// 8294
o86 = {};
// 8295
f920654002_427.returns.push(o86);
// 8296
// 8297
// 8298
// 8299
// 8300
// 8301
// 8302
o85.appendChild = f920654002_429;
// 8303
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8305
f920654002_418.returns.push(1373491956322);
// 8307
o86 = {};
// 8308
f920654002_427.returns.push(o86);
// 8309
// 8310
// 8311
// 8312
// 8313
// 8314
// 8316
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8318
f920654002_418.returns.push(1373491956322);
// 8320
o86 = {};
// 8321
f920654002_427.returns.push(o86);
// 8322
// 8323
// 8324
// 8325
// 8326
// 8327
// 8329
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8331
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8334
f920654002_418.returns.push(1373491956330);
// 8338
o85 = {};
// 8339
f920654002_425.returns.push(o85);
// 8341
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8344
f920654002_418.returns.push(1373491956331);
// 8348
o85 = {};
// 8349
f920654002_425.returns.push(o85);
// 8351
f920654002_418.returns.push(1373491956333);
// 8353
o86 = {};
// 8354
f920654002_427.returns.push(o86);
// 8355
// 8356
// 8357
// 8358
// 8359
// 8360
// 8361
o85.appendChild = f920654002_429;
// 8362
f920654002_429.returns.push(o86);
// undefined
o86 = null;
// 8364
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8367
f920654002_418.returns.push(1373491956334);
// 8370
f920654002_418.returns.push(1373491956334);
// 8374
o85 = {};
// 8375
f920654002_425.returns.push(o85);
// 8377
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8380
f920654002_418.returns.push(1373491956370);
// 8384
o85 = {};
// 8385
f920654002_425.returns.push(o85);
// 8387
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8390
f920654002_418.returns.push(1373491956372);
// 8394
o85 = {};
// 8395
f920654002_425.returns.push(o85);
// 8397
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8400
f920654002_418.returns.push(1373491956373);
// 8404
o85 = {};
// 8405
f920654002_425.returns.push(o85);
// 8407
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8410
f920654002_418.returns.push(1373491956374);
// 8414
o85 = {};
// 8415
f920654002_425.returns.push(o85);
// 8417
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8420
f920654002_418.returns.push(1373491956381);
// 8424
o85 = {};
// 8425
f920654002_425.returns.push(o85);
// 8427
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8430
f920654002_418.returns.push(1373491956382);
// 8434
o85 = {};
// 8435
f920654002_425.returns.push(o85);
// 8437
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8439
f920654002_418.returns.push(1373491956383);
// 8442
f920654002_418.returns.push(1373491956384);
// 8446
o85 = {};
// 8447
f920654002_425.returns.push(o85);
// 8449
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8453
o85 = {};
// 8454
f920654002_425.returns.push(o85);
// 8456
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8459
f920654002_418.returns.push(1373491956386);
// 8463
o85 = {};
// 8464
f920654002_425.returns.push(o85);
// 8466
f920654002_429.returns.push(o85);
// undefined
o85 = null;
// 8468
o85 = {};
// 8470
f920654002_1447 = function() { return f920654002_1447.returns[f920654002_1447.inst++]; };
f920654002_1447.returns = [];
f920654002_1447.inst = 0;
// 8471
o85._needsGripper = f920654002_1447;
// 8472
f920654002_1448 = function() { return f920654002_1448.returns[f920654002_1448.inst++]; };
f920654002_1448.returns = [];
f920654002_1448.inst = 0;
// 8473
o85._throttledComputeHeights = f920654002_1448;
// 8475
f920654002_418.returns.push(1373491956458);
// 8476
o41.clientHeight = 0;
// undefined
o41 = null;
// 8477
o54.offsetHeight = 0;
// undefined
o54 = null;
// 8478
o55.offsetHeight = 0;
// undefined
o55 = null;
// 8479
f920654002_12.returns.push(1214);
// 8480
f920654002_1448.returns.push(undefined);
// 8481
o85._gripperHeight = NaN;
// 8482
o85._trackHeight = 0;
// 8483
f920654002_1447.returns.push(false);
// 8484
f920654002_1449 = function() { return f920654002_1449.returns[f920654002_1449.inst++]; };
f920654002_1449.returns = [];
f920654002_1449.inst = 0;
// 8485
o85._throttledShowGripperAndShadows = f920654002_1449;
// 8487
f920654002_418.returns.push(1373491956458);
// 8489
f920654002_418.returns.push(1373491956459);
// 8490
o41 = {};
// 8491
o56.classList = o41;
// undefined
o56 = null;
// 8493
o41.add = f920654002_1038;
// undefined
o41 = null;
// 8494
f920654002_1038.returns.push(undefined);
// 8495
o53.scrollTop = 0;
// 8498
f920654002_1451 = function() { return f920654002_1451.returns[f920654002_1451.inst++]; };
f920654002_1451.returns = [];
f920654002_1451.inst = 0;
// 8499
o52.remove = f920654002_1451;
// undefined
o52 = null;
// 8500
f920654002_1451.returns.push(undefined);
// 8505
f920654002_1451.returns.push(undefined);
// 8506
f920654002_12.returns.push(1215);
// 8507
f920654002_1449.returns.push(undefined);
// 8508
o41 = {};
// 8510
o41._needsGripper = f920654002_1447;
// 8511
f920654002_1453 = function() { return f920654002_1453.returns[f920654002_1453.inst++]; };
f920654002_1453.returns = [];
f920654002_1453.inst = 0;
// 8512
o41._throttledComputeHeights = f920654002_1453;
// 8514
f920654002_418.returns.push(1373491956461);
// 8515
o40.clientHeight = 0;
// 8516
o45.offsetHeight = 0;
// undefined
o45 = null;
// 8517
o46.offsetHeight = 0;
// undefined
o46 = null;
// 8518
f920654002_12.returns.push(1216);
// 8519
f920654002_1453.returns.push(undefined);
// 8520
o41._gripperHeight = NaN;
// 8521
o41._trackHeight = 0;
// 8522
f920654002_1447.returns.push(false);
// 8523
f920654002_1454 = function() { return f920654002_1454.returns[f920654002_1454.inst++]; };
f920654002_1454.returns = [];
f920654002_1454.inst = 0;
// 8524
o41._throttledShowGripperAndShadows = f920654002_1454;
// 8526
f920654002_418.returns.push(1373491956466);
// 8528
f920654002_418.returns.push(1373491956466);
// 8529
o45 = {};
// 8530
o49.classList = o45;
// undefined
o49 = null;
// 8532
o45.add = f920654002_1038;
// undefined
o45 = null;
// 8533
f920654002_1038.returns.push(undefined);
// 8534
o44.scrollTop = 0;
// undefined
o44 = null;
// 8537
o35.remove = f920654002_1451;
// undefined
o35 = null;
// 8538
f920654002_1451.returns.push(undefined);
// 8543
f920654002_1451.returns.push(undefined);
// 8544
f920654002_12.returns.push(1217);
// 8545
f920654002_1454.returns.push(undefined);
// 8546
o35 = {};
// 8552
f920654002_418.returns.push(1373491956470);
// 8553
f920654002_1457 = function() { return f920654002_1457.returns[f920654002_1457.inst++]; };
f920654002_1457.returns = [];
f920654002_1457.inst = 0;
// 8554
o4.pushState = f920654002_1457;
// 8555
o0.JSBNG__URL = "http://jsbngssl.www.facebook.com/LawlabeeTheWallaby";
// 8556
f920654002_1458 = function() { return f920654002_1458.returns[f920654002_1458.inst++]; };
f920654002_1458.returns = [];
f920654002_1458.inst = 0;
// 8557
o4.replaceState = f920654002_1458;
// undefined
o4 = null;
// 8558
f920654002_1458.returns.push(undefined);
// 8559
f920654002_7.returns.push(undefined);
// 8560
f920654002_1459 = function() { return f920654002_1459.returns[f920654002_1459.inst++]; };
f920654002_1459.returns = [];
f920654002_1459.inst = 0;
// 8561
ow920654002.JSBNG__onpopstate = f920654002_1459;
// 8568
f920654002_419.returns.push(undefined);
// 8569
o0.JSBNG__onsubmit = null;
// 8574
o4 = {};
// 8576
o4._needsGripper = f920654002_1447;
// 8577
f920654002_1461 = function() { return f920654002_1461.returns[f920654002_1461.inst++]; };
f920654002_1461.returns = [];
f920654002_1461.inst = 0;
// 8578
o4._throttledComputeHeights = f920654002_1461;
// 8580
f920654002_418.returns.push(1373491956473);
// 8581
o60.clientHeight = 0;
// 8582
o64.offsetHeight = 0;
// 8583
o65.offsetHeight = 0;
// undefined
o65 = null;
// 8584
f920654002_12.returns.push(1218);
// 8585
f920654002_1461.returns.push(undefined);
// 8586
o4._gripperHeight = NaN;
// 8587
o4._trackHeight = 0;
// 8588
f920654002_1447.returns.push(false);
// 8589
f920654002_1462 = function() { return f920654002_1462.returns[f920654002_1462.inst++]; };
f920654002_1462.returns = [];
f920654002_1462.inst = 0;
// 8590
o4._throttledShowGripperAndShadows = f920654002_1462;
// 8592
f920654002_418.returns.push(1373491956474);
// 8594
f920654002_418.returns.push(1373491956474);
// 8595
o44 = {};
// 8596
o66.classList = o44;
// undefined
o66 = null;
// 8598
o44.add = f920654002_1038;
// undefined
o44 = null;
// 8599
f920654002_1038.returns.push(undefined);
// 8600
o62.scrollTop = 0;
// 8603
o61.remove = f920654002_1451;
// 8604
f920654002_1451.returns.push(undefined);
// 8609
f920654002_1451.returns.push(undefined);
// 8610
f920654002_12.returns.push(1219);
// 8611
f920654002_1462.returns.push(undefined);
// 8620
o0.title = "Gregor Richards";
// 8622
o1._ua_log = "{\"log\":[{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491908504,\"iref\":\"timeline_recent\",\"index\":10},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491909064,\"iref\":\"timeline_recent\",\"index\":11},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491915535,\"iref\":\"timeline_recent\",\"index\":12},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491916655,\"iref\":\"timeline_recent\",\"index\":13},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491917976,\"iref\":\"timeline_recent\",\"index\":14},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491902956,\"iref\":\"side_ads\",\"index\":5},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491905010,\"iref\":\"escape_hatch\",\"index\":6},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491905945,\"iref\":\"escape_hatch\",\"index\":7},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491906573,\"iref\":\"escape_hatch\",\"index\":8},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491908036,\"iref\":\"timeline_recent\",\"index\":9}],\"len\":15}";
// undefined
o1 = null;
// 8625
f920654002_418.returns.push(1373491956502);
// 8629
o16.__FB_TOKEN = void 0;
// 8630
// 8631
o16.getAttribute = f920654002_464;
// 8632
o16.hasAttribute = f920654002_465;
// 8634
f920654002_465.returns.push(false);
// 8635
o16.JSBNG__addEventListener = f920654002_419;
// 8637
f920654002_419.returns.push(undefined);
// 8638
o16.JSBNG__onclick = null;
// 8641
ow920654002.JSBNG__requestAnimationFrame = undefined;
// 8642
f920654002_50.returns.push(0);
// 8644
f920654002_50.returns.push(1);
// 8647
f920654002_418.returns.push(1373491956511);
// 8651
f920654002_7.returns.push(undefined);
// 8652
ow920654002.JSBNG__onJSBNG__focus = undefined;
// 8657
f920654002_419.returns.push(undefined);
// 8658
o8.JSBNG__onDOMMouseScroll = void 0;
// 8665
f920654002_419.returns.push(undefined);
// 8666
o8.JSBNG__onmousemove = null;
// 8670
o1 = {};
// 8671
f920654002_0.returns.push(o1);
// undefined
o1 = null;
// 8673
f920654002_418.returns.push(1373491956516);
// 8675
f920654002_433.returns.push("[\"06rS\",1373491901947,\"act\",1373491901888,2,\"http://jsbngssl.www.facebook.com/ajax/emu/end.php?eid=AQLgw9ocP_9TWGArQAzp8r9Fn-4iBqeST4m7X7wF6Tnt8lseskab4rHsyEVMvLme_HWLbbvxUyijS-1x1a9m2yfU53I1_RZiu7XhYPrGdFnD4OCOzrhNfVBdoi1v6M6z29uklCQXtqqK7MwwqGIv5txnH_fDHB1M7V-RlXFctiweexvft5xMaI9xgYIEpIdwZqF-jGFZWoJa5w1cQ3MWRvsijpNjo1jK5aoesrF32OTkmE5CfMK0UgkJNo8NIhHPh65my-Y-qhGnNz11rXPlLWpYHBguLi_hu2HORgl7TjnqE3CWOP4NU9uisPqAwDx1cMtCkdKsXkyPt4a_WB5awXMkEuvSklgbHFZXUC2GjPUfaii4DJNZEX_lrd4YGEuwwQzk8qfWwkOcVBDuno4Q6NjXtbWi6sX8GwvxejN4Sgi44vFEKPkr5eBrYI52XiXpjtsHHM0YtKvaJQak_WhoQUVzfA7dfpThbf61bfqITr-pLpuOWons34Qp6uJIjlwwhMsnPDfhvdgaXR78PxixHQYOoTesaVBU3ouyR9_wj_4UOQ__jzDSlY6y_ertjIWrh4FZFuMMUnyFCJQ0LFYV9OauArLopi1DNzywrp24QSSOuIOVXhgIVHTUj38sD_vb_Bvu4MkgDUslsIh7Hcb3ezXnRhW1R2HsjBtIepCes77WU60JhQqG9S-ql8LCcSL9NEKypVMaiRvToOONaHwNrzDyj_TBwyj_Nd3aEJChZL3E-4RD6UasVOGhEAXT4z1wa3pw6tmtCRs_wFP08GIps9FxA2BHv_FA9Mf6DGDgcnCnkjikdREmBnrlDKS-IMhecxhUrT17mDTXdun4vkCscDLN1HaPL2b0BQ4Q3uad844THWR8Fba8Y0dYi6NM_x7fi27q5SF-ql0BzZegmVM6Suk9KA3Vvt5RC-wjwhO_uwg3DvXhPNq6N37A5EHqSIEVXVO_UvDxBHE-DqLrhrfeXrJbhaOwE0PRlp6cX2eRkVebpRFB_d6kIPh8ReoR2rPvoGxrlMsM8RhM701B3VK0NqQS5wgIDh-IwSVHFGwFqZG1fCDovmQ68r6K98gfS0KX7KLG0yj72vLZn2VuflmipwwZAN3ib6zpNzvPN69Pd0Q9XFnWQe5-XrLZWIxmut9dc__UCE-_MMtKo1QBu1IYXA4Uq4ljwUVd-SNYp9m-5TDqHLvXkMLRKxz6dqlBMZhdhgpYeyxNMsFmmopx2a1pxP7VeBu0FF2R5gcm4Q1XQaFB3n16iyDZo1XgavtyLpp_40M&f=1&ui=6008916062318-id_51ddd2580caf17174380166&en=1&a=0&sig=77356&__tn__=ywv\",\"click\",\"click\",\"side_ads\",\"r\",\"/LawlabeeTheWallaby\",{\"ft\":{},\"gt\":{}},0,0,0,0,16]");
// 8677
f920654002_433.returns.push("[\"06rS\",1373491901996,\"act\",1373491901971,3,\"http://jsbngssl.www.facebook.com/ajax/emu/end.php?eid=AQLgw9ocP_9TWGArQAzp8r9Fn-4iBqeST4m7X7wF6Tnt8lseskab4rHsyEVMvLme_HWLbbvxUyijS-1x1a9m2yfU53I1_RZiu7XhYPrGdFnD4OCOzrhNfVBdoi1v6M6z29uklCQXtqqK7MwwqGIv5txnH_fDHB1M7V-RlXFctiweexvft5xMaI9xgYIEpIdwZqF-jGFZWoJa5w1cQ3MWRvsijpNjo1jK5aoesrF32OTkmE5CfMK0UgkJNo8NIhHPh65my-Y-qhGnNz11rXPlLWpYHBguLi_hu2HORgl7TjnqE3CWOP4NU9uisPqAwDx1cMtCkdKsXkyPt4a_WB5awXMkEuvSklgbHFZXUC2GjPUfaii4DJNZEX_lrd4YGEuwwQzk8qfWwkOcVBDuno4Q6NjXtbWi6sX8GwvxejN4Sgi44vFEKPkr5eBrYI52XiXpjtsHHM0YtKvaJQak_WhoQUVzfA7dfpThbf61bfqITr-pLpuOWons34Qp6uJIjlwwhMsnPDfhvdgaXR78PxixHQYOoTesaVBU3ouyR9_wj_4UOQ__jzDSlY6y_ertjIWrh4FZFuMMUnyFCJQ0LFYV9OauArLopi1DNzywrp24QSSOuIOVXhgIVHTUj38sD_vb_Bvu4MkgDUslsIh7Hcb3ezXnRhW1R2HsjBtIepCes77WU60JhQqG9S-ql8LCcSL9NEKypVMaiRvToOONaHwNrzDyj_TBwyj_Nd3aEJChZL3E-4RD6UasVOGhEAXT4z1wa3pw6tmtCRs_wFP08GIps9FxA2BHv_FA9Mf6DGDgcnCnkjikdREmBnrlDKS-IMhecxhUrT17mDTXdun4vkCscDLN1HaPL2b0BQ4Q3uad844THWR8Fba8Y0dYi6NM_x7fi27q5SF-ql0BzZegmVM6Suk9KA3Vvt5RC-wjwhO_uwg3DvXhPNq6N37A5EHqSIEVXVO_UvDxBHE-DqLrhrfeXrJbhaOwE0PRlp6cX2eRkVebpRFB_d6kIPh8ReoR2rPvoGxrlMsM8RhM701B3VK0NqQS5wgIDh-IwSVHFGwFqZG1fCDovmQ68r6K98gfS0KX7KLG0yj72vLZn2VuflmipwwZAN3ib6zpNzvPN69Pd0Q9XFnWQe5-XrLZWIxmut9dc__UCE-_MMtKo1QBu1IYXA4Uq4ljwUVd-SNYp9m-5TDqHLvXkMLRKxz6dqlBMZhdhgpYeyxNMsFmmopx2a1pxP7VeBu0FF2R5gcm4Q1XQaFB3n16iyDZo1XgavtyLpp_40M&f=1&ui=6008916062318-id_51ddd2580caf17174380166&en=1&a=0&sig=77356&__tn__=ywv\",\"a\",\"click\",\"side_ads\",\"r\",\"/LawlabeeTheWallaby\",{\"ft\":{},\"gt\":{}},0,0,0,0,16]");
// 8679
f920654002_433.returns.push("[\"06rS\",1373491904052,\"act\",1373491904036,4,\"http://jsbngssl.www.facebook.com/ajax/emu/end.php?eid=AQLgw9ocP_9TWGArQAzp8r9Fn-4iBqeST4m7X7wF6Tnt8lseskab4rHsyEVMvLme_HWLbbvxUyijS-1x1a9m2yfU53I1_RZiu7XhYPrGdFnD4OCOzrhNfVBdoi1v6M6z29uklCQXtqqK7MwwqGIv5txnH_fDHB1M7V-RlXFctiweexvft5xMaI9xgYIEpIdwZqF-jGFZWoJa5w1cQ3MWRvsijpNjo1jK5aoesrF32OTkmE5CfMK0UgkJNo8NIhHPh65my-Y-qhGnNz11rXPlLWpYHBguLi_hu2HORgl7TjnqE3CWOP4NU9uisPqAwDx1cMtCkdKsXkyPt4a_WB5awXMkEuvSklgbHFZXUC2GjPUfaii4DJNZEX_lrd4YGEuwwQzk8qfWwkOcVBDuno4Q6NjXtbWi6sX8GwvxejN4Sgi44vFEKPkr5eBrYI52XiXpjtsHHM0YtKvaJQak_WhoQUVzfA7dfpThbf61bfqITr-pLpuOWons34Qp6uJIjlwwhMsnPDfhvdgaXR78PxixHQYOoTesaVBU3ouyR9_wj_4UOQ__jzDSlY6y_ertjIWrh4FZFuMMUnyFCJQ0LFYV9OauArLopi1DNzywrp24QSSOuIOVXhgIVHTUj38sD_vb_Bvu4MkgDUslsIh7Hcb3ezXnRhW1R2HsjBtIepCes77WU60JhQqG9S-ql8LCcSL9NEKypVMaiRvToOONaHwNrzDyj_TBwyj_Nd3aEJChZL3E-4RD6UasVOGhEAXT4z1wa3pw6tmtCRs_wFP08GIps9FxA2BHv_FA9Mf6DGDgcnCnkjikdREmBnrlDKS-IMhecxhUrT17mDTXdun4vkCscDLN1HaPL2b0BQ4Q3uad844THWR8Fba8Y0dYi6NM_x7fi27q5SF-ql0BzZegmVM6Suk9KA3Vvt5RC-wjwhO_uwg3DvXhPNq6N37A5EHqSIEVXVO_UvDxBHE-DqLrhrfeXrJbhaOwE0PRlp6cX2eRkVebpRFB_d6kIPh8ReoR2rPvoGxrlMsM8RhM701B3VK0NqQS5wgIDh-IwSVHFGwFqZG1fCDovmQ68r6K98gfS0KX7KLG0yj72vLZn2VuflmipwwZAN3ib6zpNzvPN69Pd0Q9XFnWQe5-XrLZWIxmut9dc__UCE-_MMtKo1QBu1IYXA4Uq4ljwUVd-SNYp9m-5TDqHLvXkMLRKxz6dqlBMZhdhgpYeyxNMsFmmopx2a1pxP7VeBu0FF2R5gcm4Q1XQaFB3n16iyDZo1XgavtyLpp_40M&f=1&ui=6008916062318-id_51ddd2580caf17174380166&en=1&a=0&sig=77356&__tn__=ywv\",\"click\",\"click\",\"side_ads\",\"r\",\"/LawlabeeTheWallaby\",{\"ft\":{},\"gt\":{}},0,0,0,0,16]");
// 8681
f920654002_433.returns.push("4;1");
// 8683
f920654002_433.returns.push("{\"log\":[{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491908504,\"iref\":\"timeline_recent\",\"index\":10},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491909064,\"iref\":\"timeline_recent\",\"index\":11},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491915535,\"iref\":\"timeline_recent\",\"index\":12},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491916655,\"iref\":\"timeline_recent\",\"index\":13},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491917976,\"iref\":\"timeline_recent\",\"index\":14},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491902956,\"iref\":\"side_ads\",\"index\":5},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491905010,\"iref\":\"escape_hatch\",\"index\":6},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491905945,\"iref\":\"escape_hatch\",\"index\":7},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491906573,\"iref\":\"escape_hatch\",\"index\":8},{\"path\":\"/profile_book.php\",\"type\":\"click\",\"ts\":1373491908036,\"iref\":\"timeline_recent\",\"index\":9}],\"len\":15}");
// 8685
f920654002_418.returns.push(1373491956521);
// 8687
o1 = {};
// 8688
f920654002_56.returns.push(o1);
// 8689
// 8690
f920654002_1466 = function() { return f920654002_1466.returns[f920654002_1466.inst++]; };
f920654002_1466.returns = [];
f920654002_1466.inst = 0;
// 8691
o1.open = f920654002_1466;
// 8692
f920654002_1466.returns.push(undefined);
// 8693
f920654002_1467 = function() { return f920654002_1467.returns[f920654002_1467.inst++]; };
f920654002_1467.returns = [];
f920654002_1467.inst = 0;
// 8694
o1.setRequestHeader = f920654002_1467;
// 8695
f920654002_1467.returns.push(undefined);
// 8698
f920654002_1467.returns.push(undefined);
// 8699
f920654002_1468 = function() { return f920654002_1468.returns[f920654002_1468.inst++]; };
f920654002_1468.returns = [];
f920654002_1468.inst = 0;
// 8700
o1.send = f920654002_1468;
// 8701
f920654002_1468.returns.push(undefined);
// 8704
o44 = {};
// 8705
f920654002_467.returns.push(o44);
// 8706
o44.nodeName = "FORM";
// 8707
o44.__FB_TOKEN = void 0;
// 8708
// 8709
o44.getAttribute = f920654002_464;
// 8710
o44.hasAttribute = f920654002_465;
// 8712
f920654002_465.returns.push(false);
// 8713
o44.JSBNG__addEventListener = f920654002_419;
// 8715
f920654002_419.returns.push(undefined);
// 8716
f920654002_1470 = function() { return f920654002_1470.returns[f920654002_1470.inst++]; };
f920654002_1470.returns = [];
f920654002_1470.inst = 0;
// 8717
o44.JSBNG__onsubmit = f920654002_1470;
// 8720
// undefined
o44 = null;
// 8724
o44 = {};
// 8725
o45 = {};
// 8727
o44.transport = o1;
// 8728
o1.readyState = 1;
// undefined
o1 = null;
// 8729
o1 = {};
// 8730
o46 = {};
// 8732
o1.length = 1;
// 8733
o1["0"] = "63VzN";
// 8740
f920654002_418.returns.push(1373491956545);
// 8741
f920654002_12.returns.push(1220);
// 8742
o49 = {};
// 8743
o52 = {};
// 8745
o49.length = 1;
// 8746
o49["0"] = "4vv8/";
// 8752
ow920654002.JSBNG__random = undefined;
// 8753
f920654002_417.returns.push(0.32539017405360937);
// 8754
o5.pathname = "/LawlabeeTheWallaby";
// 8756
f920654002_418.returns.push(1373491956613);
// 8760
f920654002_12.returns.push(1221);
// 8764
o54 = {};
// 8765
f920654002_467.returns.push(o54);
// 8766
o54.nodeName = "A";
// 8767
o54.__FB_TOKEN = void 0;
// 8768
// 8769
o54.getAttribute = f920654002_464;
// 8770
o54.hasAttribute = f920654002_465;
// 8772
f920654002_465.returns.push(false);
// 8773
o54.JSBNG__addEventListener = f920654002_419;
// 8775
f920654002_419.returns.push(undefined);
// 8776
f920654002_1478 = function() { return f920654002_1478.returns[f920654002_1478.inst++]; };
f920654002_1478.returns = [];
f920654002_1478.inst = 0;
// 8777
o54.JSBNG__onclick = f920654002_1478;
// 8780
// 8784
o72.__FB_TOKEN = void 0;
// 8785
// undefined
o72 = null;
// 8786
o73.getElementsByTagName = f920654002_453;
// 8788
o73.querySelectorAll = f920654002_462;
// undefined
o73 = null;
// 8789
o55 = {};
// 8790
f920654002_462.returns.push(o55);
// 8791
o55.length = 0;
// undefined
o55 = null;
// 8795
o55 = {};
// 8796
f920654002_462.returns.push(o55);
// 8797
o55.length = 0;
// undefined
o55 = null;
// 8802
o55 = {};
// 8803
o56 = {};
// 8805
o55.length = 1;
// 8806
o55["0"] = "u//Ut";
// 8815
o65 = {};
// 8816
f920654002_467.returns.push(o65);
// 8817
o65.getElementsByTagName = f920654002_453;
// 8819
o65.querySelectorAll = f920654002_462;
// 8820
o66 = {};
// 8821
f920654002_462.returns.push(o66);
// 8822
o66.length = 1;
// 8823
o72 = {};
// 8824
o66["0"] = o72;
// undefined
o66 = null;
// 8827
o66 = {};
// 8828
f920654002_467.returns.push(o66);
// 8829
o66.getElementsByTagName = f920654002_453;
// 8831
o66.querySelectorAll = f920654002_462;
// undefined
o66 = null;
// 8832
o66 = {};
// 8833
f920654002_462.returns.push(o66);
// 8834
o66.length = 1;
// 8835
o73 = {};
// 8836
o66["0"] = o73;
// undefined
o66 = null;
// 8839
o66 = {};
// 8840
f920654002_467.returns.push(o66);
// 8841
o66.getElementsByTagName = f920654002_453;
// 8843
o66.querySelectorAll = f920654002_462;
// 8844
o86 = {};
// 8845
f920654002_462.returns.push(o86);
// 8846
o86.length = 1;
// 8847
o87 = {};
// 8848
o86["0"] = o87;
// undefined
o86 = null;
// 8851
o86 = {};
// 8852
f920654002_427.returns.push(o86);
// 8853
// 8854
// 8855
o86.getElementsByTagName = f920654002_453;
// 8856
o88 = {};
// 8857
f920654002_453.returns.push(o88);
// 8858
o88.length = 0;
// undefined
o88 = null;
// 8860
o88 = {};
// 8861
o86.childNodes = o88;
// undefined
o86 = null;
// 8862
o88.item = f920654002_456;
// 8863
o88.length = 1;
// 8864
o86 = {};
// 8865
o88["0"] = o86;
// undefined
o88 = null;
// undefined
o86 = null;
// 8867
o86 = {};
// 8868
f920654002_427.returns.push(o86);
// 8869
// 8870
// 8871
o86.getElementsByTagName = f920654002_453;
// 8872
o88 = {};
// 8873
f920654002_453.returns.push(o88);
// 8874
o88.length = 0;
// undefined
o88 = null;
// 8876
o88 = {};
// 8877
o86.childNodes = o88;
// undefined
o86 = null;
// 8878
o88.item = f920654002_456;
// 8879
o88.length = 1;
// 8880
o86 = {};
// 8881
o88["0"] = o86;
// undefined
o88 = null;
// undefined
o86 = null;
// 8883
o86 = {};
// 8884
f920654002_427.returns.push(o86);
// 8885
// 8886
// 8887
o86.getElementsByTagName = f920654002_453;
// 8888
o88 = {};
// 8889
f920654002_453.returns.push(o88);
// 8890
o88.length = 0;
// undefined
o88 = null;
// 8892
o88 = {};
// 8893
o86.childNodes = o88;
// undefined
o86 = null;
// 8894
o88.item = f920654002_456;
// 8895
o88.length = 1;
// 8896
o86 = {};
// 8897
o88["0"] = o86;
// undefined
o88 = null;
// undefined
o86 = null;
// 8899
o86 = {};
// 8900
f920654002_427.returns.push(o86);
// 8901
// 8902
// 8903
o86.getElementsByTagName = f920654002_453;
// 8904
o88 = {};
// 8905
f920654002_453.returns.push(o88);
// 8906
o88.length = 0;
// undefined
o88 = null;
// 8908
o88 = {};
// 8909
o86.childNodes = o88;
// undefined
o86 = null;
// 8910
o88.item = f920654002_456;
// 8911
o88.length = 1;
// 8912
o86 = {};
// 8913
o88["0"] = o86;
// undefined
o88 = null;
// undefined
o86 = null;
// 8915
o86 = {};
// 8916
f920654002_427.returns.push(o86);
// 8917
// 8918
// 8919
o86.getElementsByTagName = f920654002_453;
// 8920
o88 = {};
// 8921
f920654002_453.returns.push(o88);
// 8922
o88.length = 0;
// undefined
o88 = null;
// 8924
o88 = {};
// 8925
o86.childNodes = o88;
// undefined
o86 = null;
// 8926
o88.item = f920654002_456;
// 8927
o88.length = 1;
// 8928
o86 = {};
// 8929
o88["0"] = o86;
// undefined
o88 = null;
// undefined
o86 = null;
// 8931
o86 = {};
// 8932
f920654002_427.returns.push(o86);
// 8933
// 8934
// 8935
o86.getElementsByTagName = f920654002_453;
// 8936
o88 = {};
// 8937
f920654002_453.returns.push(o88);
// 8938
o88.length = 0;
// undefined
o88 = null;
// 8940
o88 = {};
// 8941
o86.childNodes = o88;
// undefined
o86 = null;
// 8942
o88.item = f920654002_456;
// 8943
o88.length = 1;
// 8944
o86 = {};
// 8945
o88["0"] = o86;
// undefined
o88 = null;
// undefined
o86 = null;
// 8950
o86 = {};
// 8951
f920654002_467.returns.push(o86);
// undefined
o86 = null;
// 8955
o86 = {};
// 8956
f920654002_467.returns.push(o86);
// undefined
o86 = null;
// 8958
o86 = {};
// 8959
o16.classList = o86;
// 8961
f920654002_1519 = function() { return f920654002_1519.returns[f920654002_1519.inst++]; };
f920654002_1519.returns = [];
f920654002_1519.inst = 0;
// 8962
o86.contains = f920654002_1519;
// undefined
o86 = null;
// 8963
f920654002_1519.returns.push(false);
// 8966
o86 = {};
// 8967
f920654002_467.returns.push(o86);
// 8969
o88 = {};
// 8970
f920654002_467.returns.push(o88);
// 8973
o86.__FB_TOKEN = void 0;
// 8974
// 8977
o89 = {};
// 8978
f920654002_467.returns.push(o89);
// undefined
o89 = null;
// 8980
o89 = {};
// 8981
f920654002_467.returns.push(o89);
// 8983
o90 = {};
// 8984
f920654002_467.returns.push(o90);
// undefined
o90 = null;
// 8986
o90 = {};
// 8987
f920654002_467.returns.push(o90);
// 8989
o91 = {};
// 8990
f920654002_467.returns.push(o91);
// 8991
o89.getElementsByTagName = f920654002_453;
// 8993
o89.querySelectorAll = f920654002_462;
// 8994
o92 = {};
// 8995
f920654002_462.returns.push(o92);
// 8996
o92.length = 1;
// 8997
o93 = {};
// 8998
o92["0"] = o93;
// undefined
o92 = null;
// 9000
o92 = {};
// 9001
f920654002_427.returns.push(o92);
// undefined
o92 = null;
// 9002
o93.nodeName = "INPUT";
// 9003
o93.__FB_TOKEN = void 0;
// 9004
// 9005
o93.getAttribute = f920654002_464;
// 9006
o93.hasAttribute = f920654002_465;
// 9008
f920654002_465.returns.push(false);
// 9009
o93.JSBNG__addEventListener = f920654002_419;
// 9011
f920654002_419.returns.push(undefined);
// 9012
o93.JSBNG__onkeyup = null;
// 9014
o90.nodeName = "A";
// 9015
o90.__FB_TOKEN = void 0;
// 9016
// 9017
o90.getAttribute = f920654002_464;
// 9018
o90.hasAttribute = f920654002_465;
// 9020
f920654002_465.returns.push(false);
// 9021
o90.JSBNG__addEventListener = f920654002_419;
// 9023
f920654002_419.returns.push(undefined);
// 9024
o90.JSBNG__onclick = null;
// undefined
o90 = null;
// 9026
o93.tabIndex = 0;
// 9027
// 9028
f920654002_1530 = function() { return f920654002_1530.returns[f920654002_1530.inst++]; };
f920654002_1530.returns = [];
f920654002_1530.inst = 0;
// 9029
o93.JSBNG__focus = f920654002_1530;
// undefined
o93 = null;
// 9030
f920654002_1530.returns.push(undefined);
// 9031
o90 = {};
// 9032
o89.classList = o90;
// 9034
o90.contains = f920654002_1519;
// undefined
o90 = null;
// 9035
f920654002_1519.returns.push(false);
// 9036
o90 = {};
// 9037
o89.parentNode = o90;
// undefined
o89 = null;
// 9038
o89 = {};
// 9039
o90.classList = o89;
// 9041
o89.contains = f920654002_1519;
// undefined
o89 = null;
// 9042
f920654002_1519.returns.push(false);
// 9043
o89 = {};
// 9044
o90.parentNode = o89;
// undefined
o90 = null;
// 9045
o90 = {};
// 9046
o89.classList = o90;
// 9048
o90.contains = f920654002_1519;
// undefined
o90 = null;
// 9049
f920654002_1519.returns.push(false);
// 9050
o89.parentNode = o86;
// undefined
o89 = null;
// 9051
o89 = {};
// 9052
o86.classList = o89;
// 9054
o89.contains = f920654002_1519;
// undefined
o89 = null;
// 9055
f920654002_1519.returns.push(false);
// 9056
o86.parentNode = o88;
// undefined
o86 = null;
// 9057
o86 = {};
// 9058
o88.classList = o86;
// 9060
o86.contains = f920654002_1519;
// undefined
o86 = null;
// 9061
f920654002_1519.returns.push(true);
// 9062
o91.nodeName = "A";
// 9063
o91.__FB_TOKEN = void 0;
// 9064
// 9065
o91.getAttribute = f920654002_464;
// 9066
o91.hasAttribute = f920654002_465;
// 9068
f920654002_465.returns.push(false);
// 9069
o91.JSBNG__addEventListener = f920654002_419;
// 9071
f920654002_419.returns.push(undefined);
// 9072
o91.JSBNG__onclick = null;
// undefined
o91 = null;
// 9074
o88.getElementsByTagName = f920654002_453;
// 9076
o88.querySelectorAll = f920654002_462;
// undefined
o88 = null;
// 9077
o86 = {};
// 9078
f920654002_462.returns.push(o86);
// 9079
o86.length = 1;
// 9080
o88 = {};
// 9081
o86["0"] = o88;
// undefined
o86 = null;
// 9082
o88.nodeName = "A";
// 9083
o88.__FB_TOKEN = void 0;
// 9084
// 9085
o88.getAttribute = f920654002_464;
// 9086
o88.hasAttribute = f920654002_465;
// 9088
f920654002_465.returns.push(false);
// 9089
o88.JSBNG__addEventListener = f920654002_419;
// 9091
f920654002_419.returns.push(undefined);
// 9092
o88.JSBNG__onclick = null;
// undefined
o88 = null;
// 9097
o86 = {};
// 9098
f920654002_467.returns.push(o86);
// undefined
o86 = null;
// 9109
o86 = {};
// 9110
f920654002_467.returns.push(o86);
// 9112
o88 = {};
// 9113
f920654002_467.returns.push(o88);
// 9114
o88.__FB_TOKEN = void 0;
// 9115
// undefined
o88 = null;
// 9120
o86.getElementsByTagName = f920654002_453;
// 9122
o86.querySelectorAll = f920654002_462;
// undefined
o86 = null;
// 9123
o86 = {};
// 9124
f920654002_462.returns.push(o86);
// 9125
o86.length = 1;
// 9126
o88 = {};
// 9127
o86["0"] = o88;
// undefined
o86 = null;
// 9129
o88.nodeName = "INPUT";
// 9130
o88.__FB_TOKEN = void 0;
// 9131
// 9132
o88.getAttribute = f920654002_464;
// 9133
o88.hasAttribute = f920654002_465;
// 9135
f920654002_465.returns.push(false);
// 9136
o88.JSBNG__addEventListener = f920654002_419;
// 9138
f920654002_419.returns.push(undefined);
// 9139
o88.JSBNG__onJSBNG__focus = void 0;
// undefined
o88 = null;
// 9142
o86 = {};
// 9143
o88 = {};
// 9145
o86.length = 1;
// 9146
o86["0"] = "hfrQl";
// 9152
f920654002_13.returns.push(1222);
// 9153
o3.onLine = true;
// 9154
f920654002_7.returns.push(undefined);
// 9155
f920654002_7.returns.push(undefined);
// 9157
f920654002_418.returns.push(1373491957652);
// 9158
o89 = {};
// 9159
o90 = {};
// 9161
o89.length = 1;
// 9162
o89["0"] = "C6rJk";
// 9167
f920654002_467.returns.push(o72);
// 9169
f920654002_467.returns.push(o65);
// 9172
f920654002_418.returns.push(1373491957656);
// 9183
o65.getAttributeNode = f920654002_458;
// 9185
o91 = {};
// 9186
f920654002_458.returns.push(o91);
// 9187
o91.value = "fbMessagesJewel";
// undefined
o91 = null;
// 9190
o91 = {};
// 9191
f920654002_453.returns.push(o91);
// 9192
o91.length = 41;
// 9193
o92 = {};
// 9194
o91["0"] = o92;
// 9195
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9197
f920654002_458.returns.push(null);
// 9199
o92 = {};
// 9200
o91["1"] = o92;
// 9201
o92.getAttributeNode = f920654002_458;
// 9203
o93 = {};
// 9204
f920654002_458.returns.push(o93);
// 9205
o93.value = "mercurymessagesCountWrapper";
// undefined
o93 = null;
// 9207
o93 = {};
// 9208
o91["2"] = o93;
// undefined
o91 = null;
// 9209
o93.getAttributeNode = f920654002_458;
// 9211
o91 = {};
// 9212
f920654002_458.returns.push(o91);
// 9213
o91.value = "mercurymessagesCountValue";
// undefined
o91 = null;
// 9215
o65.contains = f920654002_646;
// 9217
f920654002_646.returns.push(true);
// 9222
o91 = {};
// 9223
f920654002_462.returns.push(o91);
// 9224
o91.length = 1;
// 9225
o91["0"] = o92;
// undefined
o91 = null;
// 9227
o92.querySelectorAll = f920654002_462;
// undefined
o92 = null;
// 9228
o91 = {};
// 9229
f920654002_462.returns.push(o91);
// 9230
o91.length = 1;
// 9231
o91["0"] = o93;
// undefined
o91 = null;
// 9232
o91 = {};
// undefined
fo920654002_1554_firstChild = function() { return fo920654002_1554_firstChild.returns[fo920654002_1554_firstChild.inst++]; };
fo920654002_1554_firstChild.returns = [];
fo920654002_1554_firstChild.inst = 0;
defineGetter(o93, "firstChild", fo920654002_1554_firstChild, undefined);
// undefined
fo920654002_1554_firstChild.returns.push(o91);
// undefined
fo920654002_1554_firstChild.returns.push(o91);
// 9235
o91.parentNode = o93;
// 9237
o93.removeChild = f920654002_471;
// 9238
f920654002_471.returns.push(o91);
// undefined
o91 = null;
// undefined
fo920654002_1554_firstChild.returns.push(null);
// 9241
o91 = {};
// 9242
f920654002_425.returns.push(o91);
// 9243
f920654002_1560 = function() { return f920654002_1560.returns[f920654002_1560.inst++]; };
f920654002_1560.returns = [];
f920654002_1560.inst = 0;
// 9244
o0.createTextNode = f920654002_1560;
// 9245
o92 = {};
// 9246
f920654002_1560.returns.push(o92);
// 9247
o91.appendChild = f920654002_429;
// 9248
f920654002_429.returns.push(o92);
// undefined
o92 = null;
// 9249
o93.appendChild = f920654002_429;
// undefined
o93 = null;
// 9250
f920654002_429.returns.push(o91);
// undefined
o91 = null;
// 9251
o91 = {};
// 9252
o65.classList = o91;
// undefined
o65 = null;
// 9254
o91.remove = f920654002_1451;
// 9255
f920654002_1451.returns.push(undefined);
// 9258
o72.getElementsByTagName = f920654002_453;
// 9259
o72.getAttributeNode = f920654002_458;
// 9261
o65 = {};
// 9262
f920654002_458.returns.push(o65);
// 9263
o65.value = "fbMessagesFlyout";
// undefined
o65 = null;
// 9266
o65 = {};
// 9267
f920654002_453.returns.push(o65);
// 9268
o65.length = 36;
// 9269
o92 = {};
// 9270
o65["0"] = o92;
// 9271
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9273
f920654002_458.returns.push(null);
// 9275
o92 = {};
// 9276
o65["1"] = o92;
// 9277
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9279
f920654002_458.returns.push(null);
// 9281
o92 = {};
// 9282
o65["2"] = o92;
// 9283
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9285
f920654002_458.returns.push(null);
// 9287
o92 = {};
// 9288
o65["3"] = o92;
// 9289
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9291
f920654002_458.returns.push(null);
// 9293
o92 = {};
// 9294
o65["4"] = o92;
// 9295
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9297
f920654002_458.returns.push(null);
// 9299
o92 = {};
// 9300
o65["5"] = o92;
// 9301
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9303
f920654002_458.returns.push(null);
// 9305
o92 = {};
// 9306
o65["6"] = o92;
// 9307
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9309
f920654002_458.returns.push(null);
// 9311
o92 = {};
// 9312
o65["7"] = o92;
// 9313
o92.getAttributeNode = f920654002_458;
// undefined
o92 = null;
// 9315
f920654002_458.returns.push(null);
// 9317
o65["8"] = o54;
// 9318
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9320
o54 = {};
// 9321
f920654002_458.returns.push(o54);
// 9322
o54.value = "u_0_4";
// undefined
o54 = null;
// 9324
o54 = {};
// 9325
o65["9"] = o54;
// 9326
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9328
f920654002_458.returns.push(null);
// 9330
o54 = {};
// 9331
o65["10"] = o54;
// 9332
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9334
f920654002_458.returns.push(null);
// 9336
o54 = {};
// 9337
o65["11"] = o54;
// 9338
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9340
f920654002_458.returns.push(null);
// 9342
o54 = {};
// 9343
o65["12"] = o54;
// 9344
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9346
f920654002_458.returns.push(null);
// 9348
o54 = {};
// 9349
o65["13"] = o54;
// 9350
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9352
f920654002_458.returns.push(null);
// 9354
o54 = {};
// 9355
o65["14"] = o54;
// 9356
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9358
f920654002_458.returns.push(null);
// 9360
o54 = {};
// 9361
o65["15"] = o54;
// 9362
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 9364
f920654002_458.returns.push(null);
// 9366
o65["16"] = o40;
// undefined
o65 = null;
// 9367
o40.getAttributeNode = f920654002_458;
// undefined
o40 = null;
// 9369
o40 = {};
// 9370
f920654002_458.returns.push(o40);
// 9371
o40.value = "MercuryJewelThreadList";
// undefined
o40 = null;
// 9373
o72.contains = f920654002_646;
// undefined
o72 = null;
// 9375
f920654002_646.returns.push(true);
// 9378
o91.contains = f920654002_1519;
// undefined
o91 = null;
// 9379
f920654002_1519.returns.push(false);
// 9383
f920654002_418.returns.push(1373491957762);
// 9386
f920654002_467.returns.push(o73);
// 9388
f920654002_467.returns.push(null);
// 9390
f920654002_467.returns.push(null);
// 9391
o73.nodeName = "DIV";
// 9392
o73.__FB_TOKEN = void 0;
// 9393
// 9394
o73.getAttribute = f920654002_464;
// 9395
o73.hasAttribute = f920654002_465;
// 9397
f920654002_465.returns.push(false);
// 9398
o73.JSBNG__addEventListener = f920654002_419;
// 9400
f920654002_419.returns.push(undefined);
// 9401
o73.JSBNG__onsubmit = null;
// 9403
o73.getElementsByTagName = f920654002_453;
// 9405
o73.querySelectorAll = f920654002_462;
// undefined
o73 = null;
// 9406
o40 = {};
// 9407
f920654002_462.returns.push(o40);
// 9408
o40.length = 0;
// undefined
o40 = null;
// 9411
f920654002_467.returns.push(o66);
// 9413
o40 = {};
// 9414
f920654002_467.returns.push(o40);
// 9416
f920654002_467.returns.push(o87);
// 9417
o87.getElementsByTagName = f920654002_453;
// 9419
o87.querySelectorAll = f920654002_462;
// undefined
o87 = null;
// 9420
o54 = {};
// 9421
f920654002_462.returns.push(o54);
// 9422
o54.length = 1;
// 9423
o65 = {};
// 9424
o54["0"] = o65;
// undefined
o54 = null;
// undefined
o65 = null;
// 9426
o54 = {};
// 9427
f920654002_467.returns.push(o54);
// undefined
o54 = null;
// 9429
// 9436
o54 = {};
// 9437
f920654002_462.returns.push(o54);
// 9438
o54.length = 1;
// 9439
o65 = {};
// 9440
o54["0"] = o65;
// undefined
o54 = null;
// 9442
o65.querySelectorAll = f920654002_462;
// 9443
o54 = {};
// 9444
f920654002_462.returns.push(o54);
// 9445
o54.length = 1;
// 9446
o72 = {};
// 9447
o54["0"] = o72;
// undefined
o54 = null;
// 9448
o54 = {};
// undefined
fo920654002_1590_firstChild = function() { return fo920654002_1590_firstChild.returns[fo920654002_1590_firstChild.inst++]; };
fo920654002_1590_firstChild.returns = [];
fo920654002_1590_firstChild.inst = 0;
defineGetter(o72, "firstChild", fo920654002_1590_firstChild, undefined);
// undefined
fo920654002_1590_firstChild.returns.push(o54);
// undefined
fo920654002_1590_firstChild.returns.push(o54);
// 9451
o54.parentNode = o72;
// 9453
o72.removeChild = f920654002_471;
// 9454
f920654002_471.returns.push(o54);
// undefined
o54 = null;
// undefined
fo920654002_1590_firstChild.returns.push(null);
// 9457
o54 = {};
// 9458
f920654002_425.returns.push(o54);
// 9460
o73 = {};
// 9461
f920654002_1560.returns.push(o73);
// 9462
o54.appendChild = f920654002_429;
// 9463
f920654002_429.returns.push(o73);
// undefined
o73 = null;
// 9464
o72.appendChild = f920654002_429;
// 9465
f920654002_429.returns.push(o54);
// undefined
o54 = null;
// 9466
o54 = {};
// 9467
o66.classList = o54;
// 9469
o54.remove = f920654002_1451;
// 9470
f920654002_1451.returns.push(undefined);
// 9472
// 9473
o66.__FB_TOKEN = void 0;
// 9474
// 9475
o66.getAttribute = f920654002_464;
// 9476
o66.hasAttribute = f920654002_465;
// 9478
f920654002_465.returns.push(false);
// 9481
o54.contains = f920654002_1519;
// undefined
o54 = null;
// 9482
f920654002_1519.returns.push(false);
// 9485
f920654002_464.returns.push(null);
// 9486
o54 = {};
// 9487
o66.parentNode = o54;
// 9488
o54.__FB_TOKEN = void 0;
// 9489
// 9490
o54.getAttribute = f920654002_464;
// 9491
o54.hasAttribute = f920654002_465;
// 9493
f920654002_465.returns.push(false);
// 9494
o73 = {};
// 9495
o54.classList = o73;
// 9497
o73.contains = f920654002_1519;
// undefined
o73 = null;
// 9498
f920654002_1519.returns.push(false);
// 9501
f920654002_464.returns.push(null);
// 9502
o73 = {};
// 9503
o54.parentNode = o73;
// undefined
o54 = null;
// 9504
o73.__FB_TOKEN = void 0;
// 9505
// 9506
o73.getAttribute = f920654002_464;
// 9507
o73.hasAttribute = f920654002_465;
// 9509
f920654002_465.returns.push(false);
// 9510
o54 = {};
// 9511
o73.classList = o54;
// 9513
o54.contains = f920654002_1519;
// undefined
o54 = null;
// 9514
f920654002_1519.returns.push(false);
// 9517
f920654002_464.returns.push(null);
// 9518
o54 = {};
// 9519
o73.parentNode = o54;
// undefined
o73 = null;
// 9520
o54.__FB_TOKEN = void 0;
// 9521
// 9522
o54.getAttribute = f920654002_464;
// 9523
o54.hasAttribute = f920654002_465;
// 9525
f920654002_465.returns.push(false);
// 9526
o73 = {};
// 9527
o54.classList = o73;
// 9529
o73.contains = f920654002_1519;
// undefined
o73 = null;
// 9530
f920654002_1519.returns.push(false);
// 9533
f920654002_464.returns.push(null);
// 9534
o73 = {};
// 9535
o54.parentNode = o73;
// 9536
o73.__FB_TOKEN = void 0;
// 9537
// 9538
o73.getAttribute = f920654002_464;
// 9539
o73.hasAttribute = f920654002_465;
// 9541
f920654002_465.returns.push(false);
// 9542
o87 = {};
// 9543
o73.classList = o87;
// 9545
o87.contains = f920654002_1519;
// undefined
o87 = null;
// 9546
f920654002_1519.returns.push(false);
// 9549
f920654002_464.returns.push(null);
// 9550
o87 = {};
// 9551
o73.parentNode = o87;
// 9552
o87.__FB_TOKEN = void 0;
// 9553
// 9554
o87.getAttribute = f920654002_464;
// 9555
o87.hasAttribute = f920654002_465;
// 9557
f920654002_465.returns.push(false);
// 9558
o91 = {};
// 9559
o87.classList = o91;
// 9561
o91.contains = f920654002_1519;
// undefined
o91 = null;
// 9562
f920654002_1519.returns.push(false);
// 9565
f920654002_464.returns.push(null);
// 9566
o91 = {};
// 9567
o87.parentNode = o91;
// 9568
o91.__FB_TOKEN = void 0;
// 9569
// 9570
o91.getAttribute = f920654002_464;
// 9571
o91.hasAttribute = f920654002_465;
// 9573
f920654002_465.returns.push(false);
// 9574
o92 = {};
// 9575
o91.classList = o92;
// 9577
o92.contains = f920654002_1519;
// undefined
o92 = null;
// 9578
f920654002_1519.returns.push(false);
// 9581
f920654002_464.returns.push(null);
// 9582
o91.parentNode = o16;
// 9586
f920654002_465.returns.push(false);
// 9590
f920654002_1519.returns.push(false);
// 9593
f920654002_464.returns.push(null);
// 9594
o16.parentNode = o8;
// 9598
f920654002_465.returns.push(false);
// 9599
o92 = {};
// 9600
o8.classList = o92;
// 9602
o92.contains = f920654002_1519;
// 9603
f920654002_1519.returns.push(false);
// 9606
f920654002_464.returns.push(null);
// 9607
o8.parentNode = o0;
// 9609
o0.classList = void 0;
// 9610
o0.className = void 0;
// 9612
o0.parentNode = null;
// 9613
f920654002_12.returns.push(1223);
// 9617
o93 = {};
// 9618
f920654002_462.returns.push(o93);
// 9619
o93.length = 1;
// 9620
o93["0"] = o65;
// undefined
o93 = null;
// undefined
o65 = null;
// 9623
o65 = {};
// 9624
f920654002_462.returns.push(o65);
// 9625
o65.length = 1;
// 9626
o65["0"] = o72;
// undefined
o65 = null;
// undefined
o72 = null;
// 9627
o40.nodeName = "UL";
// 9628
o40.__FB_TOKEN = void 0;
// 9629
// 9630
o40.getAttribute = f920654002_464;
// 9631
o40.hasAttribute = f920654002_465;
// 9633
f920654002_465.returns.push(false);
// 9634
o40.JSBNG__addEventListener = f920654002_419;
// 9636
f920654002_419.returns.push(undefined);
// 9637
o40.JSBNG__onmousedown = null;
// 9642
f920654002_419.returns.push(undefined);
// 9643
o40.JSBNG__onmouseout = null;
// 9648
f920654002_419.returns.push(undefined);
// 9649
o40.JSBNG__onmouseover = null;
// 9651
o66.nodeName = "DIV";
// 9655
f920654002_465.returns.push(false);
// 9656
o66.JSBNG__addEventListener = f920654002_419;
// 9658
f920654002_419.returns.push(undefined);
// 9659
o66.JSBNG__onmouseover = null;
// 9662
f920654002_467.returns.push(o66);
// undefined
o66 = null;
// 9666
o65 = {};
// 9667
f920654002_462.returns.push(o65);
// 9668
o65.length = 1;
// 9669
o65["0"] = o53;
// undefined
o65 = null;
// undefined
o53 = null;
// 9673
o53 = {};
// 9674
f920654002_462.returns.push(o53);
// 9675
o53.length = 1;
// 9676
o65 = {};
// 9677
o53["0"] = o65;
// undefined
o53 = null;
// 9679
o65.querySelectorAll = f920654002_462;
// 9680
o53 = {};
// 9681
f920654002_462.returns.push(o53);
// 9682
o53.length = 1;
// 9683
o66 = {};
// 9684
o53["0"] = o66;
// undefined
o53 = null;
// 9685
o53 = {};
// 9686
o66.classList = o53;
// 9688
o53.contains = f920654002_1519;
// undefined
o53 = null;
// 9689
f920654002_1519.returns.push(false);
// 9690
o53 = {};
// 9691
o66.parentNode = o53;
// 9692
o72 = {};
// 9693
o53.classList = o72;
// 9695
o72.contains = f920654002_1519;
// undefined
o72 = null;
// 9696
f920654002_1519.returns.push(false);
// 9697
o53.parentNode = o65;
// undefined
o53 = null;
// 9698
o53 = {};
// 9699
o65.classList = o53;
// undefined
o65 = null;
// 9701
o53.contains = f920654002_1519;
// undefined
o53 = null;
// 9702
f920654002_1519.returns.push(true);
// 9704
o66.nodeName = "A";
// 9705
o66.__FB_TOKEN = void 0;
// 9706
// 9707
o66.getAttribute = f920654002_464;
// 9708
o66.hasAttribute = f920654002_465;
// 9710
f920654002_465.returns.push(false);
// 9711
o66.JSBNG__addEventListener = f920654002_419;
// 9713
f920654002_419.returns.push(undefined);
// 9714
o66.JSBNG__onsuccess = void 0;
// 9716
f920654002_12.returns.push(1224);
// 9720
f920654002_465.returns.push(false);
// 9724
f920654002_1519.returns.push(false);
// 9727
f920654002_464.returns.push(null);
// 9732
f920654002_465.returns.push(false);
// 9736
f920654002_1519.returns.push(false);
// 9739
f920654002_464.returns.push(null);
// 9744
f920654002_465.returns.push(false);
// 9748
f920654002_1519.returns.push(false);
// 9751
f920654002_464.returns.push(null);
// 9756
f920654002_465.returns.push(false);
// 9760
f920654002_1519.returns.push(false);
// 9763
f920654002_464.returns.push(null);
// 9768
f920654002_465.returns.push(false);
// 9772
f920654002_1519.returns.push(false);
// 9775
f920654002_464.returns.push(null);
// 9780
f920654002_465.returns.push(false);
// 9784
f920654002_1519.returns.push(false);
// 9787
f920654002_464.returns.push(null);
// 9792
f920654002_465.returns.push(false);
// 9796
f920654002_1519.returns.push(false);
// 9799
f920654002_464.returns.push(null);
// 9804
f920654002_465.returns.push(false);
// 9808
f920654002_1519.returns.push(false);
// 9811
f920654002_464.returns.push(null);
// 9816
f920654002_465.returns.push(false);
// 9820
f920654002_1519.returns.push(false);
// 9823
f920654002_464.returns.push(null);
// 9830
o40.getElementsByTagName = f920654002_453;
// 9832
o40.querySelectorAll = f920654002_462;
// undefined
o40 = null;
// 9833
o40 = {};
// 9834
f920654002_462.returns.push(o40);
// 9835
o40.length = 0;
// undefined
o40 = null;
// 9842
f920654002_418.returns.push(1373491957855);
// 9844
f920654002_418.returns.push(1373491957856);
// 9847
f920654002_418.returns.push(1373491957858);
// 9849
f920654002_418.returns.push(1373491957858);
// 9852
f920654002_418.returns.push(1373491957862);
// 9855
f920654002_418.returns.push(1373491957863);
// 9857
f920654002_418.returns.push(1373491957863);
// 9870
o40 = {};
// 9871
f920654002_467.returns.push(o40);
// 9872
o53 = {};
// 9873
o40.style = o53;
// undefined
o40 = null;
// 9874
// undefined
o53 = null;
// 9876
f920654002_467.returns.push(o25);
// 9877
o25.firstChild = null;
// undefined
o25 = null;
// 9879
o8.clientHeight = 702;
// 9881
o8.scrollWidth = 1024;
// 9891
o25 = {};
// 9892
f920654002_467.returns.push(o25);
// 9893
o40 = {};
// 9894
o25.classList = o40;
// 9896
o40.contains = f920654002_1519;
// undefined
o40 = null;
// 9897
f920654002_1519.returns.push(false);
// 9898
o40 = {};
// 9899
o25.parentNode = o40;
// 9900
o53 = {};
// 9901
o40.classList = o53;
// 9903
o53.contains = f920654002_1519;
// undefined
o53 = null;
// 9904
f920654002_1519.returns.push(true);
// 9905
o25.getElementsByTagName = f920654002_453;
// 9907
o25.querySelectorAll = f920654002_462;
// 9908
o53 = {};
// 9909
f920654002_462.returns.push(o53);
// 9910
o53.length = 1;
// 9911
o53["0"] = o23;
// undefined
o53 = null;
// undefined
o23 = null;
// 9914
o23 = {};
// 9915
f920654002_467.returns.push(o23);
// 9918
f920654002_467.returns.push(o23);
// 9922
o53 = {};
// 9923
f920654002_467.returns.push(o53);
// 9924
o53.nodeName = "A";
// 9925
o53.__FB_TOKEN = void 0;
// 9926
// 9927
o53.getAttribute = f920654002_464;
// 9928
o53.hasAttribute = f920654002_465;
// 9930
f920654002_465.returns.push(false);
// 9931
o53.JSBNG__addEventListener = f920654002_419;
// 9933
f920654002_419.returns.push(undefined);
// 9934
o53.JSBNG__onclick = null;
// undefined
o53 = null;
// 9938
f920654002_467.returns.push(o76);
// undefined
o76 = null;
// 9940
o53 = {};
// 9941
f920654002_467.returns.push(o53);
// 9943
f920654002_418.returns.push(1373491958001);
// 9948
o65 = {};
// 9949
f920654002_467.returns.push(o65);
// 9950
o65.nodeName = "A";
// 9951
o65.__FB_TOKEN = void 0;
// 9952
// 9953
o65.getAttribute = f920654002_464;
// 9954
o65.hasAttribute = f920654002_465;
// 9956
f920654002_465.returns.push(false);
// 9957
o65.JSBNG__addEventListener = f920654002_419;
// 9959
f920654002_419.returns.push(undefined);
// 9960
o65.JSBNG__onclick = null;
// undefined
o65 = null;
// 9964
f920654002_467.returns.push(o74);
// undefined
o74 = null;
// 9968
o65 = {};
// 9969
f920654002_467.returns.push(o65);
// 9970
o65.nodeName = "A";
// 9971
o65.__FB_TOKEN = void 0;
// 9972
// 9973
o65.getAttribute = f920654002_464;
// 9974
o65.hasAttribute = f920654002_465;
// 9976
f920654002_465.returns.push(false);
// 9977
o65.JSBNG__addEventListener = f920654002_419;
// 9979
f920654002_419.returns.push(undefined);
// 9980
o65.JSBNG__onclick = null;
// undefined
o65 = null;
// 9984
f920654002_467.returns.push(o77);
// undefined
o77 = null;
// 9988
o65 = {};
// 9989
f920654002_467.returns.push(o65);
// 9990
o65.nodeName = "A";
// 9991
o65.__FB_TOKEN = void 0;
// 9992
// 9993
o65.getAttribute = f920654002_464;
// 9994
o65.hasAttribute = f920654002_465;
// 9996
f920654002_465.returns.push(false);
// 9997
o65.JSBNG__addEventListener = f920654002_419;
// 9999
f920654002_419.returns.push(undefined);
// 10000
o65.JSBNG__onclick = null;
// undefined
o65 = null;
// 10004
f920654002_467.returns.push(o80);
// undefined
o80 = null;
// 10008
o65 = {};
// 10009
f920654002_467.returns.push(o65);
// 10010
o65.nodeName = "A";
// 10011
o65.__FB_TOKEN = void 0;
// 10012
// 10013
o65.getAttribute = f920654002_464;
// 10014
o65.hasAttribute = f920654002_465;
// 10016
f920654002_465.returns.push(false);
// 10017
o65.JSBNG__addEventListener = f920654002_419;
// 10019
f920654002_419.returns.push(undefined);
// 10020
o65.JSBNG__onclick = null;
// undefined
o65 = null;
// 10024
f920654002_467.returns.push(o81);
// undefined
o81 = null;
// 10027
o65 = {};
// 10028
f920654002_467.returns.push(o65);
// 10029
o65.nodeName = "A";
// 10030
o65.__FB_TOKEN = void 0;
// 10031
// 10032
o65.getAttribute = f920654002_464;
// 10033
o65.hasAttribute = f920654002_465;
// 10035
f920654002_465.returns.push(false);
// 10036
o65.JSBNG__addEventListener = f920654002_419;
// 10038
f920654002_419.returns.push(undefined);
// 10039
o65.JSBNG__onclick = null;
// undefined
o65 = null;
// 10043
f920654002_467.returns.push(o79);
// undefined
o79 = null;
// 10047
o65 = {};
// 10048
f920654002_467.returns.push(o65);
// 10049
o65.nodeName = "A";
// 10050
o65.__FB_TOKEN = void 0;
// 10051
// 10052
o65.getAttribute = f920654002_464;
// 10053
o65.hasAttribute = f920654002_465;
// 10055
f920654002_465.returns.push(false);
// 10056
o65.JSBNG__addEventListener = f920654002_419;
// 10058
f920654002_419.returns.push(undefined);
// 10059
o65.JSBNG__onclick = null;
// undefined
o65 = null;
// 10063
f920654002_467.returns.push(o78);
// undefined
o78 = null;
// 10067
o65 = {};
// 10068
f920654002_467.returns.push(o65);
// 10069
o72 = {};
// 10070
o65.firstChild = o72;
// 10071
o72.id = "u_0_3z";
// 10077
f920654002_467.returns.push(o27);
// 10081
o74 = {};
// 10082
f920654002_467.returns.push(o74);
// 10083
o74.nodeName = "DIV";
// 10084
o74.__FB_TOKEN = void 0;
// 10085
// 10086
o74.getAttribute = f920654002_464;
// 10087
o74.hasAttribute = f920654002_465;
// 10089
f920654002_465.returns.push(false);
// 10090
o74.JSBNG__addEventListener = f920654002_419;
// 10092
f920654002_419.returns.push(undefined);
// 10093
o74.JSBNG__onclick = null;
// undefined
o74 = null;
// 10098
f920654002_467.returns.push(o82);
// 10099
f920654002_7.returns.push(undefined);
// 10100
f920654002_1639 = function() { return f920654002_1639.returns[f920654002_1639.inst++]; };
f920654002_1639.returns = [];
f920654002_1639.inst = 0;
// 10101
ow920654002.JSBNG__onmousemove = f920654002_1639;
// 10107
o82.getElementsByTagName = f920654002_453;
// 10109
o82.querySelectorAll = f920654002_462;
// 10110
o74 = {};
// 10111
f920654002_462.returns.push(o74);
// 10112
o74.length = 5;
// 10113
o76 = {};
// 10114
o74["0"] = o76;
// 10115
o77 = {};
// 10116
o74["1"] = o77;
// 10117
o78 = {};
// 10118
o74["2"] = o78;
// 10119
o79 = {};
// 10120
o74["3"] = o79;
// 10121
o80 = {};
// 10122
o74["4"] = o80;
// undefined
o74 = null;
// 10123
o76.getElementsByTagName = f920654002_453;
// 10125
o76.querySelectorAll = f920654002_462;
// 10126
o74 = {};
// 10127
f920654002_462.returns.push(o74);
// 10128
o74.length = 1;
// 10129
o81 = {};
// 10130
o74["0"] = o81;
// undefined
o74 = null;
// 10131
o81.getAttribute = f920654002_464;
// 10132
f920654002_464.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 10133
o77.getElementsByTagName = f920654002_453;
// 10135
o77.querySelectorAll = f920654002_462;
// 10136
o74 = {};
// 10137
f920654002_462.returns.push(o74);
// 10138
o74.length = 1;
// 10139
o93 = {};
// 10140
o74["0"] = o93;
// undefined
o74 = null;
// 10141
o93.getAttribute = f920654002_464;
// 10142
f920654002_464.returns.push("{\"adid\":6008916062718,\"segment\":\"market\"}");
// 10143
o78.getElementsByTagName = f920654002_453;
// 10145
o78.querySelectorAll = f920654002_462;
// 10146
o74 = {};
// 10147
f920654002_462.returns.push(o74);
// 10148
o74.length = 1;
// 10149
o94 = {};
// 10150
o74["0"] = o94;
// undefined
o74 = null;
// 10151
o94.getAttribute = f920654002_464;
// 10152
f920654002_464.returns.push("{\"adid\":6008172951099,\"segment\":\"market\"}");
// 10153
o79.getElementsByTagName = f920654002_453;
// 10155
o79.querySelectorAll = f920654002_462;
// 10156
o74 = {};
// 10157
f920654002_462.returns.push(o74);
// 10158
o74.length = 1;
// 10159
o95 = {};
// 10160
o74["0"] = o95;
// undefined
o74 = null;
// 10161
o95.getAttribute = f920654002_464;
// 10162
f920654002_464.returns.push("{\"adid\":6006539945625,\"segment\":\"market\"}");
// 10163
o80.getElementsByTagName = f920654002_453;
// 10165
o80.querySelectorAll = f920654002_462;
// 10166
o74 = {};
// 10167
f920654002_462.returns.push(o74);
// 10168
o74.length = 1;
// 10169
o96 = {};
// 10170
o74["0"] = o96;
// undefined
o74 = null;
// 10171
o96.getAttribute = f920654002_464;
// 10172
f920654002_464.returns.push("{\"adid\":6006155772461,\"segment\":\"market\"}");
// 10173
o74 = {};
// 10174
o76.classList = o74;
// 10176
o74.add = f920654002_1038;
// 10177
f920654002_1038.returns.push(undefined);
// 10178
o97 = {};
// 10179
o82.classList = o97;
// 10181
o97.remove = f920654002_1451;
// undefined
o97 = null;
// 10182
f920654002_1451.returns.push(undefined);
// 10183
o82.setAttribute = f920654002_587;
// 10184
f920654002_587.returns.push(undefined);
// 10185
f920654002_1658 = function() { return f920654002_1658.returns[f920654002_1658.inst++]; };
f920654002_1658.returns = [];
f920654002_1658.inst = 0;
// 10186
o82.cloneNode = f920654002_1658;
// 10187
o97 = {};
// 10188
f920654002_1658.returns.push(o97);
// 10189
// 10190
o97.getElementsByTagName = f920654002_453;
// 10192
o97.querySelectorAll = f920654002_462;
// 10193
o98 = {};
// 10194
f920654002_462.returns.push(o98);
// 10195
o98.length = 5;
// 10196
o99 = {};
// 10197
o98["0"] = o99;
// 10198
o100 = {};
// 10199
o98["1"] = o100;
// 10200
o101 = {};
// 10201
o98["2"] = o101;
// 10202
o102 = {};
// 10203
o98["3"] = o102;
// 10204
o103 = {};
// 10205
o98["4"] = o103;
// undefined
o98 = null;
// 10206
o99.getElementsByTagName = f920654002_453;
// 10208
o99.querySelectorAll = f920654002_462;
// undefined
o99 = null;
// 10209
o98 = {};
// 10210
f920654002_462.returns.push(o98);
// 10211
o98.length = 1;
// 10212
o99 = {};
// 10213
o98["0"] = o99;
// undefined
o98 = null;
// 10214
o99.getAttribute = f920654002_464;
// undefined
o99 = null;
// 10215
f920654002_464.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 10216
o100.getElementsByTagName = f920654002_453;
// 10218
o100.querySelectorAll = f920654002_462;
// 10219
o98 = {};
// 10220
f920654002_462.returns.push(o98);
// 10221
o98.length = 1;
// 10222
o99 = {};
// 10223
o98["0"] = o99;
// undefined
o98 = null;
// 10224
o99.getAttribute = f920654002_464;
// undefined
o99 = null;
// 10225
f920654002_464.returns.push("{\"adid\":6008916062718,\"segment\":\"market\"}");
// 10226
o101.getElementsByTagName = f920654002_453;
// 10228
o101.querySelectorAll = f920654002_462;
// 10229
o98 = {};
// 10230
f920654002_462.returns.push(o98);
// 10231
o98.length = 1;
// 10232
o99 = {};
// 10233
o98["0"] = o99;
// undefined
o98 = null;
// 10234
o99.getAttribute = f920654002_464;
// undefined
o99 = null;
// 10235
f920654002_464.returns.push("{\"adid\":6008172951099,\"segment\":\"market\"}");
// 10236
o102.getElementsByTagName = f920654002_453;
// 10238
o102.querySelectorAll = f920654002_462;
// 10239
o98 = {};
// 10240
f920654002_462.returns.push(o98);
// 10241
o98.length = 1;
// 10242
o99 = {};
// 10243
o98["0"] = o99;
// undefined
o98 = null;
// 10244
o99.getAttribute = f920654002_464;
// undefined
o99 = null;
// 10245
f920654002_464.returns.push("{\"adid\":6006539945625,\"segment\":\"market\"}");
// 10246
o103.getElementsByTagName = f920654002_453;
// 10248
o103.querySelectorAll = f920654002_462;
// 10249
o98 = {};
// 10250
f920654002_462.returns.push(o98);
// 10251
o98.length = 1;
// 10252
o99 = {};
// 10253
o98["0"] = o99;
// undefined
o98 = null;
// 10254
o99.getAttribute = f920654002_464;
// undefined
o99 = null;
// 10255
f920654002_464.returns.push("{\"adid\":6006155772461,\"segment\":\"market\"}");
// 10256
o98 = {};
// 10257
o100.parentNode = o98;
// 10259
o98.removeChild = f920654002_471;
// 10260
f920654002_471.returns.push(o100);
// undefined
o100 = null;
// 10261
o101.parentNode = o98;
// 10264
f920654002_471.returns.push(o101);
// undefined
o101 = null;
// 10265
o102.parentNode = o98;
// 10268
f920654002_471.returns.push(o102);
// undefined
o102 = null;
// 10269
o103.parentNode = o98;
// undefined
o98 = null;
// 10272
f920654002_471.returns.push(o103);
// undefined
o103 = null;
// 10273
o98 = {};
// 10274
o97.classList = o98;
// 10276
o98.add = f920654002_1038;
// undefined
o98 = null;
// 10277
f920654002_1038.returns.push(undefined);
// 10280
o74.remove = f920654002_1451;
// undefined
o74 = null;
// 10281
f920654002_1451.returns.push(undefined);
// 10282
o76.setAttribute = f920654002_587;
// 10283
f920654002_587.returns.push(undefined);
// 10284
o74 = {};
// 10285
o77.classList = o74;
// 10287
o74.remove = f920654002_1451;
// undefined
o74 = null;
// 10288
f920654002_1451.returns.push(undefined);
// 10289
o77.setAttribute = f920654002_587;
// 10290
f920654002_587.returns.push(undefined);
// 10291
o74 = {};
// 10292
o78.classList = o74;
// 10294
o74.remove = f920654002_1451;
// undefined
o74 = null;
// 10295
f920654002_1451.returns.push(undefined);
// 10296
o78.setAttribute = f920654002_587;
// 10297
f920654002_587.returns.push(undefined);
// 10298
o74 = {};
// 10299
o79.classList = o74;
// 10301
o74.add = f920654002_1038;
// undefined
o74 = null;
// 10302
f920654002_1038.returns.push(undefined);
// 10303
o79.setAttribute = f920654002_587;
// 10304
f920654002_587.returns.push(undefined);
// 10305
o74 = {};
// 10306
o80.classList = o74;
// 10308
o74.add = f920654002_1038;
// undefined
o74 = null;
// 10309
f920654002_1038.returns.push(undefined);
// 10310
o80.setAttribute = f920654002_587;
// 10311
f920654002_587.returns.push(undefined);
// 10315
f920654002_1451.returns.push(undefined);
// 10317
f920654002_587.returns.push(undefined);
// 10321
o74 = {};
// 10322
f920654002_462.returns.push(o74);
// 10323
o74.length = 1;
// 10324
o74["0"] = o94;
// undefined
o74 = null;
// 10326
f920654002_464.returns.push("{\"adid\":6008172951099,\"segment\":\"market\"}");
// 10328
o74 = {};
// 10329
f920654002_427.returns.push(o74);
// 10330
// 10331
o74.setAttribute = f920654002_587;
// 10333
f920654002_587.returns.push(undefined);
// 10336
f920654002_587.returns.push(undefined);
// 10339
f920654002_587.returns.push(undefined);
// 10342
f920654002_587.returns.push(undefined);
// 10345
f920654002_587.returns.push(undefined);
// 10347
f920654002_587.returns.push(undefined);
// 10348
o74.__html = void 0;
// undefined
o74 = null;
// 10350
o74 = {};
// 10351
f920654002_425.returns.push(o74);
// 10353
o82.appendChild = f920654002_429;
// undefined
o82 = null;
// 10354
f920654002_429.returns.push(o74);
// undefined
o74 = null;
// 10358
o74 = {};
// 10359
f920654002_462.returns.push(o74);
// 10360
o74.length = 1;
// 10361
o74["0"] = o93;
// undefined
o74 = null;
// 10363
f920654002_464.returns.push("{\"adid\":6008916062718,\"segment\":\"market\"}");
// 10365
o74 = {};
// 10366
f920654002_427.returns.push(o74);
// 10367
// 10368
o74.setAttribute = f920654002_587;
// 10370
f920654002_587.returns.push(undefined);
// 10373
f920654002_587.returns.push(undefined);
// 10376
f920654002_587.returns.push(undefined);
// 10379
f920654002_587.returns.push(undefined);
// 10382
f920654002_587.returns.push(undefined);
// 10384
f920654002_587.returns.push(undefined);
// 10385
o74.__html = void 0;
// undefined
o74 = null;
// 10387
o74 = {};
// 10388
f920654002_425.returns.push(o74);
// 10391
f920654002_429.returns.push(o74);
// undefined
o74 = null;
// 10395
o74 = {};
// 10396
f920654002_462.returns.push(o74);
// 10397
o74.length = 1;
// 10398
o74["0"] = o81;
// undefined
o74 = null;
// 10400
f920654002_464.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 10402
o74 = {};
// 10403
f920654002_427.returns.push(o74);
// 10404
// 10405
o74.setAttribute = f920654002_587;
// 10407
f920654002_587.returns.push(undefined);
// 10410
f920654002_587.returns.push(undefined);
// 10413
f920654002_587.returns.push(undefined);
// 10416
f920654002_587.returns.push(undefined);
// 10419
f920654002_587.returns.push(undefined);
// 10421
f920654002_587.returns.push(undefined);
// 10422
o74.__html = void 0;
// undefined
o74 = null;
// 10424
o74 = {};
// 10425
f920654002_425.returns.push(o74);
// 10428
f920654002_429.returns.push(o74);
// undefined
o74 = null;
// 10432
o74 = {};
// 10433
f920654002_462.returns.push(o74);
// 10434
o74.length = 1;
// 10435
o74["0"] = o81;
// undefined
o74 = null;
// 10437
f920654002_464.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 10441
o74 = {};
// 10442
f920654002_462.returns.push(o74);
// 10443
o74.length = 1;
// 10444
o74["0"] = o93;
// undefined
o74 = null;
// 10446
f920654002_464.returns.push("{\"adid\":6008916062718,\"segment\":\"market\"}");
// 10450
o74 = {};
// 10451
f920654002_462.returns.push(o74);
// 10452
o74.length = 1;
// 10453
o74["0"] = o94;
// undefined
o74 = null;
// 10455
f920654002_464.returns.push("{\"adid\":6008172951099,\"segment\":\"market\"}");
// 10459
o74 = {};
// 10460
f920654002_462.returns.push(o74);
// 10461
o74.length = 1;
// 10462
o82 = {};
// 10463
o74["0"] = o82;
// undefined
o74 = null;
// 10464
o82.complete = true;
// undefined
o82 = null;
// 10465
f920654002_12.returns.push(1225);
// 10469
o74 = {};
// 10470
f920654002_462.returns.push(o74);
// 10471
o74.length = 1;
// 10472
o82 = {};
// 10473
o74["0"] = o82;
// undefined
o74 = null;
// 10474
o82.complete = false;
// 10475
o82.nodeName = "IMG";
// 10476
o82.__FB_TOKEN = void 0;
// 10477
// 10478
o82.getAttribute = f920654002_464;
// 10479
o82.hasAttribute = f920654002_465;
// 10481
f920654002_465.returns.push(false);
// 10482
o82.JSBNG__addEventListener = f920654002_419;
// 10484
f920654002_419.returns.push(undefined);
// 10485
o82.JSBNG__onabort = null;
// 10490
f920654002_419.returns.push(undefined);
// 10491
o82.JSBNG__onerror = null;
// 10496
f920654002_419.returns.push(undefined);
// 10497
o82.JSBNG__onload = null;
// undefined
o82 = null;
// 10502
o74 = {};
// 10503
f920654002_462.returns.push(o74);
// 10504
o74.length = 1;
// 10505
o82 = {};
// 10506
o74["0"] = o82;
// undefined
o74 = null;
// 10507
o82.complete = false;
// 10508
o82.nodeName = "IMG";
// 10509
o82.__FB_TOKEN = void 0;
// 10510
// 10511
o82.getAttribute = f920654002_464;
// 10512
o82.hasAttribute = f920654002_465;
// 10514
f920654002_465.returns.push(false);
// 10515
o82.JSBNG__addEventListener = f920654002_419;
// 10517
f920654002_419.returns.push(undefined);
// 10518
o82.JSBNG__onabort = null;
// 10523
f920654002_419.returns.push(undefined);
// 10524
o82.JSBNG__onerror = null;
// 10529
f920654002_419.returns.push(undefined);
// 10530
o82.JSBNG__onload = null;
// undefined
o82 = null;
// 10535
o74 = {};
// 10536
f920654002_462.returns.push(o74);
// 10537
o74.length = 1;
// 10538
o82 = {};
// 10539
o74["0"] = o82;
// undefined
o74 = null;
// 10540
o82.complete = true;
// undefined
o82 = null;
// 10541
f920654002_12.returns.push(1226);
// 10545
o74 = {};
// 10546
f920654002_462.returns.push(o74);
// 10547
o74.length = 1;
// 10548
o82 = {};
// 10549
o74["0"] = o82;
// undefined
o74 = null;
// 10550
o82.complete = false;
// 10551
o82.nodeName = "IMG";
// 10552
o82.__FB_TOKEN = void 0;
// 10553
// 10554
o82.getAttribute = f920654002_464;
// 10555
o82.hasAttribute = f920654002_465;
// 10557
f920654002_465.returns.push(false);
// 10558
o82.JSBNG__addEventListener = f920654002_419;
// 10560
f920654002_419.returns.push(undefined);
// 10561
o82.JSBNG__onabort = null;
// 10566
f920654002_419.returns.push(undefined);
// 10567
o82.JSBNG__onerror = null;
// 10572
f920654002_419.returns.push(undefined);
// 10573
o82.JSBNG__onload = null;
// undefined
o82 = null;
// 10575
o97.parentNode = null;
// undefined
o97 = null;
// 10579
f920654002_1451.returns.push(undefined);
// 10582
o74 = {};
// 10583
f920654002_467.returns.push(o74);
// 10584
o74.getElementsByTagName = f920654002_453;
// 10586
o74.querySelectorAll = f920654002_462;
// 10587
o82 = {};
// 10588
f920654002_462.returns.push(o82);
// 10589
o82.length = 0;
// undefined
o82 = null;
// 10593
o82 = {};
// 10594
f920654002_462.returns.push(o82);
// 10595
o82.length = 1;
// 10596
o97 = {};
// 10597
o82["0"] = o97;
// undefined
o82 = null;
// undefined
o97 = null;
// 10598
o82 = {};
// 10599
o74.classList = o82;
// 10601
o82.contains = f920654002_1519;
// 10602
f920654002_1519.returns.push(false);
// 10604
f920654002_467.returns.push(o54);
// 10607
o97 = {};
// 10608
f920654002_467.returns.push(o97);
// 10609
o98 = {};
// 10610
o97.classList = o98;
// 10612
o98.contains = f920654002_1519;
// 10613
f920654002_1519.returns.push(true);
// 10614
o97.__FB_TOKEN = void 0;
// 10615
// 10616
o99 = {};
// 10617
o97.childNodes = o99;
// undefined
o97 = null;
// 10618
o99.item = f920654002_456;
// 10619
o99.length = 1;
// 10620
o97 = {};
// 10621
o99["0"] = o97;
// undefined
o99 = null;
// 10622
o99 = {};
// 10623
o97.classList = o99;
// 10625
o99.contains = f920654002_1519;
// 10626
f920654002_1519.returns.push(false);
// 10627
o100 = {};
// 10628
o97.childNodes = o100;
// undefined
o97 = null;
// 10629
o100.item = f920654002_456;
// 10630
o100.length = 1;
// 10631
o97 = {};
// 10632
o100["0"] = o97;
// undefined
o100 = null;
// 10633
o100 = {};
// 10634
o97.classList = o100;
// 10636
o100.contains = f920654002_1519;
// undefined
o100 = null;
// 10637
f920654002_1519.returns.push(false);
// 10640
o99.remove = f920654002_1451;
// 10641
f920654002_1451.returns.push(undefined);
// 10645
f920654002_1451.returns.push(undefined);
// 10649
f920654002_1451.returns.push(undefined);
// 10652
o99.add = f920654002_1038;
// undefined
o99 = null;
// 10653
f920654002_1038.returns.push(undefined);
// 10657
f920654002_1038.returns.push(undefined);
// 10660
o98.remove = f920654002_1451;
// undefined
o98 = null;
// 10661
f920654002_1451.returns.push(undefined);
// 10664
o98 = {};
// 10665
f920654002_467.returns.push(o98);
// 10666
o99 = {};
// 10667
o98.classList = o99;
// 10669
o99.contains = f920654002_1519;
// 10670
f920654002_1519.returns.push(true);
// 10671
o98.__FB_TOKEN = void 0;
// 10672
// 10673
o100 = {};
// 10674
o98.childNodes = o100;
// undefined
o98 = null;
// 10675
o100.item = f920654002_456;
// 10676
o100.length = 1;
// 10677
o98 = {};
// 10678
o100["0"] = o98;
// undefined
o100 = null;
// 10679
o100 = {};
// 10680
o98.classList = o100;
// 10682
o100.contains = f920654002_1519;
// 10683
f920654002_1519.returns.push(false);
// 10684
o101 = {};
// 10685
o98.childNodes = o101;
// undefined
o98 = null;
// 10686
o101.item = f920654002_456;
// 10687
o101.length = 1;
// 10688
o98 = {};
// 10689
o101["0"] = o98;
// undefined
o101 = null;
// 10690
o101 = {};
// 10691
o98.classList = o101;
// undefined
o98 = null;
// 10693
o101.contains = f920654002_1519;
// undefined
o101 = null;
// 10694
f920654002_1519.returns.push(false);
// 10697
o100.remove = f920654002_1451;
// 10698
f920654002_1451.returns.push(undefined);
// 10702
f920654002_1451.returns.push(undefined);
// 10706
f920654002_1451.returns.push(undefined);
// 10709
o100.add = f920654002_1038;
// undefined
o100 = null;
// 10710
f920654002_1038.returns.push(undefined);
// 10714
f920654002_1038.returns.push(undefined);
// 10717
o99.remove = f920654002_1451;
// undefined
o99 = null;
// 10718
f920654002_1451.returns.push(undefined);
// 10721
o98 = {};
// 10722
f920654002_467.returns.push(o98);
// 10723
o98.getElementsByTagName = f920654002_453;
// 10725
o98.querySelectorAll = f920654002_462;
// 10726
o99 = {};
// 10727
f920654002_462.returns.push(o99);
// 10728
o99.length = 1;
// 10729
o100 = {};
// 10730
o99["0"] = o100;
// undefined
o99 = null;
// 10734
o99 = {};
// 10735
f920654002_462.returns.push(o99);
// 10736
o99.length = 1;
// 10737
o101 = {};
// 10738
o99["0"] = o101;
// undefined
o99 = null;
// 10742
o99 = {};
// 10743
f920654002_462.returns.push(o99);
// 10744
o99.length = 1;
// 10745
o102 = {};
// 10746
o99["0"] = o102;
// undefined
o99 = null;
// undefined
o102 = null;
// 10747
o100.getElementsByTagName = f920654002_453;
// 10749
o100.querySelectorAll = f920654002_462;
// 10750
o99 = {};
// 10751
f920654002_462.returns.push(o99);
// 10752
o99.length = 1;
// 10753
o102 = {};
// 10754
o99["0"] = o102;
// undefined
o99 = null;
// undefined
o102 = null;
// 10755
o99 = {};
// 10756
o100.classList = o99;
// 10758
o99.contains = f920654002_1519;
// undefined
o99 = null;
// 10759
f920654002_1519.returns.push(false);
// 10760
o99 = {};
// 10761
o100.parentNode = o99;
// 10762
o102 = {};
// 10763
o99.classList = o102;
// 10765
o102.contains = f920654002_1519;
// 10766
f920654002_1519.returns.push(false);
// 10767
o99.parentNode = o98;
// 10768
o103 = {};
// 10769
o98.classList = o103;
// 10771
o103.contains = f920654002_1519;
// 10772
f920654002_1519.returns.push(true);
// 10773
o98.__FB_TOKEN = void 0;
// 10774
// 10775
o98.getAttribute = f920654002_464;
// 10776
o98.hasAttribute = f920654002_465;
// 10778
f920654002_465.returns.push(false);
// 10782
f920654002_1519.returns.push(true);
// 10783
o104 = {};
// 10784
o98.childNodes = o104;
// undefined
o98 = null;
// 10785
o104.item = f920654002_456;
// 10786
o104.length = 4;
// 10787
o98 = {};
// 10788
o104["3"] = o98;
// 10789
o105 = {};
// 10790
o104["2"] = o105;
// 10791
o104["1"] = o99;
// 10792
o106 = {};
// 10793
o104["0"] = o106;
// undefined
o104 = null;
// 10794
o104 = {};
// 10795
o106.classList = o104;
// 10797
o104.contains = f920654002_1519;
// 10798
f920654002_1519.returns.push(false);
// 10799
o107 = {};
// 10800
o106.childNodes = o107;
// undefined
o106 = null;
// 10801
o107.item = f920654002_456;
// 10802
o107.length = 1;
// 10803
o106 = {};
// 10804
o107["0"] = o106;
// undefined
o107 = null;
// 10805
o107 = {};
// 10806
o106.classList = o107;
// undefined
o106 = null;
// 10808
o107.contains = f920654002_1519;
// undefined
o107 = null;
// 10809
f920654002_1519.returns.push(false);
// 10812
o104.remove = f920654002_1451;
// 10813
f920654002_1451.returns.push(undefined);
// 10817
f920654002_1451.returns.push(undefined);
// 10821
f920654002_1451.returns.push(undefined);
// 10825
f920654002_1519.returns.push(false);
// 10826
o106 = {};
// 10827
o99.childNodes = o106;
// undefined
o99 = null;
// 10828
o106.item = f920654002_456;
// 10829
o106.length = 1;
// 10830
o106["0"] = o100;
// undefined
o106 = null;
// undefined
o100 = null;
// 10834
f920654002_1519.returns.push(false);
// 10837
o102.remove = f920654002_1451;
// undefined
o102 = null;
// 10838
f920654002_1451.returns.push(undefined);
// 10842
f920654002_1451.returns.push(undefined);
// 10846
f920654002_1451.returns.push(undefined);
// 10847
o99 = {};
// 10848
o105.classList = o99;
// 10850
o99.contains = f920654002_1519;
// 10851
f920654002_1519.returns.push(false);
// 10852
o100 = {};
// 10853
o105.childNodes = o100;
// undefined
o105 = null;
// 10854
o100.item = f920654002_456;
// 10855
o100.length = 1;
// 10856
o100["0"] = o101;
// undefined
o100 = null;
// 10857
o100 = {};
// 10858
o101.classList = o100;
// 10860
o100.contains = f920654002_1519;
// undefined
o100 = null;
// 10861
f920654002_1519.returns.push(false);
// 10864
o99.remove = f920654002_1451;
// 10865
f920654002_1451.returns.push(undefined);
// 10869
f920654002_1451.returns.push(undefined);
// 10873
f920654002_1451.returns.push(undefined);
// 10874
o100 = {};
// 10875
o98.classList = o100;
// undefined
o98 = null;
// 10877
o100.contains = f920654002_1519;
// 10878
f920654002_1519.returns.push(true);
// 10881
o100.remove = f920654002_1451;
// 10882
f920654002_1451.returns.push(undefined);
// 10886
f920654002_1451.returns.push(undefined);
// 10889
o100.add = f920654002_1038;
// undefined
o100 = null;
// 10890
f920654002_1038.returns.push(undefined);
// 10893
o104.add = f920654002_1038;
// undefined
o104 = null;
// 10894
f920654002_1038.returns.push(undefined);
// 10897
o99.add = f920654002_1038;
// undefined
o99 = null;
// 10898
f920654002_1038.returns.push(undefined);
// 10901
o103.remove = f920654002_1451;
// undefined
o103 = null;
// 10902
f920654002_1451.returns.push(undefined);
// 10907
f920654002_1519.returns.push(false);
// 10911
f920654002_467.returns.push(o54);
// 10912
o54.offsetWidth = 1024;
// 10913
o54.offsetHeight = 38;
// 10917
o98 = {};
// 10918
f920654002_462.returns.push(o98);
// 10919
o98.length = 1;
// 10920
o99 = {};
// 10921
o98["0"] = o99;
// undefined
o98 = null;
// 10922
o98 = {};
// 10923
o99.style = o98;
// undefined
o99 = null;
// 10924
// undefined
o98 = null;
// 10929
f920654002_1519.returns.push(false);
// 10933
f920654002_467.returns.push(o54);
// 10936
o101.getElementsByTagName = f920654002_453;
// 10938
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 10939
o98 = {};
// 10940
f920654002_462.returns.push(o98);
// 10941
o98.length = 1;
// 10942
o99 = {};
// 10943
o98["0"] = o99;
// undefined
o98 = null;
// 10944
o98 = {};
// 10945
o99.style = o98;
// undefined
o99 = null;
// 10946
// undefined
o98 = null;
// 10950
o98 = {};
// 10951
f920654002_462.returns.push(o98);
// 10952
o98.length = 1;
// 10953
o99 = {};
// 10954
o98["0"] = o99;
// undefined
o98 = null;
// 10955
o99.nodeName = "DIV";
// 10956
o99.__FB_TOKEN = void 0;
// 10957
// 10958
o99.getAttribute = f920654002_464;
// 10959
o99.hasAttribute = f920654002_465;
// 10961
f920654002_465.returns.push(false);
// 10962
o99.JSBNG__addEventListener = f920654002_419;
// 10964
f920654002_419.returns.push(undefined);
// 10965
o99.JSBNG__onclick = null;
// undefined
o99 = null;
// 10974
o98 = {};
// 10975
f920654002_467.returns.push(o98);
// undefined
o98 = null;
// 10976
o98 = {};
// 10977
o99 = {};
// 10979
o98.length = 1;
// 10980
o98["0"] = "jsIYP";
// 10983
f920654002_418.returns.push(1373491966128);
// 10986
f920654002_418.returns.push(1373491966129);
// 10988
f920654002_418.returns.push(1373491966129);
// 10991
f920654002_418.returns.push(1373491966133);
// 10994
f920654002_418.returns.push(1373491966134);
// 10996
f920654002_418.returns.push(1373491966134);
// 10999
f920654002_418.returns.push(1373491966135);
// 11002
f920654002_418.returns.push(1373491966135);
// 11004
f920654002_418.returns.push(1373491966135);
// 11007
f920654002_418.returns.push(1373491966137);
// 11010
f920654002_418.returns.push(1373491966137);
// 11013
f920654002_467.returns.push(o72);
// 11029
f920654002_418.returns.push(1373491966144);
// 11032
f920654002_418.returns.push(1373491966146);
// 11035
f920654002_418.returns.push(1373491966146);
// 11038
f920654002_467.returns.push(o84);
// 11039
o100 = {};
// 11040
o84.childNodes = o100;
// 11041
o101 = {};
// 11042
o100["0"] = o101;
// 11043
o100.length = 8;
// 11045
o101.getAttribute = f920654002_464;
// 11046
f920654002_464.returns.push("recent");
// 11049
o101.getElementsByTagName = f920654002_453;
// 11051
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11052
o101 = {};
// 11053
f920654002_462.returns.push(o101);
// 11054
o101.length = 0;
// undefined
o101 = null;
// 11057
f920654002_464.returns.push(null);
// 11059
o101 = {};
// 11060
o100["1"] = o101;
// 11061
o101.getAttribute = f920654002_464;
// 11062
f920654002_464.returns.push("year_2013");
// 11065
o101.getElementsByTagName = f920654002_453;
// 11067
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11068
o101 = {};
// 11069
f920654002_462.returns.push(o101);
// 11070
o101.length = 1;
// 11071
o102 = {};
// 11072
o101["0"] = o102;
// undefined
o101 = null;
// 11073
o101 = {};
// 11074
o102.childNodes = o101;
// undefined
o102 = null;
// 11075
o101.length = 1;
// 11076
o102 = {};
// 11077
o101["0"] = o102;
// undefined
o101 = null;
// 11078
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11079
f920654002_464.returns.push("month_2013_1");
// 11084
f920654002_464.returns.push("2010s");
// 11087
o101 = {};
// 11088
o100["2"] = o101;
// 11089
o101.getAttribute = f920654002_464;
// 11090
f920654002_464.returns.push("year_2012");
// 11093
o101.getElementsByTagName = f920654002_453;
// 11095
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11096
o101 = {};
// 11097
f920654002_462.returns.push(o101);
// 11098
o101.length = 1;
// 11099
o102 = {};
// 11100
o101["0"] = o102;
// undefined
o101 = null;
// 11101
o101 = {};
// 11102
o102.childNodes = o101;
// undefined
o102 = null;
// 11103
o101.length = 12;
// 11104
o102 = {};
// 11105
o101["0"] = o102;
// 11106
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11107
f920654002_464.returns.push("month_2012_12");
// 11110
o102 = {};
// 11111
o101["1"] = o102;
// 11112
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11113
f920654002_464.returns.push("month_2012_11");
// 11116
o102 = {};
// 11117
o101["2"] = o102;
// 11118
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11119
f920654002_464.returns.push("month_2012_10");
// 11122
o102 = {};
// 11123
o101["3"] = o102;
// 11124
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11125
f920654002_464.returns.push("month_2012_9");
// 11128
o102 = {};
// 11129
o101["4"] = o102;
// 11130
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11131
f920654002_464.returns.push("month_2012_8");
// 11134
o102 = {};
// 11135
o101["5"] = o102;
// 11136
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11137
f920654002_464.returns.push("month_2012_7");
// 11140
o102 = {};
// 11141
o101["6"] = o102;
// 11142
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11143
f920654002_464.returns.push("month_2012_6");
// 11146
o102 = {};
// 11147
o101["7"] = o102;
// 11148
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11149
f920654002_464.returns.push("month_2012_5");
// 11152
o102 = {};
// 11153
o101["8"] = o102;
// 11154
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11155
f920654002_464.returns.push("month_2012_4");
// 11158
o102 = {};
// 11159
o101["9"] = o102;
// 11160
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11161
f920654002_464.returns.push("month_2012_3");
// 11164
o102 = {};
// 11165
o101["10"] = o102;
// 11166
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11167
f920654002_464.returns.push("month_2012_2");
// 11170
o102 = {};
// 11171
o101["11"] = o102;
// undefined
o101 = null;
// 11172
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11173
f920654002_464.returns.push("month_2012_1");
// 11178
f920654002_464.returns.push("2010s");
// 11181
o101 = {};
// 11182
o100["3"] = o101;
// 11183
o101.getAttribute = f920654002_464;
// 11184
f920654002_464.returns.push("year_2011");
// 11187
o101.getElementsByTagName = f920654002_453;
// 11189
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11190
o101 = {};
// 11191
f920654002_462.returns.push(o101);
// 11192
o101.length = 1;
// 11193
o102 = {};
// 11194
o101["0"] = o102;
// undefined
o101 = null;
// 11195
o101 = {};
// 11196
o102.childNodes = o101;
// undefined
o102 = null;
// 11197
o101.length = 12;
// 11198
o102 = {};
// 11199
o101["0"] = o102;
// 11200
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11201
f920654002_464.returns.push("month_2011_12");
// 11204
o102 = {};
// 11205
o101["1"] = o102;
// 11206
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11207
f920654002_464.returns.push("month_2011_11");
// 11210
o102 = {};
// 11211
o101["2"] = o102;
// 11212
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11213
f920654002_464.returns.push("month_2011_10");
// 11216
o102 = {};
// 11217
o101["3"] = o102;
// 11218
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11219
f920654002_464.returns.push("month_2011_9");
// 11222
o102 = {};
// 11223
o101["4"] = o102;
// 11224
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11225
f920654002_464.returns.push("month_2011_8");
// 11228
o102 = {};
// 11229
o101["5"] = o102;
// 11230
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11231
f920654002_464.returns.push("month_2011_7");
// 11234
o102 = {};
// 11235
o101["6"] = o102;
// 11236
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11237
f920654002_464.returns.push("month_2011_6");
// 11240
o102 = {};
// 11241
o101["7"] = o102;
// 11242
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11243
f920654002_464.returns.push("month_2011_5");
// 11246
o102 = {};
// 11247
o101["8"] = o102;
// 11248
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11249
f920654002_464.returns.push("month_2011_4");
// 11252
o102 = {};
// 11253
o101["9"] = o102;
// 11254
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11255
f920654002_464.returns.push("month_2011_3");
// 11258
o102 = {};
// 11259
o101["10"] = o102;
// 11260
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11261
f920654002_464.returns.push("month_2011_2");
// 11264
o102 = {};
// 11265
o101["11"] = o102;
// undefined
o101 = null;
// 11266
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11267
f920654002_464.returns.push("month_2011_1");
// 11272
f920654002_464.returns.push("2010s");
// 11275
o101 = {};
// 11276
o100["4"] = o101;
// 11277
o101.getAttribute = f920654002_464;
// 11278
f920654002_464.returns.push("year_2010");
// 11281
o101.getElementsByTagName = f920654002_453;
// 11283
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11284
o101 = {};
// 11285
f920654002_462.returns.push(o101);
// 11286
o101.length = 1;
// 11287
o102 = {};
// 11288
o101["0"] = o102;
// undefined
o101 = null;
// 11289
o101 = {};
// 11290
o102.childNodes = o101;
// undefined
o102 = null;
// 11291
o101.length = 12;
// 11292
o102 = {};
// 11293
o101["0"] = o102;
// 11294
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11295
f920654002_464.returns.push("month_2010_12");
// 11298
o102 = {};
// 11299
o101["1"] = o102;
// 11300
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11301
f920654002_464.returns.push("month_2010_11");
// 11304
o102 = {};
// 11305
o101["2"] = o102;
// 11306
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11307
f920654002_464.returns.push("month_2010_10");
// 11310
o102 = {};
// 11311
o101["3"] = o102;
// 11312
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11313
f920654002_464.returns.push("month_2010_9");
// 11316
o102 = {};
// 11317
o101["4"] = o102;
// 11318
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11319
f920654002_464.returns.push("month_2010_8");
// 11322
o102 = {};
// 11323
o101["5"] = o102;
// 11324
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11325
f920654002_464.returns.push("month_2010_7");
// 11328
o102 = {};
// 11329
o101["6"] = o102;
// 11330
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11331
f920654002_464.returns.push("month_2010_6");
// 11334
o102 = {};
// 11335
o101["7"] = o102;
// 11336
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11337
f920654002_464.returns.push("month_2010_5");
// 11340
o102 = {};
// 11341
o101["8"] = o102;
// 11342
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11343
f920654002_464.returns.push("month_2010_4");
// 11346
o102 = {};
// 11347
o101["9"] = o102;
// 11348
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11349
f920654002_464.returns.push("month_2010_3");
// 11352
o102 = {};
// 11353
o101["10"] = o102;
// 11354
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11355
f920654002_464.returns.push("month_2010_2");
// 11358
o102 = {};
// 11359
o101["11"] = o102;
// undefined
o101 = null;
// 11360
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11361
f920654002_464.returns.push("month_2010_1");
// 11366
f920654002_464.returns.push("2010s");
// 11369
o101 = {};
// 11370
o100["5"] = o101;
// 11371
o101.getAttribute = f920654002_464;
// 11372
f920654002_464.returns.push("year_2009");
// 11375
o101.getElementsByTagName = f920654002_453;
// 11377
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11378
o101 = {};
// 11379
f920654002_462.returns.push(o101);
// 11380
o101.length = 1;
// 11381
o102 = {};
// 11382
o101["0"] = o102;
// undefined
o101 = null;
// 11383
o101 = {};
// 11384
o102.childNodes = o101;
// undefined
o102 = null;
// 11385
o101.length = 12;
// 11386
o102 = {};
// 11387
o101["0"] = o102;
// 11388
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11389
f920654002_464.returns.push("month_2009_12");
// 11392
o102 = {};
// 11393
o101["1"] = o102;
// 11394
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11395
f920654002_464.returns.push("month_2009_11");
// 11398
o102 = {};
// 11399
o101["2"] = o102;
// 11400
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11401
f920654002_464.returns.push("month_2009_10");
// 11404
o102 = {};
// 11405
o101["3"] = o102;
// 11406
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11407
f920654002_464.returns.push("month_2009_9");
// 11410
o102 = {};
// 11411
o101["4"] = o102;
// 11412
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11413
f920654002_464.returns.push("month_2009_8");
// 11416
o102 = {};
// 11417
o101["5"] = o102;
// 11418
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11419
f920654002_464.returns.push("month_2009_7");
// 11422
o102 = {};
// 11423
o101["6"] = o102;
// 11424
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11425
f920654002_464.returns.push("month_2009_6");
// 11428
o102 = {};
// 11429
o101["7"] = o102;
// 11430
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11431
f920654002_464.returns.push("month_2009_5");
// 11434
o102 = {};
// 11435
o101["8"] = o102;
// 11436
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11437
f920654002_464.returns.push("month_2009_4");
// 11440
o102 = {};
// 11441
o101["9"] = o102;
// 11442
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11443
f920654002_464.returns.push("month_2009_3");
// 11446
o102 = {};
// 11447
o101["10"] = o102;
// 11448
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11449
f920654002_464.returns.push("month_2009_2");
// 11452
o102 = {};
// 11453
o101["11"] = o102;
// undefined
o101 = null;
// 11454
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11455
f920654002_464.returns.push("month_2009_1");
// 11460
f920654002_464.returns.push("2000s");
// 11463
o101 = {};
// 11464
o100["6"] = o101;
// 11465
o101.getAttribute = f920654002_464;
// 11466
f920654002_464.returns.push("year_2008");
// 11469
o101.getElementsByTagName = f920654002_453;
// 11471
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11472
o101 = {};
// 11473
f920654002_462.returns.push(o101);
// 11474
o101.length = 1;
// 11475
o102 = {};
// 11476
o101["0"] = o102;
// undefined
o101 = null;
// 11477
o101 = {};
// 11478
o102.childNodes = o101;
// undefined
o102 = null;
// 11479
o101.length = 12;
// 11480
o102 = {};
// 11481
o101["0"] = o102;
// 11482
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11483
f920654002_464.returns.push("month_2008_12");
// 11486
o102 = {};
// 11487
o101["1"] = o102;
// 11488
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11489
f920654002_464.returns.push("month_2008_11");
// 11492
o102 = {};
// 11493
o101["2"] = o102;
// 11494
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11495
f920654002_464.returns.push("month_2008_10");
// 11498
o102 = {};
// 11499
o101["3"] = o102;
// 11500
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11501
f920654002_464.returns.push("month_2008_9");
// 11504
o102 = {};
// 11505
o101["4"] = o102;
// 11506
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11507
f920654002_464.returns.push("month_2008_8");
// 11510
o102 = {};
// 11511
o101["5"] = o102;
// 11512
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11513
f920654002_464.returns.push("month_2008_7");
// 11516
o102 = {};
// 11517
o101["6"] = o102;
// 11518
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11519
f920654002_464.returns.push("month_2008_6");
// 11522
o102 = {};
// 11523
o101["7"] = o102;
// 11524
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11525
f920654002_464.returns.push("month_2008_5");
// 11528
o102 = {};
// 11529
o101["8"] = o102;
// 11530
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11531
f920654002_464.returns.push("month_2008_4");
// 11534
o102 = {};
// 11535
o101["9"] = o102;
// 11536
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11537
f920654002_464.returns.push("month_2008_3");
// 11540
o102 = {};
// 11541
o101["10"] = o102;
// 11542
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11543
f920654002_464.returns.push("month_2008_2");
// 11546
o102 = {};
// 11547
o101["11"] = o102;
// undefined
o101 = null;
// 11548
o102.getAttribute = f920654002_464;
// undefined
o102 = null;
// 11549
f920654002_464.returns.push("month_2008_1");
// 11554
f920654002_464.returns.push("2000s");
// 11557
o101 = {};
// 11558
o100["7"] = o101;
// undefined
o100 = null;
// 11559
o101.getAttribute = f920654002_464;
// 11560
f920654002_464.returns.push("way_back");
// 11563
o101.getElementsByTagName = f920654002_453;
// 11565
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 11566
o100 = {};
// 11567
f920654002_462.returns.push(o100);
// 11568
o100.length = 0;
// undefined
o100 = null;
// 11571
f920654002_464.returns.push(null);
// 11573
o84.nodeName = "UL";
// 11574
o84.__FB_TOKEN = void 0;
// 11575
// 11576
o84.getAttribute = f920654002_464;
// 11577
o84.hasAttribute = f920654002_465;
// 11579
f920654002_465.returns.push(false);
// 11580
o84.JSBNG__addEventListener = f920654002_419;
// 11582
f920654002_419.returns.push(undefined);
// 11583
o84.JSBNG__onclick = null;
// 11588
f920654002_419.returns.push(undefined);
// 11589
o84.JSBNG__onkeydown = null;
// 11591
o84.getElementsByTagName = f920654002_453;
// 11593
o84.querySelectorAll = f920654002_462;
// 11594
o100 = {};
// 11595
f920654002_462.returns.push(o100);
// 11596
o100.length = 69;
// 11597
o101 = {};
// 11598
o100["0"] = o101;
// undefined
o101 = null;
// 11599
o101 = {};
// 11600
o100["1"] = o101;
// undefined
o101 = null;
// 11601
o101 = {};
// 11602
o100["2"] = o101;
// undefined
o101 = null;
// 11603
o101 = {};
// 11604
o100["3"] = o101;
// undefined
o101 = null;
// 11605
o101 = {};
// 11606
o100["4"] = o101;
// undefined
o101 = null;
// 11607
o101 = {};
// 11608
o100["5"] = o101;
// undefined
o101 = null;
// 11609
o101 = {};
// 11610
o100["6"] = o101;
// undefined
o101 = null;
// 11611
o101 = {};
// 11612
o100["7"] = o101;
// undefined
o101 = null;
// 11613
o101 = {};
// 11614
o100["8"] = o101;
// undefined
o101 = null;
// 11615
o101 = {};
// 11616
o100["9"] = o101;
// undefined
o101 = null;
// 11617
o101 = {};
// 11618
o100["10"] = o101;
// undefined
o101 = null;
// 11619
o101 = {};
// 11620
o100["11"] = o101;
// undefined
o101 = null;
// 11621
o101 = {};
// 11622
o100["12"] = o101;
// undefined
o101 = null;
// 11623
o101 = {};
// 11624
o100["13"] = o101;
// undefined
o101 = null;
// 11625
o101 = {};
// 11626
o100["14"] = o101;
// undefined
o101 = null;
// 11627
o101 = {};
// 11628
o100["15"] = o101;
// undefined
o101 = null;
// 11629
o101 = {};
// 11630
o100["16"] = o101;
// undefined
o101 = null;
// 11631
o101 = {};
// 11632
o100["17"] = o101;
// undefined
o101 = null;
// 11633
o101 = {};
// 11634
o100["18"] = o101;
// undefined
o101 = null;
// 11635
o101 = {};
// 11636
o100["19"] = o101;
// undefined
o101 = null;
// 11637
o101 = {};
// 11638
o100["20"] = o101;
// undefined
o101 = null;
// 11639
o101 = {};
// 11640
o100["21"] = o101;
// undefined
o101 = null;
// 11641
o101 = {};
// 11642
o100["22"] = o101;
// undefined
o101 = null;
// 11643
o101 = {};
// 11644
o100["23"] = o101;
// undefined
o101 = null;
// 11645
o101 = {};
// 11646
o100["24"] = o101;
// undefined
o101 = null;
// 11647
o101 = {};
// 11648
o100["25"] = o101;
// undefined
o101 = null;
// 11649
o101 = {};
// 11650
o100["26"] = o101;
// undefined
o101 = null;
// 11651
o101 = {};
// 11652
o100["27"] = o101;
// undefined
o101 = null;
// 11653
o101 = {};
// 11654
o100["28"] = o101;
// undefined
o101 = null;
// 11655
o101 = {};
// 11656
o100["29"] = o101;
// undefined
o101 = null;
// 11657
o101 = {};
// 11658
o100["30"] = o101;
// undefined
o101 = null;
// 11659
o101 = {};
// 11660
o100["31"] = o101;
// undefined
o101 = null;
// 11661
o101 = {};
// 11662
o100["32"] = o101;
// undefined
o101 = null;
// 11663
o101 = {};
// 11664
o100["33"] = o101;
// undefined
o101 = null;
// 11665
o101 = {};
// 11666
o100["34"] = o101;
// undefined
o101 = null;
// 11667
o101 = {};
// 11668
o100["35"] = o101;
// undefined
o101 = null;
// 11669
o101 = {};
// 11670
o100["36"] = o101;
// undefined
o101 = null;
// 11671
o101 = {};
// 11672
o100["37"] = o101;
// undefined
o101 = null;
// 11673
o101 = {};
// 11674
o100["38"] = o101;
// undefined
o101 = null;
// 11675
o101 = {};
// 11676
o100["39"] = o101;
// undefined
o101 = null;
// 11677
o101 = {};
// 11678
o100["40"] = o101;
// undefined
o101 = null;
// 11679
o101 = {};
// 11680
o100["41"] = o101;
// undefined
o101 = null;
// 11681
o101 = {};
// 11682
o100["42"] = o101;
// undefined
o101 = null;
// 11683
o101 = {};
// 11684
o100["43"] = o101;
// undefined
o101 = null;
// 11685
o101 = {};
// 11686
o100["44"] = o101;
// undefined
o101 = null;
// 11687
o101 = {};
// 11688
o100["45"] = o101;
// undefined
o101 = null;
// 11689
o101 = {};
// 11690
o100["46"] = o101;
// undefined
o101 = null;
// 11691
o101 = {};
// 11692
o100["47"] = o101;
// undefined
o101 = null;
// 11693
o101 = {};
// 11694
o100["48"] = o101;
// undefined
o101 = null;
// 11695
o101 = {};
// 11696
o100["49"] = o101;
// undefined
o101 = null;
// 11697
o101 = {};
// 11698
o100["50"] = o101;
// undefined
o101 = null;
// 11699
o101 = {};
// 11700
o100["51"] = o101;
// undefined
o101 = null;
// 11701
o101 = {};
// 11702
o100["52"] = o101;
// undefined
o101 = null;
// 11703
o101 = {};
// 11704
o100["53"] = o101;
// undefined
o101 = null;
// 11705
o101 = {};
// 11706
o100["54"] = o101;
// undefined
o101 = null;
// 11707
o101 = {};
// 11708
o100["55"] = o101;
// undefined
o101 = null;
// 11709
o101 = {};
// 11710
o100["56"] = o101;
// undefined
o101 = null;
// 11711
o101 = {};
// 11712
o100["57"] = o101;
// undefined
o101 = null;
// 11713
o101 = {};
// 11714
o100["58"] = o101;
// undefined
o101 = null;
// 11715
o101 = {};
// 11716
o100["59"] = o101;
// undefined
o101 = null;
// 11717
o101 = {};
// 11718
o100["60"] = o101;
// undefined
o101 = null;
// 11719
o101 = {};
// 11720
o100["61"] = o101;
// undefined
o101 = null;
// 11721
o101 = {};
// 11722
o100["62"] = o101;
// undefined
o101 = null;
// 11723
o101 = {};
// 11724
o100["63"] = o101;
// undefined
o101 = null;
// 11725
o101 = {};
// 11726
o100["64"] = o101;
// undefined
o101 = null;
// 11727
o101 = {};
// 11728
o100["65"] = o101;
// undefined
o101 = null;
// 11729
o101 = {};
// 11730
o100["66"] = o101;
// undefined
o101 = null;
// 11731
o101 = {};
// 11732
o100["67"] = o101;
// undefined
o101 = null;
// 11733
o101 = {};
// 11734
o100["68"] = o101;
// undefined
o100 = null;
// undefined
o101 = null;
// 11735
o100 = {};
// 11736
o84.classList = o100;
// 11738
o100.remove = f920654002_1451;
// undefined
o100 = null;
// 11739
f920654002_1451.returns.push(undefined);
// 11742
o84.offsetHeight = 200;
// 11746
f920654002_1451.returns.push(undefined);
// 11751
f920654002_1519.returns.push(false);
// 11753
f920654002_467.returns.push(o75);
// 11754
o100 = {};
// 11755
o75.classList = o100;
// 11757
o100.contains = f920654002_1519;
// undefined
o100 = null;
// 11758
f920654002_1519.returns.push(false);
// 11759
o84.parentNode = o75;
// undefined
o84 = null;
// undefined
o75 = null;
// 11761
f920654002_418.returns.push(1373491966218);
// 11764
f920654002_418.returns.push(1373491966220);
// 11767
f920654002_418.returns.push(1373491966220);
// 11770
f920654002_467.returns.push(o81);
// 11771
o81.__FB_TOKEN = void 0;
// 11772
// undefined
o81 = null;
// 11775
f920654002_467.returns.push(o93);
// 11776
o93.__FB_TOKEN = void 0;
// 11777
// undefined
o93 = null;
// 11780
f920654002_467.returns.push(o94);
// 11781
o94.__FB_TOKEN = void 0;
// 11782
// undefined
o94 = null;
// 11785
f920654002_467.returns.push(o95);
// 11786
o95.__FB_TOKEN = void 0;
// 11787
// undefined
o95 = null;
// 11790
f920654002_467.returns.push(o96);
// 11791
o96.__FB_TOKEN = void 0;
// 11792
// undefined
o96 = null;
// 11795
f920654002_467.returns.push(o77);
// 11796
o75 = {};
// 11797
f920654002_57.returns.push(o75);
// 11798
f920654002_417.returns.push(0.03181263036094606);
// 11799
// undefined
o75 = null;
// 11801
f920654002_418.returns.push(1373491966233);
// 11804
f920654002_418.returns.push(1373491966235);
// 11807
f920654002_418.returns.push(1373491966236);
// 11809
f920654002_418.returns.push(1373491966236);
// 11820
o75 = {};
// 11821
f920654002_467.returns.push(o75);
// 11822
o75.id = "u_0_3m";
// 11823
o75.getElementsByTagName = f920654002_453;
// 11825
o75.querySelectorAll = f920654002_462;
// undefined
o75 = null;
// 11826
o75 = {};
// 11827
f920654002_462.returns.push(o75);
// 11828
o75.length = 1;
// 11829
o81 = {};
// 11830
o75["0"] = o81;
// undefined
o75 = null;
// 11834
o75 = {};
// 11835
f920654002_462.returns.push(o75);
// 11836
o75.length = 0;
// undefined
o75 = null;
// 11840
o75 = {};
// 11841
f920654002_462.returns.push(o75);
// 11842
o75.length = 1;
// 11843
o84 = {};
// 11844
o75["0"] = o84;
// undefined
o75 = null;
// undefined
o84 = null;
// 11848
o75 = {};
// 11849
f920654002_462.returns.push(o75);
// 11850
o75.length = 0;
// undefined
o75 = null;
// 11854
o75 = {};
// 11855
f920654002_462.returns.push(o75);
// 11856
o75.length = 0;
// undefined
o75 = null;
// 11857
o81.nodeName = "LABEL";
// 11858
o81.getElementsByTagName = f920654002_453;
// undefined
o81 = null;
// 11859
o75 = {};
// 11860
f920654002_453.returns.push(o75);
// 11861
o75.length = 1;
// 11862
o81 = {};
// 11863
o75["0"] = o81;
// undefined
o75 = null;
// 11864
o81.__FB_TOKEN = void 0;
// 11865
// 11866
o81.getAttribute = f920654002_464;
// 11867
o81.hasAttribute = f920654002_465;
// 11869
f920654002_465.returns.push(false);
// 11870
o81.JSBNG__addEventListener = f920654002_419;
// 11872
f920654002_419.returns.push(undefined);
// 11873
o81.JSBNG__onclick = null;
// 11874
o81.nodeName = "INPUT";
// undefined
o81 = null;
// 11877
o75 = {};
// 11878
f920654002_467.returns.push(o75);
// 11879
o75.id = "u_0_p";
// 11880
o75.getElementsByTagName = f920654002_453;
// 11882
o75.querySelectorAll = f920654002_462;
// undefined
o75 = null;
// 11883
o75 = {};
// 11884
f920654002_462.returns.push(o75);
// 11885
o75.length = 1;
// 11886
o81 = {};
// 11887
o75["0"] = o81;
// undefined
o75 = null;
// 11891
o75 = {};
// 11892
f920654002_462.returns.push(o75);
// 11893
o75.length = 1;
// 11894
o84 = {};
// 11895
o75["0"] = o84;
// undefined
o75 = null;
// undefined
o84 = null;
// 11899
o75 = {};
// 11900
f920654002_462.returns.push(o75);
// 11901
o75.length = 1;
// 11902
o84 = {};
// 11903
o75["0"] = o84;
// undefined
o75 = null;
// undefined
o84 = null;
// 11907
o75 = {};
// 11908
f920654002_462.returns.push(o75);
// 11909
o75.length = 0;
// undefined
o75 = null;
// 11913
o75 = {};
// 11914
f920654002_462.returns.push(o75);
// 11915
o75.length = 0;
// undefined
o75 = null;
// 11916
o81.nodeName = "A";
// 11917
o81.__FB_TOKEN = void 0;
// 11918
// 11919
o81.getAttribute = f920654002_464;
// 11920
o81.hasAttribute = f920654002_465;
// 11922
f920654002_465.returns.push(false);
// 11923
o81.JSBNG__addEventListener = f920654002_419;
// 11925
f920654002_419.returns.push(undefined);
// 11926
o81.JSBNG__onclick = null;
// undefined
o81 = null;
// 11930
o75 = {};
// 11931
f920654002_467.returns.push(o75);
// 11932
o75.id = "u_0_n";
// 11933
o75.getElementsByTagName = f920654002_453;
// 11935
o75.querySelectorAll = f920654002_462;
// undefined
o75 = null;
// 11936
o75 = {};
// 11937
f920654002_462.returns.push(o75);
// 11938
o75.length = 1;
// 11939
o81 = {};
// 11940
o75["0"] = o81;
// undefined
o75 = null;
// 11944
o75 = {};
// 11945
f920654002_462.returns.push(o75);
// 11946
o75.length = 0;
// undefined
o75 = null;
// 11950
o75 = {};
// 11951
f920654002_462.returns.push(o75);
// 11952
o75.length = 1;
// 11953
o84 = {};
// 11954
o75["0"] = o84;
// undefined
o75 = null;
// undefined
o84 = null;
// 11958
o75 = {};
// 11959
f920654002_462.returns.push(o75);
// 11960
o75.length = 0;
// undefined
o75 = null;
// 11964
o75 = {};
// 11965
f920654002_462.returns.push(o75);
// 11966
o75.length = 0;
// undefined
o75 = null;
// 11967
o81.nodeName = "LABEL";
// 11968
o81.getElementsByTagName = f920654002_453;
// undefined
o81 = null;
// 11969
o75 = {};
// 11970
f920654002_453.returns.push(o75);
// 11971
o75.length = 1;
// 11972
o81 = {};
// 11973
o75["0"] = o81;
// undefined
o75 = null;
// 11974
o81.__FB_TOKEN = void 0;
// 11975
// 11976
o81.getAttribute = f920654002_464;
// 11977
o81.hasAttribute = f920654002_465;
// 11979
f920654002_465.returns.push(false);
// 11980
o81.JSBNG__addEventListener = f920654002_419;
// 11982
f920654002_419.returns.push(undefined);
// 11983
o81.JSBNG__onclick = null;
// 11984
o81.nodeName = "INPUT";
// undefined
o81 = null;
// 11987
f920654002_467.returns.push(o97);
// 11988
o97.id = "u_0_13";
// 11989
o97.getElementsByTagName = f920654002_453;
// 11991
o97.querySelectorAll = f920654002_462;
// undefined
o97 = null;
// 11992
o75 = {};
// 11993
f920654002_462.returns.push(o75);
// 11994
o75.length = 1;
// 11995
o81 = {};
// 11996
o75["0"] = o81;
// undefined
o75 = null;
// 12000
o75 = {};
// 12001
f920654002_462.returns.push(o75);
// 12002
o75.length = 0;
// undefined
o75 = null;
// 12006
o75 = {};
// 12007
f920654002_462.returns.push(o75);
// 12008
o75.length = 1;
// 12009
o84 = {};
// 12010
o75["0"] = o84;
// undefined
o75 = null;
// undefined
o84 = null;
// 12014
o75 = {};
// 12015
f920654002_462.returns.push(o75);
// 12016
o75.length = 0;
// undefined
o75 = null;
// 12020
o75 = {};
// 12021
f920654002_462.returns.push(o75);
// 12022
o75.length = 0;
// undefined
o75 = null;
// 12023
o81.nodeName = "LABEL";
// 12024
o81.getElementsByTagName = f920654002_453;
// undefined
o81 = null;
// 12025
o75 = {};
// 12026
f920654002_453.returns.push(o75);
// 12027
o75.length = 1;
// 12028
o81 = {};
// 12029
o75["0"] = o81;
// undefined
o75 = null;
// 12030
o81.__FB_TOKEN = void 0;
// 12031
// 12032
o81.getAttribute = f920654002_464;
// 12033
o81.hasAttribute = f920654002_465;
// 12035
f920654002_465.returns.push(false);
// 12036
o81.JSBNG__addEventListener = f920654002_419;
// 12038
f920654002_419.returns.push(undefined);
// 12039
o81.JSBNG__onclick = null;
// 12040
o81.nodeName = "INPUT";
// undefined
o81 = null;
// 12045
f920654002_419.returns.push(undefined);
// 12046
o39.JSBNG__onmouseover = null;
// 12053
f920654002_419.returns.push(undefined);
// 12054
o39.JSBNG__onmouseout = null;
// undefined
o39 = null;
// 12059
o39 = {};
// 12060
f920654002_467.returns.push(o39);
// 12061
o39.getElementsByTagName = f920654002_453;
// 12063
o39.querySelectorAll = f920654002_462;
// 12064
o75 = {};
// 12065
f920654002_462.returns.push(o75);
// 12066
o75.length = 1;
// 12067
o81 = {};
// 12068
o75["0"] = o81;
// undefined
o75 = null;
// 12072
o75 = {};
// 12073
f920654002_462.returns.push(o75);
// 12074
o75.length = 5;
// 12075
o75["0"] = o81;
// undefined
o81 = null;
// 12076
o81 = {};
// 12077
o75["1"] = o81;
// undefined
o81 = null;
// 12078
o81 = {};
// 12079
o75["2"] = o81;
// undefined
o81 = null;
// 12080
o81 = {};
// 12081
o75["3"] = o81;
// undefined
o81 = null;
// 12082
o75["4"] = o38;
// undefined
o75 = null;
// 12083
o75 = {};
// 12084
o39.classList = o75;
// 12086
o75.contains = f920654002_1519;
// undefined
o75 = null;
// 12087
f920654002_1519.returns.push(false);
// 12088
o75 = {};
// 12089
o39.parentNode = o75;
// 12090
o81 = {};
// 12091
o75.classList = o81;
// 12093
o81.contains = f920654002_1519;
// undefined
o81 = null;
// 12094
f920654002_1519.returns.push(true);
// 12095
o75.offsetWidth = 850;
// 12096
o38.offsetLeft = 538;
// 12097
o38.offsetWidth = 85;
// undefined
o38 = null;
// 12103
f920654002_1519.returns.push(false);
// 12108
f920654002_1519.returns.push(false);
// 12109
o38 = {};
// 12110
o75.parentNode = o38;
// 12111
o81 = {};
// 12112
o38.classList = o81;
// 12114
o81.contains = f920654002_1519;
// undefined
o81 = null;
// 12115
f920654002_1519.returns.push(false);
// 12116
o38.parentNode = o25;
// 12120
f920654002_1519.returns.push(false);
// 12125
f920654002_1519.returns.push(false);
// 12126
o81 = {};
// 12127
o40.parentNode = o81;
// 12128
o84 = {};
// 12129
o81.classList = o84;
// 12131
o84.contains = f920654002_1519;
// 12132
f920654002_1519.returns.push(true);
// 12135
o84.remove = f920654002_1451;
// undefined
o84 = null;
// 12136
f920654002_1451.returns.push(undefined);
// 12138
o84 = {};
// 12139
o93 = {};
// 12141
o84.length = 1;
// 12142
o84["0"] = "3SGVa";
// 12145
f920654002_418.returns.push(1373491967488);
// 12148
f920654002_418.returns.push(1373491967489);
// 12150
f920654002_418.returns.push(1373491967489);
// 12153
f920654002_418.returns.push(1373491967490);
// 12156
f920654002_418.returns.push(1373491967490);
// 12158
f920654002_418.returns.push(1373491967491);
// 12164
ow920654002.JSBNG__cancelAnimationFrame = undefined;
// 12170
f920654002_419.returns.push(undefined);
// 12171
o0.JSBNG__onfullscreenchange = void 0;
// 12176
f920654002_419.returns.push(undefined);
// 12177
o0.JSBNG__onmozfullscreenchange = void 0;
// 12182
f920654002_419.returns.push(undefined);
// 12183
o0.JSBNG__onwebkitfullscreenchange = null;
// 12188
o94 = {};
// 12189
f920654002_427.returns.push(o94);
// 12190
// 12191
// 12192
o94.getElementsByTagName = f920654002_453;
// 12193
o95 = {};
// 12194
f920654002_453.returns.push(o95);
// 12195
o95.length = 0;
// undefined
o95 = null;
// 12197
o95 = {};
// 12198
o94.childNodes = o95;
// undefined
o94 = null;
// 12199
o95.item = f920654002_456;
// 12200
o95.length = 1;
// 12201
o94 = {};
// 12202
o95["0"] = o94;
// undefined
o95 = null;
// undefined
o94 = null;
// 12209
o20.__html = void 0;
// 12210
o20.mountComponentIntoNode = void 0;
// undefined
o20 = null;
// 12212
o20 = {};
// 12213
f920654002_427.returns.push(o20);
// 12214
// 12215
o20.firstChild = null;
// 12217
o94 = {};
// 12218
f920654002_425.returns.push(o94);
// 12220
o20.appendChild = f920654002_429;
// 12221
f920654002_429.returns.push(o94);
// undefined
o94 = null;
// 12223
o94 = {};
// 12224
f920654002_427.returns.push(o94);
// 12225
// 12226
o94.firstChild = null;
// 12228
o95 = {};
// 12229
f920654002_425.returns.push(o95);
// 12230
o20.__html = void 0;
// undefined
o20 = null;
// 12231
o94.appendChild = f920654002_429;
// 12232
f920654002_429.returns.push(o95);
// undefined
o95 = null;
// 12233
o94.setAttribute = f920654002_587;
// 12235
f920654002_587.returns.push(undefined);
// 12238
f920654002_587.returns.push(undefined);
// 12239
// 12242
f920654002_587.returns.push(undefined);
// 12245
f920654002_587.returns.push(undefined);
// 12246
o20 = {};
// 12247
o94.classList = o20;
// 12249
o20.add = f920654002_1038;
// 12250
f920654002_1038.returns.push(undefined);
// 12254
f920654002_1038.returns.push(undefined);
// 12258
f920654002_1038.returns.push(undefined);
// 12259
o94.__FB_TOKEN = void 0;
// 12260
// 12265
o95 = {};
// 12266
f920654002_462.returns.push(o95);
// 12267
o95.length = 1;
// 12268
o95["0"] = o91;
// undefined
o95 = null;
// 12269
f920654002_1989 = function() { return f920654002_1989.returns[f920654002_1989.inst++]; };
f920654002_1989.returns = [];
f920654002_1989.inst = 0;
// 12270
o0.webkitCancelFullScreen = f920654002_1989;
// 12271
o0.mozCancelFullScreen = void 0;
// 12272
o0.cancelFullScreen = void 0;
// 12273
o0.exitFullScreen = void 0;
// 12274
o94.getElementsByTagName = f920654002_453;
// 12276
o94.querySelectorAll = f920654002_462;
// undefined
o94 = null;
// 12277
o94 = {};
// 12278
f920654002_462.returns.push(o94);
// 12279
o94.length = 0;
// undefined
o94 = null;
// 12283
o94 = {};
// 12284
f920654002_462.returns.push(o94);
// 12285
o94.length = 0;
// undefined
o94 = null;
// 12289
o94 = {};
// 12290
f920654002_462.returns.push(o94);
// 12291
o94.length = 0;
// undefined
o94 = null;
// 12294
o20.remove = f920654002_1451;
// undefined
o20 = null;
// 12295
f920654002_1451.returns.push(undefined);
// 12297
f920654002_418.returns.push(1373491968084);
// 12299
f920654002_418.returns.push(1373491968084);
// 12301
o20 = {};
// 12302
o94 = {};
// 12304
o20.length = 1;
// 12305
o20["0"] = "+h1d2";
// 12308
f920654002_418.returns.push(1373491968087);
// 12311
f920654002_418.returns.push(1373491968087);
// 12313
f920654002_418.returns.push(1373491968088);
// 12316
f920654002_418.returns.push(1373491968089);
// 12319
f920654002_418.returns.push(1373491968089);
// 12321
f920654002_418.returns.push(1373491968089);
// 12324
f920654002_418.returns.push(1373491968090);
// 12327
f920654002_418.returns.push(1373491968090);
// 12329
f920654002_418.returns.push(1373491968091);
// 12332
f920654002_418.returns.push(1373491968091);
// 12335
f920654002_418.returns.push(1373491968092);
// 12337
f920654002_418.returns.push(1373491968092);
// 12344
o95 = {};
// 12345
f920654002_467.returns.push(o95);
// 12347
o96 = {};
// 12348
f920654002_467.returns.push(o96);
// 12349
o95.nodeName = "A";
// 12350
o95.__FB_TOKEN = void 0;
// 12351
// 12352
o95.getAttribute = f920654002_464;
// 12353
o95.hasAttribute = f920654002_465;
// 12355
f920654002_465.returns.push(false);
// 12356
o95.JSBNG__addEventListener = f920654002_419;
// 12358
f920654002_419.returns.push(undefined);
// 12359
o95.JSBNG__onclick = null;
// undefined
o95 = null;
// 12363
o95 = {};
// 12364
f920654002_467.returns.push(o95);
// 12366
o97 = {};
// 12367
f920654002_467.returns.push(o97);
// 12368
o95.nodeName = "A";
// 12369
o95.__FB_TOKEN = void 0;
// 12370
// 12371
o95.getAttribute = f920654002_464;
// 12372
o95.hasAttribute = f920654002_465;
// 12374
f920654002_465.returns.push(false);
// 12375
o95.JSBNG__addEventListener = f920654002_419;
// 12377
f920654002_419.returns.push(undefined);
// 12378
o95.JSBNG__onclick = null;
// undefined
o95 = null;
// 12388
f920654002_467.returns.push(o96);
// undefined
o96 = null;
// 12391
f920654002_467.returns.push(o97);
// undefined
o97 = null;
// 12397
o95 = {};
// 12398
o96 = {};
// 12400
o95.length = 1;
// 12401
o95["0"] = "bUzfU";
// 12404
f920654002_418.returns.push(1373491972531);
// 12407
f920654002_418.returns.push(1373491972531);
// 12410
o97 = {};
// 12411
f920654002_467.returns.push(o97);
// undefined
o97 = null;
// 12413
o97 = {};
// 12414
f920654002_467.returns.push(o97);
// undefined
o97 = null;
// 12416
o97 = {};
// 12417
f920654002_467.returns.push(o97);
// 12419
o100 = {};
// 12420
f920654002_467.returns.push(o100);
// 12421
o97.nodeName = "LI";
// 12422
o97.__FB_TOKEN = void 0;
// 12423
// 12424
o97.getAttribute = f920654002_464;
// 12425
o97.hasAttribute = f920654002_465;
// 12427
f920654002_465.returns.push(false);
// 12428
o97.JSBNG__addEventListener = f920654002_419;
// 12430
f920654002_419.returns.push(undefined);
// 12431
o97.JSBNG__onclick = null;
// undefined
o97 = null;
// 12433
o100.nodeName = "LI";
// 12434
o100.__FB_TOKEN = void 0;
// 12435
// 12436
o100.getAttribute = f920654002_464;
// 12437
o100.hasAttribute = f920654002_465;
// 12439
f920654002_465.returns.push(false);
// 12440
o100.JSBNG__addEventListener = f920654002_419;
// 12442
f920654002_419.returns.push(undefined);
// 12443
o100.JSBNG__onclick = null;
// undefined
o100 = null;
// 12448
f920654002_418.returns.push(1373491972575);
// 12451
f920654002_418.returns.push(1373491972577);
// 12454
f920654002_418.returns.push(1373491972577);
// 12456
f920654002_418.returns.push(1373491972577);
// undefined
fo920654002_1_cookie.returns.push("p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 12465
f920654002_418.returns.push(1373491972671);
// 12466
f920654002_13.returns.push(1227);
// 12468
f920654002_418.returns.push(1373491972671);
// 12469
f920654002_417.returns.push(0.16571733867749572);
// 12471
f920654002_418.returns.push(1373491972672);
// 12474
f920654002_418.returns.push(1373491972672);
// 12476
f920654002_417.returns.push(0.9104009540751576);
// undefined
fo920654002_1_cookie.returns.push("p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 12479
// 12480
f920654002_2005 = function() { return f920654002_2005.returns[f920654002_2005.inst++]; };
f920654002_2005.returns = [];
f920654002_2005.inst = 0;
// 12481
ow920654002.JSBNG__onpageshow = f920654002_2005;
// 12482
f920654002_7.returns.push(undefined);
// 12483
f920654002_2006 = function() { return f920654002_2006.returns[f920654002_2006.inst++]; };
f920654002_2006.returns = [];
f920654002_2006.inst = 0;
// 12484
ow920654002.JSBNG__onpagehide = f920654002_2006;
// 12487
o97 = {};
// 12488
f920654002_0.returns.push(o97);
// undefined
o97 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 12490
f920654002_14.returns.push(undefined);
// 12491
o97 = {};
// 12492
f920654002_0.returns.push(o97);
// undefined
o97 = null;
// 12493
o97 = {};
// 12494
f920654002_0.returns.push(o97);
// undefined
o97 = null;
// 12495
o97 = {};
// 12496
f920654002_0.returns.push(o97);
// undefined
o97 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 12498
o97 = {};
// 12499
f920654002_56.returns.push(o97);
// 12500
o97.open = f920654002_1466;
// 12501
f920654002_1466.returns.push(undefined);
// 12502
// 12503
f920654002_12.returns.push(1228);
// 12505
f920654002_418.returns.push(1373491972683);
// 12506
o97.send = f920654002_1468;
// 12507
f920654002_1468.returns.push(undefined);
// 12510
f920654002_418.returns.push(1373491972685);
// 12512
f920654002_418.returns.push(1373491972687);
// 12514
f920654002_418.returns.push(1373491972687);
// 12515
f920654002_13.returns.push(1229);
// 12516
f920654002_13.returns.push(1230);
// 12518
f920654002_418.returns.push(1373491972689);
// 12519
f920654002_12.returns.push(1231);
// 12521
f920654002_12.returns.push(1232);
// 12522
f920654002_12.returns.push(1233);
// 12523
f920654002_12.returns.push(1234);
// 12524
f920654002_12.returns.push(1235);
// 12525
f920654002_12.returns.push(1236);
// 12527
f920654002_418.returns.push(1373491972698);
// 12529
f920654002_418.returns.push(1373491972701);
// 12531
f920654002_418.returns.push(1373491972701);
// 12533
f920654002_418.returns.push(1373491972701);
// 12534
f920654002_14.returns.push(undefined);
// 12535
f920654002_12.returns.push(1237);
// 12536
f920654002_12.returns.push(1238);
// 12539
o100 = {};
// 12540
f920654002_467.returns.push(o100);
// 12543
f920654002_418.returns.push(1373491972712);
// 12545
o101 = {};
// 12546
f920654002_467.returns.push(o101);
// 12547
o101.__FB_TOKEN = void 0;
// 12548
// 12549
o100.getElementsByTagName = f920654002_453;
// 12551
o100.querySelectorAll = f920654002_462;
// 12552
o102 = {};
// 12553
f920654002_462.returns.push(o102);
// 12554
o102.length = 0;
// undefined
o102 = null;
// 12558
o102 = {};
// 12559
f920654002_462.returns.push(o102);
// 12560
o102.length = 0;
// undefined
o102 = null;
// 12564
o102 = {};
// 12565
f920654002_467.returns.push(o102);
// 12566
o102.nodeName = "BUTTON";
// 12567
o102.__FB_TOKEN = void 0;
// 12568
// 12569
o102.getAttribute = f920654002_464;
// 12570
o102.hasAttribute = f920654002_465;
// 12572
f920654002_465.returns.push(false);
// 12573
o102.JSBNG__addEventListener = f920654002_419;
// 12575
f920654002_419.returns.push(undefined);
// 12576
f920654002_2017 = function() { return f920654002_2017.returns[f920654002_2017.inst++]; };
f920654002_2017.returns = [];
f920654002_2017.inst = 0;
// 12577
o102.JSBNG__onclick = f920654002_2017;
// 12580
// undefined
o102 = null;
// 12585
o102 = {};
// 12586
f920654002_467.returns.push(o102);
// 12589
f920654002_418.returns.push(1373491973219);
// 12591
o103 = {};
// 12592
f920654002_467.returns.push(o103);
// 12593
o103.__FB_TOKEN = void 0;
// 12594
// undefined
o103 = null;
// 12595
o102.getElementsByTagName = f920654002_453;
// 12597
o102.querySelectorAll = f920654002_462;
// undefined
o102 = null;
// 12598
o102 = {};
// 12599
f920654002_462.returns.push(o102);
// 12600
o102.length = 0;
// undefined
o102 = null;
// 12604
o102 = {};
// 12605
f920654002_462.returns.push(o102);
// 12606
o102.length = 0;
// undefined
o102 = null;
// 12610
o102 = {};
// 12611
f920654002_467.returns.push(o102);
// 12612
o102.nodeName = "BUTTON";
// 12613
o102.__FB_TOKEN = void 0;
// 12614
// 12615
o102.getAttribute = f920654002_464;
// 12616
o102.hasAttribute = f920654002_465;
// 12618
f920654002_465.returns.push(false);
// 12619
o102.JSBNG__addEventListener = f920654002_419;
// 12621
f920654002_419.returns.push(undefined);
// 12622
f920654002_2023 = function() { return f920654002_2023.returns[f920654002_2023.inst++]; };
f920654002_2023.returns = [];
f920654002_2023.inst = 0;
// 12623
o102.JSBNG__onclick = f920654002_2023;
// 12626
// undefined
o102 = null;
// 12635
o102 = {};
// 12636
f920654002_427.returns.push(o102);
// 12637
// 12638
// 12639
o102.getElementsByTagName = f920654002_453;
// 12640
o103 = {};
// 12641
f920654002_453.returns.push(o103);
// 12642
o103.length = 0;
// undefined
o103 = null;
// 12644
o103 = {};
// 12645
o102.childNodes = o103;
// undefined
o102 = null;
// 12646
o103.item = f920654002_456;
// 12647
o103.length = 1;
// 12648
o102 = {};
// 12649
o103["0"] = o102;
// undefined
o103 = null;
// 12650
o102.__html = void 0;
// 12651
o102.mountComponentIntoNode = void 0;
// 12652
o103 = {};
// 12653
o102.classList = o103;
// 12655
o103.add = f920654002_1038;
// 12656
f920654002_1038.returns.push(undefined);
// 12657
o102.__FB_TOKEN = void 0;
// 12658
// 12659
o102.getElementsByTagName = f920654002_453;
// 12661
o102.querySelectorAll = f920654002_462;
// 12662
o104 = {};
// 12663
f920654002_462.returns.push(o104);
// 12664
o104.length = 1;
// 12665
o105 = {};
// 12666
o104["0"] = o105;
// undefined
o104 = null;
// 12670
f920654002_1038.returns.push(undefined);
// 12674
o104 = {};
// 12675
f920654002_425.returns.push(o104);
// 12677
o16.appendChild = f920654002_429;
// 12678
f920654002_429.returns.push(o104);
// undefined
o104 = null;
// 12679
o105.__FB_TOKEN = void 0;
// 12680
// 12681
o105.getAttribute = f920654002_464;
// 12682
o105.hasAttribute = f920654002_465;
// 12684
f920654002_465.returns.push(true);
// 12686
f920654002_464.returns.push("300");
// 12690
f920654002_465.returns.push(false);
// 12693
o103.remove = f920654002_1451;
// undefined
o103 = null;
// 12694
f920654002_1451.returns.push(undefined);
// 12698
f920654002_465.returns.push(false);
// 12702
f920654002_465.returns.push(true);
// 12704
f920654002_464.returns.push("false");
// 12708
f920654002_465.returns.push(false);
// 12712
f920654002_465.returns.push(false);
// 12716
f920654002_465.returns.push(true);
// 12718
f920654002_464.returns.push("false");
// 12719
o102.getAttribute = f920654002_464;
// 12720
o102.hasAttribute = f920654002_465;
// 12722
f920654002_465.returns.push(false);
// 12726
f920654002_1451.returns.push(undefined);
// 12730
f920654002_465.returns.push(false);
// 12734
f920654002_465.returns.push(false);
// 12738
f920654002_465.returns.push(true);
// 12740
f920654002_464.returns.push("left");
// 12744
f920654002_1451.returns.push(undefined);
// 12748
f920654002_1451.returns.push(undefined);
// 12752
f920654002_1038.returns.push(undefined);
// 12756
f920654002_1451.returns.push(undefined);
// 12760
f920654002_1451.returns.push(undefined);
// 12761
o103 = {};
// 12762
o105.classList = o103;
// 12764
o103.remove = f920654002_1451;
// 12765
f920654002_1451.returns.push(undefined);
// 12769
f920654002_1451.returns.push(undefined);
// 12773
f920654002_1451.returns.push(undefined);
// 12776
o103.add = f920654002_1038;
// undefined
o103 = null;
// 12777
f920654002_1038.returns.push(undefined);
// 12781
f920654002_1451.returns.push(undefined);
// 12783
o103 = {};
// 12784
f920654002_427.returns.push(o103);
// 12785
// 12786
o103.__html = void 0;
// 12788
o104 = {};
// 12789
f920654002_425.returns.push(o104);
// 12791
o105.appendChild = f920654002_429;
// undefined
o105 = null;
// 12792
f920654002_429.returns.push(o104);
// undefined
o104 = null;
// 12793
o104 = {};
// 12794
o103.style = o104;
// undefined
o103 = null;
// 12795
// 12797
// 12799
// 12801
// 12803
// 12805
// undefined
o104 = null;
// 12809
f920654002_465.returns.push(false);
// 12813
o103 = {};
// 12814
f920654002_462.returns.push(o103);
// 12815
o103.length = 1;
// 12816
o104 = {};
// 12817
o103["0"] = o104;
// undefined
o103 = null;
// 12818
o104.setAttribute = f920654002_587;
// 12819
f920654002_587.returns.push(undefined);
// 12820
o104.getElementsByTagName = f920654002_453;
// 12822
o104.querySelectorAll = f920654002_462;
// undefined
o104 = null;
// 12823
o103 = {};
// 12824
f920654002_462.returns.push(o103);
// 12825
o103.length = 0;
// undefined
o103 = null;
// 12826
o102.nodeName = "DIV";
// 12830
f920654002_465.returns.push(false);
// 12831
o102.JSBNG__addEventListener = f920654002_419;
// 12833
f920654002_419.returns.push(undefined);
// 12834
o102.JSBNG__onclick = null;
// 12839
f920654002_419.returns.push(undefined);
// 12840
o102.JSBNG__onsubmit = null;
// 12845
f920654002_419.returns.push(undefined);
// 12846
o102.JSBNG__onsuccess = void 0;
// 12851
f920654002_419.returns.push(undefined);
// 12852
o102.JSBNG__onerror = null;
// undefined
o102 = null;
// 12854
f920654002_12.returns.push(1239);
// 12857
o102 = {};
// 12858
f920654002_427.returns.push(o102);
// 12859
// 12860
// 12861
o102.getElementsByTagName = f920654002_453;
// 12862
o103 = {};
// 12863
f920654002_453.returns.push(o103);
// 12864
o103.length = 0;
// undefined
o103 = null;
// 12866
o103 = {};
// 12867
o102.childNodes = o103;
// undefined
o102 = null;
// 12868
o103.item = f920654002_456;
// 12869
o103.length = 1;
// 12870
o102 = {};
// 12871
o103["0"] = o102;
// undefined
o103 = null;
// 12872
o102.__html = void 0;
// 12873
o102.mountComponentIntoNode = void 0;
// 12874
o103 = {};
// 12875
o102.classList = o103;
// 12877
o103.add = f920654002_1038;
// 12878
f920654002_1038.returns.push(undefined);
// 12879
o102.__FB_TOKEN = void 0;
// 12880
// 12881
o102.getElementsByTagName = f920654002_453;
// 12883
o102.querySelectorAll = f920654002_462;
// 12884
o104 = {};
// 12885
f920654002_462.returns.push(o104);
// 12886
o104.length = 1;
// 12887
o105 = {};
// 12888
o104["0"] = o105;
// undefined
o104 = null;
// 12892
f920654002_1038.returns.push(undefined);
// 12896
o104 = {};
// 12897
f920654002_425.returns.push(o104);
// 12900
f920654002_429.returns.push(o104);
// undefined
o104 = null;
// 12901
o105.__FB_TOKEN = void 0;
// 12902
// 12903
o105.getAttribute = f920654002_464;
// 12904
o105.hasAttribute = f920654002_465;
// 12906
f920654002_465.returns.push(true);
// 12908
f920654002_464.returns.push("300");
// 12912
f920654002_465.returns.push(false);
// 12915
o103.remove = f920654002_1451;
// undefined
o103 = null;
// 12916
f920654002_1451.returns.push(undefined);
// 12920
f920654002_465.returns.push(false);
// 12924
f920654002_465.returns.push(true);
// 12926
f920654002_464.returns.push("false");
// 12930
f920654002_465.returns.push(false);
// 12934
f920654002_465.returns.push(false);
// 12938
f920654002_465.returns.push(true);
// 12940
f920654002_464.returns.push("false");
// 12941
o102.getAttribute = f920654002_464;
// 12942
o102.hasAttribute = f920654002_465;
// 12944
f920654002_465.returns.push(false);
// 12948
f920654002_1451.returns.push(undefined);
// 12952
f920654002_465.returns.push(false);
// 12956
f920654002_465.returns.push(false);
// 12960
f920654002_465.returns.push(true);
// 12962
f920654002_464.returns.push("left");
// 12966
f920654002_1451.returns.push(undefined);
// 12970
f920654002_1451.returns.push(undefined);
// 12974
f920654002_1038.returns.push(undefined);
// 12978
f920654002_1451.returns.push(undefined);
// 12982
f920654002_1451.returns.push(undefined);
// 12983
o103 = {};
// 12984
o105.classList = o103;
// 12986
o103.remove = f920654002_1451;
// 12987
f920654002_1451.returns.push(undefined);
// 12991
f920654002_1451.returns.push(undefined);
// 12995
f920654002_1451.returns.push(undefined);
// 12998
o103.add = f920654002_1038;
// undefined
o103 = null;
// 12999
f920654002_1038.returns.push(undefined);
// 13003
f920654002_1451.returns.push(undefined);
// 13005
o103 = {};
// 13006
f920654002_427.returns.push(o103);
// 13007
// 13008
o103.__html = void 0;
// 13010
o104 = {};
// 13011
f920654002_425.returns.push(o104);
// 13013
o105.appendChild = f920654002_429;
// undefined
o105 = null;
// 13014
f920654002_429.returns.push(o104);
// undefined
o104 = null;
// 13015
o104 = {};
// 13016
o103.style = o104;
// undefined
o103 = null;
// 13017
// 13019
// 13021
// 13023
// 13025
// 13027
// undefined
o104 = null;
// 13031
f920654002_465.returns.push(false);
// 13035
o103 = {};
// 13036
f920654002_462.returns.push(o103);
// 13037
o103.length = 1;
// 13038
o104 = {};
// 13039
o103["0"] = o104;
// undefined
o103 = null;
// 13040
o104.setAttribute = f920654002_587;
// 13041
f920654002_587.returns.push(undefined);
// 13042
o104.getElementsByTagName = f920654002_453;
// 13044
o104.querySelectorAll = f920654002_462;
// undefined
o104 = null;
// 13045
o103 = {};
// 13046
f920654002_462.returns.push(o103);
// 13047
o103.length = 0;
// undefined
o103 = null;
// 13048
o102.nodeName = "DIV";
// 13052
f920654002_465.returns.push(false);
// 13053
o102.JSBNG__addEventListener = f920654002_419;
// 13055
f920654002_419.returns.push(undefined);
// 13056
o102.JSBNG__onclick = null;
// 13061
f920654002_419.returns.push(undefined);
// 13062
o102.JSBNG__onsubmit = null;
// 13067
f920654002_419.returns.push(undefined);
// 13068
o102.JSBNG__onsuccess = void 0;
// 13073
f920654002_419.returns.push(undefined);
// 13074
o102.JSBNG__onerror = null;
// undefined
o102 = null;
// 13076
f920654002_12.returns.push(1240);
// 13080
o102 = {};
// 13081
o103 = {};
// 13083
o102.length = 1;
// 13084
o102["0"] = "EzMPG";
// 13092
f920654002_418.returns.push(1373491973954);
// 13097
o104 = {};
// 13098
f920654002_467.returns.push(o104);
// 13100
o105 = {};
// 13101
f920654002_427.returns.push(o105);
// 13102
// 13103
// 13104
o105.getElementsByTagName = f920654002_453;
// 13105
o106 = {};
// 13106
f920654002_453.returns.push(o106);
// 13107
o106.length = 0;
// undefined
o106 = null;
// 13109
o106 = {};
// 13110
o105.childNodes = o106;
// undefined
o105 = null;
// 13111
o106.item = f920654002_456;
// 13112
o106.length = 1;
// 13113
o105 = {};
// 13114
o106["0"] = o105;
// undefined
o106 = null;
// undefined
o105 = null;
// 13116
o105 = {};
// 13117
f920654002_427.returns.push(o105);
// 13118
// 13119
// 13120
o105.getElementsByTagName = f920654002_453;
// 13121
o106 = {};
// 13122
f920654002_453.returns.push(o106);
// 13123
o106.length = 0;
// undefined
o106 = null;
// 13125
o106 = {};
// 13126
o105.childNodes = o106;
// undefined
o105 = null;
// 13127
o106.item = f920654002_456;
// 13128
o106.length = 1;
// 13129
o105 = {};
// 13130
o106["0"] = o105;
// undefined
o106 = null;
// undefined
o105 = null;
// 13131
o105 = {};
// 13132
o104.classList = o105;
// 13134
o105.contains = f920654002_1519;
// undefined
o105 = null;
// 13135
f920654002_1519.returns.push(false);
// 13136
o104.parentNode = o64;
// 13137
o105 = {};
// 13138
o64.classList = o105;
// 13140
o105.contains = f920654002_1519;
// undefined
o105 = null;
// 13141
f920654002_1519.returns.push(false);
// 13142
o64.parentNode = o63;
// undefined
o64 = null;
// 13143
o64 = {};
// 13144
o63.classList = o64;
// 13146
o64.contains = f920654002_1519;
// undefined
o64 = null;
// 13147
f920654002_1519.returns.push(false);
// 13148
o63.parentNode = o62;
// undefined
o63 = null;
// 13149
o63 = {};
// 13150
o62.classList = o63;
// 13152
o63.contains = f920654002_1519;
// undefined
o63 = null;
// 13153
f920654002_1519.returns.push(false);
// 13154
o62.parentNode = o60;
// 13157
o61.contains = f920654002_1519;
// undefined
o61 = null;
// 13158
f920654002_1519.returns.push(false);
// 13159
o61 = {};
// 13160
o60.parentNode = o61;
// undefined
o60 = null;
// 13161
o60 = {};
// 13162
o61.classList = o60;
// 13164
o60.contains = f920654002_1519;
// undefined
o60 = null;
// 13165
f920654002_1519.returns.push(false);
// 13166
o60 = {};
// 13167
o61.parentNode = o60;
// 13168
o63 = {};
// 13169
o60.classList = o63;
// 13171
o63.contains = f920654002_1519;
// 13172
f920654002_1519.returns.push(false);
// 13173
o60.parentNode = o59;
// 13174
o64 = {};
// 13175
o59.classList = o64;
// 13177
o64.contains = f920654002_1519;
// undefined
o64 = null;
// 13178
f920654002_1519.returns.push(false);
// 13179
o59.parentNode = o91;
// undefined
o59 = null;
// 13183
f920654002_1519.returns.push(false);
// 13188
f920654002_1519.returns.push(false);
// 13193
f920654002_1519.returns.push(false);
// 13201
f920654002_1519.returns.push(false);
// 13206
f920654002_1519.returns.push(false);
// 13211
f920654002_1519.returns.push(false);
// 13216
f920654002_1519.returns.push(false);
// 13221
f920654002_1519.returns.push(false);
// 13226
f920654002_1519.returns.push(false);
// 13231
f920654002_1519.returns.push(false);
// 13236
f920654002_1519.returns.push(false);
// 13241
f920654002_1519.returns.push(false);
// 13246
f920654002_1519.returns.push(false);
// 13251
f920654002_1519.returns.push(false);
// 13256
o104.getElementsByTagName = f920654002_453;
// 13258
o104.querySelectorAll = f920654002_462;
// 13259
o59 = {};
// 13260
f920654002_462.returns.push(o59);
// 13261
o59.length = 1;
// 13262
o64 = {};
// 13263
o59["0"] = o64;
// undefined
o59 = null;
// undefined
o64 = null;
// 13267
f920654002_1519.returns.push(false);
// 13272
f920654002_1519.returns.push(false);
// 13277
f920654002_1519.returns.push(false);
// 13282
f920654002_1519.returns.push(false);
// 13287
f920654002_1519.returns.push(true);
// 13291
f920654002_1519.returns.push(false);
// 13296
f920654002_1519.returns.push(false);
// 13301
f920654002_1519.returns.push(false);
// 13306
f920654002_1519.returns.push(false);
// 13311
f920654002_1519.returns.push(false);
// 13316
f920654002_1519.returns.push(false);
// 13321
f920654002_1519.returns.push(true);
// 13325
f920654002_1519.returns.push(false);
// 13330
f920654002_1519.returns.push(false);
// 13335
f920654002_1519.returns.push(false);
// 13340
f920654002_1519.returns.push(true);
// 13341
o104.nodeName = "DIV";
// 13342
o104.__FB_TOKEN = void 0;
// 13343
// 13344
o104.getAttribute = f920654002_464;
// 13345
o104.hasAttribute = f920654002_465;
// 13347
f920654002_465.returns.push(false);
// 13348
o104.JSBNG__addEventListener = f920654002_419;
// 13350
f920654002_419.returns.push(undefined);
// 13351
o104.JSBNG__onclick = null;
// 13356
f920654002_419.returns.push(undefined);
// 13357
o104.JSBNG__onmouseover = null;
// 13362
f920654002_419.returns.push(undefined);
// 13363
o104.JSBNG__onmouseout = null;
// undefined
o104 = null;
// 13365
f920654002_14.returns.push(undefined);
// 13366
f920654002_12.returns.push(1241);
// 13369
o59 = {};
// 13370
f920654002_467.returns.push(o59);
// 13372
o64 = {};
// 13373
f920654002_427.returns.push(o64);
// 13374
// 13375
// 13376
o64.getElementsByTagName = f920654002_453;
// 13377
o104 = {};
// 13378
f920654002_453.returns.push(o104);
// 13379
o104.length = 0;
// undefined
o104 = null;
// 13381
o104 = {};
// 13382
o64.childNodes = o104;
// undefined
o64 = null;
// 13383
o104.item = f920654002_456;
// 13384
o104.length = 1;
// 13385
o64 = {};
// 13386
o104["0"] = o64;
// undefined
o104 = null;
// undefined
o64 = null;
// 13388
o64 = {};
// 13389
f920654002_427.returns.push(o64);
// 13390
// 13391
// 13392
o64.getElementsByTagName = f920654002_453;
// 13393
o104 = {};
// 13394
f920654002_453.returns.push(o104);
// 13395
o104.length = 0;
// undefined
o104 = null;
// 13397
o104 = {};
// 13398
o64.childNodes = o104;
// undefined
o64 = null;
// 13399
o104.item = f920654002_456;
// 13400
o104.length = 1;
// 13401
o64 = {};
// 13402
o104["0"] = o64;
// undefined
o104 = null;
// undefined
o64 = null;
// 13403
o64 = {};
// 13404
o59.classList = o64;
// 13406
o64.contains = f920654002_1519;
// undefined
o64 = null;
// 13407
f920654002_1519.returns.push(false);
// 13408
o64 = {};
// 13409
o59.parentNode = o64;
// 13410
o104 = {};
// 13411
o64.classList = o104;
// 13413
o104.contains = f920654002_1519;
// undefined
o104 = null;
// 13414
f920654002_1519.returns.push(false);
// 13415
o104 = {};
// 13416
o64.parentNode = o104;
// undefined
o64 = null;
// 13417
o64 = {};
// 13418
o104.classList = o64;
// 13420
o64.contains = f920654002_1519;
// undefined
o64 = null;
// 13421
f920654002_1519.returns.push(false);
// 13422
o64 = {};
// 13423
o104.parentNode = o64;
// 13424
o105 = {};
// 13425
o64.classList = o105;
// 13427
o105.contains = f920654002_1519;
// undefined
o105 = null;
// 13428
f920654002_1519.returns.push(false);
// 13429
o105 = {};
// 13430
o64.parentNode = o105;
// undefined
o64 = null;
// 13431
o64 = {};
// 13432
o105.classList = o64;
// 13434
o64.contains = f920654002_1519;
// undefined
o64 = null;
// 13435
f920654002_1519.returns.push(false);
// 13436
o64 = {};
// 13437
o105.parentNode = o64;
// undefined
o105 = null;
// 13438
o105 = {};
// 13439
o64.classList = o105;
// 13441
o105.contains = f920654002_1519;
// undefined
o105 = null;
// 13442
f920654002_1519.returns.push(false);
// 13443
o105 = {};
// 13444
o64.parentNode = o105;
// undefined
o64 = null;
// 13445
o64 = {};
// 13446
o105.classList = o64;
// 13448
o64.contains = f920654002_1519;
// undefined
o64 = null;
// 13449
f920654002_1519.returns.push(false);
// 13450
o64 = {};
// 13451
o105.parentNode = o64;
// 13452
o106 = {};
// 13453
o64.classList = o106;
// 13455
o106.contains = f920654002_1519;
// 13456
f920654002_1519.returns.push(false);
// 13457
o107 = {};
// 13458
o64.parentNode = o107;
// 13459
o108 = {};
// 13460
o107.classList = o108;
// 13462
o108.contains = f920654002_1519;
// undefined
o108 = null;
// 13463
f920654002_1519.returns.push(false);
// 13464
o108 = {};
// 13465
o107.parentNode = o108;
// undefined
o107 = null;
// 13466
o107 = {};
// 13467
o108.classList = o107;
// 13469
o107.contains = f920654002_1519;
// undefined
o107 = null;
// 13470
f920654002_1519.returns.push(false);
// 13471
o107 = {};
// 13472
o108.parentNode = o107;
// 13473
o109 = {};
// 13474
o107.classList = o109;
// 13476
o109.contains = f920654002_1519;
// undefined
o109 = null;
// 13477
f920654002_1519.returns.push(false);
// 13478
o109 = {};
// 13479
o107.parentNode = o109;
// 13480
o110 = {};
// 13481
o109.classList = o110;
// 13483
o110.contains = f920654002_1519;
// undefined
o110 = null;
// 13484
f920654002_1519.returns.push(false);
// 13485
o109.parentNode = o70;
// 13486
o110 = {};
// 13487
o70.classList = o110;
// 13489
o110.contains = f920654002_1519;
// undefined
o110 = null;
// 13490
f920654002_1519.returns.push(false);
// 13491
o70.parentNode = o91;
// 13495
f920654002_1519.returns.push(false);
// 13500
f920654002_1519.returns.push(false);
// 13505
f920654002_1519.returns.push(false);
// 13513
f920654002_1519.returns.push(false);
// 13518
f920654002_1519.returns.push(false);
// 13523
f920654002_1519.returns.push(false);
// 13528
f920654002_1519.returns.push(false);
// 13533
f920654002_1519.returns.push(false);
// 13538
f920654002_1519.returns.push(false);
// 13543
f920654002_1519.returns.push(false);
// 13548
f920654002_1519.returns.push(false);
// 13553
f920654002_1519.returns.push(false);
// 13558
f920654002_1519.returns.push(false);
// 13563
f920654002_1519.returns.push(false);
// 13568
f920654002_1519.returns.push(false);
// 13573
f920654002_1519.returns.push(false);
// 13578
f920654002_1519.returns.push(false);
// 13583
f920654002_1519.returns.push(false);
// 13588
f920654002_1519.returns.push(false);
// 13593
o59.getElementsByTagName = f920654002_453;
// 13595
o59.querySelectorAll = f920654002_462;
// 13596
o110 = {};
// 13597
f920654002_462.returns.push(o110);
// 13598
o110.length = 1;
// 13599
o111 = {};
// 13600
o110["0"] = o111;
// undefined
o110 = null;
// undefined
o111 = null;
// 13604
f920654002_1519.returns.push(false);
// 13609
f920654002_1519.returns.push(false);
// 13614
f920654002_1519.returns.push(false);
// 13619
f920654002_1519.returns.push(false);
// 13624
f920654002_1519.returns.push(false);
// 13629
f920654002_1519.returns.push(false);
// 13634
f920654002_1519.returns.push(false);
// 13639
f920654002_1519.returns.push(false);
// 13644
f920654002_1519.returns.push(false);
// 13649
f920654002_1519.returns.push(false);
// 13654
f920654002_1519.returns.push(false);
// 13659
f920654002_1519.returns.push(false);
// 13664
f920654002_1519.returns.push(false);
// 13669
f920654002_1519.returns.push(false);
// 13674
f920654002_1519.returns.push(false);
// 13679
f920654002_1519.returns.push(false);
// 13687
f920654002_1519.returns.push(false);
// 13692
f920654002_1519.returns.push(false);
// 13697
f920654002_1519.returns.push(false);
// 13702
f920654002_1519.returns.push(false);
// 13707
f920654002_1519.returns.push(false);
// 13712
f920654002_1519.returns.push(false);
// 13717
f920654002_1519.returns.push(false);
// 13722
f920654002_1519.returns.push(false);
// 13727
f920654002_1519.returns.push(false);
// 13732
f920654002_1519.returns.push(false);
// 13737
f920654002_1519.returns.push(false);
// 13742
f920654002_1519.returns.push(false);
// 13747
f920654002_1519.returns.push(false);
// 13752
f920654002_1519.returns.push(false);
// 13757
f920654002_1519.returns.push(false);
// 13762
f920654002_1519.returns.push(false);
// 13770
f920654002_1519.returns.push(false);
// 13775
f920654002_1519.returns.push(false);
// 13780
f920654002_1519.returns.push(true);
// 13781
o59.nodeName = "DIV";
// 13782
o59.__FB_TOKEN = void 0;
// 13783
// 13784
o59.getAttribute = f920654002_464;
// 13785
o59.hasAttribute = f920654002_465;
// 13787
f920654002_465.returns.push(false);
// 13788
o59.JSBNG__addEventListener = f920654002_419;
// 13790
f920654002_419.returns.push(undefined);
// 13791
o59.JSBNG__onclick = null;
// 13796
f920654002_419.returns.push(undefined);
// 13797
o59.JSBNG__onmouseover = null;
// 13802
f920654002_419.returns.push(undefined);
// 13803
o59.JSBNG__onmouseout = null;
// undefined
o59 = null;
// 13805
f920654002_14.returns.push(undefined);
// 13806
f920654002_12.returns.push(1242);
// 13809
o59 = {};
// 13810
f920654002_427.returns.push(o59);
// 13811
// 13812
// 13813
o59.getElementsByTagName = f920654002_453;
// 13814
o110 = {};
// 13815
f920654002_453.returns.push(o110);
// 13816
o110.length = 0;
// undefined
o110 = null;
// 13818
o110 = {};
// 13819
o59.childNodes = o110;
// undefined
o59 = null;
// 13820
o110.item = f920654002_456;
// 13821
o110.length = 1;
// 13822
o59 = {};
// 13823
o110["0"] = o59;
// undefined
o110 = null;
// undefined
o59 = null;
// 13825
f920654002_467.returns.push(o60);
// 13826
o60.getElementsByTagName = f920654002_453;
// 13828
o60.querySelectorAll = f920654002_462;
// undefined
o60 = null;
// 13829
o59 = {};
// 13830
f920654002_462.returns.push(o59);
// 13831
o59.length = 1;
// 13832
o59["0"] = o61;
// undefined
o59 = null;
// undefined
o61 = null;
// 13833
// 13834
// 13835
// 13841
o59 = {};
// 13842
f920654002_462.returns.push(o59);
// 13843
o59.length = 0;
// undefined
o59 = null;
// 13847
o59 = {};
// 13848
f920654002_462.returns.push(o59);
// 13849
o59.length = 1;
// 13850
o60 = {};
// 13851
o59["0"] = o60;
// undefined
o59 = null;
// 13853
o60.querySelectorAll = f920654002_462;
// undefined
o60 = null;
// 13854
o59 = {};
// 13855
f920654002_462.returns.push(o59);
// 13856
o59.length = 1;
// 13857
o60 = {};
// 13858
o59["0"] = o60;
// undefined
o59 = null;
// 13861
o63.remove = f920654002_1451;
// undefined
o63 = null;
// 13862
f920654002_1451.returns.push(undefined);
// 13866
f920654002_1451.returns.push(undefined);
// 13870
f920654002_1451.returns.push(undefined);
// 13874
f920654002_1451.returns.push(undefined);
// 13878
f920654002_1451.returns.push(undefined);
// 13879
o60.firstChild = null;
// undefined
o60 = null;
// 13883
f920654002_1519.returns.push(false);
// 13888
f920654002_1519.returns.push(false);
// 13893
f920654002_1519.returns.push(false);
// 13898
f920654002_1519.returns.push(true);
// 13899
o62.contains = f920654002_646;
// undefined
o62 = null;
// 13901
f920654002_646.returns.push(true);
// 13904
f920654002_418.returns.push(1373491974151);
// 13905
o101.getElementsByTagName = f920654002_453;
// 13907
o101.querySelectorAll = f920654002_462;
// undefined
o101 = null;
// 13908
o59 = {};
// 13909
f920654002_462.returns.push(o59);
// 13910
o59.length = 1;
// 13911
o59["0"] = o100;
// undefined
o59 = null;
// 13915
o59 = {};
// 13916
f920654002_462.returns.push(o59);
// 13917
o59.length = 0;
// undefined
o59 = null;
// 13921
o59 = {};
// 13922
f920654002_462.returns.push(o59);
// 13923
o59.length = 1;
// 13924
o60 = {};
// 13925
o59["0"] = o60;
// undefined
o59 = null;
// undefined
o60 = null;
// 13929
o59 = {};
// 13930
f920654002_462.returns.push(o59);
// 13931
o59.length = 1;
// 13932
o60 = {};
// 13933
o59["0"] = o60;
// undefined
o59 = null;
// undefined
o60 = null;
// 13934
o100.nodeName = "INPUT";
// 13935
o100.__FB_TOKEN = void 0;
// 13936
// 13937
o100.getAttribute = f920654002_464;
// 13938
o100.hasAttribute = f920654002_465;
// 13940
f920654002_465.returns.push(false);
// 13941
o100.JSBNG__addEventListener = f920654002_419;
// 13943
f920654002_419.returns.push(undefined);
// 13944
o100.JSBNG__onJSBNG__blur = void 0;
// 13949
f920654002_419.returns.push(undefined);
// 13950
o100.JSBNG__onJSBNG__focus = void 0;
// 13955
f920654002_419.returns.push(undefined);
// 13956
o100.JSBNG__onclick = null;
// 13961
f920654002_419.returns.push(undefined);
// 13962
o100.JSBNG__onkeydown = null;
// 13967
f920654002_419.returns.push(undefined);
// 13968
o100.JSBNG__onkeyup = null;
// 13973
f920654002_419.returns.push(undefined);
// 13974
o100.JSBNG__onkeypress = null;
// undefined
o100 = null;
// 13985
o92.remove = f920654002_1451;
// 13986
f920654002_1451.returns.push(undefined);
// 13991
f920654002_1451.returns.push(undefined);
// 14001
f920654002_418.returns.push(1373491974177);
// 14002
o2.getItem = f920654002_433;
// undefined
o2 = null;
// 14003
f920654002_433.returns.push(null);
// 14006
f920654002_418.returns.push(1373491974179);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 14009
o2 = {};
// 14010
f920654002_56.returns.push(o2);
// 14011
// 14012
o2.open = f920654002_1466;
// 14013
f920654002_1466.returns.push(undefined);
// 14014
o2.setRequestHeader = f920654002_1467;
// 14015
f920654002_1467.returns.push(undefined);
// 14018
f920654002_1467.returns.push(undefined);
// 14019
o2.send = f920654002_1468;
// 14020
f920654002_1468.returns.push(undefined);
// 14026
o59 = {};
// 14027
f920654002_467.returns.push(o59);
// 14029
o60 = {};
// 14030
f920654002_467.returns.push(o60);
// 14032
o61 = {};
// 14033
o62 = {};
// 14035
o61.transport = o2;
// 14036
o2.readyState = 1;
// 14037
o63 = {};
// 14038
o100 = {};
// 14040
o63.length = 1;
// 14041
o63["0"] = "brbS1";
// 14049
o101 = {};
// 14050
f920654002_467.returns.push(o101);
// undefined
o101 = null;
// 14054
o101 = {};
// 14055
f920654002_461.returns.push(o101);
// 14056
o101.length = 0;
// undefined
o101 = null;
// 14057
f920654002_2136 = function() { return f920654002_2136.returns[f920654002_2136.inst++]; };
f920654002_2136.returns = [];
f920654002_2136.inst = 0;
// 14058
o6.checkPermission = f920654002_2136;
// undefined
o6 = null;
// 14059
f920654002_2136.returns.push(1);
// 14063
o6 = {};
// 14064
f920654002_461.returns.push(o6);
// 14065
o6.length = 0;
// undefined
o6 = null;
// 14068
o6 = {};
// 14069
f920654002_467.returns.push(o6);
// undefined
o6 = null;
// 14073
o6 = {};
// 14074
f920654002_461.returns.push(o6);
// 14075
o6.length = 0;
// undefined
o6 = null;
// 14077
f920654002_2136.returns.push(1);
// 14081
o6 = {};
// 14082
f920654002_461.returns.push(o6);
// 14083
o6.length = 0;
// undefined
o6 = null;
// 14085
f920654002_417.returns.push(0.40623197238892317);
// 14087
f920654002_12.returns.push(1243);
// 14088
f920654002_12.returns.push(1244);
// 14089
f920654002_12.returns.push(1245);
// 14090
f920654002_12.returns.push(1246);
// 14091
f920654002_12.returns.push(1247);
// 14098
o3.platform = "MacIntel";
// 14099
o6 = {};
// 14100
o3.plugins = o6;
// undefined
o3 = null;
// 14102
o6["Shockwave Flash"] = void 0;
// undefined
o6 = null;
// 14103
o0.readyState = "complete";
// 14106
o3 = {};
// 14107
f920654002_422.returns.push(o3);
// 14108
o3["0"] = o16;
// undefined
o3 = null;
// 14111
o3 = {};
// 14112
f920654002_427.returns.push(o3);
// 14113
f920654002_429.returns.push(o3);
// 14114
o3.parentNode = o16;
// 14116
f920654002_471.returns.push(o3);
// undefined
o3 = null;
// 14118
o5.host = "jsbngssl.www.facebook.com";
// undefined
o5 = null;
// 14120
o3 = {};
// 14121
f920654002_427.returns.push(o3);
// 14122
o3.setAttribute = f920654002_587;
// 14123
f920654002_587.returns.push(undefined);
// 14124
o5 = {};
// 14125
o3.style = o5;
// 14126
// undefined
o5 = null;
// 14129
f920654002_429.returns.push(o3);
// undefined
o3 = null;
// 14131
o3 = {};
// 14132
f920654002_467.returns.push(o3);
// 14133
o3.firstChild = null;
// 14136
f920654002_417.returns.push(0.5940724625252187);
// 14138
f920654002_418.returns.push(1373491975503);
// 14140
f920654002_418.returns.push(1373491975503);
// 14146
f920654002_418.returns.push(1373491975503);
// 14148
f920654002_418.returns.push(1373491975507);
// 14150
f920654002_418.returns.push(1373491975507);
// 14152
f920654002_418.returns.push(1373491975508);
// 14154
f920654002_418.returns.push(1373491975508);
// 14155
o3.nodeType = 1;
// 14157
f920654002_418.returns.push(1373491975508);
// 14159
f920654002_418.returns.push(1373491975510);
// 14161
f920654002_418.returns.push(1373491975510);
// 14162
o3.parentNode = o70;
// 14163
o3.nextSibling = null;
// 14164
o70.removeChild = f920654002_471;
// 14165
f920654002_471.returns.push(o3);
// 14166
// 14167
o70.appendChild = f920654002_429;
// undefined
o70 = null;
// 14168
f920654002_429.returns.push(o3);
// undefined
o3 = null;
// 14170
f920654002_418.returns.push(1373491975511);
// 14172
f920654002_418.returns.push(1373491975511);
// 14174
f920654002_418.returns.push(1373491975511);
// 14177
f920654002_418.returns.push(1373491975511);
// 14179
f920654002_418.returns.push(1373491975511);
// 14181
f920654002_418.returns.push(1373491975511);
// 14183
f920654002_418.returns.push(1373491975511);
// 14185
f920654002_418.returns.push(1373491975511);
// 14190
o3 = {};
// 14191
o5 = {};
// 14193
o3.length = 1;
// 14194
o3["0"] = "H+v1W";
// 14197
f920654002_418.returns.push(1373491975519);
// 14200
f920654002_418.returns.push(1373491975519);
// 14202
f920654002_418.returns.push(1373491975520);
// 14209
f920654002_467.returns.push(o109);
// 14212
o109.offsetWidth = 220;
// 14213
o109.offsetHeight = 25;
// 14215
f920654002_467.returns.push(o54);
// 14217
o16.contains = f920654002_646;
// 14219
f920654002_646.returns.push(true);
// 14220
o6 = {};
// 14221
f920654002_4.returns.push(o6);
// 14222
f920654002_2150 = function() { return f920654002_2150.returns[f920654002_2150.inst++]; };
f920654002_2150.returns = [];
f920654002_2150.inst = 0;
// 14223
o6.getPropertyValue = f920654002_2150;
// undefined
o6 = null;
// 14224
f920654002_2150.returns.push("fixed");
// 14226
o8.contains = f920654002_646;
// 14228
f920654002_646.returns.push(true);
// 14229
f920654002_2151 = function() { return f920654002_2151.returns[f920654002_2151.inst++]; };
f920654002_2151.returns = [];
f920654002_2151.inst = 0;
// 14230
o54.getBoundingClientRect = f920654002_2151;
// 14231
o6 = {};
// 14232
f920654002_2151.returns.push(o6);
// 14233
o6.left = 0;
// 14234
o8.clientLeft = 0;
// 14235
o6.JSBNG__top = 0;
// undefined
o6 = null;
// 14236
o8.clientTop = 0;
// 14239
o109.getElementsByTagName = f920654002_453;
// 14241
o109.querySelectorAll = f920654002_462;
// 14242
o6 = {};
// 14243
f920654002_462.returns.push(o6);
// 14244
o6.length = 6;
// 14245
o70 = {};
// 14246
o6["0"] = o70;
// 14247
o101 = {};
// 14248
o6["1"] = o101;
// 14249
o110 = {};
// 14250
o6["2"] = o110;
// 14251
o111 = {};
// 14252
o6["3"] = o111;
// 14253
o112 = {};
// 14254
o6["4"] = o112;
// 14255
o113 = {};
// 14256
o6["5"] = o113;
// undefined
o6 = null;
// 14257
o70.getAttribute = f920654002_464;
// 14258
f920654002_464.returns.push("#");
// 14259
o101.getAttribute = f920654002_464;
// 14260
f920654002_464.returns.push("#");
// 14261
o110.getAttribute = f920654002_464;
// 14262
f920654002_464.returns.push("#");
// 14263
o111.getAttribute = f920654002_464;
// undefined
o111 = null;
// 14264
f920654002_464.returns.push("/ajax/chat/privacy/settings_dialog.php");
// 14265
o112.getAttribute = f920654002_464;
// 14266
f920654002_464.returns.push("#");
// 14267
o113.getAttribute = f920654002_464;
// undefined
o113 = null;
// 14268
f920654002_464.returns.push("/ajax/chat/privacy/turn_off_dialog.php");
// 14269
o70.removeAttribute = f920654002_588;
// 14270
f920654002_588.returns.push(undefined);
// 14271
o70.setAttribute = f920654002_587;
// 14272
f920654002_587.returns.push(undefined);
// 14273
o101.removeAttribute = f920654002_588;
// 14274
f920654002_588.returns.push(undefined);
// 14275
o101.setAttribute = f920654002_587;
// undefined
o101 = null;
// 14276
f920654002_587.returns.push(undefined);
// 14277
o110.removeAttribute = f920654002_588;
// 14278
f920654002_588.returns.push(undefined);
// 14279
o110.setAttribute = f920654002_587;
// undefined
o110 = null;
// 14280
f920654002_587.returns.push(undefined);
// 14281
o112.removeAttribute = f920654002_588;
// 14282
f920654002_588.returns.push(undefined);
// 14283
o112.setAttribute = f920654002_587;
// undefined
o112 = null;
// 14284
f920654002_587.returns.push(undefined);
// 14285
o109.nodeName = "DIV";
// 14286
o109.__FB_TOKEN = void 0;
// 14287
// 14288
o109.getAttribute = f920654002_464;
// 14289
o109.hasAttribute = f920654002_465;
// 14291
f920654002_465.returns.push(false);
// 14292
o109.JSBNG__addEventListener = f920654002_419;
// 14294
f920654002_419.returns.push(undefined);
// 14295
o109.JSBNG__onclick = null;
// undefined
o109 = null;
// 14299
f920654002_467.returns.push(o105);
// 14300
o105.__FB_TOKEN = void 0;
// 14301
// 14302
o105.getElementsByTagName = f920654002_453;
// 14304
o105.querySelectorAll = f920654002_462;
// 14305
o6 = {};
// 14306
f920654002_462.returns.push(o6);
// 14307
o6.length = 1;
// 14308
o6["0"] = o70;
// undefined
o6 = null;
// 14312
o6 = {};
// 14313
f920654002_462.returns.push(o6);
// 14314
o6.length = 1;
// 14315
o101 = {};
// 14316
o6["0"] = o101;
// undefined
o6 = null;
// 14320
o6 = {};
// 14321
f920654002_462.returns.push(o6);
// 14322
o6.length = 1;
// 14323
o109 = {};
// 14324
o6["0"] = o109;
// undefined
o6 = null;
// 14328
o6 = {};
// 14329
f920654002_462.returns.push(o6);
// 14330
o6.length = 1;
// 14331
o6["0"] = o104;
// undefined
o6 = null;
// 14335
f920654002_1519.returns.push(false);
// 14340
f920654002_1519.returns.push(true);
// 14344
o6 = {};
// 14345
f920654002_462.returns.push(o6);
// 14346
o6.length = 1;
// 14347
o110 = {};
// 14348
o6["0"] = o110;
// undefined
o6 = null;
// 14349
o110.__FB_TOKEN = void 0;
// 14350
// undefined
o110 = null;
// 14351
o104.contains = f920654002_646;
// undefined
o104 = null;
// 14353
f920654002_646.returns.push(true);
// 14357
o6 = {};
// 14358
f920654002_462.returns.push(o6);
// 14359
o6.length = 1;
// 14360
o104 = {};
// 14361
o6["0"] = o104;
// undefined
o6 = null;
// undefined
o104 = null;
// 14362
o105.nodeName = "DIV";
// 14363
o105.getAttribute = f920654002_464;
// 14364
o105.hasAttribute = f920654002_465;
// 14366
f920654002_465.returns.push(false);
// 14367
o105.JSBNG__addEventListener = f920654002_419;
// 14369
f920654002_419.returns.push(undefined);
// 14370
o105.JSBNG__onkeydown = null;
// undefined
o105 = null;
// 14372
o70.nodeName = "A";
// 14373
o70.__FB_TOKEN = void 0;
// 14374
// 14376
o70.hasAttribute = f920654002_465;
// 14378
f920654002_465.returns.push(false);
// 14379
o70.JSBNG__addEventListener = f920654002_419;
// 14381
f920654002_419.returns.push(undefined);
// 14382
o70.JSBNG__onclick = null;
// 14388
o106.remove = f920654002_1451;
// undefined
o106 = null;
// 14389
f920654002_1451.returns.push(undefined);
// 14393
f920654002_1451.returns.push(undefined);
// 14394
o6 = {};
// 14395
o101.classList = o6;
// undefined
o101 = null;
// 14397
o6.add = f920654002_1038;
// undefined
o6 = null;
// 14398
f920654002_1038.returns.push(undefined);
// 14399
o109.cloneNode = f920654002_1658;
// 14400
o6 = {};
// 14401
f920654002_1658.returns.push(o6);
// 14402
o101 = {};
// undefined
fo920654002_2171_firstChild = function() { return fo920654002_2171_firstChild.returns[fo920654002_2171_firstChild.inst++]; };
fo920654002_2171_firstChild.returns = [];
fo920654002_2171_firstChild.inst = 0;
defineGetter(o6, "firstChild", fo920654002_2171_firstChild, undefined);
// undefined
fo920654002_2171_firstChild.returns.push(o101);
// undefined
fo920654002_2171_firstChild.returns.push(o101);
// 14405
o101.parentNode = o6;
// 14407
o6.removeChild = f920654002_471;
// 14408
f920654002_471.returns.push(o101);
// undefined
o101 = null;
// 14409
o101 = {};
// undefined
fo920654002_2171_firstChild.returns.push(o101);
// undefined
fo920654002_2171_firstChild.returns.push(o101);
// 14412
o101.parentNode = o6;
// 14415
f920654002_471.returns.push(o101);
// undefined
o101 = null;
// undefined
fo920654002_2171_firstChild.returns.push(null);
// 14418
o101 = {};
// 14419
f920654002_425.returns.push(o101);
// 14421
o104 = {};
// 14422
f920654002_1560.returns.push(o104);
// 14423
o101.appendChild = f920654002_429;
// 14424
f920654002_429.returns.push(o104);
// undefined
o104 = null;
// 14425
o6.appendChild = f920654002_429;
// 14426
f920654002_429.returns.push(o101);
// undefined
o101 = null;
// 14427
o109.parentNode = o70;
// 14428
o6.__html = void 0;
// 14430
o101 = {};
// 14431
f920654002_425.returns.push(o101);
// undefined
o101 = null;
// 14433
f920654002_2177 = function() { return f920654002_2177.returns[f920654002_2177.inst++]; };
f920654002_2177.returns = [];
f920654002_2177.inst = 0;
// 14434
o70.replaceChild = f920654002_2177;
// undefined
o70 = null;
// 14435
f920654002_2177.returns.push(o109);
// undefined
o109 = null;
// 14440
f920654002_418.returns.push(1373491975674);
// 14442
f920654002_418.returns.push(1373491975676);
// 14443
f920654002_7.returns.push(undefined);
// 14444
ow920654002.JSBNG__onJSBNG__blur = undefined;
// 14445
f920654002_13.returns.push(1248);
// 14447
o70 = {};
// 14448
f920654002_427.returns.push(o70);
// 14449
// 14450
// 14451
o70.getElementsByTagName = f920654002_453;
// 14452
o101 = {};
// 14453
f920654002_453.returns.push(o101);
// 14454
o101.length = 0;
// undefined
o101 = null;
// 14456
o101 = {};
// 14457
o70.childNodes = o101;
// undefined
o70 = null;
// 14458
o101.item = f920654002_456;
// 14459
o101.length = 1;
// 14460
o70 = {};
// 14461
o101["0"] = o70;
// undefined
o101 = null;
// undefined
o70 = null;
// 14463
o70 = {};
// 14464
f920654002_427.returns.push(o70);
// 14465
// 14466
// 14467
o70.getElementsByTagName = f920654002_453;
// 14468
o101 = {};
// 14469
f920654002_453.returns.push(o101);
// 14470
o101.length = 0;
// undefined
o101 = null;
// 14472
o101 = {};
// 14473
o70.childNodes = o101;
// undefined
o70 = null;
// 14474
o101.item = f920654002_456;
// 14475
o101.length = 1;
// 14476
o70 = {};
// 14477
o101["0"] = o70;
// undefined
o101 = null;
// undefined
o70 = null;
// 14479
o70 = {};
// 14480
f920654002_427.returns.push(o70);
// 14481
// 14482
// 14483
o70.getElementsByTagName = f920654002_453;
// 14484
o101 = {};
// 14485
f920654002_453.returns.push(o101);
// 14486
o101.length = 0;
// undefined
o101 = null;
// 14488
o101 = {};
// 14489
o70.childNodes = o101;
// undefined
o70 = null;
// 14490
o101.item = f920654002_456;
// 14491
o101.length = 1;
// 14492
o70 = {};
// 14493
o101["0"] = o70;
// undefined
o101 = null;
// undefined
o70 = null;
// 14495
o70 = {};
// 14496
f920654002_427.returns.push(o70);
// 14497
// 14498
// 14499
o70.getElementsByTagName = f920654002_453;
// 14500
o101 = {};
// 14501
f920654002_453.returns.push(o101);
// 14502
o101.length = 0;
// undefined
o101 = null;
// 14504
o101 = {};
// 14505
o70.childNodes = o101;
// undefined
o70 = null;
// 14506
o101.item = f920654002_456;
// 14507
o101.length = 1;
// 14508
o70 = {};
// 14509
o101["0"] = o70;
// undefined
o101 = null;
// undefined
o70 = null;
// 14511
o70 = {};
// 14512
f920654002_427.returns.push(o70);
// 14513
// 14514
// 14515
o70.getElementsByTagName = f920654002_453;
// 14516
o101 = {};
// 14517
f920654002_453.returns.push(o101);
// 14518
o101.length = 0;
// undefined
o101 = null;
// 14520
o101 = {};
// 14521
o70.childNodes = o101;
// undefined
o70 = null;
// 14522
o101.item = f920654002_456;
// 14523
o101.length = 1;
// 14524
o70 = {};
// 14525
o101["0"] = o70;
// undefined
o101 = null;
// undefined
o70 = null;
// 14527
o70 = {};
// 14528
f920654002_427.returns.push(o70);
// 14529
// 14530
// 14531
o70.getElementsByTagName = f920654002_453;
// 14532
o101 = {};
// 14533
f920654002_453.returns.push(o101);
// 14534
o101.length = 0;
// undefined
o101 = null;
// 14536
o101 = {};
// 14537
o70.childNodes = o101;
// undefined
o70 = null;
// 14538
o101.item = f920654002_456;
// 14539
o101.length = 1;
// 14540
o70 = {};
// 14541
o101["0"] = o70;
// undefined
o101 = null;
// 14543
o101 = {};
// 14544
f920654002_427.returns.push(o101);
// 14545
// 14546
// 14547
o101.getElementsByTagName = f920654002_453;
// 14548
o104 = {};
// 14549
f920654002_453.returns.push(o104);
// 14550
o104.length = 0;
// undefined
o104 = null;
// 14552
o104 = {};
// 14553
o101.childNodes = o104;
// undefined
o101 = null;
// 14554
o104.item = f920654002_456;
// 14555
o104.length = 1;
// 14556
o101 = {};
// 14557
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14559
o101 = {};
// 14560
f920654002_427.returns.push(o101);
// 14561
// 14562
// 14563
o101.getElementsByTagName = f920654002_453;
// 14564
o104 = {};
// 14565
f920654002_453.returns.push(o104);
// 14566
o104.length = 0;
// undefined
o104 = null;
// 14568
o104 = {};
// 14569
o101.childNodes = o104;
// undefined
o101 = null;
// 14570
o104.item = f920654002_456;
// 14571
o104.length = 1;
// 14572
o101 = {};
// 14573
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14575
o101 = {};
// 14576
f920654002_427.returns.push(o101);
// 14577
// 14578
// 14579
o101.getElementsByTagName = f920654002_453;
// 14580
o104 = {};
// 14581
f920654002_453.returns.push(o104);
// 14582
o104.length = 0;
// undefined
o104 = null;
// 14584
o104 = {};
// 14585
o101.childNodes = o104;
// undefined
o101 = null;
// 14586
o104.item = f920654002_456;
// 14587
o104.length = 1;
// 14588
o101 = {};
// 14589
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14591
o101 = {};
// 14592
f920654002_427.returns.push(o101);
// 14593
// 14594
// 14595
o101.getElementsByTagName = f920654002_453;
// 14596
o104 = {};
// 14597
f920654002_453.returns.push(o104);
// 14598
o104.length = 0;
// undefined
o104 = null;
// 14600
o104 = {};
// 14601
o101.childNodes = o104;
// undefined
o101 = null;
// 14602
o104.item = f920654002_456;
// 14603
o104.length = 1;
// 14604
o101 = {};
// 14605
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14607
o101 = {};
// 14608
f920654002_427.returns.push(o101);
// 14609
// 14610
// 14611
o101.getElementsByTagName = f920654002_453;
// 14612
o104 = {};
// 14613
f920654002_453.returns.push(o104);
// 14614
o104.length = 0;
// undefined
o104 = null;
// 14616
o104 = {};
// 14617
o101.childNodes = o104;
// undefined
o101 = null;
// 14618
o104.item = f920654002_456;
// 14619
o104.length = 1;
// 14620
o101 = {};
// 14621
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14623
o101 = {};
// 14624
f920654002_427.returns.push(o101);
// 14625
// 14626
// 14627
o101.getElementsByTagName = f920654002_453;
// 14628
o104 = {};
// 14629
f920654002_453.returns.push(o104);
// 14630
o104.length = 0;
// undefined
o104 = null;
// 14632
o104 = {};
// 14633
o101.childNodes = o104;
// undefined
o101 = null;
// 14634
o104.item = f920654002_456;
// 14635
o104.length = 1;
// 14636
o101 = {};
// 14637
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14639
o101 = {};
// 14640
f920654002_427.returns.push(o101);
// 14641
// 14642
// 14643
o101.getElementsByTagName = f920654002_453;
// 14644
o104 = {};
// 14645
f920654002_453.returns.push(o104);
// 14646
o104.length = 0;
// undefined
o104 = null;
// 14648
o104 = {};
// 14649
o101.childNodes = o104;
// undefined
o101 = null;
// 14650
o104.item = f920654002_456;
// 14651
o104.length = 1;
// 14652
o101 = {};
// 14653
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14655
o101 = {};
// 14656
f920654002_427.returns.push(o101);
// 14657
// 14658
// 14659
o101.getElementsByTagName = f920654002_453;
// 14660
o104 = {};
// 14661
f920654002_453.returns.push(o104);
// 14662
o104.length = 0;
// undefined
o104 = null;
// 14664
o104 = {};
// 14665
o101.childNodes = o104;
// undefined
o101 = null;
// 14666
o104.item = f920654002_456;
// 14667
o104.length = 1;
// 14668
o101 = {};
// 14669
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14671
o101 = {};
// 14672
f920654002_427.returns.push(o101);
// 14673
// 14674
// 14675
o101.getElementsByTagName = f920654002_453;
// 14676
o104 = {};
// 14677
f920654002_453.returns.push(o104);
// 14678
o104.length = 0;
// undefined
o104 = null;
// 14680
o104 = {};
// 14681
o101.childNodes = o104;
// undefined
o101 = null;
// 14682
o104.item = f920654002_456;
// 14683
o104.length = 1;
// 14684
o101 = {};
// 14685
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14687
o101 = {};
// 14688
f920654002_427.returns.push(o101);
// 14689
// 14690
// 14691
o101.getElementsByTagName = f920654002_453;
// 14692
o104 = {};
// 14693
f920654002_453.returns.push(o104);
// 14694
o104.length = 0;
// undefined
o104 = null;
// 14696
o104 = {};
// 14697
o101.childNodes = o104;
// undefined
o101 = null;
// 14698
o104.item = f920654002_456;
// 14699
o104.length = 1;
// 14700
o101 = {};
// 14701
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14703
o101 = {};
// 14704
f920654002_427.returns.push(o101);
// 14705
// 14706
// 14707
o101.getElementsByTagName = f920654002_453;
// 14708
o104 = {};
// 14709
f920654002_453.returns.push(o104);
// 14710
o104.length = 0;
// undefined
o104 = null;
// 14712
o104 = {};
// 14713
o101.childNodes = o104;
// undefined
o101 = null;
// 14714
o104.item = f920654002_456;
// 14715
o104.length = 1;
// 14716
o101 = {};
// 14717
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14719
o101 = {};
// 14720
f920654002_427.returns.push(o101);
// 14721
// 14722
// 14723
o101.getElementsByTagName = f920654002_453;
// 14724
o104 = {};
// 14725
f920654002_453.returns.push(o104);
// 14726
o104.length = 0;
// undefined
o104 = null;
// 14728
o104 = {};
// 14729
o101.childNodes = o104;
// undefined
o101 = null;
// 14730
o104.item = f920654002_456;
// 14731
o104.length = 1;
// 14732
o101 = {};
// 14733
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14735
o101 = {};
// 14736
f920654002_427.returns.push(o101);
// 14737
// 14738
// 14739
o101.getElementsByTagName = f920654002_453;
// 14740
o104 = {};
// 14741
f920654002_453.returns.push(o104);
// 14742
o104.length = 0;
// undefined
o104 = null;
// 14744
o104 = {};
// 14745
o101.childNodes = o104;
// undefined
o101 = null;
// 14746
o104.item = f920654002_456;
// 14747
o104.length = 1;
// 14748
o101 = {};
// 14749
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14751
o101 = {};
// 14752
f920654002_427.returns.push(o101);
// 14753
// 14754
// 14755
o101.getElementsByTagName = f920654002_453;
// 14756
o104 = {};
// 14757
f920654002_453.returns.push(o104);
// 14758
o104.length = 0;
// undefined
o104 = null;
// 14760
o104 = {};
// 14761
o101.childNodes = o104;
// undefined
o101 = null;
// 14762
o104.item = f920654002_456;
// 14763
o104.length = 1;
// 14764
o101 = {};
// 14765
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14767
o101 = {};
// 14768
f920654002_427.returns.push(o101);
// 14769
// 14770
// 14771
o101.getElementsByTagName = f920654002_453;
// 14772
o104 = {};
// 14773
f920654002_453.returns.push(o104);
// 14774
o104.length = 0;
// undefined
o104 = null;
// 14776
o104 = {};
// 14777
o101.childNodes = o104;
// undefined
o101 = null;
// 14778
o104.item = f920654002_456;
// 14779
o104.length = 1;
// 14780
o101 = {};
// 14781
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14783
o101 = {};
// 14784
f920654002_427.returns.push(o101);
// 14785
// 14786
// 14787
o101.getElementsByTagName = f920654002_453;
// 14788
o104 = {};
// 14789
f920654002_453.returns.push(o104);
// 14790
o104.length = 0;
// undefined
o104 = null;
// 14792
o104 = {};
// 14793
o101.childNodes = o104;
// undefined
o101 = null;
// 14794
o104.item = f920654002_456;
// 14795
o104.length = 1;
// 14796
o101 = {};
// 14797
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14799
o101 = {};
// 14800
f920654002_427.returns.push(o101);
// 14801
// 14802
// 14803
o101.getElementsByTagName = f920654002_453;
// 14804
o104 = {};
// 14805
f920654002_453.returns.push(o104);
// 14806
o104.length = 0;
// undefined
o104 = null;
// 14808
o104 = {};
// 14809
o101.childNodes = o104;
// undefined
o101 = null;
// 14810
o104.item = f920654002_456;
// 14811
o104.length = 1;
// 14812
o101 = {};
// 14813
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14815
o101 = {};
// 14816
f920654002_427.returns.push(o101);
// 14817
// 14818
// 14819
o101.getElementsByTagName = f920654002_453;
// 14820
o104 = {};
// 14821
f920654002_453.returns.push(o104);
// 14822
o104.length = 0;
// undefined
o104 = null;
// 14824
o104 = {};
// 14825
o101.childNodes = o104;
// undefined
o101 = null;
// 14826
o104.item = f920654002_456;
// 14827
o104.length = 1;
// 14828
o101 = {};
// 14829
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14831
o101 = {};
// 14832
f920654002_427.returns.push(o101);
// 14833
// 14834
// 14835
o101.getElementsByTagName = f920654002_453;
// 14836
o104 = {};
// 14837
f920654002_453.returns.push(o104);
// 14838
o104.length = 0;
// undefined
o104 = null;
// 14840
o104 = {};
// 14841
o101.childNodes = o104;
// undefined
o101 = null;
// 14842
o104.item = f920654002_456;
// 14843
o104.length = 1;
// 14844
o101 = {};
// 14845
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14847
o101 = {};
// 14848
f920654002_427.returns.push(o101);
// 14849
// 14850
// 14851
o101.getElementsByTagName = f920654002_453;
// 14852
o104 = {};
// 14853
f920654002_453.returns.push(o104);
// 14854
o104.length = 0;
// undefined
o104 = null;
// 14856
o104 = {};
// 14857
o101.childNodes = o104;
// undefined
o101 = null;
// 14858
o104.item = f920654002_456;
// 14859
o104.length = 1;
// 14860
o101 = {};
// 14861
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14863
o101 = {};
// 14864
f920654002_427.returns.push(o101);
// 14865
// 14866
// 14867
o101.getElementsByTagName = f920654002_453;
// 14868
o104 = {};
// 14869
f920654002_453.returns.push(o104);
// 14870
o104.length = 0;
// undefined
o104 = null;
// 14872
o104 = {};
// 14873
o101.childNodes = o104;
// undefined
o101 = null;
// 14874
o104.item = f920654002_456;
// 14875
o104.length = 1;
// 14876
o101 = {};
// 14877
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14879
o101 = {};
// 14880
f920654002_427.returns.push(o101);
// 14881
// 14882
// 14883
o101.getElementsByTagName = f920654002_453;
// 14884
o104 = {};
// 14885
f920654002_453.returns.push(o104);
// 14886
o104.length = 0;
// undefined
o104 = null;
// 14888
o104 = {};
// 14889
o101.childNodes = o104;
// undefined
o101 = null;
// 14890
o104.item = f920654002_456;
// 14891
o104.length = 1;
// 14892
o101 = {};
// 14893
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14895
o101 = {};
// 14896
f920654002_427.returns.push(o101);
// 14897
// 14898
// 14899
o101.getElementsByTagName = f920654002_453;
// 14900
o104 = {};
// 14901
f920654002_453.returns.push(o104);
// 14902
o104.length = 0;
// undefined
o104 = null;
// 14904
o104 = {};
// 14905
o101.childNodes = o104;
// undefined
o101 = null;
// 14906
o104.item = f920654002_456;
// 14907
o104.length = 1;
// 14908
o101 = {};
// 14909
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14911
o101 = {};
// 14912
f920654002_427.returns.push(o101);
// 14913
// 14914
// 14915
o101.getElementsByTagName = f920654002_453;
// 14916
o104 = {};
// 14917
f920654002_453.returns.push(o104);
// 14918
o104.length = 0;
// undefined
o104 = null;
// 14920
o104 = {};
// 14921
o101.childNodes = o104;
// undefined
o101 = null;
// 14922
o104.item = f920654002_456;
// 14923
o104.length = 1;
// 14924
o101 = {};
// 14925
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14927
o101 = {};
// 14928
f920654002_427.returns.push(o101);
// 14929
// 14930
// 14931
o101.getElementsByTagName = f920654002_453;
// 14932
o104 = {};
// 14933
f920654002_453.returns.push(o104);
// 14934
o104.length = 0;
// undefined
o104 = null;
// 14936
o104 = {};
// 14937
o101.childNodes = o104;
// undefined
o101 = null;
// 14938
o104.item = f920654002_456;
// 14939
o104.length = 1;
// 14940
o101 = {};
// 14941
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14943
o101 = {};
// 14944
f920654002_427.returns.push(o101);
// 14945
// 14946
// 14947
o101.getElementsByTagName = f920654002_453;
// 14948
o104 = {};
// 14949
f920654002_453.returns.push(o104);
// 14950
o104.length = 0;
// undefined
o104 = null;
// 14952
o104 = {};
// 14953
o101.childNodes = o104;
// undefined
o101 = null;
// 14954
o104.item = f920654002_456;
// 14955
o104.length = 1;
// 14956
o101 = {};
// 14957
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14959
o101 = {};
// 14960
f920654002_427.returns.push(o101);
// 14961
// 14962
// 14963
o101.getElementsByTagName = f920654002_453;
// 14964
o104 = {};
// 14965
f920654002_453.returns.push(o104);
// 14966
o104.length = 0;
// undefined
o104 = null;
// 14968
o104 = {};
// 14969
o101.childNodes = o104;
// undefined
o101 = null;
// 14970
o104.item = f920654002_456;
// 14971
o104.length = 1;
// 14972
o101 = {};
// 14973
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14975
o101 = {};
// 14976
f920654002_427.returns.push(o101);
// 14977
// 14978
// 14979
o101.getElementsByTagName = f920654002_453;
// 14980
o104 = {};
// 14981
f920654002_453.returns.push(o104);
// 14982
o104.length = 0;
// undefined
o104 = null;
// 14984
o104 = {};
// 14985
o101.childNodes = o104;
// undefined
o101 = null;
// 14986
o104.item = f920654002_456;
// 14987
o104.length = 1;
// 14988
o101 = {};
// 14989
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 14991
o101 = {};
// 14992
f920654002_427.returns.push(o101);
// 14993
// 14994
// 14995
o101.getElementsByTagName = f920654002_453;
// 14996
o104 = {};
// 14997
f920654002_453.returns.push(o104);
// 14998
o104.length = 0;
// undefined
o104 = null;
// 15000
o104 = {};
// 15001
o101.childNodes = o104;
// undefined
o101 = null;
// 15002
o104.item = f920654002_456;
// 15003
o104.length = 1;
// 15004
o101 = {};
// 15005
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 15007
o101 = {};
// 15008
f920654002_427.returns.push(o101);
// 15009
// 15010
// 15011
o101.getElementsByTagName = f920654002_453;
// 15012
o104 = {};
// 15013
f920654002_453.returns.push(o104);
// 15014
o104.length = 0;
// undefined
o104 = null;
// 15016
o104 = {};
// 15017
o101.childNodes = o104;
// undefined
o101 = null;
// 15018
o104.item = f920654002_456;
// 15019
o104.length = 1;
// 15020
o101 = {};
// 15021
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 15023
o101 = {};
// 15024
f920654002_427.returns.push(o101);
// 15025
// 15026
// 15027
o101.getElementsByTagName = f920654002_453;
// 15028
o104 = {};
// 15029
f920654002_453.returns.push(o104);
// 15030
o104.length = 0;
// undefined
o104 = null;
// 15032
o104 = {};
// 15033
o101.childNodes = o104;
// undefined
o101 = null;
// 15034
o104.item = f920654002_456;
// 15035
o104.length = 1;
// 15036
o101 = {};
// 15037
o104["0"] = o101;
// undefined
o104 = null;
// undefined
o101 = null;
// 15040
f920654002_418.returns.push(1373491975900);
// 15056
f920654002_1519.returns.push(false);
// 15063
o101 = {};
// 15064
o60.classList = o101;
// 15066
o101.contains = f920654002_1519;
// 15067
f920654002_1519.returns.push(false);
// 15068
o60.parentNode = o59;
// undefined
o60 = null;
// 15069
o60 = {};
// 15070
o59.classList = o60;
// 15072
o60.contains = f920654002_1519;
// undefined
o60 = null;
// 15073
f920654002_1519.returns.push(false);
// 15074
o60 = {};
// 15075
o59.parentNode = o60;
// 15076
o104 = {};
// 15077
o60.classList = o104;
// 15079
o104.contains = f920654002_1519;
// undefined
o104 = null;
// 15080
f920654002_1519.returns.push(false);
// 15081
o60.parentNode = o108;
// undefined
o60 = null;
// undefined
o108 = null;
// 15085
f920654002_1519.returns.push(false);
// 15090
f920654002_1519.returns.push(true);
// 15091
o107.getElementsByTagName = f920654002_453;
// 15093
o107.querySelectorAll = f920654002_462;
// 15094
o60 = {};
// 15095
f920654002_462.returns.push(o60);
// 15096
o60.length = 1;
// 15097
o60["0"] = o64;
// undefined
o60 = null;
// 15098
o64.offsetWidth = 205;
// 15099
o64.offsetHeight = 0;
// undefined
o64 = null;
// 15103
o60 = {};
// 15104
f920654002_462.returns.push(o60);
// 15105
o60.length = 1;
// 15106
o60["0"] = o59;
// undefined
o60 = null;
// 15107
o59.offsetWidth = 0;
// 15108
o59.offsetHeight = 0;
// 15109
o107.offsetWidth = 205;
// 15110
o107.offsetHeight = 25;
// undefined
o107 = null;
// 15111
o70.__html = void 0;
// 15112
o70.cloneNode = f920654002_1658;
// undefined
o70 = null;
// 15113
o60 = {};
// 15114
f920654002_1658.returns.push(o60);
// 15115
o60.getElementsByTagName = f920654002_453;
// 15116
o64 = {};
// 15117
f920654002_453.returns.push(o64);
// 15118
o64.length = 14;
// 15119
o70 = {};
// 15120
o64["0"] = o70;
// 15121
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 15122
f920654002_464.returns.push(null);
// 15123
o70 = {};
// 15124
o64["1"] = o70;
// 15125
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 15126
f920654002_464.returns.push(null);
// 15127
o70 = {};
// 15128
o64["2"] = o70;
// 15129
o70.getAttribute = f920654002_464;
// 15130
f920654002_464.returns.push("numTabs");
// 15131
o70.removeAttribute = f920654002_588;
// 15132
f920654002_588.returns.push(undefined);
// 15133
o104 = {};
// 15134
o70.childNodes = o104;
// undefined
o70 = null;
// 15135
o104.length = 0;
// undefined
o104 = null;
// 15136
o70 = {};
// 15137
o64["3"] = o70;
// 15138
o70.getAttribute = f920654002_464;
// 15139
f920654002_464.returns.push("numMessages");
// 15140
o70.removeAttribute = f920654002_588;
// 15141
f920654002_588.returns.push(undefined);
// 15142
o104 = {};
// 15143
o70.childNodes = o104;
// undefined
o70 = null;
// 15144
o104.length = 0;
// undefined
o104 = null;
// 15145
o70 = {};
// 15146
o64["4"] = o70;
// 15147
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 15148
f920654002_464.returns.push(null);
// 15149
o70 = {};
// 15150
o64["5"] = o70;
// 15151
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 15152
f920654002_464.returns.push(null);
// 15153
o70 = {};
// 15154
o64["6"] = o70;
// 15155
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 15156
f920654002_464.returns.push(null);
// 15157
o70 = {};
// 15158
o64["7"] = o70;
// 15159
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 15160
f920654002_464.returns.push(null);
// 15161
o70 = {};
// 15162
o64["8"] = o70;
// 15163
o70.getAttribute = f920654002_464;
// undefined
o70 = null;
// 15164
f920654002_464.returns.push(null);
// 15165
o70 = {};
// 15166
o64["9"] = o70;
// 15167
o70.getAttribute = f920654002_464;
// 15168
f920654002_464.returns.push("menu");
// 15169
o70.removeAttribute = f920654002_588;
// 15170
f920654002_588.returns.push(undefined);
// 15171
o104 = {};
// 15172
o70.childNodes = o104;
// 15173
o104.length = 1;
// undefined
o104 = null;
// 15174
o104 = {};
// 15175
o64["10"] = o104;
// 15176
o104.getAttribute = f920654002_464;
// 15177
f920654002_464.returns.push(null);
// 15178
o105 = {};
// 15179
o64["11"] = o105;
// 15180
o105.getAttribute = f920654002_464;
// undefined
o105 = null;
// 15181
f920654002_464.returns.push(null);
// 15182
o105 = {};
// 15183
o64["12"] = o105;
// 15184
o105.getAttribute = f920654002_464;
// undefined
o105 = null;
// 15185
f920654002_464.returns.push(null);
// 15186
o105 = {};
// 15187
o64["13"] = o105;
// undefined
o64 = null;
// 15188
o105.getAttribute = f920654002_464;
// undefined
o105 = null;
// 15189
f920654002_464.returns.push(null);
// 15190
o70.getElementsByTagName = f920654002_453;
// 15192
o70.querySelectorAll = f920654002_462;
// undefined
o70 = null;
// 15193
o64 = {};
// 15194
f920654002_462.returns.push(o64);
// 15195
o64.length = 1;
// 15196
o64["0"] = o104;
// undefined
o64 = null;
// undefined
o104 = null;
// 15197
o60.__FB_TOKEN = void 0;
// 15198
// 15199
o64 = {};
// 15200
o60.classList = o64;
// 15202
o64.add = f920654002_1038;
// undefined
o64 = null;
// 15203
f920654002_1038.returns.push(undefined);
// 15205
o60.__html = void 0;
// undefined
o60 = null;
// 15207
o60 = {};
// 15208
f920654002_425.returns.push(o60);
// 15210
f920654002_2354 = function() { return f920654002_2354.returns[f920654002_2354.inst++]; };
f920654002_2354.returns = [];
f920654002_2354.inst = 0;
// 15211
o59.insertBefore = f920654002_2354;
// undefined
o59 = null;
// 15212
f920654002_2354.returns.push(o60);
// undefined
o60 = null;
// 15215
o101.add = f920654002_1038;
// undefined
o101 = null;
// 15216
f920654002_1038.returns.push(undefined);
// 15220
f920654002_1038.returns.push(undefined);
// 15221
o59 = {};
// 15222
o60 = {};
// 15224
o59.length = 1;
// 15225
o59["0"] = "LpC/l";
// 15228
f920654002_418.returns.push(1373491975930);
// 15231
f920654002_418.returns.push(1373491975930);
// 15233
f920654002_418.returns.push(1373491975931);
// 15241
o64 = {};
// 15242
f920654002_425.returns.push(o64);
// 15244
f920654002_429.returns.push(o64);
// undefined
o64 = null;
// 15250
o64 = {};
// 15251
f920654002_425.returns.push(o64);
// 15253
f920654002_429.returns.push(o64);
// undefined
o64 = null;
// 15261
o64 = {};
// 15262
f920654002_462.returns.push(o64);
// 15263
o64.length = 4;
// 15264
o64["0"] = o33;
// undefined
o33 = null;
// 15265
o64["1"] = o34;
// 15266
o33 = {};
// 15267
o64["2"] = o33;
// undefined
o33 = null;
// 15268
o64["3"] = o30;
// undefined
o64 = null;
// undefined
o30 = null;
// 15272
o30 = {};
// 15273
f920654002_425.returns.push(o30);
// 15275
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 15279
o30 = {};
// 15280
f920654002_425.returns.push(o30);
// 15282
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 15288
o30 = {};
// 15289
f920654002_425.returns.push(o30);
// 15291
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 15297
o30 = {};
// 15298
f920654002_425.returns.push(o30);
// 15300
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 15314
o30 = {};
// 15315
f920654002_425.returns.push(o30);
// 15317
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 15320
f920654002_12.returns.push(1249);
// 15324
o30 = {};
// 15325
f920654002_425.returns.push(o30);
// 15327
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 15331
o30 = {};
// 15332
f920654002_427.returns.push(o30);
// 15334
o30.__html = void 0;
// 15336
o33 = {};
// 15337
f920654002_425.returns.push(o33);
// 15340
f920654002_429.returns.push(o33);
// undefined
o33 = null;
// 15341
o33 = {};
// 15342
o30.style = o33;
// 15343
// undefined
o33 = null;
// 15344
o33 = {};
// 15345
f920654002_4.returns.push(o33);
// 15346
o33.getPropertyValue = f920654002_2150;
// undefined
o33 = null;
// 15347
f920654002_2150.returns.push("");
// 15348
o33 = {};
// 15349
f920654002_4.returns.push(o33);
// 15350
o33.getPropertyValue = f920654002_2150;
// undefined
o33 = null;
// 15351
f920654002_2150.returns.push("");
// 15352
o33 = {};
// 15353
f920654002_4.returns.push(o33);
// 15354
o33.getPropertyValue = f920654002_2150;
// undefined
o33 = null;
// 15355
f920654002_2150.returns.push("");
// 15359
o92.add = f920654002_1038;
// undefined
o92 = null;
// 15360
f920654002_1038.returns.push(undefined);
// 15362
// 15363
o33 = {};
// 15364
f920654002_57.returns.push(o33);
// 15365
f920654002_417.returns.push(0.5025093636941165);
// 15366
// undefined
o33 = null;
// 15367
o30.parentNode = null;
// undefined
o30 = null;
// 15371
o30 = {};
// 15372
f920654002_425.returns.push(o30);
// 15374
f920654002_429.returns.push(o30);
// undefined
o30 = null;
// 15392
o30 = {};
// 15395
o30.cancelBubble = false;
// 15398
f920654002_418.returns.push(1373491976516);
// 15403
f920654002_418.returns.push(1373491976518);
// 15407
f920654002_418.returns.push(1373491976518);
// 15411
f920654002_1117.returns.push(undefined);
// 15413
o30.returnValue = true;
// 15416
o30.srcElement = o54;
// 15418
o30.target = o54;
// 15420
o54.nodeType = 1;
// 15423
o54.getAttributeNode = f920654002_458;
// 15425
f920654002_458.returns.push(null);
// 15428
o73.nodeType = 1;
// 15429
o73.getAttributeNode = f920654002_458;
// 15431
f920654002_458.returns.push(null);
// 15434
o87.nodeType = 1;
// 15435
o87.getAttributeNode = f920654002_458;
// undefined
o87 = null;
// 15437
f920654002_458.returns.push(null);
// 15440
o91.nodeType = 1;
// 15441
o91.getAttributeNode = f920654002_458;
// 15443
f920654002_458.returns.push(null);
// 15446
o16.nodeType = 1;
// 15447
o16.getAttributeNode = f920654002_458;
// 15449
f920654002_458.returns.push(null);
// 15452
o8.nodeType = 1;
// 15453
o8.getAttributeNode = f920654002_458;
// undefined
o8 = null;
// 15455
f920654002_458.returns.push(null);
// 15458
o0.nodeType = 9;
// 15460
o30.relatedTarget = null;
// 15461
o30.fromElement = null;
// undefined
o30 = null;
// 15464
o8 = {};
// 15468
f920654002_418.returns.push(1373491976592);
// 15469
o8.cancelBubble = false;
// 15470
o8.returnValue = true;
// 15473
o8.srcElement = o54;
// 15475
o8.target = o54;
// 15482
f920654002_458.returns.push(null);
// 15488
f920654002_458.returns.push(null);
// 15494
f920654002_458.returns.push(null);
// 15500
f920654002_458.returns.push(null);
// 15506
f920654002_458.returns.push(null);
// 15512
f920654002_458.returns.push(null);
// 15517
o8.JSBNG__screenX = 79;
// 15518
o8.JSBNG__screenY = 706;
// 15519
o8.altKey = false;
// 15520
o8.bubbles = true;
// 15521
o8.button = 0;
// 15522
o8.buttons = void 0;
// 15523
o8.cancelable = false;
// 15524
o8.clientX = 0;
// 15525
o8.clientY = 0;
// 15526
o8.ctrlKey = false;
// 15527
o8.currentTarget = o0;
// 15528
o8.defaultPrevented = false;
// 15529
o8.detail = 0;
// 15530
o8.eventPhase = 3;
// 15531
o8.isTrusted = void 0;
// 15532
o8.metaKey = false;
// 15533
o8.pageX = 0;
// 15534
o8.pageY = 159;
// 15535
o8.relatedTarget = null;
// 15536
o8.fromElement = null;
// 15539
o8.shiftKey = false;
// 15542
o8.timeStamp = 1373491976591;
// 15543
o8.type = "mousemove";
// 15544
o8.view = ow920654002;
// undefined
o8 = null;
// 15551
f920654002_1639.returns.push(undefined);
// 15554
f920654002_14.returns.push(undefined);
// 15555
f920654002_12.returns.push(1250);
// 15558
f920654002_2377 = function() { return f920654002_2377.returns[f920654002_2377.inst++]; };
f920654002_2377.returns = [];
f920654002_2377.inst = 0;
// 15560
f920654002_2378 = function() { return f920654002_2378.returns[f920654002_2378.inst++]; };
f920654002_2378.returns = [];
f920654002_2378.inst = 0;
// 15565
o8 = {};
// 15566
o23.classList = o8;
// 15568
o8.contains = f920654002_1519;
// undefined
o8 = null;
// 15569
f920654002_1519.returns.push(false);
// 15570
o8 = {};
// 15571
o23.parentNode = o8;
// 15572
o30 = {};
// 15573
o8.classList = o30;
// 15575
o30.contains = f920654002_1519;
// undefined
o30 = null;
// 15576
f920654002_1519.returns.push(true);
// 15577
o23.getElementsByTagName = f920654002_453;
// 15579
o23.querySelectorAll = f920654002_462;
// 15580
o30 = {};
// 15581
f920654002_462.returns.push(o30);
// 15582
o30.length = 1;
// 15583
o30["0"] = o28;
// undefined
o30 = null;
// 15587
o30 = {};
// 15588
f920654002_462.returns.push(o30);
// 15589
o30.length = 1;
// 15590
o30["0"] = o68;
// undefined
o30 = null;
// 15591
o68.offsetHeight = 785;
// 15592
o28.offsetHeight = 1872;
// 15593
o8.id = "u_0_17";
// 15597
f920654002_1519.returns.push(false);
// 15602
f920654002_1519.returns.push(true);
// 15606
o30 = {};
// 15607
f920654002_462.returns.push(o30);
// 15608
o30.length = 1;
// 15609
o30["0"] = o28;
// undefined
o30 = null;
// 15613
o30 = {};
// 15614
f920654002_462.returns.push(o30);
// 15615
o30.length = 1;
// 15616
o30["0"] = o68;
// undefined
o30 = null;
// undefined
o68 = null;
// 15620
o54.offsetTop = 0;
// 15622
o16.scrollLeft = 0;
// 15623
o16.scrollTop = 159;
// 15627
f920654002_467.returns.push(o54);
// 15631
f920654002_646.returns.push(true);
// 15632
o30 = {};
// 15633
f920654002_4.returns.push(o30);
// 15634
o30.getPropertyValue = f920654002_2150;
// undefined
o30 = null;
// 15635
f920654002_2150.returns.push("fixed");
// 15637
f920654002_467.returns.push(o73);
// 15638
o73.offsetHeight = 38;
// undefined
o73 = null;
// 15639
o72.offsetWidth = 158;
// 15640
o72.offsetHeight = 62;
// 15644
f920654002_646.returns.push(true);
// 15645
o72.getBoundingClientRect = f920654002_2151;
// 15646
o30 = {};
// 15647
f920654002_2151.returns.push(o30);
// 15648
o30.left = 360;
// 15650
o30.JSBNG__top = 10640;
// undefined
o30 = null;
// 15655
o30 = {};
// 15656
o72.classList = o30;
// 15658
o30.contains = f920654002_1519;
// undefined
o30 = null;
// 15659
f920654002_1519.returns.push(false);
// 15660
o72.parentNode = o65;
// undefined
o72 = null;
// 15661
o30 = {};
// 15662
o65.classList = o30;
// 15664
o30.contains = f920654002_1519;
// undefined
o30 = null;
// 15665
f920654002_1519.returns.push(false);
// 15666
o65.parentNode = o71;
// undefined
o65 = null;
// 15667
o30 = {};
// 15668
o71.classList = o30;
// 15670
o30.contains = f920654002_1519;
// undefined
o30 = null;
// 15671
f920654002_1519.returns.push(false);
// 15672
o30 = {};
// 15673
o71.parentNode = o30;
// undefined
o71 = null;
// 15674
o33 = {};
// 15675
o30.classList = o33;
// 15677
o33.contains = f920654002_1519;
// undefined
o33 = null;
// 15678
f920654002_1519.returns.push(false);
// 15679
o30.parentNode = o23;
// 15683
f920654002_1519.returns.push(false);
// 15688
f920654002_1519.returns.push(false);
// 15689
o8.parentNode = o27;
// 15690
o33 = {};
// 15691
o27.classList = o33;
// 15693
o33.contains = f920654002_1519;
// undefined
o33 = null;
// 15694
f920654002_1519.returns.push(false);
// 15695
o27.parentNode = o53;
// 15696
o33 = {};
// 15697
o53.classList = o33;
// 15699
o33.contains = f920654002_1519;
// undefined
o33 = null;
// 15700
f920654002_1519.returns.push(false);
// 15701
o53.parentNode = o9;
// 15702
o33 = {};
// 15703
o9.classList = o33;
// 15705
o33.contains = f920654002_1519;
// undefined
o33 = null;
// 15706
f920654002_1519.returns.push(false);
// 15707
o9.parentNode = o17;
// 15708
o33 = {};
// 15709
o17.classList = o33;
// 15711
o33.contains = f920654002_1519;
// undefined
o33 = null;
// 15712
f920654002_1519.returns.push(false);
// 15713
o33 = {};
// 15714
o17.parentNode = o33;
// 15715
o64 = {};
// 15716
o33.classList = o64;
// 15718
o64.contains = f920654002_1519;
// undefined
o64 = null;
// 15719
f920654002_1519.returns.push(false);
// 15720
o64 = {};
// 15721
o33.parentNode = o64;
// 15722
o65 = {};
// 15723
o64.classList = o65;
// 15725
o65.contains = f920654002_1519;
// undefined
o65 = null;
// 15726
f920654002_1519.returns.push(false);
// 15727
o65 = {};
// 15728
o64.parentNode = o65;
// 15729
o68 = {};
// 15730
o65.classList = o68;
// 15732
o68.contains = f920654002_1519;
// undefined
o68 = null;
// 15733
f920654002_1519.returns.push(false);
// 15734
o68 = {};
// 15735
o65.parentNode = o68;
// 15736
o70 = {};
// 15737
o68.classList = o70;
// 15739
o70.contains = f920654002_1519;
// undefined
o70 = null;
// 15740
f920654002_1519.returns.push(false);
// 15741
o70 = {};
// 15742
o68.parentNode = o70;
// 15743
o71 = {};
// 15744
o70.classList = o71;
// 15746
o71.contains = f920654002_1519;
// undefined
o71 = null;
// 15747
f920654002_1519.returns.push(false);
// 15748
o71 = {};
// 15749
o70.parentNode = o71;
// 15750
o72 = {};
// 15751
o71.classList = o72;
// 15753
o72.contains = f920654002_1519;
// undefined
o72 = null;
// 15754
f920654002_1519.returns.push(false);
// 15755
o71.parentNode = o91;
// undefined
o91 = null;
// 15759
f920654002_1519.returns.push(false);
// 15764
f920654002_1519.returns.push(false);
// 15769
f920654002_1519.returns.push(false);
// 15777
f920654002_1451.returns.push(undefined);
// 15781
f920654002_1038.returns.push(undefined);
// 15785
o72 = {};
// 15786
f920654002_462.returns.push(o72);
// 15787
o72.length = 1;
// 15788
o72["0"] = o69;
// undefined
o72 = null;
// 15789
o69.getAttribute = f920654002_464;
// 15790
f920654002_464.returns.push("recent");
// 15792
f920654002_464.returns.push("0");
// 15793
f920654002_2410 = function() { return f920654002_2410.returns[f920654002_2410.inst++]; };
f920654002_2410.returns = [];
f920654002_2410.inst = 0;
// 15794
f920654002_2377.thatReturnsArgument = f920654002_2410;
// 15795
f920654002_2410.returns.push("TimelineConstants/sectionRegistered");
// 15799
o72 = {};
// 15800
f920654002_462.returns.push(o72);
// 15801
o72.length = 1;
// 15802
o72["0"] = o69;
// undefined
o72 = null;
// undefined
o69 = null;
// 15804
f920654002_464.returns.push("recent");
// 15806
f920654002_464.returns.push("0");
// 15808
f920654002_2410.returns.push("TimelineConstants/sectionRegistered");
// 15811
o82.add = f920654002_1038;
// undefined
o82 = null;
// 15812
f920654002_1038.returns.push(undefined);
// 15813
f920654002_50.returns.push(2);
// 15818
// undefined
fo920654002_1_cookie.returns.push("wd=1024x702; highContrastMode=1; sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 15822
f920654002_418.returns.push(1373491977221);
// undefined
fo920654002_1_cookie.returns.push("wd=1024x702; highContrastMode=1; sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 15826
o69 = {};
// 15827
f920654002_56.returns.push(o69);
// 15828
// 15829
o69.open = f920654002_1466;
// 15830
f920654002_1466.returns.push(undefined);
// 15831
o69.setRequestHeader = f920654002_1467;
// 15832
f920654002_1467.returns.push(undefined);
// 15835
f920654002_1467.returns.push(undefined);
// 15836
o69.send = f920654002_1468;
// 15837
f920654002_1468.returns.push(undefined);
// 15841
f920654002_418.returns.push(1373491977232);
// 15844
f920654002_418.returns.push(1373491977233);
// undefined
fo920654002_1_cookie.returns.push("wd=1024x702; highContrastMode=1; sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 15847
f920654002_14.returns.push(undefined);
// 15848
f920654002_417.returns.push(0.3257723350543529);
// 15849
f920654002_12.returns.push(1251);
// 15852
f920654002_418.returns.push(1373491977688);
// 15855
f920654002_418.returns.push(1373491977690);
// 15857
f920654002_418.returns.push(1373491977691);
// 15860
f920654002_418.returns.push(1373491977691);
// 15865
f920654002_418.returns.push(1373491977699);
// 15867
f920654002_14.returns.push(undefined);
// 15868
f920654002_12.returns.push(1252);
// 15870
f920654002_50.returns.push(3);
// 15872
f920654002_50.returns.push(4);
// 15877
f920654002_1451.returns.push(undefined);
// 15881
f920654002_1451.returns.push(undefined);
// 15885
f920654002_1451.returns.push(undefined);
// 15889
f920654002_1451.returns.push(undefined);
// 15893
f920654002_1451.returns.push(undefined);
// 15906
f920654002_1451.returns.push(undefined);
// 15911
f920654002_1451.returns.push(undefined);
// 15917
f920654002_1451.returns.push(undefined);
// 15921
f920654002_1451.returns.push(undefined);
// 15925
f920654002_1038.returns.push(undefined);
// 15926
o6.cloneNode = f920654002_1658;
// 15927
o72 = {};
// 15928
f920654002_1658.returns.push(o72);
// 15929
o73 = {};
// undefined
fo920654002_2413_firstChild = function() { return fo920654002_2413_firstChild.returns[fo920654002_2413_firstChild.inst++]; };
fo920654002_2413_firstChild.returns = [];
fo920654002_2413_firstChild.inst = 0;
defineGetter(o72, "firstChild", fo920654002_2413_firstChild, undefined);
// undefined
fo920654002_2413_firstChild.returns.push(o73);
// undefined
fo920654002_2413_firstChild.returns.push(o73);
// 15932
o73.parentNode = o72;
// 15934
o72.removeChild = f920654002_471;
// 15935
f920654002_471.returns.push(o73);
// undefined
o73 = null;
// undefined
fo920654002_2413_firstChild.returns.push(null);
// 15938
o73 = {};
// 15939
f920654002_425.returns.push(o73);
// 15941
o82 = {};
// 15942
f920654002_1560.returns.push(o82);
// 15943
o73.appendChild = f920654002_429;
// 15944
f920654002_429.returns.push(o82);
// undefined
o82 = null;
// 15945
o72.appendChild = f920654002_429;
// 15946
f920654002_429.returns.push(o73);
// undefined
o73 = null;
// 15947
o6.parentNode = null;
// undefined
o6 = null;
// 15948
o72.__html = void 0;
// undefined
o72 = null;
// 15950
o6 = {};
// 15951
f920654002_425.returns.push(o6);
// undefined
o6 = null;
// 15953
f920654002_12.returns.push(1253);
// 15954
f920654002_12.returns.push(1254);
// 15957
f920654002_418.returns.push(1373491979564);
// 15959
f920654002_14.returns.push(undefined);
// 15960
f920654002_12.returns.push(1255);
// 15967
f920654002_1451.returns.push(undefined);
// 15971
f920654002_1451.returns.push(undefined);
// 15975
f920654002_1451.returns.push(undefined);
// 15979
f920654002_1451.returns.push(undefined);
// 15983
f920654002_1451.returns.push(undefined);
// 15996
f920654002_1451.returns.push(undefined);
// 16001
f920654002_1451.returns.push(undefined);
// 16007
f920654002_1451.returns.push(undefined);
// 16011
f920654002_1451.returns.push(undefined);
// 16015
f920654002_1038.returns.push(undefined);
// 16017
o6 = {};
// 16018
f920654002_1658.returns.push(o6);
// 16019
o72 = {};
// undefined
fo920654002_2418_firstChild = function() { return fo920654002_2418_firstChild.returns[fo920654002_2418_firstChild.inst++]; };
fo920654002_2418_firstChild.returns = [];
fo920654002_2418_firstChild.inst = 0;
defineGetter(o6, "firstChild", fo920654002_2418_firstChild, undefined);
// undefined
fo920654002_2418_firstChild.returns.push(o72);
// undefined
fo920654002_2418_firstChild.returns.push(o72);
// 16022
o72.parentNode = o6;
// 16024
o6.removeChild = f920654002_471;
// 16025
f920654002_471.returns.push(o72);
// undefined
o72 = null;
// undefined
fo920654002_2418_firstChild.returns.push(null);
// 16028
o72 = {};
// 16029
f920654002_425.returns.push(o72);
// 16031
o73 = {};
// 16032
f920654002_1560.returns.push(o73);
// 16033
o72.appendChild = f920654002_429;
// 16034
f920654002_429.returns.push(o73);
// undefined
o73 = null;
// 16035
o6.appendChild = f920654002_429;
// 16036
f920654002_429.returns.push(o72);
// undefined
o72 = null;
// 16038
o6.__html = void 0;
// undefined
o6 = null;
// 16040
o6 = {};
// 16041
f920654002_425.returns.push(o6);
// undefined
o6 = null;
// 16043
o6 = {};
// 16044
o72 = {};
// 16046
o6.transport = o69;
// 16047
o69.readyState = 1;
// 16057
f920654002_1451.returns.push(undefined);
// 16061
f920654002_1451.returns.push(undefined);
// 16065
f920654002_1038.returns.push(undefined);
// 16067
o73 = {};
// 16068
f920654002_1658.returns.push(o73);
// 16069
o82 = {};
// undefined
fo920654002_2425_firstChild = function() { return fo920654002_2425_firstChild.returns[fo920654002_2425_firstChild.inst++]; };
fo920654002_2425_firstChild.returns = [];
fo920654002_2425_firstChild.inst = 0;
defineGetter(o73, "firstChild", fo920654002_2425_firstChild, undefined);
// undefined
fo920654002_2425_firstChild.returns.push(o82);
// undefined
fo920654002_2425_firstChild.returns.push(o82);
// 16072
o82.parentNode = o73;
// 16074
o73.removeChild = f920654002_471;
// 16075
f920654002_471.returns.push(o82);
// undefined
o82 = null;
// undefined
fo920654002_2425_firstChild.returns.push(null);
// 16078
o82 = {};
// 16079
f920654002_425.returns.push(o82);
// 16081
o87 = {};
// 16082
f920654002_1560.returns.push(o87);
// 16083
o82.appendChild = f920654002_429;
// 16084
f920654002_429.returns.push(o87);
// undefined
o87 = null;
// 16085
o73.appendChild = f920654002_429;
// 16086
f920654002_429.returns.push(o82);
// undefined
o82 = null;
// 16088
o73.__html = void 0;
// undefined
o73 = null;
// 16090
o73 = {};
// 16091
f920654002_425.returns.push(o73);
// undefined
o73 = null;
// 16095
f920654002_418.returns.push(1373491981005);
// 16096
o74.offsetTop = 38;
// 16097
o74.scrollHeight = 48;
// undefined
o74 = null;
// 16098
f920654002_2430 = function() { return f920654002_2430.returns[f920654002_2430.inst++]; };
f920654002_2430.returns = [];
f920654002_2430.inst = 0;
// 16099
f920654002_2377.thatReturns = f920654002_2430;
// 16100
f920654002_2430.returns.push({__JSBNG_unknown_function:true});
// 16101
o73 = {};
// 16102
f920654002_2432 = function() { return f920654002_2432.returns[f920654002_2432.inst++]; };
f920654002_2432.returns = [];
f920654002_2432.inst = 0;
// 16103
o73.render = f920654002_2432;
// 16104
f920654002_2433 = function() { return f920654002_2433.returns[f920654002_2433.inst++]; };
f920654002_2433.returns = [];
f920654002_2433.inst = 0;
// 16105
f920654002_2432.reset = f920654002_2433;
// 16106
f920654002_14.returns.push(undefined);
// 16107
f920654002_2433.returns.push(undefined);
// 16108
f920654002_12.returns.push(1256);
// 16109
f920654002_2432.returns.push(undefined);
// 16110
// 16111
o74 = {};
// 16112
f920654002_2435 = function() { return f920654002_2435.returns[f920654002_2435.inst++]; };
f920654002_2435.returns = [];
f920654002_2435.inst = 0;
// 16113
o74.render = f920654002_2435;
// 16114
f920654002_2436 = function() { return f920654002_2436.returns[f920654002_2436.inst++]; };
f920654002_2436.returns = [];
f920654002_2436.inst = 0;
// 16115
f920654002_2435.reset = f920654002_2436;
// 16116
f920654002_14.returns.push(undefined);
// 16117
f920654002_2436.returns.push(undefined);
// 16118
f920654002_12.returns.push(1257);
// 16119
f920654002_2435.returns.push(undefined);
// 16120
// 16123
f920654002_418.returns.push(1373491981926);
// 16127
f920654002_12.returns.push(1258);
// 16129
o79.offsetHeight = 201;
// undefined
o79 = null;
// 16130
f920654002_587.returns.push(undefined);
// 16132
o83.offsetHeight = 678;
// undefined
o83 = null;
// 16133
f920654002_12.returns.push(1259);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 16139
f920654002_418.returns.push(1373491982930);
// 16143
f920654002_12.returns.push(1260);
// 16146
f920654002_418.returns.push(1373491983890);
// 16147
o79 = {};
// 16149
o79._polling = false;
// 16150
// 16151
f920654002_2438 = function() { return f920654002_2438.returns[f920654002_2438.inst++]; };
f920654002_2438.returns = [];
f920654002_2438.inst = 0;
// 16152
o79.request = f920654002_2438;
// 16153
o79._cancelRequest = f920654002_2377;
// 16154
f920654002_2377.returns.push(undefined);
// 16155
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 16157
o79._muted = false;
// 16158
o82 = {};
// 16159
o79._config = o82;
// 16160
o82.maxRequests = Infinity;
// 16161
// 16163
f920654002_2440 = function() { return f920654002_2440.returns[f920654002_2440.inst++]; };
f920654002_2440.returns = [];
f920654002_2440.inst = 0;
// 16164
o82.setupRequest = f920654002_2440;
// undefined
o82 = null;
// 16165
f920654002_2440.returns.push(undefined);
// 16166
o79._skip = false;
// 16167
f920654002_2438.returns.push(o79);
// 16168
o82 = {};
// 16172
o83 = {};
// 16178
f920654002_418.returns.push(1373491983902);
// 16182
f920654002_12.returns.push(1261);
// 16183
o87 = {};
// 16186
f920654002_12.returns.push(1262);
// 16187
o87.cancelBubble = false;
// 16188
o87.returnValue = true;
// undefined
o87 = null;
// 16189
o87 = {};
// 16192
f920654002_12.returns.push(1263);
// 16193
o87.cancelBubble = false;
// 16194
o87.returnValue = true;
// undefined
o87 = null;
// 16195
o87 = {};
// 16198
f920654002_12.returns.push(1264);
// 16199
o87.cancelBubble = false;
// 16200
o87.returnValue = true;
// undefined
o87 = null;
// 16203
o78.offsetHeight = 228;
// undefined
o78 = null;
// 16204
f920654002_587.returns.push(undefined);
// 16205
o78 = {};
// 16207
o87 = {};
// 16208
o78.alertList = o87;
// 16209
f920654002_2448 = function() { return f920654002_2448.returns[f920654002_2448.inst++]; };
f920654002_2448.returns = [];
f920654002_2448.inst = 0;
// 16210
o87.getIds = f920654002_2448;
// 16211
o91 = {};
// 16212
o87._list = o91;
// 16213
f920654002_2450 = function() { return f920654002_2450.returns[f920654002_2450.inst++]; };
f920654002_2450.returns = [];
f920654002_2450.inst = 0;
// 16214
o91.reduce = f920654002_2450;
// 16215
o91._head = null;
// 16216
f920654002_2450.returns.push({__JSBNG_unknown_object:true});
// 16217
f920654002_2448.returns.push({__JSBNG_unknown_object:true});
// 16218
o78._autoLoadNotifIndex = 1;
// 16220
f920654002_2451 = function() { return f920654002_2451.returns[f920654002_2451.inst++]; };
f920654002_2451.returns = [];
f920654002_2451.inst = 0;
// 16221
o87.getDomObj = f920654002_2451;
// 16222
f920654002_2452 = function() { return f920654002_2452.returns[f920654002_2452.inst++]; };
f920654002_2452.returns = [];
f920654002_2452.inst = 0;
// 16223
o87._getField = f920654002_2452;
// 16225
f920654002_2453 = function() { return f920654002_2453.returns[f920654002_2453.inst++]; };
f920654002_2453.returns = [];
f920654002_2453.inst = 0;
// 16226
o91.get = f920654002_2453;
// 16227
o92 = {};
// 16228
o91._nodes = o92;
// 16229
o92["null"] = void 0;
// undefined
o92 = null;
// 16230
f920654002_2453.returns.push(null);
// 16231
f920654002_2452.returns.push(null);
// 16232
f920654002_2451.returns.push(null);
// 16233
// 16234
f920654002_2455 = function() { return f920654002_2455.returns[f920654002_2455.inst++]; };
f920654002_2455.returns = [];
f920654002_2455.inst = 0;
// 16235
o78._annotateMorePagerURI = f920654002_2455;
// 16236
o78._morePagerLink = o66;
// 16237
o66.setAttribute = f920654002_587;
// undefined
o66 = null;
// 16240
f920654002_464.returns.push("/ajax/notifications/get.php?user=100006118350059");
// 16242
f920654002_2456 = function() { return f920654002_2456.returns[f920654002_2456.inst++]; };
f920654002_2456.returns = [];
f920654002_2456.inst = 0;
// 16243
o87.getEarliestNotifTime = f920654002_2456;
// undefined
o87 = null;
// 16245
f920654002_2457 = function() { return f920654002_2457.returns[f920654002_2457.inst++]; };
f920654002_2457.returns = [];
f920654002_2457.inst = 0;
// 16246
o91.isEmpty = f920654002_2457;
// undefined
o91 = null;
// 16248
f920654002_2457.returns.push(true);
// 16249
f920654002_2456.returns.push(0);
// 16250
f920654002_587.returns.push(undefined);
// 16251
f920654002_2455.returns.push(undefined);
// 16252
o66 = {};
// 16253
o87 = {};
// undefined
o87 = null;
// 16254
f920654002_2460 = function() { return f920654002_2460.returns[f920654002_2460.inst++]; };
f920654002_2460.returns = [];
f920654002_2460.inst = 0;
// 16255
o66._onReadyState = f920654002_2460;
// 16257
o66.xhr = o97;
// 16259
o97.readyState = 4;
// 16260
o66.JSBNG__status = null;
// 16261
f920654002_2461 = function() { return f920654002_2461.returns[f920654002_2461.inst++]; };
f920654002_2461.returns = [];
f920654002_2461.inst = 0;
// 16262
o66._parseStatus = f920654002_2461;
// 16264
o97.JSBNG__status = 404;
// 16265
// 16267
o97.statusText = "Not Found";
// undefined
o97 = null;
// 16277
// 16278
o66.errorText = void 0;
// 16279
// 16280
f920654002_2461.returns.push(undefined);
// 16282
f920654002_418.returns.push(1373491986138);
// 16283
o66._sentAt = 1373491972683;
// 16284
// 16285
f920654002_2462 = function() { return f920654002_2462.returns[f920654002_2462.inst++]; };
f920654002_2462.returns = [];
f920654002_2462.inst = 0;
// 16286
o66._call = f920654002_2462;
// 16287
f920654002_2463 = function() { return f920654002_2463.returns[f920654002_2463.inst++]; };
f920654002_2463.returns = [];
f920654002_2463.inst = 0;
// 16288
o66.onError = f920654002_2463;
// 16290
f920654002_2463.returns.push(undefined);
// 16291
f920654002_2462.returns.push(undefined);
// 16292
// 16293
// 16294
// 16295
o66._timer = 1228;
// 16296
f920654002_14.returns.push(undefined);
// 16301
f920654002_2460.returns.push(undefined);
// 16302
o87 = {};
// undefined
o87 = null;
// 16312
// 16324
// 16325
f920654002_2461.returns.push(undefined);
// 16327
f920654002_418.returns.push(1373491986142);
// 16329
// 16331
f920654002_2462.returns.push(undefined);
// 16332
// 16333
// 16334
// 16336
f920654002_14.returns.push(undefined);
// 16340
f920654002_2460.returns.push(undefined);
// 16341
o87 = {};
// undefined
o87 = null;
// 16351
// 16363
// 16364
f920654002_2461.returns.push(undefined);
// 16366
f920654002_418.returns.push(1373491986144);
// 16368
// 16370
f920654002_2462.returns.push(undefined);
// 16371
// 16372
// 16373
// 16375
f920654002_14.returns.push(undefined);
// 16379
f920654002_2460.returns.push(undefined);
// 16380
o87 = {};
// 16385
f920654002_50.returns.push(5);
// 16387
f920654002_50.returns.push(6);
// 16392
f920654002_1451.returns.push(undefined);
// 16396
f920654002_1451.returns.push(undefined);
// 16400
f920654002_1038.returns.push(undefined);
// 16402
o91 = {};
// 16403
f920654002_1658.returns.push(o91);
// 16404
o92 = {};
// undefined
fo920654002_2467_firstChild = function() { return fo920654002_2467_firstChild.returns[fo920654002_2467_firstChild.inst++]; };
fo920654002_2467_firstChild.returns = [];
fo920654002_2467_firstChild.inst = 0;
defineGetter(o91, "firstChild", fo920654002_2467_firstChild, undefined);
// undefined
fo920654002_2467_firstChild.returns.push(o92);
// undefined
fo920654002_2467_firstChild.returns.push(o92);
// 16407
o92.parentNode = o91;
// 16409
o91.removeChild = f920654002_471;
// 16410
f920654002_471.returns.push(o92);
// undefined
o92 = null;
// undefined
fo920654002_2467_firstChild.returns.push(null);
// 16413
o92 = {};
// 16414
f920654002_425.returns.push(o92);
// 16416
o97 = {};
// 16417
f920654002_1560.returns.push(o97);
// 16418
o92.appendChild = f920654002_429;
// 16419
f920654002_429.returns.push(o97);
// undefined
o97 = null;
// 16420
o91.appendChild = f920654002_429;
// 16421
f920654002_429.returns.push(o92);
// undefined
o92 = null;
// 16423
o91.__html = void 0;
// undefined
o91 = null;
// 16425
o91 = {};
// 16426
f920654002_425.returns.push(o91);
// undefined
o91 = null;
// 16430
f920654002_418.returns.push(1373491986584);
// 16433
f920654002_14.returns.push(undefined);
// 16434
f920654002_2433.returns.push(undefined);
// 16435
f920654002_12.returns.push(1265);
// 16436
f920654002_2432.returns.push(undefined);
// 16437
// 16440
f920654002_14.returns.push(undefined);
// 16441
f920654002_2436.returns.push(undefined);
// 16442
f920654002_12.returns.push(1266);
// 16443
f920654002_2435.returns.push(undefined);
// 16444
// 16447
o80.offsetHeight = 201;
// undefined
o80 = null;
// 16448
f920654002_587.returns.push(undefined);
// 16449
o80 = {};
// 16454
f920654002_2473 = function() { return f920654002_2473.returns[f920654002_2473.inst++]; };
f920654002_2473.returns = [];
f920654002_2473.inst = 0;
// 16455
o69.getResponseHeader = f920654002_2473;
// 16458
f920654002_2473.returns.push("ulXlT+FbmXfE6DgxIOTzYqNvArq3bzZcna+ZuIyZFV8=");
// 16461
f920654002_2473.returns.push("ulXlT+FbmXfE6DgxIOTzYqNvArq3bzZcna+ZuIyZFV8=");
// 16462
// 16464
o69.JSBNG__status = 200;
// 16468
f920654002_418.returns.push(1373491987919);
// 16469
f920654002_2474 = function() { return f920654002_2474.returns[f920654002_2474.inst++]; };
f920654002_2474.returns = [];
f920654002_2474.inst = 0;
// 16470
o6._handleXHRResponse = f920654002_2474;
// 16472
f920654002_2475 = function() { return f920654002_2475.returns[f920654002_2475.inst++]; };
f920654002_2475.returns = [];
f920654002_2475.inst = 0;
// 16473
o6.getOption = f920654002_2475;
// 16474
o91 = {};
// 16475
o6.option = o91;
// 16476
o91.suppressEvaluation = false;
// 16479
f920654002_2475.returns.push(false);
// 16480
o69.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"time\":1373491984000,\"notifications\":{\"latest_notif\":null,\"latest_read_notif\":null,\"notifications\":[]}},\"bootloadable\":{},\"ixData\":[]}";
// 16481
f920654002_2477 = function() { return f920654002_2477.returns[f920654002_2477.inst++]; };
f920654002_2477.returns = [];
f920654002_2477.inst = 0;
// 16482
o6._unshieldResponseText = f920654002_2477;
// 16483
f920654002_2477.returns.push("{\"__ar\":1,\"payload\":{\"time\":1373491984000,\"notifications\":{\"latest_notif\":null,\"latest_read_notif\":null,\"notifications\":[]}},\"bootloadable\":{},\"ixData\":[]}");
// 16484
f920654002_2478 = function() { return f920654002_2478.returns[f920654002_2478.inst++]; };
f920654002_2478.returns = [];
f920654002_2478.inst = 0;
// 16485
o6._interpretResponse = f920654002_2478;
// 16486
f920654002_2478.returns.push({__JSBNG_unknown_object:true});
// 16487
f920654002_2479 = function() { return f920654002_2479.returns[f920654002_2479.inst++]; };
f920654002_2479.returns = [];
f920654002_2479.inst = 0;
// 16488
o6.invokeResponseHandler = f920654002_2479;
// 16489
f920654002_2480 = function() { return f920654002_2480.returns[f920654002_2480.inst++]; };
f920654002_2480.returns = [];
f920654002_2480.inst = 0;
// 16490
o6.handler = f920654002_2480;
// 16491
f920654002_2481 = function() { return f920654002_2481.returns[f920654002_2481.inst++]; };
f920654002_2481.returns = [];
f920654002_2481.inst = 0;
// 16492
o6._isRelevant = f920654002_2481;
// 16493
o6._allowCrossPageTransition = true;
// 16494
f920654002_2481.returns.push(true);
// 16495
f920654002_2482 = function() { return f920654002_2482.returns[f920654002_2482.inst++]; };
f920654002_2482.returns = [];
f920654002_2482.inst = 0;
// 16496
o6._dispatchResponse = f920654002_2482;
// 16497
f920654002_2482.JSBNG__name = "";
// 16498
o6.preBootloadHandler = void 0;
// 16499
f920654002_2483 = function() { return f920654002_2483.returns[f920654002_2483.inst++]; };
f920654002_2483.returns = [];
f920654002_2483.inst = 0;
// 16500
o6.getURI = f920654002_2483;
// 16501
o92 = {};
// 16502
o6.uri = o92;
// 16503
f920654002_2485 = function() { return f920654002_2485.returns[f920654002_2485.inst++]; };
f920654002_2485.returns = [];
f920654002_2485.inst = 0;
// 16505
o92.$URIBase0 = "";
// 16506
o92.$URIBase1 = "";
// 16507
o92.$URIBase2 = "";
// 16508
o92.$URIBase3 = "/ajax/presence/update.php";
// 16510
o97 = {};
// 16511
o92.$URIBase5 = o97;
// undefined
o97 = null;
// 16512
o92.$URIBase4 = "";
// 16513
f920654002_2485.returns.push("/ajax/presence/update.php");
// 16514
f920654002_2483.returns.push("/ajax/presence/update.php");
// 16516
f920654002_12.returns.push(1267);
// 16520
o97 = {};
// 16521
f920654002_425.returns.push(o97);
// 16523
f920654002_429.returns.push(o97);
// undefined
o97 = null;
// 16524
f920654002_2479.returns.push(undefined);
// 16525
f920654002_2474.returns.push(undefined);
// 16528
o91.asynchronous = true;
// 16531
f920654002_2475.returns.push(true);
// 16532
// 16533
o97 = {};
// 16536
// 16537
o6.remainingRetries = 0;
// 16540
o91.suppressErrorAlerts = true;
// undefined
o91 = null;
// 16543
f920654002_2475.returns.push(true);
// 16544
f920654002_2489 = function() { return f920654002_2489.returns[f920654002_2489.inst++]; };
f920654002_2489.returns = [];
f920654002_2489.inst = 0;
// 16545
o6._invokeErrorHandler = f920654002_2489;
// 16546
o6.responseText = void 0;
// 16547
o6._requestAborted = void 0;
// 16549
f920654002_12.returns.push(1268);
// 16550
f920654002_2490 = function() { return f920654002_2490.returns[f920654002_2490.inst++]; };
f920654002_2490.returns = [];
f920654002_2490.inst = 0;
// 16551
o6.transportErrorHandler = f920654002_2490;
// 16558
f920654002_2475.returns.push(true);
// 16559
f920654002_2491 = function() { return f920654002_2491.returns[f920654002_2491.inst++]; };
f920654002_2491.returns = [];
f920654002_2491.inst = 0;
// 16560
o6._dispatchErrorResponse = f920654002_2491;
// 16562
f920654002_2492 = function() { return f920654002_2492.returns[f920654002_2492.inst++]; };
f920654002_2492.returns = [];
f920654002_2492.inst = 0;
// 16563
o6.clearStatusIndicator = f920654002_2492;
// 16564
f920654002_2493 = function() { return f920654002_2493.returns[f920654002_2493.inst++]; };
f920654002_2493.returns = [];
f920654002_2493.inst = 0;
// 16565
o6.getStatusElement = f920654002_2493;
// 16566
o6.statusElement = null;
// 16567
f920654002_2493.returns.push(null);
// 16568
f920654002_2492.returns.push(undefined);
// 16569
o6._sendTimeStamp = void 0;
// 16572
f920654002_2481.returns.push(true);
// 16573
f920654002_2494 = function() { return f920654002_2494.returns[f920654002_2494.inst++]; };
f920654002_2494.returns = [];
f920654002_2494.inst = 0;
// 16574
o6.initialHandler = f920654002_2494;
// 16575
f920654002_2494.returns.push(true);
// 16576
o6.timer = null;
// 16577
f920654002_14.returns.push(undefined);
// 16578
f920654002_2490.returns.push(undefined);
// 16579
f920654002_2495 = function() { return f920654002_2495.returns[f920654002_2495.inst++]; };
f920654002_2495.returns = [];
f920654002_2495.inst = 0;
// 16580
o6.finallyHandler = f920654002_2495;
// 16581
f920654002_2495.returns.push(undefined);
// 16582
f920654002_2491.returns.push(undefined);
// 16583
f920654002_2489.returns.push(undefined);
// 16589
f920654002_2493.returns.push(null);
// 16590
f920654002_2492.returns.push(undefined);
// 16593
f920654002_2481.returns.push(true);
// 16595
f920654002_2494.returns.push(true);
// 16597
f920654002_14.returns.push(undefined);
// 16599
f920654002_2496 = function() { return f920654002_2496.returns[f920654002_2496.inst++]; };
f920654002_2496.returns = [];
f920654002_2496.inst = 0;
// 16600
o6._shouldSuppressJS = f920654002_2496;
// 16602
f920654002_2480.returns.push(undefined);
// 16603
f920654002_2496.returns.push(false);
// 16604
f920654002_2497 = function() { return f920654002_2497.returns[f920654002_2497.inst++]; };
f920654002_2497.returns = [];
f920654002_2497.inst = 0;
// 16605
o6._handleJSResponse = f920654002_2497;
// 16606
f920654002_2498 = function() { return f920654002_2498.returns[f920654002_2498.inst++]; };
f920654002_2498.returns = [];
f920654002_2498.inst = 0;
// 16607
o6.getRelativeTo = f920654002_2498;
// 16608
o6.relativeTo = null;
// 16609
f920654002_2498.returns.push(null);
// 16610
f920654002_2499 = function() { return f920654002_2499.returns[f920654002_2499.inst++]; };
f920654002_2499.returns = [];
f920654002_2499.inst = 0;
// 16611
o6._handleJSRegisters = f920654002_2499;
// 16612
f920654002_2499.returns.push(undefined);
// 16613
o6.lid = void 0;
// 16615
f920654002_2499.returns.push(undefined);
// 16616
f920654002_2497.returns.push(undefined);
// 16618
f920654002_2495.returns.push(undefined);
// 16619
f920654002_2482.returns.push(undefined);
// 16620
o91 = {};
// 16623
// 16630
f920654002_2475.returns.push(true);
// 16635
f920654002_12.returns.push(1269);
// 16643
f920654002_2475.returns.push(true);
// 16649
f920654002_2493.returns.push(null);
// 16650
f920654002_2492.returns.push(undefined);
// 16654
f920654002_2481.returns.push(true);
// 16656
f920654002_2494.returns.push(true);
// 16658
f920654002_14.returns.push(undefined);
// 16659
f920654002_2490.returns.push(undefined);
// 16661
f920654002_2495.returns.push(undefined);
// 16662
f920654002_2491.returns.push(undefined);
// 16663
f920654002_2489.returns.push(undefined);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 16669
o77.offsetHeight = 240;
// undefined
o77 = null;
// 16670
f920654002_587.returns.push(undefined);
// 16671
o77 = {};
// 16674
o76.offsetHeight = 173;
// undefined
o76 = null;
// 16675
f920654002_587.returns.push(undefined);
// 16677
f920654002_418.returns.push(1373491989324);
// 16680
f920654002_418.returns.push(1373491989324);
// 16683
f920654002_418.returns.push(1373491989324);
// 16687
f920654002_418.returns.push(1373491989326);
// 16690
f920654002_418.returns.push(1373491989326);
// 16693
f920654002_418.returns.push(1373491989326);
// 16694
o76 = {};
// 16697
o76.srcElement = o54;
// 16699
o76.target = o54;
// 16706
f920654002_458.returns.push(null);
// 16712
f920654002_458.returns.push(null);
// 16718
f920654002_458.returns.push(null);
// 16724
f920654002_458.returns.push(null);
// 16730
f920654002_458.returns.push(null);
// 16736
f920654002_458.returns.push(null);
// 16741
o76.relatedTarget = o39;
// 16743
o39.nodeType = 1;
// 16744
o39.getAttributeNode = f920654002_458;
// 16746
f920654002_458.returns.push(null);
// 16749
o75.nodeType = 1;
// 16750
o75.getAttributeNode = f920654002_458;
// undefined
o75 = null;
// 16752
f920654002_458.returns.push(null);
// 16755
o38.nodeType = 1;
// 16756
o38.getAttributeNode = f920654002_458;
// undefined
o38 = null;
// 16758
f920654002_458.returns.push(null);
// 16761
o25.nodeType = 1;
// 16762
o25.getAttributeNode = f920654002_458;
// undefined
o25 = null;
// 16764
f920654002_458.returns.push(null);
// 16767
o40.nodeType = 1;
// 16768
o40.getAttributeNode = f920654002_458;
// undefined
o40 = null;
// 16770
f920654002_458.returns.push(null);
// 16772
o81.parentNode = o9;
// 16773
o81.nodeType = 1;
// 16774
o81.getAttributeNode = f920654002_458;
// 16776
f920654002_458.returns.push(null);
// 16779
o9.nodeType = 1;
// 16780
o9.getAttributeNode = f920654002_458;
// undefined
o9 = null;
// 16782
f920654002_458.returns.push(null);
// 16785
o17.nodeType = 1;
// 16786
o17.getAttributeNode = f920654002_458;
// undefined
o17 = null;
// 16788
f920654002_458.returns.push(null);
// 16791
o33.nodeType = 1;
// 16792
o33.getAttributeNode = f920654002_458;
// undefined
o33 = null;
// 16794
f920654002_458.returns.push(null);
// 16797
o64.nodeType = 1;
// 16798
o64.getAttributeNode = f920654002_458;
// 16800
f920654002_458.returns.push(null);
// 16803
o65.nodeType = 1;
// 16804
o65.getAttributeNode = f920654002_458;
// undefined
o65 = null;
// 16806
f920654002_458.returns.push(null);
// 16809
o68.nodeType = 1;
// 16810
o68.getAttributeNode = f920654002_458;
// undefined
o68 = null;
// 16812
f920654002_458.returns.push(null);
// 16815
o70.nodeType = 1;
// 16816
o70.getAttributeNode = f920654002_458;
// undefined
o70 = null;
// 16818
f920654002_458.returns.push(null);
// 16821
o71.nodeType = 1;
// 16822
o71.getAttributeNode = f920654002_458;
// undefined
o71 = null;
// 16824
f920654002_458.returns.push(null);
// 16830
f920654002_458.returns.push(null);
// 16836
f920654002_458.returns.push(null);
// 16842
f920654002_458.returns.push(null);
// 16847
o76.cancelBubble = false;
// 16848
o76.returnValue = true;
// undefined
o76 = null;
// 16849
o9 = {};
// 16852
o9.cancelBubble = false;
// 16855
f920654002_418.returns.push(1373491989343);
// 16860
f920654002_418.returns.push(1373491989348);
// 16864
f920654002_418.returns.push(1373491989348);
// 16868
f920654002_1117.returns.push(undefined);
// 16870
o9.returnValue = true;
// 16873
o9.srcElement = o39;
// 16875
o9.target = o39;
// 16882
f920654002_458.returns.push(null);
// 16888
f920654002_458.returns.push(null);
// 16894
f920654002_458.returns.push(null);
// 16900
f920654002_458.returns.push(null);
// 16906
f920654002_458.returns.push(null);
// 16912
f920654002_458.returns.push(null);
// 16918
f920654002_458.returns.push(null);
// 16924
f920654002_458.returns.push(null);
// 16930
f920654002_458.returns.push(null);
// 16936
f920654002_458.returns.push(null);
// 16942
f920654002_458.returns.push(null);
// 16948
f920654002_458.returns.push(null);
// 16954
f920654002_458.returns.push(null);
// 16960
f920654002_458.returns.push(null);
// 16966
f920654002_458.returns.push(null);
// 16972
f920654002_458.returns.push(null);
// 16978
f920654002_458.returns.push(null);
// 16983
o9.relatedTarget = o54;
// undefined
o9 = null;
// undefined
o54 = null;
// 16986
o9 = {};
// 16990
f920654002_418.returns.push(1373491989357);
// 16991
o9.cancelBubble = false;
// 16992
o9.returnValue = true;
// 16995
o9.srcElement = o39;
// 16997
o9.target = o39;
// 17004
f920654002_458.returns.push(null);
// 17010
f920654002_458.returns.push(null);
// 17016
f920654002_458.returns.push(null);
// 17022
f920654002_458.returns.push(null);
// 17028
f920654002_458.returns.push(null);
// 17034
f920654002_458.returns.push(null);
// 17040
f920654002_458.returns.push(null);
// 17046
f920654002_458.returns.push(null);
// 17052
f920654002_458.returns.push(null);
// 17058
f920654002_458.returns.push(null);
// 17064
f920654002_458.returns.push(null);
// 17070
f920654002_458.returns.push(null);
// 17076
f920654002_458.returns.push(null);
// 17082
f920654002_458.returns.push(null);
// 17088
f920654002_458.returns.push(null);
// 17094
f920654002_458.returns.push(null);
// 17100
f920654002_458.returns.push(null);
// 17105
o9.JSBNG__screenX = 790;
// 17106
o9.JSBNG__screenY = 304;
// 17107
o9.altKey = false;
// 17108
o9.bubbles = true;
// 17109
o9.button = 0;
// 17110
o9.buttons = void 0;
// 17111
o9.cancelable = false;
// 17112
o9.clientX = 711;
// 17113
o9.clientY = 210;
// 17114
o9.ctrlKey = false;
// 17115
o9.currentTarget = o0;
// 17116
o9.defaultPrevented = false;
// 17117
o9.detail = 0;
// 17118
o9.eventPhase = 3;
// 17119
o9.isTrusted = void 0;
// 17120
o9.metaKey = false;
// 17121
o9.pageX = 711;
// 17122
o9.pageY = 369;
// 17123
o9.relatedTarget = null;
// 17124
o9.fromElement = null;
// 17127
o9.shiftKey = false;
// 17130
o9.timeStamp = 1373491989357;
// 17131
o9.type = "mousemove";
// 17132
o9.view = ow920654002;
// undefined
o9 = null;
// 17135
f920654002_2505 = function() { return f920654002_2505.returns[f920654002_2505.inst++]; };
f920654002_2505.returns = [];
f920654002_2505.inst = 0;
// 17136
f920654002_2377.thatReturnsFalse = f920654002_2505;
// 17142
f920654002_1639.returns.push(undefined);
// 17145
f920654002_14.returns.push(undefined);
// 17146
f920654002_12.returns.push(1270);
// 17149
o9 = {};
// 17152
o9.cancelBubble = false;
// 17155
o9.returnValue = true;
// 17158
o9.srcElement = o16;
// 17160
o9.target = o16;
// 17167
f920654002_458.returns.push(null);
// 17173
f920654002_458.returns.push(null);
// 17178
o9.JSBNG__location = void 0;
// 17179
o9.altKey = false;
// 17180
o9.bubbles = true;
// 17181
o9.cancelable = true;
// 17182
o9.char = void 0;
// 17183
o9.charCode = 0;
// 17184
o9.ctrlKey = false;
// 17185
o9.currentTarget = o0;
// 17186
o9.defaultPrevented = false;
// 17187
o9.detail = 0;
// 17188
o9.eventPhase = 3;
// 17189
o9.isTrusted = void 0;
// 17190
o9.key = void 0;
// 17191
o9.keyCode = 13;
// 17192
o9.locale = void 0;
// 17193
o9.location = void 0;
// 17194
o9.metaKey = false;
// 17195
o9.repeat = void 0;
// 17196
o9.shiftKey = false;
// 17199
o9.timeStamp = 1373491989878;
// 17200
o9.type = "keyup";
// 17201
o9.view = ow920654002;
// 17202
o9.which = 13;
// 17209
o17 = {};
// 17211
o25 = {};
// 17212
o17.handlers = o25;
// 17214
o25["13"] = void 0;
// 17220
o33 = {};
// 17223
o33.srcElement = o39;
// 17225
o33.target = o39;
// 17232
f920654002_458.returns.push(null);
// 17238
f920654002_458.returns.push(null);
// 17244
f920654002_458.returns.push(null);
// 17250
f920654002_458.returns.push(null);
// 17256
f920654002_458.returns.push(null);
// 17262
f920654002_458.returns.push(null);
// 17268
f920654002_458.returns.push(null);
// 17274
f920654002_458.returns.push(null);
// 17280
f920654002_458.returns.push(null);
// 17286
f920654002_458.returns.push(null);
// 17292
f920654002_458.returns.push(null);
// 17298
f920654002_458.returns.push(null);
// 17304
f920654002_458.returns.push(null);
// 17310
f920654002_458.returns.push(null);
// 17316
f920654002_458.returns.push(null);
// 17322
f920654002_458.returns.push(null);
// 17328
f920654002_458.returns.push(null);
// 17333
o38 = {};
// 17334
o33.relatedTarget = o38;
// 17335
o40 = {};
// 17336
o38.parentNode = o40;
// 17337
o38.nodeType = 1;
// 17338
o38.getAttributeNode = f920654002_458;
// 17340
f920654002_458.returns.push(null);
// 17342
o54 = {};
// 17343
o40.parentNode = o54;
// 17344
o40.nodeType = 1;
// 17345
o40.getAttributeNode = f920654002_458;
// undefined
o40 = null;
// 17347
f920654002_458.returns.push(null);
// 17349
o54.parentNode = o24;
// 17350
o54.nodeType = 1;
// 17351
o54.getAttributeNode = f920654002_458;
// undefined
o54 = null;
// 17353
f920654002_458.returns.push(null);
// 17355
o24.parentNode = o81;
// undefined
o81 = null;
// 17356
o24.nodeType = 1;
// 17357
o24.getAttributeNode = f920654002_458;
// undefined
o24 = null;
// 17359
f920654002_458.returns.push(null);
// 17365
f920654002_458.returns.push(null);
// 17371
f920654002_458.returns.push(null);
// 17377
f920654002_458.returns.push(null);
// 17383
f920654002_458.returns.push(null);
// 17389
f920654002_458.returns.push(null);
// 17395
f920654002_458.returns.push(null);
// 17401
f920654002_458.returns.push(null);
// 17407
f920654002_458.returns.push(null);
// 17413
f920654002_458.returns.push(null);
// 17419
f920654002_458.returns.push(null);
// 17425
f920654002_458.returns.push(null);
// 17431
f920654002_458.returns.push(null);
// 17436
o33.cancelBubble = false;
// 17437
o33.returnValue = true;
// undefined
o33 = null;
// 17438
o24 = {};
// 17441
o24.cancelBubble = false;
// 17444
f920654002_418.returns.push(1373491990144);
// 17449
f920654002_418.returns.push(1373491990146);
// 17453
f920654002_418.returns.push(1373491990146);
// 17457
f920654002_1117.returns.push(undefined);
// 17459
o24.returnValue = true;
// 17462
o24.srcElement = o38;
// 17464
o24.target = o38;
// 17471
f920654002_458.returns.push(null);
// 17477
f920654002_458.returns.push(null);
// 17483
f920654002_458.returns.push(null);
// 17489
f920654002_458.returns.push(null);
// 17495
f920654002_458.returns.push(null);
// 17501
f920654002_458.returns.push(null);
// 17507
f920654002_458.returns.push(null);
// 17513
f920654002_458.returns.push(null);
// 17519
f920654002_458.returns.push(null);
// 17525
f920654002_458.returns.push(null);
// 17531
f920654002_458.returns.push(null);
// 17537
f920654002_458.returns.push(null);
// 17543
f920654002_458.returns.push(null);
// 17549
f920654002_458.returns.push(null);
// 17555
f920654002_458.returns.push(null);
// 17561
f920654002_458.returns.push(null);
// 17566
o24.relatedTarget = o39;
// undefined
o24 = null;
// undefined
o39 = null;
// 17569
o24 = {};
// 17573
f920654002_418.returns.push(1373491990160);
// 17574
o24.cancelBubble = false;
// 17575
o24.returnValue = true;
// 17578
o24.srcElement = o38;
// 17580
o24.target = o38;
// 17587
f920654002_458.returns.push(null);
// 17593
f920654002_458.returns.push(null);
// 17599
f920654002_458.returns.push(null);
// 17605
f920654002_458.returns.push(null);
// 17611
f920654002_458.returns.push(null);
// 17617
f920654002_458.returns.push(null);
// 17623
f920654002_458.returns.push(null);
// 17629
f920654002_458.returns.push(null);
// 17635
f920654002_458.returns.push(null);
// 17641
f920654002_458.returns.push(null);
// 17647
f920654002_458.returns.push(null);
// 17653
f920654002_458.returns.push(null);
// 17659
f920654002_458.returns.push(null);
// 17665
f920654002_458.returns.push(null);
// 17671
f920654002_458.returns.push(null);
// 17677
f920654002_458.returns.push(null);
// 17682
o24.JSBNG__screenX = 798;
// 17683
o24.JSBNG__screenY = 422;
// 17684
o24.altKey = false;
// 17685
o24.bubbles = true;
// 17686
o24.button = 0;
// 17687
o24.buttons = void 0;
// 17688
o24.cancelable = false;
// 17689
o24.clientX = 719;
// 17690
o24.clientY = 328;
// 17691
o24.ctrlKey = false;
// 17692
o24.currentTarget = o0;
// 17693
o24.defaultPrevented = false;
// 17694
o24.detail = 0;
// 17695
o24.eventPhase = 3;
// 17696
o24.isTrusted = void 0;
// 17697
o24.metaKey = false;
// 17698
o24.pageX = 719;
// 17699
o24.pageY = 487;
// 17700
o24.relatedTarget = null;
// 17701
o24.fromElement = null;
// 17704
o24.shiftKey = false;
// 17707
o24.timeStamp = 1373491990159;
// 17708
o24.type = "mousemove";
// 17709
o24.view = ow920654002;
// undefined
o24 = null;
// 17718
f920654002_1639.returns.push(undefined);
// 17721
f920654002_14.returns.push(undefined);
// 17722
f920654002_12.returns.push(1271);
// 17725
o24 = {};
// 17728
o24.cancelBubble = false;
// 17731
o24.returnValue = true;
// 17734
o24.srcElement = o16;
// 17736
o24.target = o16;
// 17743
f920654002_458.returns.push(null);
// 17749
f920654002_458.returns.push(null);
// 17754
o24.JSBNG__location = void 0;
// 17755
o24.altKey = false;
// 17756
o24.bubbles = true;
// 17757
o24.cancelable = true;
// 17758
o24.char = void 0;
// 17759
o24.charCode = 0;
// 17760
o24.ctrlKey = false;
// 17761
o24.currentTarget = o0;
// 17762
o24.defaultPrevented = false;
// 17763
o24.detail = 0;
// 17764
o24.eventPhase = 3;
// 17765
o24.isTrusted = void 0;
// 17766
o24.key = void 0;
// 17767
o24.keyCode = 13;
// 17768
o24.locale = void 0;
// 17769
o24.location = void 0;
// 17770
o24.metaKey = false;
// 17771
o24.repeat = void 0;
// 17772
o24.shiftKey = false;
// 17775
o24.timeStamp = 1373491990569;
// 17776
o24.type = "keyup";
// 17777
o24.view = ow920654002;
// 17778
o24.which = 13;
// 17792
o33 = {};
// 17795
o33.cancelBubble = false;
// 17798
o33.returnValue = true;
// 17801
o33.srcElement = o16;
// 17803
o33.target = o16;
// 17810
f920654002_458.returns.push(null);
// 17816
f920654002_458.returns.push(null);
// 17821
o33.JSBNG__location = void 0;
// 17822
o33.altKey = false;
// 17823
o33.bubbles = true;
// 17824
o33.cancelable = true;
// 17825
o33.char = void 0;
// 17826
o33.charCode = 0;
// 17827
o33.ctrlKey = false;
// 17828
o33.currentTarget = o0;
// 17829
o33.defaultPrevented = false;
// 17830
o33.detail = 0;
// 17831
o33.eventPhase = 3;
// 17832
o33.isTrusted = void 0;
// 17833
o33.key = void 0;
// 17834
o33.keyCode = 13;
// 17835
o33.locale = void 0;
// 17836
o33.location = void 0;
// 17837
o33.metaKey = false;
// 17838
o33.repeat = void 0;
// 17839
o33.shiftKey = false;
// 17842
o33.timeStamp = 1373491990590;
// 17843
o33.type = "keyup";
// 17844
o33.view = ow920654002;
// 17845
o33.which = 13;
// 17859
o39 = {};
// 17862
o39.cancelBubble = false;
// 17865
o39.returnValue = true;
// 17868
o39.srcElement = o16;
// 17870
o39.target = o16;
// 17877
f920654002_458.returns.push(null);
// 17883
f920654002_458.returns.push(null);
// 17888
o39.JSBNG__location = void 0;
// 17889
o39.altKey = false;
// 17890
o39.bubbles = true;
// 17891
o39.cancelable = true;
// 17892
o39.char = void 0;
// 17893
o39.charCode = 0;
// 17894
o39.ctrlKey = false;
// 17895
o39.currentTarget = o0;
// 17896
o39.defaultPrevented = false;
// 17897
o39.detail = 0;
// 17898
o39.eventPhase = 3;
// 17899
o39.isTrusted = void 0;
// 17900
o39.key = void 0;
// 17901
o39.keyCode = 13;
// 17902
o39.locale = void 0;
// 17903
o39.location = void 0;
// 17904
o39.metaKey = false;
// 17905
o39.repeat = void 0;
// 17906
o39.shiftKey = false;
// 17909
o39.timeStamp = 1373491990598;
// 17910
o39.type = "keyup";
// 17911
o39.view = ow920654002;
// 17912
o39.which = 13;
// 17926
o40 = {};
// 17929
o40.cancelBubble = false;
// 17932
o40.returnValue = true;
// 17935
o40.srcElement = o16;
// 17937
o40.target = o16;
// 17944
f920654002_458.returns.push(null);
// 17950
f920654002_458.returns.push(null);
// 17955
o40.JSBNG__location = void 0;
// 17956
o40.altKey = false;
// 17957
o40.bubbles = true;
// 17958
o40.cancelable = true;
// 17959
o40.char = void 0;
// 17960
o40.charCode = 0;
// 17961
o40.ctrlKey = false;
// 17962
o40.currentTarget = o0;
// 17963
o40.defaultPrevented = false;
// 17964
o40.detail = 0;
// 17965
o40.eventPhase = 3;
// 17966
o40.isTrusted = void 0;
// 17967
o40.key = void 0;
// 17968
o40.keyCode = 13;
// 17969
o40.locale = void 0;
// 17970
o40.location = void 0;
// 17971
o40.metaKey = false;
// 17972
o40.repeat = void 0;
// 17973
o40.shiftKey = false;
// 17976
o40.timeStamp = 1373491990607;
// 17977
o40.type = "keyup";
// 17978
o40.view = ow920654002;
// 17979
o40.which = 13;
// 17993
o54 = {};
// 17996
o54.cancelBubble = false;
// 17999
o54.returnValue = true;
// 18002
o54.srcElement = o16;
// 18004
o54.target = o16;
// 18011
f920654002_458.returns.push(null);
// 18017
f920654002_458.returns.push(null);
// 18022
o54.JSBNG__location = void 0;
// 18023
o54.altKey = false;
// 18024
o54.bubbles = true;
// 18025
o54.cancelable = true;
// 18026
o54.char = void 0;
// 18027
o54.charCode = 0;
// 18028
o54.ctrlKey = false;
// 18029
o54.currentTarget = o0;
// 18030
o54.defaultPrevented = false;
// 18031
o54.detail = 0;
// 18032
o54.eventPhase = 3;
// 18033
o54.isTrusted = void 0;
// 18034
o54.key = void 0;
// 18035
o54.keyCode = 13;
// 18036
o54.locale = void 0;
// 18037
o54.location = void 0;
// 18038
o54.metaKey = false;
// 18039
o54.repeat = void 0;
// 18040
o54.shiftKey = false;
// 18043
o54.timeStamp = 1373491990703;
// 18044
o54.type = "keyup";
// 18045
o54.view = ow920654002;
// 18046
o54.which = 13;
// 18060
o65 = {};
// 18063
o65.cancelBubble = false;
// 18066
o65.returnValue = true;
// 18069
o65.srcElement = o16;
// 18071
o65.target = o16;
// 18078
f920654002_458.returns.push(null);
// 18084
f920654002_458.returns.push(null);
// 18089
o65.JSBNG__location = void 0;
// 18090
o65.altKey = false;
// 18091
o65.bubbles = true;
// 18092
o65.cancelable = true;
// 18093
o65.char = void 0;
// 18094
o65.charCode = 0;
// 18095
o65.ctrlKey = false;
// 18096
o65.currentTarget = o0;
// 18097
o65.defaultPrevented = false;
// 18098
o65.detail = 0;
// 18099
o65.eventPhase = 3;
// 18100
o65.isTrusted = void 0;
// 18101
o65.key = void 0;
// 18102
o65.keyCode = 13;
// 18103
o65.locale = void 0;
// 18104
o65.location = void 0;
// 18105
o65.metaKey = false;
// 18106
o65.repeat = void 0;
// 18107
o65.shiftKey = false;
// 18110
o65.timeStamp = 1373491990707;
// 18111
o65.type = "keyup";
// 18112
o65.view = ow920654002;
// 18113
o65.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 18129
o68 = {};
// 18132
o68.cancelBubble = false;
// 18135
o68.returnValue = true;
// 18138
o68.srcElement = o16;
// 18140
o68.target = o16;
// 18147
f920654002_458.returns.push(null);
// 18153
f920654002_458.returns.push(null);
// 18158
o68.JSBNG__location = void 0;
// 18159
o68.altKey = false;
// 18160
o68.bubbles = true;
// 18161
o68.cancelable = true;
// 18162
o68.char = void 0;
// 18163
o68.charCode = 0;
// 18164
o68.ctrlKey = false;
// 18165
o68.currentTarget = o0;
// 18166
o68.defaultPrevented = false;
// 18167
o68.detail = 0;
// 18168
o68.eventPhase = 3;
// 18169
o68.isTrusted = void 0;
// 18170
o68.key = void 0;
// 18171
o68.keyCode = 13;
// 18172
o68.locale = void 0;
// 18173
o68.location = void 0;
// 18174
o68.metaKey = false;
// 18175
o68.repeat = void 0;
// 18176
o68.shiftKey = false;
// 18179
o68.timeStamp = 1373491990715;
// 18180
o68.type = "keyup";
// 18181
o68.view = ow920654002;
// 18182
o68.which = 13;
// 18196
o70 = {};
// 18199
o70.cancelBubble = false;
// 18202
o70.returnValue = true;
// 18205
o70.srcElement = o16;
// 18207
o70.target = o16;
// 18214
f920654002_458.returns.push(null);
// 18220
f920654002_458.returns.push(null);
// 18225
o70.JSBNG__location = void 0;
// 18226
o70.altKey = false;
// 18227
o70.bubbles = true;
// 18228
o70.cancelable = true;
// 18229
o70.char = void 0;
// 18230
o70.charCode = 0;
// 18231
o70.ctrlKey = false;
// 18232
o70.currentTarget = o0;
// 18233
o70.defaultPrevented = false;
// 18234
o70.detail = 0;
// 18235
o70.eventPhase = 3;
// 18236
o70.isTrusted = void 0;
// 18237
o70.key = void 0;
// 18238
o70.keyCode = 13;
// 18239
o70.locale = void 0;
// 18240
o70.location = void 0;
// 18241
o70.metaKey = false;
// 18242
o70.repeat = void 0;
// 18243
o70.shiftKey = false;
// 18246
o70.timeStamp = 1373491990725;
// 18247
o70.type = "keyup";
// 18248
o70.view = ow920654002;
// 18249
o70.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 18266
f920654002_418.returns.push(1373491990731);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 18270
o71 = {};
// 18271
f920654002_56.returns.push(o71);
// 18272
// 18273
o71.open = f920654002_1466;
// 18274
f920654002_1466.returns.push(undefined);
// 18275
o71.setRequestHeader = f920654002_1467;
// 18276
f920654002_1467.returns.push(undefined);
// 18279
f920654002_1467.returns.push(undefined);
// 18280
o71.send = f920654002_1468;
// 18281
f920654002_1468.returns.push(undefined);
// 18285
f920654002_418.returns.push(1373491990742);
// 18288
f920654002_418.returns.push(1373491990746);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 18291
f920654002_14.returns.push(undefined);
// 18292
f920654002_417.returns.push(0.013633037684485316);
// 18293
f920654002_12.returns.push(1272);
// 18296
f920654002_418.returns.push(1373491991173);
// 18299
f920654002_418.returns.push(1373491991174);
// 18301
f920654002_418.returns.push(1373491991174);
// 18304
f920654002_418.returns.push(1373491991174);
// 18309
f920654002_418.returns.push(1373491991174);
// 18311
f920654002_14.returns.push(undefined);
// 18312
f920654002_12.returns.push(1273);
// 18314
f920654002_50.returns.push(7);
// 18316
f920654002_50.returns.push(8);
// 18321
f920654002_1451.returns.push(undefined);
// 18325
f920654002_1451.returns.push(undefined);
// 18329
f920654002_1451.returns.push(undefined);
// 18333
f920654002_1451.returns.push(undefined);
// 18337
f920654002_1451.returns.push(undefined);
// 18350
f920654002_1451.returns.push(undefined);
// 18355
f920654002_1451.returns.push(undefined);
// 18361
f920654002_1451.returns.push(undefined);
// 18365
f920654002_1451.returns.push(undefined);
// 18369
f920654002_1038.returns.push(undefined);
// 18371
o75 = {};
// 18372
f920654002_1658.returns.push(o75);
// 18373
o76 = {};
// undefined
fo920654002_2524_firstChild = function() { return fo920654002_2524_firstChild.returns[fo920654002_2524_firstChild.inst++]; };
fo920654002_2524_firstChild.returns = [];
fo920654002_2524_firstChild.inst = 0;
defineGetter(o75, "firstChild", fo920654002_2524_firstChild, undefined);
// undefined
fo920654002_2524_firstChild.returns.push(o76);
// undefined
fo920654002_2524_firstChild.returns.push(o76);
// 18376
o76.parentNode = o75;
// 18378
o75.removeChild = f920654002_471;
// 18379
f920654002_471.returns.push(o76);
// undefined
o76 = null;
// undefined
fo920654002_2524_firstChild.returns.push(null);
// 18382
o76 = {};
// 18383
f920654002_425.returns.push(o76);
// 18385
o81 = {};
// 18386
f920654002_1560.returns.push(o81);
// 18387
o76.appendChild = f920654002_429;
// 18388
f920654002_429.returns.push(o81);
// undefined
o81 = null;
// 18389
o75.appendChild = f920654002_429;
// 18390
f920654002_429.returns.push(o76);
// undefined
o76 = null;
// 18392
o75.__html = void 0;
// undefined
o75 = null;
// 18394
o75 = {};
// 18395
f920654002_425.returns.push(o75);
// undefined
o75 = null;
// 18397
f920654002_14.returns.push(undefined);
// 18398
f920654002_12.returns.push(1274);
// 18401
f920654002_418.returns.push(1373491992612);
// 18403
f920654002_14.returns.push(undefined);
// 18404
f920654002_12.returns.push(1275);
// 18411
f920654002_1451.returns.push(undefined);
// 18415
f920654002_1451.returns.push(undefined);
// 18419
f920654002_1451.returns.push(undefined);
// 18423
f920654002_1451.returns.push(undefined);
// 18427
f920654002_1451.returns.push(undefined);
// 18440
f920654002_1451.returns.push(undefined);
// 18445
f920654002_1451.returns.push(undefined);
// 18451
f920654002_1451.returns.push(undefined);
// 18455
f920654002_1451.returns.push(undefined);
// 18459
f920654002_1038.returns.push(undefined);
// 18461
o75 = {};
// 18462
f920654002_1658.returns.push(o75);
// 18463
o76 = {};
// undefined
fo920654002_2529_firstChild = function() { return fo920654002_2529_firstChild.returns[fo920654002_2529_firstChild.inst++]; };
fo920654002_2529_firstChild.returns = [];
fo920654002_2529_firstChild.inst = 0;
defineGetter(o75, "firstChild", fo920654002_2529_firstChild, undefined);
// undefined
fo920654002_2529_firstChild.returns.push(o76);
// undefined
fo920654002_2529_firstChild.returns.push(o76);
// 18466
o76.parentNode = o75;
// 18468
o75.removeChild = f920654002_471;
// 18469
f920654002_471.returns.push(o76);
// undefined
o76 = null;
// undefined
fo920654002_2529_firstChild.returns.push(null);
// 18472
o76 = {};
// 18473
f920654002_425.returns.push(o76);
// 18475
o81 = {};
// 18476
f920654002_1560.returns.push(o81);
// 18477
o76.appendChild = f920654002_429;
// 18478
f920654002_429.returns.push(o81);
// undefined
o81 = null;
// 18479
o75.appendChild = f920654002_429;
// 18480
f920654002_429.returns.push(o76);
// undefined
o76 = null;
// 18482
o75.__html = void 0;
// undefined
o75 = null;
// 18484
o75 = {};
// 18485
f920654002_425.returns.push(o75);
// undefined
o75 = null;
// 18487
o75 = {};
// 18488
o76 = {};
// 18490
o75.transport = o71;
// 18491
o71.readyState = 1;
// 18494
f920654002_14.returns.push(undefined);
// 18495
f920654002_2433.returns.push(undefined);
// 18496
f920654002_12.returns.push(1276);
// 18497
f920654002_2432.returns.push(undefined);
// 18498
// 18501
f920654002_14.returns.push(undefined);
// 18502
f920654002_2436.returns.push(undefined);
// 18503
f920654002_12.returns.push(1277);
// 18504
f920654002_2435.returns.push(undefined);
// 18505
// 18510
f920654002_50.returns.push(9);
// 18512
f920654002_50.returns.push(10);
// 18517
f920654002_1451.returns.push(undefined);
// 18521
f920654002_1451.returns.push(undefined);
// 18525
f920654002_1038.returns.push(undefined);
// 18527
o81 = {};
// 18528
f920654002_1658.returns.push(o81);
// 18529
o101 = {};
// undefined
fo920654002_2536_firstChild = function() { return fo920654002_2536_firstChild.returns[fo920654002_2536_firstChild.inst++]; };
fo920654002_2536_firstChild.returns = [];
fo920654002_2536_firstChild.inst = 0;
defineGetter(o81, "firstChild", fo920654002_2536_firstChild, undefined);
// undefined
fo920654002_2536_firstChild.returns.push(o101);
// undefined
fo920654002_2536_firstChild.returns.push(o101);
// 18532
o101.parentNode = o81;
// 18534
o81.removeChild = f920654002_471;
// 18535
f920654002_471.returns.push(o101);
// undefined
o101 = null;
// undefined
fo920654002_2536_firstChild.returns.push(null);
// 18538
o101 = {};
// 18539
f920654002_425.returns.push(o101);
// 18541
o104 = {};
// 18542
f920654002_1560.returns.push(o104);
// 18543
o101.appendChild = f920654002_429;
// 18544
f920654002_429.returns.push(o104);
// undefined
o104 = null;
// 18545
o81.appendChild = f920654002_429;
// 18546
f920654002_429.returns.push(o101);
// undefined
o101 = null;
// 18548
o81.__html = void 0;
// undefined
o81 = null;
// 18550
o81 = {};
// 18551
f920654002_425.returns.push(o81);
// undefined
o81 = null;
// 18555
f920654002_418.returns.push(1373491995194);
// 18558
f920654002_14.returns.push(undefined);
// 18559
f920654002_2433.returns.push(undefined);
// 18560
f920654002_12.returns.push(1278);
// 18561
f920654002_2432.returns.push(undefined);
// 18562
// undefined
o73 = null;
// 18565
f920654002_14.returns.push(undefined);
// 18566
f920654002_2436.returns.push(undefined);
// 18567
f920654002_12.returns.push(1279);
// 18568
f920654002_2435.returns.push(undefined);
// 18569
// undefined
o74 = null;
// 18570
o73 = {};
// 18573
o73.cancelBubble = false;
// 18576
o73.returnValue = true;
// 18579
o73.srcElement = o16;
// 18581
o73.target = o16;
// 18588
f920654002_458.returns.push(null);
// 18594
f920654002_458.returns.push(null);
// 18599
o73.JSBNG__location = void 0;
// 18600
o73.altKey = false;
// 18601
o73.bubbles = true;
// 18602
o73.cancelable = true;
// 18603
o73.char = void 0;
// 18604
o73.charCode = 0;
// 18605
o73.ctrlKey = false;
// 18606
o73.currentTarget = o0;
// 18607
o73.defaultPrevented = false;
// 18608
o73.detail = 0;
// 18609
o73.eventPhase = 3;
// 18610
o73.isTrusted = void 0;
// 18611
o73.key = void 0;
// 18612
o73.keyCode = 13;
// 18613
o73.locale = void 0;
// 18614
o73.location = void 0;
// 18615
o73.metaKey = false;
// 18616
o73.repeat = void 0;
// 18617
o73.shiftKey = false;
// 18620
o73.timeStamp = 1373491996315;
// 18621
o73.type = "keyup";
// 18622
o73.view = ow920654002;
// 18623
o73.which = 13;
// 18638
f920654002_12.returns.push(1280);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 18641
o74 = {};
// 18644
o74.cancelBubble = false;
// 18647
o74.returnValue = true;
// 18650
o74.srcElement = o16;
// 18652
o74.target = o16;
// 18659
f920654002_458.returns.push(null);
// 18665
f920654002_458.returns.push(null);
// 18670
o74.JSBNG__location = void 0;
// 18671
o74.altKey = false;
// 18672
o74.bubbles = true;
// 18673
o74.cancelable = true;
// 18674
o74.char = void 0;
// 18675
o74.charCode = 0;
// 18676
o74.ctrlKey = false;
// 18677
o74.currentTarget = o0;
// 18678
o74.defaultPrevented = false;
// 18679
o74.detail = 0;
// 18680
o74.eventPhase = 3;
// 18681
o74.isTrusted = void 0;
// 18682
o74.key = void 0;
// 18683
o74.keyCode = 13;
// 18684
o74.locale = void 0;
// 18685
o74.location = void 0;
// 18686
o74.metaKey = false;
// 18687
o74.repeat = void 0;
// 18688
o74.shiftKey = false;
// 18691
o74.timeStamp = 1373491996836;
// 18692
o74.type = "keyup";
// 18693
o74.view = ow920654002;
// 18694
o74.which = 13;
// 18708
o81 = {};
// 18711
o81.cancelBubble = false;
// 18714
o81.returnValue = true;
// 18717
o81.srcElement = o16;
// 18719
o81.target = o16;
// 18726
f920654002_458.returns.push(null);
// 18732
f920654002_458.returns.push(null);
// 18737
o81.JSBNG__location = void 0;
// 18738
o81.altKey = false;
// 18739
o81.bubbles = true;
// 18740
o81.cancelable = true;
// 18741
o81.char = void 0;
// 18742
o81.charCode = 0;
// 18743
o81.ctrlKey = false;
// 18744
o81.currentTarget = o0;
// 18745
o81.defaultPrevented = false;
// 18746
o81.detail = 0;
// 18747
o81.eventPhase = 3;
// 18748
o81.isTrusted = void 0;
// 18749
o81.key = void 0;
// 18750
o81.keyCode = 13;
// 18751
o81.locale = void 0;
// 18752
o81.location = void 0;
// 18753
o81.metaKey = false;
// 18754
o81.repeat = void 0;
// 18755
o81.shiftKey = false;
// 18758
o81.timeStamp = 1373491996856;
// 18759
o81.type = "keyup";
// 18760
o81.view = ow920654002;
// 18761
o81.which = 13;
// 18775
o101 = {};
// 18778
o101.cancelBubble = false;
// 18781
o101.returnValue = true;
// 18784
o101.srcElement = o16;
// 18786
o101.target = o16;
// 18793
f920654002_458.returns.push(null);
// 18799
f920654002_458.returns.push(null);
// 18804
o101.JSBNG__location = void 0;
// 18805
o101.altKey = false;
// 18806
o101.bubbles = true;
// 18807
o101.cancelable = true;
// 18808
o101.char = void 0;
// 18809
o101.charCode = 0;
// 18810
o101.ctrlKey = false;
// 18811
o101.currentTarget = o0;
// 18812
o101.defaultPrevented = false;
// 18813
o101.detail = 0;
// 18814
o101.eventPhase = 3;
// 18815
o101.isTrusted = void 0;
// 18816
o101.key = void 0;
// 18817
o101.keyCode = 13;
// 18818
o101.locale = void 0;
// 18819
o101.location = void 0;
// 18820
o101.metaKey = false;
// 18821
o101.repeat = void 0;
// 18822
o101.shiftKey = false;
// 18825
o101.timeStamp = 1373491996861;
// 18826
o101.type = "keyup";
// 18827
o101.view = ow920654002;
// 18828
o101.which = 13;
// 18842
o104 = {};
// 18845
o104.cancelBubble = false;
// 18848
o104.returnValue = true;
// 18851
o104.srcElement = o16;
// 18853
o104.target = o16;
// 18860
f920654002_458.returns.push(null);
// 18866
f920654002_458.returns.push(null);
// 18871
o104.JSBNG__location = void 0;
// 18872
o104.altKey = false;
// 18873
o104.bubbles = true;
// 18874
o104.cancelable = true;
// 18875
o104.char = void 0;
// 18876
o104.charCode = 0;
// 18877
o104.ctrlKey = false;
// 18878
o104.currentTarget = o0;
// 18879
o104.defaultPrevented = false;
// 18880
o104.detail = 0;
// 18881
o104.eventPhase = 3;
// 18882
o104.isTrusted = void 0;
// 18883
o104.key = void 0;
// 18884
o104.keyCode = 13;
// 18885
o104.locale = void 0;
// 18886
o104.location = void 0;
// 18887
o104.metaKey = false;
// 18888
o104.repeat = void 0;
// 18889
o104.shiftKey = false;
// 18892
o104.timeStamp = 1373491996937;
// 18893
o104.type = "keyup";
// 18894
o104.view = ow920654002;
// 18895
o104.which = 13;
// 18909
o105 = {};
// 18912
o105.cancelBubble = false;
// 18915
o105.returnValue = true;
// 18918
o105.srcElement = o16;
// 18920
o105.target = o16;
// 18927
f920654002_458.returns.push(null);
// 18933
f920654002_458.returns.push(null);
// 18938
o105.JSBNG__location = void 0;
// 18939
o105.altKey = false;
// 18940
o105.bubbles = true;
// 18941
o105.cancelable = true;
// 18942
o105.char = void 0;
// 18943
o105.charCode = 0;
// 18944
o105.ctrlKey = false;
// 18945
o105.currentTarget = o0;
// 18946
o105.defaultPrevented = false;
// 18947
o105.detail = 0;
// 18948
o105.eventPhase = 3;
// 18949
o105.isTrusted = void 0;
// 18950
o105.key = void 0;
// 18951
o105.keyCode = 13;
// 18952
o105.locale = void 0;
// 18953
o105.location = void 0;
// 18954
o105.metaKey = false;
// 18955
o105.repeat = void 0;
// 18956
o105.shiftKey = false;
// 18959
o105.timeStamp = 1373491996944;
// 18960
o105.type = "keyup";
// 18961
o105.view = ow920654002;
// 18962
o105.which = 13;
// 18976
o106 = {};
// 18979
o106.cancelBubble = false;
// 18982
o106.returnValue = true;
// 18985
o106.srcElement = o16;
// 18987
o106.target = o16;
// 18994
f920654002_458.returns.push(null);
// 19000
f920654002_458.returns.push(null);
// 19005
o106.JSBNG__location = void 0;
// 19006
o106.altKey = false;
// 19007
o106.bubbles = true;
// 19008
o106.cancelable = true;
// 19009
o106.char = void 0;
// 19010
o106.charCode = 0;
// 19011
o106.ctrlKey = false;
// 19012
o106.currentTarget = o0;
// 19013
o106.defaultPrevented = false;
// 19014
o106.detail = 0;
// 19015
o106.eventPhase = 3;
// 19016
o106.isTrusted = void 0;
// 19017
o106.key = void 0;
// 19018
o106.keyCode = 13;
// 19019
o106.locale = void 0;
// 19020
o106.location = void 0;
// 19021
o106.metaKey = false;
// 19022
o106.repeat = void 0;
// 19023
o106.shiftKey = false;
// 19026
o106.timeStamp = 1373491996948;
// 19027
o106.type = "keyup";
// 19028
o106.view = ow920654002;
// 19029
o106.which = 13;
// 19043
o107 = {};
// 19046
o107.cancelBubble = false;
// 19049
o107.returnValue = true;
// 19052
o107.srcElement = o16;
// 19054
o107.target = o16;
// 19061
f920654002_458.returns.push(null);
// 19067
f920654002_458.returns.push(null);
// 19072
o107.JSBNG__location = void 0;
// 19073
o107.altKey = false;
// 19074
o107.bubbles = true;
// 19075
o107.cancelable = true;
// 19076
o107.char = void 0;
// 19077
o107.charCode = 0;
// 19078
o107.ctrlKey = false;
// 19079
o107.currentTarget = o0;
// 19080
o107.defaultPrevented = false;
// 19081
o107.detail = 0;
// 19082
o107.eventPhase = 3;
// 19083
o107.isTrusted = void 0;
// 19084
o107.key = void 0;
// 19085
o107.keyCode = 13;
// 19086
o107.locale = void 0;
// 19087
o107.location = void 0;
// 19088
o107.metaKey = false;
// 19089
o107.repeat = void 0;
// 19090
o107.shiftKey = false;
// 19093
o107.timeStamp = 1373491996955;
// 19094
o107.type = "keyup";
// 19095
o107.view = ow920654002;
// 19096
o107.which = 13;
// 19110
o108 = {};
// 19113
o108.cancelBubble = false;
// 19116
o108.returnValue = true;
// 19119
o108.srcElement = o16;
// 19121
o108.target = o16;
// 19128
f920654002_458.returns.push(null);
// 19134
f920654002_458.returns.push(null);
// 19139
o108.JSBNG__location = void 0;
// 19140
o108.altKey = false;
// 19141
o108.bubbles = true;
// 19142
o108.cancelable = true;
// 19143
o108.char = void 0;
// 19144
o108.charCode = 0;
// 19145
o108.ctrlKey = false;
// 19146
o108.currentTarget = o0;
// 19147
o108.defaultPrevented = false;
// 19148
o108.detail = 0;
// 19149
o108.eventPhase = 3;
// 19150
o108.isTrusted = void 0;
// 19151
o108.key = void 0;
// 19152
o108.keyCode = 13;
// 19153
o108.locale = void 0;
// 19154
o108.location = void 0;
// 19155
o108.metaKey = false;
// 19156
o108.repeat = void 0;
// 19157
o108.shiftKey = false;
// 19160
o108.timeStamp = 1373491996958;
// 19161
o108.type = "keyup";
// 19162
o108.view = ow920654002;
// 19163
o108.which = 13;
// 19177
o109 = {};
// 19180
o109.cancelBubble = false;
// 19183
o109.returnValue = true;
// 19186
o109.srcElement = o16;
// 19188
o109.target = o16;
// 19195
f920654002_458.returns.push(null);
// 19201
f920654002_458.returns.push(null);
// 19206
o109.JSBNG__location = void 0;
// 19207
o109.altKey = false;
// 19208
o109.bubbles = true;
// 19209
o109.cancelable = true;
// 19210
o109.char = void 0;
// 19211
o109.charCode = 0;
// 19212
o109.ctrlKey = false;
// 19213
o109.currentTarget = o0;
// 19214
o109.defaultPrevented = false;
// 19215
o109.detail = 0;
// 19216
o109.eventPhase = 3;
// 19217
o109.isTrusted = void 0;
// 19218
o109.key = void 0;
// 19219
o109.keyCode = 13;
// 19220
o109.locale = void 0;
// 19221
o109.location = void 0;
// 19222
o109.metaKey = false;
// 19223
o109.repeat = void 0;
// 19224
o109.shiftKey = false;
// 19227
o109.timeStamp = 1373491996967;
// 19228
o109.type = "keyup";
// 19229
o109.view = ow920654002;
// 19230
o109.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19248
o110 = {};
// 19252
o111 = {};
// 19256
o112 = {};
// 19261
o71.getResponseHeader = f920654002_2473;
// 19264
f920654002_2473.returns.push("aJ0CoRqUYTUF+9zNyyDsNSm4uwkBpy7tmL0U0ohpjp4=");
// 19267
f920654002_2473.returns.push("aJ0CoRqUYTUF+9zNyyDsNSm4uwkBpy7tmL0U0ohpjp4=");
// 19268
// 19270
o71.JSBNG__status = 200;
// 19274
f920654002_418.returns.push(1373491997199);
// 19275
o75._handleXHRResponse = f920654002_2474;
// 19277
o75.getOption = f920654002_2475;
// 19278
o113 = {};
// 19279
o75.option = o113;
// 19280
o113.suppressEvaluation = false;
// 19283
f920654002_2475.returns.push(false);
// 19284
o71.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"time\":1373491997000,\"notifications\":{\"latest_notif\":null,\"latest_read_notif\":null,\"notifications\":[]}},\"bootloadable\":{},\"ixData\":[]}";
// 19285
o75._unshieldResponseText = f920654002_2477;
// 19286
f920654002_2477.returns.push("{\"__ar\":1,\"payload\":{\"time\":1373491997000,\"notifications\":{\"latest_notif\":null,\"latest_read_notif\":null,\"notifications\":[]}},\"bootloadable\":{},\"ixData\":[]}");
// 19287
o75._interpretResponse = f920654002_2478;
// 19288
f920654002_2478.returns.push({__JSBNG_unknown_object:true});
// 19289
o75.invokeResponseHandler = f920654002_2479;
// 19290
f920654002_2555 = function() { return f920654002_2555.returns[f920654002_2555.inst++]; };
f920654002_2555.returns = [];
f920654002_2555.inst = 0;
// 19291
o75.handler = f920654002_2555;
// 19292
o75._isRelevant = f920654002_2481;
// 19293
o75._allowCrossPageTransition = true;
// 19294
f920654002_2481.returns.push(true);
// 19295
o75._dispatchResponse = f920654002_2482;
// 19297
o75.preBootloadHandler = void 0;
// 19298
o75.getURI = f920654002_2483;
// 19299
o114 = {};
// 19300
o75.uri = o114;
// 19302
o114.$URIBase0 = "";
// 19303
o114.$URIBase1 = "";
// 19304
o114.$URIBase2 = "";
// 19305
o114.$URIBase3 = "/ajax/presence/update.php";
// 19307
o115 = {};
// 19308
o114.$URIBase5 = o115;
// undefined
o115 = null;
// 19309
o114.$URIBase4 = "";
// 19310
f920654002_2485.returns.push("/ajax/presence/update.php");
// 19311
f920654002_2483.returns.push("/ajax/presence/update.php");
// 19313
f920654002_12.returns.push(1281);
// 19317
o115 = {};
// 19318
f920654002_425.returns.push(o115);
// 19320
f920654002_429.returns.push(o115);
// undefined
o115 = null;
// 19321
f920654002_2479.returns.push(undefined);
// 19322
f920654002_2474.returns.push(undefined);
// 19325
o113.asynchronous = true;
// undefined
o113 = null;
// 19328
f920654002_2475.returns.push(true);
// 19329
// 19332
o75.clearStatusIndicator = f920654002_2492;
// 19333
o75.getStatusElement = f920654002_2493;
// 19334
o75.statusElement = null;
// 19335
f920654002_2493.returns.push(null);
// 19336
f920654002_2492.returns.push(undefined);
// 19339
f920654002_2481.returns.push(true);
// 19340
f920654002_2559 = function() { return f920654002_2559.returns[f920654002_2559.inst++]; };
f920654002_2559.returns = [];
f920654002_2559.inst = 0;
// 19341
o75.initialHandler = f920654002_2559;
// 19342
f920654002_2559.returns.push(true);
// 19343
o75.timer = null;
// 19344
f920654002_14.returns.push(undefined);
// 19346
o75._shouldSuppressJS = f920654002_2496;
// 19348
f920654002_2555.returns.push(undefined);
// 19349
f920654002_2496.returns.push(false);
// 19350
o75._handleJSResponse = f920654002_2497;
// 19351
o75.getRelativeTo = f920654002_2498;
// 19352
o75.relativeTo = null;
// 19353
f920654002_2498.returns.push(null);
// 19354
o75._handleJSRegisters = f920654002_2499;
// 19355
f920654002_2499.returns.push(undefined);
// 19356
o75.lid = void 0;
// 19358
f920654002_2499.returns.push(undefined);
// 19359
f920654002_2497.returns.push(undefined);
// 19360
f920654002_2560 = function() { return f920654002_2560.returns[f920654002_2560.inst++]; };
f920654002_2560.returns = [];
f920654002_2560.inst = 0;
// 19361
o75.finallyHandler = f920654002_2560;
// 19362
f920654002_2560.returns.push(undefined);
// 19363
f920654002_2482.returns.push(undefined);
// 19364
o113 = {};
// 19367
o113.cancelBubble = false;
// 19370
o113.returnValue = true;
// 19373
o113.srcElement = o16;
// 19375
o113.target = o16;
// 19382
f920654002_458.returns.push(null);
// 19388
f920654002_458.returns.push(null);
// 19393
o113.JSBNG__location = void 0;
// 19394
o113.altKey = false;
// 19395
o113.bubbles = true;
// 19396
o113.cancelable = true;
// 19397
o113.char = void 0;
// 19398
o113.charCode = 0;
// 19399
o113.ctrlKey = false;
// 19400
o113.currentTarget = o0;
// 19401
o113.defaultPrevented = false;
// 19402
o113.detail = 0;
// 19403
o113.eventPhase = 3;
// 19404
o113.isTrusted = void 0;
// 19405
o113.key = void 0;
// 19406
o113.keyCode = 13;
// 19407
o113.locale = void 0;
// 19408
o113.location = void 0;
// 19409
o113.metaKey = false;
// 19410
o113.repeat = void 0;
// 19411
o113.shiftKey = false;
// 19414
o113.timeStamp = 1373491997729;
// 19415
o113.type = "keyup";
// 19416
o113.view = ow920654002;
// 19417
o113.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19436
f920654002_418.returns.push(1373491998047);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19439
f920654002_14.returns.push(undefined);
// 19440
o115 = {};
// 19441
f920654002_0.returns.push(o115);
// undefined
o115 = null;
// 19442
o115 = {};
// 19443
f920654002_0.returns.push(o115);
// undefined
o115 = null;
// 19444
o115 = {};
// 19445
f920654002_0.returns.push(o115);
// undefined
o115 = null;
// 19446
o115 = {};
// 19447
f920654002_57.returns.push(o115);
// 19448
// 19449
// 19450
f920654002_2566 = function() { return f920654002_2566.returns[f920654002_2566.inst++]; };
f920654002_2566.returns = [];
f920654002_2566.inst = 0;
// 19451
o115.JSBNG__onerror = f920654002_2566;
// 19452
f920654002_2566.JSBNG__name = "";
// 19453
f920654002_12.returns.push(1282);
// 19454
// 19455
f920654002_417.returns.push(0.666268880944699);
// 19457
f920654002_418.returns.push(1373491998086);
// 19459
// 19463
f920654002_418.returns.push(1373491998089);
// 19466
f920654002_418.returns.push(1373491998090);
// 19468
f920654002_418.returns.push(1373491998090);
// 19471
f920654002_418.returns.push(1373491998091);
// 19473
f920654002_12.returns.push(1283);
// 19474
o116 = {};
// 19477
o116.cancelBubble = false;
// 19480
o116.returnValue = true;
// 19483
o116.srcElement = o16;
// 19485
o116.target = o16;
// 19492
f920654002_458.returns.push(null);
// 19498
f920654002_458.returns.push(null);
// 19503
o116.JSBNG__location = void 0;
// 19504
o116.altKey = false;
// 19505
o116.bubbles = true;
// 19506
o116.cancelable = true;
// 19507
o116.char = void 0;
// 19508
o116.charCode = 0;
// 19509
o116.ctrlKey = false;
// 19510
o116.currentTarget = o0;
// 19511
o116.defaultPrevented = false;
// 19512
o116.detail = 0;
// 19513
o116.eventPhase = 3;
// 19514
o116.isTrusted = void 0;
// 19515
o116.key = void 0;
// 19516
o116.keyCode = 13;
// 19517
o116.locale = void 0;
// 19518
o116.location = void 0;
// 19519
o116.metaKey = false;
// 19520
o116.repeat = void 0;
// 19521
o116.shiftKey = false;
// 19524
o116.timeStamp = 1373491998651;
// 19525
o116.type = "keyup";
// 19526
o116.view = ow920654002;
// 19527
o116.which = 13;
// 19542
f920654002_12.returns.push(1284);
// 19544
o117 = {};
// undefined
o117 = null;
// 19545
f920654002_417.returns.push(0.4751716216560453);
// 19550
f920654002_418.returns.push(1373491999263);
// 19551
o117 = {};
// 19552
f920654002_56.returns.push(o117);
// 19553
o117.open = f920654002_1466;
// 19554
f920654002_1466.returns.push(undefined);
// 19555
// 19556
// 19557
f920654002_12.returns.push(1285);
// 19559
f920654002_418.returns.push(1373491999682);
// 19560
o117.send = f920654002_1468;
// 19561
f920654002_1468.returns.push(undefined);
// 19562
f920654002_14.returns.push(undefined);
// 19563
// 19564
// 19569
f920654002_418.returns.push(1373491999684);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19572
f920654002_14.returns.push(undefined);
// 19573
// 19574
// undefined
o115 = null;
// 19575
f920654002_417.returns.push(0.20035558613017201);
// 19576
f920654002_12.returns.push(1286);
// 19580
f920654002_418.returns.push(1373492000286);
// 19583
f920654002_418.returns.push(1373492000287);
// 19585
f920654002_418.returns.push(1373492000287);
// 19588
f920654002_418.returns.push(1373492000287);
// 19590
f920654002_14.returns.push(undefined);
// 19591
f920654002_12.returns.push(1287);
// 19592
o115 = {};
// 19595
o115.cancelBubble = false;
// 19598
o115.returnValue = true;
// 19601
o115.srcElement = o16;
// 19603
o115.target = o16;
// 19610
f920654002_458.returns.push(null);
// 19616
f920654002_458.returns.push(null);
// 19621
o115.JSBNG__location = void 0;
// 19622
o115.altKey = false;
// 19623
o115.bubbles = true;
// 19624
o115.cancelable = true;
// 19625
o115.char = void 0;
// 19626
o115.charCode = 0;
// 19627
o115.ctrlKey = false;
// 19628
o115.currentTarget = o0;
// 19629
o115.defaultPrevented = false;
// 19630
o115.detail = 0;
// 19631
o115.eventPhase = 3;
// 19632
o115.isTrusted = void 0;
// 19633
o115.key = void 0;
// 19634
o115.keyCode = 13;
// 19635
o115.locale = void 0;
// 19636
o115.location = void 0;
// 19637
o115.metaKey = false;
// 19638
o115.repeat = void 0;
// 19639
o115.shiftKey = false;
// 19642
o115.timeStamp = 1373492000828;
// 19643
o115.type = "keyup";
// 19644
o115.view = ow920654002;
// 19645
o115.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19661
o118 = {};
// 19662
o119 = {};
// undefined
o119 = null;
// 19663
o118._onReadyState = f920654002_2460;
// 19665
o118.xhr = o117;
// 19667
o117.readyState = 2;
// 19668
o118.JSBNG__status = null;
// 19669
o118._parseStatus = f920654002_2461;
// 19671
o117.JSBNG__status = 404;
// 19672
// 19674
o117.statusText = "Not Found";
// 19684
// 19685
o118.errorText = void 0;
// 19686
// 19687
f920654002_2461.returns.push(undefined);
// 19689
f920654002_418.returns.push(1373492001060);
// 19690
o118._sentAt = 1373491999682;
// 19691
// 19692
f920654002_2573 = function() { return f920654002_2573.returns[f920654002_2573.inst++]; };
f920654002_2573.returns = [];
f920654002_2573.inst = 0;
// 19693
o118._call = f920654002_2573;
// 19694
f920654002_2574 = function() { return f920654002_2574.returns[f920654002_2574.inst++]; };
f920654002_2574.returns = [];
f920654002_2574.inst = 0;
// 19695
o118.onError = f920654002_2574;
// 19697
f920654002_2575 = function() { return f920654002_2575.returns[f920654002_2575.inst++]; };
f920654002_2575.returns = [];
f920654002_2575.inst = 0;
// 19698
o118.toJSON = f920654002_2575;
// 19700
o118.json = void 0;
// 19702
o119 = {};
// 19703
o118.uri = o119;
// undefined
o119 = null;
// 19704
f920654002_2575.returns.push({__JSBNG_unknown_object:true});
// 19707
f920654002_418.returns.push(1373492001064);
// 19708
f920654002_2574.returns.push(undefined);
// 19709
f920654002_2573.returns.push(undefined);
// 19710
// 19711
// 19712
// 19713
o118._timer = 1285;
// 19714
f920654002_14.returns.push(undefined);
// 19719
f920654002_2577 = function() { return f920654002_2577.returns[f920654002_2577.inst++]; };
f920654002_2577.returns = [];
f920654002_2577.inst = 0;
// 19720
o117.abort = f920654002_2577;
// undefined
o117 = null;
// 19721
f920654002_2577.returns.push(undefined);
// 19722
// 19723
f920654002_2460.returns.push(undefined);
// 19724
o117 = {};
// undefined
o117 = null;
// 19729
f920654002_418.returns.push(1373492001071);
// 19731
// 19733
f920654002_2573.returns.push(undefined);
// 19734
// 19735
// 19736
// 19738
f920654002_14.returns.push(undefined);
// 19739
f920654002_2460.returns.push(undefined);
// 19743
f920654002_418.returns.push(1373492001272);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19749
f920654002_418.returns.push(1373492001457);
// 19751
f920654002_12.returns.push(1288);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19754
o117 = {};
// 19757
o117.cancelBubble = false;
// 19760
o117.returnValue = true;
// 19763
o117.srcElement = o16;
// 19765
o117.target = o16;
// 19772
f920654002_458.returns.push(null);
// 19778
f920654002_458.returns.push(null);
// 19783
o117.JSBNG__location = void 0;
// 19784
o117.altKey = false;
// 19785
o117.bubbles = true;
// 19786
o117.cancelable = true;
// 19787
o117.char = void 0;
// 19788
o117.charCode = 0;
// 19789
o117.ctrlKey = false;
// 19790
o117.currentTarget = o0;
// 19791
o117.defaultPrevented = false;
// 19792
o117.detail = 0;
// 19793
o117.eventPhase = 3;
// 19794
o117.isTrusted = void 0;
// 19795
o117.key = void 0;
// 19796
o117.keyCode = 13;
// 19797
o117.locale = void 0;
// 19798
o117.location = void 0;
// 19799
o117.metaKey = false;
// 19800
o117.repeat = void 0;
// 19801
o117.shiftKey = false;
// 19804
o117.timeStamp = 1373492002705;
// 19805
o117.type = "keyup";
// 19806
o117.view = ow920654002;
// 19807
o117.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19828
f920654002_418.returns.push(1373492003391);
// 19830
f920654002_12.returns.push(1289);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 19833
o119 = {};
// 19836
o119.srcElement = o38;
// 19838
o119.target = o38;
// 19845
f920654002_458.returns.push(null);
// 19851
f920654002_458.returns.push(null);
// 19857
f920654002_458.returns.push(null);
// 19863
f920654002_458.returns.push(null);
// 19869
f920654002_458.returns.push(null);
// 19875
f920654002_458.returns.push(null);
// 19881
f920654002_458.returns.push(null);
// 19887
f920654002_458.returns.push(null);
// 19893
f920654002_458.returns.push(null);
// 19899
f920654002_458.returns.push(null);
// 19905
f920654002_458.returns.push(null);
// 19911
f920654002_458.returns.push(null);
// 19917
f920654002_458.returns.push(null);
// 19923
f920654002_458.returns.push(null);
// 19929
f920654002_458.returns.push(null);
// 19935
f920654002_458.returns.push(null);
// 19940
o120 = {};
// 19941
o119.relatedTarget = o120;
// 19942
o121 = {};
// 19943
o120.parentNode = o121;
// 19944
o120.nodeType = 1;
// 19945
o120.getAttributeNode = f920654002_458;
// 19947
f920654002_458.returns.push(null);
// 19949
o122 = {};
// 19950
o121.parentNode = o122;
// 19951
o121.nodeType = 1;
// 19952
o121.getAttributeNode = f920654002_458;
// 19954
f920654002_458.returns.push(null);
// 19956
o123 = {};
// 19957
o122.parentNode = o123;
// 19958
o122.nodeType = 1;
// 19959
o122.getAttributeNode = f920654002_458;
// undefined
o122 = null;
// 19961
f920654002_458.returns.push(null);
// 19963
o122 = {};
// 19964
o123.parentNode = o122;
// 19965
o123.nodeType = 1;
// 19966
o123.getAttributeNode = f920654002_458;
// undefined
o123 = null;
// 19968
f920654002_458.returns.push(null);
// 19970
o123 = {};
// 19971
o122.parentNode = o123;
// 19972
o122.nodeType = 1;
// 19973
o122.getAttributeNode = f920654002_458;
// undefined
o122 = null;
// 19975
f920654002_458.returns.push(null);
// 19977
o122 = {};
// 19978
o123.parentNode = o122;
// 19979
o123.nodeType = 1;
// 19980
o123.getAttributeNode = f920654002_458;
// undefined
o123 = null;
// 19982
f920654002_458.returns.push(null);
// 19984
o122.parentNode = o31;
// 19985
o122.nodeType = 1;
// 19986
o122.getAttributeNode = f920654002_458;
// undefined
o122 = null;
// 19988
f920654002_458.returns.push(null);
// 19990
o31.parentNode = o28;
// 19991
o31.nodeType = 1;
// 19992
o31.getAttributeNode = f920654002_458;
// undefined
o31 = null;
// 19994
f920654002_458.returns.push(null);
// 19996
o28.parentNode = o30;
// 19997
o28.nodeType = 1;
// 19998
o28.getAttributeNode = f920654002_458;
// 20000
f920654002_458.returns.push(null);
// 20003
o30.nodeType = 1;
// 20004
o30.getAttributeNode = f920654002_458;
// undefined
o30 = null;
// 20006
f920654002_458.returns.push(null);
// 20009
o23.nodeType = 1;
// 20010
o23.getAttributeNode = f920654002_458;
// undefined
o23 = null;
// 20012
f920654002_458.returns.push(null);
// 20015
o8.nodeType = 1;
// 20016
o8.getAttributeNode = f920654002_458;
// undefined
o8 = null;
// 20018
f920654002_458.returns.push(null);
// 20021
o27.nodeType = 1;
// 20022
o27.getAttributeNode = f920654002_458;
// undefined
o27 = null;
// 20024
f920654002_458.returns.push(null);
// 20027
o53.nodeType = 1;
// 20028
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 20030
f920654002_458.returns.push(null);
// 20036
f920654002_458.returns.push(null);
// 20042
f920654002_458.returns.push(null);
// 20048
f920654002_458.returns.push(null);
// 20054
f920654002_458.returns.push(null);
// 20060
f920654002_458.returns.push(null);
// 20066
f920654002_458.returns.push(null);
// 20072
f920654002_458.returns.push(null);
// 20078
f920654002_458.returns.push(null);
// 20084
f920654002_458.returns.push(null);
// 20090
f920654002_458.returns.push(null);
// 20096
f920654002_458.returns.push(null);
// 20101
o119.cancelBubble = false;
// 20102
o119.returnValue = true;
// undefined
o119 = null;
// 20103
o8 = {};
// 20106
o8.cancelBubble = false;
// 20109
f920654002_418.returns.push(1373492005295);
// 20114
f920654002_418.returns.push(1373492005301);
// 20118
f920654002_418.returns.push(1373492005302);
// 20122
f920654002_1117.returns.push(undefined);
// 20124
o8.returnValue = true;
// 20127
o8.srcElement = o120;
// 20129
o8.target = o120;
// 20136
f920654002_458.returns.push(null);
// 20142
f920654002_458.returns.push(null);
// 20148
f920654002_458.returns.push(null);
// 20154
f920654002_458.returns.push(null);
// 20160
f920654002_458.returns.push(null);
// 20166
f920654002_458.returns.push(null);
// 20172
f920654002_458.returns.push(null);
// 20178
f920654002_458.returns.push(null);
// 20184
f920654002_458.returns.push(null);
// 20190
f920654002_458.returns.push(null);
// 20196
f920654002_458.returns.push(null);
// 20202
f920654002_458.returns.push(null);
// 20208
f920654002_458.returns.push(null);
// 20214
f920654002_458.returns.push(null);
// 20220
f920654002_458.returns.push(null);
// 20226
f920654002_458.returns.push(null);
// 20232
f920654002_458.returns.push(null);
// 20238
f920654002_458.returns.push(null);
// 20244
f920654002_458.returns.push(null);
// 20250
f920654002_458.returns.push(null);
// 20256
f920654002_458.returns.push(null);
// 20262
f920654002_458.returns.push(null);
// 20268
f920654002_458.returns.push(null);
// 20274
f920654002_458.returns.push(null);
// 20280
f920654002_458.returns.push(null);
// 20285
o8.relatedTarget = o38;
// undefined
o8 = null;
// undefined
o38 = null;
// 20288
o8 = {};
// 20292
f920654002_418.returns.push(1373492005318);
// 20293
o8.cancelBubble = false;
// 20294
o8.returnValue = true;
// 20297
o8.srcElement = o120;
// 20299
o8.target = o120;
// 20306
f920654002_458.returns.push(null);
// 20312
f920654002_458.returns.push(null);
// 20318
f920654002_458.returns.push(null);
// 20324
f920654002_458.returns.push(null);
// 20330
f920654002_458.returns.push(null);
// 20336
f920654002_458.returns.push(null);
// 20342
f920654002_458.returns.push(null);
// 20348
f920654002_458.returns.push(null);
// 20354
f920654002_458.returns.push(null);
// 20360
f920654002_458.returns.push(null);
// 20366
f920654002_458.returns.push(null);
// 20372
f920654002_458.returns.push(null);
// 20378
f920654002_458.returns.push(null);
// 20384
f920654002_458.returns.push(null);
// 20390
f920654002_458.returns.push(null);
// 20396
f920654002_458.returns.push(null);
// 20402
f920654002_458.returns.push(null);
// 20408
f920654002_458.returns.push(null);
// 20414
f920654002_458.returns.push(null);
// 20420
f920654002_458.returns.push(null);
// 20426
f920654002_458.returns.push(null);
// 20432
f920654002_458.returns.push(null);
// 20438
f920654002_458.returns.push(null);
// 20444
f920654002_458.returns.push(null);
// 20450
f920654002_458.returns.push(null);
// 20455
o8.JSBNG__screenX = 609;
// 20456
o8.JSBNG__screenY = 538;
// 20457
o8.altKey = false;
// 20458
o8.bubbles = true;
// 20459
o8.button = 0;
// 20460
o8.buttons = void 0;
// 20461
o8.cancelable = false;
// 20462
o8.clientX = 530;
// 20463
o8.clientY = 444;
// 20464
o8.ctrlKey = false;
// 20465
o8.currentTarget = o0;
// 20466
o8.defaultPrevented = false;
// 20467
o8.detail = 0;
// 20468
o8.eventPhase = 3;
// 20469
o8.isTrusted = void 0;
// 20470
o8.metaKey = false;
// 20471
o8.pageX = 530;
// 20472
o8.pageY = 603;
// 20473
o8.relatedTarget = null;
// 20474
o8.fromElement = null;
// 20477
o8.shiftKey = false;
// 20480
o8.timeStamp = 1373492005318;
// 20481
o8.type = "mousemove";
// 20482
o8.view = ow920654002;
// undefined
o8 = null;
// 20491
f920654002_1639.returns.push(undefined);
// 20494
f920654002_14.returns.push(undefined);
// 20495
f920654002_12.returns.push(1290);
// 20498
o8 = {};
// 20501
o8.cancelBubble = false;
// 20504
o8.returnValue = true;
// 20507
o8.srcElement = o16;
// 20509
o8.target = o16;
// 20516
f920654002_458.returns.push(null);
// 20522
f920654002_458.returns.push(null);
// 20527
o8.JSBNG__location = void 0;
// 20528
o8.altKey = false;
// 20529
o8.bubbles = true;
// 20530
o8.cancelable = true;
// 20531
o8.char = void 0;
// 20532
o8.charCode = 0;
// 20533
o8.ctrlKey = false;
// 20534
o8.currentTarget = o0;
// 20535
o8.defaultPrevented = false;
// 20536
o8.detail = 0;
// 20537
o8.eventPhase = 3;
// 20538
o8.isTrusted = void 0;
// 20539
o8.key = void 0;
// 20540
o8.keyCode = 13;
// 20541
o8.locale = void 0;
// 20542
o8.location = void 0;
// 20543
o8.metaKey = false;
// 20544
o8.repeat = void 0;
// 20545
o8.shiftKey = false;
// 20548
o8.timeStamp = 1373492006020;
// 20549
o8.type = "keyup";
// 20550
o8.view = ow920654002;
// 20551
o8.which = 13;
// 20565
o23 = {};
// 20568
o23.srcElement = o120;
// 20570
o23.target = o120;
// 20577
f920654002_458.returns.push(null);
// 20583
f920654002_458.returns.push(null);
// 20589
f920654002_458.returns.push(null);
// 20595
f920654002_458.returns.push(null);
// 20601
f920654002_458.returns.push(null);
// 20607
f920654002_458.returns.push(null);
// 20613
f920654002_458.returns.push(null);
// 20619
f920654002_458.returns.push(null);
// 20625
f920654002_458.returns.push(null);
// 20631
f920654002_458.returns.push(null);
// 20637
f920654002_458.returns.push(null);
// 20643
f920654002_458.returns.push(null);
// 20649
f920654002_458.returns.push(null);
// 20655
f920654002_458.returns.push(null);
// 20661
f920654002_458.returns.push(null);
// 20667
f920654002_458.returns.push(null);
// 20673
f920654002_458.returns.push(null);
// 20679
f920654002_458.returns.push(null);
// 20685
f920654002_458.returns.push(null);
// 20691
f920654002_458.returns.push(null);
// 20697
f920654002_458.returns.push(null);
// 20703
f920654002_458.returns.push(null);
// 20709
f920654002_458.returns.push(null);
// 20715
f920654002_458.returns.push(null);
// 20721
f920654002_458.returns.push(null);
// 20726
o23.relatedTarget = o121;
// 20731
f920654002_458.returns.push(null);
// 20737
f920654002_458.returns.push(null);
// 20743
f920654002_458.returns.push(null);
// 20749
f920654002_458.returns.push(null);
// 20755
f920654002_458.returns.push(null);
// 20761
f920654002_458.returns.push(null);
// 20767
f920654002_458.returns.push(null);
// 20773
f920654002_458.returns.push(null);
// 20779
f920654002_458.returns.push(null);
// 20785
f920654002_458.returns.push(null);
// 20791
f920654002_458.returns.push(null);
// 20797
f920654002_458.returns.push(null);
// 20803
f920654002_458.returns.push(null);
// 20809
f920654002_458.returns.push(null);
// 20815
f920654002_458.returns.push(null);
// 20821
f920654002_458.returns.push(null);
// 20827
f920654002_458.returns.push(null);
// 20833
f920654002_458.returns.push(null);
// 20839
f920654002_458.returns.push(null);
// 20845
f920654002_458.returns.push(null);
// 20851
f920654002_458.returns.push(null);
// 20857
f920654002_458.returns.push(null);
// 20863
f920654002_458.returns.push(null);
// 20869
f920654002_458.returns.push(null);
// 20874
o23.cancelBubble = false;
// 20875
o23.returnValue = true;
// undefined
o23 = null;
// 20876
o23 = {};
// 20879
o23.cancelBubble = false;
// 20882
f920654002_418.returns.push(1373492006063);
// 20887
f920654002_418.returns.push(1373492006065);
// 20891
f920654002_418.returns.push(1373492006065);
// 20895
f920654002_1117.returns.push(undefined);
// 20897
o23.returnValue = true;
// 20900
o23.srcElement = o121;
// 20902
o23.target = o121;
// 20909
f920654002_458.returns.push(null);
// 20915
f920654002_458.returns.push(null);
// 20921
f920654002_458.returns.push(null);
// 20927
f920654002_458.returns.push(null);
// 20933
f920654002_458.returns.push(null);
// 20939
f920654002_458.returns.push(null);
// 20945
f920654002_458.returns.push(null);
// 20951
f920654002_458.returns.push(null);
// 20957
f920654002_458.returns.push(null);
// 20963
f920654002_458.returns.push(null);
// 20969
f920654002_458.returns.push(null);
// 20975
f920654002_458.returns.push(null);
// 20981
f920654002_458.returns.push(null);
// 20987
f920654002_458.returns.push(null);
// 20993
f920654002_458.returns.push(null);
// 20999
f920654002_458.returns.push(null);
// 21005
f920654002_458.returns.push(null);
// 21011
f920654002_458.returns.push(null);
// 21017
f920654002_458.returns.push(null);
// 21023
f920654002_458.returns.push(null);
// 21029
f920654002_458.returns.push(null);
// 21035
f920654002_458.returns.push(null);
// 21041
f920654002_458.returns.push(null);
// 21047
f920654002_458.returns.push(null);
// 21052
o23.relatedTarget = o120;
// undefined
o23 = null;
// undefined
o120 = null;
// 21055
o23 = {};
// 21059
f920654002_418.returns.push(1373492006081);
// 21060
o23.cancelBubble = false;
// 21061
o23.returnValue = true;
// 21064
o23.srcElement = o121;
// 21066
o23.target = o121;
// 21073
f920654002_458.returns.push(null);
// 21079
f920654002_458.returns.push(null);
// 21085
f920654002_458.returns.push(null);
// 21091
f920654002_458.returns.push(null);
// 21097
f920654002_458.returns.push(null);
// 21103
f920654002_458.returns.push(null);
// 21109
f920654002_458.returns.push(null);
// 21115
f920654002_458.returns.push(null);
// 21121
f920654002_458.returns.push(null);
// 21127
f920654002_458.returns.push(null);
// 21133
f920654002_458.returns.push(null);
// 21139
f920654002_458.returns.push(null);
// 21145
f920654002_458.returns.push(null);
// 21151
f920654002_458.returns.push(null);
// 21157
f920654002_458.returns.push(null);
// 21163
f920654002_458.returns.push(null);
// 21169
f920654002_458.returns.push(null);
// 21175
f920654002_458.returns.push(null);
// 21181
f920654002_458.returns.push(null);
// 21187
f920654002_458.returns.push(null);
// 21193
f920654002_458.returns.push(null);
// 21199
f920654002_458.returns.push(null);
// 21205
f920654002_458.returns.push(null);
// 21211
f920654002_458.returns.push(null);
// 21216
o23.JSBNG__screenX = 691;
// 21217
o23.JSBNG__screenY = 528;
// 21218
o23.altKey = false;
// 21219
o23.bubbles = true;
// 21220
o23.button = 0;
// 21221
o23.buttons = void 0;
// 21222
o23.cancelable = false;
// 21223
o23.clientX = 612;
// 21224
o23.clientY = 434;
// 21225
o23.ctrlKey = false;
// 21226
o23.currentTarget = o0;
// 21227
o23.defaultPrevented = false;
// 21228
o23.detail = 0;
// 21229
o23.eventPhase = 3;
// 21230
o23.isTrusted = void 0;
// 21231
o23.metaKey = false;
// 21232
o23.pageX = 612;
// 21233
o23.pageY = 593;
// 21234
o23.relatedTarget = null;
// 21235
o23.fromElement = null;
// 21238
o23.shiftKey = false;
// 21241
o23.timeStamp = 1373492006081;
// 21242
o23.type = "mousemove";
// 21243
o23.view = ow920654002;
// undefined
o23 = null;
// 21252
f920654002_1639.returns.push(undefined);
// 21255
f920654002_14.returns.push(undefined);
// 21256
f920654002_12.returns.push(1291);
// 21261
f920654002_418.returns.push(1373492006857);
// 21262
o23 = {};
// 21265
o23.cancelBubble = false;
// 21268
o23.returnValue = true;
// 21271
o23.srcElement = o16;
// 21273
o23.target = o16;
// 21280
f920654002_458.returns.push(null);
// 21286
f920654002_458.returns.push(null);
// 21291
o23.JSBNG__location = void 0;
// 21292
o23.altKey = false;
// 21293
o23.bubbles = true;
// 21294
o23.cancelable = true;
// 21295
o23.char = void 0;
// 21296
o23.charCode = 0;
// 21297
o23.ctrlKey = false;
// 21298
o23.currentTarget = o0;
// 21299
o23.defaultPrevented = false;
// 21300
o23.detail = 0;
// 21301
o23.eventPhase = 3;
// 21302
o23.isTrusted = void 0;
// 21303
o23.key = void 0;
// 21304
o23.keyCode = 13;
// 21305
o23.locale = void 0;
// 21306
o23.location = void 0;
// 21307
o23.metaKey = false;
// 21308
o23.repeat = void 0;
// 21309
o23.shiftKey = false;
// 21312
o23.timeStamp = 1373492006859;
// 21313
o23.type = "keyup";
// 21314
o23.view = ow920654002;
// 21315
o23.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 21331
o27 = {};
// 21334
o27.cancelBubble = false;
// 21337
f920654002_418.returns.push(1373492007195);
// 21342
f920654002_418.returns.push(1373492007196);
// 21346
f920654002_418.returns.push(1373492007197);
// 21349
o27.returnValue = true;
// undefined
o27 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 21353
f920654002_418.returns.push(1373492007197);
// 21354
o27 = {};
// 21357
o27.cancelBubble = false;
// 21360
f920654002_418.returns.push(1373492007213);
// 21362
o27.returnValue = true;
// undefined
o27 = null;
// 21363
o27 = {};
// 21366
o27.cancelBubble = false;
// 21369
f920654002_418.returns.push(1373492007228);
// 21371
o27.returnValue = true;
// undefined
o27 = null;
// 21372
o27 = {};
// 21375
o27.cancelBubble = false;
// 21378
f920654002_418.returns.push(1373492007240);
// 21380
o27.returnValue = true;
// undefined
o27 = null;
// 21381
o27 = {};
// 21384
o27.cancelBubble = false;
// 21387
f920654002_418.returns.push(1373492007249);
// 21389
o27.returnValue = true;
// undefined
o27 = null;
// 21390
o27 = {};
// 21393
o27.cancelBubble = false;
// 21396
f920654002_418.returns.push(1373492007265);
// 21398
o27.returnValue = true;
// undefined
o27 = null;
// 21399
o27 = {};
// 21402
o27.cancelBubble = false;
// 21405
f920654002_418.returns.push(1373492007319);
// 21407
o27.returnValue = true;
// undefined
o27 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 21411
f920654002_12.returns.push(1292);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 21414
o27 = {};
// 21417
o27.srcElement = o121;
// 21419
o27.target = o121;
// 21426
f920654002_458.returns.push(null);
// 21432
f920654002_458.returns.push(null);
// 21438
f920654002_458.returns.push(null);
// 21444
f920654002_458.returns.push(null);
// 21450
f920654002_458.returns.push(null);
// 21456
f920654002_458.returns.push(null);
// 21462
f920654002_458.returns.push(null);
// 21468
f920654002_458.returns.push(null);
// 21474
f920654002_458.returns.push(null);
// 21480
f920654002_458.returns.push(null);
// 21486
f920654002_458.returns.push(null);
// 21492
f920654002_458.returns.push(null);
// 21498
f920654002_458.returns.push(null);
// 21504
f920654002_458.returns.push(null);
// 21510
f920654002_458.returns.push(null);
// 21516
f920654002_458.returns.push(null);
// 21522
f920654002_458.returns.push(null);
// 21528
f920654002_458.returns.push(null);
// 21534
f920654002_458.returns.push(null);
// 21540
f920654002_458.returns.push(null);
// 21546
f920654002_458.returns.push(null);
// 21552
f920654002_458.returns.push(null);
// 21558
f920654002_458.returns.push(null);
// 21564
f920654002_458.returns.push(null);
// 21569
o27.relatedTarget = o48;
// 21570
o48.parentNode = o47;
// undefined
o47 = null;
// 21571
o48.nodeType = 1;
// 21574
o30 = {};
// 21575
f920654002_458.returns.push(o30);
// 21576
o30.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0]";
// 21579
f920654002_458.returns.push(o30);
// 21581
o27.JSBNG__screenX = 691;
// 21582
o27.JSBNG__screenY = 272;
// 21583
o27.altKey = false;
// 21584
o27.bubbles = true;
// 21585
o27.button = 0;
// 21586
o27.buttons = void 0;
// 21587
o27.cancelable = true;
// 21588
o27.clientX = 612;
// 21589
o27.clientY = 434;
// 21590
o27.ctrlKey = false;
// 21591
o27.currentTarget = o0;
// 21592
o27.defaultPrevented = false;
// 21593
o27.detail = 0;
// 21594
o27.eventPhase = 3;
// 21595
o27.isTrusted = void 0;
// 21596
o27.metaKey = false;
// 21597
o27.pageX = 612;
// 21598
o27.pageY = 873;
// 21600
o27.shiftKey = false;
// 21603
o27.timeStamp = 1373492008239;
// 21604
o27.type = "mouseout";
// 21605
o27.view = ow920654002;
// 21607
o27.returnValue = true;
// 21639
o27.cancelBubble = false;
// undefined
o27 = null;
// 21641
o27 = {};
// 21644
o27.cancelBubble = false;
// 21647
f920654002_418.returns.push(1373492008301);
// 21652
f920654002_418.returns.push(1373492008303);
// 21656
f920654002_418.returns.push(1373492008303);
// 21660
f920654002_1117.returns.push(undefined);
// 21662
o27.returnValue = true;
// 21665
o27.srcElement = o48;
// 21667
o27.target = o48;
// 21674
f920654002_458.returns.push(o30);
// 21678
f920654002_458.returns.push(o30);
// 21680
o27.relatedTarget = o121;
// undefined
o27 = null;
// undefined
o121 = null;
// 21681
o48.nodeName = "DIV";
// 21688
o27 = {};
// 21692
f920654002_418.returns.push(1373492008305);
// 21693
o27.cancelBubble = false;
// 21694
o27.returnValue = true;
// 21697
o27.srcElement = o48;
// 21699
o27.target = o48;
// 21706
f920654002_458.returns.push(o30);
// 21710
f920654002_458.returns.push(o30);
// undefined
o30 = null;
// 21712
o27.JSBNG__screenX = 691;
// 21713
o27.JSBNG__screenY = 272;
// 21714
o27.altKey = false;
// 21715
o27.bubbles = true;
// 21716
o27.button = 0;
// 21717
o27.buttons = void 0;
// 21718
o27.cancelable = false;
// 21719
o27.clientX = 612;
// 21720
o27.clientY = 434;
// 21721
o27.ctrlKey = false;
// 21722
o27.currentTarget = o0;
// 21723
o27.defaultPrevented = false;
// 21724
o27.detail = 0;
// 21725
o27.eventPhase = 3;
// 21726
o27.isTrusted = void 0;
// 21727
o27.metaKey = false;
// 21728
o27.pageX = 612;
// 21729
o27.pageY = 873;
// 21730
o27.relatedTarget = null;
// 21731
o27.fromElement = null;
// 21734
o27.shiftKey = false;
// 21737
o27.timeStamp = 1373492008304;
// 21738
o27.type = "mousemove";
// 21739
o27.view = ow920654002;
// undefined
o27 = null;
// 21753
f920654002_1639.returns.push(undefined);
// 21756
f920654002_14.returns.push(undefined);
// 21757
f920654002_12.returns.push(1293);
// 21760
o27 = {};
// 21763
o27.cancelBubble = false;
// 21766
o27.returnValue = true;
// 21769
o27.srcElement = o16;
// 21771
o27.target = o16;
// 21778
f920654002_458.returns.push(null);
// 21784
f920654002_458.returns.push(null);
// 21789
o27.JSBNG__location = void 0;
// 21790
o27.altKey = false;
// 21791
o27.bubbles = true;
// 21792
o27.cancelable = true;
// 21793
o27.char = void 0;
// 21794
o27.charCode = 0;
// 21795
o27.ctrlKey = false;
// 21796
o27.currentTarget = o0;
// 21797
o27.defaultPrevented = false;
// 21798
o27.detail = 0;
// 21799
o27.eventPhase = 3;
// 21800
o27.isTrusted = void 0;
// 21801
o27.key = void 0;
// 21802
o27.keyCode = 13;
// 21803
o27.locale = void 0;
// 21804
o27.location = void 0;
// 21805
o27.metaKey = false;
// 21806
o27.repeat = void 0;
// 21807
o27.shiftKey = false;
// 21810
o27.timeStamp = 1373492008856;
// 21811
o27.type = "keyup";
// 21812
o27.view = ow920654002;
// 21813
o27.which = 13;
// 21827
o30 = {};
// 21830
o30.cancelBubble = false;
// 21833
o30.returnValue = true;
// 21836
o30.srcElement = o16;
// 21838
o30.target = o16;
// 21845
f920654002_458.returns.push(null);
// 21851
f920654002_458.returns.push(null);
// 21856
o30.JSBNG__location = void 0;
// 21857
o30.altKey = false;
// 21858
o30.bubbles = true;
// 21859
o30.cancelable = true;
// 21860
o30.char = void 0;
// 21861
o30.charCode = 0;
// 21862
o30.ctrlKey = false;
// 21863
o30.currentTarget = o0;
// 21864
o30.defaultPrevented = false;
// 21865
o30.detail = 0;
// 21866
o30.eventPhase = 3;
// 21867
o30.isTrusted = void 0;
// 21868
o30.key = void 0;
// 21869
o30.keyCode = 13;
// 21870
o30.locale = void 0;
// 21871
o30.location = void 0;
// 21872
o30.metaKey = false;
// 21873
o30.repeat = void 0;
// 21874
o30.shiftKey = false;
// 21877
o30.timeStamp = 1373492008969;
// 21878
o30.type = "keyup";
// 21879
o30.view = ow920654002;
// 21880
o30.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 21899
f920654002_418.returns.push(1373492009461);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 21903
f920654002_12.returns.push(1294);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 21906
o31 = {};
// 21909
o31.cancelBubble = false;
// 21912
o31.returnValue = true;
// 21915
o31.srcElement = o16;
// 21917
o31.target = o16;
// 21924
f920654002_458.returns.push(null);
// 21930
f920654002_458.returns.push(null);
// 21935
o31.JSBNG__location = void 0;
// 21936
o31.altKey = false;
// 21937
o31.bubbles = true;
// 21938
o31.cancelable = true;
// 21939
o31.char = void 0;
// 21940
o31.charCode = 0;
// 21941
o31.ctrlKey = false;
// 21942
o31.currentTarget = o0;
// 21943
o31.defaultPrevented = false;
// 21944
o31.detail = 0;
// 21945
o31.eventPhase = 3;
// 21946
o31.isTrusted = void 0;
// 21947
o31.key = void 0;
// 21948
o31.keyCode = 13;
// 21949
o31.locale = void 0;
// 21950
o31.location = void 0;
// 21951
o31.metaKey = false;
// 21952
o31.repeat = void 0;
// 21953
o31.shiftKey = false;
// 21956
o31.timeStamp = 1373492010322;
// 21957
o31.type = "keyup";
// 21958
o31.view = ow920654002;
// 21959
o31.which = 13;
// 21975
f920654002_418.returns.push(1373492010594);
// 21977
f920654002_418.returns.push(1373492010595);
// 21979
f920654002_418.returns.push(1373492010595);
// 21980
f920654002_14.returns.push(undefined);
// 21981
o38 = {};
// 21984
o38.cancelBubble = false;
// 21987
f920654002_418.returns.push(1373492010604);
// 21989
f920654002_12.returns.push(1295);
// 21993
f920654002_418.returns.push(1373492011056);
// 21997
f920654002_418.returns.push(1373492011057);
// 22000
o38.returnValue = true;
// undefined
o38 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 22003
o38 = {};
// 22006
o38.cancelBubble = false;
// 22009
o38.returnValue = true;
// 22012
o38.srcElement = o16;
// 22014
o38.target = o16;
// 22021
f920654002_458.returns.push(null);
// 22027
f920654002_458.returns.push(null);
// 22032
o38.JSBNG__location = void 0;
// 22033
o38.altKey = false;
// 22034
o38.bubbles = true;
// 22035
o38.cancelable = true;
// 22036
o38.char = void 0;
// 22037
o38.charCode = 0;
// 22038
o38.ctrlKey = false;
// 22039
o38.currentTarget = o0;
// 22040
o38.defaultPrevented = false;
// 22041
o38.detail = 0;
// 22042
o38.eventPhase = 3;
// 22043
o38.isTrusted = void 0;
// 22044
o38.key = void 0;
// 22045
o38.keyCode = 13;
// 22046
o38.locale = void 0;
// 22047
o38.location = void 0;
// 22048
o38.metaKey = false;
// 22049
o38.repeat = void 0;
// 22050
o38.shiftKey = false;
// 22053
o38.timeStamp = 1373492011153;
// 22054
o38.type = "keyup";
// 22055
o38.view = ow920654002;
// 22056
o38.which = 13;
// 22070
o47 = {};
// 22073
o47.srcElement = o48;
// 22075
o47.target = o48;
// 22082
o53 = {};
// 22083
f920654002_458.returns.push(o53);
// 22084
o53.value = ".r[g4x].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0]";
// 22087
f920654002_458.returns.push(o53);
// 22089
o47.relatedTarget = o50;
// 22090
o50.parentNode = o51;
// undefined
o51 = null;
// 22091
o50.nodeType = 1;
// 22094
o51 = {};
// 22095
f920654002_458.returns.push(o51);
// 22096
o51.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0]";
// 22099
f920654002_458.returns.push(o53);
// undefined
o53 = null;
// 22103
f920654002_458.returns.push(o51);
// 22105
o47.JSBNG__screenX = 692;
// 22106
o47.JSBNG__screenY = 530;
// 22107
o47.altKey = false;
// 22108
o47.bubbles = true;
// 22109
o47.button = 0;
// 22110
o47.buttons = void 0;
// 22111
o47.cancelable = true;
// 22112
o47.clientX = 613;
// 22113
o47.clientY = 436;
// 22114
o47.ctrlKey = false;
// 22115
o47.currentTarget = o0;
// 22116
o47.defaultPrevented = false;
// 22117
o47.detail = 0;
// 22118
o47.eventPhase = 3;
// 22119
o47.isTrusted = void 0;
// 22120
o47.metaKey = false;
// 22121
o47.pageX = 613;
// 22122
o47.pageY = 915;
// 22124
o47.shiftKey = false;
// 22127
o47.timeStamp = 1373492011243;
// 22128
o47.type = "mouseout";
// 22129
o47.view = ow920654002;
// 22131
o47.returnValue = true;
// 22168
o47.cancelBubble = false;
// undefined
o47 = null;
// 22170
o47 = {};
// 22173
o47.cancelBubble = false;
// 22176
f920654002_418.returns.push(1373492011251);
// 22181
f920654002_418.returns.push(1373492011252);
// 22185
f920654002_418.returns.push(1373492011253);
// 22189
f920654002_1117.returns.push(undefined);
// 22191
o47.returnValue = true;
// 22194
o47.srcElement = o50;
// 22196
o47.target = o50;
// 22203
f920654002_458.returns.push(o51);
// 22207
f920654002_458.returns.push(o51);
// 22209
o47.relatedTarget = o48;
// undefined
o47 = null;
// undefined
o48 = null;
// 22210
o50.nodeName = "DIV";
// 22217
o47 = {};
// 22221
f920654002_418.returns.push(1373492011254);
// 22222
o47.cancelBubble = false;
// 22223
o47.returnValue = true;
// 22226
o47.srcElement = o50;
// 22228
o47.target = o50;
// 22235
f920654002_458.returns.push(o51);
// 22239
f920654002_458.returns.push(o51);
// 22241
o47.JSBNG__screenX = 692;
// 22242
o47.JSBNG__screenY = 530;
// 22243
o47.altKey = false;
// 22244
o47.bubbles = true;
// 22245
o47.button = 0;
// 22246
o47.buttons = void 0;
// 22247
o47.cancelable = false;
// 22248
o47.clientX = 613;
// 22249
o47.clientY = 436;
// 22250
o47.ctrlKey = false;
// 22251
o47.currentTarget = o0;
// 22252
o47.defaultPrevented = false;
// 22253
o47.detail = 0;
// 22254
o47.eventPhase = 3;
// 22255
o47.isTrusted = void 0;
// 22256
o47.metaKey = false;
// 22257
o47.pageX = 613;
// 22258
o47.pageY = 915;
// 22259
o47.relatedTarget = null;
// 22260
o47.fromElement = null;
// 22263
o47.shiftKey = false;
// 22266
o47.timeStamp = 1373492011254;
// 22267
o47.type = "mousemove";
// 22268
o47.view = ow920654002;
// undefined
o47 = null;
// 22282
f920654002_1639.returns.push(undefined);
// 22285
f920654002_14.returns.push(undefined);
// 22286
f920654002_12.returns.push(1296);
// 22289
o47 = {};
// 22293
f920654002_418.returns.push(1373492011992);
// 22298
f920654002_418.returns.push(1373492011994);
// 22302
f920654002_418.returns.push(1373492011994);
// 22304
o47.cancelBubble = false;
// 22305
o47.returnValue = true;
// 22308
o47.srcElement = o50;
// 22310
o47.target = o50;
// 22317
f920654002_458.returns.push(o51);
// 22321
f920654002_458.returns.push(o51);
// undefined
o51 = null;
// 22323
o47.JSBNG__screenX = 701;
// 22324
o47.JSBNG__screenY = 530;
// 22325
o47.altKey = false;
// 22326
o47.bubbles = true;
// 22327
o47.button = 0;
// 22328
o47.buttons = void 0;
// 22329
o47.cancelable = false;
// 22330
o47.clientX = 622;
// 22331
o47.clientY = 436;
// 22332
o47.ctrlKey = false;
// 22333
o47.currentTarget = o0;
// 22334
o47.defaultPrevented = false;
// 22335
o47.detail = 0;
// 22336
o47.eventPhase = 3;
// 22337
o47.isTrusted = void 0;
// 22338
o47.metaKey = false;
// 22339
o47.pageX = 622;
// 22340
o47.pageY = 915;
// 22341
o47.relatedTarget = null;
// 22342
o47.fromElement = null;
// 22345
o47.shiftKey = false;
// 22348
o47.timeStamp = 1373492011991;
// 22349
o47.type = "mousemove";
// 22350
o47.view = ow920654002;
// undefined
o47 = null;
// 22364
f920654002_1639.returns.push(undefined);
// 22367
f920654002_14.returns.push(undefined);
// 22368
f920654002_12.returns.push(1297);
// 22371
o47 = {};
// 22374
o47.cancelBubble = false;
// 22377
o47.returnValue = true;
// 22380
o47.srcElement = o16;
// 22382
o47.target = o16;
// 22389
f920654002_458.returns.push(null);
// 22395
f920654002_458.returns.push(null);
// 22400
o47.JSBNG__location = void 0;
// 22401
o47.altKey = false;
// 22402
o47.bubbles = true;
// 22403
o47.cancelable = true;
// 22404
o47.char = void 0;
// 22405
o47.charCode = 0;
// 22406
o47.ctrlKey = false;
// 22407
o47.currentTarget = o0;
// 22408
o47.defaultPrevented = false;
// 22409
o47.detail = 0;
// 22410
o47.eventPhase = 3;
// 22411
o47.isTrusted = void 0;
// 22412
o47.key = void 0;
// 22413
o47.keyCode = 13;
// 22414
o47.locale = void 0;
// 22415
o47.location = void 0;
// 22416
o47.metaKey = false;
// 22417
o47.repeat = void 0;
// 22418
o47.shiftKey = false;
// 22421
o47.timeStamp = 1373492012860;
// 22422
o47.type = "keyup";
// 22423
o47.view = ow920654002;
// 22424
o47.which = 13;
// 22438
o48 = {};
// 22441
o48.cancelBubble = false;
// 22444
f920654002_418.returns.push(1373492012902);
// 22449
f920654002_418.returns.push(1373492012903);
// 22453
f920654002_418.returns.push(1373492012904);
// 22456
o48.returnValue = true;
// undefined
o48 = null;
// 22457
o48 = {};
// 22460
o48.cancelBubble = false;
// 22463
f920654002_418.returns.push(1373492012917);
// 22465
o48.returnValue = true;
// undefined
o48 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 22469
f920654002_418.returns.push(1373492012918);
// 22470
o48 = {};
// 22473
o48.cancelBubble = false;
// 22476
f920654002_418.returns.push(1373492012926);
// 22478
o48.returnValue = true;
// undefined
o48 = null;
// 22479
o48 = {};
// 22482
o48.cancelBubble = false;
// 22485
f920654002_418.returns.push(1373492012942);
// 22487
o48.returnValue = true;
// undefined
o48 = null;
// 22488
o48 = {};
// 22491
o48.cancelBubble = false;
// 22494
f920654002_418.returns.push(1373492012953);
// 22496
o48.returnValue = true;
// undefined
o48 = null;
// 22497
o48 = {};
// 22500
o48.cancelBubble = false;
// 22503
f920654002_418.returns.push(1373492012966);
// 22505
o48.returnValue = true;
// undefined
o48 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 22509
f920654002_12.returns.push(1298);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 22512
o48 = {};
// 22515
o48.srcElement = o50;
// 22517
o48.target = o50;
// 22524
o51 = {};
// 22525
f920654002_458.returns.push(o51);
// 22526
o51.value = ".r[g4x].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0]";
// 22529
f920654002_458.returns.push(o51);
// 22531
o53 = {};
// 22532
o48.relatedTarget = o53;
// 22533
o119 = {};
// 22534
o53.parentNode = o119;
// 22535
o53.nodeType = 1;
// 22536
o53.getAttributeNode = f920654002_458;
// 22538
f920654002_458.returns.push(null);
// 22540
o120 = {};
// 22541
o119.parentNode = o120;
// 22542
o119.nodeType = 1;
// 22543
o119.getAttributeNode = f920654002_458;
// undefined
o119 = null;
// 22545
f920654002_458.returns.push(null);
// 22547
o119 = {};
// 22548
o120.parentNode = o119;
// 22549
o120.nodeType = 1;
// 22550
o120.getAttributeNode = f920654002_458;
// undefined
o120 = null;
// 22552
f920654002_458.returns.push(null);
// 22554
o120 = {};
// 22555
o119.parentNode = o120;
// 22556
o119.nodeType = 1;
// 22557
o119.getAttributeNode = f920654002_458;
// undefined
o119 = null;
// 22559
f920654002_458.returns.push(null);
// 22561
o119 = {};
// 22562
o120.parentNode = o119;
// 22563
o120.nodeType = 1;
// 22564
o120.getAttributeNode = f920654002_458;
// undefined
o120 = null;
// 22566
f920654002_458.returns.push(null);
// 22568
o120 = {};
// 22569
o119.parentNode = o120;
// 22570
o119.nodeType = 1;
// 22571
o119.getAttributeNode = f920654002_458;
// 22573
f920654002_458.returns.push(null);
// 22575
o120.parentNode = o29;
// 22576
o120.nodeType = 1;
// 22577
o120.getAttributeNode = f920654002_458;
// undefined
o120 = null;
// 22579
f920654002_458.returns.push(null);
// 22581
o29.parentNode = o28;
// 22582
o29.nodeType = 1;
// 22583
o29.getAttributeNode = f920654002_458;
// undefined
o29 = null;
// 22585
f920654002_458.returns.push(null);
// 22591
f920654002_458.returns.push(null);
// 22597
f920654002_458.returns.push(null);
// 22603
f920654002_458.returns.push(null);
// 22609
f920654002_458.returns.push(null);
// 22615
f920654002_458.returns.push(null);
// 22621
f920654002_458.returns.push(null);
// 22627
f920654002_458.returns.push(null);
// 22633
f920654002_458.returns.push(null);
// 22639
f920654002_458.returns.push(null);
// 22645
f920654002_458.returns.push(null);
// 22651
f920654002_458.returns.push(null);
// 22657
f920654002_458.returns.push(null);
// 22663
f920654002_458.returns.push(null);
// 22669
f920654002_458.returns.push(null);
// 22675
f920654002_458.returns.push(null);
// 22681
f920654002_458.returns.push(null);
// 22687
f920654002_458.returns.push(null);
// 22694
f920654002_458.returns.push(o51);
// undefined
o51 = null;
// 22696
o48.JSBNG__screenX = 701;
// 22697
o48.JSBNG__screenY = 270;
// 22698
o48.altKey = false;
// 22699
o48.bubbles = true;
// 22700
o48.button = 0;
// 22701
o48.buttons = void 0;
// 22702
o48.cancelable = true;
// 22703
o48.clientX = 622;
// 22704
o48.clientY = 436;
// 22705
o48.ctrlKey = false;
// 22706
o48.currentTarget = o0;
// 22707
o48.defaultPrevented = false;
// 22708
o48.detail = 0;
// 22709
o48.eventPhase = 3;
// 22710
o48.isTrusted = void 0;
// 22711
o48.metaKey = false;
// 22712
o48.pageX = 622;
// 22713
o48.pageY = 1155;
// 22715
o48.shiftKey = false;
// 22718
o48.timeStamp = 1373492013938;
// 22719
o48.type = "mouseout";
// 22720
o48.view = ow920654002;
// 22722
o48.returnValue = true;
// 22759
o48.cancelBubble = false;
// undefined
o48 = null;
// 22761
o29 = {};
// 22764
o29.cancelBubble = false;
// 22767
f920654002_418.returns.push(1373492013962);
// 22772
f920654002_418.returns.push(1373492013964);
// 22776
f920654002_418.returns.push(1373492013964);
// 22780
f920654002_1117.returns.push(undefined);
// 22782
o29.returnValue = true;
// 22785
o29.srcElement = o53;
// 22787
o29.target = o53;
// 22794
f920654002_458.returns.push(null);
// 22800
f920654002_458.returns.push(null);
// 22806
f920654002_458.returns.push(null);
// 22812
f920654002_458.returns.push(null);
// 22818
f920654002_458.returns.push(null);
// 22824
f920654002_458.returns.push(null);
// 22830
f920654002_458.returns.push(null);
// 22836
f920654002_458.returns.push(null);
// 22842
f920654002_458.returns.push(null);
// 22848
f920654002_458.returns.push(null);
// 22854
f920654002_458.returns.push(null);
// 22860
f920654002_458.returns.push(null);
// 22866
f920654002_458.returns.push(null);
// 22872
f920654002_458.returns.push(null);
// 22878
f920654002_458.returns.push(null);
// 22884
f920654002_458.returns.push(null);
// 22890
f920654002_458.returns.push(null);
// 22896
f920654002_458.returns.push(null);
// 22902
f920654002_458.returns.push(null);
// 22908
f920654002_458.returns.push(null);
// 22914
f920654002_458.returns.push(null);
// 22920
f920654002_458.returns.push(null);
// 22926
f920654002_458.returns.push(null);
// 22932
f920654002_458.returns.push(null);
// 22938
f920654002_458.returns.push(null);
// 22943
o29.relatedTarget = o50;
// undefined
o29 = null;
// undefined
o50 = null;
// 22946
o29 = {};
// 22950
f920654002_418.returns.push(1373492013989);
// 22951
o29.cancelBubble = false;
// 22952
o29.returnValue = true;
// 22955
o29.srcElement = o53;
// 22957
o29.target = o53;
// 22964
f920654002_458.returns.push(null);
// 22970
f920654002_458.returns.push(null);
// 22976
f920654002_458.returns.push(null);
// 22982
f920654002_458.returns.push(null);
// 22988
f920654002_458.returns.push(null);
// 22994
f920654002_458.returns.push(null);
// 23000
f920654002_458.returns.push(null);
// 23006
f920654002_458.returns.push(null);
// 23012
f920654002_458.returns.push(null);
// 23018
f920654002_458.returns.push(null);
// 23024
f920654002_458.returns.push(null);
// 23030
f920654002_458.returns.push(null);
// 23036
f920654002_458.returns.push(null);
// 23042
f920654002_458.returns.push(null);
// 23048
f920654002_458.returns.push(null);
// 23054
f920654002_458.returns.push(null);
// 23060
f920654002_458.returns.push(null);
// 23066
f920654002_458.returns.push(null);
// 23072
f920654002_458.returns.push(null);
// 23078
f920654002_458.returns.push(null);
// 23084
f920654002_458.returns.push(null);
// 23090
f920654002_458.returns.push(null);
// 23096
f920654002_458.returns.push(null);
// 23102
f920654002_458.returns.push(null);
// 23108
f920654002_458.returns.push(null);
// 23113
o29.JSBNG__screenX = 701;
// 23114
o29.JSBNG__screenY = 270;
// 23115
o29.altKey = false;
// 23116
o29.bubbles = true;
// 23117
o29.button = 0;
// 23118
o29.buttons = void 0;
// 23119
o29.cancelable = false;
// 23120
o29.clientX = 622;
// 23121
o29.clientY = 436;
// 23122
o29.ctrlKey = false;
// 23123
o29.currentTarget = o0;
// 23124
o29.defaultPrevented = false;
// 23125
o29.detail = 0;
// 23126
o29.eventPhase = 3;
// 23127
o29.isTrusted = void 0;
// 23128
o29.metaKey = false;
// 23129
o29.pageX = 622;
// 23130
o29.pageY = 1155;
// 23131
o29.relatedTarget = null;
// 23132
o29.fromElement = null;
// 23135
o29.shiftKey = false;
// 23138
o29.timeStamp = 1373492013983;
// 23139
o29.type = "mousemove";
// 23140
o29.view = ow920654002;
// undefined
o29 = null;
// 23149
f920654002_1639.returns.push(undefined);
// 23152
f920654002_14.returns.push(undefined);
// 23153
f920654002_12.returns.push(1299);
// 23156
o29 = {};
// 23159
o29.cancelBubble = false;
// 23162
f920654002_418.returns.push(1373492014677);
// 23167
f920654002_418.returns.push(1373492014679);
// 23171
f920654002_418.returns.push(1373492014679);
// 23174
o29.returnValue = true;
// undefined
o29 = null;
// 23175
o29 = {};
// 23178
o29.cancelBubble = false;
// 23181
o29.returnValue = true;
// 23184
o29.srcElement = o16;
// 23186
o29.target = o16;
// 23193
f920654002_458.returns.push(null);
// 23199
f920654002_458.returns.push(null);
// 23204
o29.JSBNG__location = void 0;
// 23205
o29.altKey = false;
// 23206
o29.bubbles = true;
// 23207
o29.cancelable = true;
// 23208
o29.char = void 0;
// 23209
o29.charCode = 0;
// 23210
o29.ctrlKey = false;
// 23211
o29.currentTarget = o0;
// 23212
o29.defaultPrevented = false;
// 23213
o29.detail = 0;
// 23214
o29.eventPhase = 3;
// 23215
o29.isTrusted = void 0;
// 23216
o29.key = void 0;
// 23217
o29.keyCode = 13;
// 23218
o29.locale = void 0;
// 23219
o29.location = void 0;
// 23220
o29.metaKey = false;
// 23221
o29.repeat = void 0;
// 23222
o29.shiftKey = false;
// 23225
o29.timeStamp = 1373492014758;
// 23226
o29.type = "keyup";
// 23227
o29.view = ow920654002;
// 23228
o29.which = 13;
// 23242
o48 = {};
// 23245
o48.srcElement = o53;
// 23247
o48.target = o53;
// 23254
f920654002_458.returns.push(null);
// 23260
f920654002_458.returns.push(null);
// 23266
f920654002_458.returns.push(null);
// 23272
f920654002_458.returns.push(null);
// 23278
f920654002_458.returns.push(null);
// 23284
f920654002_458.returns.push(null);
// 23290
f920654002_458.returns.push(null);
// 23296
f920654002_458.returns.push(null);
// 23302
f920654002_458.returns.push(null);
// 23308
f920654002_458.returns.push(null);
// 23314
f920654002_458.returns.push(null);
// 23320
f920654002_458.returns.push(null);
// 23326
f920654002_458.returns.push(null);
// 23332
f920654002_458.returns.push(null);
// 23338
f920654002_458.returns.push(null);
// 23344
f920654002_458.returns.push(null);
// 23350
f920654002_458.returns.push(null);
// 23356
f920654002_458.returns.push(null);
// 23362
f920654002_458.returns.push(null);
// 23368
f920654002_458.returns.push(null);
// 23374
f920654002_458.returns.push(null);
// 23380
f920654002_458.returns.push(null);
// 23386
f920654002_458.returns.push(null);
// 23392
f920654002_458.returns.push(null);
// 23398
f920654002_458.returns.push(null);
// 23403
o50 = {};
// 23404
o48.relatedTarget = o50;
// 23405
o51 = {};
// 23406
o50.parentNode = o51;
// 23407
o50.nodeType = 1;
// 23408
o50.getAttributeNode = f920654002_458;
// 23410
f920654002_458.returns.push(null);
// 23412
o51.parentNode = o34;
// 23413
o51.nodeType = 1;
// 23414
o51.getAttributeNode = f920654002_458;
// undefined
o51 = null;
// 23416
f920654002_458.returns.push(null);
// 23418
o51 = {};
// 23419
o34.parentNode = o51;
// 23420
o34.nodeType = 1;
// 23421
o34.getAttributeNode = f920654002_458;
// undefined
o34 = null;
// 23423
f920654002_458.returns.push(null);
// 23425
o51.parentNode = o119;
// undefined
o119 = null;
// 23426
o51.nodeType = 1;
// 23427
o51.getAttributeNode = f920654002_458;
// undefined
o51 = null;
// 23429
f920654002_458.returns.push(null);
// 23435
f920654002_458.returns.push(null);
// 23441
f920654002_458.returns.push(null);
// 23447
f920654002_458.returns.push(null);
// 23453
f920654002_458.returns.push(null);
// 23459
f920654002_458.returns.push(null);
// 23465
f920654002_458.returns.push(null);
// 23471
f920654002_458.returns.push(null);
// 23477
f920654002_458.returns.push(null);
// 23483
f920654002_458.returns.push(null);
// 23489
f920654002_458.returns.push(null);
// 23495
f920654002_458.returns.push(null);
// 23501
f920654002_458.returns.push(null);
// 23507
f920654002_458.returns.push(null);
// 23513
f920654002_458.returns.push(null);
// 23519
f920654002_458.returns.push(null);
// 23525
f920654002_458.returns.push(null);
// 23531
f920654002_458.returns.push(null);
// 23537
f920654002_458.returns.push(null);
// 23543
f920654002_458.returns.push(null);
// 23549
f920654002_458.returns.push(null);
// 23554
o48.cancelBubble = false;
// 23555
o48.returnValue = true;
// undefined
o48 = null;
// 23556
o34 = {};
// 23559
o34.cancelBubble = false;
// 23562
f920654002_418.returns.push(1373492014960);
// 23565
f920654002_1117.returns.push(undefined);
// 23567
o34.returnValue = true;
// 23570
o34.srcElement = o50;
// 23572
o34.target = o50;
// 23579
f920654002_458.returns.push(null);
// 23585
f920654002_458.returns.push(null);
// 23591
f920654002_458.returns.push(null);
// 23597
f920654002_458.returns.push(null);
// 23603
f920654002_458.returns.push(null);
// 23609
f920654002_458.returns.push(null);
// 23615
f920654002_458.returns.push(null);
// 23621
f920654002_458.returns.push(null);
// 23627
f920654002_458.returns.push(null);
// 23633
f920654002_458.returns.push(null);
// 23639
f920654002_458.returns.push(null);
// 23645
f920654002_458.returns.push(null);
// 23651
f920654002_458.returns.push(null);
// 23657
f920654002_458.returns.push(null);
// 23663
f920654002_458.returns.push(null);
// 23669
f920654002_458.returns.push(null);
// 23675
f920654002_458.returns.push(null);
// 23681
f920654002_458.returns.push(null);
// 23687
f920654002_458.returns.push(null);
// 23693
f920654002_458.returns.push(null);
// 23699
f920654002_458.returns.push(null);
// 23705
f920654002_458.returns.push(null);
// 23711
f920654002_458.returns.push(null);
// 23717
f920654002_458.returns.push(null);
// 23722
o34.relatedTarget = o53;
// undefined
o34 = null;
// undefined
o53 = null;
// 23725
o34 = {};
// 23729
f920654002_418.returns.push(1373492014974);
// 23730
o34.cancelBubble = false;
// 23731
o34.returnValue = true;
// 23734
o34.srcElement = o50;
// 23736
o34.target = o50;
// 23743
f920654002_458.returns.push(null);
// 23749
f920654002_458.returns.push(null);
// 23755
f920654002_458.returns.push(null);
// 23761
f920654002_458.returns.push(null);
// 23767
f920654002_458.returns.push(null);
// 23773
f920654002_458.returns.push(null);
// 23779
f920654002_458.returns.push(null);
// 23785
f920654002_458.returns.push(null);
// 23791
f920654002_458.returns.push(null);
// 23797
f920654002_458.returns.push(null);
// 23803
f920654002_458.returns.push(null);
// 23809
f920654002_458.returns.push(null);
// 23815
f920654002_458.returns.push(null);
// 23821
f920654002_458.returns.push(null);
// 23827
f920654002_458.returns.push(null);
// 23833
f920654002_458.returns.push(null);
// 23839
f920654002_458.returns.push(null);
// 23845
f920654002_458.returns.push(null);
// 23851
f920654002_458.returns.push(null);
// 23857
f920654002_458.returns.push(null);
// 23863
f920654002_458.returns.push(null);
// 23869
f920654002_458.returns.push(null);
// 23875
f920654002_458.returns.push(null);
// 23881
f920654002_458.returns.push(null);
// 23886
o34.JSBNG__screenX = 701;
// 23887
o34.JSBNG__screenY = 270;
// 23888
o34.altKey = false;
// 23889
o34.bubbles = true;
// 23890
o34.button = 0;
// 23891
o34.buttons = void 0;
// 23892
o34.cancelable = false;
// 23893
o34.clientX = 622;
// 23894
o34.clientY = 436;
// 23895
o34.ctrlKey = false;
// 23896
o34.currentTarget = o0;
// 23897
o34.defaultPrevented = false;
// 23898
o34.detail = 0;
// 23899
o34.eventPhase = 3;
// 23900
o34.isTrusted = void 0;
// 23901
o34.metaKey = false;
// 23902
o34.pageX = 622;
// 23903
o34.pageY = 1195;
// 23904
o34.relatedTarget = null;
// 23905
o34.fromElement = null;
// 23908
o34.shiftKey = false;
// 23911
o34.timeStamp = 1373492014974;
// 23912
o34.type = "mousemove";
// 23913
o34.view = ow920654002;
// undefined
o34 = null;
// 23922
f920654002_1639.returns.push(undefined);
// 23925
f920654002_14.returns.push(undefined);
// 23926
f920654002_12.returns.push(1300);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 23931
o34 = {};
// 23934
o34.cancelBubble = false;
// 23937
f920654002_418.returns.push(1373492015530);
// 23942
f920654002_418.returns.push(1373492015532);
// 23946
f920654002_418.returns.push(1373492015532);
// 23949
o34.returnValue = true;
// undefined
o34 = null;
// 23950
o34 = {};
// 23953
o34.cancelBubble = false;
// 23956
f920654002_418.returns.push(1373492015552);
// 23958
o34.returnValue = true;
// undefined
o34 = null;
// 23959
o34 = {};
// 23962
o34.cancelBubble = false;
// 23965
o34.returnValue = true;
// 23968
o34.srcElement = o16;
// 23970
o34.target = o16;
// 23977
f920654002_458.returns.push(null);
// 23983
f920654002_458.returns.push(null);
// 23988
o34.JSBNG__location = void 0;
// 23989
o34.altKey = false;
// 23990
o34.bubbles = true;
// 23991
o34.cancelable = true;
// 23992
o34.char = void 0;
// 23993
o34.charCode = 0;
// 23994
o34.ctrlKey = false;
// 23995
o34.currentTarget = o0;
// 23996
o34.defaultPrevented = false;
// 23997
o34.detail = 0;
// 23998
o34.eventPhase = 3;
// 23999
o34.isTrusted = void 0;
// 24000
o34.key = void 0;
// 24001
o34.keyCode = 13;
// 24002
o34.locale = void 0;
// 24003
o34.location = void 0;
// 24004
o34.metaKey = false;
// 24005
o34.repeat = void 0;
// 24006
o34.shiftKey = false;
// 24009
o34.timeStamp = 1373492015595;
// 24010
o34.type = "keyup";
// 24011
o34.view = ow920654002;
// 24012
o34.which = 13;
// 24026
o48 = {};
// 24029
o48.cancelBubble = false;
// 24032
f920654002_418.returns.push(1373492015743);
// 24034
o48.returnValue = true;
// undefined
o48 = null;
// 24035
o48 = {};
// 24038
o48.cancelBubble = false;
// 24041
f920654002_418.returns.push(1373492015750);
// 24043
o48.returnValue = true;
// undefined
o48 = null;
// 24044
o48 = {};
// 24047
o48.cancelBubble = false;
// 24050
f920654002_418.returns.push(1373492015766);
// 24052
o48.returnValue = true;
// undefined
o48 = null;
// 24053
o48 = {};
// 24056
o48.cancelBubble = false;
// 24059
f920654002_418.returns.push(1373492015776);
// 24061
o48.returnValue = true;
// undefined
o48 = null;
// 24062
o48 = {};
// 24065
o48.cancelBubble = false;
// 24068
f920654002_418.returns.push(1373492015782);
// 24070
o48.returnValue = true;
// undefined
o48 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 24074
f920654002_418.returns.push(1373492015869);
// 24075
o48 = {};
// 24078
o48.cancelBubble = false;
// 24081
f920654002_418.returns.push(1373492016029);
// 24083
o48.returnValue = true;
// undefined
o48 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 24086
o48 = {};
// 24089
o48.cancelBubble = false;
// 24092
f920654002_418.returns.push(1373492016039);
// 24097
f920654002_418.returns.push(1373492016041);
// 24101
f920654002_418.returns.push(1373492016041);
// 24104
o48.returnValue = true;
// undefined
o48 = null;
// 24105
o48 = {};
// 24108
o48.cancelBubble = false;
// 24111
f920654002_418.returns.push(1373492016051);
// 24113
o48.returnValue = true;
// undefined
o48 = null;
// 24114
o48 = {};
// 24117
o48.cancelBubble = false;
// 24120
f920654002_418.returns.push(1373492016061);
// 24122
o48.returnValue = true;
// undefined
o48 = null;
// 24123
o48 = {};
// 24126
o48.cancelBubble = false;
// 24129
f920654002_418.returns.push(1373492016072);
// 24131
o48.returnValue = true;
// undefined
o48 = null;
// 24132
o48 = {};
// 24135
o48.cancelBubble = false;
// 24138
f920654002_418.returns.push(1373492016082);
// 24140
o48.returnValue = true;
// undefined
o48 = null;
// 24142
f920654002_12.returns.push(1301);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 24145
o48 = {};
// 24148
o48.srcElement = o50;
// 24150
o48.target = o50;
// 24157
f920654002_458.returns.push(null);
// 24163
f920654002_458.returns.push(null);
// 24169
f920654002_458.returns.push(null);
// 24175
f920654002_458.returns.push(null);
// 24181
f920654002_458.returns.push(null);
// 24187
f920654002_458.returns.push(null);
// 24193
f920654002_458.returns.push(null);
// 24199
f920654002_458.returns.push(null);
// 24205
f920654002_458.returns.push(null);
// 24211
f920654002_458.returns.push(null);
// 24217
f920654002_458.returns.push(null);
// 24223
f920654002_458.returns.push(null);
// 24229
f920654002_458.returns.push(null);
// 24235
f920654002_458.returns.push(null);
// 24241
f920654002_458.returns.push(null);
// 24247
f920654002_458.returns.push(null);
// 24253
f920654002_458.returns.push(null);
// 24259
f920654002_458.returns.push(null);
// 24265
f920654002_458.returns.push(null);
// 24271
f920654002_458.returns.push(null);
// 24277
f920654002_458.returns.push(null);
// 24283
f920654002_458.returns.push(null);
// 24289
f920654002_458.returns.push(null);
// 24295
f920654002_458.returns.push(null);
// 24300
o51 = {};
// 24301
o48.relatedTarget = o51;
// 24302
o53 = {};
// 24303
o51.parentNode = o53;
// 24304
o51.nodeType = 1;
// 24305
o51.getAttributeNode = f920654002_458;
// 24307
f920654002_458.returns.push(null);
// 24309
o119 = {};
// 24310
o53.parentNode = o119;
// 24311
o53.nodeType = 1;
// 24312
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 24314
f920654002_458.returns.push(null);
// 24316
o53 = {};
// 24317
o119.parentNode = o53;
// 24318
o119.nodeType = 1;
// 24319
o119.getAttributeNode = f920654002_458;
// undefined
o119 = null;
// 24321
f920654002_458.returns.push(null);
// 24323
o119 = {};
// 24324
o53.parentNode = o119;
// 24325
o53.nodeType = 1;
// 24326
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 24328
f920654002_458.returns.push(null);
// 24330
o53 = {};
// 24331
o119.parentNode = o53;
// 24332
o119.nodeType = 1;
// 24333
o119.getAttributeNode = f920654002_458;
// undefined
o119 = null;
// 24335
f920654002_458.returns.push(null);
// 24337
o119 = {};
// 24338
o53.parentNode = o119;
// 24339
o53.nodeType = 1;
// 24340
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 24342
f920654002_458.returns.push(null);
// 24344
o53 = {};
// 24345
o119.parentNode = o53;
// 24346
o119.nodeType = 1;
// 24347
o119.getAttributeNode = f920654002_458;
// undefined
o119 = null;
// 24349
f920654002_458.returns.push(null);
// 24351
o119 = {};
// 24352
o53.parentNode = o119;
// 24353
o53.nodeType = 1;
// 24354
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 24356
f920654002_458.returns.push(null);
// 24358
o53 = {};
// 24359
o119.parentNode = o53;
// 24360
o119.nodeType = 1;
// 24361
o119.getAttributeNode = f920654002_458;
// undefined
o119 = null;
// 24363
f920654002_458.returns.push(null);
// 24365
o53.parentNode = o32;
// 24366
o53.nodeType = 1;
// 24367
o53.getAttributeNode = f920654002_458;
// undefined
o53 = null;
// 24369
f920654002_458.returns.push(null);
// 24371
o32.parentNode = o28;
// undefined
o28 = null;
// 24372
o32.nodeType = 1;
// 24373
o32.getAttributeNode = f920654002_458;
// undefined
o32 = null;
// 24375
f920654002_458.returns.push(null);
// 24381
f920654002_458.returns.push(null);
// 24387
f920654002_458.returns.push(null);
// 24393
f920654002_458.returns.push(null);
// 24399
f920654002_458.returns.push(null);
// 24405
f920654002_458.returns.push(null);
// 24411
f920654002_458.returns.push(null);
// 24417
f920654002_458.returns.push(null);
// 24423
f920654002_458.returns.push(null);
// 24429
f920654002_458.returns.push(null);
// 24435
f920654002_458.returns.push(null);
// 24441
f920654002_458.returns.push(null);
// 24447
f920654002_458.returns.push(null);
// 24453
f920654002_458.returns.push(null);
// 24459
f920654002_458.returns.push(null);
// 24465
f920654002_458.returns.push(null);
// 24471
f920654002_458.returns.push(null);
// 24477
f920654002_458.returns.push(null);
// 24482
o48.cancelBubble = false;
// 24483
o48.returnValue = true;
// undefined
o48 = null;
// 24484
// 24485
o28 = {};
// 24488
o28.cancelBubble = false;
// 24491
f920654002_418.returns.push(1373492016784);
// 24496
f920654002_418.returns.push(1373492016786);
// 24500
f920654002_418.returns.push(1373492016786);
// 24504
f920654002_1117.returns.push(undefined);
// 24506
o28.returnValue = true;
// 24509
o28.srcElement = o51;
// 24511
o28.target = o51;
// 24518
f920654002_458.returns.push(null);
// 24524
f920654002_458.returns.push(null);
// 24530
f920654002_458.returns.push(null);
// 24536
f920654002_458.returns.push(null);
// 24542
f920654002_458.returns.push(null);
// 24548
f920654002_458.returns.push(null);
// 24554
f920654002_458.returns.push(null);
// 24560
f920654002_458.returns.push(null);
// 24566
f920654002_458.returns.push(null);
// 24572
f920654002_458.returns.push(null);
// 24578
f920654002_458.returns.push(null);
// 24584
f920654002_458.returns.push(null);
// 24590
f920654002_458.returns.push(null);
// 24596
f920654002_458.returns.push(null);
// 24602
f920654002_458.returns.push(null);
// 24608
f920654002_458.returns.push(null);
// 24614
f920654002_458.returns.push(null);
// 24620
f920654002_458.returns.push(null);
// 24626
f920654002_458.returns.push(null);
// 24632
f920654002_458.returns.push(null);
// 24638
f920654002_458.returns.push(null);
// 24644
f920654002_458.returns.push(null);
// 24650
f920654002_458.returns.push(null);
// 24656
f920654002_458.returns.push(null);
// 24662
f920654002_458.returns.push(null);
// 24668
f920654002_458.returns.push(null);
// 24674
f920654002_458.returns.push(null);
// 24680
f920654002_458.returns.push(null);
// 24685
o28.relatedTarget = o50;
// undefined
o28 = null;
// undefined
o50 = null;
// 24688
o28 = {};
// 24692
f920654002_418.returns.push(1373492016806);
// 24693
o28.cancelBubble = false;
// 24694
o28.returnValue = true;
// 24697
o28.srcElement = o51;
// 24699
o28.target = o51;
// 24706
f920654002_458.returns.push(null);
// 24712
f920654002_458.returns.push(null);
// 24718
f920654002_458.returns.push(null);
// 24724
f920654002_458.returns.push(null);
// 24730
f920654002_458.returns.push(null);
// 24736
f920654002_458.returns.push(null);
// 24742
f920654002_458.returns.push(null);
// 24748
f920654002_458.returns.push(null);
// 24754
f920654002_458.returns.push(null);
// 24760
f920654002_458.returns.push(null);
// 24766
f920654002_458.returns.push(null);
// 24772
f920654002_458.returns.push(null);
// 24778
f920654002_458.returns.push(null);
// 24784
f920654002_458.returns.push(null);
// 24790
f920654002_458.returns.push(null);
// 24796
f920654002_458.returns.push(null);
// 24802
f920654002_458.returns.push(null);
// 24808
f920654002_458.returns.push(null);
// 24814
f920654002_458.returns.push(null);
// 24820
f920654002_458.returns.push(null);
// 24826
f920654002_458.returns.push(null);
// 24832
f920654002_458.returns.push(null);
// 24838
f920654002_458.returns.push(null);
// 24844
f920654002_458.returns.push(null);
// 24850
f920654002_458.returns.push(null);
// 24856
f920654002_458.returns.push(null);
// 24862
f920654002_458.returns.push(null);
// 24868
f920654002_458.returns.push(null);
// 24873
o28.JSBNG__screenX = 701;
// 24874
o28.JSBNG__screenY = 270;
// 24875
o28.altKey = false;
// 24876
o28.bubbles = true;
// 24877
o28.button = 0;
// 24878
o28.buttons = void 0;
// 24879
o28.cancelable = false;
// 24880
o28.clientX = 622;
// 24881
o28.clientY = 436;
// 24882
o28.ctrlKey = false;
// 24883
o28.currentTarget = o0;
// 24884
o28.defaultPrevented = false;
// 24885
o28.detail = 0;
// 24886
o28.eventPhase = 3;
// 24887
o28.isTrusted = void 0;
// 24888
o28.metaKey = false;
// 24889
o28.pageX = 622;
// 24890
o28.pageY = 1995;
// 24891
o28.relatedTarget = null;
// 24892
o28.fromElement = null;
// 24895
o28.shiftKey = false;
// 24898
o28.timeStamp = 1373492016806;
// 24899
o28.type = "mousemove";
// 24900
o28.view = ow920654002;
// undefined
o28 = null;
// 24909
f920654002_1639.returns.push(undefined);
// 24912
f920654002_14.returns.push(undefined);
// 24913
f920654002_12.returns.push(1302);
// 24916
o28 = {};
// 24919
o28.cancelBubble = false;
// 24922
o28.returnValue = true;
// 24925
o28.srcElement = o16;
// 24927
o28.target = o16;
// 24934
f920654002_458.returns.push(null);
// 24940
f920654002_458.returns.push(null);
// 24945
o28.JSBNG__location = void 0;
// 24946
o28.altKey = false;
// 24947
o28.bubbles = true;
// 24948
o28.cancelable = true;
// 24949
o28.char = void 0;
// 24950
o28.charCode = 0;
// 24951
o28.ctrlKey = false;
// 24952
o28.currentTarget = o0;
// 24953
o28.defaultPrevented = false;
// 24954
o28.detail = 0;
// 24955
o28.eventPhase = 3;
// 24956
o28.isTrusted = void 0;
// 24957
o28.key = void 0;
// 24958
o28.keyCode = 13;
// 24959
o28.locale = void 0;
// 24960
o28.location = void 0;
// 24961
o28.metaKey = false;
// 24962
o28.repeat = void 0;
// 24963
o28.shiftKey = false;
// 24966
o28.timeStamp = 1373492017463;
// 24967
o28.type = "keyup";
// 24968
o28.view = ow920654002;
// 24969
o28.which = 13;
// 24983
o32 = {};
// 24986
o32.cancelBubble = false;
// 24989
f920654002_418.returns.push(1373492017625);
// 24994
f920654002_418.returns.push(1373492017627);
// 24998
f920654002_418.returns.push(1373492017628);
// 25001
o32.returnValue = true;
// undefined
o32 = null;
// 25002
o32 = {};
// 25005
o32.cancelBubble = false;
// 25008
f920654002_418.returns.push(1373492017643);
// 25010
o32.returnValue = true;
// undefined
o32 = null;
// 25011
o32 = {};
// 25014
o32.cancelBubble = false;
// 25017
f920654002_418.returns.push(1373492017662);
// 25019
o32.returnValue = true;
// undefined
o32 = null;
// 25020
o32 = {};
// 25023
o32.cancelBubble = false;
// 25026
f920654002_418.returns.push(1373492017670);
// 25028
o32.returnValue = true;
// undefined
o32 = null;
// 25029
o32 = {};
// 25032
o32.cancelBubble = false;
// 25035
f920654002_418.returns.push(1373492017679);
// 25037
o32.returnValue = true;
// undefined
o32 = null;
// 25038
o32 = {};
// 25041
o32.cancelBubble = false;
// 25044
f920654002_418.returns.push(1373492017691);
// 25046
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 25049
o32 = {};
// 25052
o32.cancelBubble = false;
// 25055
f920654002_418.returns.push(1373492017753);
// 25057
o32.returnValue = true;
// undefined
o32 = null;
// 25058
o32 = {};
// 25061
o32.cancelBubble = false;
// 25064
f920654002_418.returns.push(1373492017770);
// 25066
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 25069
f920654002_418.returns.push(1373492017780);
// 25071
f920654002_418.returns.push(1373492017780);
// 25073
f920654002_418.returns.push(1373492017780);
// 25074
o32 = {};
// 25077
o32.srcElement = o51;
// 25079
o32.target = o51;
// 25086
f920654002_458.returns.push(null);
// 25092
f920654002_458.returns.push(null);
// 25098
f920654002_458.returns.push(null);
// 25104
f920654002_458.returns.push(null);
// 25110
f920654002_458.returns.push(null);
// 25116
f920654002_458.returns.push(null);
// 25122
f920654002_458.returns.push(null);
// 25128
f920654002_458.returns.push(null);
// 25134
f920654002_458.returns.push(null);
// 25140
f920654002_458.returns.push(null);
// 25146
f920654002_458.returns.push(null);
// 25152
f920654002_458.returns.push(null);
// 25158
f920654002_458.returns.push(null);
// 25164
f920654002_458.returns.push(null);
// 25170
f920654002_458.returns.push(null);
// 25176
f920654002_458.returns.push(null);
// 25182
f920654002_458.returns.push(null);
// 25188
f920654002_458.returns.push(null);
// 25194
f920654002_458.returns.push(null);
// 25200
f920654002_458.returns.push(null);
// 25206
f920654002_458.returns.push(null);
// 25212
f920654002_458.returns.push(null);
// 25218
f920654002_458.returns.push(null);
// 25224
f920654002_458.returns.push(null);
// 25230
f920654002_458.returns.push(null);
// 25236
f920654002_458.returns.push(null);
// 25242
f920654002_458.returns.push(null);
// 25248
f920654002_458.returns.push(null);
// 25253
o48 = {};
// 25254
o32.relatedTarget = o48;
// 25255
o48.parentNode = o42;
// undefined
o42 = null;
// 25256
o48.nodeType = 1;
// 25257
o48.getAttributeNode = f920654002_458;
// 25259
o42 = {};
// 25260
f920654002_458.returns.push(o42);
// 25261
o42.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[0][2].[0].[0]";
// 25264
f920654002_458.returns.push(o42);
// 25266
o32.JSBNG__screenX = 701;
// 25267
o32.JSBNG__screenY = 270;
// 25268
o32.altKey = false;
// 25269
o32.bubbles = true;
// 25270
o32.button = 0;
// 25271
o32.buttons = void 0;
// 25272
o32.cancelable = true;
// 25273
o32.clientX = 622;
// 25274
o32.clientY = 436;
// 25275
o32.ctrlKey = false;
// 25276
o32.currentTarget = o0;
// 25277
o32.defaultPrevented = false;
// 25278
o32.detail = 0;
// 25279
o32.eventPhase = 3;
// 25280
o32.isTrusted = void 0;
// 25281
o32.metaKey = false;
// 25282
o32.pageX = 622;
// 25283
o32.pageY = 2219;
// 25285
o32.shiftKey = false;
// 25288
o32.timeStamp = 1373492017943;
// 25289
o32.type = "mouseout";
// 25290
o32.view = ow920654002;
// 25292
o32.returnValue = true;
// 25324
o32.cancelBubble = false;
// undefined
o32 = null;
// 25326
o32 = {};
// 25329
o32.cancelBubble = false;
// 25332
f920654002_418.returns.push(1373492017964);
// 25335
f920654002_1117.returns.push(undefined);
// 25337
o32.returnValue = true;
// 25340
o32.srcElement = o48;
// 25342
o32.target = o48;
// 25349
f920654002_458.returns.push(o42);
// 25353
f920654002_458.returns.push(o42);
// 25355
o32.relatedTarget = o51;
// undefined
o32 = null;
// undefined
o51 = null;
// 25356
o48.nodeName = "SPAN";
// 25363
o32 = {};
// 25367
f920654002_418.returns.push(1373492017970);
// 25368
o32.cancelBubble = false;
// 25369
o32.returnValue = true;
// 25372
o32.srcElement = o48;
// 25374
o32.target = o48;
// 25381
f920654002_458.returns.push(o42);
// 25385
f920654002_458.returns.push(o42);
// 25387
o32.JSBNG__screenX = 701;
// 25388
o32.JSBNG__screenY = 270;
// 25389
o32.altKey = false;
// 25390
o32.bubbles = true;
// 25391
o32.button = 0;
// 25392
o32.buttons = void 0;
// 25393
o32.cancelable = false;
// 25394
o32.clientX = 622;
// 25395
o32.clientY = 436;
// 25396
o32.ctrlKey = false;
// 25397
o32.currentTarget = o0;
// 25398
o32.defaultPrevented = false;
// 25399
o32.detail = 0;
// 25400
o32.eventPhase = 3;
// 25401
o32.isTrusted = void 0;
// 25402
o32.metaKey = false;
// 25403
o32.pageX = 622;
// 25404
o32.pageY = 2219;
// 25405
o32.relatedTarget = null;
// 25406
o32.fromElement = null;
// 25409
o32.shiftKey = false;
// 25412
o32.timeStamp = 1373492017970;
// 25413
o32.type = "mousemove";
// 25414
o32.view = ow920654002;
// undefined
o32 = null;
// 25428
f920654002_1639.returns.push(undefined);
// 25431
f920654002_14.returns.push(undefined);
// 25432
f920654002_12.returns.push(1303);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 25438
f920654002_418.returns.push(1373492018630);
// 25439
o32 = {};
// 25442
o32.cancelBubble = false;
// 25445
o32.returnValue = true;
// 25448
o32.srcElement = o16;
// 25450
o32.target = o16;
// 25457
f920654002_458.returns.push(null);
// 25463
f920654002_458.returns.push(null);
// 25468
o32.JSBNG__location = void 0;
// 25469
o32.altKey = false;
// 25470
o32.bubbles = true;
// 25471
o32.cancelable = true;
// 25472
o32.char = void 0;
// 25473
o32.charCode = 0;
// 25474
o32.ctrlKey = false;
// 25475
o32.currentTarget = o0;
// 25476
o32.defaultPrevented = false;
// 25477
o32.detail = 0;
// 25478
o32.eventPhase = 3;
// 25479
o32.isTrusted = void 0;
// 25480
o32.key = void 0;
// 25481
o32.keyCode = 13;
// 25482
o32.locale = void 0;
// 25483
o32.location = void 0;
// 25484
o32.metaKey = false;
// 25485
o32.repeat = void 0;
// 25486
o32.shiftKey = false;
// 25489
o32.timeStamp = 1373492018646;
// 25490
o32.type = "keyup";
// 25491
o32.view = ow920654002;
// 25492
o32.which = 13;
// 25506
o50 = {};
// 25509
o50.cancelBubble = false;
// 25512
f920654002_418.returns.push(1373492018743);
// 25517
f920654002_418.returns.push(1373492018745);
// 25521
f920654002_418.returns.push(1373492018745);
// 25524
o50.returnValue = true;
// undefined
o50 = null;
// 25525
o50 = {};
// 25528
o50.cancelBubble = false;
// 25531
f920654002_418.returns.push(1373492018759);
// 25533
o50.returnValue = true;
// undefined
o50 = null;
// 25534
o50 = {};
// 25537
o50.cancelBubble = false;
// 25540
f920654002_418.returns.push(1373492018768);
// 25542
o50.returnValue = true;
// undefined
o50 = null;
// 25543
o50 = {};
// 25546
o50.cancelBubble = false;
// 25549
f920654002_418.returns.push(1373492018781);
// 25551
o50.returnValue = true;
// undefined
o50 = null;
// 25552
o50 = {};
// 25555
o50.srcElement = o48;
// 25557
o50.target = o48;
// 25564
f920654002_458.returns.push(o42);
// 25568
f920654002_458.returns.push(o42);
// 25570
o51 = {};
// 25571
o50.relatedTarget = o51;
// 25572
o51.parentNode = o43;
// undefined
o43 = null;
// 25573
o51.nodeType = 1;
// 25574
o51.getAttributeNode = f920654002_458;
// 25576
o43 = {};
// 25577
f920654002_458.returns.push(o43);
// 25578
o43.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[1]";
// 25581
f920654002_458.returns.push(o42);
// undefined
o42 = null;
// 25585
f920654002_458.returns.push(o43);
// 25587
o50.JSBNG__screenX = 788;
// 25588
o50.JSBNG__screenY = 549;
// 25589
o50.altKey = false;
// 25590
o50.bubbles = true;
// 25591
o50.button = 0;
// 25592
o50.buttons = void 0;
// 25593
o50.cancelable = true;
// 25594
o50.clientX = 709;
// 25595
o50.clientY = 455;
// 25596
o50.ctrlKey = false;
// 25597
o50.currentTarget = o0;
// 25598
o50.defaultPrevented = false;
// 25599
o50.detail = 0;
// 25600
o50.eventPhase = 3;
// 25601
o50.isTrusted = void 0;
// 25602
o50.metaKey = false;
// 25603
o50.pageX = 709;
// 25604
o50.pageY = 2238;
// 25606
o50.shiftKey = false;
// 25609
o50.timeStamp = 1373492018788;
// 25610
o50.type = "mouseout";
// 25611
o50.view = ow920654002;
// 25613
o50.returnValue = true;
// 25650
o50.cancelBubble = false;
// undefined
o50 = null;
// 25652
o42 = {};
// 25655
o42.cancelBubble = false;
// 25658
f920654002_418.returns.push(1373492018798);
// 25661
f920654002_1117.returns.push(undefined);
// 25663
o42.returnValue = true;
// 25666
o42.srcElement = o51;
// 25668
o42.target = o51;
// 25675
f920654002_458.returns.push(o43);
// 25679
f920654002_458.returns.push(o43);
// 25681
o42.relatedTarget = o48;
// undefined
o42 = null;
// undefined
o48 = null;
// 25682
o51.nodeName = "DIV";
// 25689
o42 = {};
// 25693
f920654002_418.returns.push(1373492018804);
// 25694
o42.cancelBubble = false;
// 25695
o42.returnValue = true;
// 25698
o42.srcElement = o51;
// 25700
o42.target = o51;
// 25707
f920654002_458.returns.push(o43);
// 25711
f920654002_458.returns.push(o43);
// undefined
o43 = null;
// 25713
o42.JSBNG__screenX = 788;
// 25714
o42.JSBNG__screenY = 549;
// 25715
o42.altKey = false;
// 25716
o42.bubbles = true;
// 25717
o42.button = 0;
// 25718
o42.buttons = void 0;
// 25719
o42.cancelable = false;
// 25720
o42.clientX = 709;
// 25721
o42.clientY = 455;
// 25722
o42.ctrlKey = false;
// 25723
o42.currentTarget = o0;
// 25724
o42.defaultPrevented = false;
// 25725
o42.detail = 0;
// 25726
o42.eventPhase = 3;
// 25727
o42.isTrusted = void 0;
// 25728
o42.metaKey = false;
// 25729
o42.pageX = 709;
// 25730
o42.pageY = 2238;
// 25731
o42.relatedTarget = null;
// 25732
o42.fromElement = null;
// 25735
o42.shiftKey = false;
// 25738
o42.timeStamp = 1373492018803;
// 25739
o42.type = "mousemove";
// 25740
o42.view = ow920654002;
// undefined
o42 = null;
// 25754
f920654002_1639.returns.push(undefined);
// 25757
f920654002_14.returns.push(undefined);
// 25758
f920654002_12.returns.push(1304);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 25763
o42 = {};
// 25766
o42.cancelBubble = false;
// 25769
f920654002_418.returns.push(1373492019345);
// 25774
f920654002_418.returns.push(1373492019349);
// 25778
f920654002_418.returns.push(1373492019351);
// 25781
o42.returnValue = true;
// undefined
o42 = null;
// 25782
o42 = {};
// 25786
f920654002_418.returns.push(1373492019355);
// 25787
o42.cancelBubble = false;
// 25788
o42.returnValue = true;
// 25791
o42.srcElement = o51;
// 25793
o42.target = o51;
// 25800
o43 = {};
// 25801
f920654002_458.returns.push(o43);
// 25802
o43.value = ".r[49e93].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[1]";
// 25805
f920654002_458.returns.push(o43);
// 25807
o42.JSBNG__screenX = 788;
// 25808
o42.JSBNG__screenY = 549;
// 25809
o42.altKey = false;
// 25810
o42.bubbles = true;
// 25811
o42.button = 0;
// 25812
o42.buttons = void 0;
// 25813
o42.cancelable = false;
// 25814
o42.clientX = 709;
// 25815
o42.clientY = 455;
// 25816
o42.ctrlKey = false;
// 25817
o42.currentTarget = o0;
// 25818
o42.defaultPrevented = false;
// 25819
o42.detail = 0;
// 25820
o42.eventPhase = 3;
// 25821
o42.isTrusted = void 0;
// 25822
o42.metaKey = false;
// 25823
o42.pageX = 709;
// 25824
o42.pageY = 2238;
// 25825
o42.relatedTarget = null;
// 25826
o42.fromElement = null;
// 25829
o42.shiftKey = false;
// 25832
o42.timeStamp = 1373492019354;
// 25833
o42.type = "mousemove";
// 25834
o42.view = ow920654002;
// undefined
o42 = null;
// 25848
f920654002_1639.returns.push(undefined);
// 25851
f920654002_14.returns.push(undefined);
// 25852
f920654002_12.returns.push(1305);
// 25856
f920654002_12.returns.push(1306);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 25859
o42 = {};
// 25862
o42.cancelBubble = false;
// 25865
f920654002_418.returns.push(1373492020447);
// 25870
f920654002_418.returns.push(1373492020449);
// 25874
f920654002_418.returns.push(1373492020449);
// 25877
o42.returnValue = true;
// undefined
o42 = null;
// 25878
o42 = {};
// 25881
o42.srcElement = o51;
// 25883
o42.target = o51;
// 25890
f920654002_458.returns.push(o43);
// 25894
f920654002_458.returns.push(o43);
// 25896
o42.relatedTarget = o64;
// 25901
f920654002_458.returns.push(null);
// 25907
f920654002_458.returns.push(null);
// 25913
f920654002_458.returns.push(null);
// 25919
f920654002_458.returns.push(null);
// 25925
f920654002_458.returns.push(null);
// 25931
f920654002_458.returns.push(null);
// 25937
f920654002_458.returns.push(null);
// 25943
f920654002_458.returns.push(null);
// 25950
f920654002_458.returns.push(o43);
// undefined
o43 = null;
// 25952
o42.JSBNG__screenX = 985;
// 25953
o42.JSBNG__screenY = 547;
// 25954
o42.altKey = false;
// 25955
o42.bubbles = true;
// 25956
o42.button = 0;
// 25957
o42.buttons = void 0;
// 25958
o42.cancelable = true;
// 25959
o42.clientX = 906;
// 25960
o42.clientY = 453;
// 25961
o42.ctrlKey = false;
// 25962
o42.currentTarget = o0;
// 25963
o42.defaultPrevented = false;
// 25964
o42.detail = 0;
// 25965
o42.eventPhase = 3;
// 25966
o42.isTrusted = void 0;
// 25967
o42.metaKey = false;
// 25968
o42.pageX = 906;
// 25969
o42.pageY = 2236;
// 25971
o42.shiftKey = false;
// 25974
o42.timeStamp = 1373492020461;
// 25975
o42.type = "mouseout";
// 25976
o42.view = ow920654002;
// 25978
o42.returnValue = true;
// 26015
o42.cancelBubble = false;
// undefined
o42 = null;
// 26017
o42 = {};
// 26020
o42.cancelBubble = false;
// 26023
f920654002_418.returns.push(1373492020480);
// 26026
f920654002_1117.returns.push(undefined);
// 26028
o42.returnValue = true;
// 26031
o42.srcElement = o64;
// 26033
o42.target = o64;
// 26040
f920654002_458.returns.push(null);
// 26046
f920654002_458.returns.push(null);
// 26052
f920654002_458.returns.push(null);
// 26058
f920654002_458.returns.push(null);
// 26064
f920654002_458.returns.push(null);
// 26070
f920654002_458.returns.push(null);
// 26076
f920654002_458.returns.push(null);
// 26082
f920654002_458.returns.push(null);
// 26087
o42.relatedTarget = o51;
// undefined
o42 = null;
// undefined
o51 = null;
// 26090
o42 = {};
// 26094
f920654002_418.returns.push(1373492020490);
// 26095
o42.cancelBubble = false;
// 26096
o42.returnValue = true;
// 26099
o42.srcElement = o64;
// 26101
o42.target = o64;
// 26108
f920654002_458.returns.push(null);
// 26114
f920654002_458.returns.push(null);
// 26120
f920654002_458.returns.push(null);
// 26126
f920654002_458.returns.push(null);
// 26132
f920654002_458.returns.push(null);
// 26138
f920654002_458.returns.push(null);
// 26144
f920654002_458.returns.push(null);
// 26150
f920654002_458.returns.push(null);
// 26155
o42.JSBNG__screenX = 985;
// 26156
o42.JSBNG__screenY = 547;
// 26157
o42.altKey = false;
// 26158
o42.bubbles = true;
// 26159
o42.button = 0;
// 26160
o42.buttons = void 0;
// 26161
o42.cancelable = false;
// 26162
o42.clientX = 906;
// 26163
o42.clientY = 453;
// 26164
o42.ctrlKey = false;
// 26165
o42.currentTarget = o0;
// 26166
o42.defaultPrevented = false;
// 26167
o42.detail = 0;
// 26168
o42.eventPhase = 3;
// 26169
o42.isTrusted = void 0;
// 26170
o42.metaKey = false;
// 26171
o42.pageX = 906;
// 26172
o42.pageY = 2236;
// 26173
o42.relatedTarget = null;
// 26174
o42.fromElement = null;
// 26177
o42.shiftKey = false;
// 26180
o42.timeStamp = 1373492020490;
// 26181
o42.type = "mousemove";
// 26182
o42.view = ow920654002;
// undefined
o42 = null;
// 26191
f920654002_1639.returns.push(undefined);
// 26194
f920654002_14.returns.push(undefined);
// 26195
f920654002_12.returns.push(1307);
// 26200
f920654002_418.returns.push(1373492021069);
// 26201
o42 = {};
// 26204
o42.cancelBubble = false;
// 26207
o42.returnValue = true;
// 26210
o42.srcElement = o16;
// 26212
o42.target = o16;
// 26219
f920654002_458.returns.push(null);
// 26225
f920654002_458.returns.push(null);
// 26230
o42.JSBNG__location = void 0;
// 26231
o42.altKey = false;
// 26232
o42.bubbles = true;
// 26233
o42.cancelable = true;
// 26234
o42.char = void 0;
// 26235
o42.charCode = 0;
// 26236
o42.ctrlKey = false;
// 26237
o42.currentTarget = o0;
// 26238
o42.defaultPrevented = false;
// 26239
o42.detail = 0;
// 26240
o42.eventPhase = 3;
// 26241
o42.isTrusted = void 0;
// 26242
o42.key = void 0;
// 26243
o42.keyCode = 13;
// 26244
o42.locale = void 0;
// 26245
o42.location = void 0;
// 26246
o42.metaKey = false;
// 26247
o42.repeat = void 0;
// 26248
o42.shiftKey = false;
// 26251
o42.timeStamp = 1373492021078;
// 26252
o42.type = "keyup";
// 26253
o42.view = ow920654002;
// 26254
o42.which = 13;
// 26268
o43 = {};
// 26272
f920654002_418.returns.push(1373492021092);
// 26277
f920654002_418.returns.push(1373492021111);
// 26281
f920654002_418.returns.push(1373492021111);
// 26283
o43.cancelBubble = false;
// 26284
o43.returnValue = true;
// 26287
o43.srcElement = o64;
// 26289
o43.target = o64;
// 26296
f920654002_458.returns.push(null);
// 26302
f920654002_458.returns.push(null);
// 26308
f920654002_458.returns.push(null);
// 26314
f920654002_458.returns.push(null);
// 26320
f920654002_458.returns.push(null);
// 26326
f920654002_458.returns.push(null);
// 26332
f920654002_458.returns.push(null);
// 26338
f920654002_458.returns.push(null);
// 26343
o43.JSBNG__screenX = 985;
// 26344
o43.JSBNG__screenY = 548;
// 26345
o43.altKey = false;
// 26346
o43.bubbles = true;
// 26347
o43.button = 0;
// 26348
o43.buttons = void 0;
// 26349
o43.cancelable = false;
// 26350
o43.clientX = 906;
// 26351
o43.clientY = 454;
// 26352
o43.ctrlKey = false;
// 26353
o43.currentTarget = o0;
// 26354
o43.defaultPrevented = false;
// 26355
o43.detail = 0;
// 26356
o43.eventPhase = 3;
// 26357
o43.isTrusted = void 0;
// 26358
o43.metaKey = false;
// 26359
o43.pageX = 906;
// 26360
o43.pageY = 2237;
// 26361
o43.relatedTarget = null;
// 26362
o43.fromElement = null;
// 26365
o43.shiftKey = false;
// 26368
o43.timeStamp = 1373492021091;
// 26369
o43.type = "mousemove";
// 26370
o43.view = ow920654002;
// undefined
o43 = null;
// 26379
f920654002_1639.returns.push(undefined);
// 26382
f920654002_14.returns.push(undefined);
// 26383
f920654002_12.returns.push(1308);
// 26386
o43 = {};
// 26389
o43.cancelBubble = false;
// 26392
f920654002_418.returns.push(1373492021577);
// 26394
o43.returnValue = true;
// undefined
o43 = null;
// 26395
o43 = {};
// 26398
o43.cancelBubble = false;
// 26401
o43.returnValue = true;
// 26404
o43.srcElement = o16;
// 26406
o43.target = o16;
// 26413
f920654002_458.returns.push(null);
// 26419
f920654002_458.returns.push(null);
// 26424
o43.JSBNG__location = void 0;
// 26425
o43.altKey = false;
// 26426
o43.bubbles = true;
// 26427
o43.cancelable = true;
// 26428
o43.char = void 0;
// 26429
o43.charCode = 0;
// 26430
o43.ctrlKey = false;
// 26431
o43.currentTarget = o0;
// 26432
o43.defaultPrevented = false;
// 26433
o43.detail = 0;
// 26434
o43.eventPhase = 3;
// 26435
o43.isTrusted = void 0;
// 26436
o43.key = void 0;
// 26437
o43.keyCode = 13;
// 26438
o43.locale = void 0;
// 26439
o43.location = void 0;
// 26440
o43.metaKey = false;
// 26441
o43.repeat = void 0;
// 26442
o43.shiftKey = false;
// 26445
o43.timeStamp = 1373492021598;
// 26446
o43.type = "keyup";
// 26447
o43.view = ow920654002;
// 26448
o43.which = 13;
// 26462
o48 = {};
// 26465
o48.cancelBubble = false;
// 26468
f920654002_418.returns.push(1373492021605);
// 26473
f920654002_418.returns.push(1373492021607);
// 26477
f920654002_418.returns.push(1373492021607);
// 26480
o48.returnValue = true;
// undefined
o48 = null;
// 26481
o48 = {};
// 26484
o48.cancelBubble = false;
// 26487
o48.returnValue = true;
// 26490
o48.srcElement = o16;
// 26492
o48.target = o16;
// 26499
f920654002_458.returns.push(null);
// 26505
f920654002_458.returns.push(null);
// 26510
o48.JSBNG__location = void 0;
// 26511
o48.altKey = false;
// 26512
o48.bubbles = true;
// 26513
o48.cancelable = true;
// 26514
o48.char = void 0;
// 26515
o48.charCode = 0;
// 26516
o48.ctrlKey = false;
// 26517
o48.currentTarget = o0;
// 26518
o48.defaultPrevented = false;
// 26519
o48.detail = 0;
// 26520
o48.eventPhase = 3;
// 26521
o48.isTrusted = void 0;
// 26522
o48.key = void 0;
// 26523
o48.keyCode = 13;
// 26524
o48.locale = void 0;
// 26525
o48.location = void 0;
// 26526
o48.metaKey = false;
// 26527
o48.repeat = void 0;
// 26528
o48.shiftKey = false;
// 26531
o48.timeStamp = 1373492021668;
// 26532
o48.type = "keyup";
// 26533
o48.view = ow920654002;
// 26534
o48.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 26550
o50 = {};
// 26554
f920654002_418.returns.push(1373492021982);
// 26555
o50.cancelBubble = false;
// 26556
o50.returnValue = true;
// 26559
o50.srcElement = o64;
// 26561
o50.target = o64;
// 26568
f920654002_458.returns.push(null);
// 26574
f920654002_458.returns.push(null);
// 26580
f920654002_458.returns.push(null);
// 26586
f920654002_458.returns.push(null);
// 26592
f920654002_458.returns.push(null);
// 26598
f920654002_458.returns.push(null);
// 26604
f920654002_458.returns.push(null);
// 26610
f920654002_458.returns.push(null);
// 26615
o50.JSBNG__screenX = 985;
// 26616
o50.JSBNG__screenY = 550;
// 26617
o50.altKey = false;
// 26618
o50.bubbles = true;
// 26619
o50.button = 0;
// 26620
o50.buttons = void 0;
// 26621
o50.cancelable = false;
// 26622
o50.clientX = 906;
// 26623
o50.clientY = 456;
// 26624
o50.ctrlKey = false;
// 26625
o50.currentTarget = o0;
// 26626
o50.defaultPrevented = false;
// 26627
o50.detail = 0;
// 26628
o50.eventPhase = 3;
// 26629
o50.isTrusted = void 0;
// 26630
o50.metaKey = false;
// 26631
o50.pageX = 906;
// 26632
o50.pageY = 2239;
// 26633
o50.relatedTarget = null;
// 26634
o50.fromElement = null;
// 26637
o50.shiftKey = false;
// 26640
o50.timeStamp = 1373492021981;
// 26641
o50.type = "mousemove";
// 26642
o50.view = ow920654002;
// undefined
o50 = null;
// 26651
f920654002_1639.returns.push(undefined);
// 26654
f920654002_14.returns.push(undefined);
// 26655
f920654002_12.returns.push(1309);
// 26658
o50 = {};
// 26662
f920654002_418.returns.push(1373492022551);
// 26667
f920654002_418.returns.push(1373492022553);
// 26671
f920654002_418.returns.push(1373492022553);
// 26673
o50.cancelBubble = false;
// 26674
o50.returnValue = true;
// 26677
o50.srcElement = o64;
// 26679
o50.target = o64;
// 26686
f920654002_458.returns.push(null);
// 26692
f920654002_458.returns.push(null);
// 26698
f920654002_458.returns.push(null);
// 26704
f920654002_458.returns.push(null);
// 26710
f920654002_458.returns.push(null);
// 26716
f920654002_458.returns.push(null);
// 26722
f920654002_458.returns.push(null);
// 26728
f920654002_458.returns.push(null);
// 26733
o50.JSBNG__screenX = 985;
// 26734
o50.JSBNG__screenY = 550;
// 26735
o50.altKey = false;
// 26736
o50.bubbles = true;
// 26737
o50.button = 0;
// 26738
o50.buttons = void 0;
// 26739
o50.cancelable = false;
// 26740
o50.clientX = 906;
// 26741
o50.clientY = 456;
// 26742
o50.ctrlKey = false;
// 26743
o50.currentTarget = o0;
// 26744
o50.defaultPrevented = false;
// 26745
o50.detail = 0;
// 26746
o50.eventPhase = 3;
// 26747
o50.isTrusted = void 0;
// 26748
o50.metaKey = false;
// 26749
o50.pageX = 906;
// 26750
o50.pageY = 2239;
// 26751
o50.relatedTarget = null;
// 26752
o50.fromElement = null;
// 26755
o50.shiftKey = false;
// 26758
o50.timeStamp = 1373492022550;
// 26759
o50.type = "mousemove";
// 26760
o50.view = ow920654002;
// undefined
o50 = null;
// 26769
f920654002_1639.returns.push(undefined);
// 26772
f920654002_14.returns.push(undefined);
// 26773
f920654002_12.returns.push(1310);
// 26776
o50 = {};
// 26779
o50.cancelBubble = false;
// 26782
o50.returnValue = true;
// 26785
o50.srcElement = o16;
// 26787
o50.target = o16;
// 26794
f920654002_458.returns.push(null);
// 26800
f920654002_458.returns.push(null);
// 26805
o50.JSBNG__location = void 0;
// 26806
o50.altKey = false;
// 26807
o50.bubbles = true;
// 26808
o50.cancelable = true;
// 26809
o50.char = void 0;
// 26810
o50.charCode = 0;
// 26811
o50.ctrlKey = false;
// 26812
o50.currentTarget = o0;
// 26813
o50.defaultPrevented = false;
// 26814
o50.detail = 0;
// 26815
o50.eventPhase = 3;
// 26816
o50.isTrusted = void 0;
// 26817
o50.key = void 0;
// 26818
o50.keyCode = 13;
// 26819
o50.locale = void 0;
// 26820
o50.location = void 0;
// 26821
o50.metaKey = false;
// 26822
o50.repeat = void 0;
// 26823
o50.shiftKey = false;
// 26826
o50.timeStamp = 1373492023217;
// 26827
o50.type = "keyup";
// 26828
o50.view = ow920654002;
// 26829
o50.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 26846
f920654002_418.returns.push(1373492023227);
// 26847
o51 = {};
// 26851
f920654002_418.returns.push(1373492023262);
// 26856
f920654002_418.returns.push(1373492023263);
// 26860
f920654002_418.returns.push(1373492023264);
// 26862
o51.cancelBubble = false;
// 26863
o51.returnValue = true;
// 26866
o51.srcElement = o64;
// 26868
o51.target = o64;
// 26875
f920654002_458.returns.push(null);
// 26881
f920654002_458.returns.push(null);
// 26887
f920654002_458.returns.push(null);
// 26893
f920654002_458.returns.push(null);
// 26899
f920654002_458.returns.push(null);
// 26905
f920654002_458.returns.push(null);
// 26911
f920654002_458.returns.push(null);
// 26917
f920654002_458.returns.push(null);
// 26922
o51.JSBNG__screenX = 989;
// 26923
o51.JSBNG__screenY = 550;
// 26924
o51.altKey = false;
// 26925
o51.bubbles = true;
// 26926
o51.button = 0;
// 26927
o51.buttons = void 0;
// 26928
o51.cancelable = false;
// 26929
o51.clientX = 910;
// 26930
o51.clientY = 456;
// 26931
o51.ctrlKey = false;
// 26932
o51.currentTarget = o0;
// 26933
o51.defaultPrevented = false;
// 26934
o51.detail = 0;
// 26935
o51.eventPhase = 3;
// 26936
o51.isTrusted = void 0;
// 26937
o51.metaKey = false;
// 26938
o51.pageX = 910;
// 26939
o51.pageY = 2239;
// 26940
o51.relatedTarget = null;
// 26941
o51.fromElement = null;
// 26944
o51.shiftKey = false;
// 26947
o51.timeStamp = 1373492023262;
// 26948
o51.type = "mousemove";
// 26949
o51.view = ow920654002;
// undefined
o51 = null;
// 26958
f920654002_1639.returns.push(undefined);
// 26961
f920654002_14.returns.push(undefined);
// 26962
f920654002_12.returns.push(1311);
// 26965
o51 = {};
// 26969
f920654002_418.returns.push(1373492023741);
// 26970
o51.cancelBubble = false;
// 26971
o51.returnValue = true;
// 26974
o51.srcElement = o64;
// 26976
o51.target = o64;
// 26983
f920654002_458.returns.push(null);
// 26989
f920654002_458.returns.push(null);
// 26995
f920654002_458.returns.push(null);
// 27001
f920654002_458.returns.push(null);
// 27007
f920654002_458.returns.push(null);
// 27013
f920654002_458.returns.push(null);
// 27019
f920654002_458.returns.push(null);
// 27025
f920654002_458.returns.push(null);
// 27030
o51.JSBNG__screenX = 1000;
// 27031
o51.JSBNG__screenY = 549;
// 27032
o51.altKey = false;
// 27033
o51.bubbles = true;
// 27034
o51.button = 0;
// 27035
o51.buttons = void 0;
// 27036
o51.cancelable = false;
// 27037
o51.clientX = 921;
// 27038
o51.clientY = 455;
// 27039
o51.ctrlKey = false;
// 27040
o51.currentTarget = o0;
// 27041
o51.defaultPrevented = false;
// 27042
o51.detail = 0;
// 27043
o51.eventPhase = 3;
// 27044
o51.isTrusted = void 0;
// 27045
o51.metaKey = false;
// 27046
o51.pageX = 921;
// 27047
o51.pageY = 2238;
// 27048
o51.relatedTarget = null;
// 27049
o51.fromElement = null;
// 27052
o51.shiftKey = false;
// 27055
o51.timeStamp = 1373492023740;
// 27056
o51.type = "mousemove";
// 27057
o51.view = ow920654002;
// undefined
o51 = null;
// 27066
f920654002_1639.returns.push(undefined);
// 27069
f920654002_14.returns.push(undefined);
// 27070
f920654002_12.returns.push(1312);
// 27073
o51 = {};
// 27076
o51.cancelBubble = false;
// 27079
o51.returnValue = true;
// 27082
o51.srcElement = o16;
// 27084
o51.target = o16;
// 27091
f920654002_458.returns.push(null);
// 27097
f920654002_458.returns.push(null);
// 27102
o51.JSBNG__location = void 0;
// 27103
o51.altKey = false;
// 27104
o51.bubbles = true;
// 27105
o51.cancelable = true;
// 27106
o51.char = void 0;
// 27107
o51.charCode = 0;
// 27108
o51.ctrlKey = false;
// 27109
o51.currentTarget = o0;
// 27110
o51.defaultPrevented = false;
// 27111
o51.detail = 0;
// 27112
o51.eventPhase = 3;
// 27113
o51.isTrusted = void 0;
// 27114
o51.key = void 0;
// 27115
o51.keyCode = 13;
// 27116
o51.locale = void 0;
// 27117
o51.location = void 0;
// 27118
o51.metaKey = false;
// 27119
o51.repeat = void 0;
// 27120
o51.shiftKey = false;
// 27123
o51.timeStamp = 1373492024276;
// 27124
o51.type = "keyup";
// 27125
o51.view = ow920654002;
// 27126
o51.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27143
f920654002_12.returns.push(1313);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27146
o53 = {};
// 27149
o53.cancelBubble = false;
// 27152
o53.returnValue = true;
// 27155
o53.srcElement = o16;
// 27157
o53.target = o16;
// 27164
f920654002_458.returns.push(null);
// 27170
f920654002_458.returns.push(null);
// 27175
o53.JSBNG__location = void 0;
// 27176
o53.altKey = false;
// 27177
o53.bubbles = true;
// 27178
o53.cancelable = true;
// 27179
o53.char = void 0;
// 27180
o53.charCode = 0;
// 27181
o53.ctrlKey = false;
// 27182
o53.currentTarget = o0;
// 27183
o53.defaultPrevented = false;
// 27184
o53.detail = 0;
// 27185
o53.eventPhase = 3;
// 27186
o53.isTrusted = void 0;
// 27187
o53.key = void 0;
// 27188
o53.keyCode = 13;
// 27189
o53.locale = void 0;
// 27190
o53.location = void 0;
// 27191
o53.metaKey = false;
// 27192
o53.repeat = void 0;
// 27193
o53.shiftKey = false;
// 27196
o53.timeStamp = 1373492024873;
// 27197
o53.type = "keyup";
// 27198
o53.view = ow920654002;
// 27199
o53.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27218
f920654002_418.returns.push(1373492025579);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27222
f920654002_12.returns.push(1314);
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27225
o119 = {};
// 27228
o119.cancelBubble = false;
// 27231
o119.returnValue = true;
// 27234
o119.srcElement = o16;
// 27236
o119.target = o16;
// 27243
f920654002_458.returns.push(null);
// 27249
f920654002_458.returns.push(null);
// 27254
o119.JSBNG__location = void 0;
// 27255
o119.altKey = false;
// 27256
o119.bubbles = true;
// 27257
o119.cancelable = true;
// 27258
o119.char = void 0;
// 27259
o119.charCode = 0;
// 27260
o119.ctrlKey = false;
// 27261
o119.currentTarget = o0;
// 27262
o119.defaultPrevented = false;
// 27263
o119.detail = 0;
// 27264
o119.eventPhase = 3;
// 27265
o119.isTrusted = void 0;
// 27266
o119.key = void 0;
// 27267
o119.keyCode = 13;
// 27268
o119.locale = void 0;
// 27269
o119.location = void 0;
// 27270
o119.metaKey = false;
// 27271
o119.repeat = void 0;
// 27272
o119.shiftKey = false;
// 27275
o119.timeStamp = 1373492028156;
// 27276
o119.type = "keyup";
// 27277
o119.view = ow920654002;
// 27278
o119.which = 13;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27297
f920654002_418.returns.push(1373492028886);
// 27298
o120 = {};
// 27301
o120.srcElement = o64;
// 27303
o120.target = o64;
// undefined
o64 = null;
// 27310
f920654002_458.returns.push(null);
// 27316
f920654002_458.returns.push(null);
// 27322
f920654002_458.returns.push(null);
// 27328
f920654002_458.returns.push(null);
// 27334
f920654002_458.returns.push(null);
// 27340
f920654002_458.returns.push(null);
// 27346
f920654002_458.returns.push(null);
// 27352
f920654002_458.returns.push(null);
// 27357
o120.relatedTarget = null;
// 27358
o120.toElement = null;
// 27359
o120.cancelBubble = false;
// 27360
o120.returnValue = true;
// undefined
o120 = null;
// 27361
o64 = {};
// 27364
o64.srcElement = o16;
// 27365
o64.target = o16;
// 27366
o64.keyCode = 87;
// 27367
o64.shiftKey = false;
// 27369
o64.cancelBubble = false;
// 27376
f920654002_418.returns.push(1373492029039);
// 27381
f920654002_418.returns.push(1373492029040);
// 27385
f920654002_418.returns.push(1373492029040);
// 27388
o64.returnValue = true;
// 27400
f920654002_458.returns.push(null);
// 27406
f920654002_458.returns.push(null);
// 27411
o64.JSBNG__location = void 0;
// 27412
o64.altKey = false;
// 27413
o64.bubbles = true;
// 27414
o64.cancelable = true;
// 27415
o64.char = void 0;
// 27416
o64.charCode = 0;
// 27417
o64.ctrlKey = false;
// 27418
o64.currentTarget = o0;
// 27419
o64.defaultPrevented = false;
// 27420
o64.detail = 0;
// 27421
o64.eventPhase = 3;
// 27422
o64.isTrusted = void 0;
// 27423
o64.key = void 0;
// 27425
o64.locale = void 0;
// 27426
o64.location = void 0;
// 27427
o64.metaKey = true;
// 27428
o64.repeat = void 0;
// 27432
o64.timeStamp = 1373492029034;
// 27433
o64.type = "keydown";
// 27434
o64.view = ow920654002;
// 27435
o64.which = 87;
// 27445
o25["87"] = void 0;
// 27449
o120 = {};
// 27452
o120.srcElement = o16;
// 27454
o120.target = o16;
// undefined
o16 = null;
// 27461
f920654002_458.returns.push(null);
// 27467
f920654002_458.returns.push(null);
// 27472
o120.JSBNG__location = void 0;
// 27473
o120.altKey = false;
// 27474
o120.bubbles = true;
// 27475
o120.cancelable = true;
// 27476
o120.char = void 0;
// 27477
o120.charCode = 119;
// 27478
o120.ctrlKey = false;
// 27479
o120.currentTarget = o0;
// 27480
o120.defaultPrevented = false;
// 27481
o120.detail = 0;
// 27482
o120.eventPhase = 3;
// 27483
o120.isTrusted = void 0;
// 27484
o120.key = void 0;
// 27485
o120.keyCode = 119;
// 27486
o120.locale = void 0;
// 27487
o120.location = void 0;
// 27488
o120.metaKey = true;
// 27489
o120.repeat = void 0;
// 27490
o120.shiftKey = false;
// 27493
o120.timeStamp = 1373492029048;
// 27494
o120.type = "keypress";
// 27495
o120.view = ow920654002;
// 27496
o120.which = 119;
// 27498
o120.returnValue = true;
// 27501
o120.cancelBubble = false;
// 27506
o25["119"] = void 0;
// undefined
o25 = null;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27512
o16 = {};
// 27518
// 27520
f920654002_14.returns.push(undefined);
// 27521
o25 = {};
// 27524
f920654002_2006.returns.push(undefined);
// 27525
o25.cancelBubble = false;
// undefined
fo920654002_1_cookie.returns.push("sub=536870912; p=89; act=1373491904036%2F4; c_user=100006118350059; csm=2");
// 27529
// 27531
o25.returnValue = true;
// undefined
o25 = null;
// 27532
// 0
JSBNG_Replay$ = function(real, cb) { if (!real) return;
// 867
geval("function envFlush(a) {\n    function b(c) {\n        {\n            var fin0keys = ((window.top.JSBNG_Replay.forInKeys)((a))), fin0i = (0);\n            var d;\n            for (; (fin0i < fin0keys.length); (fin0i++)) {\n                ((d) = (fin0keys[fin0i]));\n                {\n                    c[d] = a[d];\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    if (window.requireLazy) {\n        requireLazy([\"Env\",], b);\n    }\n     else {\n        Env = ((window.Env || {\n        }));\n        b(Env);\n    }\n;\n;\n};\n;\nenvFlush({\n    user: \"100006118350059\",\n    locale: \"en_US\",\n    method: \"GET\",\n    svn_rev: 871405,\n    tier: \"\",\n    push_phase: \"V3\",\n    pkg_cohort: \"EXP1:DEFAULT\",\n    vip: \"69.171.242.27\",\n    www_base: \"http://jsbngssl.www.facebook.com/\",\n    fb_dtsg: \"AQCttlPQ\",\n    ajaxpipe_token: \"AXg1MJsj67jxFeGx\",\n    lhsh: \"3AQHFDLCV\",\n    tracking_domain: \"http://jsbngssl.pixel.facebook.com\",\n    cookie_header_limit: 2000,\n    retry_ajax_on_network_error: \"1\",\n    fbid_emoticons: \"1\"\n});");
// 868
geval("envFlush({\n    eagleEyeConfig: {\n        seed: \"07Rs\",\n        JSBNG__sessionStorage: true\n    }\n});\nCavalryLogger = false;");
// 869
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"FHcQn\",]);\n}\n;\n;\nJSBNG__self.__DEV__ = ((JSBNG__self.__DEV__ || 0));\nif (((JSON.stringify([\"\\u2028\\u2029\",]) === \"[\\\"\\u2028\\u2029\\\"]\"))) {\n    JSON.stringify = function(a) {\n        var b = /\\u2028/g, c = /\\u2029/g;\n        return ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1), function(d, e, f) {\n            var g = a.call(this, d, e, f);\n            if (g) {\n                if (((-1 < g.indexOf(\"\\u2028\")))) {\n                    g = g.replace(b, \"\\\\u2028\");\n                }\n            ;\n            ;\n                if (((-1 < g.indexOf(\"\\u2029\")))) {\n                    g = g.replace(c, \"\\\\u2029\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return g;\n        }));\n    }(JSON.stringify);\n}\n;\n;\nvar __t = function(a) {\n    return a[0];\n}, __w = function(a) {\n    return a;\n};\n(function(a) {\n    if (a.require) {\n        return;\n    }\n;\n;\n    var b = Object.prototype.toString, c = {\n    }, d = {\n    }, e = {\n    }, f = 0, g = 1, h = 2, i = Object.prototype.hasOwnProperty;\n    function j(s) {\n        if (((a.ErrorUtils && !a.ErrorUtils.inGuard()))) {\n            return ErrorUtils.applyWithGuard(j, this, arguments);\n        }\n    ;\n    ;\n        var t = c[s], u, v, w;\n        if (!c[s]) {\n            w = ((((\"Requiring unknown module \\\"\" + s)) + \"\\\"\"));\n            throw new Error(w);\n        }\n    ;\n    ;\n        if (t.hasError) {\n            throw new Error(((((\"Requiring module \\\"\" + s)) + \"\\\" which threw an exception\")));\n        }\n    ;\n    ;\n        if (t.waiting) {\n            w = ((((\"Requiring module \\\"\" + s)) + \"\\\" with unresolved dependencies\"));\n            throw new Error(w);\n        }\n    ;\n    ;\n        if (!t.exports) {\n            var x = t.exports = {\n            }, y = t.factory;\n            if (((b.call(y) === \"[object Function]\"))) {\n                var z = [], aa = t.dependencies, ba = aa.length, ca;\n                if (((t.special & h))) {\n                    ba = Math.min(ba, y.length);\n                }\n            ;\n            ;\n                try {\n                    for (v = 0; ((v < ba)); v++) {\n                        u = aa[v];\n                        z.push(((((u === \"module\")) ? t : ((((u === \"exports\")) ? x : j(u))))));\n                    };\n                ;\n                    ca = y.apply(((t.context || a)), z);\n                } catch (da) {\n                    t.hasError = true;\n                    throw da;\n                };\n            ;\n                if (ca) {\n                    t.exports = ca;\n                }\n            ;\n            ;\n            }\n             else t.exports = y;\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((t.refcount-- === 1))) {\n            delete c[s];\n        }\n    ;\n    ;\n        return t.exports;\n    };\n;\n    function k(s, t, u, v, w, x) {\n        if (((t === undefined))) {\n            t = [];\n            u = s;\n            s = n();\n        }\n         else if (((u === undefined))) {\n            u = t;\n            if (((b.call(s) === \"[object Array]\"))) {\n                t = s;\n                s = n();\n            }\n             else t = [];\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        var y = {\n            cancel: l.bind(this, s)\n        }, z = c[s];\n        if (z) {\n            if (x) {\n                z.refcount += x;\n            }\n        ;\n        ;\n            return y;\n        }\n         else if (((((!t && !u)) && x))) {\n            e[s] = ((((e[s] || 0)) + x));\n            return y;\n        }\n         else {\n            z = {\n                id: s\n            };\n            z.refcount = ((((e[s] || 0)) + ((x || 0))));\n            delete e[s];\n        }\n        \n    ;\n    ;\n        z.factory = u;\n        z.dependencies = t;\n        z.context = w;\n        z.special = v;\n        z.waitingMap = {\n        };\n        z.waiting = 0;\n        z.hasError = false;\n        c[s] = z;\n        p(s);\n        return y;\n    };\n;\n    function l(s) {\n        if (!c[s]) {\n            return;\n        }\n    ;\n    ;\n        var t = c[s];\n        delete c[s];\n        {\n            var fin1keys = ((window.top.JSBNG_Replay.forInKeys)((t.waitingMap))), fin1i = (0);\n            var u;\n            for (; (fin1i < fin1keys.length); (fin1i++)) {\n                ((u) = (fin1keys[fin1i]));\n                {\n                    if (t.waitingMap[u]) {\n                        delete d[u][s];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        for (var v = 0; ((v < t.dependencies.length)); v++) {\n            u = t.dependencies[v];\n            if (c[u]) {\n                if (((c[u].refcount-- === 1))) {\n                    l(u);\n                }\n            ;\n            ;\n            }\n             else if (e[u]) {\n                e[u]--;\n            }\n            \n        ;\n        ;\n        };\n    ;\n    };\n;\n    function m(s, t, u) {\n        return k(s, t, undefined, g, u, 1);\n    };\n;\n    function n() {\n        return ((\"__mod__\" + f++));\n    };\n;\n    function o(s, t) {\n        if (((!s.waitingMap[t] && ((s.id !== t))))) {\n            s.waiting++;\n            s.waitingMap[t] = 1;\n            ((d[t] || (d[t] = {\n            })));\n            d[t][s.id] = 1;\n        }\n    ;\n    ;\n    };\n;\n    function p(s) {\n        var t = [], u = c[s], v, w, x;\n        for (w = 0; ((w < u.dependencies.length)); w++) {\n            v = u.dependencies[w];\n            if (!c[v]) {\n                o(u, v);\n            }\n             else if (c[v].waiting) {\n                {\n                    var fin2keys = ((window.top.JSBNG_Replay.forInKeys)((c[v].waitingMap))), fin2i = (0);\n                    (0);\n                    for (; (fin2i < fin2keys.length); (fin2i++)) {\n                        ((x) = (fin2keys[fin2i]));\n                        {\n                            if (c[v].waitingMap[x]) {\n                                o(u, x);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (((((u.waiting === 0)) && ((u.special & g))))) {\n            t.push(s);\n        }\n    ;\n    ;\n        if (d[s]) {\n            var y = d[s], z;\n            d[s] = undefined;\n            {\n                var fin3keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin3i = (0);\n                (0);\n                for (; (fin3i < fin3keys.length); (fin3i++)) {\n                    ((v) = (fin3keys[fin3i]));\n                    {\n                        z = c[v];\n                        {\n                            var fin4keys = ((window.top.JSBNG_Replay.forInKeys)((u.waitingMap))), fin4i = (0);\n                            (0);\n                            for (; (fin4i < fin4keys.length); (fin4i++)) {\n                                ((x) = (fin4keys[fin4i]));\n                                {\n                                    if (u.waitingMap[x]) {\n                                        o(z, x);\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                        if (z.waitingMap[s]) {\n                            z.waitingMap[s] = undefined;\n                            z.waiting--;\n                        }\n                    ;\n                    ;\n                        if (((((z.waiting === 0)) && ((z.special & g))))) {\n                            t.push(v);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        for (w = 0; ((w < t.length)); w++) {\n            j(t[w]);\n        ;\n        };\n    ;\n    };\n;\n    function q(s, t) {\n        c[s] = {\n            id: s\n        };\n        c[s].exports = t;\n    };\n;\n    q(\"module\", 0);\n    q(\"exports\", 0);\n    q(\"define\", k);\n    q(\"global\", a);\n    q(\"require\", j);\n    q(\"requireDynamic\", j);\n    q(\"requireLazy\", m);\n    k.amd = {\n    };\n    a.define = k;\n    a.require = j;\n    a.requireDynamic = j;\n    a.requireLazy = m;\n    j.__debug = {\n        modules: c,\n        deps: d\n    };\n    var r = function(s, t, u, v) {\n        k(s, t, u, ((v || h)));\n    };\n    a.__d = function(s, t, u, v) {\n        t = [\"global\",\"require\",\"requireDynamic\",\"requireLazy\",\"module\",\"exports\",].concat(t);\n        r(s, t, u, v);\n    };\n})(this);\n__d(\"SidebarPrelude\", [], function(a, b, c, d, e, f) {\n    var g = {\n        addSidebarMode: function(h) {\n            var i = JSBNG__document.documentElement;\n            if (((i.clientWidth > h))) {\n                i.className = ((i.className + \" sidebarMode\"));\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"eprintf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i = Array.prototype.slice.call(arguments).map(function(l) {\n            return String(l);\n        }), j = ((h.split(\"%s\").length - 1));\n        if (((j !== ((i.length - 1))))) {\n            return g(\"eprintf args number mismatch: %s\", JSON.stringify(i));\n        }\n    ;\n    ;\n        var k = 1;\n        return h.replace(/%s/g, function(l) {\n            return String(i[k++]);\n        });\n    };\n    e.exports = g;\n});\n__d(\"ex\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i = Array.prototype.slice.call(arguments).map(function(k) {\n            return String(k);\n        }), j = ((h.split(\"%s\").length - 1));\n        if (((j !== ((i.length - 1))))) {\n            return g(\"ex args number mismatch: %s\", JSON.stringify(i));\n        }\n    ;\n    ;\n        return ((((g._prefix + JSON.stringify(i))) + g._suffix));\n    };\n    g._prefix = \"\\u003C![EX[\";\n    g._suffix = \"]]\\u003E\";\n    e.exports = g;\n});\n__d(\"erx\", [\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"ex\"), h = function(i) {\n        if (((typeof i !== \"string\"))) {\n            return i;\n        }\n    ;\n    ;\n        var j = i.indexOf(g._prefix), k = i.lastIndexOf(g._suffix);\n        if (((((j < 0)) || ((k < 0))))) {\n            return [i,];\n        }\n    ;\n    ;\n        var l = ((j + g._prefix.length)), m = ((k + g._suffix.length));\n        if (((l >= k))) {\n            return [\"erx slice failure: %s\",i,];\n        }\n    ;\n    ;\n        var n = i.substring(0, j), o = i.substring(m);\n        i = i.substring(l, k);\n        var p;\n        try {\n            p = JSON.parse(i);\n            p[0] = ((((n + p[0])) + o));\n        } catch (q) {\n            return [\"erx parse failure: %s\",i,];\n        };\n    ;\n        return p;\n    };\n    e.exports = h;\n});\n__d(\"copyProperties\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n) {\n        h = ((h || {\n        }));\n        var o = [i,j,k,l,m,], p = 0, q;\n        while (o[p]) {\n            q = o[p++];\n            {\n                var fin5keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin5i = (0);\n                var r;\n                for (; (fin5i < fin5keys.length); (fin5i++)) {\n                    ((r) = (fin5keys[fin5i]));\n                    {\n                        h[r] = q[r];\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((((((q.hasOwnProperty && q.hasOwnProperty(\"toString\"))) && ((typeof q.toString != \"undefined\")))) && ((h.toString !== q.toString))))) {\n                h.toString = q.toString;\n            }\n        ;\n        ;\n        };\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"Env\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        start: JSBNG__Date.now()\n    };\n    if (a.Env) {\n        g(h, a.Env);\n        a.Env = undefined;\n    }\n;\n;\n    e.exports = h;\n});\n__d(\"ErrorUtils\", [\"eprintf\",\"erx\",\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"eprintf\"), h = b(\"erx\"), i = b(\"Env\"), j = \"\\u003Canonymous guard\\u003E\", k = \"\\u003Cgenerated guard\\u003E\", l = \"\\u003Cwindow.onerror\\u003E\", m = [], n = [], o = 50, p = ((window.chrome && ((\"type\" in new Error())))), q = false;\n    function r(da) {\n        if (!da) {\n            return;\n        }\n    ;\n    ;\n        var ea = da.split(/\\n\\n/)[0].replace(/[\\(\\)]|\\[.*?\\]|^\\w+:\\s.*?\\n/g, \"\").split(\"\\u000a\").map(function(fa) {\n            var ga, ha, ia;\n            fa = fa.trim();\n            if (/(:(\\d+)(:(\\d+))?)$/.test(fa)) {\n                ha = RegExp.$2;\n                ia = RegExp.$4;\n                fa = fa.slice(0, -RegExp.$1.length);\n            }\n        ;\n        ;\n            if (/(.*)(@|\\s)[^\\s]+$/.test(fa)) {\n                fa = fa.substring(((RegExp.$1.length + 1)));\n                ga = ((/(at)?\\s*(.*)([^\\s]+|$)/.test(RegExp.$1) ? RegExp.$2 : \"\"));\n            }\n        ;\n        ;\n            return ((((((((((\"    at\" + ((ga ? ((((\" \" + ga)) + \" (\")) : \" \")))) + fa.replace(/^@/, \"\"))) + ((ha ? ((\":\" + ha)) : \"\")))) + ((ia ? ((\":\" + ia)) : \"\")))) + ((ga ? \")\" : \"\"))));\n        });\n        return ea.join(\"\\u000a\");\n    };\n;\n    function s(da) {\n        if (!da) {\n            return {\n            };\n        }\n         else if (da._originalError) {\n            return da;\n        }\n        \n    ;\n    ;\n        var ea = {\n            line: ((da.lineNumber || da.line)),\n            column: ((da.columnNumber || da.column)),\n            JSBNG__name: da.JSBNG__name,\n            message: da.message,\n            script: ((((da.fileName || da.sourceURL)) || da.script)),\n            stack: r(((da.stackTrace || da.stack))),\n            guard: da.guard\n        };\n        if (((typeof ea.message === \"string\"))) {\n            ea.messageWithParams = h(ea.message);\n            ea.message = g.apply(a, ea.messageWithParams);\n        }\n         else {\n            ea.messageObject = ea.message;\n            ea.message = String(ea.message);\n        }\n    ;\n    ;\n        ea._originalError = da;\n        if (((da.framesToPop && ea.stack))) {\n            var fa = ea.stack.split(\"\\u000a\");\n            fa.shift();\n            if (((da.framesToPop === 2))) {\n                da.message += ((\" \" + fa.shift().trim()));\n            }\n        ;\n        ;\n            ea.stack = fa.join(\"\\u000a\");\n            if (/(\\w{3,5}:\\/\\/[^:]+):(\\d+)/.test(fa[0])) {\n                ea.script = RegExp.$1;\n                ea.line = parseInt(RegExp.$2, 10);\n            }\n        ;\n        ;\n            delete da.framesToPop;\n        }\n    ;\n    ;\n        if (((p && /(\\w{3,5}:\\/\\/[^:]+):(\\d+)/.test(da.stack)))) {\n            ea.script = RegExp.$1;\n            ea.line = parseInt(RegExp.$2, 10);\n        }\n    ;\n    ;\n        {\n            var fin6keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin6i = (0);\n            var ga;\n            for (; (fin6i < fin6keys.length); (fin6i++)) {\n                ((ga) = (fin6keys[fin6i]));\n                {\n                    ((((ea[ga] == null)) && delete ea[ga]));\n                ;\n                };\n            };\n        };\n    ;\n        return ea;\n    };\n;\n    function t() {\n        try {\n            throw new Error();\n        } catch (da) {\n            var ea = s(da).stack;\n            return ((ea && ea.replace(/[\\s\\S]*__getTrace__.*\\n/, \"\")));\n        };\n    ;\n    };\n;\n    function u(da, ea) {\n        if (q) {\n            return;\n        }\n    ;\n    ;\n        da = s(da);\n        !ea;\n        if (((n.length > o))) {\n            n.splice(((o / 2)), 1);\n        }\n    ;\n    ;\n        n.push(da);\n        q = true;\n        for (var fa = 0; ((fa < m.length)); fa++) {\n            try {\n                m[fa](da);\n            } catch (ga) {\n            \n            };\n        ;\n        };\n    ;\n        q = false;\n    };\n;\n    var v = false;\n    function w() {\n        return v;\n    };\n;\n    function x() {\n        v = false;\n    };\n;\n    function y(da, ea, fa, ga, ha) {\n        var ia = !v;\n        if (ia) {\n            v = true;\n        }\n    ;\n    ;\n        var ja, ka = ((i.nocatch || (/nocatch/).test(JSBNG__location.search)));\n        if (ka) {\n            ja = da.apply(ea, ((fa || [])));\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            return ja;\n        }\n    ;\n    ;\n        try {\n            ja = da.apply(ea, ((fa || [])));\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            return ja;\n        } catch (la) {\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            var ma = s(la);\n            if (ga) {\n                ga(ma);\n            }\n        ;\n        ;\n            if (da) {\n                ma.callee = da.toString().substring(0, 100);\n            }\n        ;\n        ;\n            if (fa) {\n                ma.args = String(fa).substring(0, 100);\n            }\n        ;\n        ;\n            ma.guard = ((ha || j));\n            u(ma);\n        };\n    ;\n    };\n;\n    function z(da, ea) {\n        ea = ((((ea || da.JSBNG__name)) || k));\n        function fa() {\n            return y(da, this, arguments, null, ea);\n        };\n    ;\n        return fa;\n    };\n;\n    function aa(da, ea, fa, ga) {\n        u({\n            message: da,\n            script: ea,\n            line: fa,\n            column: ga,\n            guard: l\n        }, true);\n    };\n;\n    window.JSBNG__onerror = aa;\n    function ba(da, ea) {\n        m.push(da);\n        if (!ea) {\n            n.forEach(da);\n        }\n    ;\n    ;\n    };\n;\n    var ca = {\n        ANONYMOUS_GUARD_TAG: j,\n        GENERATED_GUARD_TAG: k,\n        GLOBAL_ERROR_HANDLER_TAG: l,\n        addListener: ba,\n        applyWithGuard: y,\n        getTrace: t,\n        guard: z,\n        JSBNG__history: n,\n        inGuard: w,\n        normalizeError: s,\n        JSBNG__onerror: aa,\n        reportError: u\n    };\n    e.exports = a.ErrorUtils = ca;\n    if (((((typeof __t === \"function\")) && __t.setHandler))) {\n        __t.setHandler(u);\n    }\n;\n;\n});\n__d(\"CallbackDependencyManager\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\");\n    function h() {\n        this.$CallbackDependencyManager0 = {\n        };\n        this.$CallbackDependencyManager1 = {\n        };\n        this.$CallbackDependencyManager2 = 1;\n        this.$CallbackDependencyManager3 = {\n        };\n    };\n;\n    h.prototype.$CallbackDependencyManager4 = function(i, j) {\n        var k = 0, l = {\n        };\n        for (var m = 0, n = j.length; ((m < n)); m++) {\n            l[j[m]] = 1;\n        ;\n        };\n    ;\n        {\n            var fin7keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin7i = (0);\n            var o;\n            for (; (fin7i < fin7keys.length); (fin7i++)) {\n                ((o) = (fin7keys[fin7i]));\n                {\n                    if (this.$CallbackDependencyManager3[o]) {\n                        continue;\n                    }\n                ;\n                ;\n                    k++;\n                    if (((this.$CallbackDependencyManager0[o] === undefined))) {\n                        this.$CallbackDependencyManager0[o] = {\n                        };\n                    }\n                ;\n                ;\n                    this.$CallbackDependencyManager0[o][i] = ((((this.$CallbackDependencyManager0[o][i] || 0)) + 1));\n                };\n            };\n        };\n    ;\n        return k;\n    };\n    h.prototype.$CallbackDependencyManager5 = function(i) {\n        if (!this.$CallbackDependencyManager0[i]) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin8keys = ((window.top.JSBNG_Replay.forInKeys)((this.$CallbackDependencyManager0[i]))), fin8i = (0);\n            var j;\n            for (; (fin8i < fin8keys.length); (fin8i++)) {\n                ((j) = (fin8keys[fin8i]));\n                {\n                    this.$CallbackDependencyManager0[i][j]--;\n                    if (((this.$CallbackDependencyManager0[i][j] <= 0))) {\n                        delete this.$CallbackDependencyManager0[i][j];\n                    }\n                ;\n                ;\n                    this.$CallbackDependencyManager1[j].$CallbackDependencyManager6--;\n                    if (((this.$CallbackDependencyManager1[j].$CallbackDependencyManager6 <= 0))) {\n                        var k = this.$CallbackDependencyManager1[j].$CallbackDependencyManager7;\n                        delete this.$CallbackDependencyManager1[j];\n                        g.applyWithGuard(k);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n    h.prototype.addDependenciesToExistingCallback = function(i, j) {\n        if (!this.$CallbackDependencyManager1[i]) {\n            return null;\n        }\n    ;\n    ;\n        var k = this.$CallbackDependencyManager4(i, j);\n        this.$CallbackDependencyManager1[i].$CallbackDependencyManager6 += k;\n        return i;\n    };\n    h.prototype.isPersistentDependencySatisfied = function(i) {\n        return !!this.$CallbackDependencyManager3[i];\n    };\n    h.prototype.satisfyPersistentDependency = function(i) {\n        this.$CallbackDependencyManager3[i] = 1;\n        this.$CallbackDependencyManager5(i);\n    };\n    h.prototype.satisfyNonPersistentDependency = function(i) {\n        var j = ((this.$CallbackDependencyManager3[i] === 1));\n        if (!j) {\n            this.$CallbackDependencyManager3[i] = 1;\n        }\n    ;\n    ;\n        this.$CallbackDependencyManager5(i);\n        if (!j) {\n            delete this.$CallbackDependencyManager3[i];\n        }\n    ;\n    ;\n    };\n    h.prototype.registerCallback = function(i, j) {\n        var k = this.$CallbackDependencyManager2;\n        this.$CallbackDependencyManager2++;\n        var l = this.$CallbackDependencyManager4(k, j);\n        if (((l === 0))) {\n            g.applyWithGuard(i);\n            return null;\n        }\n    ;\n    ;\n        this.$CallbackDependencyManager1[k] = {\n            $CallbackDependencyManager7: i,\n            $CallbackDependencyManager6: l\n        };\n        return k;\n    };\n    h.prototype.unsatisfyPersistentDependency = function(i) {\n        delete this.$CallbackDependencyManager3[i];\n    };\n    e.exports = h;\n});\n__d(\"hasArrayNature\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return ((((((((!!h && ((((typeof h == \"object\")) || ((typeof h == \"function\")))))) && ((\"length\" in h)))) && !((\"JSBNG__setInterval\" in h)))) && ((((((Object.prototype.toString.call(h) === \"[object Array]\")) || ((\"callee\" in h)))) || ((\"item\" in h))))));\n    };\n;\n    e.exports = g;\n});\n__d(\"createArrayFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        if (!g(i)) {\n            return [i,];\n        }\n    ;\n    ;\n        if (i.item) {\n            var j = i.length, k = new Array(j);\n            while (j--) {\n                k[j] = i[j];\n            ;\n            };\n        ;\n            return k;\n        }\n    ;\n    ;\n        return Array.prototype.slice.call(i);\n    };\n;\n    e.exports = h;\n});\n__d(\"invariant\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            throw new Error(\"Invariant Violation\");\n        }\n    ;\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"EventEmitter\", [\"createArrayFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"invariant\");\n    function i() {\n        this.$EventEmitter0 = {\n        };\n        this.$EventEmitter1 = {\n        };\n        this.$EventEmitter2 = {\n        };\n    };\n;\n    i.prototype.addListener = function(k, l, m) {\n        if (!this.$EventEmitter0[k]) {\n            this.$EventEmitter0[k] = [];\n        }\n    ;\n    ;\n        var n = this.$EventEmitter0[k].length;\n        this.$EventEmitter0[k].push(l);\n        if (((m !== undefined))) {\n            if (!this.$EventEmitter1[k]) {\n                this.$EventEmitter1[k] = [];\n            }\n        ;\n        ;\n            this.$EventEmitter1[k][n] = m;\n        }\n    ;\n    ;\n        return new j(this, k, n);\n    };\n    i.prototype.once = function(k, l, m) {\n        var n = this;\n        return this.addListener(k, function() {\n            n.removeCurrentListener();\n            l.apply(m, arguments);\n        });\n    };\n    i.prototype.removeAllListeners = function(k) {\n        if (((k === undefined))) {\n            this.$EventEmitter0 = {\n            };\n            this.$EventEmitter1 = {\n            };\n        }\n         else {\n            delete this.$EventEmitter0[k];\n            delete this.$EventEmitter1[k];\n        }\n    ;\n    ;\n    };\n    i.prototype.removeCurrentListener = function() {\n        h(((this.$EventEmitter2.key !== undefined)));\n        this.removeSubscription(this.$EventEmitter2);\n    };\n    i.prototype.removeSubscription = function(k) {\n        var l = k.eventType, m = k.key, n = this.$EventEmitter0[l];\n        if (n) {\n            delete n[m];\n        }\n    ;\n    ;\n        var o = this.$EventEmitter1[l];\n        if (o) {\n            delete o[m];\n        }\n    ;\n    ;\n    };\n    i.prototype.listeners = function(k) {\n        var l = this.$EventEmitter0[k];\n        return ((l ? g(l) : []));\n    };\n    i.prototype.emit = function(k, l, m, n, o, p, q) {\n        h(((q === undefined)));\n        var r = this.$EventEmitter0[k];\n        if (r) {\n            var s = this.$EventEmitter1[k];\n            this.$EventEmitter2.eventType = k;\n            var t = Object.keys(r);\n            for (var u = 0; ((u < t.length)); u++) {\n                var v = t[u], w = r[v];\n                if (w) {\n                    var x = ((s ? s[v] : undefined));\n                    this.$EventEmitter2.key = v;\n                    if (((x === undefined))) {\n                        w(l, m, n, o, p);\n                    }\n                     else w.call(x, l, m, n, o, p);\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            this.$EventEmitter2.eventType = undefined;\n            this.$EventEmitter2.key = undefined;\n        }\n    ;\n    ;\n    };\n    function j(k, l, m) {\n        this.$ListenerSubscription0 = k;\n        this.eventType = l;\n        this.key = m;\n    };\n;\n    j.prototype.remove = function() {\n        this.$ListenerSubscription0.removeSubscription(this);\n    };\n    e.exports = i;\n});\n__d(\"EventEmitterWithHolding\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        this.$EventEmitterWithHolding0 = h;\n        this.$EventEmitterWithHolding1 = i;\n        this.$EventEmitterWithHolding2 = null;\n        this.$EventEmitterWithHolding3 = false;\n    };\n;\n    g.prototype.addListener = function(h, i, j) {\n        return this.$EventEmitterWithHolding0.addListener(h, i, j);\n    };\n    g.prototype.once = function(h, i, j) {\n        return this.$EventEmitterWithHolding0.once(h, i, j);\n    };\n    g.prototype.addRetroactiveListener = function(h, i, j) {\n        var k = this.$EventEmitterWithHolding0.addListener(h, i, j);\n        this.$EventEmitterWithHolding3 = true;\n        this.$EventEmitterWithHolding1.emitToListener(h, i, j);\n        this.$EventEmitterWithHolding3 = false;\n        return k;\n    };\n    g.prototype.removeAllListeners = function(h) {\n        this.$EventEmitterWithHolding0.removeAllListeners(h);\n    };\n    g.prototype.removeCurrentListener = function() {\n        this.$EventEmitterWithHolding0.removeCurrentListener();\n    };\n    g.prototype.removeSubscription = function(h) {\n        this.$EventEmitterWithHolding0.removeSubscription(h);\n    };\n    g.prototype.listeners = function(h) {\n        return this.$EventEmitterWithHolding0.listeners(h);\n    };\n    g.prototype.emit = function(h, i, j, k, l, m, n) {\n        this.$EventEmitterWithHolding0.emit(h, i, j, k, l, m, n);\n    };\n    g.prototype.emitAndHold = function(h, i, j, k, l, m, n) {\n        this.$EventEmitterWithHolding2 = this.$EventEmitterWithHolding1.holdEvent(h, i, j, k, l, m, n);\n        this.$EventEmitterWithHolding0.emit(h, i, j, k, l, m, n);\n        this.$EventEmitterWithHolding2 = null;\n    };\n    g.prototype.releaseCurrentEvent = function() {\n        if (((this.$EventEmitterWithHolding2 !== null))) {\n            this.$EventEmitterWithHolding1.releaseEvent(this.$EventEmitterWithHolding2);\n        }\n         else if (this.$EventEmitterWithHolding3) {\n            this.$EventEmitterWithHolding1.releaseCurrentEvent();\n        }\n        \n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventHolder\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h() {\n        this.$EventHolder0 = [];\n        this.$EventHolder1 = [];\n        this.$EventHolder2 = null;\n    };\n;\n    h.prototype.holdEvent = function(i, j, k, l, m, n, o) {\n        var p = this.$EventHolder0.length, JSBNG__event = [i,j,k,l,m,n,o,];\n        this.$EventHolder0.push(JSBNG__event);\n        return p;\n    };\n    h.prototype.emitToListener = function(i, j, k) {\n        this.forEachHeldEvent(function(l, m, n, o, p, q, r) {\n            if (((l === i))) {\n                j.call(k, m, n, o, p, q, r);\n            }\n        ;\n        ;\n        });\n    };\n    h.prototype.forEachHeldEvent = function(i, j) {\n        this.$EventHolder0.forEach(function(JSBNG__event, k) {\n            this.$EventHolder2 = k;\n            i.apply(j, JSBNG__event);\n        }, this);\n        this.$EventHolder2 = null;\n    };\n    h.prototype.releaseCurrentEvent = function() {\n        g(((this.$EventHolder2 !== null)));\n        delete this.$EventHolder0[this.$EventHolder2];\n    };\n    h.prototype.releaseEvent = function(i) {\n        delete this.$EventHolder0[i];\n    };\n    e.exports = h;\n});\n__d(\"asyncCallback\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if (a.ArbiterMonitor) {\n            return a.ArbiterMonitor.asyncCallback(h, i);\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"emptyFunction\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j) {\n        return function() {\n            return j;\n        };\n    };\n;\n    {\n        function i() {\n        \n        };\n        ((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_96.push)((i)));\n    };\n;\n    g(i, {\n        thatReturns: h,\n        thatReturnsFalse: h(false),\n        thatReturnsTrue: h(true),\n        thatReturnsNull: h(null),\n        thatReturnsThis: function() {\n            return this;\n        },\n        thatReturnsArgument: function(j) {\n            return j;\n        }\n    });\n    e.exports = i;\n});\n__d(\"Arbiter\", [\"CallbackDependencyManager\",\"ErrorUtils\",\"EventEmitter\",\"EventEmitterWithHolding\",\"EventHolder\",\"asyncCallback\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"hasArrayNature\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackDependencyManager\"), h = b(\"ErrorUtils\"), i = b(\"EventEmitter\"), j = b(\"EventEmitterWithHolding\"), k = b(\"EventHolder\"), l = b(\"asyncCallback\"), m = b(\"copyProperties\"), n = b(\"createArrayFrom\"), o = b(\"emptyFunction\"), p = b(\"hasArrayNature\"), q = b(\"invariant\");\n    function r() {\n        var v = new i();\n        this.$Arbiter0 = new t();\n        this.$Arbiter1 = new j(v, this.$Arbiter0);\n        this.$Arbiter2 = new g();\n        this.$Arbiter3 = [];\n    };\n;\n    r.prototype.subscribe = function(v, w, x) {\n        v = n(v);\n        q(v.every(o.thatReturnsArgument));\n        x = ((x || r.SUBSCRIBE_ALL));\n        q(((((x === r.SUBSCRIBE_NEW)) || ((x === r.SUBSCRIBE_ALL)))));\n        var y = v.map(function(z) {\n            var aa = this.$Arbiter4.bind(this, w, z);\n            if (((x === r.SUBSCRIBE_NEW))) {\n                return this.$Arbiter1.addListener(z, aa);\n            }\n        ;\n        ;\n            this.$Arbiter3.push({\n            });\n            var ba = this.$Arbiter1.addRetroactiveListener(z, aa);\n            this.$Arbiter3.pop();\n            return ba;\n        }, this);\n        return new u(this, y);\n    };\n    r.prototype.$Arbiter4 = function(v, w, x) {\n        var y = this.$Arbiter3[((this.$Arbiter3.length - 1))];\n        if (((y[w] === false))) {\n            return;\n        }\n    ;\n    ;\n        var z = h.applyWithGuard(v, null, [w,x,]);\n        if (((z === false))) {\n            this.$Arbiter1.releaseCurrentEvent();\n        }\n    ;\n    ;\n        y[w] = z;\n    };\n    r.prototype.subscribeOnce = function(v, w, x) {\n        var y = this.subscribe(v, function(z, aa) {\n            ((y && y.unsubscribe()));\n            return w(z, aa);\n        }, x);\n        return y;\n    };\n    r.prototype.unsubscribe = function(v) {\n        q(v.isForArbiterInstance(this));\n        v.unsubscribe();\n    };\n    r.prototype.inform = function(v, w, x) {\n        var y = p(v);\n        v = n(v);\n        x = ((x || r.BEHAVIOR_EVENT));\n        var z = ((((x === r.BEHAVIOR_STATE)) || ((x === r.BEHAVIOR_PERSISTENT)))), aa = a.ArbiterMonitor;\n        this.$Arbiter3.push({\n        });\n        for (var ba = 0; ((ba < v.length)); ba++) {\n            var ca = v[ba];\n            q(ca);\n            this.$Arbiter0.setHoldingBehavior(ca, x);\n            ((aa && aa.record(\"JSBNG__event\", ca, w, this)));\n            this.$Arbiter1.emitAndHold(ca, w);\n            this.$Arbiter5(ca, w, z);\n            ((aa && aa.record(\"done\", ca, w, this)));\n        };\n    ;\n        var da = this.$Arbiter3.pop();\n        return ((y ? da : da[v[0]]));\n    };\n    r.prototype.query = function(v) {\n        var w = this.$Arbiter0.getHoldingBehavior(v);\n        q(((!w || ((w === r.BEHAVIOR_STATE)))));\n        var x = null;\n        this.$Arbiter0.emitToListener(v, function(y) {\n            x = y;\n        });\n        return x;\n    };\n    r.prototype.registerCallback = function(v, w) {\n        if (((typeof v === \"function\"))) {\n            return this.$Arbiter2.registerCallback(l(v, \"arbiter\"), w);\n        }\n         else return this.$Arbiter2.addDependenciesToExistingCallback(v, w)\n    ;\n    };\n    r.prototype.$Arbiter5 = function(v, w, x) {\n        if (((w === null))) {\n            return;\n        }\n    ;\n    ;\n        if (x) {\n            this.$Arbiter2.satisfyPersistentDependency(v);\n        }\n         else this.$Arbiter2.satisfyNonPersistentDependency(v);\n    ;\n    ;\n    };\n    var s = ((((k === null)) ? null : k.prototype));\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = k;\n    function t() {\n        k.call(this);\n        this.$ArbiterEventHolder0 = {\n        };\n    };\n;\n    t.prototype.setHoldingBehavior = function(v, w) {\n        this.$ArbiterEventHolder0[v] = w;\n    };\n    t.prototype.getHoldingBehavior = function(v) {\n        return this.$ArbiterEventHolder0[v];\n    };\n    t.prototype.holdEvent = function(v, w, x, y, z) {\n        var aa = this.$ArbiterEventHolder0[v];\n        if (((aa !== r.BEHAVIOR_PERSISTENT))) {\n            this.$ArbiterEventHolder2(v);\n        }\n    ;\n    ;\n        if (((aa !== r.BEHAVIOR_EVENT))) {\n            return s.holdEvent.call(this, v, w, x, y, z);\n        }\n    ;\n    ;\n    };\n    t.prototype.$ArbiterEventHolder2 = function(v) {\n        this.emitToListener(v, this.releaseCurrentEvent, this);\n    };\n    m(r, {\n        SUBSCRIBE_NEW: \"new\",\n        SUBSCRIBE_ALL: \"all\",\n        BEHAVIOR_EVENT: \"JSBNG__event\",\n        BEHAVIOR_STATE: \"state\",\n        BEHAVIOR_PERSISTENT: \"persistent\"\n    });\n    function u(v, w) {\n        this.$ArbiterToken0 = v;\n        this.$ArbiterToken1 = w;\n    };\n;\n    u.prototype.unsubscribe = function() {\n        for (var v = 0; ((v < this.$ArbiterToken1.length)); v++) {\n            this.$ArbiterToken1[v].remove();\n        ;\n        };\n    ;\n        this.$ArbiterToken1.length = 0;\n    };\n    u.prototype.isForArbiterInstance = function(v) {\n        q(this.$ArbiterToken0);\n        return ((this.$ArbiterToken0 === v));\n    };\n    Object.keys(r.prototype).forEach(function(v) {\n        r[v] = function() {\n            var w = ((((this instanceof r)) ? this : r));\n            return r.prototype[v].apply(w, arguments);\n        };\n    });\n    r.call(r);\n    e.exports = r;\n});\n__d(\"ArbiterMixin\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = {\n        _getArbiterInstance: function() {\n            return ((this._arbiter || (this._arbiter = new g())));\n        },\n        inform: function(i, j, k) {\n            return this._getArbiterInstance().inform(i, j, k);\n        },\n        subscribe: function(i, j, k) {\n            return this._getArbiterInstance().subscribe(i, j, k);\n        },\n        subscribeOnce: function(i, j, k) {\n            return this._getArbiterInstance().subscribeOnce(i, j, k);\n        },\n        unsubscribe: function(i) {\n            this._getArbiterInstance().unsubscribe(i);\n        },\n        registerCallback: function(i, j) {\n            this._getArbiterInstance().registerCallback(i, j);\n        },\n        query: function(i) {\n            return this._getArbiterInstance().query(i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:ArbiterMixin\", [\"ArbiterMixin\",], function(a, b, c, d) {\n    a.ArbiterMixin = b(\"ArbiterMixin\");\n}, 3);\n__d(\"ge\", [], function(a, b, c, d, e, f) {\n    function g(j, k, l) {\n        return ((((typeof j != \"string\")) ? j : ((!k ? JSBNG__document.getElementById(j) : h(j, k, l)))));\n    };\n;\n    function h(j, k, l) {\n        var m, n, o;\n        if (((i(k) == j))) {\n            return k;\n        }\n         else if (k.getElementsByTagName) {\n            n = k.getElementsByTagName(((l || \"*\")));\n            for (o = 0; ((o < n.length)); o++) {\n                if (((i(n[o]) == j))) {\n                    return n[o];\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else {\n            n = k.childNodes;\n            for (o = 0; ((o < n.length)); o++) {\n                m = h(j, n[o]);\n                if (m) {\n                    return m;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n        \n    ;\n    ;\n        return null;\n    };\n;\n    function i(j) {\n        var k = ((j.getAttributeNode && j.getAttributeNode(\"id\")));\n        return ((k ? k.value : null));\n    };\n;\n    e.exports = g;\n});\n__d(\"$\", [\"ge\",\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\"), h = b(\"ex\");\n    function i(j) {\n        var k = g(j);\n        if (!k) {\n            throw new Error(h(\"Tried to get element with id of \\\"%s\\\" but it is not present on the page.\", j));\n        }\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = i;\n});\n__d(\"CSSCore\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(j, k) {\n        if (j.classList) {\n            return ((!!k && j.classList.contains(k)));\n        }\n    ;\n    ;\n        return ((((((\" \" + j.className)) + \" \")).indexOf(((((\" \" + k)) + \" \"))) > -1));\n    };\n;\n    var i = {\n        addClass: function(j, k) {\n            g(!/\\s/.test(k));\n            if (k) {\n                if (j.classList) {\n                    j.classList.add(k);\n                }\n                 else if (!h(j, k)) {\n                    j.className = ((((j.className + \" \")) + k));\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return j;\n        },\n        removeClass: function(j, k) {\n            g(!/\\s/.test(k));\n            if (k) {\n                if (j.classList) {\n                    j.classList.remove(k);\n                }\n                 else if (h(j, k)) {\n                    j.className = j.className.replace(new RegExp(((((\"(^|\\\\s)\" + k)) + \"(?:\\\\s|$)\")), \"g\"), \"$1\").replace(/\\s+/g, \" \").replace(/^\\s*|\\s*$/g, \"\");\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return j;\n        },\n        conditionClass: function(j, k, l) {\n            return ((l ? i.addClass : i.removeClass))(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"CSS\", [\"$\",\"CSSCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"CSSCore\"), i = \"hidden_elem\", j = {\n        setClass: function(k, l) {\n            g(k).className = ((l || \"\"));\n            return k;\n        },\n        hasClass: function(k, l) {\n            k = g(k);\n            if (k.classList) {\n                return ((!!l && k.classList.contains(l)));\n            }\n        ;\n        ;\n            return ((((((\" \" + k.className)) + \" \")).indexOf(((((\" \" + l)) + \" \"))) > -1));\n        },\n        addClass: function(k, l) {\n            return h.addClass(g(k), l);\n        },\n        removeClass: function(k, l) {\n            return h.removeClass(g(k), l);\n        },\n        conditionClass: function(k, l, m) {\n            return h.conditionClass(g(k), l, m);\n        },\n        toggleClass: function(k, l) {\n            return j.conditionClass(k, l, !j.hasClass(k, l));\n        },\n        shown: function(k) {\n            return !j.hasClass(k, i);\n        },\n        hide: function(k) {\n            return j.addClass(k, i);\n        },\n        show: function(k) {\n            return j.removeClass(k, i);\n        },\n        toggle: function(k) {\n            return j.toggleClass(k, i);\n        },\n        conditionShow: function(k, l) {\n            return j.conditionClass(k, i, !l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:css-core\", [\"CSS\",], function(a, b, c, d) {\n    a.CSS = b(\"CSS\");\n}, 3);\n__d(\"legacy:dom-core\", [\"$\",\"ge\",], function(a, b, c, d) {\n    a.$ = b(\"$\");\n    a.ge = b(\"ge\");\n}, 3);\n__d(\"Parent\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = {\n        byTag: function(i, j) {\n            j = j.toUpperCase();\n            while (((i && ((i.nodeName != j))))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        },\n        byClass: function(i, j) {\n            while (((i && !g.hasClass(i, j)))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        },\n        byAttribute: function(i, j) {\n            while (((i && ((!i.getAttribute || !i.getAttribute(j)))))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:parent\", [\"Parent\",], function(a, b, c, d) {\n    a.Parent = b(\"Parent\");\n}, 3);\n__d(\"legacy:emptyFunction\", [\"emptyFunction\",], function(a, b, c, d) {\n    a.emptyFunction = b(\"emptyFunction\");\n}, 3);\n__d(\"isEmpty\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (Array.isArray(h)) {\n            return ((h.length === 0));\n        }\n         else if (((typeof h === \"object\"))) {\n            {\n                var fin9keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin9i = (0);\n                var i;\n                for (; (fin9i < fin9keys.length); (fin9i++)) {\n                    ((i) = (fin9keys[fin9i]));\n                    {\n                        return false;\n                    };\n                };\n            };\n        ;\n            return true;\n        }\n         else return !h\n        \n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"CSSLoader\", [\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"isEmpty\"), h = 20, i = 5000, j, k, l = {\n    }, m = [], n, o = {\n    };\n    function p(t) {\n        if (k) {\n            return;\n        }\n    ;\n    ;\n        k = true;\n        var u = JSBNG__document.createElement(\"link\");\n        u.JSBNG__onload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_166), function() {\n            j = true;\n            u.parentNode.removeChild(u);\n        }));\n        u.rel = \"stylesheet\";\n        u.href = \"data:text/css;base64,\";\n        t.appendChild(u);\n    };\n;\n    function q() {\n        var t, u = [], v = [];\n        if (((JSBNG__Date.now() >= n))) {\n            {\n                var fin10keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin10i = (0);\n                (0);\n                for (; (fin10i < fin10keys.length); (fin10i++)) {\n                    ((t) = (fin10keys[fin10i]));\n                    {\n                        v.push(o[t].signal);\n                        u.push(o[t].error);\n                    };\n                };\n            };\n        ;\n            o = {\n            };\n        }\n         else {\n            var fin11keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin11i = (0);\n            (0);\n            for (; (fin11i < fin11keys.length); (fin11i++)) {\n                ((t) = (fin11keys[fin11i]));\n                {\n                    var w = o[t].signal, x = ((window.JSBNG__getComputedStyle ? JSBNG__getComputedStyle(w, null) : w.currentStyle));\n                    if (((x && ((parseInt(x.height, 10) > 1))))) {\n                        u.push(o[t].load);\n                        v.push(w);\n                        delete o[t];\n                    }\n                ;\n                ;\n                };\n            };\n        }\n    ;\n    ;\n        for (var y = 0; ((y < v.length)); y++) {\n            v[y].parentNode.removeChild(v[y]);\n        ;\n        };\n    ;\n        if (!g(u)) {\n            for (y = 0; ((y < u.length)); y++) {\n                u[y]();\n            ;\n            };\n        ;\n            n = ((JSBNG__Date.now() + i));\n        }\n    ;\n    ;\n        return g(o);\n    };\n;\n    function r(t, u, v, w) {\n        var x = JSBNG__document.createElement(\"meta\");\n        x.id = ((\"bootloader_\" + t.replace(/[^a-z0-9]/gi, \"_\")));\n        u.appendChild(x);\n        var y = !g(o);\n        n = ((JSBNG__Date.now() + i));\n        o[t] = {\n            signal: x,\n            load: v,\n            error: w\n        };\n        if (!y) {\n            var z = JSBNG__setInterval(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_169), function aa() {\n                if (q()) {\n                    JSBNG__clearInterval(z);\n                }\n            ;\n            ;\n            })), h, false);\n        }\n    ;\n    ;\n    };\n;\n    var s = {\n        loadStyleSheet: function(t, u, v, w, x) {\n            if (l[t]) {\n                throw new Error(((((\"CSS component \" + t)) + \" has already been requested.\")));\n            }\n        ;\n        ;\n            if (JSBNG__document.createStyleSheet) {\n                var y;\n                for (var z = 0; ((z < m.length)); z++) {\n                    if (((m[z].imports.length < 31))) {\n                        y = z;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((y === undefined))) {\n                    m.push(JSBNG__document.createStyleSheet());\n                    y = ((m.length - 1));\n                }\n            ;\n            ;\n                m[y].addImport(u);\n                l[t] = {\n                    styleSheet: m[y],\n                    uri: u\n                };\n                r(t, v, w, x);\n                return;\n            }\n        ;\n        ;\n            var aa = JSBNG__document.createElement(\"link\");\n            aa.rel = \"stylesheet\";\n            aa.type = \"text/css\";\n            aa.href = u;\n            l[t] = {\n                link: aa\n            };\n            if (j) {\n                aa.JSBNG__onload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_171), function() {\n                    aa.JSBNG__onload = aa.JSBNG__onerror = null;\n                    w();\n                }));\n                aa.JSBNG__onerror = function() {\n                    aa.JSBNG__onload = aa.JSBNG__onerror = null;\n                    x();\n                };\n            }\n             else {\n                r(t, v, w, x);\n                if (((j === undefined))) {\n                    p(v);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            v.appendChild(aa);\n        },\n        registerLoadedStyleSheet: function(t, u) {\n            if (l[t]) {\n                throw new Error(((((((\"CSS component \" + t)) + \" has been requested and should not be \")) + \"loaded more than once.\")));\n            }\n        ;\n        ;\n            l[t] = {\n                link: u\n            };\n        },\n        unloadStyleSheet: function(t) {\n            if (((!t in l))) {\n                return;\n            }\n        ;\n        ;\n            var u = l[t], v = u.link;\n            if (v) {\n                v.JSBNG__onload = v.JSBNG__onerror = null;\n                v.parentNode.removeChild(v);\n            }\n             else {\n                var w = u.styleSheet;\n                for (var x = 0; ((x < w.imports.length)); x++) {\n                    if (((w.imports[x].href == u.uri))) {\n                        w.removeImport(x);\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            delete o[t];\n            delete l[t];\n        }\n    };\n    e.exports = s;\n});\n__d(\"Bootloader\", [\"CSSLoader\",\"CallbackDependencyManager\",\"createArrayFrom\",\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSLoader\"), h = b(\"CallbackDependencyManager\"), i = b(\"createArrayFrom\"), j = b(\"ErrorUtils\"), k = {\n    }, l = {\n    }, m = {\n    }, n = null, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = false, t = [], u = new h(), v = [];\n    j.addListener(function(ca) {\n        ca.loadingUrls = Object.keys(p);\n    }, true);\n    function w(ca, da, ea, fa) {\n        var ga = ba.done.bind(null, [ea,], ((ca === \"css\")), da);\n        p[da] = JSBNG__Date.now();\n        if (((ca == \"js\"))) {\n            var ha = JSBNG__document.createElement(\"script\");\n            ha.src = da;\n            ha.async = true;\n            var ia = o[ea];\n            if (((ia && ia.crossOrigin))) {\n                ha.crossOrigin = \"anonymous\";\n            }\n        ;\n        ;\n            ha.JSBNG__onload = ga;\n            ha.JSBNG__onerror = function() {\n                q[da] = true;\n                ga();\n            };\n            ha.onreadystatechange = function() {\n                if (((this.readyState in {\n                    loaded: 1,\n                    complete: 1\n                }))) {\n                    ga();\n                }\n            ;\n            ;\n            };\n            fa.appendChild(ha);\n        }\n         else if (((ca == \"css\"))) {\n            g.loadStyleSheet(ea, da, fa, ga, function() {\n                q[da] = true;\n                ga();\n            });\n        }\n        \n    ;\n    ;\n    };\n;\n    function x(ca) {\n        if (!o[ca]) {\n            return;\n        }\n    ;\n    ;\n        if (((o[ca].type == \"css\"))) {\n            g.unloadStyleSheet(ca);\n            delete k[ca];\n            u.unsatisfyPersistentDependency(ca);\n        }\n    ;\n    ;\n    };\n;\n    function y(ca, da) {\n        if (!s) {\n            t.push([ca,da,]);\n            return;\n        }\n    ;\n    ;\n        ca = i(ca);\n        var ea = [];\n        for (var fa = 0; ((fa < ca.length)); ++fa) {\n            if (!ca[fa]) {\n                continue;\n            }\n        ;\n        ;\n            var ga = m[ca[fa]];\n            if (ga) {\n                var ha = ga.resources;\n                for (var ia = 0; ((ia < ha.length)); ++ia) {\n                    ea.push(ha[ia]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        ba.loadResources(ea, da);\n    };\n;\n    function z(ca) {\n        ca = i(ca);\n        for (var da = 0; ((da < ca.length)); ++da) {\n            if (((ca[da] !== undefined))) {\n                k[ca[da]] = true;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function aa(ca) {\n        if (!ca) {\n            return [];\n        }\n    ;\n    ;\n        var da = [];\n        for (var ea = 0; ((ea < ca.length)); ++ea) {\n            if (((typeof ca[ea] == \"string\"))) {\n                if (((ca[ea] in o))) {\n                    da.push(o[ca[ea]]);\n                }\n            ;\n            ;\n            }\n             else da.push(ca[ea]);\n        ;\n        ;\n        };\n    ;\n        return da;\n    };\n;\n    var ba = {\n        configurePage: function(ca) {\n            var da = {\n            }, ea = aa(ca), fa;\n            for (fa = 0; ((fa < ea.length)); fa++) {\n                da[ea[fa].src] = ea[fa];\n                z(ea[fa].JSBNG__name);\n            };\n        ;\n            var ga = JSBNG__document.getElementsByTagName(\"link\");\n            for (fa = 0; ((fa < ga.length)); ++fa) {\n                if (((ga[fa].rel != \"stylesheet\"))) {\n                    continue;\n                }\n            ;\n            ;\n                {\n                    var fin12keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin12i = (0);\n                    var ha;\n                    for (; (fin12i < fin12keys.length); (fin12i++)) {\n                        ((ha) = (fin12keys[fin12i]));\n                        {\n                            if (((ga[fa].href.indexOf(ha) !== -1))) {\n                                var ia = da[ha].JSBNG__name;\n                                if (da[ha].permanent) {\n                                    l[ia] = true;\n                                }\n                            ;\n                            ;\n                                delete da[ha];\n                                g.registerLoadedStyleSheet(ia, ga[fa]);\n                                ba.done([ia,], true);\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n        },\n        loadComponents: function(ca, da) {\n            ca = i(ca);\n            var ea = [], fa = [];\n            for (var ga = 0; ((ga < ca.length)); ga++) {\n                var ha = m[ca[ga]];\n                if (((ha && !ha.module))) {\n                    continue;\n                }\n            ;\n            ;\n                var ia = ((\"legacy:\" + ca[ga]));\n                if (m[ia]) {\n                    ca[ga] = ia;\n                    ea.push(ia);\n                }\n                 else if (((ha && ha.module))) {\n                    ea.push(ca[ga]);\n                    if (!ha.runWhenReady) {\n                        fa.push(ca[ga]);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            y(ca, ((ea.length ? d.bind(null, ea, da) : da)));\n        },\n        loadModules: function(ca, da) {\n            var ea = [], fa = [];\n            for (var ga = 0; ((ga < ca.length)); ga++) {\n                var ha = m[ca[ga]];\n                if (((!ha || ha.module))) {\n                    ea.push(ca[ga]);\n                }\n            ;\n            ;\n            };\n        ;\n            y(ca, d.bind(null, ea, da));\n        },\n        loadResources: function(ca, da, ea, fa) {\n            var ga;\n            ca = aa(i(ca));\n            if (ea) {\n                var ha = {\n                };\n                for (ga = 0; ((ga < ca.length)); ++ga) {\n                    ha[ca[ga].JSBNG__name] = true;\n                ;\n                };\n            ;\n                {\n                    var fin13keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin13i = (0);\n                    var ia;\n                    for (; (fin13i < fin13keys.length); (fin13i++)) {\n                        ((ia) = (fin13keys[fin13i]));\n                        {\n                            if (((((!((ia in l)) && !((ia in ha)))) && !((ia in r))))) {\n                                x(ia);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                r = {\n                };\n            }\n        ;\n        ;\n            var ja = [], ka = [];\n            for (ga = 0; ((ga < ca.length)); ++ga) {\n                var la = ca[ga];\n                if (la.permanent) {\n                    l[la.JSBNG__name] = true;\n                }\n            ;\n            ;\n                if (u.isPersistentDependencySatisfied(la.JSBNG__name)) {\n                    continue;\n                }\n            ;\n            ;\n                if (!la.nonblocking) {\n                    ka.push(la.JSBNG__name);\n                }\n            ;\n            ;\n                if (!k[la.JSBNG__name]) {\n                    z(la.JSBNG__name);\n                    ja.push(la);\n                    ((window.CavalryLogger && window.CavalryLogger.getInstance().measureResources(la, fa)));\n                }\n            ;\n            ;\n            };\n        ;\n            var ma;\n            if (da) {\n                if (((typeof da === \"function\"))) {\n                    ma = u.registerCallback(da, ka);\n                }\n                 else ma = u.addDependenciesToExistingCallback(da, ka);\n            ;\n            }\n        ;\n        ;\n            var na = ((JSBNG__document.documentMode || +((/MSIE.(\\d+)/.exec(JSBNG__navigator.userAgent) || []))[1])), oa = ba.getHardpoint(), pa = ((na ? oa : JSBNG__document.createDocumentFragment()));\n            for (ga = 0; ((ga < ja.length)); ++ga) {\n                w(ja[ga].type, ja[ga].src, ja[ga].JSBNG__name, pa);\n            ;\n            };\n        ;\n            if (((oa !== pa))) {\n                oa.appendChild(pa);\n            }\n        ;\n        ;\n            return ma;\n        },\n        requestJSResource: function(ca) {\n            var da = ba.getHardpoint();\n            w(\"js\", ca, null, da);\n        },\n        done: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190), function(ca, da, ea) {\n            if (ea) {\n                delete p[ea];\n            }\n        ;\n        ;\n            z(ca);\n            if (!da) {\n                for (var fa = 0, ga = v.length; ((fa < ga)); fa++) {\n                    v[fa]();\n                ;\n                };\n            }\n        ;\n        ;\n            for (var ha = 0; ((ha < ca.length)); ++ha) {\n                var ia = ca[ha];\n                if (((ia !== undefined))) {\n                    u.satisfyPersistentDependency(ia);\n                }\n            ;\n            ;\n            };\n        ;\n        })),\n        subscribeToLoadedResources_DEPRECATED: function(ca) {\n            v.push(ca);\n        },\n        enableBootload: function(ca) {\n            {\n                var fin14keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin14i = (0);\n                var da;\n                for (; (fin14i < fin14keys.length); (fin14i++)) {\n                    ((da) = (fin14keys[fin14i]));\n                    {\n                        if (!m[da]) {\n                            m[da] = ca[da];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (!s) {\n                s = true;\n                for (var ea = 0; ((ea < t.length)); ea++) {\n                    y.apply(null, t[ea]);\n                ;\n                };\n            ;\n                t = [];\n            }\n        ;\n        ;\n        },\n        getHardpoint: function() {\n            if (!n) {\n                var ca = JSBNG__document.getElementsByTagName(\"head\");\n                n = ((((ca.length && ca[0])) || JSBNG__document.body));\n            }\n        ;\n        ;\n            return n;\n        },\n        setResourceMap: function(ca) {\n            {\n                var fin15keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin15i = (0);\n                var da;\n                for (; (fin15i < fin15keys.length); (fin15i++)) {\n                    ((da) = (fin15keys[fin15i]));\n                    {\n                        if (!o[da]) {\n                            ca[da].JSBNG__name = da;\n                            o[da] = ca[da];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        loadEarlyResources: function(ca) {\n            ba.setResourceMap(ca);\n            var da = [];\n            {\n                var fin16keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin16i = (0);\n                var ea;\n                for (; (fin16i < fin16keys.length); (fin16i++)) {\n                    ((ea) = (fin16keys[fin16i]));\n                    {\n                        var fa = o[ea];\n                        da.push(fa);\n                        if (!fa.permanent) {\n                            r[fa.JSBNG__name] = fa;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ba.loadResources(da);\n        },\n        getLoadingUrls: function() {\n            var ca = {\n            }, da = JSBNG__Date.now();\n            {\n                var fin17keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin17i = (0);\n                var ea;\n                for (; (fin17i < fin17keys.length); (fin17i++)) {\n                    ((ea) = (fin17keys[fin17i]));\n                    {\n                        ca[ea] = ((da - p[ea]));\n                    ;\n                    };\n                };\n            };\n        ;\n            return ca;\n        },\n        getErrorUrls: function() {\n            return Object.keys(q);\n        }\n    };\n    e.exports = ba;\n});\n__d(\"BlueBarController\", [\"Bootloader\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\");\n    f.init = function(i) {\n        if (((\"getBoundingClientRect\" in i))) {\n            var j = function() {\n                var k = i.getBoundingClientRect(), l = ((Math.round(k.JSBNG__top) - JSBNG__document.documentElement.clientTop));\n                h.conditionClass(i.firstChild, \"fixed_elem\", ((l <= 0)));\n            };\n            j();\n            g.loadModules([\"JSBNG__Event\",], function(k) {\n                k.listen(window, \"JSBNG__scroll\", j);\n            });\n        }\n    ;\n    ;\n    };\n});\n__d(\"legacy:arbiter\", [\"Arbiter\",], function(a, b, c, d) {\n    a.Arbiter = b(\"Arbiter\");\n}, 3);\n__d(\"event-form-bubbling\", [], function(a, b, c, d, e, f) {\n    a.JSBNG__Event = ((a.JSBNG__Event || function() {\n    \n    }));\n    a.JSBNG__Event.__inlineSubmit = function(g, JSBNG__event) {\n        var h = ((a.JSBNG__Event.__getHandler && a.JSBNG__Event.__getHandler(g, \"submit\")));\n        return ((h ? null : a.JSBNG__Event.__bubbleSubmit(g, JSBNG__event)));\n    };\n    a.JSBNG__Event.__bubbleSubmit = function(g, JSBNG__event) {\n        if (JSBNG__document.documentElement.JSBNG__attachEvent) {\n            var h;\n            while (((((h !== false)) && (g = g.parentNode)))) {\n                h = ((g.JSBNG__onsubmit ? g.JSBNG__onsubmit(JSBNG__event) : ((a.JSBNG__Event.__fire && a.JSBNG__Event.__fire(g, \"submit\", JSBNG__event)))));\n            ;\n            };\n        ;\n            return h;\n        }\n    ;\n    ;\n    };\n}, 3);\n__d(\"OnloadEvent\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ONLOAD: \"onload/onload\",\n        ONLOAD_CALLBACK: \"onload/onload_callback\",\n        ONLOAD_DOMCONTENT: \"onload/dom_content_ready\",\n        ONLOAD_DOMCONTENT_CALLBACK: \"onload/domcontent_callback\",\n        ONBEFOREUNLOAD: \"onload/beforeunload\",\n        ONUNLOAD: \"onload/unload\"\n    };\n    e.exports = g;\n});\n__d(\"Run\", [\"Arbiter\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"OnloadEvent\"), i = \"onunloadhooks\", j = \"onafterunloadhooks\", k = g.BEHAVIOR_STATE;\n    function l(ba) {\n        var ca = a.CavalryLogger;\n        ((ca && ca.getInstance().setTimeStamp(ba)));\n    };\n;\n    function m() {\n        return !window.loading_page_chrome;\n    };\n;\n    function n(ba) {\n        var ca = a.OnloadHooks;\n        if (((window.loaded && ca))) {\n            ca.runHook(ba, \"onlateloadhooks\");\n        }\n         else u(\"onloadhooks\", ba);\n    ;\n    ;\n    };\n;\n    function o(ba) {\n        var ca = a.OnloadHooks;\n        if (((window.afterloaded && ca))) {\n            JSBNG__setTimeout(function() {\n                ca.runHook(ba, \"onlateafterloadhooks\");\n            }, 0);\n        }\n         else u(\"onafterloadhooks\", ba);\n    ;\n    ;\n    };\n;\n    function p(ba, ca) {\n        if (((ca === undefined))) {\n            ca = m();\n        }\n    ;\n    ;\n        ((ca ? u(\"onbeforeleavehooks\", ba) : u(\"onbeforeunloadhooks\", ba)));\n    };\n;\n    function q(ba, ca) {\n        if (!window.JSBNG__onunload) {\n            window.JSBNG__onunload = function() {\n                g.inform(h.ONUNLOAD, true, k);\n            };\n        }\n    ;\n    ;\n        u(ba, ca);\n    };\n;\n    function r(ba) {\n        q(i, ba);\n    };\n;\n    function s(ba) {\n        q(j, ba);\n    };\n;\n    function t(ba) {\n        u(\"onleavehooks\", ba);\n    };\n;\n    function u(ba, ca) {\n        window[ba] = ((window[ba] || [])).concat(ca);\n    };\n;\n    function v(ba) {\n        window[ba] = [];\n    };\n;\n    {\n        function w() {\n            g.inform(h.ONLOAD_DOMCONTENT, true, k);\n        };\n        ((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_222.push)((w)));\n    };\n;\n    a._domcontentready = w;\n    function x() {\n        var ba = JSBNG__document, ca = window;\n        if (ba.JSBNG__addEventListener) {\n            var da = /AppleWebKit.(\\d+)/.exec(JSBNG__navigator.userAgent);\n            if (((da && ((da[1] < 525))))) {\n                var ea = JSBNG__setInterval(function() {\n                    if (/loaded|complete/.test(ba.readyState)) {\n                        w();\n                        JSBNG__clearInterval(ea);\n                    }\n                ;\n                ;\n                }, 10);\n            }\n             else ba.JSBNG__addEventListener(\"DOMContentLoaded\", w, true);\n        ;\n        ;\n        }\n         else {\n            var fa = \"javascript:void(0)\";\n            if (((ca.JSBNG__location.protocol == \"https:\"))) {\n                fa = \"//:\";\n            }\n        ;\n        ;\n            ba.write(((((((((\"\\u003Cscript onreadystatechange=\\\"if (this.readyState=='complete') {\" + \"this.parentNode.removeChild(this);_domcontentready();}\\\" \")) + \"defer=\\\"defer\\\" src=\\\"\")) + fa)) + \"\\\"\\u003E\\u003C/script\\u003E\")));\n        }\n    ;\n    ;\n        var ga = ca.JSBNG__onload;\n        ca.JSBNG__onload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_225), function() {\n            l(\"t_layout\");\n            ((ga && ga()));\n            g.inform(h.ONLOAD, true, k);\n        }));\n        ca.JSBNG__onbeforeunload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_226), function() {\n            var ha = {\n            };\n            g.inform(h.ONBEFOREUNLOAD, ha, k);\n            if (!ha.warn) {\n                g.inform(\"onload/exit\", true);\n            }\n        ;\n        ;\n            return ha.warn;\n        }));\n    };\n;\n    var y = g.registerCallback(function() {\n        l(\"t_onload\");\n        g.inform(h.ONLOAD_CALLBACK, true, k);\n    }, [h.ONLOAD,]), z = g.registerCallback(function() {\n        l(\"t_domcontent\");\n        var ba = {\n            timeTriggered: JSBNG__Date.now()\n        };\n        g.inform(h.ONLOAD_DOMCONTENT_CALLBACK, ba, k);\n    }, [h.ONLOAD_DOMCONTENT,]);\n    x();\n    var aa = {\n        onLoad: n,\n        onAfterLoad: o,\n        onLeave: t,\n        onBeforeUnload: p,\n        onUnload: r,\n        onAfterUnload: s,\n        __domContentCallback: z,\n        __onloadCallback: y,\n        __removeHook: v\n    };\n    e.exports = aa;\n});\n__d(\"legacy:onload\", [\"Run\",\"OnloadEvent\",], function(a, b, c, d) {\n    var e = b(\"Run\");\n    a.OnloadEvent = b(\"OnloadEvent\");\n    a.onloadRegister_DEPRECATED = e.onLoad;\n    a.onloadRegister = function() {\n        return e.onLoad.apply(this, arguments);\n    };\n    a.onafterloadRegister_DEPRECATED = e.onAfterLoad;\n    a.onafterloadRegister = function() {\n        return e.onAfterLoad.apply(this, arguments);\n    };\n    a.onleaveRegister = e.onLeave;\n    a.onbeforeunloadRegister = e.onBeforeUnload;\n    a.onunloadRegister = e.onUnload;\n}, 3);\n__d(\"wait_for_load\", [\"Bootloader\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\");\n    function i(l, m) {\n        return ((window.loaded && m.call(l)));\n    };\n;\n    function j(l, m, n) {\n        g.loadComponents.call(g, m, n.bind(l));\n        return false;\n    };\n;\n    function k(l, m, n) {\n        n = n.bind(l, m);\n        if (window.loaded) {\n            return n();\n        }\n    ;\n    ;\n        switch (((m || JSBNG__event)).type) {\n          case \"load\":\n        \n          case \"JSBNG__focus\":\n            h.onAfterLoad(n);\n            return;\n          case \"click\":\n            var o = l.style, p = JSBNG__document.body.style;\n            o.cursor = p.cursor = \"progress\";\n            h.onAfterLoad(function() {\n                o.cursor = p.cursor = \"\";\n                if (((l.tagName.toLowerCase() == \"a\"))) {\n                    if (((((false !== n())) && l.href))) {\n                        window.JSBNG__location.href = l.href;\n                    }\n                ;\n                ;\n                }\n                 else if (l.click) {\n                    l.click();\n                }\n                \n            ;\n            ;\n            });\n            break;\n        };\n    ;\n        return false;\n    };\n;\n    a.run_if_loaded = i;\n    a.run_with = j;\n    a.wait_for_load = k;\n}, 3);\n__d(\"markJSEnabled\", [], function(a, b, c, d, e, f) {\n    var g = JSBNG__document.documentElement;\n    g.className = g.className.replace(\"no_js\", \"\");\n});\n__d(\"JSCC\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(j) {\n        var k, l = false;\n        return function() {\n            if (!l) {\n                k = j();\n                l = true;\n            }\n        ;\n        ;\n            return k;\n        };\n    };\n;\n    var i = {\n        get: function(j) {\n            if (!g[j]) {\n                throw new Error(\"JSCC entry is missing\");\n            }\n        ;\n        ;\n            return g[j]();\n        },\n        init: function(j) {\n            {\n                var fin18keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin18i = (0);\n                var k;\n                for (; (fin18i < fin18keys.length); (fin18i++)) {\n                    ((k) = (fin18keys[fin18i]));\n                    {\n                        g[k] = h(j[k]);\n                    ;\n                    };\n                };\n            };\n        ;\n            return function l() {\n                {\n                    var fin19keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin19i = (0);\n                    var m;\n                    for (; (fin19i < fin19keys.length); (fin19i++)) {\n                        ((m) = (fin19keys[fin19i]));\n                        {\n                            delete g[m];\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"PageletSet\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        hasPagelet: function(m) {\n            return i.hasOwnProperty(m);\n        },\n        getPagelet: function(m) {\n            return i[m];\n        },\n        getOrCreatePagelet: function(m) {\n            if (!j.hasPagelet(m)) {\n                var n = new l(m);\n                i[m] = n;\n            }\n        ;\n        ;\n            return j.getPagelet(m);\n        },\n        getPageletIDs: function() {\n            return Object.keys(i);\n        },\n        removePagelet: function(m) {\n            if (j.hasPagelet(m)) {\n                i[m].destroy();\n                delete i[m];\n            }\n        ;\n        ;\n        }\n    };\n    function k(m, n) {\n        return ((m.contains ? m.contains(n) : ((m.compareDocumentPosition(n) & 16))));\n    };\n;\n    function l(m) {\n        this.id = m;\n        this._root = null;\n        this._destructors = [];\n        this.addDestructor(function n() {\n            g.inform(\"pagelet/destroy\", {\n                id: this.id,\n                root: this._root\n            });\n        }.bind(this));\n    };\n;\n    h(l.prototype, {\n        setRoot: function(m) {\n            this._root = m;\n        },\n        _getDescendantPagelets: function() {\n            var m = [];\n            if (!this._root) {\n                return m;\n            }\n        ;\n        ;\n            var n = j.getPageletIDs();\n            for (var o = 0; ((o < n.length)); o++) {\n                var p = n[o];\n                if (((p === this.id))) {\n                    continue;\n                }\n            ;\n            ;\n                var q = i[p];\n                if (((q._root && k(this._root, q._root)))) {\n                    m.push(q);\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        },\n        addDestructor: function(m) {\n            this._destructors.push(m);\n        },\n        destroy: function() {\n            var m = this._getDescendantPagelets();\n            for (var n = 0; ((n < m.length)); n++) {\n                var o = m[n];\n                if (j.hasPagelet(o.id)) {\n                    j.removePagelet(o.id);\n                }\n            ;\n            ;\n            };\n        ;\n            for (n = 0; ((n < this._destructors.length)); n++) {\n                this._destructors[n]();\n            ;\n            };\n        ;\n            if (this._root) {\n                while (this._root.firstChild) {\n                    this._root.removeChild(this._root.firstChild);\n                ;\n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"repeatString\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        if (((j === 1))) {\n            return i;\n        }\n    ;\n    ;\n        g(((j >= 0)));\n        var k = \"\";\n        while (j) {\n            if (((j & 1))) {\n                k += i;\n            }\n        ;\n        ;\n            if ((j >>= 1)) {\n                i += i;\n            }\n        ;\n        ;\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"BitMap\", [\"copyProperties\",\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"repeatString\"), i = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_\";\n    function j() {\n        this._bits = [];\n    };\n;\n    g(j.prototype, {\n        set: function(m) {\n            this._bits[m] = 1;\n            return this;\n        },\n        toString: function() {\n            var m = [];\n            for (var n = 0; ((n < this._bits.length)); n++) {\n                m.push(((this._bits[n] ? 1 : 0)));\n            ;\n            };\n        ;\n            return ((m.length ? l(m.join(\"\")) : \"\"));\n        },\n        toCompressedString: function() {\n            if (((this._bits.length === 0))) {\n                return \"\";\n            }\n        ;\n        ;\n            var m = [], n = 1, o = ((this._bits[0] || 0)), p = o.toString(2);\n            for (var q = 1; ((q < this._bits.length)); q++) {\n                var r = ((this._bits[q] || 0));\n                if (((r === o))) {\n                    n++;\n                }\n                 else {\n                    m.push(k(n));\n                    o = r;\n                    n = 1;\n                }\n            ;\n            ;\n            };\n        ;\n            if (n) {\n                m.push(k(n));\n            }\n        ;\n        ;\n            return l(((p + m.join(\"\"))));\n        }\n    });\n    function k(m) {\n        var n = m.toString(2), o = h(\"0\", ((n.length - 1)));\n        return ((o + n));\n    };\n;\n    function l(m) {\n        var n = ((m + \"00000\")).match(/[01]{6}/g), o = \"\";\n        for (var p = 0; ((p < n.length)); p++) {\n            o += i[parseInt(n[p], 2)];\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    e.exports = j;\n});\n__d(\"ServerJS\", [\"BitMap\",\"ErrorUtils\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"BitMap\"), h = b(\"ErrorUtils\"), i = b(\"copyProperties\"), j = b(\"ge\"), k = 0, l = new g();\n    function m() {\n        this._moduleMap = {\n        };\n        this._relativeTo = null;\n        this._moduleIDsToCleanup = {\n        };\n    };\n;\n    m.getLoadedModuleHash = function() {\n        return l.toCompressedString();\n    };\n    i(m.prototype, {\n        handle: function(q) {\n            if (q.__guard) {\n                throw new Error(\"ServerJS.handle called on data that has already been handled\");\n            }\n        ;\n        ;\n            q.__guard = true;\n            n(((q.define || [])), this._handleDefine, this);\n            n(((q.markup || [])), this._handleMarkup, this);\n            n(((q.elements || [])), this._handleElement, this);\n            n(((q.instances || [])), this._handleInstance, this);\n            var r = n(((q.require || [])), this._handleRequire, this);\n            return {\n                cancel: function() {\n                    for (var s = 0; ((s < r.length)); s++) {\n                        if (r[s]) {\n                            r[s].cancel();\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            };\n        },\n        handlePartial: function(q) {\n            ((q.instances || [])).forEach(o.bind(null, this._moduleMap, 3));\n            ((q.markup || [])).forEach(o.bind(null, this._moduleMap, 2));\n            return this.handle(q);\n        },\n        setRelativeTo: function(q) {\n            this._relativeTo = q;\n            return this;\n        },\n        cleanup: function() {\n            var q = [];\n            {\n                var fin20keys = ((window.top.JSBNG_Replay.forInKeys)((this._moduleMap))), fin20i = (0);\n                var r;\n                for (; (fin20i < fin20keys.length); (fin20i++)) {\n                    ((r) = (fin20keys[fin20i]));\n                    {\n                        q.push(r);\n                    ;\n                    };\n                };\n            };\n        ;\n            d.call(null, q, p);\n            this._moduleMap = {\n            };\n            function s(u) {\n                var v = this._moduleIDsToCleanup[u], w = v[0], x = v[1];\n                delete this._moduleIDsToCleanup[u];\n                var y = ((x ? ((((((((\"JS::call(\\\"\" + w)) + \"\\\", \\\"\")) + x)) + \"\\\", ...)\")) : ((((\"JS::requireModule(\\\"\" + w)) + \"\\\")\")))), z = ((y + \" did not fire because it has missing dependencies.\"));\n                throw new Error(z);\n            };\n        ;\n            {\n                var fin21keys = ((window.top.JSBNG_Replay.forInKeys)((this._moduleIDsToCleanup))), fin21i = (0);\n                var t;\n                for (; (fin21i < fin21keys.length); (fin21i++)) {\n                    ((t) = (fin21keys[fin21i]));\n                    {\n                        h.applyWithGuard(s, this, [t,]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _handleDefine: function(q, r, s, t) {\n            if (((t >= 0))) {\n                l.set(t);\n            }\n        ;\n        ;\n            define(q, r, function() {\n                this._replaceTransportMarkers(s);\n                return s;\n            }.bind(this));\n        },\n        _handleRequire: function(q, r, s, t) {\n            var u = [q,].concat(((s || []))), v = ((((r ? \"__call__\" : \"__requireModule__\")) + k++));\n            this._moduleIDsToCleanup[v] = [q,r,];\n            return define(v, u, function(w) {\n                delete this._moduleIDsToCleanup[v];\n                ((t && this._replaceTransportMarkers(t)));\n                if (r) {\n                    if (!w[r]) {\n                        throw new TypeError(((((((\"Module \" + q)) + \" has no method \")) + r)));\n                    }\n                ;\n                ;\n                    w[r].apply(w, ((t || [])));\n                }\n            ;\n            ;\n            }, 1, this, 1);\n        },\n        _handleInstance: function(q, r, s, t) {\n            var u = null;\n            if (r) {\n                u = function(v) {\n                    this._replaceTransportMarkers(s);\n                    var w = Object.create(v.prototype);\n                    v.apply(w, s);\n                    return w;\n                }.bind(this);\n            }\n        ;\n        ;\n            define(q, r, u, 0, null, t);\n        },\n        _handleMarkup: function(q, r, s) {\n            define(q, [\"HTML\",], function(t) {\n                return t.replaceJSONWrapper(r).getRootNode();\n            }, 0, null, s);\n        },\n        _handleElement: function(q, r, s, t) {\n            var u = [], v = 0;\n            if (t) {\n                u.push(t);\n                v = 1;\n                s++;\n            }\n        ;\n        ;\n            define(q, u, function(w) {\n                var x = j(r, w);\n                if (!x) {\n                    var y = ((\"Could not find element \" + r));\n                    throw new Error(y);\n                }\n            ;\n            ;\n                return x;\n            }, v, null, s);\n        },\n        _replaceTransportMarkers: function(q, r) {\n            var s = ((((typeof r !== \"undefined\")) ? q[r] : q)), t;\n            if (Array.isArray(s)) {\n                for (t = 0; ((t < s.length)); t++) {\n                    this._replaceTransportMarkers(s, t);\n                ;\n                };\n            ;\n            }\n             else if (((s && ((typeof s == \"object\"))))) {\n                if (s.__m) {\n                    q[r] = b.call(null, s.__m);\n                }\n                 else if (s.__e) {\n                    q[r] = j(s.__e);\n                }\n                 else if (s.__rel) {\n                    q[r] = this._relativeTo;\n                }\n                 else {\n                    var fin22keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin22i = (0);\n                    var u;\n                    for (; (fin22i < fin22keys.length); (fin22i++)) {\n                        ((u) = (fin22keys[fin22i]));\n                        {\n                            this._replaceTransportMarkers(s, u);\n                        ;\n                        };\n                    };\n                }\n                \n                \n            ;\n            }\n            \n        ;\n        ;\n        }\n    });\n    function n(q, r, s) {\n        return q.map(function(t) {\n            return h.applyWithGuard(r, s, t);\n        });\n    };\n;\n    function o(q, r, s) {\n        var t = s[0];\n        if (!((t in q))) {\n            s[r] = ((((s[r] || 0)) + 1));\n        }\n    ;\n    ;\n        q[t] = true;\n    };\n;\n    function p() {\n        return {\n        };\n    };\n;\n    e.exports = m;\n});\n__d(\"invokeCallbacks\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\");\n    function h(i, j) {\n        if (i) {\n            for (var k = 0; ((k < i.length)); k++) {\n                g.applyWithGuard(new Function(i[k]), j);\n            ;\n            };\n        }\n    ;\n    ;\n    };\n;\n    e.exports = h;\n});\n__d(\"ix\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n    };\n    function i(j) {\n        return h[j];\n    };\n;\n    i.add = g.bind(null, h);\n    e.exports = i;\n});\n__d(\"BigPipe\", [\"Arbiter\",\"Bootloader\",\"Env\",\"ErrorUtils\",\"JSCC\",\"OnloadEvent\",\"PageletSet\",\"Run\",\"ServerJS\",\"$\",\"copyProperties\",\"ge\",\"invokeCallbacks\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"Env\"), j = b(\"ErrorUtils\"), k = b(\"JSCC\"), l = b(\"OnloadEvent\"), m = b(\"PageletSet\"), n = b(\"Run\"), o = b(\"ServerJS\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = b(\"invokeCallbacks\"), t = b(\"ix\"), u = ((JSBNG__document.documentMode || +((/MSIE.(\\d+)/.exec(JSBNG__navigator.userAgent) || []))[1])), v = g.BEHAVIOR_STATE, w = g.BEHAVIOR_PERSISTENT;\n    function x(ba) {\n        q(this, {\n            arbiter: g,\n            rootNodeID: \"JSBNG__content\",\n            lid: 0,\n            isAjax: false,\n            domContentCallback: n.__domContentCallback,\n            onloadCallback: n.__onloadCallback,\n            domContentEvt: l.ONLOAD_DOMCONTENT_CALLBACK,\n            onloadEvt: l.ONLOAD_CALLBACK,\n            forceFinish: false,\n            _phaseDoneCallbacks: [],\n            _currentPhase: 0,\n            _lastPhase: -1,\n            _livePagelets: {\n            }\n        });\n        q(this, ba);\n        if (this.automatic) {\n            this._relevant_instance = x._current_instance;\n        }\n         else x._current_instance = this;\n    ;\n    ;\n        this._serverJS = new o();\n        g.inform(\"BigPipe/init\", {\n            lid: this.lid,\n            arbiter: this.arbiter\n        }, w);\n        this.arbiter.registerCallback(this.domContentCallback, [\"pagelet_displayed_all\",]);\n        this._informEventExternal(\"phase_begin\", {\n            phase: 0\n        });\n        this.arbiter.inform(\"phase_begin_0\", true, v);\n        this.onloadCallback = this.arbiter.registerCallback(this.onloadCallback, [\"pagelet_displayed_all\",]);\n        this.arbiter.registerCallback(this._serverJS.cleanup.bind(this._serverJS), [this.onloadEvt,]);\n    };\n;\n    x.getCurrentInstance = function() {\n        return x._current_instance;\n    };\n    q(x.prototype, {\n        onPageletArrive: j.guard(function(ba) {\n            this._informPageletEvent(\"arrive\", ba.id, ba.phase);\n            ba.JSBNG__content = ((ba.JSBNG__content || {\n            }));\n            var ca = ba.phase;\n            if (!this._phaseDoneCallbacks[ca]) {\n                this._phaseDoneCallbacks[ca] = this.arbiter.registerCallback(this._onPhaseDone.bind(this), [((\"phase_complete_\" + ca)),]);\n            }\n        ;\n        ;\n            this.arbiter.registerCallback(this._phaseDoneCallbacks[ca], [((ba.id + \"_displayed\")),]);\n            var da = this._getPageletRootID(ba), ea = m.getOrCreatePagelet(da);\n            if (ba.the_end) {\n                this._lastPhase = ca;\n            }\n        ;\n        ;\n            if (((ba.tti_phase !== undefined))) {\n                this._ttiPhase = ba.tti_phase;\n            }\n        ;\n        ;\n            if (ba.is_second_to_last_phase) {\n                this._secondToLastPhase = ca;\n            }\n        ;\n        ;\n            this._livePagelets[ea.id] = true;\n            ea.addDestructor(function() {\n                delete this._livePagelets[ea.id];\n            }.bind(this));\n            if (ba.jscc_map) {\n                var fa = (eval)(ba.jscc_map), ga = k.init(fa);\n                ea.addDestructor(ga);\n            }\n        ;\n        ;\n            if (ba.resource_map) {\n                h.setResourceMap(ba.resource_map);\n            }\n        ;\n        ;\n            if (ba.bootloadable) {\n                h.enableBootload(ba.bootloadable);\n            }\n        ;\n        ;\n            t.add(ba.ixData);\n            this._informPageletEvent(\"setup\", ba.id);\n            var ha = new g();\n            ha.registerCallback(this._displayPageletHandler.bind(this, ba), [\"preceding_pagelets_displayed\",\"display_resources_downloaded\",]);\n            var ia = ((ba.display_dependency || [])), ja = ia.map(function(la) {\n                return ((la + \"_displayed\"));\n            });\n            this.arbiter.registerCallback(function() {\n                ha.inform(\"preceding_pagelets_displayed\");\n            }, ja);\n            this.arbiter.registerCallback(function() {\n                this._informPageletEvent(\"css\", ba.id);\n                var la = ((ba.css || [])).concat(((ba.displayJS || [])));\n                h.loadResources(la, function() {\n                    this._informPageletEvent(\"css_load\", ba.id);\n                    ha.inform(\"display_resources_downloaded\");\n                }.bind(this), false, ba.id);\n            }.bind(this), [((\"phase_begin_\" + ca)),]);\n            this.arbiter.registerCallback(this.onloadCallback, [\"pagelet_onload\",]);\n            var ka = [((ba.id + \"_displayed\")),];\n            if (!this.jsNonBlock) {\n                ka.push(this.domContentEvt);\n            }\n        ;\n        ;\n            this.arbiter.registerCallback(this._downloadJsForPagelet.bind(this, ba), ka);\n            if (ba.is_last) {\n                this._endPhase(ca);\n            }\n        ;\n        ;\n        }),\n        _beginPhase: function(ba) {\n            this._informEventExternal(\"phase_begin\", {\n                phase: ba\n            });\n            this.arbiter.inform(((\"phase_begin_\" + ba)), true, v);\n        },\n        _endPhase: function(ba) {\n            this.arbiter.inform(((\"phase_complete_\" + ba)), true, v);\n        },\n        _displayPageletHandler: function(ba) {\n            if (this.displayCallback) {\n                this.displayCallback(this._displayPagelet.bind(this, ba));\n            }\n             else this._displayPagelet(ba);\n        ;\n        ;\n        },\n        _displayPagelet: function(ba) {\n            this._informPageletEvent(\"display_start\", ba.id);\n            var ca = this._getPagelet(ba);\n            {\n                var fin23keys = ((window.top.JSBNG_Replay.forInKeys)((ba.JSBNG__content))), fin23i = (0);\n                var da;\n                for (; (fin23i < fin23keys.length); (fin23i++)) {\n                    ((da) = (fin23keys[fin23i]));\n                    {\n                        var ea = ba.JSBNG__content[da];\n                        if (ba.append) {\n                            da = this._getPageletRootID(ba);\n                        }\n                    ;\n                    ;\n                        var fa = r(da);\n                        if (!fa) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((da === ca.id))) {\n                            ca.setRoot(fa);\n                        }\n                    ;\n                    ;\n                        ea = y(ea);\n                        if (ea) {\n                            if (((ba.append || ((u < 8))))) {\n                                if (!ba.append) {\n                                    while (fa.firstChild) {\n                                        fa.removeChild(fa.firstChild);\n                                    ;\n                                    };\n                                }\n                            ;\n                            ;\n                                aa(fa, ea);\n                            }\n                             else fa.innerHTML = ea;\n                        ;\n                        }\n                    ;\n                    ;\n                        var ga = fa.getAttribute(\"data-referrer\");\n                        if (!ga) {\n                            fa.setAttribute(\"data-referrer\", da);\n                        }\n                    ;\n                    ;\n                        if (((ba.cache_hit && i.pc_debug))) {\n                            fa.style.border = \"1px red solid\";\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (ba.jsmods) {\n                var ha = JSON.parse(JSON.stringify(ba.jsmods)), ia = this._serverJS.handlePartial(ha);\n                ca.addDestructor(ia.cancel.bind(ia));\n            }\n        ;\n        ;\n            this._informPageletEvent(\"display\", ba.id);\n            this.arbiter.inform(((ba.id + \"_displayed\")), true, v);\n        },\n        _onPhaseDone: function() {\n            if (((this._currentPhase === this._ttiPhase))) {\n                this._informEventExternal(\"tti_bigpipe\", {\n                    phase: this._ttiPhase\n                });\n            }\n        ;\n        ;\n            if (((((this._currentPhase === this._lastPhase)) && this._isRelevant()))) {\n                this.arbiter.inform(\"pagelet_displayed_all\", true, v);\n            }\n        ;\n        ;\n            this._currentPhase++;\n            if (((u <= 8))) {\n                JSBNG__setTimeout(this._beginPhase.bind(this, this._currentPhase), 20);\n            }\n             else this._beginPhase(this._currentPhase);\n        ;\n        ;\n        },\n        _downloadJsForPagelet: function(ba) {\n            this._informPageletEvent(\"jsstart\", ba.id);\n            h.loadResources(((ba.js || [])), function() {\n                this._informPageletEvent(\"jsdone\", ba.id);\n                ba.requires = ((ba.requires || []));\n                if (((!this.isAjax || ((ba.phase >= 1))))) {\n                    ba.requires.push(\"uipage_onload\");\n                }\n            ;\n            ;\n                var ca = function() {\n                    this._informPageletEvent(\"preonload\", ba.id);\n                    if (this._isRelevantPagelet(ba)) {\n                        s(ba.JSBNG__onload);\n                    }\n                ;\n                ;\n                    this._informPageletEvent(\"JSBNG__onload\", ba.id);\n                    this.arbiter.inform(\"pagelet_onload\", true, g.BEHAVIOR_EVENT);\n                    ((ba.provides && this.arbiter.inform(ba.provides, true, v)));\n                }.bind(this), da = function() {\n                    ((this._isRelevantPagelet(ba) && s(ba.onafterload)));\n                }.bind(this);\n                this.arbiter.registerCallback(ca, ba.requires);\n                this.arbiter.registerCallback(da, [this.onloadEvt,]);\n            }.bind(this), false, ba.id);\n        },\n        _getPagelet: function(ba) {\n            var ca = this._getPageletRootID(ba);\n            return m.getPagelet(ca);\n        },\n        _getPageletRootID: function(ba) {\n            var ca = ba.append;\n            if (ca) {\n                return ((((ca === \"bigpipe_root\")) ? this.rootNodeID : ca));\n            }\n        ;\n        ;\n            return ((Object.keys(ba.JSBNG__content)[0] || null));\n        },\n        _isRelevant: function() {\n            return ((((((((this == x._current_instance)) || ((this.automatic && ((this._relevant_instance == x._current_instance)))))) || this.jsNonBlock)) || this.forceFinish));\n        },\n        _isRelevantPagelet: function(ba) {\n            if (!this._isRelevant()) {\n                return false;\n            }\n        ;\n        ;\n            var ca = this._getPageletRootID(ba);\n            return !!this._livePagelets[ca];\n        },\n        _informEventExternal: function(ba, ca) {\n            ca = ((ca || {\n            }));\n            ca.ts = JSBNG__Date.now();\n            ca.lid = this.lid;\n            this.arbiter.inform(ba, ca, w);\n        },\n        _informPageletEvent: function(ba, ca, da) {\n            var ea = {\n                JSBNG__event: ba,\n                id: ca\n            };\n            if (da) {\n                ea.phase = da;\n            }\n        ;\n        ;\n            this._informEventExternal(\"pagelet_event\", ea);\n        }\n    });\n    function y(ba) {\n        if (((!ba || ((typeof ba === \"string\"))))) {\n            return ba;\n        }\n    ;\n    ;\n        if (ba.container_id) {\n            var ca = p(ba.container_id);\n            ba = ((z(ca) || \"\"));\n            ca.parentNode.removeChild(ca);\n            return ba;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function z(ba) {\n        if (!ba.firstChild) {\n            h.loadModules([\"ErrorSignal\",], function(da) {\n                da.sendErrorSignal(\"bigpipe\", \"Pagelet markup container is empty.\");\n            });\n            return null;\n        }\n    ;\n    ;\n        if (((ba.firstChild.nodeType !== 8))) {\n            return null;\n        }\n    ;\n    ;\n        var ca = ba.firstChild.nodeValue;\n        ca = ca.substring(1, ((ca.length - 1)));\n        return ca.replace(/\\\\([\\s\\S]|$)/g, \"$1\");\n    };\n;\n    function aa(ba, ca) {\n        var da = JSBNG__document.createElement(\"div\"), ea = ((u < 7));\n        if (ea) {\n            ba.appendChild(da);\n        }\n    ;\n    ;\n        da.innerHTML = ca;\n        var fa = JSBNG__document.createDocumentFragment();\n        while (da.firstChild) {\n            fa.appendChild(da.firstChild);\n        ;\n        };\n    ;\n        ba.appendChild(fa);\n        if (ea) {\n            ba.removeChild(da);\n        }\n    ;\n    ;\n    };\n;\n    e.exports = x;\n});\n__d(\"legacy:bootloader\", [\"Bootloader\",], function(a, b, c, d) {\n    a.Bootloader = b(\"Bootloader\");\n}, 3);\n__d(\"Class\", [\"CallbackDependencyManager\",\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackDependencyManager\"), h = b(\"Bootloader\"), i = \"bootload_done\", j = false, k = new g(), l = {\n    }, m = {\n        extend: function(u, v) {\n            if (!j) {\n                h.subscribeToLoadedResources_DEPRECATED(o);\n                j = true;\n            }\n        ;\n        ;\n            if (((typeof v == \"string\"))) {\n                n(u, v);\n            }\n             else p(u, v);\n        ;\n        ;\n        }\n    };\n    function n(u, v) {\n        u.__class_extending = true;\n        var w = k.registerCallback(p.bind(null, u, v), [v,i,]);\n        if (((w !== null))) {\n            l[v] = true;\n        }\n    ;\n    ;\n    };\n;\n    function o() {\n        k.satisfyNonPersistentDependency(i);\n        {\n            var fin24keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin24i = (0);\n            var u;\n            for (; (fin24i < fin24keys.length); (fin24i++)) {\n                ((u) = (fin24keys[fin24i]));\n                {\n                    if (!!a[u]) {\n                        delete l[u];\n                        if (!a[u].__class_extending) {\n                            k.satisfyNonPersistentDependency(u);\n                        }\n                         else a[u].__class_name = u;\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function p(u, v) {\n        delete u.__class_extending;\n        v = ((((typeof v == \"string\")) ? a[v] : v));\n        var w = q(v, 0), x = q(u, ((w.prototype.__level + 1)));\n        x.parent = w;\n        if (!!u.__class_name) {\n            k.satisfyNonPersistentDependency(u.__class_name);\n        }\n    ;\n    ;\n    };\n;\n    function q(u, v) {\n        if (u._metaprototype) {\n            return u._metaprototype;\n        }\n    ;\n    ;\n        var w = new Function();\n        w.construct = r;\n        w.prototype.construct = t(u, v, true);\n        w.prototype.__level = v;\n        w.base = u;\n        u.prototype.parent = w;\n        u._metaprototype = w;\n        return w;\n    };\n;\n    function r(u) {\n        s(u.parent);\n        var v = [], w = u;\n        while (w.parent) {\n            var x = new w.parent();\n            v.push(x);\n            x.__instance = u;\n            w = w.parent;\n        };\n    ;\n        u.parent = v[1];\n        v.reverse();\n        v.pop();\n        u.__parents = v;\n        u.__instance = u;\n        return u.parent.construct.apply(u.parent, arguments);\n    };\n;\n    function s(u) {\n        if (u.initialized) {\n            return;\n        }\n    ;\n    ;\n        var v = u.base.prototype;\n        if (u.parent) {\n            s(u.parent);\n            var w = u.parent.prototype;\n            {\n                var fin25keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin25i = (0);\n                var x;\n                for (; (fin25i < fin25keys.length); (fin25i++)) {\n                    ((x) = (fin25keys[fin25i]));\n                    {\n                        if (((((((x != \"__level\")) && ((x != \"construct\")))) && ((v[x] === undefined))))) {\n                            v[x] = u.prototype[x] = w[x];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        u.initialized = true;\n        var y = u.prototype.__level;\n        {\n            var fin26keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin26i = (0);\n            var x;\n            for (; (fin26i < fin26keys.length); (fin26i++)) {\n                ((x) = (fin26keys[fin26i]));\n                {\n                    if (((x != \"parent\"))) {\n                        v[x] = u.prototype[x] = t(v[x], y);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function t(u, v, w) {\n        if (((((typeof u != \"function\")) || u.__prototyped))) {\n            return u;\n        }\n    ;\n    ;\n        var x = function() {\n            var y = this.__instance;\n            if (y) {\n                var z = y.parent;\n                y.parent = ((v ? y.__parents[((v - 1))] : null));\n                var aa = arguments;\n                if (w) {\n                    aa = [];\n                    for (var ba = 1; ((ba < arguments.length)); ba++) {\n                        aa.push(arguments[ba]);\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                var ca = u.apply(y, aa);\n                y.parent = z;\n                return ca;\n            }\n             else return u.apply(this, arguments)\n        ;\n        };\n        x.__prototyped = true;\n        return x;\n    };\n;\n    e.exports = m;\n});\n__d(\"legacy:Class\", [\"Class\",], function(a, b, c, d) {\n    a.Class = b(\"Class\");\n}, 3);\n__d(\"legacy:constructor-cache\", [\"JSCC\",], function(a, b, c, d) {\n    a.JSCC = b(\"JSCC\");\n}, 3);\n__d(\"function-extensions\", [\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\");\n    Function.prototype.curry = function() {\n        var h = g(arguments);\n        return this.bind.apply(this, [null,].concat(h));\n    };\n    Function.prototype.defer = function(h, i) {\n        if (((typeof this != \"function\"))) {\n            throw new TypeError();\n        }\n    ;\n    ;\n        h = ((h || 0));\n        return JSBNG__setTimeout(this, h, i);\n    };\n}, 3);\n__d(\"goURI\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        h = h.toString();\n        if (((((!i && a.PageTransitions)) && PageTransitions.isInitialized()))) {\n            PageTransitions.go(h, j);\n        }\n         else if (((window.JSBNG__location.href == h))) {\n            window.JSBNG__location.reload();\n        }\n         else window.JSBNG__location.href = h;\n        \n    ;\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"legacy:goURI\", [\"goURI\",], function(a, b, c, d) {\n    a.goURI = b(\"goURI\");\n}, 3);\n__d(\"InitialJSLoader\", [\"Arbiter\",\"Bootloader\",\"OnloadEvent\",\"Run\",\"ServerJS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"OnloadEvent\"), j = b(\"Run\"), k = b(\"ServerJS\"), l = {\n        INITIAL_JS_READY: \"BOOTLOAD/JSREADY\",\n        loadOnDOMContentReady: function(m, n) {\n            g.subscribe(i.ONLOAD_DOMCONTENT_CALLBACK, function() {\n                function o() {\n                    h.loadResources(m, function() {\n                        g.inform(l.INITIAL_JS_READY, true, g.BEHAVIOR_STATE);\n                    });\n                };\n            ;\n                if (n) {\n                    JSBNG__setTimeout(o, n);\n                }\n                 else o();\n            ;\n            ;\n            });\n        },\n        handleServerJS: function(m) {\n            var n = new k();\n            n.handle(m);\n            j.onAfterLoad(n.cleanup.bind(n));\n        }\n    };\n    e.exports = l;\n});\n__d(\"lowerDomain\", [], function(a, b, c, d, e, f) {\n    if (JSBNG__document.domain.toLowerCase().match(/(^|\\.)facebook\\..*/)) {\n        JSBNG__document.domain = \"facebook.com\";\n    }\n;\n;\n});\n__d(\"legacy:object-core-utils\", [\"isEmpty\",\"copyProperties\",], function(a, b, c, d) {\n    a.is_empty = b(\"isEmpty\");\n    a.copyProperties = b(\"copyProperties\");\n}, 3);\n__d(\"PlaceholderListener\", [\"Arbiter\",\"CSS\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"Parent\"), j = JSBNG__document.documentElement, k = function(m) {\n        m = ((m || window.JSBNG__event));\n        var n = ((m.target || m.srcElement));\n        if (n.getAttribute(\"data-silentPlaceholderListener\")) {\n            return;\n        }\n    ;\n    ;\n        var o = n.getAttribute(\"placeholder\");\n        if (o) {\n            var p = i.byClass(n, \"focus_target\");\n            if (((((\"JSBNG__focus\" == m.type)) || ((\"focusin\" == m.type))))) {\n                var q = n.value.replace(/\\r\\n/g, \"\\u000a\"), r = o.replace(/\\r\\n/g, \"\\u000a\");\n                if (((((q == r)) && h.hasClass(n, \"DOMControl_placeholder\")))) {\n                    n.value = \"\";\n                    h.removeClass(n, \"DOMControl_placeholder\");\n                }\n            ;\n            ;\n                if (p) {\n                    l.expandInput(p);\n                }\n            ;\n            ;\n            }\n             else {\n                if (((n.value === \"\"))) {\n                    h.addClass(n, \"DOMControl_placeholder\");\n                    n.value = o;\n                    ((p && h.removeClass(p, \"child_is_active\")));\n                    n.style.direction = \"\";\n                }\n            ;\n            ;\n                ((p && h.removeClass(p, \"child_is_focused\")));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    if (j.JSBNG__addEventListener) {\n        j.JSBNG__addEventListener(\"JSBNG__focus\", k, true);\n        j.JSBNG__addEventListener(\"JSBNG__blur\", k, true);\n    }\n     else {\n        j.JSBNG__attachEvent(\"onfocusin\", k);\n        j.JSBNG__attachEvent(\"onfocusout\", k);\n    }\n;\n;\n    var l = {\n        expandInput: function(m) {\n            h.addClass(m, \"child_is_active\");\n            h.addClass(m, \"child_is_focused\");\n            h.addClass(m, \"child_was_focused\");\n            g.inform(\"reflow\");\n        }\n    };\n    e.exports = l;\n});\n__d(\"clickRefAction\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    function h(l, m, n, o, p) {\n        var q = ((((l + \"/\")) + m));\n        this.ue = q;\n        this._ue_ts = l;\n        this._ue_count = m;\n        this._context = n;\n        this._ns = null;\n        this._node = o;\n        this._type = p;\n    };\n;\n    h.prototype.set_namespace = function(l) {\n        this._ns = l;\n        return this;\n    };\n    h.prototype.coalesce_namespace = function(l) {\n        if (((this._ns === null))) {\n            this._ns = l;\n        }\n    ;\n    ;\n        return this;\n    };\n    h.prototype.add_event = function() {\n        return this;\n    };\n    var i = 0, j = [];\n    function k(l, m, JSBNG__event, n, o) {\n        var p = JSBNG__Date.now(), q = ((JSBNG__event && JSBNG__event.type));\n        o = ((o || {\n        }));\n        if (((!m && JSBNG__event))) {\n            m = JSBNG__event.getTarget();\n        }\n    ;\n    ;\n        var r = 50;\n        if (((m && ((n != \"FORCE\"))))) {\n            for (var s = ((j.length - 1)); ((((s >= 0)) && ((((p - j[s]._ue_ts)) < r)))); --s) {\n                if (((((j[s]._node == m)) && ((j[s]._type == q))))) {\n                    return j[s];\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        var t = new h(p, i, l, m, q);\n        j.push(t);\n        while (((j.length > 10))) {\n            j.shift();\n        ;\n        };\n    ;\n        g.inform(\"ClickRefAction/new\", {\n            cfa: t,\n            node: m,\n            mode: n,\n            JSBNG__event: JSBNG__event,\n            extra_data: o\n        }, g.BEHAVIOR_PERSISTENT);\n        i++;\n        return t;\n    };\n;\n    e.exports = a.clickRefAction = k;\n});\n__d(\"trackReferrer\", [\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Parent\");\n    function h(i, j) {\n        i = g.byAttribute(i, \"data-referrer\");\n        if (i) {\n            var k = ((/^(?:(?:[^:\\/?#]+):)?(?:\\/\\/(?:[^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/.exec(j)[1] || \"\"));\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            var l = ((((k + \"|\")) + i.getAttribute(\"data-referrer\"))), m = new JSBNG__Date();\n            m.setTime(((JSBNG__Date.now() + 1000)));\n            JSBNG__document.cookie = ((((((((((((\"x-src=\" + encodeURIComponent(l))) + \"; \")) + \"expires=\")) + m.toGMTString())) + \";path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        }\n    ;\n    ;\n        return i;\n    };\n;\n    e.exports = h;\n});\n__d(\"Miny\", [], function(a, b, c, d, e, f) {\n    var g = \"Miny1\", h = {\n        encode: [],\n        decode: {\n        }\n    }, i = \"wxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_\".split(\"\");\n    function j(n) {\n        for (var o = h.encode.length; ((o < n)); o++) {\n            var p = o.toString(32).split(\"\");\n            p[((p.length - 1))] = i[parseInt(p[((p.length - 1))], 32)];\n            p = p.join(\"\");\n            h.encode[o] = p;\n            h.decode[p] = o;\n        };\n    ;\n        return h;\n    };\n;\n    function k(n) {\n        var o = n.match(/\\w+|\\W+/g), p = {\n        };\n        for (var q = 0; ((q < o.length)); q++) {\n            p[o[q]] = ((((p[o[q]] || 0)) + 1));\n        ;\n        };\n    ;\n        var r = Object.keys(p);\n        r.sort(function(u, v) {\n            return ((((p[u] < p[v])) ? 1 : ((((p[v] < p[u])) ? -1 : 0))));\n        });\n        var s = j(r.length).encode;\n        for (q = 0; ((q < r.length)); q++) {\n            p[r[q]] = s[q];\n        ;\n        };\n    ;\n        var t = [];\n        for (q = 0; ((q < o.length)); q++) {\n            t[q] = p[o[q]];\n        ;\n        };\n    ;\n        for (q = 0; ((q < r.length)); q++) {\n            r[q] = r[q].replace(/'~'/g, \"\\\\~\");\n        ;\n        };\n    ;\n        return [g,r.length,].concat(r).concat(t.join(\"\")).join(\"~\");\n    };\n;\n    function l(n) {\n        var o = n.split(\"~\");\n        if (((o.shift() != g))) {\n            throw new Error(\"Not a Miny stream\");\n        }\n    ;\n    ;\n        var p = parseInt(o.shift(), 10), q = o.pop();\n        q = q.match(/[0-9a-v]*[\\-w-zA-Z_]/g);\n        var r = o, s = j(p).decode, t = [];\n        for (var u = 0; ((u < q.length)); u++) {\n            t[u] = r[s[q[u]]];\n        ;\n        };\n    ;\n        return t.join(\"\");\n    };\n;\n    var m = {\n        encode: k,\n        decode: l\n    };\n    e.exports = m;\n});\n__d(\"QueryString\", [], function(a, b, c, d, e, f) {\n    function g(k) {\n        var l = [];\n        Object.keys(k).forEach(function(m) {\n            var n = k[m];\n            if (((typeof n === \"undefined\"))) {\n                return;\n            }\n        ;\n        ;\n            if (((n === null))) {\n                l.push(m);\n                return;\n            }\n        ;\n        ;\n            l.push(((((encodeURIComponent(m) + \"=\")) + encodeURIComponent(n))));\n        });\n        return l.join(\"&\");\n    };\n;\n    function h(k, l) {\n        var m = {\n        };\n        if (((k === \"\"))) {\n            return m;\n        }\n    ;\n    ;\n        var n = k.split(\"&\");\n        for (var o = 0; ((o < n.length)); o++) {\n            var p = n[o].split(\"=\", 2), q = decodeURIComponent(p[0]);\n            if (((l && m.hasOwnProperty(q)))) {\n                throw new URIError(((\"Duplicate key: \" + q)));\n            }\n        ;\n        ;\n            m[q] = ((((p.length === 2)) ? decodeURIComponent(p[1]) : null));\n        };\n    ;\n        return m;\n    };\n;\n    function i(k, l) {\n        return ((((k + ((~k.indexOf(\"?\") ? \"&\" : \"?\")))) + ((((typeof l === \"string\")) ? l : j.encode(l)))));\n    };\n;\n    var j = {\n        encode: g,\n        decode: h,\n        appendToUrl: i\n    };\n    e.exports = j;\n});\n__d(\"UserAgent\", [], function(a, b, c, d, e, f) {\n    var g = false, h, i, j, k, l, m, n, o, p, q, r, s, t, u;\n    function v() {\n        if (g) {\n            return;\n        }\n    ;\n    ;\n        g = true;\n        var x = JSBNG__navigator.userAgent, y = /(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))/.exec(x), z = /(Mac OS X)|(Windows)|(Linux)/.exec(x);\n        r = /\\b(iPhone|iP[ao]d)/.exec(x);\n        s = /\\b(iP[ao]d)/.exec(x);\n        p = /Android/i.exec(x);\n        t = /FBAN\\/\\w+;/i.exec(x);\n        u = /Mobile/i.exec(x);\n        q = !!(/Win64/.exec(x));\n        if (y) {\n            h = ((y[1] ? parseFloat(y[1]) : NaN));\n            if (((h && JSBNG__document.documentMode))) {\n                h = JSBNG__document.documentMode;\n            }\n        ;\n        ;\n            i = ((y[2] ? parseFloat(y[2]) : NaN));\n            j = ((y[3] ? parseFloat(y[3]) : NaN));\n            k = ((y[4] ? parseFloat(y[4]) : NaN));\n            if (k) {\n                y = /(?:Chrome\\/(\\d+\\.\\d+))/.exec(x);\n                l = ((((y && y[1])) ? parseFloat(y[1]) : NaN));\n            }\n             else l = NaN;\n        ;\n        ;\n        }\n         else h = i = j = l = k = NaN;\n    ;\n    ;\n        if (z) {\n            if (z[1]) {\n                var aa = /(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(x);\n                m = ((aa ? parseFloat(aa[1].replace(\"_\", \".\")) : true));\n            }\n             else m = false;\n        ;\n        ;\n            n = !!z[2];\n            o = !!z[3];\n        }\n         else m = n = o = false;\n    ;\n    ;\n    };\n;\n    var w = {\n        ie: function() {\n            return ((v() || h));\n        },\n        ie64: function() {\n            return ((w.ie() && q));\n        },\n        firefox: function() {\n            return ((v() || i));\n        },\n        JSBNG__opera: function() {\n            return ((v() || j));\n        },\n        webkit: function() {\n            return ((v() || k));\n        },\n        safari: function() {\n            return w.webkit();\n        },\n        chrome: function() {\n            return ((v() || l));\n        },\n        windows: function() {\n            return ((v() || n));\n        },\n        osx: function() {\n            return ((v() || m));\n        },\n        linux: function() {\n            return ((v() || o));\n        },\n        iphone: function() {\n            return ((v() || r));\n        },\n        mobile: function() {\n            return ((v() || ((((((r || s)) || p)) || u))));\n        },\n        nativeApp: function() {\n            return ((v() || t));\n        },\n        android: function() {\n            return ((v() || p));\n        },\n        ipad: function() {\n            return ((v() || s));\n        }\n    };\n    e.exports = w;\n});\n__d(\"XHR\", [\"Env\",\"ServerJS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ServerJS\"), i = 1, j = {\n        create: function() {\n            try {\n                return ((a.JSBNG__XMLHttpRequest ? new a.JSBNG__XMLHttpRequest() : new ActiveXObject(\"MSXML2.XMLHTTP.3.0\")));\n            } catch (k) {\n            \n            };\n        ;\n        },\n        getAsyncParams: function(k) {\n            var l = {\n                __user: g.user,\n                __a: 1,\n                __dyn: h.getLoadedModuleHash(),\n                __req: (i++).toString(36)\n            };\n            if (((((k == \"POST\")) && g.fb_dtsg))) {\n                l.fb_dtsg = g.fb_dtsg;\n            }\n        ;\n        ;\n            if (g.fb_isb) {\n                l.fb_isb = g.fb_isb;\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"BanzaiAdapter\", [\"Arbiter\",\"Env\",\"Miny\",\"QueryString\",\"Run\",\"UserAgent\",\"XHR\",\"BanzaiConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"Miny\"), j = b(\"QueryString\"), k = b(\"Run\"), l = b(\"UserAgent\"), m = b(\"XHR\"), n = null, o = new g(), p = b(\"BanzaiConfig\"), q = \"/ajax/bz\", r = {\n    }, s = r.adapter = {\n        config: p,\n        getUserID: function() {\n            return h.user;\n        },\n        inform: function(t) {\n            o.inform(t);\n        },\n        subscribe: function(t, u) {\n            o.subscribe(t, u);\n        },\n        cleanup: function() {\n            if (((n && ((n.readyState < 4))))) {\n                n.abort();\n            }\n        ;\n        ;\n            if (n) {\n                delete n.onreadystatechange;\n                n = null;\n            }\n        ;\n        ;\n        },\n        readyToSend: function() {\n            var t = ((((l.ie() <= 8)) ? true : JSBNG__navigator.onLine));\n            return ((!n && t));\n        },\n        send: function(t, u, v) {\n            var w = \"POST\";\n            n = m.create();\n            n.open(w, q, true);\n            n.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            n.onreadystatechange = function() {\n                if (((n.readyState >= 4))) {\n                    var aa = n.JSBNG__status;\n                    s.cleanup();\n                    if (((aa == 200))) {\n                        if (u) {\n                            u();\n                        }\n                    ;\n                    ;\n                        s.inform(r.OK);\n                    }\n                     else {\n                        if (v) {\n                            v(aa);\n                        }\n                    ;\n                    ;\n                        s.inform(r.ERROR);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n            JSBNG__setTimeout(s.cleanup, r.SEND_TIMEOUT, false);\n            var x = m.getAsyncParams(w);\n            x.q = JSON.stringify(t);\n            x.ts = JSBNG__Date.now();\n            x.ph = h.push_phase;\n            if (r.FBTRACE) {\n                x.fbtrace = r.FBTRACE;\n            }\n        ;\n        ;\n            if (r.isEnabled(\"miny_compression\")) {\n                var y = JSBNG__Date.now(), z = i.encode(x.q);\n                if (((z.length < x.q.length))) {\n                    x.q = z;\n                    x.miny_encode_ms = ((JSBNG__Date.now() - y));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            n.send(j.encode(x));\n        },\n        onUnload: function(t) {\n            k.onAfterUnload(t);\n        }\n    };\n    e.exports = r;\n});\n__d(\"pageID\", [], function(a, b, c, d, e, f) {\n    e.exports = Math.floor(((2147483648 * Math.JSBNG__random()))).toString(36);\n});\n__d(\"Banzai\", [\"BanzaiAdapter\",\"pageID\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiAdapter\"), h = g.adapter, i = b(\"pageID\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = \"Banzai\", m = \"sequencer\", n, o, p, q = [], r = {\n    }, s = ((a != a.JSBNG__top));\n    function t() {\n        if (((p && ((p.posts.length > 0))))) {\n            q.push(p);\n        }\n    ;\n    ;\n        p = {\n            user: h.getUserID(),\n            page_id: i,\n            trigger: null,\n            time: JSBNG__Date.now(),\n            posts: []\n        };\n        if (g.isEnabled(m)) {\n            p.sequence = [];\n        }\n    ;\n    ;\n    };\n;\n    function u(z) {\n        var aa = ((JSBNG__Date.now() + z));\n        if (((!o || ((aa < o))))) {\n            o = aa;\n            JSBNG__clearTimeout(n);\n            n = JSBNG__setTimeout(v, z, false);\n            return true;\n        }\n    ;\n    ;\n    };\n;\n    function v() {\n        o = null;\n        u(g.BASIC.delay);\n        if (!h.readyToSend()) {\n            return;\n        }\n    ;\n    ;\n        h.inform(g.SEND);\n        if (((((q.length <= 0)) && ((p.posts.length <= 0))))) {\n            h.inform(g.OK);\n            return;\n        }\n    ;\n    ;\n        t();\n        var z = q;\n        q = [];\n        h.send(z, null, function(aa) {\n            var ba = ((JSBNG__Date.now() - ((h.config.EXPIRY || g.EXPIRY)))), ca = ((((aa >= 400)) && ((aa < 600)))), da = z.map(function(ea) {\n                ea.posts = ea.posts.filter(function(fa) {\n                    var ga = ((ca || fa.__meta.options.retry));\n                    fa.__meta.retryCount = ((((fa.__meta.retryCount || 0)) + 1));\n                    fa[3] = fa.__meta.retryCount;\n                    return ((ga && ((fa.__meta.timestamp > ba))));\n                });\n                return ea;\n            });\n            da = da.filter(function(ea) {\n                return ((ea.posts.length > 0));\n            });\n            q = da.concat(q);\n        });\n    };\n;\n    var w, x;\n    try {\n        x = a.JSBNG__sessionStorage;\n    } catch (y) {\n    \n    };\n;\n    if (((x && !s))) {\n        w = {\n            store: function z() {\n                try {\n                    t();\n                    var ba = h.getUserID(), ca = q.filter(function(ea) {\n                        return ((ea.user == ba));\n                    }).map(function(ea) {\n                        ea = j({\n                        }, ea);\n                        ea.posts = ea.posts.map(function(fa) {\n                            return [fa[0],fa[1],fa[2],fa.__meta,];\n                        });\n                        return ea;\n                    }), da = JSON.stringify(ca);\n                    x.setItem(l, da);\n                } catch (aa) {\n                \n                };\n            ;\n            },\n            restore: function z() {\n                try {\n                    var ba = x.getItem(l);\n                    if (ba) {\n                        x.removeItem(l);\n                        var ca = h.getUserID(), da = JSON.parse(ba);\n                        da = da.filter(function(ea) {\n                            ea.posts.forEach(function(fa) {\n                                fa.__meta = fa.pop();\n                                if (((\"retryCount\" in fa.__meta))) {\n                                    fa[3] = fa.__meta.retryCount;\n                                }\n                            ;\n                            ;\n                            });\n                            return ((ea.user == ca));\n                        });\n                        q = q.concat(da);\n                    }\n                ;\n                ;\n                } catch (aa) {\n                \n                };\n            ;\n            }\n        };\n    }\n     else w = {\n        store: k,\n        restore: k\n    };\n;\n;\n    g.SEND = \"Banzai:SEND\";\n    g.OK = \"Banzai:OK\";\n    g.ERROR = \"Banzai:ERROR\";\n    g.SHUTDOWN = \"Banzai:SHUTDOWN\";\n    g.SEND_TIMEOUT = 15000;\n    g.VITAL_WAIT = 1000;\n    g.BASIC_WAIT = 60000;\n    g.EXPIRY = ((30 * 60000));\n    g.VITAL = {\n        delay: ((h.config.MIN_WAIT || g.VITAL_WAIT))\n    };\n    g.BASIC = {\n        delay: ((h.config.MAX_WAIT || g.BASIC_WAIT))\n    };\n    g.FBTRACE = h.config.fbtrace, g.isEnabled = function(z) {\n        return ((h.config.gks && h.config.gks[z]));\n    };\n    g.post = function(z, aa, ba) {\n        ba = ((ba || {\n        }));\n        if (s) {\n            if (((JSBNG__document.domain == \"facebook.com\"))) {\n                try {\n                    var da = a.JSBNG__top.require(\"Banzai\");\n                    da.post.apply(da, arguments);\n                } catch (ca) {\n                \n                };\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        if (h.config.disabled) {\n            return;\n        }\n    ;\n    ;\n        var ea = h.config.blacklist;\n        if (ea) {\n            if (((((ea && ea.join)) && !ea._regex))) {\n                ea._regex = new RegExp(((((\"^(?:\" + ea.join(\"|\"))) + \")\")));\n            }\n        ;\n        ;\n            if (((ea._regex && ea._regex.test(z)))) {\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((p.user != h.getUserID()))) {\n            t();\n        }\n    ;\n    ;\n        var fa = JSBNG__Date.now(), ga = [z,aa,((fa - p.time)),];\n        ga.__meta = {\n            options: ba,\n            timestamp: fa\n        };\n        p.posts.push(ga);\n        var ha = ba.delay;\n        if (((ha == null))) {\n            ha = g.BASIC_WAIT;\n        }\n    ;\n    ;\n        if (g.isEnabled(m)) {\n            if (!((z in r))) {\n                r[z] = 0;\n            }\n             else r[z]++;\n        ;\n        ;\n            p.sequence.push([z,r[z],]);\n        }\n    ;\n    ;\n        if (((u(ha) || !p.trigger))) {\n            p.trigger = z;\n        }\n    ;\n    ;\n    };\n    g.subscribe = h.subscribe;\n    g._testState = function() {\n        return {\n            wad: p,\n            wads: q\n        };\n    };\n    h.onUnload(function() {\n        h.cleanup();\n        h.inform(g.SHUTDOWN);\n        w.store();\n    });\n    t();\n    w.restore();\n    u(g.BASIC.delay);\n    e.exports = g;\n});\n__d(\"userAction\", [\"Arbiter\",\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"copyProperties\"), j = 50, k = [], l = {\n    }, m = {\n    };\n    function n(v, w, x, y, JSBNG__event) {\n        var z = ((((v + \"/\")) + w)), aa = u(y);\n        i(this, {\n            ue: z,\n            _uai_logged: false,\n            _uai_timeout: null,\n            _primary: {\n            },\n            _fallback: {\n            },\n            _default_ua_id: ((aa || \"-\")),\n            _default_action_type: ((JSBNG__event ? JSBNG__event.type : \"-\")),\n            _ts: v,\n            _ns: x,\n            _start_ts: v,\n            _prev_event: \"s\",\n            _ue_ts: v,\n            _ue_count: w,\n            _data_version: 1,\n            _event_version: 2,\n            _info_version: 2\n        });\n        this._log(\"ua:n\", [1,z,]);\n    };\n;\n    function o(v, w, x, y) {\n        var z = ((((v in m)) ? m[v] : {\n        })), aa = ((((w in z)) ? z[w] : {\n        })), ba;\n        if (((x in aa))) {\n            if (((\"*\" in aa[x]))) {\n                ba = aa[x][\"*\"];\n            }\n             else if (((y in aa[x]))) {\n                ba = aa[x][y];\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    var p = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    i(n.prototype, {\n        _log: function(v, w) {\n            var x = ((l[v] === true)), y = o(v, this._ns, \"ua_id\", this._get_ua_id()), z = o(v, this._ns, \"action\", this._get_action_type()), aa = ((((y !== undefined)) || ((z !== undefined)))), ba = ((aa ? ((y || z)) : x));\n            if (((h.isEnabled(\"useraction\") && ba))) {\n                h.post(v, w, p);\n            }\n        ;\n        ;\n        },\n        _get_action_type: function() {\n            return ((((this._primary._action_type || this._fallback._action_type)) || this._default_action_type));\n        },\n        _get_ua_id: function() {\n            return ((((this._primary._ua_id || this._fallback._ua_id)) || this._default_ua_id));\n        },\n        _log_uai: function() {\n            var v = [this._info_version,this.ue,this._ns,this._get_ua_id(),this._get_action_type(),];\n            this._log(\"ua:i\", v);\n            this._uai_logged = true;\n            this._uai_timeout = null;\n        },\n        uai: function(v, w, x) {\n            if (!this._uai_logged) {\n                ((this._uai_timeout && JSBNG__clearTimeout(this._uai_timeout)));\n                this._primary._ua_id = w;\n                this._primary._action_type = v;\n                if (((x === undefined))) {\n                    this._log_uai();\n                }\n                 else if (((x === false))) {\n                    this._uai_logged = true;\n                }\n                 else {\n                    var y = this;\n                    x = ((x || 0));\n                    this._uai_timeout = JSBNG__setTimeout(function() {\n                        y._log_uai.apply(y);\n                    }, x);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        uai_fallback: function(v, w, x) {\n            if (!this._uai_logged) {\n                var y = this;\n                ((this._uai_timeout && JSBNG__clearTimeout(this._uai_timeout)));\n                this._fallback._ua_id = w;\n                this._fallback._action_type = v;\n                x = ((((x === undefined)) ? j : x));\n                this._uai_timeout = JSBNG__setTimeout(function() {\n                    y._log_uai.apply(y);\n                }, x);\n            }\n        ;\n        ;\n            return this;\n        },\n        add_event: function(v, w, x) {\n            w = ((w || 0));\n            var y = ((JSBNG__Date.now() - w)), z = ((y - this._ts)), aa = ((y - ((x ? x : this._ue_ts)))), ba = [this._event_version,this.ue,this._ns,this._get_ua_id(),this._prev_event,v,z,aa,];\n            if (this._get_ua_id()) {\n                this._log(\"ua:e\", ba);\n                this._ts = y;\n                this._prev_event = v;\n            }\n        ;\n        ;\n            return this;\n        },\n        add_data: function(v) {\n            var w = [this._data_version,this.ue,v,];\n            this._log(\"ua:d\", w);\n            return this;\n        }\n    });\n    var q = 0, r = 0, s = null;\n    function t(v, w, JSBNG__event, x) {\n        x = ((x || {\n        }));\n        var y = JSBNG__Date.now();\n        if (((!w && JSBNG__event))) {\n            w = JSBNG__event.getTarget();\n        }\n    ;\n    ;\n        if (((w && s))) {\n            if (((((((((y - r)) < j)) && ((w == s)))) && ((x.mode == \"DEDUP\"))))) {\n                return k[((k.length - 1))];\n            }\n        ;\n        }\n    ;\n    ;\n        var z = new n(y, q, v, w, JSBNG__event);\n        s = w;\n        k.push(z);\n        while (((k.length > 10))) {\n            k.shift();\n        ;\n        };\n    ;\n        g.inform(\"UserAction/new\", {\n            ua: z,\n            node: w,\n            mode: x.mode,\n            JSBNG__event: JSBNG__event\n        });\n        r = y;\n        q++;\n        return z;\n    };\n;\n    function u(v) {\n        if (((!v || !v.nodeName))) {\n            return null;\n        }\n    ;\n    ;\n        return v.nodeName.toLowerCase();\n    };\n;\n    t.setUATypeConfig = function(v) {\n        i(l, v);\n    };\n    t.setCustomSampleConfig = function(v) {\n        i(m, v);\n    };\n    t.getCurrentUECount = function() {\n        return q;\n    };\n    e.exports = a.userAction = t;\n});\n__d(\"Primer\", [\"function-extensions\",\"Bootloader\",\"CSS\",\"ErrorUtils\",\"Parent\",\"clickRefAction\",\"trackReferrer\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CSS\"), i = b(\"ErrorUtils\"), j = b(\"Parent\"), k = b(\"clickRefAction\"), l = b(\"trackReferrer\"), m = b(\"userAction\"), n = null, o = /async(?:-post)?|dialog(?:-post)?|theater|toggle/, p = JSBNG__document.documentElement;\n    function q(t, u) {\n        t = j.byAttribute(t, u);\n        if (!t) {\n            return;\n        }\n    ;\n    ;\n        do {\n            var v = t.getAttribute(u);\n            JSON.parse(v).forEach(function(w) {\n                var x = t;\n                g.loadModules.call(g, [w[0],], function(y) {\n                    y[w[1]](x);\n                });\n            });\n        } while (t = j.byAttribute(t.parentNode, u));\n        return false;\n    };\n;\n    p.JSBNG__onclick = i.guard(function(t) {\n        t = ((t || window.JSBNG__event));\n        n = ((t.target || t.srcElement));\n        var u = q(n, \"data-onclick\"), v = j.byTag(n, \"A\");\n        if (!v) {\n            return u;\n        }\n    ;\n    ;\n        var w = v.getAttribute(\"ajaxify\"), x = v.href, y = ((w || x));\n        if (y) {\n            k(\"a\", v, t).coalesce_namespace(\"primer\");\n            var z = m(\"primer\", v, t, {\n                mode: \"DEDUP\"\n            }).uai_fallback(\"click\");\n            if (a.ArbiterMonitor) {\n                a.ArbiterMonitor.initUA(z, [v,]);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((((w && x)) && !(/#$/).test(x)))) {\n            var aa = ((t.which && ((t.which === 2)))), ba = ((((((t.altKey || t.ctrlKey)) || t.metaKey)) || t.shiftKey));\n            if (((aa || ba))) {\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        l(v, y);\n        var ca = ((v.rel && v.rel.match(o)));\n        ca = ((ca && ca[0]));\n        switch (ca) {\n          case \"dialog\":\n        \n          case \"dialog-post\":\n            g.loadModules([\"AsyncDialog\",], function(da) {\n                da.bootstrap(y, v, ca);\n            });\n            break;\n          case \"async\":\n        \n          case \"async-post\":\n            g.loadModules([\"AsyncRequest\",], function(da) {\n                da.bootstrap(y, v);\n            });\n            break;\n          case \"theater\":\n            g.loadModules([\"PhotoSnowlift\",], function(da) {\n                da.bootstrap(y, v);\n            });\n            break;\n          case \"toggle\":\n            h.toggleClass(v.parentNode, \"openToggler\");\n            g.loadModules([\"Toggler\",], function(da) {\n                da.bootstrap(v);\n            });\n            break;\n          default:\n            return u;\n        };\n    ;\n        return false;\n    });\n    p.JSBNG__onsubmit = i.guard(function(t) {\n        t = ((t || window.JSBNG__event));\n        var u = ((t.target || t.srcElement));\n        if (((((u && ((u.nodeName == \"FORM\")))) && ((u.getAttribute(\"rel\") == \"async\"))))) {\n            k(\"f\", u, t).coalesce_namespace(\"primer\");\n            var v = m(\"primer\", u, t, {\n                mode: \"DEDUP\"\n            }).uai_fallback(\"submit\");\n            if (a.ArbiterMonitor) {\n                a.ArbiterMonitor.initUA(v, [u,]);\n            }\n        ;\n        ;\n            var w = n;\n            g.loadModules([\"Form\",], function(x) {\n                x.bootstrap(u, w);\n            });\n            return false;\n        }\n    ;\n    ;\n    });\n    var r = null, s = i.guard(function(t, u) {\n        u = ((u || window.JSBNG__event));\n        r = ((u.target || u.srcElement));\n        q(r, ((\"data-on\" + t)));\n        var v = j.byAttribute(r, \"data-hover\");\n        if (!v) {\n            return;\n        }\n    ;\n    ;\n        switch (v.getAttribute(\"data-hover\")) {\n          case \"tooltip\":\n            g.loadModules([\"Tooltip\",], function(w) {\n                w.process(v, r);\n            });\n            break;\n        };\n    ;\n    });\n    p.JSBNG__onmouseover = s.curry(\"mouseover\");\n    if (p.JSBNG__addEventListener) {\n        p.JSBNG__addEventListener(\"JSBNG__focus\", s.curry(\"JSBNG__focus\"), true);\n    }\n     else p.JSBNG__attachEvent(\"onfocusin\", s.curry(\"JSBNG__focus\"));\n;\n;\n});\n__d(\"ScriptPath\", [\"Banzai\",\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"ErrorUtils\"), i = \"script_path_change\", j = {\n        scriptPath: null,\n        categoryToken: null\n    }, k = {\n        PAGE_LOAD: \"load\",\n        PAGE_UNLOAD: \"unload\",\n        TRANSITION: \"transition\"\n    }, l = null, m = null, n = {\n    }, o = 0, p = false, q = null;\n    function r(z) {\n        var aa = ++o;\n        n[aa] = z;\n        return aa;\n    };\n;\n    function s(z) {\n        if (n[z]) {\n            delete n[z];\n        }\n    ;\n    ;\n    };\n;\n    function t() {\n        Object.keys(n).forEach(function(z) {\n            h.applyWithGuard(n[z], null, [{\n                source: l,\n                dest: m\n            },]);\n        });\n    };\n;\n    function u(z, aa, ba) {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        var ca = {\n            source_path: z.scriptPath,\n            source_token: z.categoryToken,\n            dest_path: aa.scriptPath,\n            dest_token: aa.categoryToken,\n            navigation: q,\n            cause: ba\n        };\n        g.post(i, ca);\n    };\n;\n    function v() {\n        u(j, m, k.PAGE_LOAD);\n    };\n;\n    function w(z, aa) {\n        u(z, aa, k.TRANSITION);\n    };\n;\n    function x() {\n        u(m, j, k.PAGE_UNLOAD);\n    };\n;\n    g.subscribe(g.SHUTDOWN, x);\n    var y = {\n        set: function(z, aa) {\n            var ba = m;\n            m = {\n                scriptPath: z,\n                categoryToken: aa\n            };\n            window._script_path = z;\n            t();\n            if (p) {\n                if (ba) {\n                    w(ba, m);\n                }\n                 else v();\n            ;\n            }\n        ;\n        ;\n        },\n        setNavigation: function(z) {\n            q = z;\n        },\n        startLogging: function() {\n            p = true;\n            if (m) {\n                v();\n            }\n        ;\n        ;\n        },\n        stopLogging: function() {\n            p = false;\n        },\n        getScriptPath: function() {\n            return ((m ? m.scriptPath : undefined));\n        },\n        getCategoryToken: function() {\n            return ((m ? m.categoryToken : undefined));\n        },\n        subscribe: function(z) {\n            return r(z);\n        },\n        unsubscribe: function(z) {\n            s(z);\n        }\n    };\n    y.CAUSE = k;\n    y.BANZAI_LOGGING_ROUTE = i;\n    e.exports = y;\n});\n__d(\"URLFragmentPrelude\", [\"ScriptPath\",\"URLFragmentPreludeConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptPath\"), h = b(\"URLFragmentPreludeConfig\"), i = /^(?:(?:[^:\\/?#]+):)?(?:\\/\\/(?:[^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/, j = \"\", k = /^[^\\/\\\\#!\\.\\?\\*\\&\\^]+$/;\n    window.JSBNG__location.href.replace(i, function(l, m, n, o) {\n        var p, q, r, s;\n        p = q = ((m + ((n ? ((\"?\" + n)) : \"\"))));\n        if (o) {\n            if (h.incorporateQuicklingFragment) {\n                var t = o.replace(/^(!|%21)/, \"\");\n                r = t.charAt(0);\n                if (((((r == \"/\")) || ((r == \"\\\\\"))))) {\n                    p = t.replace(/^[\\\\\\/]+/, \"/\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (h.hashtagRedirect) {\n                if (((q == p))) {\n                    var u = o.match(k);\n                    if (((((u && !n)) && ((m == \"/\"))))) {\n                        p = ((\"/hashtag/\" + o));\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((p != q))) {\n            s = g.getScriptPath();\n            if (s) {\n                JSBNG__document.cookie = ((((((\"rdir=\" + s)) + \"; path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n            }\n        ;\n        ;\n            window.JSBNG__location.replace(((j + p)));\n        }\n    ;\n    ;\n    });\n});\n__d(\"removeArrayReduce\", [], function(a, b, c, d, e, f) {\n    Array.prototype.reduce = undefined;\n    Array.prototype.reduceRight = undefined;\n});\n__d(\"cx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(((\"cx\" + \"(...): Unexpected class transformation.\")));\n    };\n;\n    e.exports = g;\n});\n__d(\"LitestandSidebarPrelude\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    e.exports = {\n        init: function(i, j, k) {\n            var l = JSBNG__document.documentElement;\n            l.className = ((l.className + \" sidebarMode\"));\n            if (((j || ((l.clientWidth <= k))))) {\n                l.className = ((((l.className + \" \")) + \"-cx-PUBLIC-hasLitestandBookmarksSidebar__collapsed\"));\n            }\n        ;\n        ;\n            g.show(i);\n        }\n    };\n});\n__d(\"SubmitOnEnterListener\", [\"Bootloader\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\");\n    JSBNG__document.documentElement.JSBNG__onkeydown = function(i) {\n        i = ((i || window.JSBNG__event));\n        var j = ((i.target || i.srcElement)), k = ((((((((((((i.keyCode == 13)) && !i.altKey)) && !i.ctrlKey)) && !i.metaKey)) && !i.shiftKey)) && h.hasClass(j, \"enter_submit\")));\n        if (k) {\n            g.loadModules([\"DOM\",\"Input\",\"trackReferrer\",\"Form\",], function(l, m, n, o) {\n                if (!m.isEmpty(j)) {\n                    var p = j.form, q = ((l.scry(p, \".enter_submit_target\")[0] || l.scry(p, \"[type=\\\"submit\\\"]\")[0]));\n                    if (q) {\n                        var r = ((o.getAttribute(p, \"ajaxify\") || o.getAttribute(p, \"action\")));\n                        if (r) {\n                            n(p, r);\n                        }\n                    ;\n                    ;\n                        q.click();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            return false;\n        }\n    ;\n    ;\n    };\n});\n__d(\"CommentPrelude\", [\"CSS\",\"Parent\",\"clickRefAction\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Parent\"), i = b(\"clickRefAction\"), j = b(\"userAction\");\n    function k(o, p) {\n        j(\"ufi\", o).uai(\"click\");\n        i(\"ufi\", o, null, \"FORCE\");\n        return l(o, p);\n    };\n;\n    function l(o, p) {\n        var q = h.byTag(o, \"form\");\n        m(q);\n        var r = g.removeClass.curry(q, \"hidden_add_comment\");\n        if (window.ScrollAwareDOM) {\n            window.ScrollAwareDOM.monitor(q, r);\n        }\n         else r();\n    ;\n    ;\n        if (((p !== false))) {\n            var s = ((q.add_comment_text_text || q.add_comment_text)), t = s.length;\n            if (t) {\n                if (!h.byClass(s[((t - 1))], \"UFIReplyList\")) {\n                    s[((t - 1))].JSBNG__focus();\n                }\n                 else if (!h.byClass(s[0], \"UFIReplyList\")) {\n                    s[0].JSBNG__focus();\n                }\n                \n            ;\n            ;\n            }\n             else s.JSBNG__focus();\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function m(o) {\n        var p = g.removeClass.curry(o, \"collapsed_comments\");\n        if (window.ScrollAwareDOM) {\n            window.ScrollAwareDOM.monitor(o, p);\n        }\n         else p();\n    ;\n    ;\n    };\n;\n    var n = {\n        click: k,\n        expand: l,\n        uncollapse: m\n    };\n    e.exports = n;\n});\n__d(\"legacy:ufi-comment-prelude-js\", [\"CommentPrelude\",], function(a, b, c, d) {\n    var e = b(\"CommentPrelude\");\n    a.fc_click = e.click;\n    a.fc_expand = e.expand;\n}, 3);\n__d(\"ScriptMonitor\", [], function(a, b, c, d, e, f) {\n    var g, h = [], i = ((((window.JSBNG__MutationObserver || window.JSBNG__WebKitMutationObserver)) || window.MozMutationObserver));\n    e.exports = {\n        activate: function() {\n            if (!i) {\n                return;\n            }\n        ;\n        ;\n            g = new i(function(j) {\n                for (var k = 0; ((k < j.length)); k++) {\n                    var l = j[k];\n                    if (((l.type == \"childList\"))) {\n                        for (var m = 0; ((m < l.addedNodes.length)); m++) {\n                            var n = l.addedNodes[m];\n                            if (((((((n.tagName == \"SCRIPT\")) || ((n.tagName == \"div\")))) && n.src))) {\n                                h.push(n.src);\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else if (((((l.type == \"attributes\")) && ((l.attributeName == \"src\"))))) {\n                        h.push(l.target.src);\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n            });\n            g.observe(JSBNG__document, {\n                attributes: true,\n                childList: true,\n                subtree: true\n            });\n        },\n        JSBNG__stop: function() {\n            ((g && g.disconnect()));\n            return h;\n        }\n    };\n});");
// 907
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"(window.Bootloader && Bootloader.done([\"FHcQn\",]));");
// 908
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s1ec9de22962c463704debb06fba6d985fa278804");
// 909
geval("((window.Bootloader && Bootloader.done([\"FHcQn\",])));");
// 910
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/25OruCXh1Wh.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/wjDxPTNT3gj.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/BeJ1_p_ZVAB.js\"\n    }\n});");
// 911
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s537635bfd0babcbb6eb8ac0a8d5d188fecb22355");
// 912
geval("Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/25OruCXh1Wh.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/wjDxPTNT3gj.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/BeJ1_p_ZVAB.js\"\n    }\n});");
// 969
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"");
// 970
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sda39a3ee5e6b4b0d3255bfef95601890afd80709");
// 971
geval("");
// 972
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 973
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sbc7df7f6bb75d7e29414a7bf76d7afea4393a8e7");
// 974
geval("new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 1001
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"AyUu6\",]);\n}\n;\n__d(\"XdArbiterBuffer\", [], function(a, b, c, d, e, f) {\n    if (!a.XdArbiter) {\n        a.XdArbiter = {\n            _m: [],\n            _p: [],\n            register: function(g, h, i) {\n                h = (h || (((/^apps\\./).test(location.hostname) ? \"canvas\" : \"tab\")));\n                this._p.push([g,h,i,]);\n                return h;\n            },\n            handleMessage: function(g, h) {\n                this._m.push([g,h,]);\n            }\n        };\n    };\n});\n__d(\"CanvasIFrameLoader\", [\"XdArbiterBuffer\",\"$\",], function(a, b, c, d, e, f) {\n    b(\"XdArbiterBuffer\");\n    var g = b(\"$\"), h = {\n        loadFromForm: function(i) {\n            i.submit();\n        }\n    };\n    e.exports = h;\n});\n__d(\"PHPQuerySerializer\", [], function(a, b, c, d, e, f) {\n    function g(n) {\n        return h(n, null);\n    };\n    function h(n, o) {\n        o = (o || \"\");\n        var p = [];\n        if (((n === null) || (n === undefined))) {\n            p.push(i(o));\n        }\n         else if ((typeof (n) == \"object\")) {\n            for (var q in n) {\n                if ((n.hasOwnProperty(q) && (n[q] !== undefined))) {\n                    p.push(h(n[q], (o ? ((((o + \"[\") + q) + \"]\")) : q)));\n                };\n            };\n        }\n         else p.push(((i(o) + \"=\") + i(n)));\n        \n    ;\n        return p.join(\"&\");\n    };\n    function i(n) {\n        return encodeURIComponent(n).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n    };\n    var j = /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/;\n    function k(n) {\n        if (!n) {\n            return {\n            }\n        };\n        var o = {\n        };\n        n = n.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n        n = n.split(\"&\");\n        var p = Object.prototype.hasOwnProperty;\n        for (var q = 0, r = n.length; (q < r); q++) {\n            var s = n[q].match(j);\n            if (!s) {\n                var t = n[q].split(\"=\");\n                o[l(t[0])] = ((t[1] === undefined) ? null : l(t[1]));\n            }\n             else {\n                var u = s[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), v = s[1], w = l((s[3] || \"\"));\n                u[0] = v;\n                var x = o;\n                for (var y = 0; (y < (u.length - 1)); y++) {\n                    if (u[y]) {\n                        if (!p.call(x, u[y])) {\n                            var z = ((u[(y + 1)] && !u[(y + 1)].match(/^\\d{1,3}$/)) ? {\n                            } : []);\n                            x[u[y]] = z;\n                            if ((x[u[y]] !== z)) {\n                                return o\n                            };\n                        }\n                    ;\n                        x = x[u[y]];\n                    }\n                     else {\n                        if ((u[(y + 1)] && !u[(y + 1)].match(/^\\d{1,3}$/))) {\n                            x.push({\n                            });\n                        }\n                         else x.push([]);\n                    ;\n                        x = x[(x.length - 1)];\n                    }\n                ;\n                };\n                if (((x instanceof Array) && (u[(u.length - 1)] === \"\"))) {\n                    x.push(w);\n                }\n                 else x[u[(u.length - 1)]] = w;\n            ;\n            }\n        ;\n        };\n        return o;\n    };\n    function l(n) {\n        return decodeURIComponent(n.replace(/\\+/g, \" \"));\n    };\n    var m = {\n        serialize: g,\n        encodeComponent: i,\n        deserialize: k,\n        decodeComponent: l\n    };\n    e.exports = m;\n});\n__d(\"URIBase\", [\"PHPQuerySerializer\",\"copyProperties\",\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"PHPQuerySerializer\"), h = b(\"copyProperties\"), i = b(\"ex\"), j = /((([\\-\\w]+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/, k = new RegExp(((\"[\\\\x00-\\\\x2c\\\\x2f\\\\x3b-\\\\x40\\\\x5c\\\\x5e\\\\x60\\\\x7b-\\\\x7f\" + \"\\\\uFDD0-\\\\uFDEF\\\\uFFF0-\\\\uFFFF\") + \"\\\\u2047\\\\u2048\\\\uFE56\\\\uFE5F\\\\uFF03\\\\uFF0F\\\\uFF1F]\")), l = new RegExp((\"^(?:[^/]*:|\" + \"[\\\\x00-\\\\x1f]*/[\\\\x00-\\\\x1f]*/)\"));\n    function m(o, p, q) {\n        if (!p) {\n            return true\n        };\n        if ((p instanceof n)) {\n            o.setProtocol(p.getProtocol());\n            o.setDomain(p.getDomain());\n            o.setPort(p.getPort());\n            o.setPath(p.getPath());\n            o.setQueryData(JSON.parse(JSON.stringify(p.getQueryData())));\n            o.setFragment(p.getFragment());\n            return true;\n        }\n    ;\n        p = p.toString();\n        var r = p.match(j);\n        o.setProtocol((r[3] || \"\"));\n        if ((k.test((r[4] || \"\")) && !q)) {\n            return false\n        };\n        o.setDomain((r[4] || \"\"));\n        o.setPort((r[6] || \"\"));\n        o.setPath((r[7] || \"\"));\n        if (q) {\n            o.setQueryData((g.deserialize(r[9]) || {\n            }));\n        }\n         else try {\n            o.setQueryData((g.deserialize(r[9]) || {\n            }));\n        } catch (s) {\n            return false;\n        }\n    ;\n        o.setFragment((r[11] || \"\"));\n        if ((!o.getDomain() && (o.getPath().indexOf(\"\\\\\") !== -1))) {\n            if (q) {\n                throw new Error(i(\"URI.parse: invalid URI (no domain but multiple back-slashes): %s\", o.toString()));\n            }\n             else return false\n        \n        };\n        if ((!o.getProtocol() && l.test(p))) {\n            if (q) {\n                throw new Error(i(\"URI.parse: invalid URI (unsafe protocol-relative URLs): %s\", o.toString()));\n            }\n             else return false\n        \n        };\n        return true;\n    };\n    function n(o) {\n        this.$URIBase0 = \"\";\n        this.$URIBase1 = \"\";\n        this.$URIBase2 = \"\";\n        this.$URIBase3 = \"\";\n        this.$URIBase4 = \"\";\n        this.$URIBase5 = {\n        };\n        m(this, o, true);\n    };\n    n.prototype.setProtocol = function(o) {\n        this.$URIBase0 = o;\n        return this;\n    };\n    n.prototype.getProtocol = function(o) {\n        return this.$URIBase0;\n    };\n    n.prototype.setSecure = function(o) {\n        return this.setProtocol((o ? \"https\" : \"http\"));\n    };\n    n.prototype.isSecure = function() {\n        return (this.getProtocol() === \"https\");\n    };\n    n.prototype.setDomain = function(o) {\n        if (k.test(o)) {\n            throw new Error(i(\"URI.setDomain: unsafe domain specified: %s for url %s\", o, this.toString()))\n        };\n        this.$URIBase1 = o;\n        return this;\n    };\n    n.prototype.getDomain = function() {\n        return this.$URIBase1;\n    };\n    n.prototype.setPort = function(o) {\n        this.$URIBase2 = o;\n        return this;\n    };\n    n.prototype.getPort = function() {\n        return this.$URIBase2;\n    };\n    n.prototype.setPath = function(o) {\n        this.$URIBase3 = o;\n        return this;\n    };\n    n.prototype.getPath = function() {\n        return this.$URIBase3;\n    };\n    n.prototype.addQueryData = function(o, p) {\n        if ((o instanceof Object)) {\n            h(this.$URIBase5, o);\n        }\n         else this.$URIBase5[o] = p;\n    ;\n        return this;\n    };\n    n.prototype.setQueryData = function(o) {\n        this.$URIBase5 = o;\n        return this;\n    };\n    n.prototype.getQueryData = function() {\n        return this.$URIBase5;\n    };\n    n.prototype.removeQueryData = function(o) {\n        if (!Array.isArray(o)) {\n            o = [o,];\n        };\n        for (var p = 0, q = o.length; (p < q); ++p) {\n            delete this.$URIBase5[o[p]];;\n        };\n        return this;\n    };\n    n.prototype.setFragment = function(o) {\n        this.$URIBase4 = o;\n        return this;\n    };\n    n.prototype.getFragment = function() {\n        return this.$URIBase4;\n    };\n    n.prototype.toString = function() {\n        var o = \"\";\n        if (this.$URIBase0) {\n            o += (this.$URIBase0 + \"://\");\n        };\n        if (this.$URIBase1) {\n            o += this.$URIBase1;\n        };\n        if (this.$URIBase2) {\n            o += (\":\" + this.$URIBase2);\n        };\n        if (this.$URIBase3) {\n            o += this.$URIBase3;\n        }\n         else if (o) {\n            o += \"/\";\n        }\n    ;\n        var p = g.serialize(this.$URIBase5);\n        if (p) {\n            o += (\"?\" + p);\n        };\n        if (this.$URIBase4) {\n            o += (\"#\" + this.$URIBase4);\n        };\n        return o;\n    };\n    n.prototype.getOrigin = function() {\n        return (((this.$URIBase0 + \"://\") + this.$URIBase1) + ((this.$URIBase2 ? (\":\" + this.$URIBase2) : \"\")));\n    };\n    n.isValidURI = function(o) {\n        return m(new n(), o, false);\n    };\n    e.exports = n;\n});\n__d(\"URI\", [\"URIBase\",\"copyProperties\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URIBase\"), h = b(\"copyProperties\"), i = b(\"goURI\"), j = ((g === null) ? null : g.prototype);\n    k.prototype = Object.create(j);\n    k.prototype.constructor = k;\n    k.__superConstructor__ = g;\n    function k(l) {\n        if (!((this instanceof k))) {\n            return new k((l || window.location.href))\n        };\n        g.call(this, (l || \"\"));\n    };\n    k.prototype.setPath = function(l) {\n        this.path = l;\n        return j.setPath.call(this, l);\n    };\n    k.prototype.getPath = function() {\n        var l = j.getPath.call(this);\n        if (l) {\n            return l.replace(/^\\/+/, \"/\")\n        };\n        return l;\n    };\n    k.prototype.setProtocol = function(l) {\n        this.protocol = l;\n        return j.setProtocol.call(this, l);\n    };\n    k.prototype.setDomain = function(l) {\n        this.domain = l;\n        return j.setDomain.call(this, l);\n    };\n    k.prototype.setPort = function(l) {\n        this.port = l;\n        return j.setPort.call(this, l);\n    };\n    k.prototype.setFragment = function(l) {\n        this.fragment = l;\n        return j.setFragment.call(this, l);\n    };\n    k.prototype.isEmpty = function() {\n        return !((((((this.getPath() || this.getProtocol()) || this.getDomain()) || this.getPort()) || (Object.keys(this.getQueryData()).length > 0)) || this.getFragment()));\n    };\n    k.prototype.valueOf = function() {\n        return this.toString();\n    };\n    k.prototype.isFacebookURI = function() {\n        if (!k.$URI5) {\n            k.$URI5 = new RegExp(\"(^|\\\\.)facebook\\\\.com$\", \"i\");\n        };\n        if (this.isEmpty()) {\n            return false\n        };\n        if ((!this.getDomain() && !this.getProtocol())) {\n            return true\n        };\n        return ((([\"http\",\"https\",].indexOf(this.getProtocol()) !== -1) && k.$URI5.test(this.getDomain())));\n    };\n    k.prototype.getRegisteredDomain = function() {\n        if (!this.getDomain()) {\n            return \"\"\n        };\n        if (!this.isFacebookURI()) {\n            return null\n        };\n        var l = this.getDomain().split(\".\"), m = l.indexOf(\"facebook\");\n        return l.slice(m).join(\".\");\n    };\n    k.prototype.getUnqualifiedURI = function() {\n        return new k(this).setProtocol(null).setDomain(null).setPort(null);\n    };\n    k.prototype.getQualifiedURI = function() {\n        return new k(this).$URI6();\n    };\n    k.prototype.$URI6 = function() {\n        if (!this.getDomain()) {\n            var l = k();\n            this.setProtocol(l.getProtocol()).setDomain(l.getDomain()).setPort(l.getPort());\n        }\n    ;\n        return this;\n    };\n    k.prototype.isSameOrigin = function(l) {\n        var m = (l || window.location.href);\n        if (!((m instanceof k))) {\n            m = new k(m.toString());\n        };\n        if ((this.isEmpty() || m.isEmpty())) {\n            return false\n        };\n        if ((this.getProtocol() && (this.getProtocol() != m.getProtocol()))) {\n            return false\n        };\n        if ((this.getDomain() && (this.getDomain() != m.getDomain()))) {\n            return false\n        };\n        if ((this.getPort() && (this.getPort() != m.getPort()))) {\n            return false\n        };\n        return true;\n    };\n    k.prototype.go = function(l) {\n        i(this, l);\n    };\n    k.prototype.setSubdomain = function(l) {\n        var m = this.$URI6().getDomain().split(\".\");\n        if ((m.length <= 2)) {\n            m.unshift(l);\n        }\n         else m[0] = l;\n    ;\n        return this.setDomain(m.join(\".\"));\n    };\n    k.prototype.getSubdomain = function() {\n        if (!this.getDomain()) {\n            return \"\"\n        };\n        var l = this.getDomain().split(\".\");\n        if ((l.length <= 2)) {\n            return \"\";\n        }\n         else return l[0]\n    ;\n    };\n    k.isValidURI = g.isValidURI;\n    h(k, {\n        getRequestURI: function(l, m) {\n            l = ((l === undefined) || l);\n            var n = a.PageTransitions;\n            if (((l && n) && n.isInitialized())) {\n                return n.getCurrentURI(!!m).getQualifiedURI();\n            }\n             else return new k(window.location.href)\n        ;\n        },\n        getMostRecentURI: function() {\n            var l = a.PageTransitions;\n            if ((l && l.isInitialized())) {\n                return l.getMostRecentURI().getQualifiedURI();\n            }\n             else return new k(window.location.href)\n        ;\n        },\n        getNextURI: function() {\n            var l = a.PageTransitions;\n            if ((l && l.isInitialized())) {\n                return l.getNextURI().getQualifiedURI();\n            }\n             else return new k(window.location.href)\n        ;\n        },\n        expression: /(((\\w+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/,\n        arrayQueryExpression: /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/,\n        explodeQuery: function(l) {\n            if (!l) {\n                return {\n                }\n            };\n            var m = {\n            };\n            l = l.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n            l = l.split(\"&\");\n            var n = Object.prototype.hasOwnProperty;\n            for (var o = 0, p = l.length; (o < p); o++) {\n                var q = l[o].match(k.arrayQueryExpression);\n                if (!q) {\n                    var r = l[o].split(\"=\");\n                    m[k.decodeComponent(r[0])] = ((r[1] === undefined) ? null : k.decodeComponent(r[1]));\n                }\n                 else {\n                    var s = q[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), t = q[1], u = k.decodeComponent((q[3] || \"\"));\n                    s[0] = t;\n                    var v = m;\n                    for (var w = 0; (w < (s.length - 1)); w++) {\n                        if (s[w]) {\n                            if (!n.call(v, s[w])) {\n                                var x = ((s[(w + 1)] && !s[(w + 1)].match(/^\\d{1,3}$/)) ? {\n                                } : []);\n                                v[s[w]] = x;\n                                if ((v[s[w]] !== x)) {\n                                    return m\n                                };\n                            }\n                        ;\n                            v = v[s[w]];\n                        }\n                         else {\n                            if ((s[(w + 1)] && !s[(w + 1)].match(/^\\d{1,3}$/))) {\n                                v.push({\n                                });\n                            }\n                             else v.push([]);\n                        ;\n                            v = v[(v.length - 1)];\n                        }\n                    ;\n                    };\n                    if (((v instanceof Array) && (s[(s.length - 1)] === \"\"))) {\n                        v.push(u);\n                    }\n                     else v[s[(s.length - 1)]] = u;\n                ;\n                }\n            ;\n            };\n            return m;\n        },\n        implodeQuery: function(l, m, n) {\n            m = (m || \"\");\n            if ((n === undefined)) {\n                n = true;\n            };\n            var o = [];\n            if (((l === null) || (l === undefined))) {\n                o.push((n ? k.encodeComponent(m) : m));\n            }\n             else if ((l instanceof Array)) {\n                for (var p = 0; (p < l.length); ++p) {\n                    try {\n                        if ((l[p] !== undefined)) {\n                            o.push(k.implodeQuery(l[p], (m ? ((((m + \"[\") + p) + \"]\")) : p), n));\n                        };\n                    } catch (q) {\n                    \n                    };\n                };\n            }\n             else if ((typeof (l) == \"object\")) {\n                if ((((\"nodeName\" in l)) && ((\"nodeType\" in l)))) {\n                    o.push(\"{node}\");\n                }\n                 else for (var r in l) {\n                    try {\n                        if ((l[r] !== undefined)) {\n                            o.push(k.implodeQuery(l[r], (m ? ((((m + \"[\") + r) + \"]\")) : r), n));\n                        };\n                    } catch (q) {\n                    \n                    };\n                }\n            ;\n            }\n             else if (n) {\n                o.push(((k.encodeComponent(m) + \"=\") + k.encodeComponent(l)));\n            }\n             else o.push(((m + \"=\") + l));\n            \n            \n            \n        ;\n            return o.join(\"&\");\n        },\n        encodeComponent: function(l) {\n            return encodeURIComponent(l).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n        },\n        decodeComponent: function(l) {\n            return decodeURIComponent(l.replace(/\\+/g, \" \"));\n        }\n    });\n    e.exports = k;\n});\n__d(\"AsyncSignal\", [\"Env\",\"ErrorUtils\",\"QueryString\",\"URI\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ErrorUtils\"), i = b(\"QueryString\"), j = b(\"URI\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(n, o) {\n        this.data = (o || {\n        });\n        if ((g.tracking_domain && (n.charAt(0) == \"/\"))) {\n            n = (g.tracking_domain + n);\n        };\n        this.uri = n;\n    };\n    m.prototype.setHandler = function(n) {\n        this.handler = n;\n        return this;\n    };\n    m.prototype.send = function() {\n        var n = this.handler, o = this.data, p = new Image();\n        if (n) {\n            p.onload = p.onerror = function() {\n                h.applyWithGuard(n, null, [(p.height == 1),]);\n            };\n        };\n        o.asyncSignal = ((((Math.random() * 10000) | 0)) + 1);\n        var q = new j(this.uri).isFacebookURI();\n        l(o, k.getAsyncParams((q ? \"POST\" : \"GET\")));\n        p.src = i.appendToUrl(this.uri, o);\n        return this;\n    };\n    e.exports = m;\n});\n__d(\"createObjectFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i, j) {\n        var k = {\n        }, l = g(j);\n        if ((typeof j == \"undefined\")) {\n            j = true;\n        };\n        for (var m = i.length; m--; ) {\n            k[i[m]] = (l ? j[m] : j);;\n        };\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"DOMQuery\", [\"CSS\",\"UserAgent\",\"createArrayFrom\",\"createObjectFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"UserAgent\"), i = b(\"createArrayFrom\"), j = b(\"createObjectFrom\"), k = b(\"ge\"), l = null;\n    function m(o, p) {\n        return (o.hasAttribute ? o.hasAttribute(p) : (o.getAttribute(p) !== null));\n    };\n    var n = {\n        find: function(o, p) {\n            var q = n.scry(o, p);\n            return q[0];\n        },\n        scry: function(o, p) {\n            if ((!o || !o.getElementsByTagName)) {\n                return []\n            };\n            var q = p.split(\" \"), r = [o,];\n            for (var s = 0; (s < q.length); s++) {\n                if ((r.length === 0)) {\n                    break;\n                };\n                if ((q[s] === \"\")) {\n                    continue;\n                };\n                var t = q[s], u = q[s], v = [], w = false;\n                if ((t.charAt(0) == \"^\")) {\n                    if ((s === 0)) {\n                        w = true;\n                        t = t.slice(1);\n                    }\n                     else return []\n                \n                };\n                t = t.replace(/\\[(?:[^=\\]]*=(?:\"[^\"]*\"|'[^']*'))?|[.#]/g, \" $&\");\n                var x = t.split(\" \"), y = (x[0] || \"*\"), z = (y == \"*\"), aa = (x[1] && (x[1].charAt(0) == \"#\"));\n                if (aa) {\n                    var ba = k(x[1].slice(1), o, y);\n                    if ((ba && ((z || (ba.tagName.toLowerCase() == y))))) {\n                        for (var ca = 0; (ca < r.length); ca++) {\n                            if ((w && n.contains(ba, r[ca]))) {\n                                v = [ba,];\n                                break;\n                            }\n                             else if (((document == r[ca]) || n.contains(r[ca], ba))) {\n                                v = [ba,];\n                                break;\n                            }\n                            \n                        ;\n                        }\n                    };\n                }\n                 else {\n                    var da = [], ea = r.length, fa, ga = ((!w && (u.indexOf(\"[\") < 0)) && document.querySelectorAll);\n                    for (var ha = 0; (ha < ea); ha++) {\n                        if (w) {\n                            fa = [];\n                            var ia = r[ha].parentNode;\n                            while (n.isElementNode(ia)) {\n                                if ((z || (ia.tagName.toLowerCase() == y))) {\n                                    fa.push(ia);\n                                };\n                                ia = ia.parentNode;\n                            };\n                        }\n                         else if (ga) {\n                            fa = r[ha].querySelectorAll(u);\n                        }\n                         else fa = r[ha].getElementsByTagName(y);\n                        \n                    ;\n                        var ja = fa.length;\n                        for (var ka = 0; (ka < ja); ka++) {\n                            da.push(fa[ka]);;\n                        };\n                    };\n                    if (!ga) {\n                        for (var la = 1; (la < x.length); la++) {\n                            var ma = x[la], na = (ma.charAt(0) == \".\"), oa = ma.substring(1);\n                            for (ha = 0; (ha < da.length); ha++) {\n                                var pa = da[ha];\n                                if ((!pa || (pa.nodeType !== 1))) {\n                                    continue;\n                                };\n                                if (na) {\n                                    if (!g.hasClass(pa, oa)) {\n                                        delete da[ha];\n                                    };\n                                    continue;\n                                }\n                                 else {\n                                    var qa = ma.slice(1, (ma.length - 1));\n                                    if ((qa.indexOf(\"=\") == -1)) {\n                                        if (!m(pa, qa)) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    }\n                                     else {\n                                        var ra = qa.split(\"=\"), sa = ra[0], ta = ra[1];\n                                        ta = ta.slice(1, (ta.length - 1));\n                                        if ((pa.getAttribute(sa) != ta)) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    }\n                                ;\n                                }\n                            ;\n                            };\n                        }\n                    };\n                    for (ha = 0; (ha < da.length); ha++) {\n                        if (da[ha]) {\n                            v.push(da[ha]);\n                            if (w) {\n                                break;\n                            };\n                        }\n                    ;\n                    };\n                }\n            ;\n                r = v;\n            };\n            return r;\n        },\n        getText: function(o) {\n            if (n.isTextNode(o)) {\n                return o.data;\n            }\n             else if (n.isElementNode(o)) {\n                if ((l === null)) {\n                    var p = document.createElement(\"div\");\n                    l = ((p.textContent != null) ? \"textContent\" : \"innerText\");\n                }\n            ;\n                return o[l];\n            }\n             else return \"\"\n            \n        ;\n        },\n        getSelection: function() {\n            var o = window.getSelection, p = document.selection;\n            if (o) {\n                return (o() + \"\");\n            }\n             else if (p) {\n                return p.createRange().text\n            }\n        ;\n            return null;\n        },\n        contains: function(o, p) {\n            o = k(o);\n            p = k(p);\n            if ((!o || !p)) {\n                return false;\n            }\n             else if ((o === p)) {\n                return true;\n            }\n             else if (n.isTextNode(o)) {\n                return false;\n            }\n             else if (n.isTextNode(p)) {\n                return n.contains(o, p.parentNode);\n            }\n             else if (o.contains) {\n                return o.contains(p);\n            }\n             else if (o.compareDocumentPosition) {\n                return !!((o.compareDocumentPosition(p) & 16));\n            }\n             else return false\n            \n            \n            \n            \n            \n        ;\n        },\n        getRootElement: function() {\n            var o = null;\n            if ((window.Quickling && Quickling.isActive())) {\n                o = k(\"content\");\n            };\n            return (o || document.body);\n        },\n        isNode: function(o) {\n            return !!((o && (((typeof Node !== \"undefined\") ? (o instanceof Node) : (((typeof o == \"object\") && (typeof o.nodeType == \"number\")) && (typeof o.nodeName == \"string\"))))));\n        },\n        isNodeOfType: function(o, p) {\n            var q = i(p).join(\"|\").toUpperCase().split(\"|\"), r = j(q);\n            return (n.isNode(o) && (o.nodeName in r));\n        },\n        isElementNode: function(o) {\n            return (n.isNode(o) && (o.nodeType == 1));\n        },\n        isTextNode: function(o) {\n            return (n.isNode(o) && (o.nodeType == 3));\n        },\n        isInputNode: function(o) {\n            return (n.isNodeOfType(o, [\"input\",\"textarea\",]) || (o.contentEditable === \"true\"));\n        },\n        getDocumentScrollElement: function(o) {\n            o = (o || document);\n            var p = (h.chrome() || h.webkit());\n            return ((!p && (o.compatMode === \"CSS1Compat\")) ? o.documentElement : o.body);\n        }\n    };\n    e.exports = n;\n});\n__d(\"DataStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = 1;\n    function i(l) {\n        if ((typeof l == \"string\")) {\n            return (\"str_\" + l);\n        }\n         else return (\"elem_\" + ((l.__FB_TOKEN || (l.__FB_TOKEN = [h++,])))[0])\n    ;\n    };\n    function j(l) {\n        var m = i(l);\n        return (g[m] || (g[m] = {\n        }));\n    };\n    var k = {\n        set: function(l, m, n) {\n            if (!l) {\n                throw new TypeError((\"DataStore.set: namespace is required, got \" + (typeof l)))\n            };\n            var o = j(l);\n            o[m] = n;\n            return l;\n        },\n        get: function(l, m, n) {\n            if (!l) {\n                throw new TypeError((\"DataStore.get: namespace is required, got \" + (typeof l)))\n            };\n            var o = j(l), p = o[m];\n            if (((typeof p === \"undefined\") && l.getAttribute)) {\n                if ((l.hasAttribute && !l.hasAttribute((\"data-\" + m)))) {\n                    p = undefined;\n                }\n                 else {\n                    var q = l.getAttribute((\"data-\" + m));\n                    p = (((null === q)) ? undefined : q);\n                }\n            \n            };\n            if ((((n !== undefined)) && ((p === undefined)))) {\n                p = o[m] = n;\n            };\n            return p;\n        },\n        remove: function(l, m) {\n            if (!l) {\n                throw new TypeError((\"DataStore.remove: namespace is required, got \" + (typeof l)))\n            };\n            var n = j(l), o = n[m];\n            delete n[m];\n            return o;\n        },\n        purge: function(l) {\n            delete g[i(l)];\n        }\n    };\n    e.exports = k;\n});\n__d(\"DOMEvent\", [\"copyProperties\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"invariant\");\n    function i(j) {\n        this.event = (j || window.event);\n        h((typeof (this.event.srcElement) != \"unknown\"));\n        this.target = (this.event.target || this.event.srcElement);\n    };\n    i.killThenCall = function(j) {\n        return function(k) {\n            new i(k).kill();\n            return j();\n        };\n    };\n    g(i.prototype, {\n        preventDefault: function() {\n            var j = this.event;\n            if (j.preventDefault) {\n                j.preventDefault();\n                if (!((\"defaultPrevented\" in j))) {\n                    j.defaultPrevented = true;\n                };\n            }\n             else j.returnValue = false;\n        ;\n            return this;\n        },\n        isDefaultPrevented: function() {\n            var j = this.event;\n            return (((\"defaultPrevented\" in j)) ? j.defaultPrevented : (j.returnValue === false));\n        },\n        stopPropagation: function() {\n            var j = this.event;\n            (j.stopPropagation ? j.stopPropagation() : j.cancelBubble = true);\n            return this;\n        },\n        kill: function() {\n            this.stopPropagation().preventDefault();\n            return this;\n        }\n    });\n    e.exports = i;\n});\n__d(\"getObjectValues\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        var j = [];\n        for (var k in i) {\n            j.push(i[k]);;\n        };\n        return j;\n    };\n    e.exports = h;\n});\n__d(\"Event\", [\"event-form-bubbling\",\"Arbiter\",\"DataStore\",\"DOMQuery\",\"DOMEvent\",\"ErrorUtils\",\"Parent\",\"UserAgent\",\"$\",\"copyProperties\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    b(\"event-form-bubbling\");\n    var g = b(\"Arbiter\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"DOMEvent\"), k = b(\"ErrorUtils\"), l = b(\"Parent\"), m = b(\"UserAgent\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"getObjectValues\"), q = a.Event;\n    q.DATASTORE_KEY = \"Event.listeners\";\n    if (!q.prototype) {\n        q.prototype = {\n        };\n    };\n    function r(ca) {\n        if ((((ca.type === \"click\") || (ca.type === \"mouseover\")) || (ca.type === \"keydown\"))) {\n            g.inform(\"Event/stop\", {\n                event: ca\n            });\n        };\n    };\n    function s(ca, da, ea) {\n        this.target = ca;\n        this.type = da;\n        this.data = ea;\n    };\n    o(s.prototype, {\n        getData: function() {\n            this.data = (this.data || {\n            });\n            return this.data;\n        },\n        stop: function() {\n            return q.stop(this);\n        },\n        prevent: function() {\n            return q.prevent(this);\n        },\n        isDefaultPrevented: function() {\n            return q.isDefaultPrevented(this);\n        },\n        kill: function() {\n            return q.kill(this);\n        },\n        getTarget: function() {\n            return (new j(this).target || null);\n        }\n    });\n    function t(ca) {\n        if ((ca instanceof s)) {\n            return ca\n        };\n        if (!ca) {\n            if ((!window.addEventListener && document.createEventObject)) {\n                ca = (window.event ? document.createEventObject(window.event) : {\n                });\n            }\n             else ca = {\n            };\n        \n        };\n        if (!ca._inherits_from_prototype) {\n            for (var da in q.prototype) {\n                try {\n                    ca[da] = q.prototype[da];\n                } catch (ea) {\n                \n                };\n            }\n        };\n        return ca;\n    };\n    o(q.prototype, {\n        _inherits_from_prototype: true,\n        getRelatedTarget: function() {\n            var ca = (this.relatedTarget || (((this.fromElement === this.srcElement) ? this.toElement : this.fromElement)));\n            return ((ca && ca.nodeType) ? ca : null);\n        },\n        getModifiers: function() {\n            var ca = {\n                control: !!this.ctrlKey,\n                shift: !!this.shiftKey,\n                alt: !!this.altKey,\n                meta: !!this.metaKey\n            };\n            ca.access = (m.osx() ? ca.control : ca.alt);\n            ca.any = (((ca.control || ca.shift) || ca.alt) || ca.meta);\n            return ca;\n        },\n        isRightClick: function() {\n            if (this.which) {\n                return (this.which === 3)\n            };\n            return (this.button && (this.button === 2));\n        },\n        isMiddleClick: function() {\n            if (this.which) {\n                return (this.which === 2)\n            };\n            return (this.button && (this.button === 4));\n        },\n        isDefaultRequested: function() {\n            return ((this.getModifiers().any || this.isMiddleClick()) || this.isRightClick());\n        }\n    });\n    o(q.prototype, s.prototype);\n    o(q, {\n        listen: function(ca, da, ea, fa) {\n            if ((typeof ca == \"string\")) {\n                ca = n(ca);\n            };\n            if ((typeof fa == \"undefined\")) {\n                fa = q.Priority.NORMAL;\n            };\n            if ((typeof da == \"object\")) {\n                var ga = {\n                };\n                for (var ha in da) {\n                    ga[ha] = q.listen(ca, ha, da[ha], fa);;\n                };\n                return ga;\n            }\n        ;\n            if (da.match(/^on/i)) {\n                throw new TypeError(((\"Bad event name `\" + da) + \"': use `click', not `onclick'.\"))\n            };\n            if (((ca.nodeName == \"LABEL\") && (da == \"click\"))) {\n                var ia = ca.getElementsByTagName(\"input\");\n                ca = ((ia.length == 1) ? ia[0] : ca);\n            }\n             else if (((ca === window) && (da === \"scroll\"))) {\n                var ja = i.getDocumentScrollElement();\n                if (((ja !== document.documentElement) && (ja !== document.body))) {\n                    ca = ja;\n                };\n            }\n            \n        ;\n            var ka = h.get(ca, v, {\n            });\n            if (x[da]) {\n                var la = x[da];\n                da = la.base;\n                if (la.wrap) {\n                    ea = la.wrap(ea);\n                };\n            }\n        ;\n            z(ca, da);\n            var ma = ka[da];\n            if (!((fa in ma))) {\n                ma[fa] = [];\n            };\n            var na = ma[fa].length, oa = new ba(ea, ma[fa], na);\n            ma[fa].push(oa);\n            return oa;\n        },\n        stop: function(ca) {\n            var da = new j(ca).stopPropagation();\n            r(da.event);\n            return ca;\n        },\n        prevent: function(ca) {\n            new j(ca).preventDefault();\n            return ca;\n        },\n        isDefaultPrevented: function(ca) {\n            return new j(ca).isDefaultPrevented(ca);\n        },\n        kill: function(ca) {\n            var da = new j(ca).kill();\n            r(da.event);\n            return false;\n        },\n        getKeyCode: function(event) {\n            event = new j(event).event;\n            if (!event) {\n                return false\n            };\n            switch (event.keyCode) {\n              case 63232:\n                return 38;\n              case 63233:\n                return 40;\n              case 63234:\n                return 37;\n              case 63235:\n                return 39;\n              case 63272:\n            \n              case 63273:\n            \n              case 63275:\n                return null;\n              case 63276:\n                return 33;\n              case 63277:\n                return 34;\n            };\n            if (event.shiftKey) {\n                switch (event.keyCode) {\n                  case 33:\n                \n                  case 34:\n                \n                  case 37:\n                \n                  case 38:\n                \n                  case 39:\n                \n                  case 40:\n                    return null;\n                }\n            };\n            return event.keyCode;\n        },\n        getPriorities: function() {\n            if (!u) {\n                var ca = p(q.Priority);\n                ca.sort(function(da, ea) {\n                    return (da - ea);\n                });\n                u = ca;\n            }\n        ;\n            return u;\n        },\n        fire: function(ca, da, ea) {\n            var fa = new s(ca, da, ea), ga;\n            do {\n                var ha = q.__getHandler(ca, da);\n                if (ha) {\n                    ga = ha(fa);\n                };\n                ca = ca.parentNode;\n            } while (((ca && (ga !== false)) && !fa.cancelBubble));\n            return (ga !== false);\n        },\n        __fire: function(ca, da, event) {\n            var ea = q.__getHandler(ca, da);\n            if (ea) {\n                return ea(t(event))\n            };\n        },\n        __getHandler: function(ca, da) {\n            return h.get(ca, (q.DATASTORE_KEY + da));\n        },\n        getPosition: function(ca) {\n            ca = new j(ca).event;\n            var da = i.getDocumentScrollElement(), ea = (ca.clientX + da.scrollLeft), fa = (ca.clientY + da.scrollTop);\n            return {\n                x: ea,\n                y: fa\n            };\n        }\n    });\n    var u = null, v = q.DATASTORE_KEY, w = function(ca) {\n        return function(da) {\n            if (!i.contains(this, da.getRelatedTarget())) {\n                return ca.call(this, da)\n            };\n        };\n    }, x;\n    if (!window.navigator.msPointerEnabled) {\n        x = {\n            mouseenter: {\n                base: \"mouseover\",\n                wrap: w\n            },\n            mouseleave: {\n                base: \"mouseout\",\n                wrap: w\n            }\n        };\n    }\n     else x = {\n        mousedown: {\n            base: \"MSPointerDown\"\n        },\n        mousemove: {\n            base: \"MSPointerMove\"\n        },\n        mouseup: {\n            base: \"MSPointerUp\"\n        },\n        mouseover: {\n            base: \"MSPointerOver\"\n        },\n        mouseout: {\n            base: \"MSPointerOut\"\n        },\n        mouseenter: {\n            base: \"MSPointerOver\",\n            wrap: w\n        },\n        mouseleave: {\n            base: \"MSPointerOut\",\n            wrap: w\n        }\n    };\n;\n    if (m.firefox()) {\n        var y = function(ca, event) {\n            event = t(event);\n            var da = event.getTarget();\n            while (da) {\n                q.__fire(da, ca, event);\n                da = da.parentNode;\n            };\n        };\n        document.documentElement.addEventListener(\"focus\", y.curry(\"focusin\"), true);\n        document.documentElement.addEventListener(\"blur\", y.curry(\"focusout\"), true);\n    }\n;\n    var z = function(ca, da) {\n        var ea = (\"on\" + da), fa = aa.bind(ca, da), ga = h.get(ca, v);\n        if ((da in ga)) {\n            return\n        };\n        ga[da] = {\n        };\n        if (ca.addEventListener) {\n            ca.addEventListener(da, fa, false);\n        }\n         else if (ca.attachEvent) {\n            ca.attachEvent(ea, fa);\n        }\n    ;\n        h.set(ca, (v + da), fa);\n        if (ca[ea]) {\n            var ha = ((ca === document.documentElement) ? q.Priority._BUBBLE : q.Priority.TRADITIONAL), ia = ca[ea];\n            ca[ea] = null;\n            q.listen(ca, da, ia, ha);\n        }\n    ;\n        if (((ca.nodeName === \"FORM\") && (da === \"submit\"))) {\n            q.listen(ca, da, q.__bubbleSubmit.curry(ca), q.Priority._BUBBLE);\n        };\n    }, aa = k.guard(function(ca, event) {\n        event = t(event);\n        if (!h.get(this, v)) {\n            throw new Error(\"Bad listenHandler context.\")\n        };\n        var da = h.get(this, v)[ca];\n        if (!da) {\n            throw new Error(((\"No registered handlers for `\" + ca) + \"'.\"))\n        };\n        if ((ca == \"click\")) {\n            var ea = l.byTag(event.getTarget(), \"a\");\n            if (window.userAction) {\n                var fa = window.userAction(\"evt_ext\", ea, event, {\n                    mode: \"DEDUP\"\n                }).uai_fallback(\"click\");\n                if (window.ArbiterMonitor) {\n                    window.ArbiterMonitor.initUA(fa, [ea,]);\n                };\n            }\n        ;\n            if (window.clickRefAction) {\n                window.clickRefAction(\"click\", ea, event);\n            };\n        }\n    ;\n        var ga = q.getPriorities();\n        for (var ha = 0; (ha < ga.length); ha++) {\n            var ia = ga[ha];\n            if ((ia in da)) {\n                var ja = da[ia];\n                for (var ka = 0; (ka < ja.length); ka++) {\n                    if (!ja[ka]) {\n                        continue;\n                    };\n                    var la = ja[ka].fire(this, event);\n                    if ((la === false)) {\n                        return event.kill();\n                    }\n                     else if (event.cancelBubble) {\n                        event.stop();\n                    }\n                ;\n                };\n            }\n        ;\n        };\n        return event.returnValue;\n    });\n    q.Priority = {\n        URGENT: -20,\n        TRADITIONAL: -10,\n        NORMAL: 0,\n        _BUBBLE: 1000\n    };\n    function ba(ca, da, ea) {\n        this._handler = ca;\n        this._container = da;\n        this._index = ea;\n    };\n    o(ba.prototype, {\n        remove: function() {\n            delete this._handler;\n            delete this._container[this._index];\n        },\n        fire: function(ca, event) {\n            return k.applyWithGuard(this._handler, ca, [event,], function(da) {\n                da.event_type = event.type;\n                da.dom_element = (ca.name || ca.id);\n                da.category = \"eventhandler\";\n            });\n        }\n    });\n    a.$E = q.$E = t;\n    e.exports = q;\n});\n__d(\"evalGlobal\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if ((typeof h != \"string\")) {\n            throw new TypeError(\"JS sent to evalGlobal is not a string. Only strings are permitted.\")\n        };\n        if (!h) {\n            return\n        };\n        var i = document.createElement(\"script\");\n        try {\n            i.appendChild(document.createTextNode(h));\n        } catch (j) {\n            i.text = h;\n        };\n        var k = (document.getElementsByTagName(\"head\")[0] || document.documentElement);\n        k.appendChild(i);\n        k.removeChild(i);\n    };\n    e.exports = g;\n});\n__d(\"HTML\", [\"function-extensions\",\"Bootloader\",\"UserAgent\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"evalGlobal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"UserAgent\"), i = b(\"copyProperties\"), j = b(\"createArrayFrom\"), k = b(\"emptyFunction\"), l = b(\"evalGlobal\");\n    function m(n) {\n        if ((n && (typeof n.__html == \"string\"))) {\n            n = n.__html;\n        };\n        if (!((this instanceof m))) {\n            if ((n instanceof m)) {\n                return n\n            };\n            return new m(n);\n        }\n    ;\n        this._content = n;\n        this._defer = false;\n        this._extra_action = \"\";\n        this._nodes = null;\n        this._inline_js = k;\n        this._rootNode = null;\n        return this;\n    };\n    m.isHTML = function(n) {\n        return (n && (((n instanceof m) || (n.__html !== undefined))));\n    };\n    m.replaceJSONWrapper = function(n) {\n        return ((n && (n.__html !== undefined)) ? new m(n.__html) : n);\n    };\n    i(m.prototype, {\n        toString: function() {\n            var n = (this._content || \"\");\n            if (this._extra_action) {\n                n += (((\"\\u003Cscript type=\\\"text/javascript\\\"\\u003E\" + this._extra_action) + \"\\u003C/scr\") + \"ipt\\u003E\");\n            };\n            return n;\n        },\n        setAction: function(n) {\n            this._extra_action = n;\n            return this;\n        },\n        getAction: function() {\n            this._fillCache();\n            var n = function() {\n                this._inline_js();\n                l(this._extra_action);\n            }.bind(this);\n            if (this.getDeferred()) {\n                return n.defer.bind(n);\n            }\n             else return n\n        ;\n        },\n        setDeferred: function(n) {\n            this._defer = !!n;\n            return this;\n        },\n        getDeferred: function() {\n            return this._defer;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getNodes: function() {\n            this._fillCache();\n            return this._nodes;\n        },\n        getRootNode: function() {\n            var n = this.getNodes();\n            if ((n.length === 1)) {\n                this._rootNode = n[0];\n            }\n             else {\n                var o = document.createDocumentFragment();\n                for (var p = 0; (p < n.length); p++) {\n                    o.appendChild(n[p]);;\n                };\n                this._rootNode = o;\n            }\n        ;\n            return this._rootNode;\n        },\n        _fillCache: function() {\n            if ((null !== this._nodes)) {\n                return\n            };\n            var n = this._content;\n            if (!n) {\n                this._nodes = [];\n                return;\n            }\n        ;\n            n = n.replace(/(<(\\w+)[^>]*?)\\/>/g, function(y, z, aa) {\n                return (aa.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? y : (((z + \"\\u003E\\u003C/\") + aa) + \"\\u003E\"));\n            });\n            var o = n.trim().toLowerCase(), p = document.createElement(\"div\"), q = false, r = ((((((((!o.indexOf(\"\\u003Copt\") && [1,\"\\u003Cselect multiple=\\\"multiple\\\" class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/select\\u003E\",])) || ((!o.indexOf(\"\\u003Cleg\") && [1,\"\\u003Cfieldset class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/fieldset\\u003E\",]))) || ((o.match(/^<(thead|tbody|tfoot|colg|cap)/) && [1,\"\\u003Ctable class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/table\\u003E\",]))) || ((!o.indexOf(\"\\u003Ctr\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tbody\\u003E\\u003C/table\\u003E\",]))) || ((((!o.indexOf(\"\\u003Ctd\") || !o.indexOf(\"\\u003Cth\"))) && [3,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003Ctr class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\",]))) || ((!o.indexOf(\"\\u003Ccol\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003C/tbody\\u003E\\u003Ccolgroup class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/colgroup\\u003E\\u003C/table\\u003E\",]))) || null);\n            if ((null === r)) {\n                p.className = \"__WRAPPER\";\n                if (h.ie()) {\n                    r = [0,\"\\u003Cspan style=\\\"display:none\\\"\\u003E&nbsp;\\u003C/span\\u003E\",\"\",];\n                    q = true;\n                }\n                 else r = [0,\"\",\"\",];\n            ;\n            }\n        ;\n            p.innerHTML = ((r[1] + n) + r[2]);\n            while (r[0]--) {\n                p = p.lastChild;;\n            };\n            if (q) {\n                p.removeChild(p.firstChild);\n            };\n            (p.className != \"__WRAPPER\");\n            if (h.ie()) {\n                var s;\n                if ((!o.indexOf(\"\\u003Ctable\") && (-1 == o.indexOf(\"\\u003Ctbody\")))) {\n                    s = (p.firstChild && p.firstChild.childNodes);\n                }\n                 else if (((r[1] == \"\\u003Ctable\\u003E\") && (-1 == o.indexOf(\"\\u003Ctbody\")))) {\n                    s = p.childNodes;\n                }\n                 else s = [];\n                \n            ;\n                for (var t = (s.length - 1); (t >= 0); --t) {\n                    if (((s[t].nodeName && (s[t].nodeName.toLowerCase() == \"tbody\")) && (s[t].childNodes.length == 0))) {\n                        s[t].parentNode.removeChild(s[t]);\n                    };\n                };\n            }\n        ;\n            var u = p.getElementsByTagName(\"script\"), v = [];\n            for (var w = 0; (w < u.length); w++) {\n                if (u[w].src) {\n                    v.push(g.requestJSResource.bind(g, u[w].src));\n                }\n                 else v.push(l.bind(null, u[w].innerHTML));\n            ;\n            };\n            for (var w = (u.length - 1); (w >= 0); w--) {\n                u[w].parentNode.removeChild(u[w]);;\n            };\n            var x = function() {\n                for (var y = 0; (y < v.length); y++) {\n                    v[y]();;\n                };\n            };\n            this._nodes = j(p.childNodes);\n            this._inline_js = x;\n        }\n    });\n    e.exports = m;\n});\n__d(\"isScalar\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/string|number|boolean/).test(typeof h);\n    };\n    e.exports = g;\n});\n__d(\"Intl\", [], function(a, b, c, d, e, f) {\n    var g;\n    function h(j) {\n        if ((typeof j != \"string\")) {\n            return false\n        };\n        return j.match(new RegExp(((((((((((((((((((((((((((h.punct_char_class + \"[\") + \")\\\"\") + \"'\") + \"\\u00bb\") + \"\\u0f3b\") + \"\\u0f3d\") + \"\\u2019\") + \"\\u201d\") + \"\\u203a\") + \"\\u3009\") + \"\\u300b\") + \"\\u300d\") + \"\\u300f\") + \"\\u3011\") + \"\\u3015\") + \"\\u3017\") + \"\\u3019\") + \"\\u301b\") + \"\\u301e\") + \"\\u301f\") + \"\\ufd3f\") + \"\\uff07\") + \"\\uff09\") + \"\\uff3d\") + \"\\\\s\") + \"]*$\")));\n    };\n    h.punct_char_class = (((((((((((\"[\" + \".!?\") + \"\\u3002\") + \"\\uff01\") + \"\\uff1f\") + \"\\u0964\") + \"\\u2026\") + \"\\u0eaf\") + \"\\u1801\") + \"\\u0e2f\") + \"\\uff0e\") + \"]\");\n    function i(j) {\n        if (g) {\n            var k = [], l = [];\n            for (var m in g.patterns) {\n                var n = g.patterns[m];\n                for (var o in g.meta) {\n                    var p = new RegExp(o.slice(1, -1), \"g\"), q = g.meta[o];\n                    m = m.replace(p, q);\n                    n = n.replace(p, q);\n                };\n                k.push(m);\n                l.push(n);\n            };\n            for (var r = 0; (r < k.length); r++) {\n                var s = new RegExp(k[r].slice(1, -1), \"g\");\n                if ((l[r] == \"javascript\")) {\n                    j.replace(s, function(t) {\n                        return t.slice(1).toLowerCase();\n                    });\n                }\n                 else j = j.replace(s, l[r]);\n            ;\n            };\n        }\n    ;\n        return j.replace(/\\x01/g, \"\");\n    };\n    e.exports = {\n        endsInPunct: h,\n        applyPhonologicalRules: i,\n        setPhonologicalRules: function(j) {\n            g = j;\n        }\n    };\n});\n__d(\"substituteTokens\", [\"invariant\",\"Intl\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"Intl\");\n    function i(j, k) {\n        if (!k) {\n            return j\n        };\n        g((typeof k === \"object\"));\n        var l = ((\"\\\\{([^}]+)\\\\}(\" + h.endsInPunct.punct_char_class) + \"*)\"), m = new RegExp(l, \"g\"), n = [], o = j.replace(m, function(r, s, t) {\n            var u = k[s];\n            if ((u && (typeof u === \"object\"))) {\n                n.push(u);\n                return (\"\\u0017\" + t);\n            }\n        ;\n            return (u + ((h.endsInPunct(u) ? \"\" : t)));\n        }).split(\"\\u0017\").map(h.applyPhonologicalRules);\n        if ((o.length === 1)) {\n            return o[0]\n        };\n        var p = [o[0],];\n        for (var q = 0; (q < n.length); q++) {\n            p.push(n[q], o[(q + 1)]);;\n        };\n        return p;\n    };\n    e.exports = i;\n});\n__d(\"tx\", [\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"substituteTokens\");\n    function h(i, j) {\n        if ((typeof _string_table == \"undefined\")) {\n            return\n        };\n        i = _string_table[i];\n        return g(i, j);\n    };\n    h._ = g;\n    e.exports = h;\n});\n__d(\"DOM\", [\"function-extensions\",\"DOMQuery\",\"Event\",\"HTML\",\"UserAgent\",\"$\",\"copyProperties\",\"createArrayFrom\",\"isScalar\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Event\"), i = b(\"HTML\"), j = b(\"UserAgent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"isScalar\"), o = b(\"tx\"), p = \"js_\", q = 0, r = {\n    };\n    l(r, g);\n    l(r, {\n        create: function(u, v, w) {\n            var x = document.createElement(u);\n            if (v) {\n                r.setAttributes(x, v);\n            };\n            if ((w != null)) {\n                r.setContent(x, w);\n            };\n            return x;\n        },\n        setAttributes: function(u, v) {\n            if (v.type) {\n                u.type = v.type;\n            };\n            for (var w in v) {\n                var x = v[w], y = (/^on/i).test(w);\n                if ((w == \"type\")) {\n                    continue;\n                }\n                 else if ((w == \"style\")) {\n                    if ((typeof x == \"string\")) {\n                        u.style.cssText = x;\n                    }\n                     else l(u.style, x);\n                ;\n                }\n                 else if (y) {\n                    h.listen(u, w.substr(2), x);\n                }\n                 else if ((w in u)) {\n                    u[w] = x;\n                }\n                 else if (u.setAttribute) {\n                    u.setAttribute(w, x);\n                }\n                \n                \n                \n            ;\n            };\n        },\n        prependContent: function(u, v) {\n            return s(v, u, function(w) {\n                (u.firstChild ? u.insertBefore(w, u.firstChild) : u.appendChild(w));\n            });\n        },\n        insertAfter: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                (u.nextSibling ? w.insertBefore(x, u.nextSibling) : w.appendChild(x));\n            });\n        },\n        insertBefore: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.insertBefore(x, u);\n            });\n        },\n        setContent: function(u, v) {\n            r.empty(u);\n            return r.appendContent(u, v);\n        },\n        appendContent: function(u, v) {\n            return s(v, u, function(w) {\n                u.appendChild(w);\n            });\n        },\n        replace: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.replaceChild(x, u);\n            });\n        },\n        remove: function(u) {\n            u = k(u);\n            if (u.parentNode) {\n                u.parentNode.removeChild(u);\n            };\n        },\n        empty: function(u) {\n            u = k(u);\n            while (u.firstChild) {\n                r.remove(u.firstChild);;\n            };\n        },\n        getID: function(u) {\n            var v = u.id;\n            if (!v) {\n                v = (p + q++);\n                u.id = v;\n            }\n        ;\n            return v;\n        }\n    });\n    function s(u, v, w) {\n        u = i.replaceJSONWrapper(u);\n        if ((((u instanceof i) && (\"\" === v.innerHTML)) && (-1 === u.toString().indexOf((\"\\u003Cscr\" + \"ipt\"))))) {\n            var x = j.ie();\n            if ((!x || (((x > 7) && !g.isNodeOfType(v, [\"table\",\"tbody\",\"thead\",\"tfoot\",\"tr\",\"select\",\"fieldset\",]))))) {\n                var y = (x ? \"\\u003Cem style=\\\"display:none;\\\"\\u003E&nbsp;\\u003C/em\\u003E\" : \"\");\n                v.innerHTML = (y + u);\n                (x && v.removeChild(v.firstChild));\n                return m(v.childNodes);\n            }\n        ;\n        }\n         else if (g.isTextNode(v)) {\n            v.data = u;\n            return [u,];\n        }\n        \n    ;\n        var z = document.createDocumentFragment(), aa, ba = [], ca = [];\n        if (!Array.isArray(u)) {\n            u = [u,];\n        };\n        for (var da = 0; (da < u.length); da++) {\n            aa = i.replaceJSONWrapper(u[da]);\n            if ((aa instanceof i)) {\n                ca.push(aa.getAction());\n                var ea = aa.getNodes();\n                for (var fa = 0; (fa < ea.length); fa++) {\n                    ba.push(ea[fa]);\n                    z.appendChild(ea[fa]);\n                };\n            }\n             else if (n(aa)) {\n                var ga = document.createTextNode(aa);\n                ba.push(ga);\n                z.appendChild(ga);\n            }\n             else if (g.isNode(aa)) {\n                ba.push(aa);\n                z.appendChild(aa);\n            }\n            \n            \n        ;\n        };\n        w(z);\n        ca.forEach(function(ha) {\n            ha();\n        });\n        return ba;\n    };\n    function t(u) {\n        function v(w) {\n            return r.create(\"div\", {\n            }, w).innerHTML;\n        };\n        return function(w, x) {\n            var y = {\n            };\n            if (x) {\n                for (var z in x) {\n                    y[z] = v(x[z]);;\n                }\n            };\n            return i(u(w, y));\n        };\n    };\n    r.tx = t(o);\n    r.tx._ = r._tx = t(o._);\n    e.exports = r;\n});\n__d(\"LinkshimAsyncLink\", [\"$\",\"AsyncSignal\",\"DOM\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncSignal\"), i = b(\"DOM\"), j = b(\"UserAgent\"), k = {\n        swap: function(l, m) {\n            var n = (j.ie() <= 8);\n            if (n) {\n                var o = i.create(\"wbr\", {\n                }, null);\n                i.appendContent(l, o);\n            }\n        ;\n            l.href = m;\n            if (n) {\n                i.remove(o);\n            };\n        },\n        referrer_log: function(l, m, n) {\n            var o = g(\"meta_referrer\");\n            o.content = \"origin\";\n            k.swap(l, m);\n            (function() {\n                o.content = \"default\";\n                new h(n, {\n                }).send();\n            }).defer(100);\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:dom-asynclinkshim\", [\"LinkshimAsyncLink\",], function(a, b, c, d) {\n    a.LinkshimAsyncLink = b(\"LinkshimAsyncLink\");\n}, 3);\n__d(\"CookieCore\", [], function(a, b, c, d, e, f) {\n    var g = {\n        set: function(h, i, j, k, l) {\n            document.cookie = (((((((((h + \"=\") + encodeURIComponent(i)) + \"; \") + ((j ? ((\"expires=\" + (new Date((Date.now() + j))).toGMTString()) + \"; \") : \"\"))) + \"path=\") + ((k || \"/\"))) + \"; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")) + ((l ? \"; secure\" : \"\")));\n        },\n        clear: function(h, i) {\n            i = (i || \"/\");\n            document.cookie = (((((h + \"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; \") + \"path=\") + i) + \"; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        },\n        get: function(h) {\n            var i = document.cookie.match(((\"(?:^|;\\\\s*)\" + h) + \"=(.*?)(?:;|$)\"));\n            return ((i ? decodeURIComponent(i[1]) : i));\n        }\n    };\n    e.exports = g;\n});\n__d(\"Cookie\", [\"CookieCore\",\"Env\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CookieCore\"), h = b(\"Env\"), i = b(\"copyProperties\");\n    function j(l, m, n, o, p) {\n        if ((h.no_cookies && (l != \"tpa\"))) {\n            return\n        };\n        g.set(l, m, n, o, p);\n    };\n    var k = i({\n    }, g);\n    k.set = j;\n    e.exports = k;\n});\n__d(\"detect_broken_proxy_cache\", [\"AsyncSignal\",\"Cookie\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"URI\");\n    function j(k, l) {\n        var m = h.get(l);\n        if (((((m != k)) && ((m != null))) && ((k != \"0\")))) {\n            var n = {\n                c: \"si_detect_broken_proxy_cache\",\n                m: ((((l + \" \") + k) + \" \") + m)\n            }, o = new i(\"/common/scribe_endpoint.php\").getQualifiedURI().toString();\n            new g(o, n).send();\n        }\n    ;\n    };\n    e.exports = j;\n});\n__d(\"legacy:detect-broken-proxy-cache\", [\"detect_broken_proxy_cache\",], function(a, b, c, d) {\n    a.detect_broken_proxy_cache = b(\"detect_broken_proxy_cache\");\n}, 3);\n__d(\"link_rel_preload\", [\"Bootloader\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Parent\");\n    function i() {\n        var j = /async(?:-post)?|dialog(?:-pipe|-post)?|theater|toggle/;\n        document.documentElement.onmousedown = function(k) {\n            k = (k || window.event);\n            var l = (k.target || k.srcElement), m = h.byTag(l, \"A\");\n            if (!m) {\n                return\n            };\n            var n = m.getAttribute(\"ajaxify\"), o = m.href, p = (n || o);\n            if (((n && o) && !(/#$/).test(o))) {\n                var q = (k.which && (k.which != 1)), r = (((k.altKey || k.ctrlKey) || k.metaKey) || k.shiftKey);\n                if ((q || r)) {\n                    return\n                };\n            }\n        ;\n            var s = (m.rel && m.rel.match(j));\n            s = (s && s[0]);\n            switch (s) {\n              case \"dialog\":\n            \n              case \"dialog-post\":\n                g.loadModules([\"Dialog\",]);\n                break;\n              case \"dialog-pipe\":\n                g.loadModules([\"AjaxPipeRequest\",\"Dialog\",]);\n                break;\n              case \"async\":\n            \n              case \"async-post\":\n                g.loadModules([\"AsyncRequest\",]);\n                break;\n              case \"theater\":\n                g.loadModules([\"PhotoSnowlift\",], function(t) {\n                    t.preload(p, m);\n                });\n                break;\n              case \"toggle\":\n                g.loadModules([\"Toggler\",]);\n                break;\n            };\n            return;\n        };\n    };\n    e.exports = i;\n});\n__d(\"legacy:link-rel-preload\", [\"link_rel_preload\",], function(a, b, c, d) {\n    a.link_rel_preload = b(\"link_rel_preload\");\n}, 3);\n__d(\"AsyncResponse\", [\"Bootloader\",\"Env\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Env\"), i = b(\"copyProperties\"), j = b(\"tx\");\n    function k(l, m) {\n        i(this, {\n            error: 0,\n            errorSummary: null,\n            errorDescription: null,\n            onload: null,\n            replay: false,\n            payload: (m || null),\n            request: (l || null),\n            silentError: false,\n            transientError: false,\n            is_last: true\n        });\n        return this;\n    };\n    i(k, {\n        defaultErrorHandler: function(l) {\n            try {\n                if (!l.silentError) {\n                    k.verboseErrorHandler(l);\n                }\n                 else l.logErrorByGroup(\"silent\", 10);\n            ;\n            } catch (m) {\n                alert(l);\n            };\n        },\n        verboseErrorHandler: function(l) {\n            try {\n                var n = l.getErrorSummary(), o = l.getErrorDescription();\n                l.logErrorByGroup(\"popup\", 10);\n                if ((l.silentError && (o == \"\"))) {\n                    o = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n                };\n                g.loadModules([\"Dialog\",], function(p) {\n                    new p().setTitle(n).setBody(o).setButtons([p.OK,]).setModal(true).setCausalElement(this.relativeTo).show();\n                });\n            } catch (m) {\n                alert(l);\n            };\n        }\n    });\n    i(k.prototype, {\n        getRequest: function() {\n            return this.request;\n        },\n        getPayload: function() {\n            return this.payload;\n        },\n        getError: function() {\n            return this.error;\n        },\n        getErrorSummary: function() {\n            return this.errorSummary;\n        },\n        setErrorSummary: function(l) {\n            l = (((l === undefined) ? null : l));\n            this.errorSummary = l;\n            return this;\n        },\n        getErrorDescription: function() {\n            return this.errorDescription;\n        },\n        getErrorIsWarning: function() {\n            return this.errorIsWarning;\n        },\n        isTransient: function() {\n            return this.transientError;\n        },\n        logError: function(l, m) {\n            var n = a.ErrorSignal;\n            if (n) {\n                var o = {\n                    err_code: this.error,\n                    vip: ((h.vip || \"-\"))\n                };\n                if (m) {\n                    o.duration = m.duration;\n                    o.xfb_ip = m.xfb_ip;\n                }\n            ;\n                var p = this.request.getURI();\n                o.path = (p || \"-\");\n                o.aid = this.request.userActionID;\n                if ((p && (p.indexOf(\"scribe_endpoint.php\") != -1))) {\n                    l = \"async_error_double\";\n                };\n                n.sendErrorSignal(l, JSON.stringify(o));\n            }\n        ;\n        },\n        logErrorByGroup: function(l, m) {\n            if ((Math.floor((Math.random() * m)) == 0)) {\n                if (((this.error == 1357010) || (this.error < 15000))) {\n                    this.logError((\"async_error_oops_\" + l));\n                }\n                 else this.logError((\"async_error_logic_\" + l));\n            \n            };\n        }\n    });\n    e.exports = k;\n});\n__d(\"HTTPErrors\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = {\n        get: g,\n        getAll: g\n    };\n    e.exports = h;\n});\n__d(\"bind\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = Array.prototype.slice.call(arguments, 2);\n        if ((typeof i != \"string\")) {\n            return Function.prototype.bind.apply(i, [h,].concat(j))\n        };\n        function k() {\n            var l = j.concat(Array.prototype.slice.call(arguments));\n            if (h[i]) {\n                return h[i].apply(h, l)\n            };\n        };\n        k.toString = function() {\n            return (\"bound lazily: \" + h[i]);\n        };\n        return k;\n    };\n    e.exports = g;\n});\n__d(\"executeAfter\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return function() {\n            h.apply((j || this), arguments);\n            i.apply((j || this), arguments);\n        };\n    };\n    e.exports = g;\n});\n__d(\"AsyncRequest\", [\"Arbiter\",\"AsyncResponse\",\"Bootloader\",\"CSS\",\"Env\",\"ErrorUtils\",\"Event\",\"HTTPErrors\",\"JSCC\",\"Parent\",\"Run\",\"ServerJS\",\"URI\",\"UserAgent\",\"XHR\",\"asyncCallback\",\"bind\",\"copyProperties\",\"emptyFunction\",\"evalGlobal\",\"ge\",\"goURI\",\"isEmpty\",\"ix\",\"tx\",\"executeAfter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncResponse\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"Env\"), l = b(\"ErrorUtils\"), m = b(\"Event\"), n = b(\"HTTPErrors\"), o = b(\"JSCC\"), p = b(\"Parent\"), q = b(\"Run\"), r = b(\"ServerJS\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"XHR\"), v = b(\"asyncCallback\"), w = b(\"bind\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"evalGlobal\"), aa = b(\"ge\"), ba = b(\"goURI\"), ca = b(\"isEmpty\"), da = b(\"ix\"), ea = b(\"tx\"), fa = b(\"executeAfter\");\n    function ga() {\n        try {\n            return !window.loaded;\n        } catch (pa) {\n            return true;\n        };\n    };\n    function ha(pa) {\n        return (((\"upload\" in pa)) && ((\"onprogress\" in pa.upload)));\n    };\n    function ia(pa) {\n        return (\"withCredentials\" in pa);\n    };\n    function ja(pa) {\n        return (pa.status in {\n            0: 1,\n            12029: 1,\n            12030: 1,\n            12031: 1,\n            12152: 1\n        });\n    };\n    function ka(pa) {\n        var qa = (!pa || (typeof (pa) === \"function\"));\n        return qa;\n    };\n    var la = 2, ma = la;\n    g.subscribe(\"page_transition\", function(pa, qa) {\n        ma = qa.id;\n    });\n    function na(pa) {\n        x(this, {\n            transport: null,\n            method: \"POST\",\n            uri: \"\",\n            timeout: null,\n            timer: null,\n            initialHandler: y,\n            handler: null,\n            uploadProgressHandler: null,\n            errorHandler: null,\n            transportErrorHandler: null,\n            timeoutHandler: null,\n            interceptHandler: y,\n            finallyHandler: y,\n            abortHandler: y,\n            serverDialogCancelHandler: null,\n            relativeTo: null,\n            statusElement: null,\n            statusClass: \"\",\n            data: {\n            },\n            file: null,\n            context: {\n            },\n            readOnly: false,\n            writeRequiredParams: [],\n            remainingRetries: 0,\n            userActionID: \"-\"\n        });\n        this.option = {\n            asynchronous: true,\n            suppressErrorHandlerWarning: false,\n            suppressEvaluation: false,\n            suppressErrorAlerts: false,\n            retries: 0,\n            jsonp: false,\n            bundle: false,\n            useIframeTransport: false,\n            handleErrorAfterUnload: false\n        };\n        this.errorHandler = h.defaultErrorHandler;\n        this.transportErrorHandler = w(this, \"errorHandler\");\n        if ((pa !== undefined)) {\n            this.setURI(pa);\n        };\n    };\n    x(na, {\n        bootstrap: function(pa, qa, ra) {\n            var sa = \"GET\", ta = true, ua = {\n            };\n            if ((ra || (qa && ((qa.rel == \"async-post\"))))) {\n                sa = \"POST\";\n                ta = false;\n                if (pa) {\n                    pa = s(pa);\n                    ua = pa.getQueryData();\n                    pa.setQueryData({\n                    });\n                }\n            ;\n            }\n        ;\n            var va = (p.byClass(qa, \"stat_elem\") || qa);\n            if ((va && j.hasClass(va, \"async_saving\"))) {\n                return false\n            };\n            var wa = new na(pa).setReadOnly(ta).setMethod(sa).setData(ua).setNectarModuleDataSafe(qa).setRelativeTo(qa);\n            if (qa) {\n                wa.setHandler(function(ya) {\n                    m.fire(qa, \"success\", {\n                        response: ya\n                    });\n                });\n                wa.setErrorHandler(function(ya) {\n                    if ((m.fire(qa, \"error\", {\n                        response: ya\n                    }) !== false)) {\n                        h.defaultErrorHandler(ya);\n                    };\n                });\n            }\n        ;\n            if (va) {\n                wa.setStatusElement(va);\n                var xa = va.getAttribute(\"data-status-class\");\n                (xa && wa.setStatusClass(xa));\n            }\n        ;\n            if (qa) {\n                m.fire(qa, \"AsyncRequest/send\", {\n                    request: wa\n                });\n            };\n            wa.send();\n            return false;\n        },\n        post: function(pa, qa) {\n            new na(pa).setReadOnly(false).setMethod(\"POST\").setData(qa).send();\n            return false;\n        },\n        getLastID: function() {\n            return la;\n        },\n        suppressOnloadToken: {\n        },\n        _inflight: [],\n        _inflightCount: 0,\n        _inflightAdd: y,\n        _inflightPurge: y,\n        getInflightCount: function() {\n            return this._inflightCount;\n        },\n        _inflightEnable: function() {\n            if (t.ie()) {\n                x(na, {\n                    _inflightAdd: function(pa) {\n                        this._inflight.push(pa);\n                    },\n                    _inflightPurge: function() {\n                        na._inflight = na._inflight.filter(function(pa) {\n                            return (pa.transport && (pa.transport.readyState < 4));\n                        });\n                    }\n                });\n                q.onUnload(function() {\n                    na._inflight.forEach(function(pa) {\n                        if ((pa.transport && (pa.transport.readyState < 4))) {\n                            pa.transport.abort();\n                            delete pa.transport;\n                        }\n                    ;\n                    });\n                });\n            }\n        ;\n        }\n    });\n    x(na.prototype, {\n        _dispatchResponse: function(pa) {\n            this.clearStatusIndicator();\n            if (!this._isRelevant()) {\n                this._invokeErrorHandler(1010);\n                return;\n            }\n        ;\n            if ((this.initialHandler(pa) === false)) {\n                return\n            };\n            clearTimeout(this.timer);\n            if (pa.jscc_map) {\n                var qa = (eval)(pa.jscc_map);\n                o.init(qa);\n            }\n        ;\n            var ra;\n            if (this.handler) {\n                try {\n                    ra = this._shouldSuppressJS(this.handler(pa));\n                } catch (sa) {\n                    (pa.is_last && this.finallyHandler(pa));\n                    throw sa;\n                }\n            };\n            if (!ra) {\n                this._handleJSResponse(pa);\n            };\n            (pa.is_last && this.finallyHandler(pa));\n        },\n        _shouldSuppressJS: function(pa) {\n            return (pa === na.suppressOnloadToken);\n        },\n        _handleJSResponse: function(pa) {\n            var qa = this.getRelativeTo(), ra = pa.domops, sa = pa.jsmods, ta = new r().setRelativeTo(qa), ua;\n            if ((sa && sa.require)) {\n                ua = sa.require;\n                delete sa.require;\n            }\n        ;\n            if (sa) {\n                ta.handle(sa);\n            };\n            var va = function(wa) {\n                if ((ra && wa)) {\n                    wa.invoke(ra, qa);\n                };\n                if (ua) {\n                    ta.handle({\n                        require: ua\n                    });\n                };\n                this._handleJSRegisters(pa, \"onload\");\n                if (this.lid) {\n                    g.inform(\"tti_ajax\", {\n                        s: this.lid,\n                        d: [(this._sendTimeStamp || 0),(((this._sendTimeStamp && this._responseTime)) ? ((this._responseTime - this._sendTimeStamp)) : 0),]\n                    }, g.BEHAVIOR_EVENT);\n                };\n                this._handleJSRegisters(pa, \"onafterload\");\n                ta.cleanup();\n            }.bind(this);\n            if (ra) {\n                i.loadModules([\"AsyncDOM\",], va);\n            }\n             else va(null);\n        ;\n        },\n        _handleJSRegisters: function(pa, qa) {\n            var ra = pa[qa];\n            if (ra) {\n                for (var sa = 0; (sa < ra.length); sa++) {\n                    l.applyWithGuard(new Function(ra[sa]), this);;\n                }\n            };\n        },\n        invokeResponseHandler: function(pa) {\n            if ((typeof (pa.redirect) !== \"undefined\")) {\n                (function() {\n                    this.setURI(pa.redirect).send();\n                }).bind(this).defer();\n                return;\n            }\n        ;\n            if (((!this.handler && !this.errorHandler) && !this.transportErrorHandler)) {\n                return\n            };\n            var qa = pa.asyncResponse;\n            if ((typeof (qa) !== \"undefined\")) {\n                if (!this._isRelevant()) {\n                    this._invokeErrorHandler(1010);\n                    return;\n                }\n            ;\n                if (qa.inlinejs) {\n                    z(qa.inlinejs);\n                };\n                if (qa.lid) {\n                    this._responseTime = Date.now();\n                    if (a.CavalryLogger) {\n                        this.cavalry = a.CavalryLogger.getInstance(qa.lid);\n                    };\n                    this.lid = qa.lid;\n                }\n            ;\n                if (qa.resource_map) {\n                    i.setResourceMap(qa.resource_map);\n                };\n                if (qa.bootloadable) {\n                    i.enableBootload(qa.bootloadable);\n                };\n                da.add(qa.ixData);\n                var ra, sa;\n                if ((qa.getError() && !qa.getErrorIsWarning())) {\n                    var ta = this.errorHandler.bind(this);\n                    ra = l.guard(this._dispatchErrorResponse);\n                    ra = ra.bind(this, qa, ta);\n                    sa = \"error\";\n                }\n                 else {\n                    ra = l.guard(this._dispatchResponse);\n                    ra = ra.bind(this, qa);\n                    sa = \"response\";\n                }\n            ;\n                ra = fa(ra, function() {\n                    g.inform((\"AsyncRequest/\" + sa), {\n                        request: this,\n                        response: qa\n                    });\n                }.bind(this));\n                ra = ra.defer.bind(ra);\n                var ua = false;\n                if (this.preBootloadHandler) {\n                    ua = this.preBootloadHandler(qa);\n                };\n                qa.css = (qa.css || []);\n                qa.js = (qa.js || []);\n                i.loadResources(qa.css.concat(qa.js), ra, ua, this.getURI());\n            }\n             else if ((typeof (pa.transportError) !== \"undefined\")) {\n                if (this._xFbServer) {\n                    this._invokeErrorHandler(1008);\n                }\n                 else this._invokeErrorHandler(1012);\n            ;\n            }\n             else this._invokeErrorHandler(1007);\n            \n        ;\n        },\n        _invokeErrorHandler: function(pa) {\n            var qa;\n            if ((this.responseText === \"\")) {\n                qa = 1002;\n            }\n             else if (this._requestAborted) {\n                qa = 1011;\n            }\n             else {\n                try {\n                    qa = ((pa || this.transport.status) || 1004);\n                } catch (ra) {\n                    qa = 1005;\n                };\n                if ((false === navigator.onLine)) {\n                    qa = 1006;\n                };\n            }\n            \n        ;\n            var sa, ta, ua = true;\n            if ((qa === 1006)) {\n                ta = \"No Network Connection\";\n                sa = \"Your browser appears to be offline. Please check your internet connection and try again.\";\n            }\n             else if (((qa >= 300) && (qa <= 399))) {\n                ta = \"Redirection\";\n                sa = \"Your access to Facebook was redirected or blocked by a third party at this time, please contact your ISP or reload. \";\n                var va = this.transport.getResponseHeader(\"Location\");\n                if (va) {\n                    ba(va, true);\n                };\n                ua = true;\n            }\n             else {\n                ta = \"Oops\";\n                sa = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n            }\n            \n        ;\n            var wa = new h(this);\n            x(wa, {\n                error: qa,\n                errorSummary: ta,\n                errorDescription: sa,\n                silentError: ua\n            });\n            (function() {\n                g.inform(\"AsyncRequest/error\", {\n                    request: this,\n                    response: wa\n                });\n            }).bind(this).defer();\n            if ((ga() && !this.getOption(\"handleErrorAfterUnload\"))) {\n                return\n            };\n            if (!this.transportErrorHandler) {\n                return\n            };\n            var xa = this.transportErrorHandler.bind(this);\n            !this.getOption(\"suppressErrorAlerts\");\n            l.applyWithGuard(this._dispatchErrorResponse, this, [wa,xa,]);\n        },\n        _dispatchErrorResponse: function(pa, qa) {\n            var ra = pa.getError();\n            this.clearStatusIndicator();\n            var sa = (this._sendTimeStamp && {\n                duration: (Date.now() - this._sendTimeStamp),\n                xfb_ip: (this._xFbServer || \"-\")\n            });\n            pa.logError(\"async_error\", sa);\n            if ((!this._isRelevant() || (ra === 1010))) {\n                this.abort();\n                return;\n            }\n        ;\n            if (((((ra == 1357008) || (ra == 1357007)) || (ra == 1442002)) || (ra == 1357001))) {\n                var ta = ((ra == 1357008) || (ra == 1357007));\n                this.interceptHandler(pa);\n                this._displayServerDialog(pa, ta);\n            }\n             else if ((this.initialHandler(pa) !== false)) {\n                clearTimeout(this.timer);\n                try {\n                    qa(pa);\n                } catch (ua) {\n                    this.finallyHandler(pa);\n                    throw ua;\n                };\n                this.finallyHandler(pa);\n            }\n            \n        ;\n        },\n        _displayServerDialog: function(pa, qa) {\n            var ra = pa.getPayload();\n            if ((ra.__dialog !== undefined)) {\n                this._displayServerLegacyDialog(pa, qa);\n                return;\n            }\n        ;\n            var sa = ra.__dialogx;\n            new r().handle(sa);\n            i.loadModules([\"ConfirmationDialog\",], function(ta) {\n                ta.setupConfirmation(pa, this);\n            }.bind(this));\n        },\n        _displayServerLegacyDialog: function(pa, qa) {\n            var ra = pa.getPayload().__dialog;\n            i.loadModules([\"Dialog\",], function(sa) {\n                var ta = new sa(ra);\n                if (qa) {\n                    ta.setHandler(this._displayConfirmationHandler.bind(this, ta));\n                };\n                ta.setCancelHandler(function() {\n                    var ua = this.getServerDialogCancelHandler();\n                    try {\n                        (ua && ua(pa));\n                    } catch (va) {\n                        throw va;\n                    } finally {\n                        this.finallyHandler(pa);\n                    };\n                }.bind(this)).setCausalElement(this.relativeTo).show();\n            }.bind(this));\n        },\n        _displayConfirmationHandler: function(pa) {\n            this.data.confirmed = 1;\n            x(this.data, pa.getFormData());\n            this.send();\n        },\n        setJSONPTransport: function(pa) {\n            pa.subscribe(\"response\", this._handleJSONPResponse.bind(this));\n            pa.subscribe(\"abort\", this._handleJSONPAbort.bind(this));\n            this.transport = pa;\n        },\n        _handleJSONPResponse: function(pa, qa) {\n            this.is_first = ((this.is_first === undefined));\n            var ra = this._interpretResponse(qa);\n            ra.asyncResponse.is_first = this.is_first;\n            ra.asyncResponse.is_last = this.transport.hasFinished();\n            this.invokeResponseHandler(ra);\n            if (this.transport.hasFinished()) {\n                delete this.transport;\n            };\n        },\n        _handleJSONPAbort: function() {\n            this._invokeErrorHandler();\n            delete this.transport;\n        },\n        _handleXHRResponse: function(pa) {\n            var qa;\n            if (this.getOption(\"suppressEvaluation\")) {\n                qa = {\n                    asyncResponse: new h(this, pa)\n                };\n            }\n             else {\n                var ra = pa.responseText, sa = null;\n                try {\n                    var ua = this._unshieldResponseText(ra);\n                    try {\n                        var va = (eval)(((\"(\" + ua) + \")\"));\n                        qa = this._interpretResponse(va);\n                    } catch (ta) {\n                        sa = \"excep\";\n                        qa = {\n                            transportError: (\"eval() failed on async to \" + this.getURI())\n                        };\n                    };\n                } catch (ta) {\n                    sa = \"empty\";\n                    qa = {\n                        transportError: ta.message\n                    };\n                };\n                if (sa) {\n                    var wa = a.ErrorSignal;\n                    (wa && wa.sendErrorSignal(\"async_xport_resp\", [(((this._xFbServer ? \"1008_\" : \"1012_\")) + sa),(this._xFbServer || \"-\"),this.getURI(),ra.length,ra.substr(0, 1600),].join(\":\")));\n                }\n            ;\n            }\n        ;\n            this.invokeResponseHandler(qa);\n        },\n        _unshieldResponseText: function(pa) {\n            var qa = \"for (;;);\", ra = qa.length;\n            if ((pa.length <= ra)) {\n                throw new Error((\"Response too short on async to \" + this.getURI()))\n            };\n            var sa = 0;\n            while (((pa.charAt(sa) == \" \") || (pa.charAt(sa) == \"\\u000a\"))) {\n                sa++;;\n            };\n            (sa && (pa.substring(sa, (sa + ra)) == qa));\n            return pa.substring((sa + ra));\n        },\n        _interpretResponse: function(pa) {\n            if (pa.redirect) {\n                return {\n                    redirect: pa.redirect\n                }\n            };\n            var qa = new h(this);\n            if ((pa.__ar != 1)) {\n                qa.payload = pa;\n            }\n             else x(qa, pa);\n        ;\n            return {\n                asyncResponse: qa\n            };\n        },\n        _onStateChange: function() {\n            try {\n                if ((this.transport.readyState == 4)) {\n                    na._inflightCount--;\n                    na._inflightPurge();\n                    try {\n                        if (((typeof (this.transport.getResponseHeader) !== \"undefined\") && this.transport.getResponseHeader(\"X-FB-Debug\"))) {\n                            this._xFbServer = this.transport.getResponseHeader(\"X-FB-Debug\");\n                        };\n                    } catch (qa) {\n                    \n                    };\n                    if (((this.transport.status >= 200) && (this.transport.status < 300))) {\n                        na.lastSuccessTime = Date.now();\n                        this._handleXHRResponse(this.transport);\n                    }\n                     else if ((t.webkit() && ((typeof (this.transport.status) == \"undefined\")))) {\n                        this._invokeErrorHandler(1002);\n                    }\n                     else if (((k.retry_ajax_on_network_error && ja(this.transport)) && (this.remainingRetries > 0))) {\n                        this.remainingRetries--;\n                        delete this.transport;\n                        this.send(true);\n                        return;\n                    }\n                     else this._invokeErrorHandler();\n                    \n                    \n                ;\n                    if ((this.getOption(\"asynchronous\") !== false)) {\n                        delete this.transport;\n                    };\n                }\n            ;\n            } catch (pa) {\n                if (ga()) {\n                    return\n                };\n                delete this.transport;\n                if ((this.remainingRetries > 0)) {\n                    this.remainingRetries--;\n                    this.send(true);\n                }\n                 else {\n                    !this.getOption(\"suppressErrorAlerts\");\n                    var ra = a.ErrorSignal;\n                    (ra && ra.sendErrorSignal(\"async_xport_resp\", [1007,(this._xFbServer || \"-\"),this.getURI(),pa.message,].join(\":\")));\n                    this._invokeErrorHandler(1007);\n                }\n            ;\n            };\n        },\n        _isMultiplexable: function() {\n            if ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))) {\n                return false\n            };\n            if (!this.uri.isFacebookURI()) {\n                return false\n            };\n            if (!this.getOption(\"asynchronous\")) {\n                return false\n            };\n            return true;\n        },\n        handleResponse: function(pa) {\n            var qa = this._interpretResponse(pa);\n            this.invokeResponseHandler(qa);\n        },\n        setMethod: function(pa) {\n            this.method = pa.toString().toUpperCase();\n            return this;\n        },\n        getMethod: function() {\n            return this.method;\n        },\n        setData: function(pa) {\n            this.data = pa;\n            return this;\n        },\n        _setDataHash: function() {\n            if (((this.method != \"POST\") || this.data.phstamp)) {\n                return\n            };\n            if ((typeof this.data.fb_dtsg !== \"string\")) {\n                return\n            };\n            var pa = s.implodeQuery(this.data).length, qa = \"\";\n            for (var ra = 0; (ra < this.data.fb_dtsg.length); ra++) {\n                qa += this.data.fb_dtsg.charCodeAt(ra);;\n            };\n            this.data.phstamp = ((\"1\" + qa) + pa);\n        },\n        setRawData: function(pa) {\n            this.rawData = pa;\n            return this;\n        },\n        getData: function() {\n            return this.data;\n        },\n        setContextData: function(pa, qa, ra) {\n            ra = ((ra === undefined) ? true : ra);\n            if (ra) {\n                this.context[(\"_log_\" + pa)] = qa;\n            };\n            return this;\n        },\n        _setUserActionID: function() {\n            var pa = ((a.ArbiterMonitor && a.ArbiterMonitor.getUE()) || \"-\");\n            this.userActionID = (((((a.EagleEye && a.EagleEye.getSessionID()) || \"-\")) + \"/\") + pa);\n        },\n        setURI: function(pa) {\n            var qa = s(pa);\n            if ((this.getOption(\"useIframeTransport\") && !qa.isFacebookURI())) {\n                return this\n            };\n            if ((((!this._allowCrossOrigin && !this.getOption(\"jsonp\")) && !this.getOption(\"useIframeTransport\")) && !qa.isSameOrigin())) {\n                return this\n            };\n            this._setUserActionID();\n            if ((!pa || qa.isEmpty())) {\n                var ra = a.ErrorSignal, sa = a.getErrorStack;\n                if ((ra && sa)) {\n                    var ta = {\n                        err_code: 1013,\n                        vip: \"-\",\n                        duration: 0,\n                        xfb_ip: \"-\",\n                        path: window.location.href,\n                        aid: this.userActionID\n                    };\n                    ra.sendErrorSignal(\"async_error\", JSON.stringify(ta));\n                    ra.sendErrorSignal(\"async_xport_stack\", [1013,window.location.href,null,sa(),].join(\":\"));\n                }\n            ;\n                return this;\n            }\n        ;\n            this.uri = qa;\n            return this;\n        },\n        getURI: function() {\n            return this.uri.toString();\n        },\n        setInitialHandler: function(pa) {\n            this.initialHandler = pa;\n            return this;\n        },\n        setHandler: function(pa) {\n            if (ka(pa)) {\n                this.handler = pa;\n            };\n            return this;\n        },\n        getHandler: function() {\n            return this.handler;\n        },\n        setUploadProgressHandler: function(pa) {\n            if (ka(pa)) {\n                this.uploadProgressHandler = pa;\n            };\n            return this;\n        },\n        setErrorHandler: function(pa) {\n            if (ka(pa)) {\n                this.errorHandler = pa;\n            };\n            return this;\n        },\n        setTransportErrorHandler: function(pa) {\n            this.transportErrorHandler = pa;\n            return this;\n        },\n        getErrorHandler: function() {\n            return this.errorHandler;\n        },\n        getTransportErrorHandler: function() {\n            return this.transportErrorHandler;\n        },\n        setTimeoutHandler: function(pa, qa) {\n            if (ka(qa)) {\n                this.timeout = pa;\n                this.timeoutHandler = qa;\n            }\n        ;\n            return this;\n        },\n        resetTimeout: function(pa) {\n            if (!((this.timeoutHandler === null))) {\n                if ((pa === null)) {\n                    this.timeout = null;\n                    clearTimeout(this.timer);\n                    this.timer = null;\n                }\n                 else {\n                    var qa = !this._allowCrossPageTransition;\n                    this.timeout = pa;\n                    clearTimeout(this.timer);\n                    this.timer = this._handleTimeout.bind(this).defer(this.timeout, qa);\n                }\n            \n            };\n            return this;\n        },\n        _handleTimeout: function() {\n            this.abandon();\n            this.timeoutHandler(this);\n        },\n        setNewSerial: function() {\n            this.id = ++la;\n            return this;\n        },\n        setInterceptHandler: function(pa) {\n            this.interceptHandler = pa;\n            return this;\n        },\n        setFinallyHandler: function(pa) {\n            this.finallyHandler = pa;\n            return this;\n        },\n        setAbortHandler: function(pa) {\n            this.abortHandler = pa;\n            return this;\n        },\n        getServerDialogCancelHandler: function() {\n            return this.serverDialogCancelHandler;\n        },\n        setServerDialogCancelHandler: function(pa) {\n            this.serverDialogCancelHandler = pa;\n            return this;\n        },\n        setPreBootloadHandler: function(pa) {\n            this.preBootloadHandler = pa;\n            return this;\n        },\n        setReadOnly: function(pa) {\n            if (!((typeof (pa) != \"boolean\"))) {\n                this.readOnly = pa;\n            };\n            return this;\n        },\n        setFBMLForm: function() {\n            this.writeRequiredParams = [\"fb_sig\",];\n            return this;\n        },\n        getReadOnly: function() {\n            return this.readOnly;\n        },\n        setRelativeTo: function(pa) {\n            this.relativeTo = pa;\n            return this;\n        },\n        getRelativeTo: function() {\n            return this.relativeTo;\n        },\n        setStatusClass: function(pa) {\n            this.statusClass = pa;\n            return this;\n        },\n        setStatusElement: function(pa) {\n            this.statusElement = pa;\n            return this;\n        },\n        getStatusElement: function() {\n            return aa(this.statusElement);\n        },\n        _isRelevant: function() {\n            if (this._allowCrossPageTransition) {\n                return true\n            };\n            if (!this.id) {\n                return true\n            };\n            return (this.id > ma);\n        },\n        clearStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.removeClass(pa, \"async_saving\");\n                j.removeClass(pa, this.statusClass);\n            }\n        ;\n        },\n        addStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.addClass(pa, \"async_saving\");\n                j.addClass(pa, this.statusClass);\n            }\n        ;\n        },\n        specifiesWriteRequiredParams: function() {\n            return this.writeRequiredParams.every(function(pa) {\n                this.data[pa] = ((this.data[pa] || k[pa]) || ((aa(pa) || {\n                })).value);\n                if ((this.data[pa] !== undefined)) {\n                    return true\n                };\n                return false;\n            }, this);\n        },\n        setOption: function(pa, qa) {\n            if ((typeof (this.option[pa]) != \"undefined\")) {\n                this.option[pa] = qa;\n            };\n            return this;\n        },\n        getOption: function(pa) {\n            (typeof (this.option[pa]) == \"undefined\");\n            return this.option[pa];\n        },\n        abort: function() {\n            if (this.transport) {\n                var pa = this.getTransportErrorHandler();\n                this.setOption(\"suppressErrorAlerts\", true);\n                this.setTransportErrorHandler(y);\n                this._requestAborted = true;\n                this.transport.abort();\n                this.setTransportErrorHandler(pa);\n            }\n        ;\n            this.abortHandler();\n        },\n        abandon: function() {\n            clearTimeout(this.timer);\n            this.setOption(\"suppressErrorAlerts\", true).setHandler(y).setErrorHandler(y).setTransportErrorHandler(y);\n            if (this.transport) {\n                this._requestAborted = true;\n                this.transport.abort();\n            }\n        ;\n        },\n        setNectarData: function(pa) {\n            if (pa) {\n                if ((this.data.nctr === undefined)) {\n                    this.data.nctr = {\n                    };\n                };\n                x(this.data.nctr, pa);\n            }\n        ;\n            return this;\n        },\n        setNectarModuleDataSafe: function(pa) {\n            if (this.setNectarModuleData) {\n                this.setNectarModuleData(pa);\n            };\n            return this;\n        },\n        setNectarImpressionIdSafe: function() {\n            if (this.setNectarImpressionId) {\n                this.setNectarImpressionId();\n            };\n            return this;\n        },\n        setAllowCrossPageTransition: function(pa) {\n            this._allowCrossPageTransition = !!pa;\n            if (this.timer) {\n                this.resetTimeout(this.timeout);\n            };\n            return this;\n        },\n        setAllowCrossOrigin: function(pa) {\n            this._allowCrossOrigin = pa;\n            return this;\n        },\n        send: function(pa) {\n            pa = (pa || false);\n            if (!this.uri) {\n                return false\n            };\n            (!this.errorHandler && !this.getOption(\"suppressErrorHandlerWarning\"));\n            if ((this.getOption(\"jsonp\") && (this.method != \"GET\"))) {\n                this.setMethod(\"GET\");\n            };\n            if ((this.getOption(\"useIframeTransport\") && (this.method != \"GET\"))) {\n                this.setMethod(\"GET\");\n            };\n            ((this.timeoutHandler !== null) && ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))));\n            if (!this.getReadOnly()) {\n                this.specifiesWriteRequiredParams();\n                if ((this.method != \"POST\")) {\n                    return false\n                };\n            }\n        ;\n            x(this.data, u.getAsyncParams(this.method));\n            if (!ca(this.context)) {\n                x(this.data, this.context);\n                this.data.ajax_log = 1;\n            }\n        ;\n            if (k.force_param) {\n                x(this.data, k.force_param);\n            };\n            this._setUserActionID();\n            if ((this.getOption(\"bundle\") && this._isMultiplexable())) {\n                oa.schedule(this);\n                return true;\n            }\n        ;\n            this.setNewSerial();\n            if (!this.getOption(\"asynchronous\")) {\n                this.uri.addQueryData({\n                    __s: 1\n                });\n            };\n            this.finallyHandler = v(this.finallyHandler, \"final\");\n            var qa, ra;\n            if (((this.method == \"GET\") || this.rawData)) {\n                qa = this.uri.addQueryData(this.data).toString();\n                ra = (this.rawData || \"\");\n            }\n             else {\n                qa = this.uri.toString();\n                this._setDataHash();\n                ra = s.implodeQuery(this.data);\n            }\n        ;\n            if (this.transport) {\n                return false\n            };\n            if ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))) {\n                d([\"JSONPTransport\",], function(va) {\n                    var wa = new va((this.getOption(\"jsonp\") ? \"jsonp\" : \"iframe\"), this.uri);\n                    this.setJSONPTransport(wa);\n                    wa.send();\n                }.bind(this));\n                return true;\n            }\n        ;\n            var sa = u.create();\n            if (!sa) {\n                return false\n            };\n            sa.onreadystatechange = v(this._onStateChange.bind(this), \"xhr\");\n            if ((this.uploadProgressHandler && ha(sa))) {\n                sa.upload.onprogress = this.uploadProgressHandler.bind(this);\n            };\n            if (!pa) {\n                this.remainingRetries = this.getOption(\"retries\");\n            };\n            if ((a.ErrorSignal || a.ArbiterMonitor)) {\n                this._sendTimeStamp = (this._sendTimeStamp || Date.now());\n            };\n            this.transport = sa;\n            try {\n                this.transport.open(this.method, qa, this.getOption(\"asynchronous\"));\n            } catch (ta) {\n                return false;\n            };\n            var ua = k.svn_rev;\n            if (ua) {\n                this.transport.setRequestHeader(\"X-SVN-Rev\", String(ua));\n            };\n            if (((!this.uri.isSameOrigin() && !this.getOption(\"jsonp\")) && !this.getOption(\"useIframeTransport\"))) {\n                if (!ia(this.transport)) {\n                    return false\n                };\n                if (this.uri.isFacebookURI()) {\n                    this.transport.withCredentials = true;\n                };\n            }\n        ;\n            if (((this.method == \"POST\") && !this.rawData)) {\n                this.transport.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            };\n            g.inform(\"AsyncRequest/send\", {\n                request: this\n            });\n            this.addStatusIndicator();\n            this.transport.send(ra);\n            if ((this.timeout !== null)) {\n                this.resetTimeout(this.timeout);\n            };\n            na._inflightCount++;\n            na._inflightAdd(this);\n            return true;\n        }\n    });\n    function oa() {\n        this._requests = [];\n    };\n    x(oa, {\n        multiplex: null,\n        schedule: function(pa) {\n            if (!oa.multiplex) {\n                oa.multiplex = new oa();\n                (function() {\n                    oa.multiplex.send();\n                    oa.multiplex = null;\n                }).defer();\n            }\n        ;\n            oa.multiplex.add(pa);\n        }\n    });\n    x(oa.prototype, {\n        add: function(pa) {\n            this._requests.push(pa);\n        },\n        send: function() {\n            var pa = this._requests;\n            if (!pa.length) {\n                return\n            };\n            var qa;\n            if ((pa.length === 1)) {\n                qa = pa[0];\n            }\n             else {\n                var ra = pa.map(function(sa) {\n                    return [sa.uri.getPath(),s.implodeQuery(sa.data),];\n                });\n                qa = new na(\"/ajax/proxy.php\").setAllowCrossPageTransition(true).setData({\n                    data: ra\n                }).setHandler(this._handler.bind(this)).setTransportErrorHandler(this._transportErrorHandler.bind(this));\n            }\n        ;\n            qa.setOption(\"bundle\", false).send();\n        },\n        _handler: function(pa) {\n            var qa = pa.getPayload().responses;\n            if ((qa.length !== this._requests.length)) {\n                return\n            };\n            for (var ra = 0; (ra < this._requests.length); ra++) {\n                var sa = this._requests[ra], ta = sa.uri.getPath();\n                sa.id = this.id;\n                if ((qa[ra][0] !== ta)) {\n                    sa.invokeResponseHandler({\n                        transportError: (\"Wrong response order in bundled request to \" + ta)\n                    });\n                    continue;\n                }\n            ;\n                sa.handleResponse(qa[ra][1]);\n            };\n        },\n        _transportErrorHandler: function(pa) {\n            var qa = {\n                transportError: pa.errorDescription\n            }, ra = this._requests.map(function(sa) {\n                sa.id = this.id;\n                sa.invokeResponseHandler(qa);\n                return sa.uri.getPath();\n            });\n        }\n    });\n    e.exports = na;\n});\n__d(\"legacy:async\", [\"AsyncRequest\",\"AsyncResponse\",], function(a, b, c, d) {\n    a.AsyncRequest = b(\"AsyncRequest\");\n    a.AsyncResponse = b(\"AsyncResponse\");\n}, 3);\n__d(\"debounce\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k) {\n        if ((i == null)) {\n            i = 100;\n        };\n        var l;\n        function m(n, o, p, q, r) {\n            m.reset();\n            l = setTimeout(function() {\n                h.call(j, n, o, p, q, r);\n            }, i, !k);\n        };\n        m.reset = function() {\n            clearTimeout(l);\n        };\n        return m;\n    };\n    e.exports = g;\n});\n__d(\"LitestandViewportHeight\", [\"Arbiter\",\"CSS\",\"Event\",\"cx\",\"debounce\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"Event\"), j = b(\"cx\"), k = b(\"debounce\"), l = b(\"emptyFunction\"), m, n = {\n        SMALL: \"small\",\n        NORMAL: \"normal\",\n        LARGE: \"large\",\n        getSize: function() {\n            if ((m === \"-cx-PUBLIC-litestandViewportSize__small\")) {\n                return n.SMALL\n            };\n            if ((m === \"-cx-PUBLIC-litestandViewportSize__large\")) {\n                return n.LARGE\n            };\n            return n.NORMAL;\n        },\n        init: function(o) {\n            n.init = l;\n            var p = k(function() {\n                var q = document.documentElement, r = q.clientHeight, s;\n                if ((r <= o.max_small_height)) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__small\";\n                }\n                 else if ((r >= o.min_large_height)) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__large\";\n                }\n            ;\n                if ((s !== m)) {\n                    (m && h.removeClass(q, m));\n                    m = s;\n                    (m && h.addClass(q, m));\n                    g.inform(\"ViewportSizeChange\");\n                }\n            ;\n            });\n            p();\n            i.listen(window, \"resize\", p);\n        }\n    };\n    e.exports = n;\n});\n__d(\"AsyncDOM\", [\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = {\n        invoke: function(j, k) {\n            for (var l = 0; (l < j.length); ++l) {\n                var m = j[l], n = m[0], o = m[1], p = m[2], q = m[3], r = (((p && k)) || null);\n                if (o) {\n                    r = h.scry((r || document.documentElement), o)[0];\n                };\n                switch (n) {\n                  case \"eval\":\n                    (new Function(q)).apply(r);\n                    break;\n                  case \"hide\":\n                    g.hide(r);\n                    break;\n                  case \"show\":\n                    g.show(r);\n                    break;\n                  case \"setContent\":\n                    h.setContent(r, q);\n                    break;\n                  case \"appendContent\":\n                    h.appendContent(r, q);\n                    break;\n                  case \"prependContent\":\n                    h.prependContent(r, q);\n                    break;\n                  case \"insertAfter\":\n                    h.insertAfter(r, q);\n                    break;\n                  case \"insertBefore\":\n                    h.insertBefore(r, q);\n                    break;\n                  case \"remove\":\n                    h.remove(r);\n                    break;\n                  case \"replace\":\n                    h.replace(r, q);\n                    break;\n                  default:\n                \n                };\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"Live\", [\"Arbiter\",\"AsyncDOM\",\"AsyncSignal\",\"ChannelConstants\",\"DataStore\",\"DOM\",\"ServerJS\",\"createArrayFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDOM\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"ServerJS\"), n = b(\"createArrayFrom\"), o = b(\"emptyFunction\");\n    function p(r, s) {\n        s = JSON.parse(JSON.stringify(s));\n        new m().setRelativeTo(r).handle(s);\n    };\n    var q = {\n        logAll: false,\n        startup: function() {\n            q.startup = o;\n            g.subscribe(j.getArbiterType(\"live\"), q.handleMessage.bind(q));\n        },\n        lookupLiveNode: function(r, s) {\n            var t = l.scry(document.body, (((\".live_\" + r) + \"_\") + s));\n            t.forEach(function(u) {\n                if ((k.get(u, \"seqnum\") === undefined)) {\n                    var v = JSON.parse(u.getAttribute(\"data-live\"));\n                    k.set(u, \"seqnum\", v.seq);\n                }\n            ;\n            });\n            return t;\n        },\n        handleMessage: function(r, s) {\n            var t = s.obj, u = t.fbid, v = t.assoc, w = this.lookupLiveNode(u, v);\n            if (!w) {\n                return false\n            };\n            w.forEach(function(x) {\n                if (t.expseq) {\n                    var y = k.get(x, \"seqnum\"), z = k.get(x, \"message_buffer\");\n                    if ((z === undefined)) {\n                        z = {\n                        };\n                        k.set(x, \"message_buffer\", z);\n                    }\n                ;\n                    var aa = {\n                        obj: t\n                    };\n                    z[t.expseq] = aa;\n                    if ((t.expseq != y)) {\n                        q.log(\"mismatch\", t.fbid, t.expseq, y);\n                        return false;\n                    }\n                ;\n                    while (true) {\n                        y = k.get(x, \"seqnum\");\n                        var ba = z[y];\n                        if (ba) {\n                            h.invoke(ba.obj.updates, x);\n                            if (ba.obj.js) {\n                                p(x, ba.obj.js);\n                            };\n                            q.log(\"seqmatch\", t.fbid, \"exp\", t.expseq, \"cur\", y);\n                            delete z[y];\n                        }\n                         else break;\n                    ;\n                    };\n                }\n                 else {\n                    h.invoke(t.updates, x);\n                    if (t.js) {\n                        p(x, t.js);\n                    };\n                }\n            ;\n            });\n        },\n        log: function() {\n            if (q.logAll) {\n                var r = n(arguments).join(\":\");\n                new i(\"/common/scribe_endpoint.php\", {\n                    c: \"live_sequence\",\n                    m: r\n                }).send();\n            }\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"legacy:live-js\", [\"Live\",], function(a, b, c, d) {\n    a.Live = b(\"Live\");\n}, 3);\n__d(\"fbt\", [\"copyProperties\",\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"substituteTokens\"), i = function() {\n    \n    };\n    i._ = function(j, k) {\n        var l = {\n        };\n        for (var m = 0; (m < k.length); m++) {\n            g(l, k[m][1]);;\n        };\n        return h(j, l);\n    };\n    i.param = function(j, k) {\n        var l = {\n        };\n        l[j] = k;\n        return [null,l,];\n    };\n    e.exports = i;\n});\n__d(\"LiveTimer\", [\"CSS\",\"DOM\",\"UserAgent\",\"emptyFunction\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"emptyFunction\"), k = b(\"fbt\"), l = b(\"tx\"), m = 1000, n = 60, o = 3600, p = 43200, q = 60, r = 20000, s = {\n        restart: function(t) {\n            this.serverTime = t;\n            this.localStartTime = (Date.now() / 1000);\n            this.updateTimeStamps();\n        },\n        getApproximateServerTime: function() {\n            return (this.getServerTimeOffset() + Date.now());\n        },\n        getServerTimeOffset: function() {\n            return (((this.serverTime - this.localStartTime)) * m);\n        },\n        updateTimeStamps: function() {\n            s.timestamps = h.scry(document.body, \"abbr.livetimestamp\");\n            s.startLoop(r);\n        },\n        addTimeStamps: function(t) {\n            if (!t) {\n                return\n            };\n            s.timestamps = (s.timestamps || []);\n            if ((h.isNodeOfType(t, \"abbr\") && g.hasClass(t, \"livetimestamp\"))) {\n                s.timestamps.push(t);\n            }\n             else {\n                var u = h.scry(t, \"abbr.livetimestamp\");\n                for (var v = 0; (v < u.length); ++v) {\n                    s.timestamps.push(u[v]);;\n                };\n            }\n        ;\n            s.startLoop(0);\n        },\n        startLoop: function(t) {\n            this.stop();\n            this.timeout = setTimeout(function() {\n                s.loop();\n            }, t);\n        },\n        stop: function() {\n            clearTimeout(this.timeout);\n        },\n        updateNode: function(t, u) {\n            s.updateNode = ((i.ie() < 7) ? j : h.setContent);\n            s.updateNode(t, u);\n        },\n        loop: function(t) {\n            if (t) {\n                s.updateTimeStamps();\n            };\n            var u = Math.floor((s.getApproximateServerTime() / m)), v = -1;\n            (s.timestamps && s.timestamps.forEach(function(x) {\n                var y = x.getAttribute(\"data-utime\"), z = x.getAttribute(\"data-shorten\"), aa = s.renderRelativeTime(u, y, z);\n                if (aa.text) {\n                    s.updateNode(x, aa.text);\n                };\n                if (((aa.next != -1) && (((aa.next < v) || (v == -1))))) {\n                    v = aa.next;\n                };\n            }));\n            if ((v != -1)) {\n                var w = Math.max(r, (v * m));\n                s.timeout = setTimeout(function() {\n                    s.loop();\n                }, w);\n            }\n        ;\n        },\n        renderRelativeTime: function(t, u, v) {\n            var w = {\n                text: \"\",\n                next: -1\n            };\n            if (((t - u) > (p))) {\n                return w\n            };\n            var x = (t - u), y = Math.floor((x / n)), z = Math.floor((y / q));\n            if ((y < 1)) {\n                if (v) {\n                    x = ((x > 1) ? x : 2);\n                    w.text = k._(\"{number} secs\", [k.param(\"number\", x),]);\n                    w.next = (20 - (x % 20));\n                }\n                 else {\n                    w.text = \"a few seconds ago\";\n                    w.next = (n - (x % n));\n                }\n            ;\n                return w;\n            }\n        ;\n            if ((z < 1)) {\n                if ((v && (y == 1))) {\n                    w.text = \"1 min\";\n                }\n                 else if (v) {\n                    w.text = k._(\"{number} mins\", [k.param(\"number\", y),]);\n                }\n                 else w.text = ((y == 1) ? \"about a minute ago\" : l._(\"{number} minutes ago\", {\n                    number: y\n                }));\n                \n            ;\n                w.next = (n - (x % n));\n                return w;\n            }\n        ;\n            if ((z < 11)) {\n                w.next = (o - (x % o));\n            };\n            if ((v && (z == 1))) {\n                w.text = \"1 hr\";\n            }\n             else if (v) {\n                w.text = k._(\"{number} hrs\", [k.param(\"number\", z),]);\n            }\n             else w.text = ((z == 1) ? \"about an hour ago\" : l._(\"{number} hours ago\", {\n                number: z\n            }));\n            \n        ;\n            return w;\n        },\n        renderRelativeTimeToServer: function(t) {\n            return s.renderRelativeTime(Math.floor((s.getApproximateServerTime() / m)), t);\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:live-timer\", [\"LiveTimer\",], function(a, b, c, d) {\n    a.LiveTimer = b(\"LiveTimer\");\n}, 3);\n__d(\"JSLogger\", [], function(a, b, c, d, e, f) {\n    var g = {\n        MAX_HISTORY: 500,\n        counts: {\n        },\n        categories: {\n        },\n        seq: 0,\n        pageId: (((Math.random() * 2147483648) | 0)).toString(36),\n        forwarding: false\n    };\n    function h(l) {\n        if (((l instanceof Error) && a.ErrorUtils)) {\n            l = a.ErrorUtils.normalizeError(l);\n        };\n        try {\n            return JSON.stringify(l);\n        } catch (m) {\n            return \"{}\";\n        };\n    };\n    function i(l, event, m) {\n        if (!g.counts[l]) {\n            g.counts[l] = {\n            };\n        };\n        if (!g.counts[l][event]) {\n            g.counts[l][event] = 0;\n        };\n        m = ((m == null) ? 1 : Number(m));\n        g.counts[l][event] += (isFinite(m) ? m : 0);\n    };\n    g.logAction = function(event, l, m) {\n        if ((this.type == \"bump\")) {\n            i(this.cat, event, l);\n        }\n         else if ((this.type == \"rate\")) {\n            ((l && i(this.cat, (event + \"_n\"), m)));\n            i(this.cat, (event + \"_d\"), m);\n        }\n         else {\n            var n = {\n                cat: this.cat,\n                type: this.type,\n                event: event,\n                data: ((l != null) ? h(l) : null),\n                date: Date.now(),\n                seq: g.seq++\n            };\n            g.head = (g.head ? (g.head.next = n) : (g.tail = n));\n            while (((g.head.seq - g.tail.seq) > g.MAX_HISTORY)) {\n                g.tail = g.tail.next;;\n            };\n            return n;\n        }\n        \n    ;\n    };\n    function j(l) {\n        if (!g.categories[l]) {\n            g.categories[l] = {\n            };\n            var m = function(n) {\n                var o = {\n                    cat: l,\n                    type: n\n                };\n                g.categories[l][n] = function() {\n                    g.forwarding = false;\n                    var p = null;\n                    if ((document.domain != \"facebook.com\")) {\n                        return\n                    };\n                    p = g.logAction;\n                    if (/^\\/+(dialogs|plugins?)\\//.test(location.pathname)) {\n                        g.forwarding = false;\n                    }\n                     else try {\n                        p = a.top.require(\"JSLogger\")._.logAction;\n                        g.forwarding = (p !== g.logAction);\n                    } catch (q) {\n                    \n                    }\n                ;\n                    ((p && p.apply(o, arguments)));\n                };\n            };\n            m(\"debug\");\n            m(\"log\");\n            m(\"warn\");\n            m(\"error\");\n            m(\"bump\");\n            m(\"rate\");\n        }\n    ;\n        return g.categories[l];\n    };\n    function k(l, m) {\n        var n = [];\n        for (var o = (m || g.tail); o; o = o.next) {\n            if ((!l || l(o))) {\n                var p = {\n                    type: o.type,\n                    cat: o.cat,\n                    date: o.date,\n                    event: o.event,\n                    seq: o.seq\n                };\n                if (o.data) {\n                    p.data = JSON.parse(o.data);\n                };\n                n.push(p);\n            }\n        ;\n        };\n        return n;\n    };\n    e.exports = {\n        _: g,\n        DUMP_EVENT: \"jslogger/dump\",\n        create: j,\n        getEntries: k\n    };\n});\n__d(\"startsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = String(h);\n        j = Math.min(Math.max((j || 0), 0), k.length);\n        return (k.lastIndexOf(String(i), j) === j);\n    };\n    e.exports = g;\n});\n__d(\"getContextualParent\", [\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\");\n    function h(i, j) {\n        var k, l = false;\n        do {\n            if ((i.getAttribute && (k = i.getAttribute(\"data-ownerid\")))) {\n                i = g(k);\n                l = true;\n            }\n             else i = i.parentNode;\n        ;\n        } while (((j && i) && !l));\n        return i;\n    };\n    e.exports = h;\n});\n__d(\"Nectar\", [\"Env\",\"startsWith\",\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"startsWith\"), i = b(\"getContextualParent\");\n    function j(m) {\n        if (!m.nctr) {\n            m.nctr = {\n            };\n        };\n    };\n    function k(m) {\n        if ((g.module || !m)) {\n            return g.module\n        };\n        var n = {\n            fbpage_fan_confirm: true,\n            photos_snowlift: true\n        }, o;\n        while ((m && m.getAttributeNode)) {\n            var p = ((m.getAttributeNode(\"id\") || {\n            })).value;\n            if (h(p, \"pagelet_\")) {\n                return p\n            };\n            if ((!o && n[p])) {\n                o = p;\n            };\n            m = i(m);\n        };\n        return o;\n    };\n    var l = {\n        addModuleData: function(m, n) {\n            var o = k(n);\n            if (o) {\n                j(m);\n                m.nctr._mod = o;\n            }\n        ;\n        },\n        addImpressionID: function(m) {\n            if (g.impid) {\n                j(m);\n                m.nctr._impid = g.impid;\n            }\n        ;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BrowserSupport\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = {\n    }, i = [\"Webkit\",\"Moz\",\"O\",\"ms\",], j = document.createElement(\"div\"), k = function(m) {\n        if ((h[m] === undefined)) {\n            var n = null;\n            if ((m in j.style)) {\n                n = m;\n            }\n             else for (var o = 0; (o < i.length); o++) {\n                var p = ((i[o] + m.charAt(0).toUpperCase()) + m.slice(1));\n                if ((p in j.style)) {\n                    n = p;\n                    break;\n                }\n            ;\n            }\n        ;\n            h[m] = n;\n        }\n    ;\n        return h[m];\n    }, l = {\n        hasCSSAnimations: function() {\n            return !!k(\"animationName\");\n        },\n        hasCSSTransforms: function() {\n            return !!k(\"transform\");\n        },\n        hasCSS3DTransforms: function() {\n            return !!k(\"perspective\");\n        },\n        hasCSSTransitions: function() {\n            return !!k(\"transition\");\n        },\n        hasPositionSticky: function() {\n            if ((h.sticky === undefined)) {\n                j.style.cssText = (\"position:-webkit-sticky;position:-moz-sticky;\" + \"position:-o-sticky;position:-ms-sticky;position:sticky;\");\n                h.sticky = /sticky/.test(j.style.position);\n            }\n        ;\n            return h.sticky;\n        },\n        hasPointerEvents: function() {\n            if ((h.pointerEvents === undefined)) {\n                if (!((\"pointerEvents\" in j.style))) {\n                    h.pointerEvents = false;\n                }\n                 else {\n                    j.style.pointerEvents = \"auto\";\n                    j.style.pointerEvents = \"x\";\n                    g.appendContent(document.documentElement, j);\n                    h.pointerEvents = (window.getComputedStyle && (getComputedStyle(j, \"\").pointerEvents === \"auto\"));\n                    g.remove(j);\n                }\n            \n            };\n            return h.pointerEvents;\n        },\n        getTransitionEndEvent: function() {\n            if ((h.transitionEnd === undefined)) {\n                var m = {\n                    transition: \"transitionend\",\n                    WebkitTransition: \"webkitTransitionEnd\",\n                    MozTransition: \"mozTransitionEnd\",\n                    OTransition: \"oTransitionEnd\"\n                }, n = k(\"transition\");\n                h.transitionEnd = (m[n] || null);\n            }\n        ;\n            return h.transitionEnd;\n        }\n    };\n    e.exports = l;\n});\n__d(\"hyphenate\", [], function(a, b, c, d, e, f) {\n    var g = /([A-Z])/g;\n    function h(i) {\n        return i.replace(g, \"-$1\").toLowerCase();\n    };\n    e.exports = h;\n});\n__d(\"Style\", [\"DOMQuery\",\"UserAgent\",\"$\",\"copyProperties\",\"hyphenate\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"UserAgent\"), i = b(\"$\"), j = b(\"copyProperties\"), k = b(\"hyphenate\");\n    function l(s) {\n        return s.replace(/-(.)/g, function(t, u) {\n            return u.toUpperCase();\n        });\n    };\n    function m(s, t) {\n        var u = r.get(s, t);\n        return (((u === \"auto\") || (u === \"scroll\")));\n    };\n    var n = new RegExp((((((\"\\\\s*\" + \"([^\\\\s:]+)\") + \"\\\\s*:\\\\s*\") + \"([^;('\\\"]*(?:(?:\\\\([^)]*\\\\)|\\\"[^\\\"]*\\\"|'[^']*')[^;(?:'\\\"]*)*)\") + \"(?:;|$)\")), \"g\");\n    function o(s) {\n        var t = {\n        };\n        s.replace(n, function(u, v, w) {\n            t[v] = w;\n        });\n        return t;\n    };\n    function p(s) {\n        var t = \"\";\n        for (var u in s) {\n            if (s[u]) {\n                t += (((u + \":\") + s[u]) + \";\");\n            };\n        };\n        return t;\n    };\n    function q(s) {\n        return ((s !== \"\") ? ((\"alpha(opacity=\" + (s * 100)) + \")\") : \"\");\n    };\n    var r = {\n        set: function(s, t, u) {\n            switch (t) {\n              case \"opacity\":\n                if ((t === \"opacity\")) {\n                    if ((h.ie() < 9)) {\n                        s.style.filter = q(u);\n                    }\n                     else s.style.opacity = u;\n                \n                };\n                break;\n              case \"float\":\n                s.style.cssFloat = s.style.styleFloat = (u || \"\");\n                break;\n              default:\n                try {\n                    s.style[l(t)] = u;\n                } catch (v) {\n                    throw new Error(((((\"Style.set: \\\"\" + t) + \"\\\" argument is invalid: \\\"\") + u) + \"\\\"\"));\n                };\n            };\n        },\n        apply: function(s, t) {\n            var u;\n            if (((\"opacity\" in t) && (h.ie() < 9))) {\n                var v = t.opacity;\n                t.filter = q(v);\n                delete t.opacity;\n            }\n        ;\n            var w = o(s.style.cssText);\n            for (u in t) {\n                var x = t[u];\n                delete t[u];\n                u = k(u);\n                for (var y in w) {\n                    if (((y === u) || (y.indexOf((u + \"-\")) === 0))) {\n                        delete w[y];\n                    };\n                };\n                t[u] = x;\n            };\n            t = j(w, t);\n            s.style.cssText = p(t);\n            if ((h.ie() < 9)) {\n                for (u in t) {\n                    if (!t[u]) {\n                        r.set(s, u, \"\");\n                    };\n                }\n            };\n        },\n        get: function(s, t) {\n            s = i(s);\n            var u;\n            if (window.getComputedStyle) {\n                u = window.getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t))\n                };\n            }\n        ;\n            if ((document.defaultView && document.defaultView.getComputedStyle)) {\n                u = document.defaultView.getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t))\n                };\n                if ((t == \"display\")) {\n                    return \"none\"\n                };\n            }\n        ;\n            t = l(t);\n            if (s.currentStyle) {\n                if ((t === \"float\")) {\n                    return (s.currentStyle.cssFloat || s.currentStyle.styleFloat)\n                };\n                return s.currentStyle[t];\n            }\n        ;\n            return (s.style && s.style[t]);\n        },\n        getFloat: function(s, t) {\n            return parseFloat(r.get(s, t), 10);\n        },\n        getOpacity: function(s) {\n            s = i(s);\n            var t = r.get(s, \"filter\"), u = null;\n            if ((t && (u = /(\\d+(?:\\.\\d+)?)/.exec(t)))) {\n                return (parseFloat(u.pop()) / 100);\n            }\n             else if (t = r.get(s, \"opacity\")) {\n                return parseFloat(t);\n            }\n             else return 1\n            \n        ;\n        },\n        isFixed: function(s) {\n            while (g.contains(document.body, s)) {\n                if ((r.get(s, \"position\") === \"fixed\")) {\n                    return true\n                };\n                s = s.parentNode;\n            };\n            return false;\n        },\n        getScrollParent: function(s) {\n            if (!s) {\n                return null\n            };\n            while ((s !== document.body)) {\n                if (((m(s, \"overflow\") || m(s, \"overflowY\")) || m(s, \"overflowX\"))) {\n                    return s\n                };\n                s = s.parentNode;\n            };\n            return window;\n        }\n    };\n    e.exports = r;\n});\n__d(\"shield\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if ((typeof h != \"function\")) {\n            throw new TypeError()\n        };\n        var j = Array.prototype.slice.call(arguments, 2);\n        return function() {\n            return h.apply(i, j);\n        };\n    };\n    e.exports = g;\n});\n__d(\"Animation\", [\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Style\"), l = b(\"shield\"), m, n = [], o;\n    function p(ga) {\n        if ((a == this)) {\n            return new p(ga);\n        }\n         else {\n            this.obj = ga;\n            this._reset_state();\n            this.queue = [];\n            this.last_attr = null;\n        }\n    ;\n    };\n    function q(ga) {\n        if (g.hasCSS3DTransforms()) {\n            return t(ga);\n        }\n         else return s(ga)\n    ;\n    };\n    function r(ga) {\n        return ga.toFixed(8);\n    };\n    function s(ga) {\n        ga = [ga[0],ga[4],ga[1],ga[5],ga[12],ga[13],];\n        return ((\"matrix(\" + ga.map(r).join(\",\")) + \")\");\n    };\n    function t(ga) {\n        return ((\"matrix3d(\" + ga.map(r).join(\",\")) + \")\");\n    };\n    function u(ga, ha) {\n        if (!ga) {\n            ga = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,];\n        };\n        var ia = [];\n        for (var ja = 0; (ja < 4); ja++) {\n            for (var ka = 0; (ka < 4); ka++) {\n                var la = 0;\n                for (var ma = 0; (ma < 4); ma++) {\n                    la += (ga[((ja * 4) + ma)] * ha[((ma * 4) + ka)]);;\n                };\n                ia[((ja * 4) + ka)] = la;\n            };\n        };\n        return ia;\n    };\n    var v = 0;\n    p.prototype._reset_state = function() {\n        this.state = {\n            attrs: {\n            },\n            duration: 500\n        };\n    };\n    p.prototype.stop = function() {\n        this._reset_state();\n        this.queue = [];\n        return this;\n    };\n    p.prototype._build_container = function() {\n        if (this.container_div) {\n            this._refresh_container();\n            return;\n        }\n    ;\n        if ((this.obj.firstChild && this.obj.firstChild.__animation_refs)) {\n            this.container_div = this.obj.firstChild;\n            this.container_div.__animation_refs++;\n            this._refresh_container();\n            return;\n        }\n    ;\n        var ga = document.createElement(\"div\");\n        ga.style.padding = \"0px\";\n        ga.style.margin = \"0px\";\n        ga.style.border = \"0px\";\n        ga.__animation_refs = 1;\n        var ha = this.obj.childNodes;\n        while (ha.length) {\n            ga.appendChild(ha[0]);;\n        };\n        this.obj.appendChild(ga);\n        this._orig_overflow = this.obj.style.overflow;\n        this.obj.style.overflow = \"hidden\";\n        this.container_div = ga;\n        this._refresh_container();\n    };\n    p.prototype._refresh_container = function() {\n        this.container_div.style.height = \"auto\";\n        this.container_div.style.width = \"auto\";\n        this.container_div.style.height = (this.container_div.offsetHeight + \"px\");\n        this.container_div.style.width = (this.container_div.offsetWidth + \"px\");\n    };\n    p.prototype._destroy_container = function() {\n        if (!this.container_div) {\n            return\n        };\n        if (!--this.container_div.__animation_refs) {\n            var ga = this.container_div.childNodes;\n            while (ga.length) {\n                this.obj.appendChild(ga[0]);;\n            };\n            this.obj.removeChild(this.container_div);\n        }\n    ;\n        this.container_div = null;\n        this.obj.style.overflow = this._orig_overflow;\n    };\n    var w = 1, x = 2, y = 3;\n    p.prototype._attr = function(ga, ha, ia) {\n        ga = ga.replace(/-[a-z]/gi, function(ka) {\n            return ka.substring(1).toUpperCase();\n        });\n        var ja = false;\n        switch (ga) {\n          case \"background\":\n            this._attr(\"backgroundColor\", ha, ia);\n            return this;\n          case \"backgroundColor\":\n        \n          case \"borderColor\":\n        \n          case \"color\":\n            ha = ca(ha);\n            break;\n          case \"opacity\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"height\":\n        \n          case \"width\":\n            if ((ha == \"auto\")) {\n                ja = true;\n            }\n             else ha = parseInt(ha, 10);\n        ;\n            break;\n          case \"borderWidth\":\n        \n          case \"lineHeight\":\n        \n          case \"fontSize\":\n        \n          case \"margin\":\n        \n          case \"marginBottom\":\n        \n          case \"marginLeft\":\n        \n          case \"marginRight\":\n        \n          case \"marginTop\":\n        \n          case \"padding\":\n        \n          case \"paddingBottom\":\n        \n          case \"paddingLeft\":\n        \n          case \"paddingRight\":\n        \n          case \"paddingTop\":\n        \n          case \"bottom\":\n        \n          case \"left\":\n        \n          case \"right\":\n        \n          case \"top\":\n        \n          case \"scrollTop\":\n        \n          case \"scrollLeft\":\n            ha = parseInt(ha, 10);\n            break;\n          case \"rotateX\":\n        \n          case \"rotateY\":\n        \n          case \"rotateZ\":\n            ha = ((parseInt(ha, 10) * Math.PI) / 180);\n            break;\n          case \"translateX\":\n        \n          case \"translateY\":\n        \n          case \"translateZ\":\n        \n          case \"scaleX\":\n        \n          case \"scaleY\":\n        \n          case \"scaleZ\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"rotate3d\":\n            this._attr(\"rotateX\", ha[0], ia);\n            this._attr(\"rotateY\", ha[1], ia);\n            this._attr(\"rotateZ\", ha[2], ia);\n            return this;\n          case \"rotate\":\n            this._attr(\"rotateZ\", ha, ia);\n            return this;\n          case \"scale3d\":\n            this._attr(\"scaleZ\", ha[2], ia);\n          case \"scale\":\n            this._attr(\"scaleX\", ha[0], ia);\n            this._attr(\"scaleY\", ha[1], ia);\n            return this;\n          case \"translate3d\":\n            this._attr(\"translateZ\", ha[2], ia);\n          case \"translate\":\n            this._attr(\"translateX\", ha[0], ia);\n            this._attr(\"translateY\", ha[1], ia);\n            return this;\n          default:\n            throw new Error((ga + \" is not a supported attribute!\"));\n        };\n        if ((this.state.attrs[ga] === undefined)) {\n            this.state.attrs[ga] = {\n            };\n        };\n        if (ja) {\n            this.state.attrs[ga].auto = true;\n        };\n        switch (ia) {\n          case y:\n            this.state.attrs[ga].start = ha;\n            break;\n          case x:\n            this.state.attrs[ga].by = true;\n          case w:\n            this.state.attrs[ga].value = ha;\n            break;\n        };\n    };\n    function z(ga) {\n        var ha = parseInt(k.get(ga, \"paddingLeft\"), 10), ia = parseInt(k.get(ga, \"paddingRight\"), 10), ja = parseInt(k.get(ga, \"borderLeftWidth\"), 10), ka = parseInt(k.get(ga, \"borderRightWidth\"), 10);\n        return ((((ga.offsetWidth - ((ha ? ha : 0))) - ((ia ? ia : 0))) - ((ja ? ja : 0))) - ((ka ? ka : 0)));\n    };\n    function aa(ga) {\n        var ha = parseInt(k.get(ga, \"paddingTop\"), 10), ia = parseInt(k.get(ga, \"paddingBottom\"), 10), ja = parseInt(k.get(ga, \"borderTopWidth\"), 10), ka = parseInt(k.get(ga, \"borderBottomWidth\"), 10);\n        return ((((ga.offsetHeight - ((ha ? ha : 0))) - ((ia ? ia : 0))) - ((ja ? ja : 0))) - ((ka ? ka : 0)));\n    };\n    p.prototype.to = function(ga, ha) {\n        if ((ha === undefined)) {\n            this._attr(this.last_attr, ga, w);\n        }\n         else {\n            this._attr(ga, ha, w);\n            this.last_attr = ga;\n        }\n    ;\n        return this;\n    };\n    p.prototype.by = function(ga, ha) {\n        if ((ha === undefined)) {\n            this._attr(this.last_attr, ga, x);\n        }\n         else {\n            this._attr(ga, ha, x);\n            this.last_attr = ga;\n        }\n    ;\n        return this;\n    };\n    p.prototype.from = function(ga, ha) {\n        if ((ha === undefined)) {\n            this._attr(this.last_attr, ga, y);\n        }\n         else {\n            this._attr(ga, ha, y);\n            this.last_attr = ga;\n        }\n    ;\n        return this;\n    };\n    p.prototype.duration = function(ga) {\n        this.state.duration = (ga ? ga : 0);\n        return this;\n    };\n    p.prototype.checkpoint = function(ga, ha) {\n        if ((ga === undefined)) {\n            ga = 1;\n        };\n        this.state.checkpoint = ga;\n        this.queue.push(this.state);\n        this._reset_state();\n        this.state.checkpointcb = ha;\n        return this;\n    };\n    p.prototype.blind = function() {\n        this.state.blind = true;\n        return this;\n    };\n    p.prototype.hide = function() {\n        this.state.hide = true;\n        return this;\n    };\n    p.prototype.show = function() {\n        this.state.show = true;\n        return this;\n    };\n    p.prototype.ease = function(ga) {\n        this.state.ease = ga;\n        return this;\n    };\n    p.prototype.go = function() {\n        var ga = Date.now();\n        this.queue.push(this.state);\n        for (var ha = 0; (ha < this.queue.length); ha++) {\n            this.queue[ha].start = (ga - v);\n            if (this.queue[ha].checkpoint) {\n                ga += (this.queue[ha].checkpoint * this.queue[ha].duration);\n            };\n        };\n        da(this);\n        return this;\n    };\n    p.prototype._show = function() {\n        h.show(this.obj);\n    };\n    p.prototype._hide = function() {\n        h.hide(this.obj);\n    };\n    p.prototype._frame = function(ga) {\n        var ha = true, ia = false, ja;\n        function ka(db) {\n            return (document.documentElement[db] || document.body[db]);\n        };\n        for (var la = 0; (la < this.queue.length); la++) {\n            var ma = this.queue[la];\n            if ((ma.start > ga)) {\n                ha = false;\n                continue;\n            }\n        ;\n            if (ma.checkpointcb) {\n                this._callback(ma.checkpointcb, (ga - ma.start));\n                ma.checkpointcb = null;\n            }\n        ;\n            if ((ma.started === undefined)) {\n                if (ma.show) {\n                    this._show();\n                };\n                for (var na in ma.attrs) {\n                    if ((ma.attrs[na].start !== undefined)) {\n                        continue;\n                    };\n                    switch (na) {\n                      case \"backgroundColor\":\n                    \n                      case \"borderColor\":\n                    \n                      case \"color\":\n                        ja = ca(k.get(this.obj, ((na == \"borderColor\") ? \"borderLeftColor\" : na)));\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value[0] = Math.min(255, Math.max(0, (ma.attrs[na].value[0] + ja[0])));\n                            ma.attrs[na].value[1] = Math.min(255, Math.max(0, (ma.attrs[na].value[1] + ja[1])));\n                            ma.attrs[na].value[2] = Math.min(255, Math.max(0, (ma.attrs[na].value[2] + ja[2])));\n                        }\n                    ;\n                        break;\n                      case \"opacity\":\n                        ja = k.getOpacity(this.obj);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value = Math.min(1, Math.max(0, (ma.attrs[na].value + ja)));\n                        };\n                        break;\n                      case \"height\":\n                        ja = aa(this.obj);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      case \"width\":\n                        ja = z(this.obj);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      case \"scrollLeft\":\n                    \n                      case \"scrollTop\":\n                        ja = (((this.obj === document.body)) ? ka(na) : this.obj[na]);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        ma[(\"last\" + na)] = ja;\n                        break;\n                      case \"rotateX\":\n                    \n                      case \"rotateY\":\n                    \n                      case \"rotateZ\":\n                    \n                      case \"translateX\":\n                    \n                      case \"translateY\":\n                    \n                      case \"translateZ\":\n                        ja = i.get(this.obj, na, 0);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      case \"scaleX\":\n                    \n                      case \"scaleY\":\n                    \n                      case \"scaleZ\":\n                        ja = i.get(this.obj, na, 1);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      default:\n                        ja = (parseInt(k.get(this.obj, na), 10) || 0);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                    };\n                    ma.attrs[na].start = ja;\n                };\n                if ((((ma.attrs.height && ma.attrs.height.auto)) || ((ma.attrs.width && ma.attrs.width.auto)))) {\n                    this._destroy_container();\n                    for (var na in {\n                        height: 1,\n                        width: 1,\n                        fontSize: 1,\n                        borderLeftWidth: 1,\n                        borderRightWidth: 1,\n                        borderTopWidth: 1,\n                        borderBottomWidth: 1,\n                        paddingLeft: 1,\n                        paddingRight: 1,\n                        paddingTop: 1,\n                        paddingBottom: 1\n                    }) {\n                        if (ma.attrs[na]) {\n                            this.obj.style[na] = (ma.attrs[na].value + (((typeof ma.attrs[na].value == \"number\") ? \"px\" : \"\")));\n                        };\n                    };\n                    if ((ma.attrs.height && ma.attrs.height.auto)) {\n                        ma.attrs.height.value = aa(this.obj);\n                    };\n                    if ((ma.attrs.width && ma.attrs.width.auto)) {\n                        ma.attrs.width.value = z(this.obj);\n                    };\n                }\n            ;\n                ma.started = true;\n                if (ma.blind) {\n                    this._build_container();\n                };\n            }\n        ;\n            var oa = (((ga - ma.start)) / ma.duration);\n            if ((oa >= 1)) {\n                oa = 1;\n                if (ma.hide) {\n                    this._hide();\n                };\n            }\n             else ha = false;\n        ;\n            var pa = (ma.ease ? ma.ease(oa) : oa);\n            if (((!ia && (oa != 1)) && ma.blind)) {\n                ia = true;\n            };\n            for (var na in ma.attrs) {\n                switch (na) {\n                  case \"backgroundColor\":\n                \n                  case \"borderColor\":\n                \n                  case \"color\":\n                    if ((ma.attrs[na].start[3] != ma.attrs[na].value[3])) {\n                        this.obj.style[na] = ((((((((\"rgba(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true)) + \",\") + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true)) + \",\") + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true)) + \",\") + ba(pa, ma.attrs[na].start[3], ma.attrs[na].value[3], false)) + \")\");\n                    }\n                     else this.obj.style[na] = ((((((\"rgb(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true)) + \",\") + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true)) + \",\") + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true)) + \")\");\n                ;\n                    break;\n                  case \"opacity\":\n                    k.set(this.obj, \"opacity\", ba(pa, ma.attrs[na].start, ma.attrs[na].value));\n                    break;\n                  case \"height\":\n                \n                  case \"width\":\n                    this.obj.style[na] = (((pa == 1) && ma.attrs[na].auto) ? \"auto\" : (ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"));\n                    break;\n                  case \"scrollLeft\":\n                \n                  case \"scrollTop\":\n                    var qa = (this.obj === document.body);\n                    ja = (qa ? ka(na) : this.obj[na]);\n                    if ((ma[(\"last\" + na)] !== ja)) {\n                        delete ma.attrs[na];\n                    }\n                     else {\n                        var ra = ba(pa, ma.attrs[na].start, ma.attrs[na].value, true);\n                        if (!qa) {\n                            ra = this.obj[na] = ra;\n                        }\n                         else {\n                            if ((na == \"scrollLeft\")) {\n                                a.scrollTo(ra, ka(\"scrollTop\"));\n                            }\n                             else a.scrollTo(ka(\"scrollLeft\"), ra);\n                        ;\n                            ra = ka(na);\n                        }\n                    ;\n                        ma[(\"last\" + na)] = ra;\n                    }\n                ;\n                    break;\n                  case \"translateX\":\n                \n                  case \"translateY\":\n                \n                  case \"translateZ\":\n                \n                  case \"rotateX\":\n                \n                  case \"rotateY\":\n                \n                  case \"rotateZ\":\n                \n                  case \"scaleX\":\n                \n                  case \"scaleY\":\n                \n                  case \"scaleZ\":\n                    i.set(this.obj, na, ba(pa, ma.attrs[na].start, ma.attrs[na].value, false));\n                    break;\n                  default:\n                    this.obj.style[na] = (ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\");\n                    break;\n                };\n            };\n            var sa = null, ta = i.get(this.obj, \"translateX\", 0), ua = i.get(this.obj, \"translateY\", 0), va = i.get(this.obj, \"translateZ\", 0);\n            if (((ta || ua) || va)) {\n                sa = u(sa, [1,0,0,0,0,1,0,0,0,0,1,0,ta,ua,va,1,]);\n            };\n            var wa = i.get(this.obj, \"scaleX\", 1), xa = i.get(this.obj, \"scaleY\", 1), ya = i.get(this.obj, \"scaleZ\", 1);\n            if ((((wa - 1) || (xa - 1)) || (ya - 1))) {\n                sa = u(sa, [wa,0,0,0,0,xa,0,0,0,0,ya,0,0,0,0,1,]);\n            };\n            var za = i.get(this.obj, \"rotateX\", 0);\n            if (za) {\n                sa = u(sa, [1,0,0,0,0,Math.cos(za),Math.sin(-za),0,0,Math.sin(za),Math.cos(za),0,0,0,0,1,]);\n            };\n            var ab = i.get(this.obj, \"rotateY\", 0);\n            if (ab) {\n                sa = u(sa, [Math.cos(ab),0,Math.sin(ab),0,0,1,0,0,Math.sin(-ab),0,Math.cos(ab),0,0,0,0,1,]);\n            };\n            var bb = i.get(this.obj, \"rotateZ\", 0);\n            if (bb) {\n                sa = u(sa, [Math.cos(bb),Math.sin(-bb),0,0,Math.sin(bb),Math.cos(bb),0,0,0,0,1,0,0,0,0,1,]);\n            };\n            if (sa) {\n                var cb = q(sa);\n                k.apply(this.obj, {\n                    \"-webkit-transform\": cb,\n                    \"-moz-transform\": cb,\n                    \"-ms-transform\": cb,\n                    \"-o-transform\": cb,\n                    transform: cb\n                });\n            }\n             else if (ha) {\n                k.apply(this.obj, {\n                    \"-webkit-transform\": null,\n                    \"-moz-transform\": null,\n                    \"-ms-transform\": null,\n                    \"-o-transform\": null,\n                    transform: null\n                });\n            }\n        ;\n            if ((oa == 1)) {\n                this.queue.splice(la--, 1);\n                this._callback(ma.ondone, ((ga - ma.start) - ma.duration));\n            }\n        ;\n        };\n        if ((!ia && this.container_div)) {\n            this._destroy_container();\n        };\n        return !ha;\n    };\n    p.prototype.ondone = function(ga) {\n        this.state.ondone = ga;\n        return this;\n    };\n    p.prototype._callback = function(ga, ha) {\n        if (ga) {\n            v = ha;\n            ga.call(this);\n            v = 0;\n        }\n    ;\n    };\n    function ba(ga, ha, ia, ja) {\n        return ((ja ? parseInt : parseFloat))(((((ia - ha)) * ga) + ha), 10);\n    };\n    function ca(ga) {\n        var ha = /^#([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i.exec(ga);\n        if (ha) {\n            return [parseInt(((ha[1].length == 1) ? (ha[1] + ha[1]) : ha[1]), 16),parseInt(((ha[2].length == 1) ? (ha[2] + ha[2]) : ha[2]), 16),parseInt(((ha[3].length == 1) ? (ha[3] + ha[3]) : ha[3]), 16),1,];\n        }\n         else {\n            var ia = /^rgba? *\\(([0-9]+), *([0-9]+), *([0-9]+)(?:, *([0-9\\.]+))?\\)$/.exec(ga);\n            if (ia) {\n                return [parseInt(ia[1], 10),parseInt(ia[2], 10),parseInt(ia[3], 10),(ia[4] ? parseFloat(ia[4]) : 1),];\n            }\n             else if ((ga == \"transparent\")) {\n                return [255,255,255,0,];\n            }\n             else throw \"Named color attributes are not supported.\"\n            \n        ;\n        }\n    ;\n    };\n    function da(ga) {\n        n.push(ga);\n        if ((n.length === 1)) {\n            if (!m) {\n                var ha = ((a.requestAnimationFrame || a.webkitRequestAnimationFrame) || a.mozRequestAnimationFrame);\n                if (ha) {\n                    m = ha.bind(a);\n                };\n            }\n        ;\n            if (m) {\n                m(fa);\n            }\n             else o = setInterval(fa, 20, false);\n        ;\n        }\n    ;\n        if (m) {\n            ea();\n        };\n        fa(Date.now(), true);\n    };\n    function ea() {\n        if (!m) {\n            throw new Error(\"Ending timer only valid with requestAnimationFrame\")\n        };\n        var ga = 0;\n        for (var ha = 0; (ha < n.length); ha++) {\n            var ia = n[ha];\n            for (var ja = 0; (ja < ia.queue.length); ja++) {\n                var ka = (ia.queue[ja].start + ia.queue[ja].duration);\n                if ((ka > ga)) {\n                    ga = ka;\n                };\n            };\n        };\n        if (o) {\n            clearTimeout(o);\n            o = null;\n        }\n    ;\n        var la = Date.now();\n        if ((ga > la)) {\n            o = setTimeout(l(fa), (ga - la), false);\n        };\n    };\n    function fa(ga, ha) {\n        var ia = Date.now();\n        for (var ja = (((ha === true)) ? (n.length - 1) : 0); (ja < n.length); ja++) {\n            try {\n                if (!n[ja]._frame(ia)) {\n                    n.splice(ja--, 1);\n                };\n            } catch (ka) {\n                n.splice(ja--, 1);\n            };\n        };\n        if ((n.length === 0)) {\n            if (o) {\n                if (m) {\n                    clearTimeout(o);\n                }\n                 else clearInterval(o);\n            ;\n                o = null;\n            }\n        ;\n        }\n         else if (m) {\n            m(fa);\n        }\n    ;\n    };\n    p.ease = {\n    };\n    p.ease.begin = function(ga) {\n        return (Math.sin(((Math.PI / 2) * ((ga - 1)))) + 1);\n    };\n    p.ease.end = function(ga) {\n        return Math.sin(((81098 * Math.PI) * ga));\n    };\n    p.ease.both = function(ga) {\n        return ((81147 * Math.sin((Math.PI * ((ga - 81171))))) + 81176);\n    };\n    p.prependInsert = function(ga, ha) {\n        p.insert(ga, ha, j.prependContent);\n    };\n    p.appendInsert = function(ga, ha) {\n        p.insert(ga, ha, j.appendContent);\n    };\n    p.insert = function(ga, ha, ia) {\n        k.set(ha, \"opacity\", 0);\n        ia(ga, ha);\n        new p(ha).from(\"opacity\", 0).to(\"opacity\", 1).duration(400).go();\n    };\n    e.exports = p;\n});\n__d(\"BootloadedReact\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = function(j) {\n        g.loadModules([\"React\",], j);\n    }, i = {\n        isValidComponent: function(j) {\n            return (((j && (typeof j.mountComponentIntoNode === \"function\")) && (typeof j.receiveProps === \"function\")));\n        },\n        initializeTouchEvents: function(j, k) {\n            h(function(l) {\n                l.initializeTouchEvents(j);\n                (k && k());\n            });\n        },\n        createClass: function(j, k) {\n            h(function(l) {\n                var m = l.createClass(j);\n                (k && k(m));\n            });\n        },\n        renderComponent: function(j, k, l) {\n            h(function(m) {\n                var n = m.renderComponent(j, k);\n                (l && l(n));\n            });\n        },\n        unmountAndReleaseReactRootNode: function(j, k) {\n            h(function(l) {\n                l.unmountAndReleaseReactRootNode(j);\n                (k && k());\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ContextualThing\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        register: function(j, k) {\n            j.setAttribute(\"data-ownerid\", g.getID(k));\n        },\n        containsIncludingLayers: function(j, k) {\n            while (k) {\n                if (g.contains(j, k)) {\n                    return true\n                };\n                k = i.getContext(k);\n            };\n            return false;\n        },\n        getContext: function(j) {\n            var k;\n            while (j) {\n                if ((j.getAttribute && (k = j.getAttribute(\"data-ownerid\")))) {\n                    return h(k)\n                };\n                j = j.parentNode;\n            };\n            return null;\n        }\n    };\n    e.exports = i;\n});\n__d(\"DOMControl\", [\"DataStore\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.root = h(k);\n        this.updating = false;\n        g.set(k, \"DOMControl\", this);\n    };\n    i(j.prototype, {\n        getRoot: function() {\n            return this.root;\n        },\n        beginUpdate: function() {\n            if (this.updating) {\n                return false\n            };\n            this.updating = true;\n            return true;\n        },\n        endUpdate: function() {\n            this.updating = false;\n        },\n        update: function(k) {\n            if (!this.beginUpdate()) {\n                return this\n            };\n            this.onupdate(k);\n            this.endUpdate();\n        },\n        onupdate: function(k) {\n        \n        }\n    });\n    j.getInstance = function(k) {\n        return g.get(k, \"DOMControl\");\n    };\n    e.exports = j;\n});\n__d(\"DOMDimensions\", [\"DOMQuery\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Style\"), i = {\n        getElementDimensions: function(j) {\n            return {\n                width: (j.offsetWidth || 0),\n                height: (j.offsetHeight || 0)\n            };\n        },\n        getViewportDimensions: function() {\n            var j = (((((window && window.innerWidth)) || (((document && document.documentElement) && document.documentElement.clientWidth))) || (((document && document.body) && document.body.clientWidth))) || 0), k = (((((window && window.innerHeight)) || (((document && document.documentElement) && document.documentElement.clientHeight))) || (((document && document.body) && document.body.clientHeight))) || 0);\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getViewportWithoutScrollbarDimensions: function() {\n            var j = (((((document && document.documentElement) && document.documentElement.clientWidth)) || (((document && document.body) && document.body.clientWidth))) || 0), k = (((((document && document.documentElement) && document.documentElement.clientHeight)) || (((document && document.body) && document.body.clientHeight))) || 0);\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getDocumentDimensions: function(j) {\n            j = (j || document);\n            var k = g.getDocumentScrollElement(j), l = (k.scrollWidth || 0), m = (k.scrollHeight || 0);\n            return {\n                width: l,\n                height: m\n            };\n        },\n        measureElementBox: function(j, k, l, m, n) {\n            var o;\n            switch (k) {\n              case \"left\":\n            \n              case \"right\":\n            \n              case \"top\":\n            \n              case \"bottom\":\n                o = [k,];\n                break;\n              case \"width\":\n                o = [\"left\",\"right\",];\n                break;\n              case \"height\":\n                o = [\"top\",\"bottom\",];\n                break;\n              default:\n                throw Error((\"Invalid plane: \" + k));\n            };\n            var p = function(q, r) {\n                var s = 0;\n                for (var t = 0; (t < o.length); t++) {\n                    s += (parseInt(h.get(j, (((q + \"-\") + o[t]) + r)), 10) || 0);;\n                };\n                return s;\n            };\n            return ((((l ? p(\"padding\", \"\") : 0)) + ((m ? p(\"border\", \"-width\") : 0))) + ((n ? p(\"margin\", \"\") : 0)));\n        }\n    };\n    e.exports = i;\n});\n__d(\"wrapFunction\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(i, j, k) {\n        j = (j || \"default\");\n        return function() {\n            var l = ((j in g) ? g[j](i, k) : i);\n            return l.apply(this, arguments);\n        };\n    };\n    h.setWrapper = function(i, j) {\n        j = (j || \"default\");\n        g[j] = i;\n    };\n    e.exports = h;\n});\n__d(\"DOMEventListener\", [\"wrapFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"wrapFunction\"), h, i;\n    if (window.addEventListener) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((k + \":\") + l));\n            k.addEventListener(l, m.wrapper, false);\n        };\n        i = function(k, l, m) {\n            k.removeEventListener(l, m.wrapper, false);\n        };\n    }\n     else if (window.attachEvent) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((k + \":\") + l));\n            k.attachEvent((\"on\" + l), m.wrapper);\n        };\n        i = function(k, l, m) {\n            k.detachEvent((\"on\" + l), m.wrapper);\n        };\n    }\n    \n;\n    var j = {\n        add: function(k, l, m) {\n            h(k, l, m);\n            return {\n                remove: function() {\n                    i(k, l, m);\n                    k = null;\n                }\n            };\n        },\n        remove: i\n    };\n    e.exports = j;\n});\n__d(\"DOMPosition\", [\"DOMDimensions\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = {\n        getScrollPosition: function() {\n            var j = h.getDocumentScrollElement();\n            return {\n                x: j.scrollLeft,\n                y: j.scrollTop\n            };\n        },\n        getNormalizedScrollPosition: function() {\n            var j = i.getScrollPosition(), k = g.getDocumentDimensions(), l = g.getViewportDimensions(), m = (k.height - l.height), n = (k.width - l.width);\n            return {\n                y: Math.max(0, Math.min(j.y, m)),\n                x: Math.max(0, Math.min(j.x, n))\n            };\n        },\n        getElementPosition: function(j) {\n            if (!j) {\n                return\n            };\n            var k = document.documentElement;\n            if ((!((\"getBoundingClientRect\" in j)) || !h.contains(k, j))) {\n                return {\n                    x: 0,\n                    y: 0\n                }\n            };\n            var l = j.getBoundingClientRect(), m = (Math.round(l.left) - k.clientLeft), n = (Math.round(l.top) - k.clientTop);\n            return {\n                x: m,\n                y: n\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"isInIframe\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return (window != window.top);\n    };\n    e.exports = g;\n});\n__d(\"DimensionTracking\", [\"Cookie\",\"DOMDimensions\",\"Event\",\"debounce\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"DOMDimensions\"), i = b(\"Event\"), j = b(\"debounce\"), k = b(\"isInIframe\");\n    function l() {\n        var m = h.getViewportDimensions();\n        g.set(\"wd\", ((m.width + \"x\") + m.height));\n    };\n    if (!k()) {\n        l.defer(100);\n        i.listen(window, \"resize\", j(l, 250));\n        i.listen(window, \"focus\", l);\n    }\n;\n});\n__d(\"Focus\", [\"CSS\",\"DOM\",\"Event\",\"Run\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"Run\"), k = b(\"cx\"), l = b(\"ge\"), m = {\n    }, n, o = {\n        set: function(s) {\n            try {\n                s.tabIndex = s.tabIndex;\n                s.focus();\n            } catch (t) {\n            \n            };\n        },\n        setWithoutOutline: function(s) {\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            var t = i.listen(s, \"blur\", function() {\n                g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n                t.remove();\n            });\n            o.set(s);\n        },\n        relocate: function(s, t) {\n            p();\n            var u = h.getID(s);\n            m[u] = t;\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            j.onLeave(r.curry(u));\n        },\n        reset: function(s) {\n            var t = h.getID(s);\n            g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            if (m[t]) {\n                g.removeClass(m[t], \"-cx-PRIVATE-focus__nativeoutline\");\n                delete m[t];\n            }\n        ;\n        }\n    };\n    function p() {\n        if (n) {\n            return\n        };\n        i.listen(document.documentElement, \"focusout\", q);\n        i.listen(document.documentElement, \"focusin\", q);\n        n = true;\n    };\n    function q(event) {\n        var s = event.getTarget();\n        if (!g.hasClass(s, \"-cx-PRIVATE-focus__nooutline\")) {\n            return\n        };\n        if (m[s.id]) {\n            g.conditionClass(m[s.id], \"-cx-PRIVATE-focus__nativeoutline\", ((event.type === \"focusin\") || (event.type === \"focus\")));\n        };\n    };\n    function r(s) {\n        if ((m[s] && !l(s))) {\n            delete m[s];\n        };\n    };\n    e.exports = o;\n});\n__d(\"HighContrastMode\", [\"AsyncSignal\",\"Cookie\",\"CSS\",\"DOM\",\"Env\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Env\"), l = b(\"Style\"), m = null, n = {\n        init: function(o) {\n            if (((m !== null) && (o.currentState != m))) {\n                return\n            };\n            var p = j.create(\"div\");\n            j.appendContent(document.body, p);\n            p.style.cssText = (((((((\"border: 1px solid;\" + \"border-color: red green;\") + \"position: fixed;\") + \"height: 5px;\") + \"top: -999px;\") + \"background-image: url(\") + o.spacerImage) + \");\");\n            var q = l.get(p, \"background-image\"), r = l.get(p, \"border-top-color\"), s = l.get(p, \"border-right-color\"), t = ((r == s) || ((q && (((q == \"none\") || (q == \"url(invalid-url:)\"))))));\n            if ((t != o.currentState)) {\n                i.conditionClass(document.documentElement, \"highContrast\", t);\n                if (k.user) {\n                    h.set(\"highContrastMode\", (t ? 1 : 0));\n                    if (t) {\n                        new g(\"/ajax/highcontrast\").send();\n                    };\n                }\n            ;\n            }\n        ;\n            j.remove(p);\n            m = t;\n        }\n    };\n    e.exports = n;\n});\n__d(\"Input\", [\"CSS\",\"DOMQuery\",\"DOMControl\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOMQuery\"), i = b(\"DOMControl\"), j = function(l) {\n        var m = l.getAttribute(\"maxlength\");\n        if ((m && (m > 0))) {\n            d([\"enforceMaxLength\",], function(n) {\n                n(l, m);\n            });\n        };\n    }, k = {\n        isEmpty: function(l) {\n            return (!(/\\S/).test((l.value || \"\")) || g.hasClass(l, \"DOMControl_placeholder\"));\n        },\n        getValue: function(l) {\n            return (k.isEmpty(l) ? \"\" : l.value);\n        },\n        setValue: function(l, m) {\n            g.removeClass(l, \"DOMControl_placeholder\");\n            l.value = (m || \"\");\n            j(l);\n            var n = i.getInstance(l);\n            ((n && n.resetHeight) && n.resetHeight());\n        },\n        setPlaceholder: function(l, m) {\n            l.setAttribute(\"aria-label\", m);\n            l.setAttribute(\"placeholder\", m);\n            if ((l == document.activeElement)) {\n                return\n            };\n            if (k.isEmpty(l)) {\n                g.conditionClass(l, \"DOMControl_placeholder\", m);\n                l.value = (m || \"\");\n            }\n        ;\n        },\n        reset: function(l) {\n            var m = ((l !== document.activeElement) ? ((l.getAttribute(\"placeholder\") || \"\")) : \"\");\n            l.value = m;\n            g.conditionClass(l, \"DOMControl_placeholder\", m);\n            l.style.height = \"\";\n        },\n        setSubmitOnEnter: function(l, m) {\n            g.conditionClass(l, \"enter_submit\", m);\n        },\n        getSubmitOnEnter: function(l) {\n            return g.hasClass(l, \"enter_submit\");\n        },\n        setMaxLength: function(l, m) {\n            if ((m > 0)) {\n                l.setAttribute(\"maxlength\", m);\n                j(l);\n            }\n             else l.removeAttribute(\"maxlength\");\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"KeyEventController\", [\"DOM\",\"Event\",\"Run\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = b(\"isEmpty\");\n    function l() {\n        this.handlers = {\n        };\n        document.onkeyup = this.onkeyevent.bind(this, \"onkeyup\");\n        document.onkeydown = this.onkeyevent.bind(this, \"onkeydown\");\n        document.onkeypress = this.onkeyevent.bind(this, \"onkeypress\");\n    };\n    j(l, {\n        instance: null,\n        getInstance: function() {\n            return (l.instance || (l.instance = new l()));\n        },\n        defaultFilter: function(event, m) {\n            event = h.$E(event);\n            return ((l.filterEventTypes(event, m) && l.filterEventTargets(event, m)) && l.filterEventModifiers(event, m));\n        },\n        filterEventTypes: function(event, m) {\n            if ((m === \"onkeydown\")) {\n                return true\n            };\n            return false;\n        },\n        filterEventTargets: function(event, m) {\n            var n = event.getTarget(), o = (n.contentEditable === \"true\");\n            return (((!((o || g.isNodeOfType(n, l._interactiveElements))) || (n.type in l._uninterestingTypes)) || (((event.keyCode in l._controlKeys) && ((((g.isNodeOfType(n, [\"input\",\"textarea\",]) && (n.value.length === 0))) || ((o && (g.getText(n).length === 0)))))))));\n        },\n        filterEventModifiers: function(event, m) {\n            if ((((event.ctrlKey || event.altKey) || event.metaKey) || event.repeat)) {\n                return false\n            };\n            return true;\n        },\n        registerKey: function(m, n, o, p) {\n            if ((o === undefined)) {\n                o = l.defaultFilter;\n            };\n            var q = l.getInstance(), r = q.mapKey(m);\n            if (k(q.handlers)) {\n                i.onLeave(q.resetHandlers.bind(q));\n            };\n            var s = {\n            };\n            for (var t = 0; (t < r.length); t++) {\n                m = r[t];\n                if ((!q.handlers[m] || p)) {\n                    q.handlers[m] = [];\n                };\n                var u = {\n                    callback: n,\n                    filter: o\n                };\n                s[m] = u;\n                q.handlers[m].push(u);\n            };\n            return {\n                remove: function() {\n                    for (var v in s) {\n                        if ((q.handlers[v] && q.handlers[v].length)) {\n                            var w = q.handlers[v].indexOf(s[v]);\n                            ((w >= 0) && q.handlers[v].splice(w, 1));\n                        }\n                    ;\n                        delete s[v];\n                    };\n                }\n            };\n        },\n        keyCodeMap: {\n            BACKSPACE: [8,],\n            TAB: [9,],\n            RETURN: [13,],\n            ESCAPE: [27,],\n            LEFT: [37,63234,],\n            UP: [38,63232,],\n            RIGHT: [39,63235,],\n            DOWN: [40,63233,],\n            DELETE: [46,],\n            COMMA: [188,],\n            PERIOD: [190,],\n            SLASH: [191,],\n            \"`\": [192,],\n            \"[\": [219,],\n            \"]\": [221,]\n        },\n        _interactiveElements: [\"input\",\"select\",\"textarea\",\"object\",\"embed\",],\n        _uninterestingTypes: {\n            button: 1,\n            checkbox: 1,\n            radio: 1,\n            submit: 1\n        },\n        _controlKeys: {\n            8: 1,\n            9: 1,\n            13: 1,\n            27: 1,\n            37: 1,\n            63234: 1,\n            38: 1,\n            63232: 1,\n            39: 1,\n            63235: 1,\n            40: 1,\n            63233: 1,\n            46: 1\n        }\n    });\n    j(l.prototype, {\n        mapKey: function(m) {\n            if (((m >= 0) && (m <= 9))) {\n                if ((typeof (m) != \"number\")) {\n                    m = (m.charCodeAt(0) - 48);\n                };\n                return [(48 + m),(96 + m),];\n            }\n        ;\n            var n = l.keyCodeMap[m.toUpperCase()];\n            if (n) {\n                return n\n            };\n            return [m.toUpperCase().charCodeAt(0),];\n        },\n        onkeyevent: function(m, n) {\n            n = h.$E(n);\n            var o = (this.handlers[n.keyCode] || this.handlers[n.which]), p, q, r;\n            if (o) {\n                for (var s = 0; (s < o.length); s++) {\n                    p = o[s].callback;\n                    q = o[s].filter;\n                    try {\n                        if ((!q || q(n, m))) {\n                            r = p(n, m);\n                            if ((r === false)) {\n                                return h.kill(n)\n                            };\n                        }\n                    ;\n                    } catch (t) {\n                    \n                    };\n                }\n            };\n            return true;\n        },\n        resetHandlers: function() {\n            this.handlers = {\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"KeyStatus\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = null, i = null;\n    function j() {\n        if (!i) {\n            i = g.listen(window, \"blur\", function() {\n                h = null;\n                k();\n            });\n        };\n    };\n    function k() {\n        if (i) {\n            i.remove();\n            i = null;\n        }\n    ;\n    };\n    g.listen(document.documentElement, \"keydown\", function(m) {\n        h = g.getKeyCode(m);\n        j();\n    }, g.Priority.URGENT);\n    g.listen(document.documentElement, \"keyup\", function(m) {\n        h = null;\n        k();\n    }, g.Priority.URGENT);\n    var l = {\n        isKeyDown: function() {\n            return !!h;\n        },\n        getKeyDownCode: function() {\n            return h;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BehaviorsMixin\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(l) {\n        this._behavior = l;\n        this._enabled = false;\n    };\n    g(h.prototype, {\n        enable: function() {\n            if (!this._enabled) {\n                this._enabled = true;\n                this._behavior.enable();\n            }\n        ;\n        },\n        disable: function() {\n            if (this._enabled) {\n                this._enabled = false;\n                this._behavior.disable();\n            }\n        ;\n        }\n    });\n    var i = 1;\n    function j(l) {\n        if (!l.__BEHAVIOR_ID) {\n            l.__BEHAVIOR_ID = i++;\n        };\n        return l.__BEHAVIOR_ID;\n    };\n    var k = {\n        enableBehavior: function(l) {\n            if (!this._behaviors) {\n                this._behaviors = {\n                };\n            };\n            var m = j(l);\n            if (!this._behaviors[m]) {\n                this._behaviors[m] = new h(new l(this));\n            };\n            this._behaviors[m].enable();\n            return this;\n        },\n        disableBehavior: function(l) {\n            if (this._behaviors) {\n                var m = j(l);\n                if (this._behaviors[m]) {\n                    this._behaviors[m].disable();\n                };\n            }\n        ;\n            return this;\n        },\n        enableBehaviors: function(l) {\n            l.forEach(this.enableBehavior.bind(this));\n            return this;\n        },\n        destroyBehaviors: function() {\n            if (this._behaviors) {\n                for (var l in this._behaviors) {\n                    this._behaviors[l].disable();;\n                };\n                this._behaviors = {\n                };\n            }\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"removeFromArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = h.indexOf(i);\n        ((j != -1) && h.splice(j, 1));\n    };\n    e.exports = g;\n});\n__d(\"Layer\", [\"Event\",\"function-extensions\",\"ArbiterMixin\",\"BehaviorsMixin\",\"BootloadedReact\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"KeyEventController\",\"Parent\",\"Style\",\"copyProperties\",\"ge\",\"removeFromArray\",\"KeyStatus\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"BootloadedReact\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"HTML\"), p = b(\"KeyEventController\"), q = b(\"Parent\"), r = b(\"Style\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"removeFromArray\");\n    b(\"KeyStatus\");\n    var v = [];\n    function w(x, y) {\n        this._config = (x || {\n        });\n        if (y) {\n            this._configure(this._config, y);\n            var z = (this._config.addedBehaviors || []);\n            this.enableBehaviors(this._getDefaultBehaviors().concat(z));\n        }\n    ;\n    };\n    s(w, h);\n    s(w, {\n        init: function(x, y) {\n            x.init(y);\n        },\n        initAndShow: function(x, y) {\n            x.init(y).show();\n        },\n        show: function(x) {\n            x.show();\n        },\n        getTopmostLayer: function() {\n            return v[(v.length - 1)];\n        }\n    });\n    s(w.prototype, h, i, {\n        _initialized: false,\n        _root: null,\n        _shown: false,\n        _hiding: false,\n        _causalElement: null,\n        _reactContainer: null,\n        init: function(x) {\n            this._configure(this._config, x);\n            var y = (this._config.addedBehaviors || []);\n            this.enableBehaviors(this._getDefaultBehaviors().concat(y));\n            this._initialized = true;\n            return this;\n        },\n        _configure: function(x, y) {\n            if (y) {\n                var z = n.isNode(y), aa = ((typeof y === \"string\") || o.isHTML(y));\n                this.containsReactComponent = j.isValidComponent(y);\n                if (aa) {\n                    y = o(y).getRootNode();\n                }\n                 else if (this.containsReactComponent) {\n                    var ba = document.createElement(\"div\");\n                    j.renderComponent(y, ba);\n                    y = this._reactContainer = ba;\n                }\n                \n            ;\n            }\n        ;\n            this._root = this._buildWrapper(x, y);\n            if (x.attributes) {\n                n.setAttributes(this._root, x.attributes);\n            };\n            if (x.classNames) {\n                x.classNames.forEach(l.addClass.curry(this._root));\n            };\n            l.addClass(this._root, \"uiLayer\");\n            if (x.causalElement) {\n                this._causalElement = t(x.causalElement);\n            };\n            if (x.permanent) {\n                this._permanent = x.permanent;\n            };\n            m.set(this._root, \"layer\", this);\n        },\n        _getDefaultBehaviors: function() {\n            return [];\n        },\n        getCausalElement: function() {\n            return this._causalElement;\n        },\n        setCausalElement: function(x) {\n            this._causalElement = x;\n            return this;\n        },\n        getInsertParent: function() {\n            return (this._insertParent || document.body);\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getContentRoot: function() {\n            return this._root;\n        },\n        _buildWrapper: function(x, y) {\n            return y;\n        },\n        setInsertParent: function(x) {\n            if (x) {\n                if ((this._shown && (x !== this.getInsertParent()))) {\n                    n.appendContent(x, this.getRoot());\n                    this.updatePosition();\n                }\n            ;\n                this._insertParent = x;\n            }\n        ;\n            return this;\n        },\n        show: function() {\n            if (this._shown) {\n                return this\n            };\n            var x = this.getRoot();\n            this.inform(\"beforeshow\");\n            r.set(x, \"visibility\", \"hidden\");\n            r.set(x, \"overflow\", \"hidden\");\n            l.show(x);\n            n.appendContent(this.getInsertParent(), x);\n            if ((this.updatePosition() !== false)) {\n                this._shown = true;\n                this.inform(\"show\");\n                w.inform(\"show\", this);\n                if (!this._permanent) {\n                    !function() {\n                        if (this._shown) {\n                            v.push(this);\n                        };\n                    }.bind(this).defer();\n                };\n            }\n             else l.hide(x);\n        ;\n            r.set(x, \"visibility\", \"\");\n            r.set(x, \"overflow\", \"\");\n            this.inform(\"aftershow\");\n            return this;\n        },\n        hide: function() {\n            if (((this._hiding || !this._shown) || (this.inform(\"beforehide\") === false))) {\n                return this\n            };\n            this._hiding = true;\n            if ((this.inform(\"starthide\") !== false)) {\n                this.finishHide();\n            };\n            return this;\n        },\n        conditionShow: function(x) {\n            return (x ? this.show() : this.hide());\n        },\n        finishHide: function() {\n            if (this._shown) {\n                if (!this._permanent) {\n                    u(v, this);\n                };\n                this._hiding = false;\n                this._shown = false;\n                l.hide(this.getRoot());\n                this.inform(\"hide\");\n                w.inform(\"hide\", this);\n            }\n        ;\n        },\n        isShown: function() {\n            return this._shown;\n        },\n        updatePosition: function() {\n            return true;\n        },\n        destroy: function() {\n            if (this.containsReactComponent) {\n                j.unmountAndReleaseReactRootNode(this._reactContainer);\n            };\n            this.finishHide();\n            var x = this.getRoot();\n            n.remove(x);\n            this.destroyBehaviors();\n            this.inform(\"destroy\");\n            w.inform(\"destroy\", this);\n            m.remove(x, \"layer\");\n            this._root = this._causalElement = null;\n        }\n    });\n    g.listen(document.documentElement, \"keydown\", function(event) {\n        if (p.filterEventTargets(event, \"keydown\")) {\n            for (var x = (v.length - 1); (x >= 0); x--) {\n                if ((v[x].inform(\"key\", event) === false)) {\n                    return false\n                };\n            }\n        };\n    }, g.Priority.URGENT);\n    g.listen(document.documentElement, \"click\", function(event) {\n        var x = v.length;\n        if (!x) {\n            return\n        };\n        var y = event.getTarget();\n        if (!n.contains(document.documentElement, y)) {\n            return\n        };\n        if (!y.offsetWidth) {\n            return\n        };\n        if (q.byClass(y, \"generic_dialog\")) {\n            return\n        };\n        while (x--) {\n            var z = v[x], aa = z.getContentRoot();\n            if (k.containsIncludingLayers(aa, y)) {\n                return\n            };\n            if (((z.inform(\"blur\") === false) || z.isShown())) {\n                return\n            };\n        };\n    });\n    e.exports = w;\n});\n__d(\"PopupWindow\", [\"DOMDimensions\",\"DOMQuery\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = b(\"Layer\"), j = b(\"copyProperties\"), k = {\n        _opts: {\n            allowShrink: true,\n            strategy: \"vector\",\n            timeout: 100,\n            widthElement: null\n        },\n        init: function(l) {\n            j(k._opts, l);\n            setInterval(k._resizeCheck, k._opts.timeout);\n        },\n        _resizeCheck: function() {\n            var l = g.getViewportDimensions(), m = k._getDocumentSize(), n = i.getTopmostLayer();\n            if (n) {\n                var o = n.getRoot().firstChild, p = g.getElementDimensions(o);\n                p.height += g.measureElementBox(o, \"height\", true, true, true);\n                p.width += g.measureElementBox(o, \"width\", true, true, true);\n                m.height = Math.max(m.height, p.height);\n                m.width = Math.max(m.width, p.width);\n            }\n        ;\n            var q = (m.height - l.height), r = (m.width - l.width);\n            if (((r < 0) && !k._opts.widthElement)) {\n                r = 0;\n            };\n            r = ((r > 1) ? r : 0);\n            if ((!k._opts.allowShrink && (q < 0))) {\n                q = 0;\n            };\n            if ((q || r)) {\n                try {\n                    (window.console && window.console.firebug);\n                    window.resizeBy(r, q);\n                    if (r) {\n                        window.moveBy((r / -2), 0);\n                    };\n                } catch (s) {\n                \n                }\n            };\n        },\n        _getDocumentSize: function() {\n            var l = g.getDocumentDimensions();\n            if ((k._opts.strategy === \"offsetHeight\")) {\n                l.height = document.body.offsetHeight;\n            };\n            if (k._opts.widthElement) {\n                var m = h.scry(document.body, k._opts.widthElement)[0];\n                if (m) {\n                    l.width = g.getElementDimensions(m).width;\n                };\n            }\n        ;\n            var n = a.Dialog;\n            if (((n && n.max_bottom) && (n.max_bottom > l.height))) {\n                l.height = n.max_bottom;\n            };\n            return l;\n        },\n        open: function(l, m, n) {\n            var o = ((typeof window.screenX != \"undefined\") ? window.screenX : window.screenLeft), p = ((typeof window.screenY != \"undefined\") ? window.screenY : window.screenTop), q = ((typeof window.outerWidth != \"undefined\") ? window.outerWidth : document.body.clientWidth), r = ((typeof window.outerHeight != \"undefined\") ? window.outerHeight : ((document.body.clientHeight - 22))), s = parseInt((o + ((((q - n)) / 2))), 10), t = parseInt((p + ((((r - m)) / 2.5))), 10), u = ((((((((\"width=\" + n) + \",height=\") + m) + \",left=\") + s) + \",top=\") + t));\n            return window.open(l, \"_blank\", u);\n        }\n    };\n    e.exports = k;\n});\n__d(\"TidyArbiterMixin\", [\"Arbiter\",\"ArbiterMixin\",\"Run\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = {\n    };\n    j(k, h, {\n        _getArbiterInstance: function() {\n            if (!this._arbiter) {\n                this._arbiter = new g();\n                i.onLeave(function() {\n                    delete this._arbiter;\n                }.bind(this));\n            }\n        ;\n            return this._arbiter;\n        }\n    });\n    e.exports = k;\n});\n__d(\"TidyArbiter\", [\"TidyArbiterMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TidyArbiterMixin\"), h = b(\"copyProperties\"), i = {\n    };\n    h(i, g);\n    e.exports = i;\n});\n__d(\"Vector\", [\"Event\",\"DOMDimensions\",\"DOMPosition\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOMDimensions\"), i = b(\"DOMPosition\"), j = b(\"copyProperties\");\n    function k(l, m, n) {\n        j(this, {\n            x: parseFloat(l),\n            y: parseFloat(m),\n            domain: (n || \"pure\")\n        });\n    };\n    j(k.prototype, {\n        toString: function() {\n            return ((((\"(\" + this.x) + \", \") + this.y) + \")\");\n        },\n        add: function(l, m) {\n            if ((arguments.length == 1)) {\n                if ((l.domain != \"pure\")) {\n                    l = l.convertTo(this.domain);\n                };\n                return this.add(l.x, l.y);\n            }\n        ;\n            var n = parseFloat(l), o = parseFloat(m);\n            return new k((this.x + n), (this.y + o), this.domain);\n        },\n        mul: function(l, m) {\n            if ((typeof m == \"undefined\")) {\n                m = l;\n            };\n            return new k((this.x * l), (this.y * m), this.domain);\n        },\n        sub: function(l, m) {\n            if ((arguments.length == 1)) {\n                return this.add(l.mul(-1));\n            }\n             else return this.add(-l, -m)\n        ;\n        },\n        distanceTo: function(l) {\n            return this.sub(l).magnitude();\n        },\n        magnitude: function() {\n            return Math.sqrt((((this.x * this.x)) + ((this.y * this.y))));\n        },\n        rotate: function(l) {\n            return new k(((this.x * Math.cos(l)) - (this.y * Math.sin(l))), ((this.x * Math.sin(l)) + (this.y * Math.cos(l))));\n        },\n        convertTo: function(l) {\n            if ((((l != \"pure\") && (l != \"viewport\")) && (l != \"document\"))) {\n                return new k(0, 0)\n            };\n            if ((l == this.domain)) {\n                return new k(this.x, this.y, this.domain)\n            };\n            if ((l == \"pure\")) {\n                return new k(this.x, this.y)\n            };\n            if ((this.domain == \"pure\")) {\n                return new k(0, 0)\n            };\n            var m = k.getScrollPosition(\"document\"), n = this.x, o = this.y;\n            if ((this.domain == \"document\")) {\n                n -= m.x;\n                o -= m.y;\n            }\n             else {\n                n += m.x;\n                o += m.y;\n            }\n        ;\n            return new k(n, o, l);\n        },\n        setElementPosition: function(l) {\n            var m = this.convertTo(\"document\");\n            l.style.left = (parseInt(m.x) + \"px\");\n            l.style.top = (parseInt(m.y) + \"px\");\n            return this;\n        },\n        setElementDimensions: function(l) {\n            return this.setElementWidth(l).setElementHeight(l);\n        },\n        setElementWidth: function(l) {\n            l.style.width = (parseInt(this.x, 10) + \"px\");\n            return this;\n        },\n        setElementHeight: function(l) {\n            l.style.height = (parseInt(this.y, 10) + \"px\");\n            return this;\n        },\n        scrollElementBy: function(l) {\n            if ((l == document.body)) {\n                window.scrollBy(this.x, this.y);\n            }\n             else {\n                l.scrollLeft += this.x;\n                l.scrollTop += this.y;\n            }\n        ;\n            return this;\n        }\n    });\n    j(k, {\n        getEventPosition: function(l, m) {\n            m = (m || \"document\");\n            var n = g.getPosition(l), o = new k(n.x, n.y, \"document\");\n            return o.convertTo(m);\n        },\n        getScrollPosition: function(l) {\n            l = (l || \"document\");\n            var m = i.getScrollPosition();\n            return new k(m.x, m.y, \"document\").convertTo(l);\n        },\n        getElementPosition: function(l, m) {\n            m = (m || \"document\");\n            var n = i.getElementPosition(l);\n            return new k(n.x, n.y, \"viewport\").convertTo(m);\n        },\n        getElementDimensions: function(l) {\n            var m = h.getElementDimensions(l);\n            return new k(m.width, m.height);\n        },\n        getViewportDimensions: function() {\n            var l = h.getViewportDimensions();\n            return new k(l.width, l.height, \"viewport\");\n        },\n        getDocumentDimensions: function(l) {\n            var m = h.getDocumentDimensions(l);\n            return new k(m.width, m.height, \"document\");\n        },\n        deserialize: function(l) {\n            var m = l.split(\",\");\n            return new k(m[0], m[1]);\n        }\n    });\n    e.exports = k;\n});\n__d(\"collectDataAttributes\", [\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"getContextualParent\");\n    function h(i, j) {\n        var k = {\n        }, l = {\n        }, m = j.length, n;\n        for (n = 0; (n < m); ++n) {\n            k[j[n]] = {\n            };\n            l[j[n]] = (\"data-\" + j[n]);\n        };\n        var o = {\n            tn: \"\",\n            \"tn-debug\": \",\"\n        };\n        while (i) {\n            if (i.getAttribute) {\n                for (n = 0; (n < m); ++n) {\n                    var p = i.getAttribute(l[j[n]]);\n                    if (p) {\n                        var q = JSON.parse(p);\n                        for (var r in q) {\n                            if ((o[r] !== undefined)) {\n                                if ((k[j[n]][r] === undefined)) {\n                                    k[j[n]][r] = [];\n                                };\n                                k[j[n]][r].push(q[r]);\n                            }\n                             else if ((k[j[n]][r] === undefined)) {\n                                k[j[n]][r] = q[r];\n                            }\n                        ;\n                        };\n                    }\n                ;\n                }\n            };\n            i = g(i);\n        };\n        for (var s in k) {\n            for (var t in o) {\n                if ((k[s][t] !== undefined)) {\n                    k[s][t] = k[s][t].join(o[t]);\n                };\n            };\n        };\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"csx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(\"csx(...): Unexpected class selector transformation.\");\n    };\n    e.exports = g;\n});\n__d(\"requestAnimationFrame\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = 0, i = (((((a.requestAnimationFrame || a.webkitRequestAnimationFrame) || a.mozRequestAnimationFrame) || a.oRequestAnimationFrame) || a.msRequestAnimationFrame) || function(j) {\n        var k = Date.now(), l = Math.max(0, (16 - ((k - h))));\n        h = (k + l);\n        return a.setTimeout(j, l);\n    });\n    i(g);\n    e.exports = i;\n});\n__d(\"queryThenMutateDOM\", [\"function-extensions\",\"Run\",\"createArrayFrom\",\"emptyFunction\",\"requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Run\"), h = b(\"createArrayFrom\"), i = b(\"emptyFunction\"), j = b(\"requestAnimationFrame\"), k, l, m = {\n    }, n = [], o = [];\n    function p(s, t, u) {\n        if ((!s && !t)) {\n            return\n        };\n        if ((u && m.hasOwnProperty(u))) {\n            return;\n        }\n         else if (u) {\n            m[u] = 1;\n        }\n    ;\n        n.push((t || i));\n        o.push((s || i));\n        r();\n        if (!k) {\n            k = true;\n            g.onLeave(function() {\n                k = false;\n                l = false;\n                m = {\n                };\n                n.length = 0;\n                o.length = 0;\n            });\n        }\n    ;\n    };\n    p.prepare = function(s, t, u) {\n        return function() {\n            var v = h(arguments);\n            v.unshift(this);\n            var w = Function.prototype.bind.apply(s, v), x = t.bind(this);\n            p(w, x, u);\n        };\n    };\n    function q() {\n        m = {\n        };\n        var s = o.length, t = n.length, u = [], v;\n        while (s--) {\n            v = o.shift();\n            u.push(v());\n        };\n        while (t--) {\n            v = n.shift();\n            v(u.shift());\n        };\n        l = false;\n        r();\n    };\n    function r() {\n        if ((!l && ((o.length || n.length)))) {\n            l = true;\n            j(q);\n        }\n    ;\n    };\n    e.exports = p;\n});\n__d(\"setTimeoutAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return setTimeout(h, i, false);\n    };\n    e.exports = g;\n});\n__d(\"TimelineCoverCollapse\", [\"Arbiter\",\"DOMDimensions\",\"Style\",\"TidyArbiter\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMDimensions\"), i = b(\"Style\"), j = b(\"TidyArbiter\"), k = b(\"$\");\n    f.collapse = function(l, m) {\n        m--;\n        var n = h.getViewportDimensions().height, o = h.getDocumentDimensions().height, p = (n + m);\n        if ((o <= p)) {\n            i.set(k(\"pagelet_timeline_main_column\"), \"min-height\", (p + \"px\"));\n        };\n        window.scrollBy(0, m);\n        j.inform(\"TimelineCover/coverCollapsed\", m, g.BEHAVIOR_STATE);\n    };\n});\nfunction tz_calculate(a) {\n    var b = new Date(), c = (b.getTimezoneOffset() / 30), d = (b.getTime() / 1000), e = Math.round((((a - d)) / 1800)), f = (Math.round((c + e)) % 48);\n    if ((f == 0)) {\n        return 0;\n    }\n     else if ((f > 24)) {\n        f -= (Math.ceil((f / 48)) * 48);\n    }\n     else if ((f < -28)) {\n        f += (Math.ceil((f / -48)) * 48);\n    }\n    \n;\n    return (f * 30);\n};\nfunction tz_autoset(a, b, c) {\n    if ((!a || (undefined == b))) {\n        return\n    };\n    if (window.tz_autoset.calculated) {\n        return\n    };\n    window.tz_autoset.calculated = true;\n    var d = -tz_calculate(a);\n    if ((c || (d != b))) {\n        var e = \"/ajax/timezone/update.php\";\n        new AsyncRequest().setURI(e).setData({\n            gmt_off: d,\n            is_forced: c\n        }).setErrorHandler(emptyFunction).setTransportErrorHandler(emptyFunction).setOption(\"suppressErrorAlerts\", true).send();\n    }\n;\n};\n__d(\"UFITracking\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\");\n    function h(j) {\n        g.loadModules([\"DOM\",\"collectDataAttributes\",], function(k, l) {\n            j.forEach(function(m) {\n                var n = k.scry(document.body, m);\n                if ((!n || n.link_data)) {\n                    return\n                };\n                var o = l(n, [\"ft\",]).ft;\n                if (Object.keys(o).length) {\n                    var p = k.create(\"input\", {\n                        type: \"hidden\",\n                        name: \"link_data\",\n                        value: JSON.stringify(o)\n                    });\n                    n.appendChild(p);\n                }\n            ;\n            });\n        });\n    };\n    var i = {\n        addAllLinkData: function() {\n            h([\"form.commentable_item\",]);\n        },\n        addAllLinkDataForQuestion: function() {\n            h([\"form.fbEigenpollForm\",\"form.fbQuestionPollForm\",]);\n        }\n    };\n    e.exports = i;\n});\n__d(\"legacy:ufi-tracking-js\", [\"UFITracking\",], function(a, b, c, d) {\n    var e = b(\"UFITracking\");\n    a.ufi_add_all_link_data = e.addAllLinkData;\n    a.question_add_all_link_data = e.addAllLinkDataForQuestion;\n}, 3);\n__d(\"LayerRemoveOnHide\", [\"function-extensions\",\"DOM\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOM\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", g.remove.curry(this._layer.getRoot()));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"Keys\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        BACKSPACE: 8,\n        TAB: 9,\n        RETURN: 13,\n        ESC: 27,\n        SPACE: 32,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        END: 35,\n        HOME: 36,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        DELETE: 46,\n        COMMA: 188\n    };\n});\n__d(\"areObjectsEqual\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return (JSON.stringify(h) == JSON.stringify(i));\n    };\n    e.exports = g;\n});\n__d(\"flattenArray\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = h.slice(), j = [];\n        while (i.length) {\n            var k = i.pop();\n            if (Array.isArray(k)) {\n                Array.prototype.push.apply(i, k);\n            }\n             else j.push(k);\n        ;\n        };\n        return j.reverse();\n    };\n    e.exports = g;\n});\n__d(\"htmlSpecialChars\", [], function(a, b, c, d, e, f) {\n    var g = /&/g, h = /</g, i = />/g, j = /\"/g, k = /'/g;\n    function l(m) {\n        if ((((typeof m == \"undefined\") || (m === null)) || !m.toString)) {\n            return \"\"\n        };\n        if ((m === false)) {\n            return \"0\";\n        }\n         else if ((m === true)) {\n            return \"1\"\n        }\n    ;\n        return m.toString().replace(g, \"&amp;\").replace(j, \"&quot;\").replace(k, \"&#039;\").replace(h, \"&lt;\").replace(i, \"&gt;\");\n    };\n    e.exports = l;\n});\n__d(\"htmlize\", [\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"htmlSpecialChars\");\n    function h(i) {\n        return g(i).replace(/\\r\\n|[\\r\\n]/g, \"\\u003Cbr/\\u003E\");\n    };\n    e.exports = h;\n});");
// 1002
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sbc5321dc786fbc14e87e4afbbcf739a7b46d985c");
// 1003
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"AyUu6\",]);\n}\n;\n;\n__d(\"XdArbiterBuffer\", [], function(a, b, c, d, e, f) {\n    if (!a.XdArbiter) {\n        a.XdArbiter = {\n            _m: [],\n            _p: [],\n            register: function(g, h, i) {\n                h = ((h || (((/^apps\\./).test(JSBNG__location.hostname) ? \"canvas\" : \"tab\"))));\n                this._p.push([g,h,i,]);\n                return h;\n            },\n            handleMessage: function(g, h) {\n                this._m.push([g,h,]);\n            }\n        };\n    }\n;\n;\n});\n__d(\"CanvasIFrameLoader\", [\"XdArbiterBuffer\",\"$\",], function(a, b, c, d, e, f) {\n    b(\"XdArbiterBuffer\");\n    var g = b(\"$\"), h = {\n        loadFromForm: function(i) {\n            i.submit();\n        }\n    };\n    e.exports = h;\n});\n__d(\"PHPQuerySerializer\", [], function(a, b, c, d, e, f) {\n    function g(n) {\n        return h(n, null);\n    };\n;\n    function h(n, o) {\n        o = ((o || \"\"));\n        var p = [];\n        if (((((n === null)) || ((n === undefined))))) {\n            p.push(i(o));\n        }\n         else if (((typeof (n) == \"object\"))) {\n            {\n                var fin27keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin27i = (0);\n                var q;\n                for (; (fin27i < fin27keys.length); (fin27i++)) {\n                    ((q) = (fin27keys[fin27i]));\n                    {\n                        if (((n.hasOwnProperty(q) && ((n[q] !== undefined))))) {\n                            p.push(h(n[q], ((o ? ((((((o + \"[\")) + q)) + \"]\")) : q))));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n         else p.push(((((i(o) + \"=\")) + i(n))));\n        \n    ;\n    ;\n        return p.join(\"&\");\n    };\n;\n    function i(n) {\n        return encodeURIComponent(n).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n    };\n;\n    var j = /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/;\n    function k(n) {\n        if (!n) {\n            return {\n            };\n        }\n    ;\n    ;\n        var o = {\n        };\n        n = n.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n        n = n.split(\"&\");\n        var p = Object.prototype.hasOwnProperty;\n        for (var q = 0, r = n.length; ((q < r)); q++) {\n            var s = n[q].match(j);\n            if (!s) {\n                var t = n[q].split(\"=\");\n                o[l(t[0])] = ((((t[1] === undefined)) ? null : l(t[1])));\n            }\n             else {\n                var u = s[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), v = s[1], w = l(((s[3] || \"\")));\n                u[0] = v;\n                var x = o;\n                for (var y = 0; ((y < ((u.length - 1)))); y++) {\n                    if (u[y]) {\n                        if (!p.call(x, u[y])) {\n                            var z = ((((u[((y + 1))] && !u[((y + 1))].match(/^\\d{1,3}$/))) ? {\n                            } : []));\n                            x[u[y]] = z;\n                            if (((x[u[y]] !== z))) {\n                                return o;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        x = x[u[y]];\n                    }\n                     else {\n                        if (((u[((y + 1))] && !u[((y + 1))].match(/^\\d{1,3}$/)))) {\n                            x.push({\n                            });\n                        }\n                         else x.push([]);\n                    ;\n                    ;\n                        x = x[((x.length - 1))];\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((((x instanceof Array)) && ((u[((u.length - 1))] === \"\"))))) {\n                    x.push(w);\n                }\n                 else x[u[((u.length - 1))]] = w;\n            ;\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    function l(n) {\n        return decodeURIComponent(n.replace(/\\+/g, \" \"));\n    };\n;\n    var m = {\n        serialize: g,\n        encodeComponent: i,\n        deserialize: k,\n        decodeComponent: l\n    };\n    e.exports = m;\n});\n__d(\"URIBase\", [\"PHPQuerySerializer\",\"copyProperties\",\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"PHPQuerySerializer\"), h = b(\"copyProperties\"), i = b(\"ex\"), j = /((([\\-\\w]+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/, k = new RegExp(((((\"[\\\\x00-\\\\x2c\\\\x2f\\\\x3b-\\\\x40\\\\x5c\\\\x5e\\\\x60\\\\x7b-\\\\x7f\" + \"\\\\uFDD0-\\\\uFDEF\\\\uFFF0-\\\\uFFFF\")) + \"\\\\u2047\\\\u2048\\\\uFE56\\\\uFE5F\\\\uFF03\\\\uFF0F\\\\uFF1F]\"))), l = new RegExp(((\"^(?:[^/]*:|\" + \"[\\\\x00-\\\\x1f]*/[\\\\x00-\\\\x1f]*/)\")));\n    function m(o, p, q) {\n        if (!p) {\n            return true;\n        }\n    ;\n    ;\n        if (((p instanceof n))) {\n            o.setProtocol(p.getProtocol());\n            o.setDomain(p.getDomain());\n            o.setPort(p.getPort());\n            o.setPath(p.getPath());\n            o.setQueryData(JSON.parse(JSON.stringify(p.getQueryData())));\n            o.setFragment(p.getFragment());\n            return true;\n        }\n    ;\n    ;\n        p = p.toString();\n        var r = p.match(j);\n        o.setProtocol(((r[3] || \"\")));\n        if (((k.test(((r[4] || \"\"))) && !q))) {\n            return false;\n        }\n    ;\n    ;\n        o.setDomain(((r[4] || \"\")));\n        o.setPort(((r[6] || \"\")));\n        o.setPath(((r[7] || \"\")));\n        if (q) {\n            o.setQueryData(((g.deserialize(r[9]) || {\n            })));\n        }\n         else try {\n            o.setQueryData(((g.deserialize(r[9]) || {\n            })));\n        } catch (s) {\n            return false;\n        }\n    ;\n    ;\n        o.setFragment(((r[11] || \"\")));\n        if (((!o.getDomain() && ((o.getPath().indexOf(\"\\\\\") !== -1))))) {\n            if (q) {\n                throw new Error(i(\"URI.parse: invalid URI (no domain but multiple back-slashes): %s\", o.toString()));\n            }\n             else return false\n        ;\n        }\n    ;\n    ;\n        if (((!o.getProtocol() && l.test(p)))) {\n            if (q) {\n                throw new Error(i(\"URI.parse: invalid URI (unsafe protocol-relative URLs): %s\", o.toString()));\n            }\n             else return false\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function n(o) {\n        this.$URIBase0 = \"\";\n        this.$URIBase1 = \"\";\n        this.$URIBase2 = \"\";\n        this.$URIBase3 = \"\";\n        this.$URIBase4 = \"\";\n        this.$URIBase5 = {\n        };\n        m(this, o, true);\n    };\n;\n    n.prototype.setProtocol = function(o) {\n        this.$URIBase0 = o;\n        return this;\n    };\n    n.prototype.getProtocol = function(o) {\n        return this.$URIBase0;\n    };\n    n.prototype.setSecure = function(o) {\n        return this.setProtocol(((o ? \"https\" : \"http\")));\n    };\n    n.prototype.isSecure = function() {\n        return ((this.getProtocol() === \"https\"));\n    };\n    n.prototype.setDomain = function(o) {\n        if (k.test(o)) {\n            throw new Error(i(\"URI.setDomain: unsafe domain specified: %s for url %s\", o, this.toString()));\n        }\n    ;\n    ;\n        this.$URIBase1 = o;\n        return this;\n    };\n    n.prototype.getDomain = function() {\n        return this.$URIBase1;\n    };\n    n.prototype.setPort = function(o) {\n        this.$URIBase2 = o;\n        return this;\n    };\n    n.prototype.getPort = function() {\n        return this.$URIBase2;\n    };\n    n.prototype.setPath = function(o) {\n        this.$URIBase3 = o;\n        return this;\n    };\n    n.prototype.getPath = function() {\n        return this.$URIBase3;\n    };\n    n.prototype.addQueryData = function(o, p) {\n        if (((o instanceof Object))) {\n            h(this.$URIBase5, o);\n        }\n         else this.$URIBase5[o] = p;\n    ;\n    ;\n        return this;\n    };\n    n.prototype.setQueryData = function(o) {\n        this.$URIBase5 = o;\n        return this;\n    };\n    n.prototype.getQueryData = function() {\n        return this.$URIBase5;\n    };\n    n.prototype.removeQueryData = function(o) {\n        if (!Array.isArray(o)) {\n            o = [o,];\n        }\n    ;\n    ;\n        for (var p = 0, q = o.length; ((p < q)); ++p) {\n            delete this.$URIBase5[o[p]];\n        ;\n        };\n    ;\n        return this;\n    };\n    n.prototype.setFragment = function(o) {\n        this.$URIBase4 = o;\n        return this;\n    };\n    n.prototype.getFragment = function() {\n        return this.$URIBase4;\n    };\n    n.prototype.toString = function() {\n        var o = \"\";\n        if (this.$URIBase0) {\n            o += ((this.$URIBase0 + \"://\"));\n        }\n    ;\n    ;\n        if (this.$URIBase1) {\n            o += this.$URIBase1;\n        }\n    ;\n    ;\n        if (this.$URIBase2) {\n            o += ((\":\" + this.$URIBase2));\n        }\n    ;\n    ;\n        if (this.$URIBase3) {\n            o += this.$URIBase3;\n        }\n         else if (o) {\n            o += \"/\";\n        }\n        \n    ;\n    ;\n        var p = g.serialize(this.$URIBase5);\n        if (p) {\n            o += ((\"?\" + p));\n        }\n    ;\n    ;\n        if (this.$URIBase4) {\n            o += ((\"#\" + this.$URIBase4));\n        }\n    ;\n    ;\n        return o;\n    };\n    n.prototype.getOrigin = function() {\n        return ((((((this.$URIBase0 + \"://\")) + this.$URIBase1)) + ((this.$URIBase2 ? ((\":\" + this.$URIBase2)) : \"\"))));\n    };\n    n.isValidURI = function(o) {\n        return m(new n(), o, false);\n    };\n    e.exports = n;\n});\n__d(\"URI\", [\"URIBase\",\"copyProperties\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URIBase\"), h = b(\"copyProperties\"), i = b(\"goURI\"), j = ((((g === null)) ? null : g.prototype));\n    k.prototype = Object.create(j);\n    k.prototype.constructor = k;\n    k.__superConstructor__ = g;\n    function k(l) {\n        if (!((this instanceof k))) {\n            return new k(((l || window.JSBNG__location.href)));\n        }\n    ;\n    ;\n        g.call(this, ((l || \"\")));\n    };\n;\n    k.prototype.setPath = function(l) {\n        this.path = l;\n        return j.setPath.call(this, l);\n    };\n    k.prototype.getPath = function() {\n        var l = j.getPath.call(this);\n        if (l) {\n            return l.replace(/^\\/+/, \"/\");\n        }\n    ;\n    ;\n        return l;\n    };\n    k.prototype.setProtocol = function(l) {\n        this.protocol = l;\n        return j.setProtocol.call(this, l);\n    };\n    k.prototype.setDomain = function(l) {\n        this.domain = l;\n        return j.setDomain.call(this, l);\n    };\n    k.prototype.setPort = function(l) {\n        this.port = l;\n        return j.setPort.call(this, l);\n    };\n    k.prototype.setFragment = function(l) {\n        this.fragment = l;\n        return j.setFragment.call(this, l);\n    };\n    k.prototype.isEmpty = function() {\n        return !((((((((((this.getPath() || this.getProtocol())) || this.getDomain())) || this.getPort())) || ((Object.keys(this.getQueryData()).length > 0)))) || this.getFragment()));\n    };\n    k.prototype.valueOf = function() {\n        return this.toString();\n    };\n    k.prototype.isFacebookURI = function() {\n        if (!k.$URI5) {\n            k.$URI5 = new RegExp(\"(^|\\\\.)facebook\\\\.com$\", \"i\");\n        }\n    ;\n    ;\n        if (this.isEmpty()) {\n            return false;\n        }\n    ;\n    ;\n        if (((!this.getDomain() && !this.getProtocol()))) {\n            return true;\n        }\n    ;\n    ;\n        return (((([\"http\",\"https\",].indexOf(this.getProtocol()) !== -1)) && k.$URI5.test(this.getDomain())));\n    };\n    k.prototype.getRegisteredDomain = function() {\n        if (!this.getDomain()) {\n            return \"\";\n        }\n    ;\n    ;\n        if (!this.isFacebookURI()) {\n            return null;\n        }\n    ;\n    ;\n        var l = this.getDomain().split(\".\"), m = l.indexOf(\"facebook\");\n        return l.slice(m).join(\".\");\n    };\n    k.prototype.getUnqualifiedURI = function() {\n        return new k(this).setProtocol(null).setDomain(null).setPort(null);\n    };\n    k.prototype.getQualifiedURI = function() {\n        return new k(this).$URI6();\n    };\n    k.prototype.$URI6 = function() {\n        if (!this.getDomain()) {\n            var l = k();\n            this.setProtocol(l.getProtocol()).setDomain(l.getDomain()).setPort(l.getPort());\n        }\n    ;\n    ;\n        return this;\n    };\n    k.prototype.isSameOrigin = function(l) {\n        var m = ((l || window.JSBNG__location.href));\n        if (!((m instanceof k))) {\n            m = new k(m.toString());\n        }\n    ;\n    ;\n        if (((this.isEmpty() || m.isEmpty()))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getProtocol() && ((this.getProtocol() != m.getProtocol()))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getDomain() && ((this.getDomain() != m.getDomain()))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getPort() && ((this.getPort() != m.getPort()))))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n    k.prototype.go = function(l) {\n        i(this, l);\n    };\n    k.prototype.setSubdomain = function(l) {\n        var m = this.$URI6().getDomain().split(\".\");\n        if (((m.length <= 2))) {\n            m.unshift(l);\n        }\n         else m[0] = l;\n    ;\n    ;\n        return this.setDomain(m.join(\".\"));\n    };\n    k.prototype.getSubdomain = function() {\n        if (!this.getDomain()) {\n            return \"\";\n        }\n    ;\n    ;\n        var l = this.getDomain().split(\".\");\n        if (((l.length <= 2))) {\n            return \"\";\n        }\n         else return l[0]\n    ;\n    };\n    k.isValidURI = g.isValidURI;\n    h(k, {\n        getRequestURI: function(l, m) {\n            l = ((((l === undefined)) || l));\n            var n = a.PageTransitions;\n            if (((((l && n)) && n.isInitialized()))) {\n                return n.getCurrentURI(!!m).getQualifiedURI();\n            }\n             else return new k(window.JSBNG__location.href)\n        ;\n        },\n        getMostRecentURI: function() {\n            var l = a.PageTransitions;\n            if (((l && l.isInitialized()))) {\n                return l.getMostRecentURI().getQualifiedURI();\n            }\n             else return new k(window.JSBNG__location.href)\n        ;\n        },\n        getNextURI: function() {\n            var l = a.PageTransitions;\n            if (((l && l.isInitialized()))) {\n                return l.getNextURI().getQualifiedURI();\n            }\n             else return new k(window.JSBNG__location.href)\n        ;\n        },\n        expression: /(((\\w+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/,\n        arrayQueryExpression: /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/,\n        explodeQuery: function(l) {\n            if (!l) {\n                return {\n                };\n            }\n        ;\n        ;\n            var m = {\n            };\n            l = l.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n            l = l.split(\"&\");\n            var n = Object.prototype.hasOwnProperty;\n            for (var o = 0, p = l.length; ((o < p)); o++) {\n                var q = l[o].match(k.arrayQueryExpression);\n                if (!q) {\n                    var r = l[o].split(\"=\");\n                    m[k.decodeComponent(r[0])] = ((((r[1] === undefined)) ? null : k.decodeComponent(r[1])));\n                }\n                 else {\n                    var s = q[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), t = q[1], u = k.decodeComponent(((q[3] || \"\")));\n                    s[0] = t;\n                    var v = m;\n                    for (var w = 0; ((w < ((s.length - 1)))); w++) {\n                        if (s[w]) {\n                            if (!n.call(v, s[w])) {\n                                var x = ((((s[((w + 1))] && !s[((w + 1))].match(/^\\d{1,3}$/))) ? {\n                                } : []));\n                                v[s[w]] = x;\n                                if (((v[s[w]] !== x))) {\n                                    return m;\n                                }\n                            ;\n                            ;\n                            }\n                        ;\n                        ;\n                            v = v[s[w]];\n                        }\n                         else {\n                            if (((s[((w + 1))] && !s[((w + 1))].match(/^\\d{1,3}$/)))) {\n                                v.push({\n                                });\n                            }\n                             else v.push([]);\n                        ;\n                        ;\n                            v = v[((v.length - 1))];\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    if (((((v instanceof Array)) && ((s[((s.length - 1))] === \"\"))))) {\n                        v.push(u);\n                    }\n                     else v[s[((s.length - 1))]] = u;\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        },\n        implodeQuery: function(l, m, n) {\n            m = ((m || \"\"));\n            if (((n === undefined))) {\n                n = true;\n            }\n        ;\n        ;\n            var o = [];\n            if (((((l === null)) || ((l === undefined))))) {\n                o.push(((n ? k.encodeComponent(m) : m)));\n            }\n             else if (((l instanceof Array))) {\n                for (var p = 0; ((p < l.length)); ++p) {\n                    try {\n                        if (((l[p] !== undefined))) {\n                            o.push(k.implodeQuery(l[p], ((m ? ((((((m + \"[\")) + p)) + \"]\")) : p)), n));\n                        }\n                    ;\n                    ;\n                    } catch (q) {\n                    \n                    };\n                ;\n                };\n            ;\n            }\n             else if (((typeof (l) == \"object\"))) {\n                if (((((\"nodeName\" in l)) && ((\"nodeType\" in l))))) {\n                    o.push(\"{node}\");\n                }\n                 else {\n                    var fin28keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin28i = (0);\n                    var r;\n                    for (; (fin28i < fin28keys.length); (fin28i++)) {\n                        ((r) = (fin28keys[fin28i]));\n                        {\n                            try {\n                                if (((l[r] !== undefined))) {\n                                    o.push(k.implodeQuery(l[r], ((m ? ((((((m + \"[\")) + r)) + \"]\")) : r)), n));\n                                }\n                            ;\n                            ;\n                            } catch (q) {\n                            \n                            };\n                        ;\n                        };\n                    };\n                }\n            ;\n            ;\n            }\n             else if (n) {\n                o.push(((((k.encodeComponent(m) + \"=\")) + k.encodeComponent(l))));\n            }\n             else o.push(((((m + \"=\")) + l)));\n            \n            \n            \n        ;\n        ;\n            return o.join(\"&\");\n        },\n        encodeComponent: function(l) {\n            return encodeURIComponent(l).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n        },\n        decodeComponent: function(l) {\n            return decodeURIComponent(l.replace(/\\+/g, \" \"));\n        }\n    });\n    e.exports = k;\n});\n__d(\"AsyncSignal\", [\"Env\",\"ErrorUtils\",\"QueryString\",\"URI\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ErrorUtils\"), i = b(\"QueryString\"), j = b(\"URI\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(n, o) {\n        this.data = ((o || {\n        }));\n        if (((g.tracking_domain && ((n.charAt(0) == \"/\"))))) {\n            n = ((g.tracking_domain + n));\n        }\n    ;\n    ;\n        this.uri = n;\n    };\n;\n    m.prototype.setHandler = function(n) {\n        this.handler = n;\n        return this;\n    };\n    m.prototype.send = function() {\n        var n = this.handler, o = this.data, p = new JSBNG__Image();\n        if (n) {\n            p.JSBNG__onload = p.JSBNG__onerror = function() {\n                h.applyWithGuard(n, null, [((p.height == 1)),]);\n            };\n        }\n    ;\n    ;\n        o.asyncSignal = ((((((Math.JSBNG__random() * 10000)) | 0)) + 1));\n        var q = new j(this.uri).isFacebookURI();\n        l(o, k.getAsyncParams(((q ? \"POST\" : \"GET\"))));\n        p.src = i.appendToUrl(this.uri, o);\n        return this;\n    };\n    e.exports = m;\n});\n__d(\"createObjectFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i, j) {\n        var k = {\n        }, l = g(j);\n        if (((typeof j == \"undefined\"))) {\n            j = true;\n        }\n    ;\n    ;\n        for (var m = i.length; m--; ) {\n            k[i[m]] = ((l ? j[m] : j));\n        ;\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"DOMQuery\", [\"CSS\",\"UserAgent\",\"createArrayFrom\",\"createObjectFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"UserAgent\"), i = b(\"createArrayFrom\"), j = b(\"createObjectFrom\"), k = b(\"ge\"), l = null;\n    function m(o, p) {\n        return ((o.hasAttribute ? o.hasAttribute(p) : ((o.getAttribute(p) !== null))));\n    };\n;\n    var n = {\n        JSBNG__find: function(o, p) {\n            var q = n.scry(o, p);\n            return q[0];\n        },\n        scry: function(o, p) {\n            if (((!o || !o.getElementsByTagName))) {\n                return [];\n            }\n        ;\n        ;\n            var q = p.split(\" \"), r = [o,];\n            for (var s = 0; ((s < q.length)); s++) {\n                if (((r.length === 0))) {\n                    break;\n                }\n            ;\n            ;\n                if (((q[s] === \"\"))) {\n                    continue;\n                }\n            ;\n            ;\n                var t = q[s], u = q[s], v = [], w = false;\n                if (((t.charAt(0) == \"^\"))) {\n                    if (((s === 0))) {\n                        w = true;\n                        t = t.slice(1);\n                    }\n                     else return []\n                ;\n                }\n            ;\n            ;\n                t = t.replace(/\\[(?:[^=\\]]*=(?:\"[^\"]*\"|'[^']*'))?|[.#]/g, \" $&\");\n                var x = t.split(\" \"), y = ((x[0] || \"*\")), z = ((y == \"*\")), aa = ((x[1] && ((x[1].charAt(0) == \"#\"))));\n                if (aa) {\n                    var ba = k(x[1].slice(1), o, y);\n                    if (((ba && ((z || ((ba.tagName.toLowerCase() == y))))))) {\n                        for (var ca = 0; ((ca < r.length)); ca++) {\n                            if (((w && n.contains(ba, r[ca])))) {\n                                v = [ba,];\n                                break;\n                            }\n                             else if (((((JSBNG__document == r[ca])) || n.contains(r[ca], ba)))) {\n                                v = [ba,];\n                                break;\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    }\n                ;\n                ;\n                }\n                 else {\n                    var da = [], ea = r.length, fa, ga = ((((!w && ((u.indexOf(\"[\") < 0)))) && JSBNG__document.querySelectorAll));\n                    for (var ha = 0; ((ha < ea)); ha++) {\n                        if (w) {\n                            fa = [];\n                            var ia = r[ha].parentNode;\n                            while (n.isElementNode(ia)) {\n                                if (((z || ((ia.tagName.toLowerCase() == y))))) {\n                                    fa.push(ia);\n                                }\n                            ;\n                            ;\n                                ia = ia.parentNode;\n                            };\n                        ;\n                        }\n                         else if (ga) {\n                            fa = r[ha].querySelectorAll(u);\n                        }\n                         else fa = r[ha].getElementsByTagName(y);\n                        \n                    ;\n                    ;\n                        var ja = fa.length;\n                        for (var ka = 0; ((ka < ja)); ka++) {\n                            da.push(fa[ka]);\n                        ;\n                        };\n                    ;\n                    };\n                ;\n                    if (!ga) {\n                        for (var la = 1; ((la < x.length)); la++) {\n                            var ma = x[la], na = ((ma.charAt(0) == \".\")), oa = ma.substring(1);\n                            for (ha = 0; ((ha < da.length)); ha++) {\n                                var pa = da[ha];\n                                if (((!pa || ((pa.nodeType !== 1))))) {\n                                    continue;\n                                }\n                            ;\n                            ;\n                                if (na) {\n                                    if (!g.hasClass(pa, oa)) {\n                                        delete da[ha];\n                                    }\n                                ;\n                                ;\n                                    continue;\n                                }\n                                 else {\n                                    var qa = ma.slice(1, ((ma.length - 1)));\n                                    if (((qa.indexOf(\"=\") == -1))) {\n                                        if (!m(pa, qa)) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                     else {\n                                        var ra = qa.split(\"=\"), sa = ra[0], ta = ra[1];\n                                        ta = ta.slice(1, ((ta.length - 1)));\n                                        if (((pa.getAttribute(sa) != ta))) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        };\n                    }\n                ;\n                ;\n                    for (ha = 0; ((ha < da.length)); ha++) {\n                        if (da[ha]) {\n                            v.push(da[ha]);\n                            if (w) {\n                                break;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                r = v;\n            };\n        ;\n            return r;\n        },\n        getText: function(o) {\n            if (n.isTextNode(o)) {\n                return o.data;\n            }\n             else if (n.isElementNode(o)) {\n                if (((l === null))) {\n                    var p = JSBNG__document.createElement(\"div\");\n                    l = ((((p.textContent != null)) ? \"textContent\" : \"innerText\"));\n                }\n            ;\n            ;\n                return o[l];\n            }\n             else return \"\"\n            \n        ;\n        },\n        JSBNG__getSelection: function() {\n            var o = window.JSBNG__getSelection, p = JSBNG__document.selection;\n            if (o) {\n                return ((o() + \"\"));\n            }\n             else if (p) {\n                return p.createRange().text;\n            }\n            \n        ;\n        ;\n            return null;\n        },\n        contains: function(o, p) {\n            o = k(o);\n            p = k(p);\n            if (((!o || !p))) {\n                return false;\n            }\n             else if (((o === p))) {\n                return true;\n            }\n             else if (n.isTextNode(o)) {\n                return false;\n            }\n             else if (n.isTextNode(p)) {\n                return n.contains(o, p.parentNode);\n            }\n             else if (o.contains) {\n                return o.contains(p);\n            }\n             else if (o.compareDocumentPosition) {\n                return !!((o.compareDocumentPosition(p) & 16));\n            }\n             else return false\n            \n            \n            \n            \n            \n        ;\n        },\n        getRootElement: function() {\n            var o = null;\n            if (((window.Quickling && Quickling.isActive()))) {\n                o = k(\"JSBNG__content\");\n            }\n        ;\n        ;\n            return ((o || JSBNG__document.body));\n        },\n        isNode: function(o) {\n            return !!((o && ((((typeof JSBNG__Node !== \"undefined\")) ? ((o instanceof JSBNG__Node)) : ((((((typeof o == \"object\")) && ((typeof o.nodeType == \"number\")))) && ((typeof o.nodeName == \"string\"))))))));\n        },\n        isNodeOfType: function(o, p) {\n            var q = i(p).join(\"|\").toUpperCase().split(\"|\"), r = j(q);\n            return ((n.isNode(o) && ((o.nodeName in r))));\n        },\n        isElementNode: function(o) {\n            return ((n.isNode(o) && ((o.nodeType == 1))));\n        },\n        isTextNode: function(o) {\n            return ((n.isNode(o) && ((o.nodeType == 3))));\n        },\n        isInputNode: function(o) {\n            return ((n.isNodeOfType(o, [\"input\",\"textarea\",]) || ((o.contentEditable === \"true\"))));\n        },\n        getDocumentScrollElement: function(o) {\n            o = ((o || JSBNG__document));\n            var p = ((h.chrome() || h.webkit()));\n            return ((((!p && ((o.compatMode === \"CSS1Compat\")))) ? o.documentElement : o.body));\n        }\n    };\n    e.exports = n;\n});\n__d(\"DataStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = 1;\n    function i(l) {\n        if (((typeof l == \"string\"))) {\n            return ((\"str_\" + l));\n        }\n         else return ((\"elem_\" + ((l.__FB_TOKEN || (l.__FB_TOKEN = [h++,])))[0]))\n    ;\n    };\n;\n    function j(l) {\n        var m = i(l);\n        return ((g[m] || (g[m] = {\n        })));\n    };\n;\n    var k = {\n        set: function(l, m, n) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.set: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var o = j(l);\n            o[m] = n;\n            return l;\n        },\n        get: function(l, m, n) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.get: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var o = j(l), p = o[m];\n            if (((((typeof p === \"undefined\")) && l.getAttribute))) {\n                if (((l.hasAttribute && !l.hasAttribute(((\"data-\" + m)))))) {\n                    p = undefined;\n                }\n                 else {\n                    var q = l.getAttribute(((\"data-\" + m)));\n                    p = ((((null === q)) ? undefined : q));\n                }\n            ;\n            }\n        ;\n        ;\n            if (((((n !== undefined)) && ((p === undefined))))) {\n                p = o[m] = n;\n            }\n        ;\n        ;\n            return p;\n        },\n        remove: function(l, m) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.remove: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var n = j(l), o = n[m];\n            delete n[m];\n            return o;\n        },\n        purge: function(l) {\n            delete g[i(l)];\n        }\n    };\n    e.exports = k;\n});\n__d(\"DOMEvent\", [\"copyProperties\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"invariant\");\n    function i(j) {\n        this.JSBNG__event = ((j || window.JSBNG__event));\n        h(((typeof (this.JSBNG__event.srcElement) != \"unknown\")));\n        this.target = ((this.JSBNG__event.target || this.JSBNG__event.srcElement));\n    };\n;\n    i.killThenCall = function(j) {\n        return function(k) {\n            new i(k).kill();\n            return j();\n        };\n    };\n    g(i.prototype, {\n        preventDefault: function() {\n            var j = this.JSBNG__event;\n            if (j.preventDefault) {\n                j.preventDefault();\n                if (!((\"defaultPrevented\" in j))) {\n                    j.defaultPrevented = true;\n                }\n            ;\n            ;\n            }\n             else j.returnValue = false;\n        ;\n        ;\n            return this;\n        },\n        isDefaultPrevented: function() {\n            var j = this.JSBNG__event;\n            return ((((\"defaultPrevented\" in j)) ? j.defaultPrevented : ((j.returnValue === false))));\n        },\n        stopPropagation: function() {\n            var j = this.JSBNG__event;\n            ((j.stopPropagation ? j.stopPropagation() : j.cancelBubble = true));\n            return this;\n        },\n        kill: function() {\n            this.stopPropagation().preventDefault();\n            return this;\n        }\n    });\n    e.exports = i;\n});\n__d(\"getObjectValues\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        var j = [];\n        {\n            var fin29keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin29i = (0);\n            var k;\n            for (; (fin29i < fin29keys.length); (fin29i++)) {\n                ((k) = (fin29keys[fin29i]));\n                {\n                    j.push(i[k]);\n                ;\n                };\n            };\n        };\n    ;\n        return j;\n    };\n;\n    e.exports = h;\n});\n__d(\"JSBNG__Event\", [\"event-form-bubbling\",\"Arbiter\",\"DataStore\",\"DOMQuery\",\"DOMEvent\",\"ErrorUtils\",\"Parent\",\"UserAgent\",\"$\",\"copyProperties\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    b(\"event-form-bubbling\");\n    var g = b(\"Arbiter\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"DOMEvent\"), k = b(\"ErrorUtils\"), l = b(\"Parent\"), m = b(\"UserAgent\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"getObjectValues\"), q = a.JSBNG__Event;\n    q.DATASTORE_KEY = \"JSBNG__Event.listeners\";\n    if (!q.prototype) {\n        q.prototype = {\n        };\n    }\n;\n;\n    function r(ca) {\n        if (((((((ca.type === \"click\")) || ((ca.type === \"mouseover\")))) || ((ca.type === \"keydown\"))))) {\n            g.inform(\"Event/stop\", {\n                JSBNG__event: ca\n            });\n        }\n    ;\n    ;\n    };\n;\n    function s(ca, da, ea) {\n        this.target = ca;\n        this.type = da;\n        this.data = ea;\n    };\n;\n    o(s.prototype, {\n        getData: function() {\n            this.data = ((this.data || {\n            }));\n            return this.data;\n        },\n        JSBNG__stop: function() {\n            return q.JSBNG__stop(this);\n        },\n        prevent: function() {\n            return q.prevent(this);\n        },\n        isDefaultPrevented: function() {\n            return q.isDefaultPrevented(this);\n        },\n        kill: function() {\n            return q.kill(this);\n        },\n        getTarget: function() {\n            return ((new j(this).target || null));\n        }\n    });\n    function t(ca) {\n        if (((ca instanceof s))) {\n            return ca;\n        }\n    ;\n    ;\n        if (!ca) {\n            if (((!window.JSBNG__addEventListener && JSBNG__document.createEventObject))) {\n                ca = ((window.JSBNG__event ? JSBNG__document.createEventObject(window.JSBNG__event) : {\n                }));\n            }\n             else ca = {\n            };\n        ;\n        }\n    ;\n    ;\n        if (!ca._inherits_from_prototype) {\n            {\n                var fin30keys = ((window.top.JSBNG_Replay.forInKeys)((q.prototype))), fin30i = (0);\n                var da;\n                for (; (fin30i < fin30keys.length); (fin30i++)) {\n                    ((da) = (fin30keys[fin30i]));\n                    {\n                        try {\n                            ca[da] = q.prototype[da];\n                        } catch (ea) {\n                        \n                        };\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    o(q.prototype, {\n        _inherits_from_prototype: true,\n        getRelatedTarget: function() {\n            var ca = ((this.relatedTarget || ((((this.fromElement === this.srcElement)) ? this.toElement : this.fromElement))));\n            return ((((ca && ca.nodeType)) ? ca : null));\n        },\n        getModifiers: function() {\n            var ca = {\n                control: !!this.ctrlKey,\n                shift: !!this.shiftKey,\n                alt: !!this.altKey,\n                meta: !!this.metaKey\n            };\n            ca.access = ((m.osx() ? ca.control : ca.alt));\n            ca.any = ((((((ca.control || ca.shift)) || ca.alt)) || ca.meta));\n            return ca;\n        },\n        isRightClick: function() {\n            if (this.which) {\n                return ((this.which === 3));\n            }\n        ;\n        ;\n            return ((this.button && ((this.button === 2))));\n        },\n        isMiddleClick: function() {\n            if (this.which) {\n                return ((this.which === 2));\n            }\n        ;\n        ;\n            return ((this.button && ((this.button === 4))));\n        },\n        isDefaultRequested: function() {\n            return ((((this.getModifiers().any || this.isMiddleClick())) || this.isRightClick()));\n        }\n    });\n    o(q.prototype, s.prototype);\n    o(q, {\n        listen: function(ca, da, ea, fa) {\n            if (((typeof ca == \"string\"))) {\n                ca = n(ca);\n            }\n        ;\n        ;\n            if (((typeof fa == \"undefined\"))) {\n                fa = q.Priority.NORMAL;\n            }\n        ;\n        ;\n            if (((typeof da == \"object\"))) {\n                var ga = {\n                };\n                {\n                    var fin31keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin31i = (0);\n                    var ha;\n                    for (; (fin31i < fin31keys.length); (fin31i++)) {\n                        ((ha) = (fin31keys[fin31i]));\n                        {\n                            ga[ha] = q.listen(ca, ha, da[ha], fa);\n                        ;\n                        };\n                    };\n                };\n            ;\n                return ga;\n            }\n        ;\n        ;\n            if (da.match(/^on/i)) {\n                throw new TypeError(((((\"Bad event name `\" + da)) + \"': use `click', not `onclick'.\")));\n            }\n        ;\n        ;\n            if (((((ca.nodeName == \"LABEL\")) && ((da == \"click\"))))) {\n                var ia = ca.getElementsByTagName(\"input\");\n                ca = ((((ia.length == 1)) ? ia[0] : ca));\n            }\n             else if (((((ca === window)) && ((da === \"JSBNG__scroll\"))))) {\n                var ja = i.getDocumentScrollElement();\n                if (((((ja !== JSBNG__document.documentElement)) && ((ja !== JSBNG__document.body))))) {\n                    ca = ja;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ka = h.get(ca, v, {\n            });\n            if (x[da]) {\n                var la = x[da];\n                da = la.base;\n                if (la.wrap) {\n                    ea = la.wrap(ea);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            z(ca, da);\n            var ma = ka[da];\n            if (!((fa in ma))) {\n                ma[fa] = [];\n            }\n        ;\n        ;\n            var na = ma[fa].length, oa = new ba(ea, ma[fa], na);\n            ma[fa].push(oa);\n            return oa;\n        },\n        JSBNG__stop: function(ca) {\n            var da = new j(ca).stopPropagation();\n            r(da.JSBNG__event);\n            return ca;\n        },\n        prevent: function(ca) {\n            new j(ca).preventDefault();\n            return ca;\n        },\n        isDefaultPrevented: function(ca) {\n            return new j(ca).isDefaultPrevented(ca);\n        },\n        kill: function(ca) {\n            var da = new j(ca).kill();\n            r(da.JSBNG__event);\n            return false;\n        },\n        getKeyCode: function(JSBNG__event) {\n            JSBNG__event = new j(JSBNG__event).JSBNG__event;\n            if (!JSBNG__event) {\n                return false;\n            }\n        ;\n        ;\n            switch (JSBNG__event.keyCode) {\n              case 63232:\n                return 38;\n              case 63233:\n                return 40;\n              case 63234:\n                return 37;\n              case 63235:\n                return 39;\n              case 63272:\n            \n              case 63273:\n            \n              case 63275:\n                return null;\n              case 63276:\n                return 33;\n              case 63277:\n                return 34;\n            };\n        ;\n            if (JSBNG__event.shiftKey) {\n                switch (JSBNG__event.keyCode) {\n                  case 33:\n                \n                  case 34:\n                \n                  case 37:\n                \n                  case 38:\n                \n                  case 39:\n                \n                  case 40:\n                    return null;\n                };\n            }\n        ;\n        ;\n            return JSBNG__event.keyCode;\n        },\n        getPriorities: function() {\n            if (!u) {\n                var ca = p(q.Priority);\n                ca.sort(function(da, ea) {\n                    return ((da - ea));\n                });\n                u = ca;\n            }\n        ;\n        ;\n            return u;\n        },\n        fire: function(ca, da, ea) {\n            var fa = new s(ca, da, ea), ga;\n            do {\n                var ha = q.__getHandler(ca, da);\n                if (ha) {\n                    ga = ha(fa);\n                }\n            ;\n            ;\n                ca = ca.parentNode;\n            } while (((((ca && ((ga !== false)))) && !fa.cancelBubble)));\n            return ((ga !== false));\n        },\n        __fire: function(ca, da, JSBNG__event) {\n            var ea = q.__getHandler(ca, da);\n            if (ea) {\n                return ea(t(JSBNG__event));\n            }\n        ;\n        ;\n        },\n        __getHandler: function(ca, da) {\n            return h.get(ca, ((q.DATASTORE_KEY + da)));\n        },\n        getPosition: function(ca) {\n            ca = new j(ca).JSBNG__event;\n            var da = i.getDocumentScrollElement(), ea = ((ca.clientX + da.scrollLeft)), fa = ((ca.clientY + da.scrollTop));\n            return {\n                x: ea,\n                y: fa\n            };\n        }\n    });\n    var u = null, v = q.DATASTORE_KEY, w = function(ca) {\n        return function(da) {\n            if (!i.contains(this, da.getRelatedTarget())) {\n                return ca.call(this, da);\n            }\n        ;\n        ;\n        };\n    }, x;\n    if (!window.JSBNG__navigator.msPointerEnabled) {\n        x = {\n            mouseenter: {\n                base: \"mouseover\",\n                wrap: w\n            },\n            mouseleave: {\n                base: \"mouseout\",\n                wrap: w\n            }\n        };\n    }\n     else x = {\n        mousedown: {\n            base: \"MSPointerDown\"\n        },\n        mousemove: {\n            base: \"MSPointerMove\"\n        },\n        mouseup: {\n            base: \"MSPointerUp\"\n        },\n        mouseover: {\n            base: \"MSPointerOver\"\n        },\n        mouseout: {\n            base: \"MSPointerOut\"\n        },\n        mouseenter: {\n            base: \"MSPointerOver\",\n            wrap: w\n        },\n        mouseleave: {\n            base: \"MSPointerOut\",\n            wrap: w\n        }\n    };\n;\n;\n    if (m.firefox()) {\n        var y = function(ca, JSBNG__event) {\n            JSBNG__event = t(JSBNG__event);\n            var da = JSBNG__event.getTarget();\n            while (da) {\n                q.__fire(da, ca, JSBNG__event);\n                da = da.parentNode;\n            };\n        ;\n        };\n        JSBNG__document.documentElement.JSBNG__addEventListener(\"JSBNG__focus\", y.curry(\"focusin\"), true);\n        JSBNG__document.documentElement.JSBNG__addEventListener(\"JSBNG__blur\", y.curry(\"focusout\"), true);\n    }\n;\n;\n    var z = function(ca, da) {\n        var ea = ((\"JSBNG__on\" + da)), fa = aa.bind(ca, da), ga = h.get(ca, v);\n        if (((da in ga))) {\n            return;\n        }\n    ;\n    ;\n        ga[da] = {\n        };\n        if (ca.JSBNG__addEventListener) {\n            ca.JSBNG__addEventListener(da, fa, false);\n        }\n         else if (ca.JSBNG__attachEvent) {\n            ca.JSBNG__attachEvent(ea, fa);\n        }\n        \n    ;\n    ;\n        h.set(ca, ((v + da)), fa);\n        if (ca[ea]) {\n            var ha = ((((ca === JSBNG__document.documentElement)) ? q.Priority._BUBBLE : q.Priority.TRADITIONAL)), ia = ca[ea];\n            ca[ea] = null;\n            q.listen(ca, da, ia, ha);\n        }\n    ;\n    ;\n        if (((((ca.nodeName === \"FORM\")) && ((da === \"submit\"))))) {\n            q.listen(ca, da, q.__bubbleSubmit.curry(ca), q.Priority._BUBBLE);\n        }\n    ;\n    ;\n    }, aa = k.guard(function(ca, JSBNG__event) {\n        JSBNG__event = t(JSBNG__event);\n        if (!h.get(this, v)) {\n            throw new Error(\"Bad listenHandler context.\");\n        }\n    ;\n    ;\n        var da = h.get(this, v)[ca];\n        if (!da) {\n            throw new Error(((((\"No registered handlers for `\" + ca)) + \"'.\")));\n        }\n    ;\n    ;\n        if (((ca == \"click\"))) {\n            var ea = l.byTag(JSBNG__event.getTarget(), \"a\");\n            if (window.userAction) {\n                var fa = window.userAction(\"evt_ext\", ea, JSBNG__event, {\n                    mode: \"DEDUP\"\n                }).uai_fallback(\"click\");\n                if (window.ArbiterMonitor) {\n                    window.ArbiterMonitor.initUA(fa, [ea,]);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (window.clickRefAction) {\n                window.clickRefAction(\"click\", ea, JSBNG__event);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var ga = q.getPriorities();\n        for (var ha = 0; ((ha < ga.length)); ha++) {\n            var ia = ga[ha];\n            if (((ia in da))) {\n                var ja = da[ia];\n                for (var ka = 0; ((ka < ja.length)); ka++) {\n                    if (!ja[ka]) {\n                        continue;\n                    }\n                ;\n                ;\n                    var la = ja[ka].fire(this, JSBNG__event);\n                    if (((la === false))) {\n                        return JSBNG__event.kill();\n                    }\n                     else if (JSBNG__event.cancelBubble) {\n                        JSBNG__event.JSBNG__stop();\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return JSBNG__event.returnValue;\n    });\n    q.Priority = {\n        URGENT: -20,\n        TRADITIONAL: -10,\n        NORMAL: 0,\n        _BUBBLE: 1000\n    };\n    function ba(ca, da, ea) {\n        this._handler = ca;\n        this._container = da;\n        this._index = ea;\n    };\n;\n    o(ba.prototype, {\n        remove: function() {\n            delete this._handler;\n            delete this._container[this._index];\n        },\n        fire: function(ca, JSBNG__event) {\n            return k.applyWithGuard(this._handler, ca, [JSBNG__event,], function(da) {\n                da.event_type = JSBNG__event.type;\n                da.dom_element = ((ca.JSBNG__name || ca.id));\n                da.category = \"eventhandler\";\n            });\n        }\n    });\n    a.$E = q.$E = t;\n    e.exports = q;\n});\n__d(\"evalGlobal\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (((typeof h != \"string\"))) {\n            throw new TypeError(\"JS sent to evalGlobal is not a string. Only strings are permitted.\");\n        }\n    ;\n    ;\n        if (!h) {\n            return;\n        }\n    ;\n    ;\n        var i = JSBNG__document.createElement(\"script\");\n        try {\n            i.appendChild(JSBNG__document.createTextNode(h));\n        } catch (j) {\n            i.text = h;\n        };\n    ;\n        var k = ((JSBNG__document.getElementsByTagName(\"head\")[0] || JSBNG__document.documentElement));\n        k.appendChild(i);\n        k.removeChild(i);\n    };\n;\n    e.exports = g;\n});\n__d(\"HTML\", [\"function-extensions\",\"Bootloader\",\"UserAgent\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"evalGlobal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"UserAgent\"), i = b(\"copyProperties\"), j = b(\"createArrayFrom\"), k = b(\"emptyFunction\"), l = b(\"evalGlobal\");\n    function m(n) {\n        if (((n && ((typeof n.__html == \"string\"))))) {\n            n = n.__html;\n        }\n    ;\n    ;\n        if (!((this instanceof m))) {\n            if (((n instanceof m))) {\n                return n;\n            }\n        ;\n        ;\n            return new m(n);\n        }\n    ;\n    ;\n        this._content = n;\n        this._defer = false;\n        this._extra_action = \"\";\n        this._nodes = null;\n        this._inline_js = k;\n        this._rootNode = null;\n        return this;\n    };\n;\n    m.isHTML = function(n) {\n        return ((n && ((((n instanceof m)) || ((n.__html !== undefined))))));\n    };\n    m.replaceJSONWrapper = function(n) {\n        return ((((n && ((n.__html !== undefined)))) ? new m(n.__html) : n));\n    };\n    i(m.prototype, {\n        toString: function() {\n            var n = ((this._content || \"\"));\n            if (this._extra_action) {\n                n += ((((((\"\\u003Cscript type=\\\"text/javascript\\\"\\u003E\" + this._extra_action)) + \"\\u003C/scr\")) + \"ipt\\u003E\"));\n            }\n        ;\n        ;\n            return n;\n        },\n        setAction: function(n) {\n            this._extra_action = n;\n            return this;\n        },\n        getAction: function() {\n            this._fillCache();\n            var n = function() {\n                this._inline_js();\n                l(this._extra_action);\n            }.bind(this);\n            if (this.getDeferred()) {\n                return n.defer.bind(n);\n            }\n             else return n\n        ;\n        },\n        setDeferred: function(n) {\n            this._defer = !!n;\n            return this;\n        },\n        getDeferred: function() {\n            return this._defer;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getNodes: function() {\n            this._fillCache();\n            return this._nodes;\n        },\n        getRootNode: function() {\n            var n = this.getNodes();\n            if (((n.length === 1))) {\n                this._rootNode = n[0];\n            }\n             else {\n                var o = JSBNG__document.createDocumentFragment();\n                for (var p = 0; ((p < n.length)); p++) {\n                    o.appendChild(n[p]);\n                ;\n                };\n            ;\n                this._rootNode = o;\n            }\n        ;\n        ;\n            return this._rootNode;\n        },\n        _fillCache: function() {\n            if (((null !== this._nodes))) {\n                return;\n            }\n        ;\n        ;\n            var n = this._content;\n            if (!n) {\n                this._nodes = [];\n                return;\n            }\n        ;\n        ;\n            n = n.replace(/(<(\\w+)[^>]*?)\\/>/g, function(y, z, aa) {\n                return ((aa.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? y : ((((((z + \"\\u003E\\u003C/\")) + aa)) + \"\\u003E\"))));\n            });\n            var o = n.trim().toLowerCase(), p = JSBNG__document.createElement(\"div\"), q = false, r = ((((((((((((((!o.indexOf(\"\\u003Copt\") && [1,\"\\u003Cselect multiple=\\\"multiple\\\" class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/select\\u003E\",])) || ((!o.indexOf(\"\\u003Cleg\") && [1,\"\\u003Cfieldset class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/fieldset\\u003E\",])))) || ((o.match(/^<(thead|tbody|tfoot|colg|cap)/) && [1,\"\\u003Ctable class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/table\\u003E\",])))) || ((!o.indexOf(\"\\u003Ctr\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tbody\\u003E\\u003C/table\\u003E\",])))) || ((((!o.indexOf(\"\\u003Ctd\") || !o.indexOf(\"\\u003Cth\"))) && [3,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003Ctr class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\",])))) || ((!o.indexOf(\"\\u003Ccol\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003C/tbody\\u003E\\u003Ccolgroup class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/colgroup\\u003E\\u003C/table\\u003E\",])))) || null));\n            if (((null === r))) {\n                p.className = \"__WRAPPER\";\n                if (h.ie()) {\n                    r = [0,\"\\u003Cspan style=\\\"display:none\\\"\\u003E&nbsp;\\u003C/span\\u003E\",\"\",];\n                    q = true;\n                }\n                 else r = [0,\"\",\"\",];\n            ;\n            ;\n            }\n        ;\n        ;\n            p.innerHTML = ((((r[1] + n)) + r[2]));\n            while (r[0]--) {\n                p = p.lastChild;\n            ;\n            };\n        ;\n            if (q) {\n                p.removeChild(p.firstChild);\n            }\n        ;\n        ;\n            ((p.className != \"__WRAPPER\"));\n            if (h.ie()) {\n                var s;\n                if (((!o.indexOf(\"\\u003Ctable\") && ((-1 == o.indexOf(\"\\u003Ctbody\")))))) {\n                    s = ((p.firstChild && p.firstChild.childNodes));\n                }\n                 else if (((((r[1] == \"\\u003Ctable\\u003E\")) && ((-1 == o.indexOf(\"\\u003Ctbody\")))))) {\n                    s = p.childNodes;\n                }\n                 else s = [];\n                \n            ;\n            ;\n                for (var t = ((s.length - 1)); ((t >= 0)); --t) {\n                    if (((((s[t].nodeName && ((s[t].nodeName.toLowerCase() == \"tbody\")))) && ((s[t].childNodes.length == 0))))) {\n                        s[t].parentNode.removeChild(s[t]);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var u = p.getElementsByTagName(\"script\"), v = [];\n            for (var w = 0; ((w < u.length)); w++) {\n                if (u[w].src) {\n                    v.push(g.requestJSResource.bind(g, u[w].src));\n                }\n                 else v.push(l.bind(null, u[w].innerHTML));\n            ;\n            ;\n            };\n        ;\n            for (var w = ((u.length - 1)); ((w >= 0)); w--) {\n                u[w].parentNode.removeChild(u[w]);\n            ;\n            };\n        ;\n            var x = function() {\n                for (var y = 0; ((y < v.length)); y++) {\n                    v[y]();\n                ;\n                };\n            ;\n            };\n            this._nodes = j(p.childNodes);\n            this._inline_js = x;\n        }\n    });\n    e.exports = m;\n});\n__d(\"isScalar\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/string|number|boolean/).test(typeof h);\n    };\n;\n    e.exports = g;\n});\n__d(\"JSBNG__Intl\", [], function(a, b, c, d, e, f) {\n    var g;\n    function h(j) {\n        if (((typeof j != \"string\"))) {\n            return false;\n        }\n    ;\n    ;\n        return j.match(new RegExp(((((((((((((((((((((((((((((((((((((((((((((((((((((h.punct_char_class + \"[\")) + \")\\\"\")) + \"'\")) + \"\\u00bb\")) + \"\\u0f3b\")) + \"\\u0f3d\")) + \"\\u2019\")) + \"\\u201d\")) + \"\\u203a\")) + \"\\u3009\")) + \"\\u300b\")) + \"\\u300d\")) + \"\\u300f\")) + \"\\u3011\")) + \"\\u3015\")) + \"\\u3017\")) + \"\\u3019\")) + \"\\u301b\")) + \"\\u301e\")) + \"\\u301f\")) + \"\\ufd3f\")) + \"\\uff07\")) + \"\\uff09\")) + \"\\uff3d\")) + \"\\\\s\")) + \"]*$\"))));\n    };\n;\n    h.punct_char_class = ((((((((((((((((((((((\"[\" + \".!?\")) + \"\\u3002\")) + \"\\uff01\")) + \"\\uff1f\")) + \"\\u0964\")) + \"\\u2026\")) + \"\\u0eaf\")) + \"\\u1801\")) + \"\\u0e2f\")) + \"\\uff0e\")) + \"]\"));\n    function i(j) {\n        if (g) {\n            var k = [], l = [];\n            {\n                var fin32keys = ((window.top.JSBNG_Replay.forInKeys)((g.patterns))), fin32i = (0);\n                var m;\n                for (; (fin32i < fin32keys.length); (fin32i++)) {\n                    ((m) = (fin32keys[fin32i]));\n                    {\n                        var n = g.patterns[m];\n                        {\n                            var fin33keys = ((window.top.JSBNG_Replay.forInKeys)((g.meta))), fin33i = (0);\n                            var o;\n                            for (; (fin33i < fin33keys.length); (fin33i++)) {\n                                ((o) = (fin33keys[fin33i]));\n                                {\n                                    var p = new RegExp(o.slice(1, -1), \"g\"), q = g.meta[o];\n                                    m = m.replace(p, q);\n                                    n = n.replace(p, q);\n                                };\n                            };\n                        };\n                    ;\n                        k.push(m);\n                        l.push(n);\n                    };\n                };\n            };\n        ;\n            for (var r = 0; ((r < k.length)); r++) {\n                var s = new RegExp(k[r].slice(1, -1), \"g\");\n                if (((l[r] == \"javascript\"))) {\n                    j.replace(s, function(t) {\n                        return t.slice(1).toLowerCase();\n                    });\n                }\n                 else j = j.replace(s, l[r]);\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return j.replace(/\\x01/g, \"\");\n    };\n;\n    e.exports = {\n        endsInPunct: h,\n        applyPhonologicalRules: i,\n        setPhonologicalRules: function(j) {\n            g = j;\n        }\n    };\n});\n__d(\"substituteTokens\", [\"invariant\",\"JSBNG__Intl\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"JSBNG__Intl\");\n    function i(j, k) {\n        if (!k) {\n            return j;\n        }\n    ;\n    ;\n        g(((typeof k === \"object\")));\n        var l = ((((\"\\\\{([^}]+)\\\\}(\" + h.endsInPunct.punct_char_class)) + \"*)\")), m = new RegExp(l, \"g\"), n = [], o = j.replace(m, function(r, s, t) {\n            var u = k[s];\n            if (((u && ((typeof u === \"object\"))))) {\n                n.push(u);\n                return ((\"\\u0017\" + t));\n            }\n        ;\n        ;\n            return ((u + ((h.endsInPunct(u) ? \"\" : t))));\n        }).split(\"\\u0017\").map(h.applyPhonologicalRules);\n        if (((o.length === 1))) {\n            return o[0];\n        }\n    ;\n    ;\n        var p = [o[0],];\n        for (var q = 0; ((q < n.length)); q++) {\n            p.push(n[q], o[((q + 1))]);\n        ;\n        };\n    ;\n        return p;\n    };\n;\n    e.exports = i;\n});\n__d(\"tx\", [\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"substituteTokens\");\n    function h(i, j) {\n        if (((typeof _string_table == \"undefined\"))) {\n            return;\n        }\n    ;\n    ;\n        i = _string_table[i];\n        return g(i, j);\n    };\n;\n    h._ = g;\n    e.exports = h;\n});\n__d(\"DOM\", [\"function-extensions\",\"DOMQuery\",\"JSBNG__Event\",\"HTML\",\"UserAgent\",\"$\",\"copyProperties\",\"createArrayFrom\",\"isScalar\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"JSBNG__Event\"), i = b(\"HTML\"), j = b(\"UserAgent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"isScalar\"), o = b(\"tx\"), p = \"js_\", q = 0, r = {\n    };\n    l(r, g);\n    l(r, {\n        create: function(u, v, w) {\n            var x = JSBNG__document.createElement(u);\n            if (v) {\n                r.setAttributes(x, v);\n            }\n        ;\n        ;\n            if (((w != null))) {\n                r.setContent(x, w);\n            }\n        ;\n        ;\n            return x;\n        },\n        setAttributes: function(u, v) {\n            if (v.type) {\n                u.type = v.type;\n            }\n        ;\n        ;\n            {\n                var fin34keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin34i = (0);\n                var w;\n                for (; (fin34i < fin34keys.length); (fin34i++)) {\n                    ((w) = (fin34keys[fin34i]));\n                    {\n                        var x = v[w], y = (/^on/i).test(w);\n                        if (((w == \"type\"))) {\n                            continue;\n                        }\n                         else if (((w == \"style\"))) {\n                            if (((typeof x == \"string\"))) {\n                                u.style.cssText = x;\n                            }\n                             else l(u.style, x);\n                        ;\n                        ;\n                        }\n                         else if (y) {\n                            h.listen(u, w.substr(2), x);\n                        }\n                         else if (((w in u))) {\n                            u[w] = x;\n                        }\n                         else if (u.setAttribute) {\n                            u.setAttribute(w, x);\n                        }\n                        \n                        \n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        prependContent: function(u, v) {\n            return s(v, u, function(w) {\n                ((u.firstChild ? u.insertBefore(w, u.firstChild) : u.appendChild(w)));\n            });\n        },\n        insertAfter: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                ((u.nextSibling ? w.insertBefore(x, u.nextSibling) : w.appendChild(x)));\n            });\n        },\n        insertBefore: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.insertBefore(x, u);\n            });\n        },\n        setContent: function(u, v) {\n            r.empty(u);\n            return r.appendContent(u, v);\n        },\n        appendContent: function(u, v) {\n            return s(v, u, function(w) {\n                u.appendChild(w);\n            });\n        },\n        replace: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.replaceChild(x, u);\n            });\n        },\n        remove: function(u) {\n            u = k(u);\n            if (u.parentNode) {\n                u.parentNode.removeChild(u);\n            }\n        ;\n        ;\n        },\n        empty: function(u) {\n            u = k(u);\n            while (u.firstChild) {\n                r.remove(u.firstChild);\n            ;\n            };\n        ;\n        },\n        getID: function(u) {\n            var v = u.id;\n            if (!v) {\n                v = ((p + q++));\n                u.id = v;\n            }\n        ;\n        ;\n            return v;\n        }\n    });\n    function s(u, v, w) {\n        u = i.replaceJSONWrapper(u);\n        if (((((((u instanceof i)) && ((\"\" === v.innerHTML)))) && ((-1 === u.toString().indexOf(((\"\\u003Cscr\" + \"ipt\")))))))) {\n            var x = j.ie();\n            if (((!x || ((((x > 7)) && !g.isNodeOfType(v, [\"table\",\"tbody\",\"thead\",\"tfoot\",\"tr\",\"select\",\"fieldset\",])))))) {\n                var y = ((x ? \"\\u003Cem style=\\\"display:none;\\\"\\u003E&nbsp;\\u003C/em\\u003E\" : \"\"));\n                v.innerHTML = ((y + u));\n                ((x && v.removeChild(v.firstChild)));\n                return m(v.childNodes);\n            }\n        ;\n        ;\n        }\n         else if (g.isTextNode(v)) {\n            v.data = u;\n            return [u,];\n        }\n        \n    ;\n    ;\n        var z = JSBNG__document.createDocumentFragment(), aa, ba = [], ca = [];\n        if (!Array.isArray(u)) {\n            u = [u,];\n        }\n    ;\n    ;\n        for (var da = 0; ((da < u.length)); da++) {\n            aa = i.replaceJSONWrapper(u[da]);\n            if (((aa instanceof i))) {\n                ca.push(aa.getAction());\n                var ea = aa.getNodes();\n                for (var fa = 0; ((fa < ea.length)); fa++) {\n                    ba.push(ea[fa]);\n                    z.appendChild(ea[fa]);\n                };\n            ;\n            }\n             else if (n(aa)) {\n                var ga = JSBNG__document.createTextNode(aa);\n                ba.push(ga);\n                z.appendChild(ga);\n            }\n             else if (g.isNode(aa)) {\n                ba.push(aa);\n                z.appendChild(aa);\n            }\n            \n            \n        ;\n        ;\n        };\n    ;\n        w(z);\n        ca.forEach(function(ha) {\n            ha();\n        });\n        return ba;\n    };\n;\n    function t(u) {\n        function v(w) {\n            return r.create(\"div\", {\n            }, w).innerHTML;\n        };\n    ;\n        return function(w, x) {\n            var y = {\n            };\n            if (x) {\n                {\n                    var fin35keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin35i = (0);\n                    var z;\n                    for (; (fin35i < fin35keys.length); (fin35i++)) {\n                        ((z) = (fin35keys[fin35i]));\n                        {\n                            y[z] = v(x[z]);\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            return i(u(w, y));\n        };\n    };\n;\n    r.tx = t(o);\n    r.tx._ = r._tx = t(o._);\n    e.exports = r;\n});\n__d(\"LinkshimAsyncLink\", [\"$\",\"AsyncSignal\",\"DOM\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncSignal\"), i = b(\"DOM\"), j = b(\"UserAgent\"), k = {\n        swap: function(l, m) {\n            var n = ((j.ie() <= 8));\n            if (n) {\n                var o = i.create(\"wbr\", {\n                }, null);\n                i.appendContent(l, o);\n            }\n        ;\n        ;\n            l.href = m;\n            if (n) {\n                i.remove(o);\n            }\n        ;\n        ;\n        },\n        referrer_log: function(l, m, n) {\n            var o = g(\"meta_referrer\");\n            o.JSBNG__content = \"origin\";\n            k.swap(l, m);\n            (function() {\n                o.JSBNG__content = \"default\";\n                new h(n, {\n                }).send();\n            }).defer(100);\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:dom-asynclinkshim\", [\"LinkshimAsyncLink\",], function(a, b, c, d) {\n    a.LinkshimAsyncLink = b(\"LinkshimAsyncLink\");\n}, 3);\n__d(\"CookieCore\", [], function(a, b, c, d, e, f) {\n    var g = {\n        set: function(h, i, j, k, l) {\n            JSBNG__document.cookie = ((((((((((((((((((h + \"=\")) + encodeURIComponent(i))) + \"; \")) + ((j ? ((((\"expires=\" + (new JSBNG__Date(((JSBNG__Date.now() + j)))).toGMTString())) + \"; \")) : \"\")))) + \"path=\")) + ((k || \"/\")))) + \"; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"))) + ((l ? \"; secure\" : \"\"))));\n        },\n        clear: function(h, i) {\n            i = ((i || \"/\"));\n            JSBNG__document.cookie = ((((((((((h + \"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; \")) + \"path=\")) + i)) + \"; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        },\n        get: function(h) {\n            var i = JSBNG__document.cookie.match(((((\"(?:^|;\\\\s*)\" + h)) + \"=(.*?)(?:;|$)\")));\n            return ((i ? decodeURIComponent(i[1]) : i));\n        }\n    };\n    e.exports = g;\n});\n__d(\"Cookie\", [\"CookieCore\",\"Env\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CookieCore\"), h = b(\"Env\"), i = b(\"copyProperties\");\n    function j(l, m, n, o, p) {\n        if (((h.no_cookies && ((l != \"tpa\"))))) {\n            return;\n        }\n    ;\n    ;\n        g.set(l, m, n, o, p);\n    };\n;\n    var k = i({\n    }, g);\n    k.set = j;\n    e.exports = k;\n});\n__d(\"detect_broken_proxy_cache\", [\"AsyncSignal\",\"Cookie\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"URI\");\n    function j(k, l) {\n        var m = h.get(l);\n        if (((((((m != k)) && ((m != null)))) && ((k != \"0\"))))) {\n            var n = {\n                c: \"si_detect_broken_proxy_cache\",\n                m: ((((((((l + \" \")) + k)) + \" \")) + m))\n            }, o = new i(\"/common/scribe_endpoint.php\").getQualifiedURI().toString();\n            new g(o, n).send();\n        }\n    ;\n    ;\n    };\n;\n    e.exports = j;\n});\n__d(\"legacy:detect-broken-proxy-cache\", [\"detect_broken_proxy_cache\",], function(a, b, c, d) {\n    a.detect_broken_proxy_cache = b(\"detect_broken_proxy_cache\");\n}, 3);\n__d(\"link_rel_preload\", [\"Bootloader\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Parent\");\n    function i() {\n        var j = /async(?:-post)?|dialog(?:-pipe|-post)?|theater|toggle/;\n        JSBNG__document.documentElement.JSBNG__onmousedown = function(k) {\n            k = ((k || window.JSBNG__event));\n            var l = ((k.target || k.srcElement)), m = h.byTag(l, \"A\");\n            if (!m) {\n                return;\n            }\n        ;\n        ;\n            var n = m.getAttribute(\"ajaxify\"), o = m.href, p = ((n || o));\n            if (((((n && o)) && !(/#$/).test(o)))) {\n                var q = ((k.which && ((k.which != 1)))), r = ((((((k.altKey || k.ctrlKey)) || k.metaKey)) || k.shiftKey));\n                if (((q || r))) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s = ((m.rel && m.rel.match(j)));\n            s = ((s && s[0]));\n            switch (s) {\n              case \"dialog\":\n            \n              case \"dialog-post\":\n                g.loadModules([\"Dialog\",]);\n                break;\n              case \"dialog-pipe\":\n                g.loadModules([\"AjaxPipeRequest\",\"Dialog\",]);\n                break;\n              case \"async\":\n            \n              case \"async-post\":\n                g.loadModules([\"AsyncRequest\",]);\n                break;\n              case \"theater\":\n                g.loadModules([\"PhotoSnowlift\",], function(t) {\n                    t.preload(p, m);\n                });\n                break;\n              case \"toggle\":\n                g.loadModules([\"Toggler\",]);\n                break;\n            };\n        ;\n            return;\n        };\n    };\n;\n    e.exports = i;\n});\n__d(\"legacy:link-rel-preload\", [\"link_rel_preload\",], function(a, b, c, d) {\n    a.link_rel_preload = b(\"link_rel_preload\");\n}, 3);\n__d(\"AsyncResponse\", [\"Bootloader\",\"Env\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Env\"), i = b(\"copyProperties\"), j = b(\"tx\");\n    function k(l, m) {\n        i(this, {\n            error: 0,\n            errorSummary: null,\n            errorDescription: null,\n            JSBNG__onload: null,\n            replay: false,\n            payload: ((m || null)),\n            request: ((l || null)),\n            silentError: false,\n            transientError: false,\n            is_last: true\n        });\n        return this;\n    };\n;\n    i(k, {\n        defaultErrorHandler: function(l) {\n            try {\n                if (!l.silentError) {\n                    k.verboseErrorHandler(l);\n                }\n                 else l.logErrorByGroup(\"silent\", 10);\n            ;\n            ;\n            } catch (m) {\n                JSBNG__alert(l);\n            };\n        ;\n        },\n        verboseErrorHandler: function(l) {\n            try {\n                var n = l.getErrorSummary(), o = l.getErrorDescription();\n                l.logErrorByGroup(\"popup\", 10);\n                if (((l.silentError && ((o == \"\"))))) {\n                    o = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n                }\n            ;\n            ;\n                g.loadModules([\"Dialog\",], function(p) {\n                    new p().setTitle(n).setBody(o).setButtons([p.OK,]).setModal(true).setCausalElement(this.relativeTo).show();\n                });\n            } catch (m) {\n                JSBNG__alert(l);\n            };\n        ;\n        }\n    });\n    i(k.prototype, {\n        getRequest: function() {\n            return this.request;\n        },\n        getPayload: function() {\n            return this.payload;\n        },\n        getError: function() {\n            return this.error;\n        },\n        getErrorSummary: function() {\n            return this.errorSummary;\n        },\n        setErrorSummary: function(l) {\n            l = ((((l === undefined)) ? null : l));\n            this.errorSummary = l;\n            return this;\n        },\n        getErrorDescription: function() {\n            return this.errorDescription;\n        },\n        getErrorIsWarning: function() {\n            return this.errorIsWarning;\n        },\n        isTransient: function() {\n            return this.transientError;\n        },\n        logError: function(l, m) {\n            var n = a.ErrorSignal;\n            if (n) {\n                var o = {\n                    err_code: this.error,\n                    vip: ((h.vip || \"-\"))\n                };\n                if (m) {\n                    o.duration = m.duration;\n                    o.xfb_ip = m.xfb_ip;\n                }\n            ;\n            ;\n                var p = this.request.getURI();\n                o.path = ((p || \"-\"));\n                o.aid = this.request.userActionID;\n                if (((p && ((p.indexOf(\"scribe_endpoint.php\") != -1))))) {\n                    l = \"async_error_double\";\n                }\n            ;\n            ;\n                n.sendErrorSignal(l, JSON.stringify(o));\n            }\n        ;\n        ;\n        },\n        logErrorByGroup: function(l, m) {\n            if (((Math.floor(((Math.JSBNG__random() * m))) == 0))) {\n                if (((((this.error == 1357010)) || ((this.error < 15000))))) {\n                    this.logError(((\"async_error_oops_\" + l)));\n                }\n                 else this.logError(((\"async_error_logic_\" + l)));\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"HTTPErrors\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = {\n        get: g,\n        getAll: g\n    };\n    e.exports = h;\n});\n__d(\"bind\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = Array.prototype.slice.call(arguments, 2);\n        if (((typeof i != \"string\"))) {\n            return Function.prototype.bind.apply(i, [h,].concat(j));\n        }\n    ;\n    ;\n        function k() {\n            var l = j.concat(Array.prototype.slice.call(arguments));\n            if (h[i]) {\n                return h[i].apply(h, l);\n            }\n        ;\n        ;\n        };\n    ;\n        k.toString = function() {\n            return ((\"bound lazily: \" + h[i]));\n        };\n        return k;\n    };\n;\n    e.exports = g;\n});\n__d(\"executeAfter\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return function() {\n            h.apply(((j || this)), arguments);\n            i.apply(((j || this)), arguments);\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"AsyncRequest\", [\"Arbiter\",\"AsyncResponse\",\"Bootloader\",\"CSS\",\"Env\",\"ErrorUtils\",\"JSBNG__Event\",\"HTTPErrors\",\"JSCC\",\"Parent\",\"Run\",\"ServerJS\",\"URI\",\"UserAgent\",\"XHR\",\"asyncCallback\",\"bind\",\"copyProperties\",\"emptyFunction\",\"evalGlobal\",\"ge\",\"goURI\",\"isEmpty\",\"ix\",\"tx\",\"executeAfter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncResponse\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"Env\"), l = b(\"ErrorUtils\"), m = b(\"JSBNG__Event\"), n = b(\"HTTPErrors\"), o = b(\"JSCC\"), p = b(\"Parent\"), q = b(\"Run\"), r = b(\"ServerJS\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"XHR\"), v = b(\"asyncCallback\"), w = b(\"bind\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"evalGlobal\"), aa = b(\"ge\"), ba = b(\"goURI\"), ca = b(\"isEmpty\"), da = b(\"ix\"), ea = b(\"tx\"), fa = b(\"executeAfter\");\n    function ga() {\n        try {\n            return !window.loaded;\n        } catch (pa) {\n            return true;\n        };\n    ;\n    };\n;\n    function ha(pa) {\n        return ((((\"upload\" in pa)) && ((\"JSBNG__onprogress\" in pa.upload))));\n    };\n;\n    function ia(pa) {\n        return ((\"withCredentials\" in pa));\n    };\n;\n    function ja(pa) {\n        return ((pa.JSBNG__status in {\n            0: 1,\n            12029: 1,\n            12030: 1,\n            12031: 1,\n            12152: 1\n        }));\n    };\n;\n    function ka(pa) {\n        var qa = ((!pa || ((typeof (pa) === \"function\"))));\n        return qa;\n    };\n;\n    var la = 2, ma = la;\n    g.subscribe(\"page_transition\", function(pa, qa) {\n        ma = qa.id;\n    });\n    function na(pa) {\n        x(this, {\n            transport: null,\n            method: \"POST\",\n            uri: \"\",\n            timeout: null,\n            timer: null,\n            initialHandler: y,\n            handler: null,\n            uploadProgressHandler: null,\n            errorHandler: null,\n            transportErrorHandler: null,\n            timeoutHandler: null,\n            interceptHandler: y,\n            finallyHandler: y,\n            abortHandler: y,\n            serverDialogCancelHandler: null,\n            relativeTo: null,\n            statusElement: null,\n            statusClass: \"\",\n            data: {\n            },\n            file: null,\n            context: {\n            },\n            readOnly: false,\n            writeRequiredParams: [],\n            remainingRetries: 0,\n            userActionID: \"-\"\n        });\n        this.option = {\n            asynchronous: true,\n            suppressErrorHandlerWarning: false,\n            suppressEvaluation: false,\n            suppressErrorAlerts: false,\n            retries: 0,\n            jsonp: false,\n            bundle: false,\n            useIframeTransport: false,\n            handleErrorAfterUnload: false\n        };\n        this.errorHandler = h.defaultErrorHandler;\n        this.transportErrorHandler = w(this, \"errorHandler\");\n        if (((pa !== undefined))) {\n            this.setURI(pa);\n        }\n    ;\n    ;\n    };\n;\n    x(na, {\n        bootstrap: function(pa, qa, ra) {\n            var sa = \"GET\", ta = true, ua = {\n            };\n            if (((ra || ((qa && ((qa.rel == \"async-post\"))))))) {\n                sa = \"POST\";\n                ta = false;\n                if (pa) {\n                    pa = s(pa);\n                    ua = pa.getQueryData();\n                    pa.setQueryData({\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var va = ((p.byClass(qa, \"stat_elem\") || qa));\n            if (((va && j.hasClass(va, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var wa = new na(pa).setReadOnly(ta).setMethod(sa).setData(ua).setNectarModuleDataSafe(qa).setRelativeTo(qa);\n            if (qa) {\n                wa.setHandler(function(ya) {\n                    m.fire(qa, \"success\", {\n                        response: ya\n                    });\n                });\n                wa.setErrorHandler(function(ya) {\n                    if (((m.fire(qa, \"error\", {\n                        response: ya\n                    }) !== false))) {\n                        h.defaultErrorHandler(ya);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            if (va) {\n                wa.setStatusElement(va);\n                var xa = va.getAttribute(\"data-status-class\");\n                ((xa && wa.setStatusClass(xa)));\n            }\n        ;\n        ;\n            if (qa) {\n                m.fire(qa, \"AsyncRequest/send\", {\n                    request: wa\n                });\n            }\n        ;\n        ;\n            wa.send();\n            return false;\n        },\n        post: function(pa, qa) {\n            new na(pa).setReadOnly(false).setMethod(\"POST\").setData(qa).send();\n            return false;\n        },\n        getLastID: function() {\n            return la;\n        },\n        suppressOnloadToken: {\n        },\n        _inflight: [],\n        _inflightCount: 0,\n        _inflightAdd: y,\n        _inflightPurge: y,\n        getInflightCount: function() {\n            return this._inflightCount;\n        },\n        _inflightEnable: function() {\n            if (t.ie()) {\n                x(na, {\n                    _inflightAdd: function(pa) {\n                        this._inflight.push(pa);\n                    },\n                    _inflightPurge: function() {\n                        na._inflight = na._inflight.filter(function(pa) {\n                            return ((pa.transport && ((pa.transport.readyState < 4))));\n                        });\n                    }\n                });\n                q.onUnload(function() {\n                    na._inflight.forEach(function(pa) {\n                        if (((pa.transport && ((pa.transport.readyState < 4))))) {\n                            pa.transport.abort();\n                            delete pa.transport;\n                        }\n                    ;\n                    ;\n                    });\n                });\n            }\n        ;\n        ;\n        }\n    });\n    x(na.prototype, {\n        _dispatchResponse: function(pa) {\n            this.clearStatusIndicator();\n            if (!this._isRelevant()) {\n                this._invokeErrorHandler(1010);\n                return;\n            }\n        ;\n        ;\n            if (((this.initialHandler(pa) === false))) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__clearTimeout(this.timer);\n            if (pa.jscc_map) {\n                var qa = (eval)(pa.jscc_map);\n                o.init(qa);\n            }\n        ;\n        ;\n            var ra;\n            if (this.handler) {\n                try {\n                    ra = this._shouldSuppressJS(this.handler(pa));\n                } catch (sa) {\n                    ((pa.is_last && this.finallyHandler(pa)));\n                    throw sa;\n                };\n            }\n        ;\n        ;\n            if (!ra) {\n                this._handleJSResponse(pa);\n            }\n        ;\n        ;\n            ((pa.is_last && this.finallyHandler(pa)));\n        },\n        _shouldSuppressJS: function(pa) {\n            return ((pa === na.suppressOnloadToken));\n        },\n        _handleJSResponse: function(pa) {\n            var qa = this.getRelativeTo(), ra = pa.domops, sa = pa.jsmods, ta = new r().setRelativeTo(qa), ua;\n            if (((sa && sa.require))) {\n                ua = sa.require;\n                delete sa.require;\n            }\n        ;\n        ;\n            if (sa) {\n                ta.handle(sa);\n            }\n        ;\n        ;\n            var va = function(wa) {\n                if (((ra && wa))) {\n                    wa.invoke(ra, qa);\n                }\n            ;\n            ;\n                if (ua) {\n                    ta.handle({\n                        require: ua\n                    });\n                }\n            ;\n            ;\n                this._handleJSRegisters(pa, \"JSBNG__onload\");\n                if (this.lid) {\n                    g.inform(\"tti_ajax\", {\n                        s: this.lid,\n                        d: [((this._sendTimeStamp || 0)),((((this._sendTimeStamp && this._responseTime)) ? ((this._responseTime - this._sendTimeStamp)) : 0)),]\n                    }, g.BEHAVIOR_EVENT);\n                }\n            ;\n            ;\n                this._handleJSRegisters(pa, \"onafterload\");\n                ta.cleanup();\n            }.bind(this);\n            if (ra) {\n                i.loadModules([\"AsyncDOM\",], va);\n            }\n             else va(null);\n        ;\n        ;\n        },\n        _handleJSRegisters: function(pa, qa) {\n            var ra = pa[qa];\n            if (ra) {\n                for (var sa = 0; ((sa < ra.length)); sa++) {\n                    l.applyWithGuard(new Function(ra[sa]), this);\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        invokeResponseHandler: function(pa) {\n            if (((typeof (pa.redirect) !== \"undefined\"))) {\n                (function() {\n                    this.setURI(pa.redirect).send();\n                }).bind(this).defer();\n                return;\n            }\n        ;\n        ;\n            if (((((!this.handler && !this.errorHandler)) && !this.transportErrorHandler))) {\n                return;\n            }\n        ;\n        ;\n            var qa = pa.asyncResponse;\n            if (((typeof (qa) !== \"undefined\"))) {\n                if (!this._isRelevant()) {\n                    this._invokeErrorHandler(1010);\n                    return;\n                }\n            ;\n            ;\n                if (qa.inlinejs) {\n                    z(qa.inlinejs);\n                }\n            ;\n            ;\n                if (qa.lid) {\n                    this._responseTime = JSBNG__Date.now();\n                    if (a.CavalryLogger) {\n                        this.cavalry = a.CavalryLogger.getInstance(qa.lid);\n                    }\n                ;\n                ;\n                    this.lid = qa.lid;\n                }\n            ;\n            ;\n                if (qa.resource_map) {\n                    i.setResourceMap(qa.resource_map);\n                }\n            ;\n            ;\n                if (qa.bootloadable) {\n                    i.enableBootload(qa.bootloadable);\n                }\n            ;\n            ;\n                da.add(qa.ixData);\n                var ra, sa;\n                if (((qa.getError() && !qa.getErrorIsWarning()))) {\n                    var ta = this.errorHandler.bind(this);\n                    ra = l.guard(this._dispatchErrorResponse);\n                    ra = ra.bind(this, qa, ta);\n                    sa = \"error\";\n                }\n                 else {\n                    ra = l.guard(this._dispatchResponse);\n                    ra = ra.bind(this, qa);\n                    sa = \"response\";\n                }\n            ;\n            ;\n                ra = fa(ra, function() {\n                    g.inform(((\"AsyncRequest/\" + sa)), {\n                        request: this,\n                        response: qa\n                    });\n                }.bind(this));\n                ra = ra.defer.bind(ra);\n                var ua = false;\n                if (this.preBootloadHandler) {\n                    ua = this.preBootloadHandler(qa);\n                }\n            ;\n            ;\n                qa.css = ((qa.css || []));\n                qa.js = ((qa.js || []));\n                i.loadResources(qa.css.concat(qa.js), ra, ua, this.getURI());\n            }\n             else if (((typeof (pa.transportError) !== \"undefined\"))) {\n                if (this._xFbServer) {\n                    this._invokeErrorHandler(1008);\n                }\n                 else this._invokeErrorHandler(1012);\n            ;\n            ;\n            }\n             else this._invokeErrorHandler(1007);\n            \n        ;\n        ;\n        },\n        _invokeErrorHandler: function(pa) {\n            var qa;\n            if (((this.responseText === \"\"))) {\n                qa = 1002;\n            }\n             else if (this._requestAborted) {\n                qa = 1011;\n            }\n             else {\n                try {\n                    qa = ((((pa || this.transport.JSBNG__status)) || 1004));\n                } catch (ra) {\n                    qa = 1005;\n                };\n            ;\n                if (((false === JSBNG__navigator.onLine))) {\n                    qa = 1006;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var sa, ta, ua = true;\n            if (((qa === 1006))) {\n                ta = \"No Network Connection\";\n                sa = \"Your browser appears to be offline. Please check your internet connection and try again.\";\n            }\n             else if (((((qa >= 300)) && ((qa <= 399))))) {\n                ta = \"Redirection\";\n                sa = \"Your access to Facebook was redirected or blocked by a third party at this time, please contact your ISP or reload. \";\n                var va = this.transport.getResponseHeader(\"Location\");\n                if (va) {\n                    ba(va, true);\n                }\n            ;\n            ;\n                ua = true;\n            }\n             else {\n                ta = \"Oops\";\n                sa = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n            }\n            \n        ;\n        ;\n            var wa = new h(this);\n            x(wa, {\n                error: qa,\n                errorSummary: ta,\n                errorDescription: sa,\n                silentError: ua\n            });\n            (function() {\n                g.inform(\"AsyncRequest/error\", {\n                    request: this,\n                    response: wa\n                });\n            }).bind(this).defer();\n            if (((ga() && !this.getOption(\"handleErrorAfterUnload\")))) {\n                return;\n            }\n        ;\n        ;\n            if (!this.transportErrorHandler) {\n                return;\n            }\n        ;\n        ;\n            var xa = this.transportErrorHandler.bind(this);\n            !this.getOption(\"suppressErrorAlerts\");\n            l.applyWithGuard(this._dispatchErrorResponse, this, [wa,xa,]);\n        },\n        _dispatchErrorResponse: function(pa, qa) {\n            var ra = pa.getError();\n            this.clearStatusIndicator();\n            var sa = ((this._sendTimeStamp && {\n                duration: ((JSBNG__Date.now() - this._sendTimeStamp)),\n                xfb_ip: ((this._xFbServer || \"-\"))\n            }));\n            pa.logError(\"async_error\", sa);\n            if (((!this._isRelevant() || ((ra === 1010))))) {\n                this.abort();\n                return;\n            }\n        ;\n        ;\n            if (((((((((ra == 1357008)) || ((ra == 1357007)))) || ((ra == 1442002)))) || ((ra == 1357001))))) {\n                var ta = ((((ra == 1357008)) || ((ra == 1357007))));\n                this.interceptHandler(pa);\n                this._displayServerDialog(pa, ta);\n            }\n             else if (((this.initialHandler(pa) !== false))) {\n                JSBNG__clearTimeout(this.timer);\n                try {\n                    qa(pa);\n                } catch (ua) {\n                    this.finallyHandler(pa);\n                    throw ua;\n                };\n            ;\n                this.finallyHandler(pa);\n            }\n            \n        ;\n        ;\n        },\n        _displayServerDialog: function(pa, qa) {\n            var ra = pa.getPayload();\n            if (((ra.__dialog !== undefined))) {\n                this._displayServerLegacyDialog(pa, qa);\n                return;\n            }\n        ;\n        ;\n            var sa = ra.__dialogx;\n            new r().handle(sa);\n            i.loadModules([\"ConfirmationDialog\",], function(ta) {\n                ta.setupConfirmation(pa, this);\n            }.bind(this));\n        },\n        _displayServerLegacyDialog: function(pa, qa) {\n            var ra = pa.getPayload().__dialog;\n            i.loadModules([\"Dialog\",], function(sa) {\n                var ta = new sa(ra);\n                if (qa) {\n                    ta.setHandler(this._displayConfirmationHandler.bind(this, ta));\n                }\n            ;\n            ;\n                ta.setCancelHandler(function() {\n                    var ua = this.getServerDialogCancelHandler();\n                    try {\n                        ((ua && ua(pa)));\n                    } catch (va) {\n                        throw va;\n                    } finally {\n                        this.finallyHandler(pa);\n                    };\n                ;\n                }.bind(this)).setCausalElement(this.relativeTo).show();\n            }.bind(this));\n        },\n        _displayConfirmationHandler: function(pa) {\n            this.data.confirmed = 1;\n            x(this.data, pa.getFormData());\n            this.send();\n        },\n        setJSONPTransport: function(pa) {\n            pa.subscribe(\"response\", this._handleJSONPResponse.bind(this));\n            pa.subscribe(\"abort\", this._handleJSONPAbort.bind(this));\n            this.transport = pa;\n        },\n        _handleJSONPResponse: function(pa, qa) {\n            this.is_first = ((this.is_first === undefined));\n            var ra = this._interpretResponse(qa);\n            ra.asyncResponse.is_first = this.is_first;\n            ra.asyncResponse.is_last = this.transport.hasFinished();\n            this.invokeResponseHandler(ra);\n            if (this.transport.hasFinished()) {\n                delete this.transport;\n            }\n        ;\n        ;\n        },\n        _handleJSONPAbort: function() {\n            this._invokeErrorHandler();\n            delete this.transport;\n        },\n        _handleXHRResponse: function(pa) {\n            var qa;\n            if (this.getOption(\"suppressEvaluation\")) {\n                qa = {\n                    asyncResponse: new h(this, pa)\n                };\n            }\n             else {\n                var ra = pa.responseText, sa = null;\n                try {\n                    var ua = this._unshieldResponseText(ra);\n                    try {\n                        var va = (eval)(((((\"(\" + ua)) + \")\")));\n                        qa = this._interpretResponse(va);\n                    } catch (ta) {\n                        sa = \"excep\";\n                        qa = {\n                            transportError: ((\"eval() failed on async to \" + this.getURI()))\n                        };\n                    };\n                ;\n                } catch (ta) {\n                    sa = \"empty\";\n                    qa = {\n                        transportError: ta.message\n                    };\n                };\n            ;\n                if (sa) {\n                    var wa = a.ErrorSignal;\n                    ((wa && wa.sendErrorSignal(\"async_xport_resp\", [((((this._xFbServer ? \"1008_\" : \"1012_\")) + sa)),((this._xFbServer || \"-\")),this.getURI(),ra.length,ra.substr(0, 1600),].join(\":\"))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.invokeResponseHandler(qa);\n        },\n        _unshieldResponseText: function(pa) {\n            var qa = \"for (;;);\", ra = qa.length;\n            if (((pa.length <= ra))) {\n                throw new Error(((\"Response too short on async to \" + this.getURI())));\n            }\n        ;\n        ;\n            var sa = 0;\n            while (((((pa.charAt(sa) == \" \")) || ((pa.charAt(sa) == \"\\u000a\"))))) {\n                sa++;\n            ;\n            };\n        ;\n            ((sa && ((pa.substring(sa, ((sa + ra))) == qa))));\n            return pa.substring(((sa + ra)));\n        },\n        _interpretResponse: function(pa) {\n            if (pa.redirect) {\n                return {\n                    redirect: pa.redirect\n                };\n            }\n        ;\n        ;\n            var qa = new h(this);\n            if (((pa.__ar != 1))) {\n                qa.payload = pa;\n            }\n             else x(qa, pa);\n        ;\n        ;\n            return {\n                asyncResponse: qa\n            };\n        },\n        _onStateChange: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270), function() {\n            try {\n                if (((this.transport.readyState == 4))) {\n                    na._inflightCount--;\n                    na._inflightPurge();\n                    try {\n                        if (((((typeof (this.transport.getResponseHeader) !== \"undefined\")) && this.transport.getResponseHeader(\"X-FB-Debug\")))) {\n                            this._xFbServer = this.transport.getResponseHeader(\"X-FB-Debug\");\n                        }\n                    ;\n                    ;\n                    } catch (qa) {\n                    \n                    };\n                ;\n                    if (((((this.transport.JSBNG__status >= 200)) && ((this.transport.JSBNG__status < 300))))) {\n                        na.lastSuccessTime = JSBNG__Date.now();\n                        this._handleXHRResponse(this.transport);\n                    }\n                     else if (((t.webkit() && ((typeof (this.transport.JSBNG__status) == \"undefined\"))))) {\n                        this._invokeErrorHandler(1002);\n                    }\n                     else if (((((k.retry_ajax_on_network_error && ja(this.transport))) && ((this.remainingRetries > 0))))) {\n                        this.remainingRetries--;\n                        delete this.transport;\n                        this.send(true);\n                        return;\n                    }\n                     else this._invokeErrorHandler();\n                    \n                    \n                ;\n                ;\n                    if (((this.getOption(\"asynchronous\") !== false))) {\n                        delete this.transport;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            } catch (pa) {\n                if (ga()) {\n                    return;\n                }\n            ;\n            ;\n                delete this.transport;\n                if (((this.remainingRetries > 0))) {\n                    this.remainingRetries--;\n                    this.send(true);\n                }\n                 else {\n                    !this.getOption(\"suppressErrorAlerts\");\n                    var ra = a.ErrorSignal;\n                    ((ra && ra.sendErrorSignal(\"async_xport_resp\", [1007,((this._xFbServer || \"-\")),this.getURI(),pa.message,].join(\":\"))));\n                    this._invokeErrorHandler(1007);\n                }\n            ;\n            ;\n            };\n        ;\n        })),\n        _isMultiplexable: function() {\n            if (((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))) {\n                return false;\n            }\n        ;\n        ;\n            if (!this.uri.isFacebookURI()) {\n                return false;\n            }\n        ;\n        ;\n            if (!this.getOption(\"asynchronous\")) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        handleResponse: function(pa) {\n            var qa = this._interpretResponse(pa);\n            this.invokeResponseHandler(qa);\n        },\n        setMethod: function(pa) {\n            this.method = pa.toString().toUpperCase();\n            return this;\n        },\n        getMethod: function() {\n            return this.method;\n        },\n        setData: function(pa) {\n            this.data = pa;\n            return this;\n        },\n        _setDataHash: function() {\n            if (((((this.method != \"POST\")) || this.data.phstamp))) {\n                return;\n            }\n        ;\n        ;\n            if (((typeof this.data.fb_dtsg !== \"string\"))) {\n                return;\n            }\n        ;\n        ;\n            var pa = s.implodeQuery(this.data).length, qa = \"\";\n            for (var ra = 0; ((ra < this.data.fb_dtsg.length)); ra++) {\n                qa += this.data.fb_dtsg.charCodeAt(ra);\n            ;\n            };\n        ;\n            this.data.phstamp = ((((\"1\" + qa)) + pa));\n        },\n        setRawData: function(pa) {\n            this.rawData = pa;\n            return this;\n        },\n        getData: function() {\n            return this.data;\n        },\n        setContextData: function(pa, qa, ra) {\n            ra = ((((ra === undefined)) ? true : ra));\n            if (ra) {\n                this.context[((\"_log_\" + pa))] = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        _setUserActionID: function() {\n            var pa = ((((a.ArbiterMonitor && a.ArbiterMonitor.getUE())) || \"-\"));\n            this.userActionID = ((((((((a.EagleEye && a.EagleEye.getSessionID())) || \"-\")) + \"/\")) + pa));\n        },\n        setURI: function(pa) {\n            var qa = s(pa);\n            if (((this.getOption(\"useIframeTransport\") && !qa.isFacebookURI()))) {\n                return this;\n            }\n        ;\n        ;\n            if (((((((!this._allowCrossOrigin && !this.getOption(\"jsonp\"))) && !this.getOption(\"useIframeTransport\"))) && !qa.isSameOrigin()))) {\n                return this;\n            }\n        ;\n        ;\n            this._setUserActionID();\n            if (((!pa || qa.isEmpty()))) {\n                var ra = a.ErrorSignal, sa = a.getErrorStack;\n                if (((ra && sa))) {\n                    var ta = {\n                        err_code: 1013,\n                        vip: \"-\",\n                        duration: 0,\n                        xfb_ip: \"-\",\n                        path: window.JSBNG__location.href,\n                        aid: this.userActionID\n                    };\n                    ra.sendErrorSignal(\"async_error\", JSON.stringify(ta));\n                    ra.sendErrorSignal(\"async_xport_stack\", [1013,window.JSBNG__location.href,null,sa(),].join(\":\"));\n                }\n            ;\n            ;\n                return this;\n            }\n        ;\n        ;\n            this.uri = qa;\n            return this;\n        },\n        getURI: function() {\n            return this.uri.toString();\n        },\n        setInitialHandler: function(pa) {\n            this.initialHandler = pa;\n            return this;\n        },\n        setHandler: function(pa) {\n            if (ka(pa)) {\n                this.handler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        getHandler: function() {\n            return this.handler;\n        },\n        setUploadProgressHandler: function(pa) {\n            if (ka(pa)) {\n                this.uploadProgressHandler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setErrorHandler: function(pa) {\n            if (ka(pa)) {\n                this.errorHandler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setTransportErrorHandler: function(pa) {\n            this.transportErrorHandler = pa;\n            return this;\n        },\n        getErrorHandler: function() {\n            return this.errorHandler;\n        },\n        getTransportErrorHandler: function() {\n            return this.transportErrorHandler;\n        },\n        setTimeoutHandler: function(pa, qa) {\n            if (ka(qa)) {\n                this.timeout = pa;\n                this.timeoutHandler = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        resetTimeout: function(pa) {\n            if (!((this.timeoutHandler === null))) {\n                if (((pa === null))) {\n                    this.timeout = null;\n                    JSBNG__clearTimeout(this.timer);\n                    this.timer = null;\n                }\n                 else {\n                    var qa = !this._allowCrossPageTransition;\n                    this.timeout = pa;\n                    JSBNG__clearTimeout(this.timer);\n                    this.timer = this._handleTimeout.bind(this).defer(this.timeout, qa);\n                }\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        _handleTimeout: function() {\n            this.abandon();\n            this.timeoutHandler(this);\n        },\n        setNewSerial: function() {\n            this.id = ++la;\n            return this;\n        },\n        setInterceptHandler: function(pa) {\n            this.interceptHandler = pa;\n            return this;\n        },\n        setFinallyHandler: function(pa) {\n            this.finallyHandler = pa;\n            return this;\n        },\n        setAbortHandler: function(pa) {\n            this.abortHandler = pa;\n            return this;\n        },\n        getServerDialogCancelHandler: function() {\n            return this.serverDialogCancelHandler;\n        },\n        setServerDialogCancelHandler: function(pa) {\n            this.serverDialogCancelHandler = pa;\n            return this;\n        },\n        setPreBootloadHandler: function(pa) {\n            this.preBootloadHandler = pa;\n            return this;\n        },\n        setReadOnly: function(pa) {\n            if (!((typeof (pa) != \"boolean\"))) {\n                this.readOnly = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setFBMLForm: function() {\n            this.writeRequiredParams = [\"fb_sig\",];\n            return this;\n        },\n        getReadOnly: function() {\n            return this.readOnly;\n        },\n        setRelativeTo: function(pa) {\n            this.relativeTo = pa;\n            return this;\n        },\n        getRelativeTo: function() {\n            return this.relativeTo;\n        },\n        setStatusClass: function(pa) {\n            this.statusClass = pa;\n            return this;\n        },\n        setStatusElement: function(pa) {\n            this.statusElement = pa;\n            return this;\n        },\n        getStatusElement: function() {\n            return aa(this.statusElement);\n        },\n        _isRelevant: function() {\n            if (this._allowCrossPageTransition) {\n                return true;\n            }\n        ;\n        ;\n            if (!this.id) {\n                return true;\n            }\n        ;\n        ;\n            return ((this.id > ma));\n        },\n        clearStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.removeClass(pa, \"async_saving\");\n                j.removeClass(pa, this.statusClass);\n            }\n        ;\n        ;\n        },\n        addStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.addClass(pa, \"async_saving\");\n                j.addClass(pa, this.statusClass);\n            }\n        ;\n        ;\n        },\n        specifiesWriteRequiredParams: function() {\n            return this.writeRequiredParams.every(function(pa) {\n                this.data[pa] = ((((this.data[pa] || k[pa])) || ((aa(pa) || {\n                })).value));\n                if (((this.data[pa] !== undefined))) {\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            }, this);\n        },\n        setOption: function(pa, qa) {\n            if (((typeof (this.option[pa]) != \"undefined\"))) {\n                this.option[pa] = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        getOption: function(pa) {\n            ((typeof (this.option[pa]) == \"undefined\"));\n            return this.option[pa];\n        },\n        abort: function() {\n            if (this.transport) {\n                var pa = this.getTransportErrorHandler();\n                this.setOption(\"suppressErrorAlerts\", true);\n                this.setTransportErrorHandler(y);\n                this._requestAborted = true;\n                this.transport.abort();\n                this.setTransportErrorHandler(pa);\n            }\n        ;\n        ;\n            this.abortHandler();\n        },\n        abandon: function() {\n            JSBNG__clearTimeout(this.timer);\n            this.setOption(\"suppressErrorAlerts\", true).setHandler(y).setErrorHandler(y).setTransportErrorHandler(y);\n            if (this.transport) {\n                this._requestAborted = true;\n                this.transport.abort();\n            }\n        ;\n        ;\n        },\n        setNectarData: function(pa) {\n            if (pa) {\n                if (((this.data.nctr === undefined))) {\n                    this.data.nctr = {\n                    };\n                }\n            ;\n            ;\n                x(this.data.nctr, pa);\n            }\n        ;\n        ;\n            return this;\n        },\n        setNectarModuleDataSafe: function(pa) {\n            if (this.setNectarModuleData) {\n                this.setNectarModuleData(pa);\n            }\n        ;\n        ;\n            return this;\n        },\n        setNectarImpressionIdSafe: function() {\n            if (this.setNectarImpressionId) {\n                this.setNectarImpressionId();\n            }\n        ;\n        ;\n            return this;\n        },\n        setAllowCrossPageTransition: function(pa) {\n            this._allowCrossPageTransition = !!pa;\n            if (this.timer) {\n                this.resetTimeout(this.timeout);\n            }\n        ;\n        ;\n            return this;\n        },\n        setAllowCrossOrigin: function(pa) {\n            this._allowCrossOrigin = pa;\n            return this;\n        },\n        send: function(pa) {\n            pa = ((pa || false));\n            if (!this.uri) {\n                return false;\n            }\n        ;\n        ;\n            ((!this.errorHandler && !this.getOption(\"suppressErrorHandlerWarning\")));\n            if (((this.getOption(\"jsonp\") && ((this.method != \"GET\"))))) {\n                this.setMethod(\"GET\");\n            }\n        ;\n        ;\n            if (((this.getOption(\"useIframeTransport\") && ((this.method != \"GET\"))))) {\n                this.setMethod(\"GET\");\n            }\n        ;\n        ;\n            ((((this.timeoutHandler !== null)) && ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))));\n            if (!this.getReadOnly()) {\n                this.specifiesWriteRequiredParams();\n                if (((this.method != \"POST\"))) {\n                    return false;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            x(this.data, u.getAsyncParams(this.method));\n            if (!ca(this.context)) {\n                x(this.data, this.context);\n                this.data.ajax_log = 1;\n            }\n        ;\n        ;\n            if (k.force_param) {\n                x(this.data, k.force_param);\n            }\n        ;\n        ;\n            this._setUserActionID();\n            if (((this.getOption(\"bundle\") && this._isMultiplexable()))) {\n                oa.schedule(this);\n                return true;\n            }\n        ;\n        ;\n            this.setNewSerial();\n            if (!this.getOption(\"asynchronous\")) {\n                this.uri.addQueryData({\n                    __s: 1\n                });\n            }\n        ;\n        ;\n            this.finallyHandler = v(this.finallyHandler, \"final\");\n            var qa, ra;\n            if (((((this.method == \"GET\")) || this.rawData))) {\n                qa = this.uri.addQueryData(this.data).toString();\n                ra = ((this.rawData || \"\"));\n            }\n             else {\n                qa = this.uri.toString();\n                this._setDataHash();\n                ra = s.implodeQuery(this.data);\n            }\n        ;\n        ;\n            if (this.transport) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))) {\n                d([\"JSONPTransport\",], function(va) {\n                    var wa = new va(((this.getOption(\"jsonp\") ? \"jsonp\" : \"div\")), this.uri);\n                    this.setJSONPTransport(wa);\n                    wa.send();\n                }.bind(this));\n                return true;\n            }\n        ;\n        ;\n            var sa = u.create();\n            if (!sa) {\n                return false;\n            }\n        ;\n        ;\n            sa.onreadystatechange = v(this._onStateChange.bind(this), \"xhr\");\n            if (((this.uploadProgressHandler && ha(sa)))) {\n                sa.upload.JSBNG__onprogress = this.uploadProgressHandler.bind(this);\n            }\n        ;\n        ;\n            if (!pa) {\n                this.remainingRetries = this.getOption(\"retries\");\n            }\n        ;\n        ;\n            if (((a.ErrorSignal || a.ArbiterMonitor))) {\n                this._sendTimeStamp = ((this._sendTimeStamp || JSBNG__Date.now()));\n            }\n        ;\n        ;\n            this.transport = sa;\n            try {\n                this.transport.open(this.method, qa, this.getOption(\"asynchronous\"));\n            } catch (ta) {\n                return false;\n            };\n        ;\n            var ua = k.svn_rev;\n            if (ua) {\n                this.transport.setRequestHeader(\"X-SVN-Rev\", String(ua));\n            }\n        ;\n        ;\n            if (((((!this.uri.isSameOrigin() && !this.getOption(\"jsonp\"))) && !this.getOption(\"useIframeTransport\")))) {\n                if (!ia(this.transport)) {\n                    return false;\n                }\n            ;\n            ;\n                if (this.uri.isFacebookURI()) {\n                    this.transport.withCredentials = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((this.method == \"POST\")) && !this.rawData))) {\n                this.transport.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            }\n        ;\n        ;\n            g.inform(\"AsyncRequest/send\", {\n                request: this\n            });\n            this.addStatusIndicator();\n            this.transport.send(ra);\n            if (((this.timeout !== null))) {\n                this.resetTimeout(this.timeout);\n            }\n        ;\n        ;\n            na._inflightCount++;\n            na._inflightAdd(this);\n            return true;\n        }\n    });\n    function oa() {\n        this._requests = [];\n    };\n;\n    x(oa, {\n        multiplex: null,\n        schedule: function(pa) {\n            if (!oa.multiplex) {\n                oa.multiplex = new oa();\n                (function() {\n                    oa.multiplex.send();\n                    oa.multiplex = null;\n                }).defer();\n            }\n        ;\n        ;\n            oa.multiplex.add(pa);\n        }\n    });\n    x(oa.prototype, {\n        add: function(pa) {\n            this._requests.push(pa);\n        },\n        send: function() {\n            var pa = this._requests;\n            if (!pa.length) {\n                return;\n            }\n        ;\n        ;\n            var qa;\n            if (((pa.length === 1))) {\n                qa = pa[0];\n            }\n             else {\n                var ra = pa.map(function(sa) {\n                    return [sa.uri.getPath(),s.implodeQuery(sa.data),];\n                });\n                qa = new na(\"/ajax/proxy.php\").setAllowCrossPageTransition(true).setData({\n                    data: ra\n                }).setHandler(this._handler.bind(this)).setTransportErrorHandler(this._transportErrorHandler.bind(this));\n            }\n        ;\n        ;\n            qa.setOption(\"bundle\", false).send();\n        },\n        _handler: function(pa) {\n            var qa = pa.getPayload().responses;\n            if (((qa.length !== this._requests.length))) {\n                return;\n            }\n        ;\n        ;\n            for (var ra = 0; ((ra < this._requests.length)); ra++) {\n                var sa = this._requests[ra], ta = sa.uri.getPath();\n                sa.id = this.id;\n                if (((qa[ra][0] !== ta))) {\n                    sa.invokeResponseHandler({\n                        transportError: ((\"Wrong response order in bundled request to \" + ta))\n                    });\n                    continue;\n                }\n            ;\n            ;\n                sa.handleResponse(qa[ra][1]);\n            };\n        ;\n        },\n        _transportErrorHandler: function(pa) {\n            var qa = {\n                transportError: pa.errorDescription\n            }, ra = this._requests.map(function(sa) {\n                sa.id = this.id;\n                sa.invokeResponseHandler(qa);\n                return sa.uri.getPath();\n            });\n        }\n    });\n    e.exports = na;\n});\n__d(\"legacy:async\", [\"AsyncRequest\",\"AsyncResponse\",], function(a, b, c, d) {\n    a.AsyncRequest = b(\"AsyncRequest\");\n    a.AsyncResponse = b(\"AsyncResponse\");\n}, 3);\n__d(\"debounce\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k) {\n        if (((i == null))) {\n            i = 100;\n        }\n    ;\n    ;\n        var l;\n        function m(n, o, p, q, r) {\n            m.reset();\n            l = JSBNG__setTimeout(function() {\n                h.call(j, n, o, p, q, r);\n            }, i, !k);\n        };\n    ;\n        m.reset = function() {\n            JSBNG__clearTimeout(l);\n        };\n        return m;\n    };\n;\n    e.exports = g;\n});\n__d(\"LitestandViewportHeight\", [\"Arbiter\",\"CSS\",\"JSBNG__Event\",\"cx\",\"debounce\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"JSBNG__Event\"), j = b(\"cx\"), k = b(\"debounce\"), l = b(\"emptyFunction\"), m, n = {\n        SMALL: \"small\",\n        NORMAL: \"normal\",\n        LARGE: \"large\",\n        getSize: function() {\n            if (((m === \"-cx-PUBLIC-litestandViewportSize__small\"))) {\n                return n.SMALL;\n            }\n        ;\n        ;\n            if (((m === \"-cx-PUBLIC-litestandViewportSize__large\"))) {\n                return n.LARGE;\n            }\n        ;\n        ;\n            return n.NORMAL;\n        },\n        init: function(o) {\n            n.init = l;\n            var p = k(function() {\n                var q = JSBNG__document.documentElement, r = q.clientHeight, s;\n                if (((r <= o.max_small_height))) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__small\";\n                }\n                 else if (((r >= o.min_large_height))) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__large\";\n                }\n                \n            ;\n            ;\n                if (((s !== m))) {\n                    ((m && h.removeClass(q, m)));\n                    m = s;\n                    ((m && h.addClass(q, m)));\n                    g.inform(\"ViewportSizeChange\");\n                }\n            ;\n            ;\n            });\n            p();\n            i.listen(window, \"resize\", p);\n        }\n    };\n    e.exports = n;\n});\n__d(\"AsyncDOM\", [\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = {\n        invoke: function(j, k) {\n            for (var l = 0; ((l < j.length)); ++l) {\n                var m = j[l], n = m[0], o = m[1], p = m[2], q = m[3], r = ((((p && k)) || null));\n                if (o) {\n                    r = h.scry(((r || JSBNG__document.documentElement)), o)[0];\n                }\n            ;\n            ;\n                switch (n) {\n                  case \"eval\":\n                    (new Function(q)).apply(r);\n                    break;\n                  case \"hide\":\n                    g.hide(r);\n                    break;\n                  case \"show\":\n                    g.show(r);\n                    break;\n                  case \"setContent\":\n                    h.setContent(r, q);\n                    break;\n                  case \"appendContent\":\n                    h.appendContent(r, q);\n                    break;\n                  case \"prependContent\":\n                    h.prependContent(r, q);\n                    break;\n                  case \"insertAfter\":\n                    h.insertAfter(r, q);\n                    break;\n                  case \"insertBefore\":\n                    h.insertBefore(r, q);\n                    break;\n                  case \"remove\":\n                    h.remove(r);\n                    break;\n                  case \"replace\":\n                    h.replace(r, q);\n                    break;\n                  default:\n                \n                };\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Live\", [\"Arbiter\",\"AsyncDOM\",\"AsyncSignal\",\"ChannelConstants\",\"DataStore\",\"DOM\",\"ServerJS\",\"createArrayFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDOM\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"ServerJS\"), n = b(\"createArrayFrom\"), o = b(\"emptyFunction\");\n    function p(r, s) {\n        s = JSON.parse(JSON.stringify(s));\n        new m().setRelativeTo(r).handle(s);\n    };\n;\n    var q = {\n        logAll: false,\n        startup: function() {\n            q.startup = o;\n            g.subscribe(j.getArbiterType(\"live\"), q.handleMessage.bind(q));\n        },\n        lookupLiveNode: function(r, s) {\n            var t = l.scry(JSBNG__document.body, ((((((\".live_\" + r)) + \"_\")) + s)));\n            t.forEach(function(u) {\n                if (((k.get(u, \"seqnum\") === undefined))) {\n                    var v = JSON.parse(u.getAttribute(\"data-live\"));\n                    k.set(u, \"seqnum\", v.seq);\n                }\n            ;\n            ;\n            });\n            return t;\n        },\n        handleMessage: function(r, s) {\n            var t = s.obj, u = t.fbid, v = t.assoc, w = this.lookupLiveNode(u, v);\n            if (!w) {\n                return false;\n            }\n        ;\n        ;\n            w.forEach(function(x) {\n                if (t.expseq) {\n                    var y = k.get(x, \"seqnum\"), z = k.get(x, \"message_buffer\");\n                    if (((z === undefined))) {\n                        z = {\n                        };\n                        k.set(x, \"message_buffer\", z);\n                    }\n                ;\n                ;\n                    var aa = {\n                        obj: t\n                    };\n                    z[t.expseq] = aa;\n                    if (((t.expseq != y))) {\n                        q.log(\"mismatch\", t.fbid, t.expseq, y);\n                        return false;\n                    }\n                ;\n                ;\n                    while (true) {\n                        y = k.get(x, \"seqnum\");\n                        var ba = z[y];\n                        if (ba) {\n                            h.invoke(ba.obj.updates, x);\n                            if (ba.obj.js) {\n                                p(x, ba.obj.js);\n                            }\n                        ;\n                        ;\n                            q.log(\"seqmatch\", t.fbid, \"exp\", t.expseq, \"cur\", y);\n                            delete z[y];\n                        }\n                         else break;\n                    ;\n                    ;\n                    };\n                ;\n                }\n                 else {\n                    h.invoke(t.updates, x);\n                    if (t.js) {\n                        p(x, t.js);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        log: function() {\n            if (q.logAll) {\n                var r = n(arguments).join(\":\");\n                new i(\"/common/scribe_endpoint.php\", {\n                    c: \"live_sequence\",\n                    m: r\n                }).send();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"legacy:live-js\", [\"Live\",], function(a, b, c, d) {\n    a.Live = b(\"Live\");\n}, 3);\n__d(\"fbt\", [\"copyProperties\",\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"substituteTokens\"), i = function() {\n    \n    };\n    i._ = function(j, k) {\n        var l = {\n        };\n        for (var m = 0; ((m < k.length)); m++) {\n            g(l, k[m][1]);\n        ;\n        };\n    ;\n        return h(j, l);\n    };\n    i.param = function(j, k) {\n        var l = {\n        };\n        l[j] = k;\n        return [null,l,];\n    };\n    e.exports = i;\n});\n__d(\"LiveTimer\", [\"CSS\",\"DOM\",\"UserAgent\",\"emptyFunction\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"emptyFunction\"), k = b(\"fbt\"), l = b(\"tx\"), m = 1000, n = 60, o = 3600, p = 43200, q = 60, r = 20000, s = {\n        restart: function(t) {\n            this.serverTime = t;\n            this.localStartTime = ((JSBNG__Date.now() / 1000));\n            this.updateTimeStamps();\n        },\n        getApproximateServerTime: function() {\n            return ((this.getServerTimeOffset() + JSBNG__Date.now()));\n        },\n        getServerTimeOffset: function() {\n            return ((((this.serverTime - this.localStartTime)) * m));\n        },\n        updateTimeStamps: function() {\n            s.timestamps = h.scry(JSBNG__document.body, \"abbr.livetimestamp\");\n            s.startLoop(r);\n        },\n        addTimeStamps: function(t) {\n            if (!t) {\n                return;\n            }\n        ;\n        ;\n            s.timestamps = ((s.timestamps || []));\n            if (((h.isNodeOfType(t, \"abbr\") && g.hasClass(t, \"livetimestamp\")))) {\n                s.timestamps.push(t);\n            }\n             else {\n                var u = h.scry(t, \"abbr.livetimestamp\");\n                for (var v = 0; ((v < u.length)); ++v) {\n                    s.timestamps.push(u[v]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            s.startLoop(0);\n        },\n        startLoop: function(t) {\n            this.JSBNG__stop();\n            this.timeout = JSBNG__setTimeout(function() {\n                s.loop();\n            }, t);\n        },\n        JSBNG__stop: function() {\n            JSBNG__clearTimeout(this.timeout);\n        },\n        updateNode: function(t, u) {\n            s.updateNode = ((((i.ie() < 7)) ? j : h.setContent));\n            s.updateNode(t, u);\n        },\n        loop: function(t) {\n            if (t) {\n                s.updateTimeStamps();\n            }\n        ;\n        ;\n            var u = Math.floor(((s.getApproximateServerTime() / m))), v = -1;\n            ((s.timestamps && s.timestamps.forEach(function(x) {\n                var y = x.getAttribute(\"data-utime\"), z = x.getAttribute(\"data-shorten\"), aa = s.renderRelativeTime(u, y, z);\n                if (aa.text) {\n                    s.updateNode(x, aa.text);\n                }\n            ;\n            ;\n                if (((((aa.next != -1)) && ((((aa.next < v)) || ((v == -1))))))) {\n                    v = aa.next;\n                }\n            ;\n            ;\n            })));\n            if (((v != -1))) {\n                var w = Math.max(r, ((v * m)));\n                s.timeout = JSBNG__setTimeout(function() {\n                    s.loop();\n                }, w);\n            }\n        ;\n        ;\n        },\n        renderRelativeTime: function(t, u, v) {\n            var w = {\n                text: \"\",\n                next: -1\n            };\n            if (((((t - u)) > (p)))) {\n                return w;\n            }\n        ;\n        ;\n            var x = ((t - u)), y = Math.floor(((x / n))), z = Math.floor(((y / q)));\n            if (((y < 1))) {\n                if (v) {\n                    x = ((((x > 1)) ? x : 2));\n                    w.text = k._(\"{number} secs\", [k.param(\"number\", x),]);\n                    w.next = ((20 - ((x % 20))));\n                }\n                 else {\n                    w.text = \"a few seconds ago\";\n                    w.next = ((n - ((x % n))));\n                }\n            ;\n            ;\n                return w;\n            }\n        ;\n        ;\n            if (((z < 1))) {\n                if (((v && ((y == 1))))) {\n                    w.text = \"1 min\";\n                }\n                 else if (v) {\n                    w.text = k._(\"{number} mins\", [k.param(\"number\", y),]);\n                }\n                 else w.text = ((((y == 1)) ? \"about a minute ago\" : l._(\"{number} minutes ago\", {\n                    number: y\n                })));\n                \n            ;\n            ;\n                w.next = ((n - ((x % n))));\n                return w;\n            }\n        ;\n        ;\n            if (((z < 11))) {\n                w.next = ((o - ((x % o))));\n            }\n        ;\n        ;\n            if (((v && ((z == 1))))) {\n                w.text = \"1 hr\";\n            }\n             else if (v) {\n                w.text = k._(\"{number} hrs\", [k.param(\"number\", z),]);\n            }\n             else w.text = ((((z == 1)) ? \"about an hour ago\" : l._(\"{number} hours ago\", {\n                number: z\n            })));\n            \n        ;\n        ;\n            return w;\n        },\n        renderRelativeTimeToServer: function(t) {\n            return s.renderRelativeTime(Math.floor(((s.getApproximateServerTime() / m))), t);\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:live-timer\", [\"LiveTimer\",], function(a, b, c, d) {\n    a.LiveTimer = b(\"LiveTimer\");\n}, 3);\n__d(\"JSLogger\", [], function(a, b, c, d, e, f) {\n    var g = {\n        MAX_HISTORY: 500,\n        counts: {\n        },\n        categories: {\n        },\n        seq: 0,\n        pageId: ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(36),\n        forwarding: false\n    };\n    function h(l) {\n        if (((((l instanceof Error)) && a.ErrorUtils))) {\n            l = a.ErrorUtils.normalizeError(l);\n        }\n    ;\n    ;\n        try {\n            return JSON.stringify(l);\n        } catch (m) {\n            return \"{}\";\n        };\n    ;\n    };\n;\n    function i(l, JSBNG__event, m) {\n        if (!g.counts[l]) {\n            g.counts[l] = {\n            };\n        }\n    ;\n    ;\n        if (!g.counts[l][JSBNG__event]) {\n            g.counts[l][JSBNG__event] = 0;\n        }\n    ;\n    ;\n        m = ((((m == null)) ? 1 : Number(m)));\n        g.counts[l][JSBNG__event] += ((isFinite(m) ? m : 0));\n    };\n;\n    g.logAction = function(JSBNG__event, l, m) {\n        if (((this.type == \"bump\"))) {\n            i(this.cat, JSBNG__event, l);\n        }\n         else if (((this.type == \"rate\"))) {\n            ((l && i(this.cat, ((JSBNG__event + \"_n\")), m)));\n            i(this.cat, ((JSBNG__event + \"_d\")), m);\n        }\n         else {\n            var n = {\n                cat: this.cat,\n                type: this.type,\n                JSBNG__event: JSBNG__event,\n                data: ((((l != null)) ? h(l) : null)),\n                date: JSBNG__Date.now(),\n                seq: g.seq++\n            };\n            g.head = ((g.head ? (g.head.next = n) : (g.tail = n)));\n            while (((((g.head.seq - g.tail.seq)) > g.MAX_HISTORY))) {\n                g.tail = g.tail.next;\n            ;\n            };\n        ;\n            return n;\n        }\n        \n    ;\n    ;\n    };\n    function j(l) {\n        if (!g.categories[l]) {\n            g.categories[l] = {\n            };\n            var m = function(n) {\n                var o = {\n                    cat: l,\n                    type: n\n                };\n                g.categories[l][n] = function() {\n                    g.forwarding = false;\n                    var p = null;\n                    if (((JSBNG__document.domain != \"facebook.com\"))) {\n                        return;\n                    }\n                ;\n                ;\n                    p = g.logAction;\n                    if (/^\\/+(dialogs|plugins?)\\//.test(JSBNG__location.pathname)) {\n                        g.forwarding = false;\n                    }\n                     else try {\n                        p = a.JSBNG__top.require(\"JSLogger\")._.logAction;\n                        g.forwarding = ((p !== g.logAction));\n                    } catch (q) {\n                    \n                    }\n                ;\n                ;\n                    ((p && p.apply(o, arguments)));\n                };\n            };\n            m(\"debug\");\n            m(\"log\");\n            m(\"warn\");\n            m(\"error\");\n            m(\"bump\");\n            m(\"rate\");\n        }\n    ;\n    ;\n        return g.categories[l];\n    };\n;\n    function k(l, m) {\n        var n = [];\n        for (var o = ((m || g.tail)); o; o = o.next) {\n            if (((!l || l(o)))) {\n                var p = {\n                    type: o.type,\n                    cat: o.cat,\n                    date: o.date,\n                    JSBNG__event: o.JSBNG__event,\n                    seq: o.seq\n                };\n                if (o.data) {\n                    p.data = JSON.parse(o.data);\n                }\n            ;\n            ;\n                n.push(p);\n            }\n        ;\n        ;\n        };\n    ;\n        return n;\n    };\n;\n    e.exports = {\n        _: g,\n        DUMP_EVENT: \"jslogger/dump\",\n        create: j,\n        getEntries: k\n    };\n});\n__d(\"startsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = String(h);\n        j = Math.min(Math.max(((j || 0)), 0), k.length);\n        return ((k.lastIndexOf(String(i), j) === j));\n    };\n;\n    e.exports = g;\n});\n__d(\"getContextualParent\", [\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\");\n    function h(i, j) {\n        var k, l = false;\n        do {\n            if (((i.getAttribute && (k = i.getAttribute(\"data-ownerid\"))))) {\n                i = g(k);\n                l = true;\n            }\n             else i = i.parentNode;\n        ;\n        ;\n        } while (((((j && i)) && !l)));\n        return i;\n    };\n;\n    e.exports = h;\n});\n__d(\"Nectar\", [\"Env\",\"startsWith\",\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"startsWith\"), i = b(\"getContextualParent\");\n    function j(m) {\n        if (!m.nctr) {\n            m.nctr = {\n            };\n        }\n    ;\n    ;\n    };\n;\n    function k(m) {\n        if (((g.module || !m))) {\n            return g.module;\n        }\n    ;\n    ;\n        var n = {\n            fbpage_fan_confirm: true,\n            photos_snowlift: true\n        }, o;\n        while (((m && m.getAttributeNode))) {\n            var p = ((m.getAttributeNode(\"id\") || {\n            })).value;\n            if (h(p, \"pagelet_\")) {\n                return p;\n            }\n        ;\n        ;\n            if (((!o && n[p]))) {\n                o = p;\n            }\n        ;\n        ;\n            m = i(m);\n        };\n    ;\n        return o;\n    };\n;\n    var l = {\n        addModuleData: function(m, n) {\n            var o = k(n);\n            if (o) {\n                j(m);\n                m.nctr._mod = o;\n            }\n        ;\n        ;\n        },\n        addImpressionID: function(m) {\n            if (g.impid) {\n                j(m);\n                m.nctr._impid = g.impid;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BrowserSupport\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = {\n    }, i = [\"Webkit\",\"Moz\",\"O\",\"ms\",], j = JSBNG__document.createElement(\"div\"), k = function(m) {\n        if (((h[m] === undefined))) {\n            var n = null;\n            if (((m in j.style))) {\n                n = m;\n            }\n             else for (var o = 0; ((o < i.length)); o++) {\n                var p = ((((i[o] + m.charAt(0).toUpperCase())) + m.slice(1)));\n                if (((p in j.style))) {\n                    n = p;\n                    break;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            h[m] = n;\n        }\n    ;\n    ;\n        return h[m];\n    }, l = {\n        hasCSSAnimations: function() {\n            return !!k(\"animationName\");\n        },\n        hasCSSTransforms: function() {\n            return !!k(\"transform\");\n        },\n        hasCSS3DTransforms: function() {\n            return !!k(\"perspective\");\n        },\n        hasCSSTransitions: function() {\n            return !!k(\"transition\");\n        },\n        hasPositionSticky: function() {\n            if (((h.sticky === undefined))) {\n                j.style.cssText = ((\"position:-webkit-sticky;position:-moz-sticky;\" + \"position:-o-sticky;position:-ms-sticky;position:sticky;\"));\n                h.sticky = /sticky/.test(j.style.position);\n            }\n        ;\n        ;\n            return h.sticky;\n        },\n        hasPointerEvents: function() {\n            if (((h.pointerEvents === undefined))) {\n                if (!((\"pointerEvents\" in j.style))) {\n                    h.pointerEvents = false;\n                }\n                 else {\n                    j.style.pointerEvents = \"auto\";\n                    j.style.pointerEvents = \"x\";\n                    g.appendContent(JSBNG__document.documentElement, j);\n                    h.pointerEvents = ((window.JSBNG__getComputedStyle && ((JSBNG__getComputedStyle(j, \"\").pointerEvents === \"auto\"))));\n                    g.remove(j);\n                }\n            ;\n            }\n        ;\n        ;\n            return h.pointerEvents;\n        },\n        getTransitionEndEvent: function() {\n            if (((h.transitionEnd === undefined))) {\n                var m = {\n                    transition: \"transitionend\",\n                    WebkitTransition: \"webkitTransitionEnd\",\n                    MozTransition: \"mozTransitionEnd\",\n                    OTransition: \"oTransitionEnd\"\n                }, n = k(\"transition\");\n                h.transitionEnd = ((m[n] || null));\n            }\n        ;\n        ;\n            return h.transitionEnd;\n        }\n    };\n    e.exports = l;\n});\n__d(\"hyphenate\", [], function(a, b, c, d, e, f) {\n    var g = /([A-Z])/g;\n    function h(i) {\n        return i.replace(g, \"-$1\").toLowerCase();\n    };\n;\n    e.exports = h;\n});\n__d(\"Style\", [\"DOMQuery\",\"UserAgent\",\"$\",\"copyProperties\",\"hyphenate\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"UserAgent\"), i = b(\"$\"), j = b(\"copyProperties\"), k = b(\"hyphenate\");\n    function l(s) {\n        return s.replace(/-(.)/g, function(t, u) {\n            return u.toUpperCase();\n        });\n    };\n;\n    function m(s, t) {\n        var u = r.get(s, t);\n        return ((((u === \"auto\")) || ((u === \"JSBNG__scroll\"))));\n    };\n;\n    var n = new RegExp(((((((((\"\\\\s*\" + \"([^\\\\s:]+)\")) + \"\\\\s*:\\\\s*\")) + \"([^;('\\\"]*(?:(?:\\\\([^)]*\\\\)|\\\"[^\\\"]*\\\"|'[^']*')[^;(?:'\\\"]*)*)\")) + \"(?:;|$)\")), \"g\");\n    function o(s) {\n        var t = {\n        };\n        s.replace(n, function(u, v, w) {\n            t[v] = w;\n        });\n        return t;\n    };\n;\n    function p(s) {\n        var t = \"\";\n        {\n            var fin36keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin36i = (0);\n            var u;\n            for (; (fin36i < fin36keys.length); (fin36i++)) {\n                ((u) = (fin36keys[fin36i]));\n                {\n                    if (s[u]) {\n                        t += ((((((u + \":\")) + s[u])) + \";\"));\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return t;\n    };\n;\n    function q(s) {\n        return ((((s !== \"\")) ? ((((\"alpha(opacity=\" + ((s * 100)))) + \")\")) : \"\"));\n    };\n;\n    var r = {\n        set: function(s, t, u) {\n            switch (t) {\n              case \"opacity\":\n                if (((t === \"opacity\"))) {\n                    if (((h.ie() < 9))) {\n                        s.style.filter = q(u);\n                    }\n                     else s.style.opacity = u;\n                ;\n                }\n            ;\n            ;\n                break;\n              case \"float\":\n                s.style.cssFloat = s.style.styleFloat = ((u || \"\"));\n                break;\n              default:\n                try {\n                    s.style[l(t)] = u;\n                } catch (v) {\n                    throw new Error(((((((((\"Style.set: \\\"\" + t)) + \"\\\" argument is invalid: \\\"\")) + u)) + \"\\\"\")));\n                };\n            ;\n            };\n        ;\n        },\n        apply: function(s, t) {\n            var u;\n            if (((((\"opacity\" in t)) && ((h.ie() < 9))))) {\n                var v = t.opacity;\n                t.filter = q(v);\n                delete t.opacity;\n            }\n        ;\n        ;\n            var w = o(s.style.cssText);\n            {\n                var fin37keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin37i = (0);\n                (0);\n                for (; (fin37i < fin37keys.length); (fin37i++)) {\n                    ((u) = (fin37keys[fin37i]));\n                    {\n                        var x = t[u];\n                        delete t[u];\n                        u = k(u);\n                        {\n                            var fin38keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin38i = (0);\n                            var y;\n                            for (; (fin38i < fin38keys.length); (fin38i++)) {\n                                ((y) = (fin38keys[fin38i]));\n                                {\n                                    if (((((y === u)) || ((y.indexOf(((u + \"-\"))) === 0))))) {\n                                        delete w[y];\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                        t[u] = x;\n                    };\n                };\n            };\n        ;\n            t = j(w, t);\n            s.style.cssText = p(t);\n            if (((h.ie() < 9))) {\n                {\n                    var fin39keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin39i = (0);\n                    (0);\n                    for (; (fin39i < fin39keys.length); (fin39i++)) {\n                        ((u) = (fin39keys[fin39i]));\n                        {\n                            if (!t[u]) {\n                                r.set(s, u, \"\");\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        get: function(s, t) {\n            s = i(s);\n            var u;\n            if (window.JSBNG__getComputedStyle) {\n                u = window.JSBNG__getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((JSBNG__document.defaultView && JSBNG__document.defaultView.JSBNG__getComputedStyle))) {\n                u = JSBNG__document.defaultView.JSBNG__getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t));\n                }\n            ;\n            ;\n                if (((t == \"display\"))) {\n                    return \"none\";\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            t = l(t);\n            if (s.currentStyle) {\n                if (((t === \"float\"))) {\n                    return ((s.currentStyle.cssFloat || s.currentStyle.styleFloat));\n                }\n            ;\n            ;\n                return s.currentStyle[t];\n            }\n        ;\n        ;\n            return ((s.style && s.style[t]));\n        },\n        getFloat: function(s, t) {\n            return parseFloat(r.get(s, t), 10);\n        },\n        getOpacity: function(s) {\n            s = i(s);\n            var t = r.get(s, \"filter\"), u = null;\n            if (((t && (u = /(\\d+(?:\\.\\d+)?)/.exec(t))))) {\n                return ((parseFloat(u.pop()) / 100));\n            }\n             else if (t = r.get(s, \"opacity\")) {\n                return parseFloat(t);\n            }\n             else return 1\n            \n        ;\n        },\n        isFixed: function(s) {\n            while (g.contains(JSBNG__document.body, s)) {\n                if (((r.get(s, \"position\") === \"fixed\"))) {\n                    return true;\n                }\n            ;\n            ;\n                s = s.parentNode;\n            };\n        ;\n            return false;\n        },\n        getScrollParent: function(s) {\n            if (!s) {\n                return null;\n            }\n        ;\n        ;\n            while (((s !== JSBNG__document.body))) {\n                if (((((m(s, \"overflow\") || m(s, \"overflowY\"))) || m(s, \"overflowX\")))) {\n                    return s;\n                }\n            ;\n            ;\n                s = s.parentNode;\n            };\n        ;\n            return window;\n        }\n    };\n    e.exports = r;\n});\n__d(\"shield\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if (((typeof h != \"function\"))) {\n            throw new TypeError();\n        }\n    ;\n    ;\n        var j = Array.prototype.slice.call(arguments, 2);\n        return function() {\n            return h.apply(i, j);\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"Animation\", [\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Style\"), l = b(\"shield\"), m, n = [], o;\n    function p(ga) {\n        if (((a == this))) {\n            return new p(ga);\n        }\n         else {\n            this.obj = ga;\n            this._reset_state();\n            this.queue = [];\n            this.last_attr = null;\n        }\n    ;\n    ;\n    };\n;\n    function q(ga) {\n        if (g.hasCSS3DTransforms()) {\n            return t(ga);\n        }\n         else return s(ga)\n    ;\n    };\n;\n    function r(ga) {\n        return ga.toFixed(8);\n    };\n;\n    function s(ga) {\n        ga = [ga[0],ga[4],ga[1],ga[5],ga[12],ga[13],];\n        return ((((\"matrix(\" + ga.map(r).join(\",\"))) + \")\"));\n    };\n;\n    function t(ga) {\n        return ((((\"matrix3d(\" + ga.map(r).join(\",\"))) + \")\"));\n    };\n;\n    function u(ga, ha) {\n        if (!ga) {\n            ga = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,];\n        }\n    ;\n    ;\n        var ia = [];\n        for (var ja = 0; ((ja < 4)); ja++) {\n            for (var ka = 0; ((ka < 4)); ka++) {\n                var la = 0;\n                for (var ma = 0; ((ma < 4)); ma++) {\n                    la += ((ga[((((ja * 4)) + ma))] * ha[((((ma * 4)) + ka))]));\n                ;\n                };\n            ;\n                ia[((((ja * 4)) + ka))] = la;\n            };\n        ;\n        };\n    ;\n        return ia;\n    };\n;\n    var v = 0;\n    p.prototype._reset_state = function() {\n        this.state = {\n            attrs: {\n            },\n            duration: 500\n        };\n    };\n    p.prototype.JSBNG__stop = function() {\n        this._reset_state();\n        this.queue = [];\n        return this;\n    };\n    p.prototype._build_container = function() {\n        if (this.container_div) {\n            this._refresh_container();\n            return;\n        }\n    ;\n    ;\n        if (((this.obj.firstChild && this.obj.firstChild.__animation_refs))) {\n            this.container_div = this.obj.firstChild;\n            this.container_div.__animation_refs++;\n            this._refresh_container();\n            return;\n        }\n    ;\n    ;\n        var ga = JSBNG__document.createElement(\"div\");\n        ga.style.padding = \"0px\";\n        ga.style.margin = \"0px\";\n        ga.style.border = \"0px\";\n        ga.__animation_refs = 1;\n        var ha = this.obj.childNodes;\n        while (ha.length) {\n            ga.appendChild(ha[0]);\n        ;\n        };\n    ;\n        this.obj.appendChild(ga);\n        this._orig_overflow = this.obj.style.overflow;\n        this.obj.style.overflow = \"hidden\";\n        this.container_div = ga;\n        this._refresh_container();\n    };\n    p.prototype._refresh_container = function() {\n        this.container_div.style.height = \"auto\";\n        this.container_div.style.width = \"auto\";\n        this.container_div.style.height = ((this.container_div.offsetHeight + \"px\"));\n        this.container_div.style.width = ((this.container_div.offsetWidth + \"px\"));\n    };\n    p.prototype._destroy_container = function() {\n        if (!this.container_div) {\n            return;\n        }\n    ;\n    ;\n        if (!--this.container_div.__animation_refs) {\n            var ga = this.container_div.childNodes;\n            while (ga.length) {\n                this.obj.appendChild(ga[0]);\n            ;\n            };\n        ;\n            this.obj.removeChild(this.container_div);\n        }\n    ;\n    ;\n        this.container_div = null;\n        this.obj.style.overflow = this._orig_overflow;\n    };\n    var w = 1, x = 2, y = 3;\n    p.prototype._attr = function(ga, ha, ia) {\n        ga = ga.replace(/-[a-z]/gi, function(ka) {\n            return ka.substring(1).toUpperCase();\n        });\n        var ja = false;\n        switch (ga) {\n          case \"background\":\n            this._attr(\"backgroundColor\", ha, ia);\n            return this;\n          case \"backgroundColor\":\n        \n          case \"borderColor\":\n        \n          case \"color\":\n            ha = ca(ha);\n            break;\n          case \"opacity\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"height\":\n        \n          case \"width\":\n            if (((ha == \"auto\"))) {\n                ja = true;\n            }\n             else ha = parseInt(ha, 10);\n        ;\n        ;\n            break;\n          case \"borderWidth\":\n        \n          case \"lineHeight\":\n        \n          case \"fontSize\":\n        \n          case \"margin\":\n        \n          case \"marginBottom\":\n        \n          case \"marginLeft\":\n        \n          case \"marginRight\":\n        \n          case \"marginTop\":\n        \n          case \"padding\":\n        \n          case \"paddingBottom\":\n        \n          case \"paddingLeft\":\n        \n          case \"paddingRight\":\n        \n          case \"paddingTop\":\n        \n          case \"bottom\":\n        \n          case \"left\":\n        \n          case \"right\":\n        \n          case \"JSBNG__top\":\n        \n          case \"scrollTop\":\n        \n          case \"scrollLeft\":\n            ha = parseInt(ha, 10);\n            break;\n          case \"rotateX\":\n        \n          case \"rotateY\":\n        \n          case \"rotateZ\":\n            ha = ((((parseInt(ha, 10) * Math.PI)) / 180));\n            break;\n          case \"translateX\":\n        \n          case \"translateY\":\n        \n          case \"translateZ\":\n        \n          case \"scaleX\":\n        \n          case \"scaleY\":\n        \n          case \"scaleZ\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"rotate3d\":\n            this._attr(\"rotateX\", ha[0], ia);\n            this._attr(\"rotateY\", ha[1], ia);\n            this._attr(\"rotateZ\", ha[2], ia);\n            return this;\n          case \"rotate\":\n            this._attr(\"rotateZ\", ha, ia);\n            return this;\n          case \"scale3d\":\n            this._attr(\"scaleZ\", ha[2], ia);\n          case \"scale\":\n            this._attr(\"scaleX\", ha[0], ia);\n            this._attr(\"scaleY\", ha[1], ia);\n            return this;\n          case \"translate3d\":\n            this._attr(\"translateZ\", ha[2], ia);\n          case \"translate\":\n            this._attr(\"translateX\", ha[0], ia);\n            this._attr(\"translateY\", ha[1], ia);\n            return this;\n          default:\n            throw new Error(((ga + \" is not a supported attribute!\")));\n        };\n    ;\n        if (((this.state.attrs[ga] === undefined))) {\n            this.state.attrs[ga] = {\n            };\n        }\n    ;\n    ;\n        if (ja) {\n            this.state.attrs[ga].auto = true;\n        }\n    ;\n    ;\n        switch (ia) {\n          case y:\n            this.state.attrs[ga].start = ha;\n            break;\n          case x:\n            this.state.attrs[ga].by = true;\n          case w:\n            this.state.attrs[ga].value = ha;\n            break;\n        };\n    ;\n    };\n    function z(ga) {\n        var ha = parseInt(k.get(ga, \"paddingLeft\"), 10), ia = parseInt(k.get(ga, \"paddingRight\"), 10), ja = parseInt(k.get(ga, \"borderLeftWidth\"), 10), ka = parseInt(k.get(ga, \"borderRightWidth\"), 10);\n        return ((((((((ga.offsetWidth - ((ha ? ha : 0)))) - ((ia ? ia : 0)))) - ((ja ? ja : 0)))) - ((ka ? ka : 0))));\n    };\n;\n    function aa(ga) {\n        var ha = parseInt(k.get(ga, \"paddingTop\"), 10), ia = parseInt(k.get(ga, \"paddingBottom\"), 10), ja = parseInt(k.get(ga, \"borderTopWidth\"), 10), ka = parseInt(k.get(ga, \"borderBottomWidth\"), 10);\n        return ((((((((ga.offsetHeight - ((ha ? ha : 0)))) - ((ia ? ia : 0)))) - ((ja ? ja : 0)))) - ((ka ? ka : 0))));\n    };\n;\n    p.prototype.to = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, w);\n        }\n         else {\n            this._attr(ga, ha, w);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.by = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, x);\n        }\n         else {\n            this._attr(ga, ha, x);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.from = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, y);\n        }\n         else {\n            this._attr(ga, ha, y);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.duration = function(ga) {\n        this.state.duration = ((ga ? ga : 0));\n        return this;\n    };\n    p.prototype.checkpoint = function(ga, ha) {\n        if (((ga === undefined))) {\n            ga = 1;\n        }\n    ;\n    ;\n        this.state.checkpoint = ga;\n        this.queue.push(this.state);\n        this._reset_state();\n        this.state.checkpointcb = ha;\n        return this;\n    };\n    p.prototype.blind = function() {\n        this.state.blind = true;\n        return this;\n    };\n    p.prototype.hide = function() {\n        this.state.hide = true;\n        return this;\n    };\n    p.prototype.show = function() {\n        this.state.show = true;\n        return this;\n    };\n    p.prototype.ease = function(ga) {\n        this.state.ease = ga;\n        return this;\n    };\n    p.prototype.go = function() {\n        var ga = JSBNG__Date.now();\n        this.queue.push(this.state);\n        for (var ha = 0; ((ha < this.queue.length)); ha++) {\n            this.queue[ha].start = ((ga - v));\n            if (this.queue[ha].checkpoint) {\n                ga += ((this.queue[ha].checkpoint * this.queue[ha].duration));\n            }\n        ;\n        ;\n        };\n    ;\n        da(this);\n        return this;\n    };\n    p.prototype._show = function() {\n        h.show(this.obj);\n    };\n    p.prototype._hide = function() {\n        h.hide(this.obj);\n    };\n    p.prototype._frame = function(ga) {\n        var ha = true, ia = false, ja;\n        function ka(db) {\n            return ((JSBNG__document.documentElement[db] || JSBNG__document.body[db]));\n        };\n    ;\n        for (var la = 0; ((la < this.queue.length)); la++) {\n            var ma = this.queue[la];\n            if (((ma.start > ga))) {\n                ha = false;\n                continue;\n            }\n        ;\n        ;\n            if (ma.checkpointcb) {\n                this._callback(ma.checkpointcb, ((ga - ma.start)));\n                ma.checkpointcb = null;\n            }\n        ;\n        ;\n            if (((ma.started === undefined))) {\n                if (ma.show) {\n                    this._show();\n                }\n            ;\n            ;\n                {\n                    var fin40keys = ((window.top.JSBNG_Replay.forInKeys)((ma.attrs))), fin40i = (0);\n                    var na;\n                    for (; (fin40i < fin40keys.length); (fin40i++)) {\n                        ((na) = (fin40keys[fin40i]));\n                        {\n                            if (((ma.attrs[na].start !== undefined))) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            switch (na) {\n                              case \"backgroundColor\":\n                            \n                              case \"borderColor\":\n                            \n                              case \"color\":\n                                ja = ca(k.get(this.obj, ((((na == \"borderColor\")) ? \"borderLeftColor\" : na))));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value[0] = Math.min(255, Math.max(0, ((ma.attrs[na].value[0] + ja[0]))));\n                                    ma.attrs[na].value[1] = Math.min(255, Math.max(0, ((ma.attrs[na].value[1] + ja[1]))));\n                                    ma.attrs[na].value[2] = Math.min(255, Math.max(0, ((ma.attrs[na].value[2] + ja[2]))));\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"opacity\":\n                                ja = k.getOpacity(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value = Math.min(1, Math.max(0, ((ma.attrs[na].value + ja))));\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"height\":\n                                ja = aa(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"width\":\n                                ja = z(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"scrollLeft\":\n                            \n                              case \"scrollTop\":\n                                ja = ((((this.obj === JSBNG__document.body)) ? ka(na) : this.obj[na]));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                ma[((\"last\" + na))] = ja;\n                                break;\n                              case \"rotateX\":\n                            \n                              case \"rotateY\":\n                            \n                              case \"rotateZ\":\n                            \n                              case \"translateX\":\n                            \n                              case \"translateY\":\n                            \n                              case \"translateZ\":\n                                ja = i.get(this.obj, na, 0);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"scaleX\":\n                            \n                              case \"scaleY\":\n                            \n                              case \"scaleZ\":\n                                ja = i.get(this.obj, na, 1);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              default:\n                                ja = ((parseInt(k.get(this.obj, na), 10) || 0));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                            };\n                        ;\n                            ma.attrs[na].start = ja;\n                        };\n                    };\n                };\n            ;\n                if (((((ma.attrs.height && ma.attrs.height.auto)) || ((ma.attrs.width && ma.attrs.width.auto))))) {\n                    this._destroy_container();\n                    {\n                        var fin41keys = ((window.top.JSBNG_Replay.forInKeys)(({\n                            height: 1,\n                            width: 1,\n                            fontSize: 1,\n                            borderLeftWidth: 1,\n                            borderRightWidth: 1,\n                            borderTopWidth: 1,\n                            borderBottomWidth: 1,\n                            paddingLeft: 1,\n                            paddingRight: 1,\n                            paddingTop: 1,\n                            paddingBottom: 1\n                        }))), fin41i = (0);\n                        var na;\n                        for (; (fin41i < fin41keys.length); (fin41i++)) {\n                            ((na) = (fin41keys[fin41i]));\n                            {\n                                if (ma.attrs[na]) {\n                                    this.obj.style[na] = ((ma.attrs[na].value + ((((typeof ma.attrs[na].value == \"number\")) ? \"px\" : \"\"))));\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (((ma.attrs.height && ma.attrs.height.auto))) {\n                        ma.attrs.height.value = aa(this.obj);\n                    }\n                ;\n                ;\n                    if (((ma.attrs.width && ma.attrs.width.auto))) {\n                        ma.attrs.width.value = z(this.obj);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                ma.started = true;\n                if (ma.blind) {\n                    this._build_container();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var oa = ((((ga - ma.start)) / ma.duration));\n            if (((oa >= 1))) {\n                oa = 1;\n                if (ma.hide) {\n                    this._hide();\n                }\n            ;\n            ;\n            }\n             else ha = false;\n        ;\n        ;\n            var pa = ((ma.ease ? ma.ease(oa) : oa));\n            if (((((!ia && ((oa != 1)))) && ma.blind))) {\n                ia = true;\n            }\n        ;\n        ;\n            {\n                var fin42keys = ((window.top.JSBNG_Replay.forInKeys)((ma.attrs))), fin42i = (0);\n                var na;\n                for (; (fin42i < fin42keys.length); (fin42i++)) {\n                    ((na) = (fin42keys[fin42i]));\n                    {\n                        switch (na) {\n                          case \"backgroundColor\":\n                        \n                          case \"borderColor\":\n                        \n                          case \"color\":\n                            if (((ma.attrs[na].start[3] != ma.attrs[na].value[3]))) {\n                                this.obj.style[na] = ((((((((((((((((\"rgba(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true))) + \",\")) + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true))) + \",\")) + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true))) + \",\")) + ba(pa, ma.attrs[na].start[3], ma.attrs[na].value[3], false))) + \")\"));\n                            }\n                             else this.obj.style[na] = ((((((((((((\"rgb(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true))) + \",\")) + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true))) + \",\")) + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true))) + \")\"));\n                        ;\n                        ;\n                            break;\n                          case \"opacity\":\n                            k.set(this.obj, \"opacity\", ba(pa, ma.attrs[na].start, ma.attrs[na].value));\n                            break;\n                          case \"height\":\n                        \n                          case \"width\":\n                            this.obj.style[na] = ((((((pa == 1)) && ma.attrs[na].auto)) ? \"auto\" : ((ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"))));\n                            break;\n                          case \"scrollLeft\":\n                        \n                          case \"scrollTop\":\n                            var qa = ((this.obj === JSBNG__document.body));\n                            ja = ((qa ? ka(na) : this.obj[na]));\n                            if (((ma[((\"last\" + na))] !== ja))) {\n                                delete ma.attrs[na];\n                            }\n                             else {\n                                var ra = ba(pa, ma.attrs[na].start, ma.attrs[na].value, true);\n                                if (!qa) {\n                                    ra = this.obj[na] = ra;\n                                }\n                                 else {\n                                    if (((na == \"scrollLeft\"))) {\n                                        a.JSBNG__scrollTo(ra, ka(\"scrollTop\"));\n                                    }\n                                     else a.JSBNG__scrollTo(ka(\"scrollLeft\"), ra);\n                                ;\n                                ;\n                                    ra = ka(na);\n                                }\n                            ;\n                            ;\n                                ma[((\"last\" + na))] = ra;\n                            }\n                        ;\n                        ;\n                            break;\n                          case \"translateX\":\n                        \n                          case \"translateY\":\n                        \n                          case \"translateZ\":\n                        \n                          case \"rotateX\":\n                        \n                          case \"rotateY\":\n                        \n                          case \"rotateZ\":\n                        \n                          case \"scaleX\":\n                        \n                          case \"scaleY\":\n                        \n                          case \"scaleZ\":\n                            i.set(this.obj, na, ba(pa, ma.attrs[na].start, ma.attrs[na].value, false));\n                            break;\n                          default:\n                            this.obj.style[na] = ((ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"));\n                            break;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n            var sa = null, ta = i.get(this.obj, \"translateX\", 0), ua = i.get(this.obj, \"translateY\", 0), va = i.get(this.obj, \"translateZ\", 0);\n            if (((((ta || ua)) || va))) {\n                sa = u(sa, [1,0,0,0,0,1,0,0,0,0,1,0,ta,ua,va,1,]);\n            }\n        ;\n        ;\n            var wa = i.get(this.obj, \"scaleX\", 1), xa = i.get(this.obj, \"scaleY\", 1), ya = i.get(this.obj, \"scaleZ\", 1);\n            if (((((((wa - 1)) || ((xa - 1)))) || ((ya - 1))))) {\n                sa = u(sa, [wa,0,0,0,0,xa,0,0,0,0,ya,0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var za = i.get(this.obj, \"rotateX\", 0);\n            if (za) {\n                sa = u(sa, [1,0,0,0,0,Math.cos(za),Math.sin(-za),0,0,Math.sin(za),Math.cos(za),0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var ab = i.get(this.obj, \"rotateY\", 0);\n            if (ab) {\n                sa = u(sa, [Math.cos(ab),0,Math.sin(ab),0,0,1,0,0,Math.sin(-ab),0,Math.cos(ab),0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var bb = i.get(this.obj, \"rotateZ\", 0);\n            if (bb) {\n                sa = u(sa, [Math.cos(bb),Math.sin(-bb),0,0,Math.sin(bb),Math.cos(bb),0,0,0,0,1,0,0,0,0,1,]);\n            }\n        ;\n        ;\n            if (sa) {\n                var cb = q(sa);\n                k.apply(this.obj, {\n                    \"-webkit-transform\": cb,\n                    \"-moz-transform\": cb,\n                    \"-ms-transform\": cb,\n                    \"-o-transform\": cb,\n                    transform: cb\n                });\n            }\n             else if (ha) {\n                k.apply(this.obj, {\n                    \"-webkit-transform\": null,\n                    \"-moz-transform\": null,\n                    \"-ms-transform\": null,\n                    \"-o-transform\": null,\n                    transform: null\n                });\n            }\n            \n        ;\n        ;\n            if (((oa == 1))) {\n                this.queue.splice(la--, 1);\n                this._callback(ma.ondone, ((((ga - ma.start)) - ma.duration)));\n            }\n        ;\n        ;\n        };\n    ;\n        if (((!ia && this.container_div))) {\n            this._destroy_container();\n        }\n    ;\n    ;\n        return !ha;\n    };\n    p.prototype.ondone = function(ga) {\n        this.state.ondone = ga;\n        return this;\n    };\n    p.prototype._callback = function(ga, ha) {\n        if (ga) {\n            v = ha;\n            ga.call(this);\n            v = 0;\n        }\n    ;\n    ;\n    };\n    function ba(ga, ha, ia, ja) {\n        return ((ja ? parseInt : parseFloat))(((((((ia - ha)) * ga)) + ha)), 10);\n    };\n;\n    function ca(ga) {\n        var ha = /^#([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i.exec(ga);\n        if (ha) {\n            return [parseInt(((((ha[1].length == 1)) ? ((ha[1] + ha[1])) : ha[1])), 16),parseInt(((((ha[2].length == 1)) ? ((ha[2] + ha[2])) : ha[2])), 16),parseInt(((((ha[3].length == 1)) ? ((ha[3] + ha[3])) : ha[3])), 16),1,];\n        }\n         else {\n            var ia = /^rgba? *\\(([0-9]+), *([0-9]+), *([0-9]+)(?:, *([0-9\\.]+))?\\)$/.exec(ga);\n            if (ia) {\n                return [parseInt(ia[1], 10),parseInt(ia[2], 10),parseInt(ia[3], 10),((ia[4] ? parseFloat(ia[4]) : 1)),];\n            }\n             else if (((ga == \"transparent\"))) {\n                return [255,255,255,0,];\n            }\n             else throw \"Named color attributes are not supported.\"\n            \n        ;\n        }\n    ;\n    ;\n    };\n;\n    function da(ga) {\n        n.push(ga);\n        if (((n.length === 1))) {\n            if (!m) {\n                var ha = ((((a.JSBNG__requestAnimationFrame || a.JSBNG__webkitRequestAnimationFrame)) || a.JSBNG__mozRequestAnimationFrame));\n                if (ha) {\n                    m = ha.bind(a);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (m) {\n                m(fa);\n            }\n             else o = JSBNG__setInterval(fa, 20, false);\n        ;\n        ;\n        }\n    ;\n    ;\n        if (m) {\n            ea();\n        }\n    ;\n    ;\n        fa(JSBNG__Date.now(), true);\n    };\n;\n    function ea() {\n        if (!m) {\n            throw new Error(\"Ending timer only valid with requestAnimationFrame\");\n        }\n    ;\n    ;\n        var ga = 0;\n        for (var ha = 0; ((ha < n.length)); ha++) {\n            var ia = n[ha];\n            for (var ja = 0; ((ja < ia.queue.length)); ja++) {\n                var ka = ((ia.queue[ja].start + ia.queue[ja].duration));\n                if (((ka > ga))) {\n                    ga = ka;\n                }\n            ;\n            ;\n            };\n        ;\n        };\n    ;\n        if (o) {\n            JSBNG__clearTimeout(o);\n            o = null;\n        }\n    ;\n    ;\n        var la = JSBNG__Date.now();\n        if (((ga > la))) {\n            o = JSBNG__setTimeout(l(fa), ((ga - la)), false);\n        }\n    ;\n    ;\n    };\n;\n    function fa(ga, ha) {\n        var ia = JSBNG__Date.now();\n        for (var ja = ((((ha === true)) ? ((n.length - 1)) : 0)); ((ja < n.length)); ja++) {\n            try {\n                if (!n[ja]._frame(ia)) {\n                    n.splice(ja--, 1);\n                }\n            ;\n            ;\n            } catch (ka) {\n                n.splice(ja--, 1);\n            };\n        ;\n        };\n    ;\n        if (((n.length === 0))) {\n            if (o) {\n                if (m) {\n                    JSBNG__clearTimeout(o);\n                }\n                 else JSBNG__clearInterval(o);\n            ;\n            ;\n                o = null;\n            }\n        ;\n        ;\n        }\n         else if (m) {\n            m(fa);\n        }\n        \n    ;\n    ;\n    };\n;\n    p.ease = {\n    };\n    p.ease.begin = function(ga) {\n        return ((Math.sin(((((Math.PI / 2)) * ((ga - 1))))) + 1));\n    };\n    p.ease.end = function(ga) {\n        return Math.sin(((((81098 * Math.PI)) * ga)));\n    };\n    p.ease.both = function(ga) {\n        return ((((81147 * Math.sin(((Math.PI * ((ga - 81171))))))) + 81176));\n    };\n    p.prependInsert = function(ga, ha) {\n        p.insert(ga, ha, j.prependContent);\n    };\n    p.appendInsert = function(ga, ha) {\n        p.insert(ga, ha, j.appendContent);\n    };\n    p.insert = function(ga, ha, ia) {\n        k.set(ha, \"opacity\", 0);\n        ia(ga, ha);\n        new p(ha).from(\"opacity\", 0).to(\"opacity\", 1).duration(400).go();\n    };\n    e.exports = p;\n});\n__d(\"BootloadedReact\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = function(j) {\n        g.loadModules([\"React\",], j);\n    }, i = {\n        isValidComponent: function(j) {\n            return ((((j && ((typeof j.mountComponentIntoNode === \"function\")))) && ((typeof j.receiveProps === \"function\"))));\n        },\n        initializeTouchEvents: function(j, k) {\n            h(function(l) {\n                l.initializeTouchEvents(j);\n                ((k && k()));\n            });\n        },\n        createClass: function(j, k) {\n            h(function(l) {\n                var m = l.createClass(j);\n                ((k && k(m)));\n            });\n        },\n        renderComponent: function(j, k, l) {\n            h(function(m) {\n                var n = m.renderComponent(j, k);\n                ((l && l(n)));\n            });\n        },\n        unmountAndReleaseReactRootNode: function(j, k) {\n            h(function(l) {\n                l.unmountAndReleaseReactRootNode(j);\n                ((k && k()));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ContextualThing\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        register: function(j, k) {\n            j.setAttribute(\"data-ownerid\", g.getID(k));\n        },\n        containsIncludingLayers: function(j, k) {\n            while (k) {\n                if (g.contains(j, k)) {\n                    return true;\n                }\n            ;\n            ;\n                k = i.getContext(k);\n            };\n        ;\n            return false;\n        },\n        getContext: function(j) {\n            var k;\n            while (j) {\n                if (((j.getAttribute && (k = j.getAttribute(\"data-ownerid\"))))) {\n                    return h(k);\n                }\n            ;\n            ;\n                j = j.parentNode;\n            };\n        ;\n            return null;\n        }\n    };\n    e.exports = i;\n});\n__d(\"DOMControl\", [\"DataStore\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.root = h(k);\n        this.updating = false;\n        g.set(k, \"DOMControl\", this);\n    };\n;\n    i(j.prototype, {\n        getRoot: function() {\n            return this.root;\n        },\n        beginUpdate: function() {\n            if (this.updating) {\n                return false;\n            }\n        ;\n        ;\n            this.updating = true;\n            return true;\n        },\n        endUpdate: function() {\n            this.updating = false;\n        },\n        update: function(k) {\n            if (!this.beginUpdate()) {\n                return this;\n            }\n        ;\n        ;\n            this.onupdate(k);\n            this.endUpdate();\n        },\n        onupdate: function(k) {\n        \n        }\n    });\n    j.getInstance = function(k) {\n        return g.get(k, \"DOMControl\");\n    };\n    e.exports = j;\n});\n__d(\"DOMDimensions\", [\"DOMQuery\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Style\"), i = {\n        getElementDimensions: function(j) {\n            return {\n                width: ((j.offsetWidth || 0)),\n                height: ((j.offsetHeight || 0))\n            };\n        },\n        getViewportDimensions: function() {\n            var j = ((((((((window && window.JSBNG__innerWidth)) || ((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientWidth)))) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientWidth)))) || 0)), k = ((((((((window && window.JSBNG__innerHeight)) || ((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientHeight)))) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientHeight)))) || 0));\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getViewportWithoutScrollbarDimensions: function() {\n            var j = ((((((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientWidth)) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientWidth)))) || 0)), k = ((((((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientHeight)) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientHeight)))) || 0));\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getDocumentDimensions: function(j) {\n            j = ((j || JSBNG__document));\n            var k = g.getDocumentScrollElement(j), l = ((k.scrollWidth || 0)), m = ((k.scrollHeight || 0));\n            return {\n                width: l,\n                height: m\n            };\n        },\n        measureElementBox: function(j, k, l, m, n) {\n            var o;\n            switch (k) {\n              case \"left\":\n            \n              case \"right\":\n            \n              case \"JSBNG__top\":\n            \n              case \"bottom\":\n                o = [k,];\n                break;\n              case \"width\":\n                o = [\"left\",\"right\",];\n                break;\n              case \"height\":\n                o = [\"JSBNG__top\",\"bottom\",];\n                break;\n              default:\n                throw Error(((\"Invalid plane: \" + k)));\n            };\n        ;\n            var p = function(q, r) {\n                var s = 0;\n                for (var t = 0; ((t < o.length)); t++) {\n                    s += ((parseInt(h.get(j, ((((((q + \"-\")) + o[t])) + r))), 10) || 0));\n                ;\n                };\n            ;\n                return s;\n            };\n            return ((((((l ? p(\"padding\", \"\") : 0)) + ((m ? p(\"border\", \"-width\") : 0)))) + ((n ? p(\"margin\", \"\") : 0))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"wrapFunction\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(i, j, k) {\n        j = ((j || \"default\"));\n        return function() {\n            var l = ((((j in g)) ? g[j](i, k) : i));\n            return l.apply(this, arguments);\n        };\n    };\n;\n    h.setWrapper = function(i, j) {\n        j = ((j || \"default\"));\n        g[j] = i;\n    };\n    e.exports = h;\n});\n__d(\"DOMEventListener\", [\"wrapFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"wrapFunction\"), h, i;\n    if (window.JSBNG__addEventListener) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((((k + \":\")) + l)));\n            k.JSBNG__addEventListener(l, m.wrapper, false);\n        };\n        i = function(k, l, m) {\n            k.JSBNG__removeEventListener(l, m.wrapper, false);\n        };\n    }\n     else if (window.JSBNG__attachEvent) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((((k + \":\")) + l)));\n            k.JSBNG__attachEvent(((\"JSBNG__on\" + l)), m.wrapper);\n        };\n        i = function(k, l, m) {\n            k.JSBNG__detachEvent(((\"JSBNG__on\" + l)), m.wrapper);\n        };\n    }\n    \n;\n;\n    var j = {\n        add: function(k, l, m) {\n            h(k, l, m);\n            return {\n                remove: function() {\n                    i(k, l, m);\n                    k = null;\n                }\n            };\n        },\n        remove: i\n    };\n    e.exports = j;\n});\n__d(\"DOMPosition\", [\"DOMDimensions\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = {\n        getScrollPosition: function() {\n            var j = h.getDocumentScrollElement();\n            return {\n                x: j.scrollLeft,\n                y: j.scrollTop\n            };\n        },\n        getNormalizedScrollPosition: function() {\n            var j = i.getScrollPosition(), k = g.getDocumentDimensions(), l = g.getViewportDimensions(), m = ((k.height - l.height)), n = ((k.width - l.width));\n            return {\n                y: Math.max(0, Math.min(j.y, m)),\n                x: Math.max(0, Math.min(j.x, n))\n            };\n        },\n        getElementPosition: function(j) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            var k = JSBNG__document.documentElement;\n            if (((!((\"getBoundingClientRect\" in j)) || !h.contains(k, j)))) {\n                return {\n                    x: 0,\n                    y: 0\n                };\n            }\n        ;\n        ;\n            var l = j.getBoundingClientRect(), m = ((Math.round(l.left) - k.clientLeft)), n = ((Math.round(l.JSBNG__top) - k.clientTop));\n            return {\n                x: m,\n                y: n\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"isInIframe\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return ((window != window.JSBNG__top));\n    };\n;\n    e.exports = g;\n});\n__d(\"DimensionTracking\", [\"Cookie\",\"DOMDimensions\",\"JSBNG__Event\",\"debounce\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"DOMDimensions\"), i = b(\"JSBNG__Event\"), j = b(\"debounce\"), k = b(\"isInIframe\");\n    {\n        function l() {\n            var m = h.getViewportDimensions();\n            g.set(\"wd\", ((((m.width + \"x\")) + m.height)));\n        };\n        ((window.top.JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_512.push)((l)));\n    };\n;\n    if (!k()) {\n        l.defer(100);\n        i.listen(window, \"resize\", j(l, 250));\n        i.listen(window, \"JSBNG__focus\", l);\n    }\n;\n;\n});\n__d(\"Focus\", [\"CSS\",\"DOM\",\"JSBNG__Event\",\"Run\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"Run\"), k = b(\"cx\"), l = b(\"ge\"), m = {\n    }, n, o = {\n        set: function(s) {\n            try {\n                s.tabIndex = s.tabIndex;\n                s.JSBNG__focus();\n            } catch (t) {\n            \n            };\n        ;\n        },\n        setWithoutOutline: function(s) {\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            var t = i.listen(s, \"JSBNG__blur\", function() {\n                g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n                t.remove();\n            });\n            o.set(s);\n        },\n        relocate: function(s, t) {\n            p();\n            var u = h.getID(s);\n            m[u] = t;\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            j.onLeave(r.curry(u));\n        },\n        reset: function(s) {\n            var t = h.getID(s);\n            g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            if (m[t]) {\n                g.removeClass(m[t], \"-cx-PRIVATE-focus__nativeoutline\");\n                delete m[t];\n            }\n        ;\n        ;\n        }\n    };\n    function p() {\n        if (n) {\n            return;\n        }\n    ;\n    ;\n        i.listen(JSBNG__document.documentElement, \"focusout\", q);\n        i.listen(JSBNG__document.documentElement, \"focusin\", q);\n        n = true;\n    };\n;\n    function q(JSBNG__event) {\n        var s = JSBNG__event.getTarget();\n        if (!g.hasClass(s, \"-cx-PRIVATE-focus__nooutline\")) {\n            return;\n        }\n    ;\n    ;\n        if (m[s.id]) {\n            g.conditionClass(m[s.id], \"-cx-PRIVATE-focus__nativeoutline\", ((((JSBNG__event.type === \"focusin\")) || ((JSBNG__event.type === \"JSBNG__focus\")))));\n        }\n    ;\n    ;\n    };\n;\n    function r(s) {\n        if (((m[s] && !l(s)))) {\n            delete m[s];\n        }\n    ;\n    ;\n    };\n;\n    e.exports = o;\n});\n__d(\"HighContrastMode\", [\"AsyncSignal\",\"Cookie\",\"CSS\",\"DOM\",\"Env\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Env\"), l = b(\"Style\"), m = null, n = {\n        init: function(o) {\n            if (((((m !== null)) && ((o.currentState != m))))) {\n                return;\n            }\n        ;\n        ;\n            var p = j.create(\"div\");\n            j.appendContent(JSBNG__document.body, p);\n            p.style.cssText = ((((((((((((((\"border: 1px solid;\" + \"border-color: red green;\")) + \"position: fixed;\")) + \"height: 5px;\")) + \"top: -999px;\")) + \"background-image: url(\")) + o.spacerImage)) + \");\"));\n            var q = l.get(p, \"background-image\"), r = l.get(p, \"border-top-color\"), s = l.get(p, \"border-right-color\"), t = ((((r == s)) || ((q && ((((q == \"none\")) || ((q == \"url(invalid-url:)\"))))))));\n            if (((t != o.currentState))) {\n                i.conditionClass(JSBNG__document.documentElement, \"highContrast\", t);\n                if (k.user) {\n                    h.set(\"highContrastMode\", ((t ? 1 : 0)));\n                    if (t) {\n                        new g(\"/ajax/highcontrast\").send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            j.remove(p);\n            m = t;\n        }\n    };\n    e.exports = n;\n});\n__d(\"Input\", [\"CSS\",\"DOMQuery\",\"DOMControl\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOMQuery\"), i = b(\"DOMControl\"), j = function(l) {\n        var m = l.getAttribute(\"maxlength\");\n        if (((m && ((m > 0))))) {\n            d([\"enforceMaxLength\",], function(n) {\n                n(l, m);\n            });\n        }\n    ;\n    ;\n    }, k = {\n        isEmpty: function(l) {\n            return ((!(/\\S/).test(((l.value || \"\"))) || g.hasClass(l, \"DOMControl_placeholder\")));\n        },\n        getValue: function(l) {\n            return ((k.isEmpty(l) ? \"\" : l.value));\n        },\n        setValue: function(l, m) {\n            g.removeClass(l, \"DOMControl_placeholder\");\n            l.value = ((m || \"\"));\n            j(l);\n            var n = i.getInstance(l);\n            ((((n && n.resetHeight)) && n.resetHeight()));\n        },\n        setPlaceholder: function(l, m) {\n            l.setAttribute(\"aria-label\", m);\n            l.setAttribute(\"placeholder\", m);\n            if (((l == JSBNG__document.activeElement))) {\n                return;\n            }\n        ;\n        ;\n            if (k.isEmpty(l)) {\n                g.conditionClass(l, \"DOMControl_placeholder\", m);\n                l.value = ((m || \"\"));\n            }\n        ;\n        ;\n        },\n        reset: function(l) {\n            var m = ((((l !== JSBNG__document.activeElement)) ? ((l.getAttribute(\"placeholder\") || \"\")) : \"\"));\n            l.value = m;\n            g.conditionClass(l, \"DOMControl_placeholder\", m);\n            l.style.height = \"\";\n        },\n        setSubmitOnEnter: function(l, m) {\n            g.conditionClass(l, \"enter_submit\", m);\n        },\n        getSubmitOnEnter: function(l) {\n            return g.hasClass(l, \"enter_submit\");\n        },\n        setMaxLength: function(l, m) {\n            if (((m > 0))) {\n                l.setAttribute(\"maxlength\", m);\n                j(l);\n            }\n             else l.removeAttribute(\"maxlength\");\n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"KeyEventController\", [\"DOM\",\"JSBNG__Event\",\"Run\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = b(\"isEmpty\");\n    function l() {\n        this.handlers = {\n        };\n        JSBNG__document.JSBNG__onkeyup = this.onkeyevent.bind(this, \"JSBNG__onkeyup\");\n        JSBNG__document.JSBNG__onkeydown = this.onkeyevent.bind(this, \"JSBNG__onkeydown\");\n        JSBNG__document.JSBNG__onkeypress = this.onkeyevent.bind(this, \"JSBNG__onkeypress\");\n    };\n;\n    j(l, {\n        instance: null,\n        getInstance: function() {\n            return ((l.instance || (l.instance = new l())));\n        },\n        defaultFilter: function(JSBNG__event, m) {\n            JSBNG__event = h.$E(JSBNG__event);\n            return ((((l.filterEventTypes(JSBNG__event, m) && l.filterEventTargets(JSBNG__event, m))) && l.filterEventModifiers(JSBNG__event, m)));\n        },\n        filterEventTypes: function(JSBNG__event, m) {\n            if (((m === \"JSBNG__onkeydown\"))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        filterEventTargets: function(JSBNG__event, m) {\n            var n = JSBNG__event.getTarget(), o = ((n.contentEditable === \"true\"));\n            return ((((!((o || g.isNodeOfType(n, l._interactiveElements))) || ((n.type in l._uninterestingTypes)))) || ((((JSBNG__event.keyCode in l._controlKeys)) && ((((g.isNodeOfType(n, [\"input\",\"textarea\",]) && ((n.value.length === 0)))) || ((o && ((g.getText(n).length === 0))))))))));\n        },\n        filterEventModifiers: function(JSBNG__event, m) {\n            if (((((((JSBNG__event.ctrlKey || JSBNG__event.altKey)) || JSBNG__event.metaKey)) || JSBNG__event.repeat))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        registerKey: function(m, n, o, p) {\n            if (((o === undefined))) {\n                o = l.defaultFilter;\n            }\n        ;\n        ;\n            var q = l.getInstance(), r = q.mapKey(m);\n            if (k(q.handlers)) {\n                i.onLeave(q.resetHandlers.bind(q));\n            }\n        ;\n        ;\n            var s = {\n            };\n            for (var t = 0; ((t < r.length)); t++) {\n                m = r[t];\n                if (((!q.handlers[m] || p))) {\n                    q.handlers[m] = [];\n                }\n            ;\n            ;\n                var u = {\n                    callback: n,\n                    filter: o\n                };\n                s[m] = u;\n                q.handlers[m].push(u);\n            };\n        ;\n            return {\n                remove: function() {\n                    {\n                        var fin43keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin43i = (0);\n                        var v;\n                        for (; (fin43i < fin43keys.length); (fin43i++)) {\n                            ((v) = (fin43keys[fin43i]));\n                            {\n                                if (((q.handlers[v] && q.handlers[v].length))) {\n                                    var w = q.handlers[v].indexOf(s[v]);\n                                    ((((w >= 0)) && q.handlers[v].splice(w, 1)));\n                                }\n                            ;\n                            ;\n                                delete s[v];\n                            };\n                        };\n                    };\n                ;\n                }\n            };\n        },\n        keyCodeMap: {\n            BACKSPACE: [8,],\n            TAB: [9,],\n            RETURN: [13,],\n            ESCAPE: [27,],\n            LEFT: [37,63234,],\n            UP: [38,63232,],\n            RIGHT: [39,63235,],\n            DOWN: [40,63233,],\n            DELETE: [46,],\n            COMMA: [188,],\n            PERIOD: [190,],\n            SLASH: [191,],\n            \"`\": [192,],\n            \"[\": [219,],\n            \"]\": [221,]\n        },\n        _interactiveElements: [\"input\",\"select\",\"textarea\",\"object\",\"embed\",],\n        _uninterestingTypes: {\n            button: 1,\n            checkbox: 1,\n            radio: 1,\n            submit: 1\n        },\n        _controlKeys: {\n            8: 1,\n            9: 1,\n            13: 1,\n            27: 1,\n            37: 1,\n            63234: 1,\n            38: 1,\n            63232: 1,\n            39: 1,\n            63235: 1,\n            40: 1,\n            63233: 1,\n            46: 1\n        }\n    });\n    j(l.prototype, {\n        mapKey: function(m) {\n            if (((((m >= 0)) && ((m <= 9))))) {\n                if (((typeof (m) != \"number\"))) {\n                    m = ((m.charCodeAt(0) - 48));\n                }\n            ;\n            ;\n                return [((48 + m)),((96 + m)),];\n            }\n        ;\n        ;\n            var n = l.keyCodeMap[m.toUpperCase()];\n            if (n) {\n                return n;\n            }\n        ;\n        ;\n            return [m.toUpperCase().charCodeAt(0),];\n        },\n        onkeyevent: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545), function(m, n) {\n            n = h.$E(n);\n            var o = ((this.handlers[n.keyCode] || this.handlers[n.which])), p, q, r;\n            if (o) {\n                for (var s = 0; ((s < o.length)); s++) {\n                    p = o[s].callback;\n                    q = o[s].filter;\n                    try {\n                        if (((!q || q(n, m)))) {\n                            r = p(n, m);\n                            if (((r === false))) {\n                                return h.kill(n);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    } catch (t) {\n                    \n                    };\n                ;\n                };\n            }\n        ;\n        ;\n            return true;\n        })),\n        resetHandlers: function() {\n            this.handlers = {\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"KeyStatus\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = null, i = null;\n    function j() {\n        if (!i) {\n            i = g.listen(window, \"JSBNG__blur\", function() {\n                h = null;\n                k();\n            });\n        }\n    ;\n    ;\n    };\n;\n    function k() {\n        if (i) {\n            i.remove();\n            i = null;\n        }\n    ;\n    ;\n    };\n;\n    g.listen(JSBNG__document.documentElement, \"keydown\", function(m) {\n        h = g.getKeyCode(m);\n        j();\n    }, g.Priority.URGENT);\n    g.listen(JSBNG__document.documentElement, \"keyup\", function(m) {\n        h = null;\n        k();\n    }, g.Priority.URGENT);\n    var l = {\n        isKeyDown: function() {\n            return !!h;\n        },\n        getKeyDownCode: function() {\n            return h;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BehaviorsMixin\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(l) {\n        this._behavior = l;\n        this._enabled = false;\n    };\n;\n    g(h.prototype, {\n        enable: function() {\n            if (!this._enabled) {\n                this._enabled = true;\n                this._behavior.enable();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (this._enabled) {\n                this._enabled = false;\n                this._behavior.disable();\n            }\n        ;\n        ;\n        }\n    });\n    var i = 1;\n    function j(l) {\n        if (!l.__BEHAVIOR_ID) {\n            l.__BEHAVIOR_ID = i++;\n        }\n    ;\n    ;\n        return l.__BEHAVIOR_ID;\n    };\n;\n    var k = {\n        enableBehavior: function(l) {\n            if (!this._behaviors) {\n                this._behaviors = {\n                };\n            }\n        ;\n        ;\n            var m = j(l);\n            if (!this._behaviors[m]) {\n                this._behaviors[m] = new h(new l(this));\n            }\n        ;\n        ;\n            this._behaviors[m].enable();\n            return this;\n        },\n        disableBehavior: function(l) {\n            if (this._behaviors) {\n                var m = j(l);\n                if (this._behaviors[m]) {\n                    this._behaviors[m].disable();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        enableBehaviors: function(l) {\n            l.forEach(this.enableBehavior.bind(this));\n            return this;\n        },\n        destroyBehaviors: function() {\n            if (this._behaviors) {\n                {\n                    var fin44keys = ((window.top.JSBNG_Replay.forInKeys)((this._behaviors))), fin44i = (0);\n                    var l;\n                    for (; (fin44i < fin44keys.length); (fin44i++)) {\n                        ((l) = (fin44keys[fin44i]));\n                        {\n                            this._behaviors[l].disable();\n                        ;\n                        };\n                    };\n                };\n            ;\n                this._behaviors = {\n                };\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"removeFromArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = h.indexOf(i);\n        ((((j != -1)) && h.splice(j, 1)));\n    };\n;\n    e.exports = g;\n});\n__d(\"Layer\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"BehaviorsMixin\",\"BootloadedReact\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"KeyEventController\",\"Parent\",\"Style\",\"copyProperties\",\"ge\",\"removeFromArray\",\"KeyStatus\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"BootloadedReact\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"HTML\"), p = b(\"KeyEventController\"), q = b(\"Parent\"), r = b(\"Style\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"removeFromArray\");\n    b(\"KeyStatus\");\n    var v = [];\n    function w(x, y) {\n        this._config = ((x || {\n        }));\n        if (y) {\n            this._configure(this._config, y);\n            var z = ((this._config.addedBehaviors || []));\n            this.enableBehaviors(this._getDefaultBehaviors().concat(z));\n        }\n    ;\n    ;\n    };\n;\n    s(w, h);\n    s(w, {\n        init: function(x, y) {\n            x.init(y);\n        },\n        initAndShow: function(x, y) {\n            x.init(y).show();\n        },\n        show: function(x) {\n            x.show();\n        },\n        getTopmostLayer: function() {\n            return v[((v.length - 1))];\n        }\n    });\n    s(w.prototype, h, i, {\n        _initialized: false,\n        _root: null,\n        _shown: false,\n        _hiding: false,\n        _causalElement: null,\n        _reactContainer: null,\n        init: function(x) {\n            this._configure(this._config, x);\n            var y = ((this._config.addedBehaviors || []));\n            this.enableBehaviors(this._getDefaultBehaviors().concat(y));\n            this._initialized = true;\n            return this;\n        },\n        _configure: function(x, y) {\n            if (y) {\n                var z = n.isNode(y), aa = ((((typeof y === \"string\")) || o.isHTML(y)));\n                this.containsReactComponent = j.isValidComponent(y);\n                if (aa) {\n                    y = o(y).getRootNode();\n                }\n                 else if (this.containsReactComponent) {\n                    var ba = JSBNG__document.createElement(\"div\");\n                    j.renderComponent(y, ba);\n                    y = this._reactContainer = ba;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            this._root = this._buildWrapper(x, y);\n            if (x.attributes) {\n                n.setAttributes(this._root, x.attributes);\n            }\n        ;\n        ;\n            if (x.classNames) {\n                x.classNames.forEach(l.addClass.curry(this._root));\n            }\n        ;\n        ;\n            l.addClass(this._root, \"uiLayer\");\n            if (x.causalElement) {\n                this._causalElement = t(x.causalElement);\n            }\n        ;\n        ;\n            if (x.permanent) {\n                this._permanent = x.permanent;\n            }\n        ;\n        ;\n            m.set(this._root, \"layer\", this);\n        },\n        _getDefaultBehaviors: function() {\n            return [];\n        },\n        getCausalElement: function() {\n            return this._causalElement;\n        },\n        setCausalElement: function(x) {\n            this._causalElement = x;\n            return this;\n        },\n        getInsertParent: function() {\n            return ((this._insertParent || JSBNG__document.body));\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getContentRoot: function() {\n            return this._root;\n        },\n        _buildWrapper: function(x, y) {\n            return y;\n        },\n        setInsertParent: function(x) {\n            if (x) {\n                if (((this._shown && ((x !== this.getInsertParent()))))) {\n                    n.appendContent(x, this.getRoot());\n                    this.updatePosition();\n                }\n            ;\n            ;\n                this._insertParent = x;\n            }\n        ;\n        ;\n            return this;\n        },\n        show: function() {\n            if (this._shown) {\n                return this;\n            }\n        ;\n        ;\n            var x = this.getRoot();\n            this.inform(\"beforeshow\");\n            r.set(x, \"visibility\", \"hidden\");\n            r.set(x, \"overflow\", \"hidden\");\n            l.show(x);\n            n.appendContent(this.getInsertParent(), x);\n            if (((this.updatePosition() !== false))) {\n                this._shown = true;\n                this.inform(\"show\");\n                w.inform(\"show\", this);\n                if (!this._permanent) {\n                    !function() {\n                        if (this._shown) {\n                            v.push(this);\n                        }\n                    ;\n                    ;\n                    }.bind(this).defer();\n                }\n            ;\n            ;\n            }\n             else l.hide(x);\n        ;\n        ;\n            r.set(x, \"visibility\", \"\");\n            r.set(x, \"overflow\", \"\");\n            this.inform(\"aftershow\");\n            return this;\n        },\n        hide: function() {\n            if (((((this._hiding || !this._shown)) || ((this.inform(\"beforehide\") === false))))) {\n                return this;\n            }\n        ;\n        ;\n            this._hiding = true;\n            if (((this.inform(\"starthide\") !== false))) {\n                this.finishHide();\n            }\n        ;\n        ;\n            return this;\n        },\n        conditionShow: function(x) {\n            return ((x ? this.show() : this.hide()));\n        },\n        finishHide: function() {\n            if (this._shown) {\n                if (!this._permanent) {\n                    u(v, this);\n                }\n            ;\n            ;\n                this._hiding = false;\n                this._shown = false;\n                l.hide(this.getRoot());\n                this.inform(\"hide\");\n                w.inform(\"hide\", this);\n            }\n        ;\n        ;\n        },\n        isShown: function() {\n            return this._shown;\n        },\n        updatePosition: function() {\n            return true;\n        },\n        destroy: function() {\n            if (this.containsReactComponent) {\n                j.unmountAndReleaseReactRootNode(this._reactContainer);\n            }\n        ;\n        ;\n            this.finishHide();\n            var x = this.getRoot();\n            n.remove(x);\n            this.destroyBehaviors();\n            this.inform(\"destroy\");\n            w.inform(\"destroy\", this);\n            m.remove(x, \"layer\");\n            this._root = this._causalElement = null;\n        }\n    });\n    g.listen(JSBNG__document.documentElement, \"keydown\", function(JSBNG__event) {\n        if (p.filterEventTargets(JSBNG__event, \"keydown\")) {\n            for (var x = ((v.length - 1)); ((x >= 0)); x--) {\n                if (((v[x].inform(\"key\", JSBNG__event) === false))) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n    }, g.Priority.URGENT);\n    g.listen(JSBNG__document.documentElement, \"click\", function(JSBNG__event) {\n        var x = v.length;\n        if (!x) {\n            return;\n        }\n    ;\n    ;\n        var y = JSBNG__event.getTarget();\n        if (!n.contains(JSBNG__document.documentElement, y)) {\n            return;\n        }\n    ;\n    ;\n        if (!y.offsetWidth) {\n            return;\n        }\n    ;\n    ;\n        if (q.byClass(y, \"generic_dialog\")) {\n            return;\n        }\n    ;\n    ;\n        while (x--) {\n            var z = v[x], aa = z.getContentRoot();\n            if (k.containsIncludingLayers(aa, y)) {\n                return;\n            }\n        ;\n        ;\n            if (((((z.inform(\"JSBNG__blur\") === false)) || z.isShown()))) {\n                return;\n            }\n        ;\n        ;\n        };\n    ;\n    });\n    e.exports = w;\n});\n__d(\"PopupWindow\", [\"DOMDimensions\",\"DOMQuery\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = b(\"Layer\"), j = b(\"copyProperties\"), k = {\n        _opts: {\n            allowShrink: true,\n            strategy: \"vector\",\n            timeout: 100,\n            widthElement: null\n        },\n        init: function(l) {\n            j(k._opts, l);\n            JSBNG__setInterval(k._resizeCheck, k._opts.timeout);\n        },\n        _resizeCheck: function() {\n            var l = g.getViewportDimensions(), m = k._getDocumentSize(), n = i.getTopmostLayer();\n            if (n) {\n                var o = n.getRoot().firstChild, p = g.getElementDimensions(o);\n                p.height += g.measureElementBox(o, \"height\", true, true, true);\n                p.width += g.measureElementBox(o, \"width\", true, true, true);\n                m.height = Math.max(m.height, p.height);\n                m.width = Math.max(m.width, p.width);\n            }\n        ;\n        ;\n            var q = ((m.height - l.height)), r = ((m.width - l.width));\n            if (((((r < 0)) && !k._opts.widthElement))) {\n                r = 0;\n            }\n        ;\n        ;\n            r = ((((r > 1)) ? r : 0));\n            if (((!k._opts.allowShrink && ((q < 0))))) {\n                q = 0;\n            }\n        ;\n        ;\n            if (((q || r))) {\n                try {\n                    ((window.JSBNG__console && window.JSBNG__console.firebug));\n                    window.JSBNG__resizeBy(r, q);\n                    if (r) {\n                        window.JSBNG__moveBy(((r / -2)), 0);\n                    }\n                ;\n                ;\n                } catch (s) {\n                \n                };\n            }\n        ;\n        ;\n        },\n        _getDocumentSize: function() {\n            var l = g.getDocumentDimensions();\n            if (((k._opts.strategy === \"offsetHeight\"))) {\n                l.height = JSBNG__document.body.offsetHeight;\n            }\n        ;\n        ;\n            if (k._opts.widthElement) {\n                var m = h.scry(JSBNG__document.body, k._opts.widthElement)[0];\n                if (m) {\n                    l.width = g.getElementDimensions(m).width;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var n = a.Dialog;\n            if (((((n && n.max_bottom)) && ((n.max_bottom > l.height))))) {\n                l.height = n.max_bottom;\n            }\n        ;\n        ;\n            return l;\n        },\n        open: function(l, m, n) {\n            var o = ((((typeof window.JSBNG__screenX != \"undefined\")) ? window.JSBNG__screenX : window.JSBNG__screenLeft)), p = ((((typeof window.JSBNG__screenY != \"undefined\")) ? window.JSBNG__screenY : window.JSBNG__screenTop)), q = ((((typeof window.JSBNG__outerWidth != \"undefined\")) ? window.JSBNG__outerWidth : JSBNG__document.body.clientWidth)), r = ((((typeof window.JSBNG__outerHeight != \"undefined\")) ? window.JSBNG__outerHeight : ((JSBNG__document.body.clientHeight - 22)))), s = parseInt(((o + ((((q - n)) / 2)))), 10), t = parseInt(((p + ((((r - m)) / 2.5)))), 10), u = ((((((((((((((\"width=\" + n)) + \",height=\")) + m)) + \",left=\")) + s)) + \",top=\")) + t));\n            return window.open(l, \"_blank\", u);\n        }\n    };\n    e.exports = k;\n});\n__d(\"TidyArbiterMixin\", [\"Arbiter\",\"ArbiterMixin\",\"Run\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = {\n    };\n    j(k, h, {\n        _getArbiterInstance: function() {\n            if (!this._arbiter) {\n                this._arbiter = new g();\n                i.onLeave(function() {\n                    delete this._arbiter;\n                }.bind(this));\n            }\n        ;\n        ;\n            return this._arbiter;\n        }\n    });\n    e.exports = k;\n});\n__d(\"TidyArbiter\", [\"TidyArbiterMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TidyArbiterMixin\"), h = b(\"copyProperties\"), i = {\n    };\n    h(i, g);\n    e.exports = i;\n});\n__d(\"Vector\", [\"JSBNG__Event\",\"DOMDimensions\",\"DOMPosition\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOMDimensions\"), i = b(\"DOMPosition\"), j = b(\"copyProperties\");\n    function k(l, m, n) {\n        j(this, {\n            x: parseFloat(l),\n            y: parseFloat(m),\n            domain: ((n || \"pure\"))\n        });\n    };\n;\n    j(k.prototype, {\n        toString: function() {\n            return ((((((((\"(\" + this.x)) + \", \")) + this.y)) + \")\"));\n        },\n        add: function(l, m) {\n            if (((arguments.length == 1))) {\n                if (((l.domain != \"pure\"))) {\n                    l = l.convertTo(this.domain);\n                }\n            ;\n            ;\n                return this.add(l.x, l.y);\n            }\n        ;\n        ;\n            var n = parseFloat(l), o = parseFloat(m);\n            return new k(((this.x + n)), ((this.y + o)), this.domain);\n        },\n        mul: function(l, m) {\n            if (((typeof m == \"undefined\"))) {\n                m = l;\n            }\n        ;\n        ;\n            return new k(((this.x * l)), ((this.y * m)), this.domain);\n        },\n        sub: function(l, m) {\n            if (((arguments.length == 1))) {\n                return this.add(l.mul(-1));\n            }\n             else return this.add(-l, -m)\n        ;\n        },\n        distanceTo: function(l) {\n            return this.sub(l).magnitude();\n        },\n        magnitude: function() {\n            return Math.sqrt(((((this.x * this.x)) + ((this.y * this.y)))));\n        },\n        rotate: function(l) {\n            return new k(((((this.x * Math.cos(l))) - ((this.y * Math.sin(l))))), ((((this.x * Math.sin(l))) + ((this.y * Math.cos(l))))));\n        },\n        convertTo: function(l) {\n            if (((((((l != \"pure\")) && ((l != \"viewport\")))) && ((l != \"JSBNG__document\"))))) {\n                return new k(0, 0);\n            }\n        ;\n        ;\n            if (((l == this.domain))) {\n                return new k(this.x, this.y, this.domain);\n            }\n        ;\n        ;\n            if (((l == \"pure\"))) {\n                return new k(this.x, this.y);\n            }\n        ;\n        ;\n            if (((this.domain == \"pure\"))) {\n                return new k(0, 0);\n            }\n        ;\n        ;\n            var m = k.getScrollPosition(\"JSBNG__document\"), n = this.x, o = this.y;\n            if (((this.domain == \"JSBNG__document\"))) {\n                n -= m.x;\n                o -= m.y;\n            }\n             else {\n                n += m.x;\n                o += m.y;\n            }\n        ;\n        ;\n            return new k(n, o, l);\n        },\n        setElementPosition: function(l) {\n            var m = this.convertTo(\"JSBNG__document\");\n            l.style.left = ((parseInt(m.x) + \"px\"));\n            l.style.JSBNG__top = ((parseInt(m.y) + \"px\"));\n            return this;\n        },\n        setElementDimensions: function(l) {\n            return this.setElementWidth(l).setElementHeight(l);\n        },\n        setElementWidth: function(l) {\n            l.style.width = ((parseInt(this.x, 10) + \"px\"));\n            return this;\n        },\n        setElementHeight: function(l) {\n            l.style.height = ((parseInt(this.y, 10) + \"px\"));\n            return this;\n        },\n        scrollElementBy: function(l) {\n            if (((l == JSBNG__document.body))) {\n                window.JSBNG__scrollBy(this.x, this.y);\n            }\n             else {\n                l.scrollLeft += this.x;\n                l.scrollTop += this.y;\n            }\n        ;\n        ;\n            return this;\n        }\n    });\n    j(k, {\n        getEventPosition: function(l, m) {\n            m = ((m || \"JSBNG__document\"));\n            var n = g.getPosition(l), o = new k(n.x, n.y, \"JSBNG__document\");\n            return o.convertTo(m);\n        },\n        getScrollPosition: function(l) {\n            l = ((l || \"JSBNG__document\"));\n            var m = i.getScrollPosition();\n            return new k(m.x, m.y, \"JSBNG__document\").convertTo(l);\n        },\n        getElementPosition: function(l, m) {\n            m = ((m || \"JSBNG__document\"));\n            var n = i.getElementPosition(l);\n            return new k(n.x, n.y, \"viewport\").convertTo(m);\n        },\n        getElementDimensions: function(l) {\n            var m = h.getElementDimensions(l);\n            return new k(m.width, m.height);\n        },\n        getViewportDimensions: function() {\n            var l = h.getViewportDimensions();\n            return new k(l.width, l.height, \"viewport\");\n        },\n        getDocumentDimensions: function(l) {\n            var m = h.getDocumentDimensions(l);\n            return new k(m.width, m.height, \"JSBNG__document\");\n        },\n        deserialize: function(l) {\n            var m = l.split(\",\");\n            return new k(m[0], m[1]);\n        }\n    });\n    e.exports = k;\n});\n__d(\"collectDataAttributes\", [\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"getContextualParent\");\n    function h(i, j) {\n        var k = {\n        }, l = {\n        }, m = j.length, n;\n        for (n = 0; ((n < m)); ++n) {\n            k[j[n]] = {\n            };\n            l[j[n]] = ((\"data-\" + j[n]));\n        };\n    ;\n        var o = {\n            tn: \"\",\n            \"tn-debug\": \",\"\n        };\n        while (i) {\n            if (i.getAttribute) {\n                for (n = 0; ((n < m)); ++n) {\n                    var p = i.getAttribute(l[j[n]]);\n                    if (p) {\n                        var q = JSON.parse(p);\n                        {\n                            var fin45keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin45i = (0);\n                            var r;\n                            for (; (fin45i < fin45keys.length); (fin45i++)) {\n                                ((r) = (fin45keys[fin45i]));\n                                {\n                                    if (((o[r] !== undefined))) {\n                                        if (((k[j[n]][r] === undefined))) {\n                                            k[j[n]][r] = [];\n                                        }\n                                    ;\n                                    ;\n                                        k[j[n]][r].push(q[r]);\n                                    }\n                                     else if (((k[j[n]][r] === undefined))) {\n                                        k[j[n]][r] = q[r];\n                                    }\n                                    \n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            i = g(i);\n        };\n    ;\n        {\n            var fin46keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin46i = (0);\n            var s;\n            for (; (fin46i < fin46keys.length); (fin46i++)) {\n                ((s) = (fin46keys[fin46i]));\n                {\n                    {\n                        var fin47keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin47i = (0);\n                        var t;\n                        for (; (fin47i < fin47keys.length); (fin47i++)) {\n                            ((t) = (fin47keys[fin47i]));\n                            {\n                                if (((k[s][t] !== undefined))) {\n                                    k[s][t] = k[s][t].join(o[t]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"csx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(\"csx(...): Unexpected class selector transformation.\");\n    };\n;\n    e.exports = g;\n});\n__d(\"JSBNG__requestAnimationFrame\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = 0, i = ((((((((((a.JSBNG__requestAnimationFrame || a.JSBNG__webkitRequestAnimationFrame)) || a.JSBNG__mozRequestAnimationFrame)) || a.oRequestAnimationFrame)) || a.msRequestAnimationFrame)) || function(j) {\n        var k = JSBNG__Date.now(), l = Math.max(0, ((16 - ((k - h)))));\n        h = ((k + l));\n        return a.JSBNG__setTimeout(j, l);\n    }));\n    i(g);\n    e.exports = i;\n});\n__d(\"queryThenMutateDOM\", [\"function-extensions\",\"Run\",\"createArrayFrom\",\"emptyFunction\",\"JSBNG__requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Run\"), h = b(\"createArrayFrom\"), i = b(\"emptyFunction\"), j = b(\"JSBNG__requestAnimationFrame\"), k, l, m = {\n    }, n = [], o = [];\n    function p(s, t, u) {\n        if (((!s && !t))) {\n            return;\n        }\n    ;\n    ;\n        if (((u && m.hasOwnProperty(u)))) {\n            return;\n        }\n         else if (u) {\n            m[u] = 1;\n        }\n        \n    ;\n    ;\n        n.push(((t || i)));\n        o.push(((s || i)));\n        r();\n        if (!k) {\n            k = true;\n            g.onLeave(function() {\n                k = false;\n                l = false;\n                m = {\n                };\n                n.length = 0;\n                o.length = 0;\n            });\n        }\n    ;\n    ;\n    };\n;\n    p.prepare = function(s, t, u) {\n        return function() {\n            var v = h(arguments);\n            v.unshift(this);\n            var w = Function.prototype.bind.apply(s, v), x = t.bind(this);\n            p(w, x, u);\n        };\n    };\n    function q() {\n        m = {\n        };\n        var s = o.length, t = n.length, u = [], v;\n        while (s--) {\n            v = o.shift();\n            u.push(v());\n        };\n    ;\n        while (t--) {\n            v = n.shift();\n            v(u.shift());\n        };\n    ;\n        l = false;\n        r();\n    };\n;\n    function r() {\n        if (((!l && ((o.length || n.length))))) {\n            l = true;\n            j(q);\n        }\n    ;\n    ;\n    };\n;\n    e.exports = p;\n});\n__d(\"setTimeoutAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return JSBNG__setTimeout(h, i, false);\n    };\n;\n    e.exports = g;\n});\n__d(\"TimelineCoverCollapse\", [\"Arbiter\",\"DOMDimensions\",\"Style\",\"TidyArbiter\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMDimensions\"), i = b(\"Style\"), j = b(\"TidyArbiter\"), k = b(\"$\");\n    f.collapse = function(l, m) {\n        m--;\n        var n = h.getViewportDimensions().height, o = h.getDocumentDimensions().height, p = ((n + m));\n        if (((o <= p))) {\n            i.set(k(\"pagelet_timeline_main_column\"), \"min-height\", ((p + \"px\")));\n        }\n    ;\n    ;\n        window.JSBNG__scrollBy(0, m);\n        j.inform(\"TimelineCover/coverCollapsed\", m, g.BEHAVIOR_STATE);\n    };\n});\nfunction tz_calculate(a) {\n    var b = new JSBNG__Date(), c = ((b.getTimezoneOffset() / 30)), d = ((b.getTime() / 1000)), e = Math.round(((((a - d)) / 1800))), f = ((Math.round(((c + e))) % 48));\n    if (((f == 0))) {\n        return 0;\n    }\n     else if (((f > 24))) {\n        f -= ((Math.ceil(((f / 48))) * 48));\n    }\n     else if (((f < -28))) {\n        f += ((Math.ceil(((f / -48))) * 48));\n    }\n    \n    \n;\n;\n    return ((f * 30));\n};\n;\nfunction tz_autoset(a, b, c) {\n    if (((!a || ((undefined == b))))) {\n        return;\n    }\n;\n;\n    if (window.tz_autoset.calculated) {\n        return;\n    }\n;\n;\n    window.tz_autoset.calculated = true;\n    var d = -tz_calculate(a);\n    if (((c || ((d != b))))) {\n        var e = \"/ajax/timezone/update.php\";\n        new AsyncRequest().setURI(e).setData({\n            gmt_off: d,\n            is_forced: c\n        }).setErrorHandler(emptyFunction).setTransportErrorHandler(emptyFunction).setOption(\"suppressErrorAlerts\", true).send();\n    }\n;\n;\n};\n;\n__d(\"UFITracking\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\");\n    function h(j) {\n        g.loadModules([\"DOM\",\"collectDataAttributes\",], function(k, l) {\n            j.forEach(function(m) {\n                var n = k.scry(JSBNG__document.body, m);\n                if (((!n || n.link_data))) {\n                    return;\n                }\n            ;\n            ;\n                var o = l(n, [\"ft\",]).ft;\n                if (Object.keys(o).length) {\n                    var p = k.create(\"input\", {\n                        type: \"hidden\",\n                        JSBNG__name: \"link_data\",\n                        value: JSON.stringify(o)\n                    });\n                    n.appendChild(p);\n                }\n            ;\n            ;\n            });\n        });\n    };\n;\n    var i = {\n        addAllLinkData: function() {\n            h([\"form.commentable_item\",]);\n        },\n        addAllLinkDataForQuestion: function() {\n            h([\"form.fbEigenpollForm\",\"form.fbQuestionPollForm\",]);\n        }\n    };\n    e.exports = i;\n});\n__d(\"legacy:ufi-tracking-js\", [\"UFITracking\",], function(a, b, c, d) {\n    var e = b(\"UFITracking\");\n    a.ufi_add_all_link_data = e.addAllLinkData;\n    a.question_add_all_link_data = e.addAllLinkDataForQuestion;\n}, 3);\n__d(\"LayerRemoveOnHide\", [\"function-extensions\",\"DOM\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOM\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", g.remove.curry(this._layer.getRoot()));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"Keys\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        BACKSPACE: 8,\n        TAB: 9,\n        RETURN: 13,\n        ESC: 27,\n        SPACE: 32,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        END: 35,\n        HOME: 36,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        DELETE: 46,\n        COMMA: 188\n    };\n});\n__d(\"areObjectsEqual\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((JSON.stringify(h) == JSON.stringify(i)));\n    };\n;\n    e.exports = g;\n});\n__d(\"flattenArray\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = h.slice(), j = [];\n        while (i.length) {\n            var k = i.pop();\n            if (Array.isArray(k)) {\n                Array.prototype.push.apply(i, k);\n            }\n             else j.push(k);\n        ;\n        ;\n        };\n    ;\n        return j.reverse();\n    };\n;\n    e.exports = g;\n});\n__d(\"htmlSpecialChars\", [], function(a, b, c, d, e, f) {\n    var g = /&/g, h = /</g, i = />/g, j = /\"/g, k = /'/g;\n    function l(m) {\n        if (((((((typeof m == \"undefined\")) || ((m === null)))) || !m.toString))) {\n            return \"\";\n        }\n    ;\n    ;\n        if (((m === false))) {\n            return \"0\";\n        }\n         else if (((m === true))) {\n            return \"1\";\n        }\n        \n    ;\n    ;\n        return m.toString().replace(g, \"&amp;\").replace(j, \"&quot;\").replace(k, \"&#039;\").replace(h, \"&lt;\").replace(i, \"&gt;\");\n    };\n;\n    e.exports = l;\n});\n__d(\"htmlize\", [\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"htmlSpecialChars\");\n    function h(i) {\n        return g(i).replace(/\\r\\n|[\\r\\n]/g, \"\\u003Cbr/\\u003E\");\n    };\n;\n    e.exports = h;\n});");
// 1044
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o10,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/BeJ1_p_ZVAB.js",o11);
// undefined
o10 = null;
// undefined
o11 = null;
// 1048
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"KPZ5T\",]);\n}\n;\n__d(\"EntStreamGroupMall\", [\"DOM\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"$\"), i = {\n        replacePager: function(j) {\n            g.setContent(h(\"pagelet_group_pager\"), j);\n        },\n        replaceFilesPager: function(j, k) {\n            g.setContent(h((\"group_files_pager_\" + k)), j);\n        }\n    };\n    e.exports = i;\n});\n__d(\"GroupMall\", [\"Animation\",\"Arbiter\",\"DOM\",\"LiveTimer\",\"NavigationMessage\",\"Run\",\"Vector\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"LiveTimer\"), k = b(\"NavigationMessage\"), l = b(\"Run\"), m = b(\"Vector\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"ge\"), q = {\n    };\n    o(q, {\n        init: function(r, s) {\n            this._mallNode = n((\"group_mall_\" + r));\n            this._composerPublishToken = h.subscribe(\"composer/publish\", function(event, t) {\n                if ((((t.composer_id === s) && t.streamStory) && !p(t.streamStory.id))) {\n                    this._addPostToUI(t.streamStory);\n                };\n            }.bind(this));\n            l.onLeave(this._onleave.bind(this));\n            this._navigationBeginToken = h.subscribe(k.NAVIGATION_BEGIN, this._onleave.bind(this));\n        },\n        _onleave: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._composerPublishToken.unsubscribe();\n        },\n        _addPostToUI: function(r) {\n            var s = m.getElementDimensions(this._mallNode).y;\n            i.prependContent(this._mallNode, r);\n            var t = this._mallNode.firstChild;\n            j.startLoop(0);\n            new g(t).from(\"opacity\", 0).to(\"opacity\", 1).duration(300).go();\n        }\n    });\n    e.exports = q;\n});\n__d(\"LitestandShareAttachment\", [\"CSS\",\"DOM\",\"DOMQuery\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"csx\"), k = b(\"queryThenMutateDOM\"), l = 16, m = 22, n = 5, o = {\n        1: 5,\n        2: 4,\n        3: 2,\n        4: 0,\n        5: 0\n    }, p, q = {\n        init: function(u) {\n            var v, w, x;\n            k(function() {\n                v = h.find(u, \".-cx-PRIVATE-fbEntstreamAttachmentShare__title\");\n                w = h.scry(u, \".-cx-PRIVATE-fbEntstreamAttachmentShare__description\")[0];\n                x = t(v);\n            }, function() {\n                if (!x) {\n                    r(v, (n * m));\n                }\n                 else if ((w && x)) {\n                    g.show(w);\n                    r(w, (x * l));\n                }\n                \n            ;\n            });\n        }\n    };\n    function r(u, v) {\n        var w = u.scrollHeight;\n        if ((w <= v)) {\n            return u\n        };\n        var x, y = \"...\", z = i.getText(u);\n        while ((w > v)) {\n            x = z.lastIndexOf(\" \");\n            if ((x === -1)) {\n                x = ((z.length - y.length) - 1);\n            };\n            z = (z.substr(0, x).trim() + y);\n            s(u, z);\n            w = u.scrollHeight;\n        };\n    };\n    function s(u, v) {\n        p = (p || (((u.textContent != null) ? \"textContent\" : \"innerText\")));\n        u[p] = v;\n    };\n    function t(u) {\n        var v = Math.round((u.scrollHeight / m));\n        return o[v];\n    };\n    e.exports = q;\n});\n__d(\"highlight\", [\"Animation\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\");\n    function i(j, k, l) {\n        new g(j).from(\"background\", \"#fff9d7\").to(\"background\", (l || \"#fff\")).ease(g.ease.both).duration(2000).ondone(function() {\n            h.set(j, \"background\", \"\");\n            (k && k());\n        }).go();\n    };\n    i.highlight = i;\n    e.exports = i;\n});\n__d(\"ScrollHighlight\", [\"DOMScroll\",\"highlight\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMScroll\"), h = b(\"highlight\"), i = {\n        actOn: function(j, k) {\n            g.scrollTo(j);\n            h(j, null, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"foldl\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = 0, l = i.length;\n        if ((l === 0)) {\n            if ((j === undefined)) {\n                throw new TypeError(\"Reduce of empty array with no initial value\")\n            };\n            return j;\n        }\n    ;\n        if ((j === undefined)) {\n            j = i[k++];\n        };\n        while ((k < l)) {\n            if ((k in i)) {\n                j = h(j, i[k]);\n            };\n            k++;\n        };\n        return j;\n    };\n    e.exports = g;\n});\n__d(\"FacebarStructuredFragment\", [], function(a, b, c, d, e, f) {\n    function g(i, j) {\n        if ((i && j)) {\n            return (i.toLowerCase() == j.toLowerCase());\n        }\n         else return (!i && !j)\n    ;\n    };\n    function h(i) {\n        this._text = String(i.text);\n        this._uid = (i.uid ? String(i.uid) : null);\n        this._type = (i.type ? String(i.type) : null);\n        this._typeParts = null;\n    };\n    h.prototype.getText = function() {\n        return this._text;\n    };\n    h.prototype.getUID = function() {\n        return this._uid;\n    };\n    h.prototype.getType = function() {\n        return this._type;\n    };\n    h.prototype.getTypePart = function(i) {\n        return this._getTypeParts()[i];\n    };\n    h.prototype.getLength = function() {\n        return this._text.length;\n    };\n    h.prototype.isType = function(i) {\n        for (var j = 0; (j < arguments.length); j++) {\n            if (!g(arguments[j], this.getTypePart(j))) {\n                return false\n            };\n        };\n        return true;\n    };\n    h.prototype.isWhitespace = function() {\n        return (/^\\s*$/).test(this._text);\n    };\n    h.prototype.toStruct = function() {\n        return {\n            text: this._text,\n            type: this._type,\n            uid: this._uid\n        };\n    };\n    h.prototype.getHash = function(i) {\n        var j = ((i != null) ? this._getTypeParts().slice(0, i).join(\":\") : this._type);\n        return ((j + \"::\") + this._text);\n    };\n    h.prototype._getTypeParts = function() {\n        if ((this._typeParts === null)) {\n            this._typeParts = (this._type ? this._type.split(\":\") : []);\n        };\n        return this._typeParts;\n    };\n    e.exports = h;\n});\n__d(\"FacebarStructuredText\", [\"createArrayFrom\",\"foldl\",\"FacebarStructuredFragment\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"foldl\"), i = b(\"FacebarStructuredFragment\"), j = /\\s+$/;\n    function k(o) {\n        if (!o) {\n            return [];\n        }\n         else if ((o instanceof n)) {\n            return o.toArray();\n        }\n         else return g(o).map(function(p) {\n            return new i(p);\n        })\n        \n    ;\n    };\n    function l(o) {\n        return new i({\n            text: o,\n            type: \"text\"\n        });\n    };\n    function m(o, p, q) {\n        var r = o.getText(), s = r.replace(p, q);\n        if ((r != s)) {\n            return new i({\n                text: s,\n                type: o.getType(),\n                uid: o.getUID()\n            });\n        }\n         else return o\n    ;\n    };\n    function n(o) {\n        this._fragments = (o || []);\n        this._hash = null;\n    };\n    n.prototype.matches = function(o, p) {\n        if (o) {\n            var q = this._fragments, r = o._fragments;\n            return ((q.length == r.length) && !q.some(function(s, t) {\n                if ((!p && s.getUID())) {\n                    return (s.getUID() != r[t].getUID());\n                }\n                 else return ((s.getText() != r[t].getText()) || (s.getType() != r[t].getType()))\n            ;\n            }));\n        }\n    ;\n        return false;\n    };\n    n.prototype.trim = function() {\n        var o = null, p = null;\n        this.forEach(function(r, s) {\n            if (!r.isWhitespace()) {\n                if ((o === null)) {\n                    o = s;\n                };\n                p = s;\n            }\n        ;\n        });\n        if ((p !== null)) {\n            var q = this._fragments.slice(o, (p + 1));\n            q.push(m(q.pop(), j, \"\"));\n            return new n(q);\n        }\n         else return new n([])\n    ;\n    };\n    n.prototype.pad = function() {\n        var o = this.getFragment(-1);\n        if (((o && !j.test(o.getText())) && (o.getText() !== \"\"))) {\n            return new n(this._fragments.concat(l(\" \")));\n        }\n         else return this\n    ;\n    };\n    n.prototype.forEach = function(o) {\n        this._fragments.forEach(o);\n        return this;\n    };\n    n.prototype.matchType = function(o) {\n        var p = null;\n        for (var q = 0; (q < this._fragments.length); q++) {\n            var r = this._fragments[q], s = r.isType.apply(r, arguments);\n            if ((s && !p)) {\n                p = r;\n            }\n             else if ((s || !r.isWhitespace())) {\n                return null\n            }\n        ;\n        };\n        return p;\n    };\n    n.prototype.hasType = function(o) {\n        var p = arguments;\n        return this._fragments.some(function(q) {\n            return (!q.isWhitespace() && q.isType.apply(q, p));\n        });\n    };\n    n.prototype.isEmptyOrWhitespace = function() {\n        return !this._fragments.some(function(o) {\n            return !o.isWhitespace();\n        });\n    };\n    n.prototype.isEmpty = function() {\n        return (this.getLength() === 0);\n    };\n    n.prototype.getFragment = function(o) {\n        return this._fragments[((o >= 0) ? o : (this._fragments.length + o))];\n    };\n    n.prototype.getCount = function() {\n        return this._fragments.length;\n    };\n    n.prototype.getLength = function() {\n        return h(function(o, p) {\n            return (o + p.getLength());\n        }, this._fragments, 0);\n    };\n    n.prototype.toStruct = function() {\n        return this._fragments.map(function(o) {\n            return o.toStruct();\n        });\n    };\n    n.prototype.toArray = function() {\n        return this._fragments.slice();\n    };\n    n.prototype.toString = function() {\n        return this._fragments.map(function(o) {\n            return o.getText();\n        }).join(\"\");\n    };\n    n.prototype.getHash = function() {\n        if ((this._hash === null)) {\n            this._hash = this._fragments.map(function(o) {\n                if (o.getUID()) {\n                    return ((\"[[\" + o.getHash(1)) + \"]]\");\n                }\n                 else return o.getText()\n            ;\n            }).join(\"\");\n        };\n        return this._hash;\n    };\n    n.fromStruct = function(o) {\n        return new n(k(o));\n    };\n    n.fromString = function(o) {\n        return new n([l(o),]);\n    };\n    e.exports = n;\n});\n__d(\"FacebarNavigation\", [\"Arbiter\",\"csx\",\"DOMQuery\",\"FacebarStructuredText\",\"Input\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"csx\"), i = b(\"DOMQuery\"), j = b(\"FacebarStructuredText\"), k = b(\"Input\"), l = b(\"URI\"), m = null, n = null, o = null, p = false, q = true, r = (function() {\n        var v = {\n        }, w = function(x) {\n            return (\"uri-\" + x.getQualifiedURI().toString());\n        };\n        return {\n            set: function(x, y) {\n                v[w(x)] = y;\n            },\n            get: function(x) {\n                return v[w(x)];\n            }\n        };\n    })();\n    function s(v, w) {\n        o = v;\n        p = w;\n        q = false;\n        t();\n    };\n    function t() {\n        if (q) {\n            return;\n        }\n         else if (n) {\n            (p && n.pageTransition());\n            n.setPageQuery(o);\n            q = true;\n        }\n         else if (((m && o) && !k.getValue(m))) {\n            k.setValue(m, (o.structure.toString() + \" \"));\n        }\n        \n    ;\n    };\n    g.subscribe(\"page_transition\", function(v, w) {\n        s(r.get(w.uri), true);\n    });\n    var u = {\n        registerInput: function(v) {\n            m = i.scry(v, \".-cx-PUBLIC-uiStructuredInput__text\")[0];\n            t();\n        },\n        registerBehavior: function(v) {\n            n = v;\n            t();\n        },\n        setPageQuery: function(v) {\n            r.set(l.getNextURI(), v);\n            v.structure = j.fromStruct(v.structure);\n            s(v, false);\n        }\n    };\n    e.exports = u;\n});");
// 1049
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s067fcde455f9ea3a8966632690d820aefc898eda");
// 1050
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"KPZ5T\",]);\n}\n;\n;\n__d(\"EntStreamGroupMall\", [\"DOM\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"$\"), i = {\n        replacePager: function(j) {\n            g.setContent(h(\"pagelet_group_pager\"), j);\n        },\n        replaceFilesPager: function(j, k) {\n            g.setContent(h(((\"group_files_pager_\" + k))), j);\n        }\n    };\n    e.exports = i;\n});\n__d(\"GroupMall\", [\"Animation\",\"Arbiter\",\"DOM\",\"LiveTimer\",\"NavigationMessage\",\"Run\",\"Vector\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"LiveTimer\"), k = b(\"NavigationMessage\"), l = b(\"Run\"), m = b(\"Vector\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"ge\"), q = {\n    };\n    o(q, {\n        init: function(r, s) {\n            this._mallNode = n(((\"group_mall_\" + r)));\n            this._composerPublishToken = h.subscribe(\"composer/publish\", function(JSBNG__event, t) {\n                if (((((((t.composer_id === s)) && t.streamStory)) && !p(t.streamStory.id)))) {\n                    this._addPostToUI(t.streamStory);\n                }\n            ;\n            ;\n            }.bind(this));\n            l.onLeave(this._onleave.bind(this));\n            this._navigationBeginToken = h.subscribe(k.NAVIGATION_BEGIN, this._onleave.bind(this));\n        },\n        _onleave: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._composerPublishToken.unsubscribe();\n        },\n        _addPostToUI: function(r) {\n            var s = m.getElementDimensions(this._mallNode).y;\n            i.prependContent(this._mallNode, r);\n            var t = this._mallNode.firstChild;\n            j.startLoop(0);\n            new g(t).from(\"opacity\", 0).to(\"opacity\", 1).duration(300).go();\n        }\n    });\n    e.exports = q;\n});\n__d(\"LitestandShareAttachment\", [\"CSS\",\"DOM\",\"DOMQuery\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"csx\"), k = b(\"queryThenMutateDOM\"), l = 16, m = 22, n = 5, o = {\n        1: 5,\n        2: 4,\n        3: 2,\n        4: 0,\n        5: 0\n    }, p, q = {\n        init: function(u) {\n            var v, w, x;\n            k(function() {\n                v = h.JSBNG__find(u, \".-cx-PRIVATE-fbEntstreamAttachmentShare__title\");\n                w = h.scry(u, \".-cx-PRIVATE-fbEntstreamAttachmentShare__description\")[0];\n                x = t(v);\n            }, function() {\n                if (!x) {\n                    r(v, ((n * m)));\n                }\n                 else if (((w && x))) {\n                    g.show(w);\n                    r(w, ((x * l)));\n                }\n                \n            ;\n            ;\n            });\n        }\n    };\n    function r(u, v) {\n        var w = u.scrollHeight;\n        if (((w <= v))) {\n            return u;\n        }\n    ;\n    ;\n        var x, y = \"...\", z = i.getText(u);\n        while (((w > v))) {\n            x = z.lastIndexOf(\" \");\n            if (((x === -1))) {\n                x = ((((z.length - y.length)) - 1));\n            }\n        ;\n        ;\n            z = ((z.substr(0, x).trim() + y));\n            s(u, z);\n            w = u.scrollHeight;\n        };\n    ;\n    };\n;\n    function s(u, v) {\n        p = ((p || ((((u.textContent != null)) ? \"textContent\" : \"innerText\"))));\n        u[p] = v;\n    };\n;\n    function t(u) {\n        var v = Math.round(((u.scrollHeight / m)));\n        return o[v];\n    };\n;\n    e.exports = q;\n});\n__d(\"highlight\", [\"Animation\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\");\n    function i(j, k, l) {\n        new g(j).from(\"background\", \"#fff9d7\").to(\"background\", ((l || \"#fff\"))).ease(g.ease.both).duration(2000).ondone(function() {\n            h.set(j, \"background\", \"\");\n            ((k && k()));\n        }).go();\n    };\n;\n    i.highlight = i;\n    e.exports = i;\n});\n__d(\"ScrollHighlight\", [\"DOMScroll\",\"highlight\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMScroll\"), h = b(\"highlight\"), i = {\n        actOn: function(j, k) {\n            g.JSBNG__scrollTo(j);\n            h(j, null, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"foldl\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = 0, l = i.length;\n        if (((l === 0))) {\n            if (((j === undefined))) {\n                throw new TypeError(\"Reduce of empty array with no initial value\");\n            }\n        ;\n        ;\n            return j;\n        }\n    ;\n    ;\n        if (((j === undefined))) {\n            j = i[k++];\n        }\n    ;\n    ;\n        while (((k < l))) {\n            if (((k in i))) {\n                j = h(j, i[k]);\n            }\n        ;\n        ;\n            k++;\n        };\n    ;\n        return j;\n    };\n;\n    e.exports = g;\n});\n__d(\"FacebarStructuredFragment\", [], function(a, b, c, d, e, f) {\n    function g(i, j) {\n        if (((i && j))) {\n            return ((i.toLowerCase() == j.toLowerCase()));\n        }\n         else return ((!i && !j))\n    ;\n    };\n;\n    function h(i) {\n        this._text = String(i.text);\n        this._uid = ((i.uid ? String(i.uid) : null));\n        this._type = ((i.type ? String(i.type) : null));\n        this._typeParts = null;\n    };\n;\n    h.prototype.getText = function() {\n        return this._text;\n    };\n    h.prototype.getUID = function() {\n        return this._uid;\n    };\n    h.prototype.getType = function() {\n        return this._type;\n    };\n    h.prototype.getTypePart = function(i) {\n        return this._getTypeParts()[i];\n    };\n    h.prototype.getLength = function() {\n        return this._text.length;\n    };\n    h.prototype.isType = function(i) {\n        for (var j = 0; ((j < arguments.length)); j++) {\n            if (!g(arguments[j], this.getTypePart(j))) {\n                return false;\n            }\n        ;\n        ;\n        };\n    ;\n        return true;\n    };\n    h.prototype.isWhitespace = function() {\n        return (/^\\s*$/).test(this._text);\n    };\n    h.prototype.toStruct = function() {\n        return {\n            text: this._text,\n            type: this._type,\n            uid: this._uid\n        };\n    };\n    h.prototype.getHash = function(i) {\n        var j = ((((i != null)) ? this._getTypeParts().slice(0, i).join(\":\") : this._type));\n        return ((((j + \"::\")) + this._text));\n    };\n    h.prototype._getTypeParts = function() {\n        if (((this._typeParts === null))) {\n            this._typeParts = ((this._type ? this._type.split(\":\") : []));\n        }\n    ;\n    ;\n        return this._typeParts;\n    };\n    e.exports = h;\n});\n__d(\"FacebarStructuredText\", [\"createArrayFrom\",\"foldl\",\"FacebarStructuredFragment\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"foldl\"), i = b(\"FacebarStructuredFragment\"), j = /\\s+$/;\n    function k(o) {\n        if (!o) {\n            return [];\n        }\n         else if (((o instanceof n))) {\n            return o.toArray();\n        }\n         else return g(o).map(function(p) {\n            return new i(p);\n        })\n        \n    ;\n    };\n;\n    function l(o) {\n        return new i({\n            text: o,\n            type: \"text\"\n        });\n    };\n;\n    function m(o, p, q) {\n        var r = o.getText(), s = r.replace(p, q);\n        if (((r != s))) {\n            return new i({\n                text: s,\n                type: o.getType(),\n                uid: o.getUID()\n            });\n        }\n         else return o\n    ;\n    };\n;\n    function n(o) {\n        this._fragments = ((o || []));\n        this._hash = null;\n    };\n;\n    n.prototype.matches = function(o, p) {\n        if (o) {\n            var q = this._fragments, r = o._fragments;\n            return ((((q.length == r.length)) && !q.some(function(s, t) {\n                if (((!p && s.getUID()))) {\n                    return ((s.getUID() != r[t].getUID()));\n                }\n                 else return ((((s.getText() != r[t].getText())) || ((s.getType() != r[t].getType()))))\n            ;\n            })));\n        }\n    ;\n    ;\n        return false;\n    };\n    n.prototype.trim = function() {\n        var o = null, p = null;\n        this.forEach(function(r, s) {\n            if (!r.isWhitespace()) {\n                if (((o === null))) {\n                    o = s;\n                }\n            ;\n            ;\n                p = s;\n            }\n        ;\n        ;\n        });\n        if (((p !== null))) {\n            var q = this._fragments.slice(o, ((p + 1)));\n            q.push(m(q.pop(), j, \"\"));\n            return new n(q);\n        }\n         else return new n([])\n    ;\n    };\n    n.prototype.pad = function() {\n        var o = this.getFragment(-1);\n        if (((((o && !j.test(o.getText()))) && ((o.getText() !== \"\"))))) {\n            return new n(this._fragments.concat(l(\" \")));\n        }\n         else return this\n    ;\n    };\n    n.prototype.forEach = function(o) {\n        this._fragments.forEach(o);\n        return this;\n    };\n    n.prototype.matchType = function(o) {\n        var p = null;\n        for (var q = 0; ((q < this._fragments.length)); q++) {\n            var r = this._fragments[q], s = r.isType.apply(r, arguments);\n            if (((s && !p))) {\n                p = r;\n            }\n             else if (((s || !r.isWhitespace()))) {\n                return null;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return p;\n    };\n    n.prototype.hasType = function(o) {\n        var p = arguments;\n        return this._fragments.some(function(q) {\n            return ((!q.isWhitespace() && q.isType.apply(q, p)));\n        });\n    };\n    n.prototype.isEmptyOrWhitespace = function() {\n        return !this._fragments.some(function(o) {\n            return !o.isWhitespace();\n        });\n    };\n    n.prototype.isEmpty = function() {\n        return ((this.getLength() === 0));\n    };\n    n.prototype.getFragment = function(o) {\n        return this._fragments[((((o >= 0)) ? o : ((this._fragments.length + o))))];\n    };\n    n.prototype.getCount = function() {\n        return this._fragments.length;\n    };\n    n.prototype.getLength = function() {\n        return h(function(o, p) {\n            return ((o + p.getLength()));\n        }, this._fragments, 0);\n    };\n    n.prototype.toStruct = function() {\n        return this._fragments.map(function(o) {\n            return o.toStruct();\n        });\n    };\n    n.prototype.toArray = function() {\n        return this._fragments.slice();\n    };\n    n.prototype.toString = function() {\n        return this._fragments.map(function(o) {\n            return o.getText();\n        }).join(\"\");\n    };\n    n.prototype.getHash = function() {\n        if (((this._hash === null))) {\n            this._hash = this._fragments.map(function(o) {\n                if (o.getUID()) {\n                    return ((((\"[[\" + o.getHash(1))) + \"]]\"));\n                }\n                 else return o.getText()\n            ;\n            }).join(\"\");\n        }\n    ;\n    ;\n        return this._hash;\n    };\n    n.fromStruct = function(o) {\n        return new n(k(o));\n    };\n    n.fromString = function(o) {\n        return new n([l(o),]);\n    };\n    e.exports = n;\n});\n__d(\"FacebarNavigation\", [\"Arbiter\",\"csx\",\"DOMQuery\",\"FacebarStructuredText\",\"Input\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"csx\"), i = b(\"DOMQuery\"), j = b(\"FacebarStructuredText\"), k = b(\"Input\"), l = b(\"URI\"), m = null, n = null, o = null, p = false, q = true, r = (function() {\n        var v = {\n        }, w = function(x) {\n            return ((\"uri-\" + x.getQualifiedURI().toString()));\n        };\n        return {\n            set: function(x, y) {\n                v[w(x)] = y;\n            },\n            get: function(x) {\n                return v[w(x)];\n            }\n        };\n    })();\n    function s(v, w) {\n        o = v;\n        p = w;\n        q = false;\n        t();\n    };\n;\n    function t() {\n        if (q) {\n            return;\n        }\n         else if (n) {\n            ((p && n.pageTransition()));\n            n.setPageQuery(o);\n            q = true;\n        }\n         else if (((((m && o)) && !k.getValue(m)))) {\n            k.setValue(m, ((o.structure.toString() + \" \")));\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    g.subscribe(\"page_transition\", function(v, w) {\n        s(r.get(w.uri), true);\n    });\n    var u = {\n        registerInput: function(v) {\n            m = i.scry(v, \".-cx-PUBLIC-uiStructuredInput__text\")[0];\n            t();\n        },\n        registerBehavior: function(v) {\n            n = v;\n            t();\n        },\n        setPageQuery: function(v) {\n            r.set(l.getNextURI(), v);\n            v.structure = j.fromStruct(v.structure);\n            s(v, false);\n        }\n    };\n    e.exports = u;\n});");
// 1053
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o12,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/wjDxPTNT3gj.js",o13);
// undefined
o12 = null;
// undefined
o13 = null;
// 1057
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"OJTM4\",]);\n}\n;\n__d(\"AjaxRequest\", [\"ErrorUtils\",\"Keys\",\"URI\",\"UserAgent\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"Keys\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(q, r, s) {\n        this.xhr = k.create();\n        if (!((r instanceof i))) {\n            r = new i(r);\n        };\n        if ((s && (q == \"GET\"))) {\n            r.setQueryData(s);\n        }\n         else this._params = s;\n    ;\n        this.method = q;\n        this.uri = r;\n        this.xhr.open(q, r);\n    };\n    var n = (window.XMLHttpRequest && ((\"withCredentials\" in new XMLHttpRequest())));\n    m.supportsCORS = function() {\n        return n;\n    };\n    m.ERROR = \"ar:error\";\n    m.TIMEOUT = \"ar:timeout\";\n    m.PROXY_ERROR = \"ar:proxy error\";\n    m.TRANSPORT_ERROR = \"ar:transport error\";\n    m.SERVER_ERROR = \"ar:http error\";\n    m.PARSE_ERROR = \"ar:parse error\";\n    m._inflight = [];\n    function o() {\n        var q = m._inflight;\n        m._inflight = [];\n        q.forEach(function(r) {\n            r.abort();\n        });\n    };\n    function p(q) {\n        q.onJSON = q.onError = q.onSuccess = null;\n        clearTimeout(q._timer);\n        if ((q.xhr && (q.xhr.readyState < 4))) {\n            q.xhr.abort();\n            q.xhr = null;\n        }\n    ;\n        m._inflight = m._inflight.filter(function(r) {\n            return (((r && (r != q)) && r.xhr) && (r.xhr.readyState < 4));\n        });\n    };\n    l(m.prototype, {\n        timeout: 60000,\n        streamMode: true,\n        prelude: /^for \\(;;\\);/,\n        status: null,\n        _eol: -1,\n        _call: function(q) {\n            if (this[q]) {\n                this[q](this);\n            };\n        },\n        _parseStatus: function() {\n            var q;\n            try {\n                this.status = this.xhr.status;\n                q = this.xhr.statusText;\n            } catch (r) {\n                if ((this.xhr.readyState >= 4)) {\n                    this.errorType = m.TRANSPORT_ERROR;\n                    this.errorText = r.message;\n                }\n            ;\n                return;\n            };\n            if (((this.status === 0) && !(/^(file|ftp)/.test(this.uri)))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else if (((this.status >= 100) && (this.status < 200))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.status >= 200) && (this.status < 300))) {\n                return;\n            }\n             else if (((this.status >= 300) && (this.status < 400))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.status >= 400) && (this.status < 500))) {\n                this.errorType = m.SERVER_ERROR;\n            }\n             else if (((this.status >= 500) && (this.status < 600))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if ((this.status == 1223)) {\n                return;\n            }\n             else if (((this.status >= 12001) && (this.status <= 12156))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else {\n                q = (\"unrecognized status code: \" + this.status);\n                this.errorType = m.ERROR;\n            }\n            \n            \n            \n            \n            \n            \n            \n        ;\n            if (!this.errorText) {\n                this.errorText = q;\n            };\n        },\n        _parseResponse: function() {\n            var q, r = this.xhr.readyState;\n            try {\n                q = (this.xhr.responseText || \"\");\n            } catch (s) {\n                if ((r >= 4)) {\n                    this.errorType = m.ERROR;\n                    this.errorText = (\"responseText not available - \" + s.message);\n                }\n            ;\n                return;\n            };\n            while (this.xhr) {\n                var t = (this._eol + 1), u = (this.streamMode ? q.indexOf(\"\\u000a\", t) : q.length);\n                if (((u < 0) && (r == 4))) {\n                    u = q.length;\n                };\n                if ((u <= this._eol)) {\n                    break;\n                };\n                var v = q;\n                if (this.streamMode) {\n                    v = q.substr(t, (u - t)).replace(/^\\s*|\\s*$/g, \"\");\n                };\n                if (((t === 0) && this.prelude)) {\n                    if (this.prelude.test(v)) {\n                        v = v.replace(this.prelude, \"\");\n                    }\n                };\n                this._eol = u;\n                if (v) {\n                    try {\n                        this.json = JSON.parse(v);\n                    } catch (s) {\n                        var w = ((/(<body[\\S\\s]+?<\\/body>)/i).test(q) && RegExp.$1), x = {\n                            message: s.message,\n                            char: t,\n                            excerpt: (((((t === 0) && w)) || v)).substr(512)\n                        };\n                        this.errorType = m.PARSE_ERROR;\n                        this.errorText = (\"parse error - \" + JSON.stringify(x));\n                        return;\n                    };\n                    g.applyWithGuard(this._call, this, [\"onJSON\",]);\n                }\n            ;\n            };\n        },\n        _onReadyState: function() {\n            var q = ((this.xhr && this.xhr.readyState) || 0);\n            if (((this.status == null) && (q >= 2))) {\n                this._parseStatus();\n            };\n            if ((!this.errorType && (this.status != null))) {\n                if (((((q == 3) && this.streamMode)) || (q == 4))) {\n                    this._parseResponse();\n                }\n            };\n            if ((this.errorType || (q == 4))) {\n                this._time = (Date.now() - this._sentAt);\n                this._call((!this.errorType ? \"onSuccess\" : \"onError\"));\n                p(this);\n            }\n        ;\n        },\n        send: function(q) {\n            this.xhr.onreadystatechange = function() {\n                g.applyWithGuard(this._onReadyState, this, arguments);\n            }.bind(this);\n            var r = this.timeout;\n            if (r) {\n                this._timer = setTimeout((function() {\n                    this.errorType = m.TIMEOUT;\n                    this.errorText = \"timeout\";\n                    this._time = (Date.now() - this._sentAt);\n                    this._call(\"onError\");\n                    p(this);\n                }).bind(this), r, false);\n            };\n            m._inflight.push(this);\n            if ((this.method == \"POST\")) {\n                this.xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            };\n            this._sentAt = Date.now();\n            this.xhr.send((q ? i.implodeQuery(q) : \"\"));\n        },\n        abort: function() {\n            p(this);\n        },\n        toString: function() {\n            var q = (\"[AjaxRequest readyState=\" + this.xhr.readyState);\n            if (this.errorType) {\n                q += ((((\" errorType=\" + this.errorType) + \" (\") + this.errorText) + \")\");\n            };\n            return (q + \"]\");\n        },\n        toJSON: function() {\n            var q = {\n                json: this.json,\n                status: this.status,\n                errorType: this.errorType,\n                errorText: this.errorText,\n                time: this._time\n            };\n            if (this.errorType) {\n                q.uri = this.uri;\n            };\n            for (var r in q) {\n                if ((q[r] == null)) {\n                    delete q[r];\n                };\n            };\n            return q;\n        }\n    });\n    if ((window.addEventListener && j.firefox())) {\n        window.addEventListener(\"keydown\", function(event) {\n            if ((event.keyCode === h.ESC)) {\n                event.prevent();\n            };\n        }, false);\n    };\n    if (window.attachEvent) {\n        window.attachEvent(\"onunload\", o);\n    };\n    e.exports = m;\n});\n__d(\"FBAjaxRequest\", [\"AjaxRequest\",\"copyProperties\",\"XHR\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxRequest\"), h = b(\"copyProperties\"), i = b(\"XHR\");\n    function j(k, l, m) {\n        m = h(i.getAsyncParams(k), m);\n        var n = new g(k, l, m);\n        n.streamMode = false;\n        var o = n._call;\n        n._call = function(p) {\n            if (((p == \"onJSON\") && this.json)) {\n                if (this.json.error) {\n                    this.errorType = g.SERVER_ERROR;\n                    this.errorText = (\"AsyncResponse error: \" + this.json.error);\n                }\n            ;\n                this.json = this.json.payload;\n            }\n        ;\n            o.apply(this, arguments);\n        };\n        n.ajaxReqSend = n.send;\n        n.send = function(p) {\n            this.ajaxReqSend(h(p, m));\n        };\n        return n;\n    };\n    e.exports = j;\n});\n__d(\"CallbackManagerController\", [\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"copyProperties\"), i = function(j) {\n        this._pendingIDs = [];\n        this._allRequests = [undefined,];\n        this._callbackArgHandler = j;\n    };\n    h(i.prototype, {\n        executeOrEnqueue: function(j, k, l) {\n            l = (l || {\n            });\n            var m = this._attemptCallback(k, j, l);\n            if (m) {\n                return 0\n            };\n            this._allRequests.push({\n                fn: k,\n                request: j,\n                options: l\n            });\n            var n = (this._allRequests.length - 1);\n            this._pendingIDs.push(n);\n            return n;\n        },\n        unsubscribe: function(j) {\n            delete this._allRequests[j];\n        },\n        reset: function() {\n            this._allRequests = [];\n        },\n        getRequest: function(j) {\n            return this._allRequests[j];\n        },\n        runPossibleCallbacks: function() {\n            var j = this._pendingIDs;\n            this._pendingIDs = [];\n            var k = [];\n            j.forEach(function(l) {\n                var m = this._allRequests[l];\n                if (!m) {\n                    return\n                };\n                if (this._callbackArgHandler(m.request, m.options)) {\n                    k.push(l);\n                }\n                 else this._pendingIDs.push(l);\n            ;\n            }.bind(this));\n            k.forEach(function(l) {\n                var m = this._allRequests[l];\n                delete this._allRequests[l];\n                this._attemptCallback(m.fn, m.request, m.options);\n            }.bind(this));\n        },\n        _attemptCallback: function(j, k, l) {\n            var m = this._callbackArgHandler(k, l);\n            if (m) {\n                var n = {\n                    ids: k\n                };\n                g.applyWithGuard(j, n, m);\n            }\n        ;\n            return !!m;\n        }\n    });\n    e.exports = i;\n});\n__d(\"deferred\", [], function(a, b, c, d, e, f) {\n    var g = 0, h = 1, i = 2, j = 4, k = \"callbacks\", l = \"errbacks\", m = \"cancelbacks\", n = \"completeCallbacks\", o = [], p = o.slice, q = o.unshift;\n    function r(w, x) {\n        return (w ? p.call(w, x) : o);\n    };\n    function s(w, x) {\n        return ((x < w.length) ? r(w, x) : o);\n    };\n    function t() {\n        this.$Deferred0 = g;\n    };\n    t.prototype.addCallback = function(w, x) {\n        return this.$Deferred1(h, this.$Deferred2(k), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(k), w, x);\n    };\n    t.prototype.addCompleteCallback = function(w, x) {\n        return this.$Deferred1(null, this.$Deferred2(n), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCompleteCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(n), w, x);\n    };\n    t.prototype.addErrback = function(w, x) {\n        return this.$Deferred1(i, this.$Deferred2(l), w, x, s(arguments, 2));\n    };\n    t.prototype.removeErrback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(l), w, x);\n    };\n    t.prototype.addCancelback = function(w, x) {\n        return this.$Deferred1(j, this.$Deferred2(m), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCancelback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(m), w, x);\n    };\n    t.prototype.getStatus = function() {\n        return this.$Deferred0;\n    };\n    t.prototype.setStatus = function(w) {\n        var x;\n        this.$Deferred0 = w;\n        this.callbackArgs = r(arguments, 1);\n        if ((w === i)) {\n            x = l;\n        }\n         else if ((w === h)) {\n            x = k;\n        }\n         else if ((w === j)) {\n            x = m;\n        }\n        \n    ;\n        if (x) {\n            this.$Deferred4(this[x], this.callbackArgs);\n        };\n        this.$Deferred4(this[n], this.callbackArgs);\n        return this;\n    };\n    t.prototype.setTimeout = function(w) {\n        if (this.timeout) {\n            this.clearTimeout();\n        };\n        this.$Deferred5 = (this.$Deferred5 || this.fail.bind(this));\n        this.timeout = window.setTimeout(this.$Deferred5, w);\n    };\n    t.prototype.clearTimeout = function() {\n        window.clearTimeout(this.timeout);\n        delete this.timeout;\n    };\n    t.prototype.succeed = function() {\n        return this.$Deferred6(h, arguments);\n    };\n    t.prototype.fail = function() {\n        return this.$Deferred6(i, arguments);\n    };\n    t.prototype.cancel = function() {\n        delete this[k];\n        delete this[l];\n        return this.$Deferred6(j, arguments);\n    };\n    t.prototype.$Deferred6 = function(w, x) {\n        q.call(x, w);\n        return this.setStatus.apply(this, x);\n    };\n    t.prototype.$Deferred2 = function(w) {\n        return (this[w] || (this[w] = []));\n    };\n    t.prototype.then = function(w, x, y, z) {\n        var aa = new t(), w, ba, ca, da = r(arguments, 0);\n        if ((typeof da[0] === \"function\")) {\n            w = da.shift();\n        };\n        if ((typeof da[0] === \"function\")) {\n            ba = da.shift();\n        };\n        if ((typeof da[0] === \"function\")) {\n            ca = da.shift();\n        };\n        var ea = da.shift();\n        if (w) {\n            var fa = [this.$Deferred7,this,aa,\"succeed\",w,ea,].concat(da);\n            this.addCallback.apply(this, fa);\n        }\n         else this.addCallback(aa.succeed, aa);\n    ;\n        if (ba) {\n            var ga = [this.$Deferred7,this,aa,\"fail\",ba,ea,].concat(da);\n            this.addErrback.apply(this, ga);\n        }\n         else this.addErrback(aa.fail, aa);\n    ;\n        if (ca) {\n            var ha = [this.$Deferred7,this,aa,\"cancel\",ca,ea,].concat(da);\n            this.addCancelback.apply(this, ha);\n        }\n         else this.addCancelback(aa.cancel, aa);\n    ;\n        return aa;\n    };\n    t.prototype.$Deferred1 = function(w, x, y, z, aa) {\n        var ba = this.getStatus();\n        if ((((!w && (ba !== g))) || (ba === w))) {\n            y.apply((z || this), aa.concat(this.callbackArgs));\n        }\n         else x.push(y, z, aa);\n    ;\n        return this;\n    };\n    t.prototype.$Deferred3 = function(w, x, y) {\n        for (var z = 0; (z < w.length); z += 3) {\n            if (((w[z] === x) && ((!y || (w[(z + 1)] === y))))) {\n                w.splice(z, 3);\n                if (y) {\n                    break;\n                };\n                z -= 3;\n            }\n        ;\n        };\n        return this;\n    };\n    t.prototype.pipe = function(w) {\n        this.addCallback(w.succeed, w).addErrback(w.fail, w).addCancelback(w.cancel, w);\n    };\n    t.prototype.$Deferred4 = function(w, x) {\n        for (var y = 0; (y < ((w || o)).length); y += 3) {\n            w[y].apply((w[(y + 1)] || this), ((w[(y + 2)] || o)).concat(x));;\n        };\n    };\n    t.prototype.$Deferred7 = function(w, x, y, z) {\n        var aa = r(arguments, 4), ba = y.apply(z, aa);\n        if ((ba instanceof t)) {\n            ba.pipe(w);\n        }\n         else w[x](ba);\n    ;\n    };\n    var u = ((t === null) ? null : t.prototype);\n    v.prototype = Object.create(u);\n    v.prototype.constructor = v;\n    v.__superConstructor__ = t;\n    function v(w) {\n        t.call(this);\n        this.completed = 0;\n        this.list = [];\n        if (w) {\n            w.forEach(this.waitFor, this);\n            this.startWaiting();\n        }\n    ;\n    };\n    v.prototype.startWaiting = function() {\n        this.waiting = true;\n        this.checkDeferreds();\n        return this;\n    };\n    v.prototype.waitFor = function(w) {\n        this.list.push(w);\n        this.checkDeferreds();\n        w.addCompleteCallback(this.deferredComplete, this);\n        return this;\n    };\n    v.prototype.createWaitForDeferred = function() {\n        var w = new t();\n        this.waitFor(w);\n        return w;\n    };\n    v.prototype.createWaitForCallback = function() {\n        var w = this.createWaitForDeferred();\n        return w.succeed.bind(w);\n    };\n    v.prototype.deferredComplete = function() {\n        this.completed++;\n        if ((this.completed === this.list.length)) {\n            this.checkDeferreds();\n        };\n    };\n    v.prototype.checkDeferreds = function() {\n        if ((!this.waiting || (this.completed !== this.list.length))) {\n            return\n        };\n        var w = false, x = false, y = [g,];\n        for (var z = 0, aa = this.list.length; (z < aa); z++) {\n            var ba = this.list[z];\n            y.push([ba,].concat(ba.callbackArgs));\n            if ((ba.getStatus() === i)) {\n                w = true;\n            }\n             else if ((ba.getStatus() === j)) {\n                x = true;\n            }\n        ;\n        };\n        if (w) {\n            y[0] = i;\n            this.fail.apply(this, y);\n        }\n         else if (x) {\n            y[0] = j;\n            this.cancel.apply(this, y);\n        }\n         else {\n            y[0] = h;\n            this.succeed.apply(this, y);\n        }\n        \n    ;\n    };\n    f.Deferred = t;\n    f.DeferredList = v;\n    f.Deferred.toArray = r;\n    f.Deferred.STATUS_UNKNOWN = g;\n    f.Deferred.STATUS_SUCCEEDED = h;\n    f.Deferred.STATUS_CANCELED = j;\n    f.Deferred.STATUS_FAILED = i;\n});\n__d(\"KeyedCallbackManager\", [\"CallbackManagerController\",\"deferred\",\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"deferred\").Deferred, i = b(\"ErrorUtils\"), j = b(\"copyProperties\"), k = function() {\n        this._resources = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n    };\n    j(k.prototype, {\n        executeOrEnqueue: function(l, m) {\n            if (!((l instanceof Array))) {\n                var n = l, o = m;\n                l = [l,];\n                m = function(p) {\n                    o(p[n]);\n                };\n            }\n        ;\n            l = l.filter(function(p) {\n                var q = (((p !== null) && (p !== undefined)));\n                if (!q) {\n                    i.applyWithGuard(function() {\n                        throw new Error(((\"KeyedCallbackManager.executeOrEnqueue: key \" + JSON.stringify(p)) + \" is invalid\"));\n                    });\n                };\n                return q;\n            });\n            return this._controller.executeOrEnqueue(l, m);\n        },\n        deferredExecuteOrEnqueue: function(l) {\n            var m = new h();\n            this.executeOrEnqueue(l, m.succeed.bind(m));\n            return m;\n        },\n        unsubscribe: function(l) {\n            this._controller.unsubscribe(l);\n        },\n        reset: function() {\n            this._controller.reset();\n            this._resources = {\n            };\n        },\n        getUnavailableResources: function(l) {\n            var m = this._controller.getRequest(l), n = [];\n            if (m) {\n                n = m.request.filter(function(o) {\n                    return !this._resources[o];\n                }.bind(this));\n            };\n            return n;\n        },\n        getUnavailableResourcesFromRequest: function(l) {\n            var m = (Array.isArray(l) ? l : [l,]);\n            return m.filter(function(n) {\n                if (((n !== null) && (n !== undefined))) {\n                    return !this._resources[n]\n                };\n            }, this);\n        },\n        addResourcesAndExecute: function(l) {\n            j(this._resources, l);\n            this._controller.runPossibleCallbacks();\n        },\n        setResource: function(l, m) {\n            this._resources[l] = m;\n            this._controller.runPossibleCallbacks();\n        },\n        getResource: function(l) {\n            return this._resources[l];\n        },\n        getAllResources: function() {\n            return this._resources;\n        },\n        dumpResources: function() {\n            var l = {\n            };\n            for (var m in this._resources) {\n                var n = this._resources[m];\n                if ((typeof n === \"object\")) {\n                    n = j({\n                    }, n);\n                };\n                l[m] = n;\n            };\n            return l;\n        },\n        _constructCallbackArg: function(l) {\n            var m = {\n            };\n            for (var n = 0; (n < l.length); n++) {\n                var o = l[n], p = this._resources[o];\n                if ((typeof p == \"undefined\")) {\n                    return false\n                };\n                m[o] = p;\n            };\n            return [m,];\n        }\n    });\n    e.exports = k;\n});\n__d(\"BaseAsyncLoader\", [\"KeyedCallbackManager\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"copyProperties\"), i = {\n    };\n    function j(l, m, n) {\n        var o = new g(), p = false, q = [];\n        function r() {\n            if ((!q.length || p)) {\n                return\n            };\n            p = true;\n            t.defer();\n        };\n        function s(w) {\n            p = false;\n            w.forEach(o.unsubscribe.bind(o));\n            r();\n        };\n        function t() {\n            var w = {\n            }, x = [];\n            q = q.filter(function(z) {\n                var aa = o.getUnavailableResources(z);\n                if (aa.length) {\n                    aa.forEach(function(ba) {\n                        w[ba] = true;\n                    });\n                    x.push(z);\n                    return true;\n                }\n            ;\n                return false;\n            });\n            var y = Object.keys(w);\n            if (y.length) {\n                n(l, y, x, u.curry(x), v.curry(x));\n            }\n             else p = false;\n        ;\n        };\n        function u(w, x) {\n            var y = (x.payload[m] || x.payload);\n            o.addResourcesAndExecute(y);\n            s(w);\n        };\n        function v(w) {\n            s(w);\n        };\n        return {\n            get: function(w, x) {\n                var y = o.executeOrEnqueue(w, x), z = o.getUnavailableResources(y);\n                if (z.length) {\n                    q.push(y);\n                    r();\n                }\n            ;\n            },\n            getCachedKeys: function() {\n                return Object.keys(o.getAllResources());\n            },\n            getNow: function(w) {\n                return (o.getResource(w) || null);\n            },\n            set: function(w) {\n                o.addResourcesAndExecute(w);\n            }\n        };\n    };\n    function k(l, m) {\n        throw (\"BaseAsyncLoader can't be instantiated\");\n    };\n    h(k.prototype, {\n        _getLoader: function() {\n            if (!i[this._endpoint]) {\n                i[this._endpoint] = j(this._endpoint, this._type, this.send);\n            };\n            return i[this._endpoint];\n        },\n        get: function(l, m) {\n            return this._getLoader().get(l, m);\n        },\n        getCachedKeys: function() {\n            return this._getLoader().getCachedKeys();\n        },\n        getNow: function(l) {\n            return this._getLoader().getNow(l);\n        },\n        reset: function() {\n            i[this._endpoint] = null;\n        },\n        set: function(l) {\n            this._getLoader().set(l);\n        }\n    });\n    e.exports = k;\n});\n__d(\"AjaxLoader\", [\"copyProperties\",\"FBAjaxRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"FBAjaxRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        var p = new h(\"GET\", k, {\n            ids: l\n        });\n        p.onJSON = function(q) {\n            n({\n                payload: q.json\n            });\n        };\n        p.onError = o;\n        p.send();\n    };\n    e.exports = j;\n});\n__d(\"CLoggerX\", [\"Banzai\",\"DOM\",\"debounce\",\"Event\",\"ge\",\"Parent\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"DOM\"), i = b(\"debounce\"), j = b(\"Event\"), k = b(\"ge\"), l = b(\"Parent\"), m = ((10 * 60) * 1000), n = b(\"Keys\").RETURN, o = {\n    }, p = function(s) {\n        var t = ((s.target || s.srcElement)).id, u = ((s.target || s.srcElement)).value.trim().length, v = q.getTracker(t);\n        if (!v) {\n            return\n        };\n        if (((u > 5) && !v.submitted)) {\n            g.post(\"censorlogger\", {\n                cl_impid: v.impid,\n                clearcounter: v.clearcounter,\n                instrument: v.type,\n                elementid: t,\n                parent_fbid: (((v.parent_fbid == \"unknown\") ? null : v.parent_fbid)),\n                version: \"x\"\n            }, g.VITAL);\n            q.setSubmitted(t, true);\n        }\n         else if ((((u === 0) && v.submitted) && (s.which != n))) {\n            o[t] = r(t);\n            o[t]();\n        }\n         else if (((u > 0) && v.submitted)) {\n            if (o[t]) {\n                o[t].reset();\n            }\n        }\n        \n    ;\n    }, q = {\n        init: function() {\n            this.trackedElements = (this.trackedElements || {\n            });\n            this.feedbackForms = (this.feedbackForms || {\n            });\n        },\n        setImpressionID: function(s) {\n            this.init();\n            this.impressionID = s;\n            this.clean();\n        },\n        setComposerTargetData: function(s) {\n            this.cTargetID = (s.targetID || \"unknown\");\n            this.cTargetFBType = (s.targetType || \"unknown\");\n        },\n        clean: function() {\n            for (var s in this.trackedElements) {\n                if (o[s]) {\n                    o[s].reset();\n                    delete o[s];\n                }\n            ;\n                delete this.trackedElements[s];\n            };\n        },\n        trackComposer: function(s, t, u) {\n            this.setComposerTargetData(u);\n            this.startTracking(s, \"composer\", this.cTargetID, this.cTargetFBType, t);\n        },\n        trackFeedbackForm: function(s, t, u) {\n            this.init();\n            this.impressionID = (this.impressionID || u);\n            var v, w, x;\n            v = h.getID(s);\n            w = (t ? (t.targetID || \"unknown\") : \"unknown\");\n            x = (t ? (t.targetType || \"unknown\") : \"unknown\");\n            this.feedbackForms[v] = {\n                parent_fbid: w,\n                parent_type: x\n            };\n        },\n        trackMentionsInput: function(s, t) {\n            this.init();\n            var u, v, w;\n            if (!s) {\n                return\n            };\n            u = l.byTag(s, \"form\");\n            if (!u) {\n                return\n            };\n            v = h.getID(u);\n            w = this.feedbackForms[v];\n            if (!w) {\n                return\n            };\n            var x = (t || w.parent_fbid), y = (t ? 416 : w.parent_type);\n            this.startTracking(s, \"comment\", x, y, u);\n        },\n        startTracking: function(s, t, u, v, w) {\n            this.init();\n            var x = h.getID(s);\n            if (this.getTracker(x)) {\n                return\n            };\n            var y = h.getID(w);\n            j.listen(s, \"keyup\", p.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: t,\n                impid: this.impressionID,\n                parent_fbid: u,\n                parent_type: v,\n                parentElID: y\n            };\n            this.addJoinTableInfoToForm(w, x);\n        },\n        getTracker: function(s) {\n            return ((this.trackedElements ? this.trackedElements[s] : null));\n        },\n        setSubmitted: function(s, t) {\n            if (this.trackedElements[s]) {\n                this.trackedElements[s].submitted = t;\n            };\n        },\n        incrementClearCounter: function(s) {\n            var t = this.getTracker(s);\n            if (!t) {\n                return\n            };\n            t.clearcounter++;\n            t.submitted = false;\n            var u = h.scry(k(t.parentElID), \"input[name=\\\"clp\\\"]\")[0];\n            if (u) {\n                u.value = this.getJSONRepForTrackerID(s);\n            };\n            this.trackedElements[s] = t;\n        },\n        addJoinTableInfoToForm: function(s, t) {\n            var u = this.getTracker(t);\n            if (!u) {\n                return\n            };\n            var v = h.scry(s, \"input[name=\\\"clp\\\"]\")[0];\n            if (!v) {\n                h.prependContent(s, h.create(\"input\", {\n                    type: \"hidden\",\n                    name: \"clp\",\n                    value: this.getJSONRepForTrackerID(t)\n                }));\n            };\n        },\n        getCLParamsForTarget: function(s, t) {\n            if (!s) {\n                return \"\"\n            };\n            var u = h.getID(s);\n            return this.getJSONRepForTrackerID(u, t);\n        },\n        getJSONRepForTrackerID: function(s, t) {\n            var u = this.getTracker(s);\n            if (!u) {\n                return \"\"\n            };\n            return JSON.stringify({\n                cl_impid: u.impid,\n                clearcounter: u.clearcounter,\n                elementid: s,\n                version: \"x\",\n                parent_fbid: (t || u.parent_fbid)\n            });\n        }\n    }, r = function(s) {\n        return i(function() {\n            q.incrementClearCounter(s);\n        }, m, q);\n    };\n    e.exports = q;\n});\n__d(\"ChannelConstants\", [], function(a, b, c, d, e, f) {\n    var g = \"channel/\", h = {\n        ON_SHUTDOWN: (g + \"shutdown\"),\n        ON_INVALID_HISTORY: (g + \"invalid_history\"),\n        ON_CONFIG: (g + \"config\"),\n        ON_ENTER_STATE: (g + \"enter_state\"),\n        ON_EXIT_STATE: (g + \"exit_state\"),\n        OK: \"ok\",\n        ERROR: \"error\",\n        ERROR_MAX: \"error_max\",\n        ERROR_MISSING: \"error_missing\",\n        ERROR_MSG_TYPE: \"error_msg_type\",\n        ERROR_SHUTDOWN: \"error_shutdown\",\n        ERROR_STALE: \"error_stale\",\n        SYS_OWNER: \"sys_owner\",\n        SYS_NONOWNER: \"sys_nonowner\",\n        SYS_ONLINE: \"sys_online\",\n        SYS_OFFLINE: \"sys_offline\",\n        SYS_TIMETRAVEL: \"sys_timetravel\",\n        HINT_AUTH: \"shutdown auth\",\n        HINT_CONN: \"shutdown conn\",\n        HINT_DISABLED: \"shutdown disabled\",\n        HINT_INVALID_STATE: \"shutdown invalid state\",\n        HINT_MAINT: \"shutdown maint\",\n        HINT_UNSUPPORTED: \"shutdown unsupported\",\n        reason_Unknown: 0,\n        reason_AsyncError: 1,\n        reason_TooLong: 2,\n        reason_Refresh: 3,\n        reason_RefreshDelay: 4,\n        reason_UIRestart: 5,\n        reason_NeedSeq: 6,\n        reason_PrevFailed: 7,\n        reason_IFrameLoadGiveUp: 8,\n        reason_IFrameLoadRetry: 9,\n        reason_IFrameLoadRetryWorked: 10,\n        reason_PageTransitionRetry: 11,\n        reason_IFrameLoadMaxSubdomain: 12,\n        reason_NoChannelInfo: 13,\n        reason_NoChannelHost: 14,\n        CAPABILITY_VOIP: 8,\n        getArbiterType: function(i) {\n            return ((g + \"message:\") + i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"ShortProfiles\", [\"ArbiterMixin\",\"AjaxLoader\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AjaxLoader\"), i = b(\"Env\"), j = b(\"FBAjaxRequest\"), k = b(\"JSLogger\"), l = b(\"copyProperties\"), m = \"/ajax/chat/user_info.php\", n = \"/ajax/chat/user_info_all.php\", o = new h(m, \"profiles\"), p = false, q = k.create(\"short_profiles\");\n    function r() {\n        if (!p) {\n            q.log(\"fetch_all\");\n            p = true;\n            var u = new j(\"GET\", n, {\n                viewer: i.user\n            });\n            u.onJSON = function(v) {\n                o.set(v.json);\n                t.inform(\"updated\");\n            };\n            u.send();\n        }\n    ;\n    };\n    function s(u) {\n        return JSON.parse(JSON.stringify(u));\n    };\n    var t = {\n    };\n    l(t, g, {\n        get: function(u, v) {\n            this.getMulti([u,], function(w) {\n                v(w[u], u);\n            });\n        },\n        getMulti: function(u, v) {\n            function w(x) {\n                v(s(x));\n            };\n            o.get(u, w);\n        },\n        getNow: function(u) {\n            return s((o.getNow(u) || null));\n        },\n        getNowUnsafe: function(u) {\n            return (o.getNow(u) || null);\n        },\n        getCachedProfileIDs: function() {\n            return o.getCachedKeys();\n        },\n        hasAll: function() {\n            return p;\n        },\n        fetchAll: function() {\n            r();\n        },\n        set: function(u, v) {\n            var w = {\n            };\n            w[u] = v;\n            this.setMulti(w);\n        },\n        setMulti: function(u) {\n            o.set(s(u));\n        }\n    });\n    e.exports = t;\n});\n__d(\"ClickTTIIdentifiers\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            TIMELINE_SEE_LIKERS: \"timeline:seelikes\"\n        },\n        getUserActionID: function(h) {\n            return ((\"{\\\"ua_id\\\":\\\"\" + h) + \"\\\"}\");\n        }\n    };\n    e.exports = g;\n});\n__d(\"ReactCurrentOwner\", [], function(a, b, c, d, e, f) {\n    var g = {\n        current: null\n    };\n    e.exports = g;\n});\n__d(\"CSSProperty\", [], function(a, b, c, d, e, f) {\n    var g = {\n        fillOpacity: true,\n        fontWeight: true,\n        opacity: true,\n        orphans: true,\n        zIndex: true,\n        zoom: true\n    }, h = {\n        background: {\n            backgroundImage: true,\n            backgroundPosition: true,\n            backgroundRepeat: true,\n            backgroundColor: true\n        },\n        border: {\n            borderWidth: true,\n            borderStyle: true,\n            borderColor: true\n        },\n        borderBottom: {\n            borderBottomWidth: true,\n            borderBottomStyle: true,\n            borderBottomColor: true\n        },\n        borderLeft: {\n            borderLeftWidth: true,\n            borderLeftStyle: true,\n            borderLeftColor: true\n        },\n        borderRight: {\n            borderRightWidth: true,\n            borderRightStyle: true,\n            borderRightColor: true\n        },\n        borderTop: {\n            borderTopWidth: true,\n            borderTopStyle: true,\n            borderTopColor: true\n        },\n        font: {\n            fontStyle: true,\n            fontVariant: true,\n            fontWeight: true,\n            fontSize: true,\n            lineHeight: true,\n            fontFamily: true\n        }\n    }, i = {\n        isUnitlessNumber: g,\n        shorthandPropertyExpansions: h\n    };\n    e.exports = i;\n});\n__d(\"dangerousStyleValue\", [\"CSSProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\");\n    function h(i, j) {\n        var k = (((j == null) || (typeof j === \"boolean\")) || (j === \"\"));\n        if (k) {\n            return \"\"\n        };\n        var l = isNaN(j);\n        if (((l || (j === 0)) || g.isUnitlessNumber[i])) {\n            return (\"\" + j)\n        };\n        return (j + \"px\");\n    };\n    e.exports = h;\n});\n__d(\"throwIf\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        if (h) {\n            throw new Error(i)\n        };\n    };\n    e.exports = g;\n});\n__d(\"escapeTextForBrowser\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h, i = {\n        \"&\": \"&amp;\",\n        \"\\u003E\": \"&gt;\",\n        \"\\u003C\": \"&lt;\",\n        \"\\\"\": \"&quot;\",\n        \"'\": \"&#x27;\",\n        \"/\": \"&#x2f;\"\n    };\n    function j(l) {\n        return i[l];\n    };\n    var k = function(l) {\n        var m = typeof l, n = (m === \"object\");\n        if (((l === \"\") || n)) {\n            return \"\";\n        }\n         else if ((m === \"string\")) {\n            return l.replace(/[&><\"'\\/]/g, j);\n        }\n         else return ((\"\" + l)).replace(/[&><\"'\\/]/g, j)\n        \n    ;\n    };\n    e.exports = k;\n});\n__d(\"memoizeStringOnly\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = {\n        };\n        return function(j) {\n            if (i.hasOwnProperty(j)) {\n                return i[j];\n            }\n             else return i[j] = h.call(this, j)\n        ;\n        };\n    };\n    e.exports = g;\n});\n__d(\"CSSPropertyOperations\", [\"CSSProperty\",\"dangerousStyleValue\",\"escapeTextForBrowser\",\"hyphenate\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\"), h = b(\"dangerousStyleValue\"), i = b(\"escapeTextForBrowser\"), j = b(\"hyphenate\"), k = b(\"memoizeStringOnly\"), l = k(function(n) {\n        return i(j(n));\n    }), m = {\n        createMarkupForStyles: function(n) {\n            var o = \"\";\n            for (var p in n) {\n                if (!n.hasOwnProperty(p)) {\n                    continue;\n                };\n                var q = n[p];\n                if ((q != null)) {\n                    o += (l(p) + \":\");\n                    o += (h(p, q) + \";\");\n                }\n            ;\n            };\n            return (o || null);\n        },\n        setValueForStyles: function(n, o) {\n            var p = n.style;\n            for (var q in o) {\n                if (!o.hasOwnProperty(q)) {\n                    continue;\n                };\n                var r = h(q, o[q]);\n                if (r) {\n                    p[q] = r;\n                }\n                 else {\n                    var s = g.shorthandPropertyExpansions[q];\n                    if (s) {\n                        for (var t in s) {\n                            p[t] = \"\";;\n                        };\n                    }\n                     else p[q] = \"\";\n                ;\n                }\n            ;\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ExecutionEnvironment\", [], function(a, b, c, d, e, f) {\n    var g = (typeof window !== \"undefined\"), h = {\n        canUseDOM: g,\n        canUseWorkers: (typeof Worker !== \"undefined\"),\n        isInWorker: !g,\n        global: new Function(\"return this;\")()\n    };\n    e.exports = h;\n});\n__d(\"Danger\", [\"ExecutionEnvironment\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"throwIf\"), i, j, k, l, m = {\n    };\n    function n(t) {\n        var u = t.tagName;\n        return (m[u] || (m[u] = document.createElement(u)));\n    };\n    function o(t, u, v) {\n        if (v) {\n            if (v.nextSibling) {\n                return t.insertBefore(u, v.nextSibling);\n            }\n             else return t.appendChild(u)\n        ;\n        }\n         else return t.insertBefore(u, t.firstChild)\n    ;\n    };\n    function p(t, u, v) {\n        var w, x = u.length;\n        for (var y = 0; (y < x); y++) {\n            w = o(t, u[0], (w || v));;\n        };\n    };\n    function q(t, u, v) {\n        var w = n(t);\n        w.innerHTML = u;\n        var x = w.childNodes, y = (v ? t.childNodes[(v - 1)] : null);\n        p(t, x, y);\n    };\n    function r(t, u) {\n        var v = t.parentNode, w = n(v);\n        w.innerHTML = u;\n        var x = w.childNodes;\n        v.replaceChild(x[0], t);\n    };\n    var s = {\n        dangerouslyInsertMarkupAt: q,\n        dangerouslyReplaceNodeWithMarkup: r\n    };\n    e.exports = s;\n});\n__d(\"insertNodeAt\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = h.childNodes, l = h.childNodes[j];\n        if ((l === i)) {\n            return i\n        };\n        if (i.parentNode) {\n            i.parentNode.removeChild(i);\n        };\n        if ((j >= k.length)) {\n            h.appendChild(i);\n        }\n         else h.insertBefore(i, k[j]);\n    ;\n        return i;\n    };\n    e.exports = g;\n});\n__d(\"keyOf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i;\n        for (i in h) {\n            if (!h.hasOwnProperty(i)) {\n                continue;\n            };\n            return i;\n        };\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"DOMChildrenOperations\", [\"Danger\",\"insertNodeAt\",\"keyOf\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"Danger\"), h = b(\"insertNodeAt\"), i = b(\"keyOf\"), j = b(\"throwIf\"), k, l = i({\n        moveFrom: null\n    }), m = i({\n        insertMarkup: null\n    }), n = i({\n        removeAt: null\n    }), o = function(u, v) {\n        var w, x, y;\n        for (var z = 0; (z < v.length); z++) {\n            x = v[z];\n            if ((l in x)) {\n                w = (w || []);\n                y = x.moveFrom;\n                w[y] = u.childNodes[y];\n            }\n             else if ((n in x)) {\n                w = (w || []);\n                y = x.removeAt;\n                w[y] = u.childNodes[y];\n            }\n            \n        ;\n        };\n        return w;\n    }, p = function(u, v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            if (x) {\n                u.removeChild(v[w]);\n            };\n        };\n    }, q = function(u, v, w) {\n        var x, y, z = -1, aa;\n        for (var ba = 0; (ba < v.length); ba++) {\n            aa = v[ba];\n            if ((l in aa)) {\n                x = w[aa.moveFrom];\n                y = aa.finalIndex;\n                h(u, x, y);\n            }\n             else if (!((n in aa))) {\n                if ((m in aa)) {\n                    y = aa.finalIndex;\n                    var ca = aa.insertMarkup;\n                    g.dangerouslyInsertMarkupAt(u, ca, y);\n                }\n            \n            }\n        ;\n        };\n    }, r = function(u, v) {\n        var w = o(u, v);\n        if (w) {\n            p(u, w);\n        };\n        q(u, v, w);\n    }, s = function(u, v, w) {\n        u.childNodes[v].nodeValue = w;\n    }, t = {\n        dangerouslyReplaceNodeWithMarkup: g.dangerouslyReplaceNodeWithMarkup,\n        manageChildren: r,\n        setTextNodeValueAtIndex: s\n    };\n    e.exports = t;\n});\n__d(\"DOMProperty\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        MUST_USE_ATTRIBUTE: 1,\n        MUST_USE_PROPERTY: 2,\n        HAS_BOOLEAN_VALUE: 4,\n        HAS_SIDE_EFFECTS: 8,\n        injectDOMPropertyConfig: function(k) {\n            var l = (k.Properties || {\n            }), m = (k.DOMAttributeNames || {\n            }), n = (k.DOMPropertyNames || {\n            }), o = (k.DOMMutationMethods || {\n            });\n            if (k.isCustomAttribute) {\n                j._isCustomAttributeFunctions.push(k.isCustomAttribute);\n            };\n            for (var p in l) {\n                g(!j.isStandardName[p]);\n                j.isStandardName[p] = true;\n                j.getAttributeName[p] = (m[p] || p.toLowerCase());\n                j.getPropertyName[p] = (n[p] || p);\n                var q = o[p];\n                if (q) {\n                    j.getMutationMethod[p] = q;\n                };\n                var r = l[p];\n                j.mustUseAttribute[p] = (r & h.MUST_USE_ATTRIBUTE);\n                j.mustUseProperty[p] = (r & h.MUST_USE_PROPERTY);\n                j.hasBooleanValue[p] = (r & h.HAS_BOOLEAN_VALUE);\n                j.hasSideEffects[p] = (r & h.HAS_SIDE_EFFECTS);\n                g((!j.mustUseAttribute[p] || !j.mustUseProperty[p]));\n                g((j.mustUseProperty[p] || !j.hasSideEffects[p]));\n            };\n        }\n    }, i = {\n    }, j = {\n        isStandardName: {\n        },\n        getAttributeName: {\n        },\n        getPropertyName: {\n        },\n        getMutationMethod: {\n        },\n        mustUseAttribute: {\n        },\n        mustUseProperty: {\n        },\n        hasBooleanValue: {\n        },\n        hasSideEffects: {\n        },\n        _isCustomAttributeFunctions: [],\n        isCustomAttribute: function(k) {\n            return j._isCustomAttributeFunctions.some(function(l) {\n                return l.call(null, k);\n            });\n        },\n        getDefaultValueForProperty: function(k, l) {\n            var m = i[k], n;\n            if (!m) {\n                i[k] = m = {\n                };\n            };\n            if (!((l in m))) {\n                n = document.createElement(k);\n                m[l] = n[l];\n            }\n        ;\n            return m[l];\n        },\n        injection: h\n    };\n    e.exports = j;\n});\n__d(\"DOMPropertyOperations\", [\"DOMProperty\",\"escapeTextForBrowser\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = b(\"escapeTextForBrowser\"), i = b(\"memoizeStringOnly\"), j = i(function(l) {\n        return (h(l) + \"=\\\"\");\n    }), k = {\n        createMarkupForProperty: function(l, m) {\n            if (g.isStandardName[l]) {\n                if (((m == null) || (g.hasBooleanValue[l] && !m))) {\n                    return \"\"\n                };\n                var n = g.getAttributeName[l];\n                return ((j(n) + h(m)) + \"\\\"\");\n            }\n             else if (g.isCustomAttribute(l)) {\n                if ((m == null)) {\n                    return \"\"\n                };\n                return ((j(l) + h(m)) + \"\\\"\");\n            }\n             else return null\n            \n        ;\n        },\n        setValueForProperty: function(l, m, n) {\n            if (g.isStandardName[m]) {\n                var o = g.getMutationMethod[m];\n                if (o) {\n                    o(l, n);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    if ((g.hasBooleanValue[m] && !n)) {\n                        l.removeAttribute(g.getAttributeName[m]);\n                    }\n                     else l.setAttribute(g.getAttributeName[m], n);\n                ;\n                }\n                 else {\n                    var p = g.getPropertyName[m];\n                    if ((!g.hasSideEffects[m] || (l[p] !== n))) {\n                        l[p] = n;\n                    };\n                }\n                \n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.setAttribute(m, n);\n            }\n        ;\n        },\n        deleteValueForProperty: function(l, m) {\n            if (g.isStandardName[m]) {\n                var n = g.getMutationMethod[m];\n                if (n) {\n                    n(l, undefined);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    l.removeAttribute(g.getAttributeName[m]);\n                }\n                 else {\n                    var o = g.getPropertyName[m];\n                    l[o] = g.getDefaultValueForProperty(l.nodeName, m);\n                }\n                \n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.removeAttribute(m);\n            }\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"keyMirror\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"NOT_OBJECT_ERROR\", i = function(j) {\n        var k = {\n        }, l;\n        g((!((j instanceof Object)) || Array.isArray(j)), h);\n        for (l in j) {\n            if (!j.hasOwnProperty(l)) {\n                continue;\n            };\n            k[l] = l;\n        };\n        return k;\n    };\n    e.exports = i;\n});\n__d(\"EventConstants\", [\"keyMirror\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = g({\n        bubbled: null,\n        captured: null\n    }), i = g({\n        topBlur: null,\n        topChange: null,\n        topClick: null,\n        topDOMCharacterDataModified: null,\n        topDoubleClick: null,\n        topDrag: null,\n        topDragEnd: null,\n        topDragEnter: null,\n        topDragExit: null,\n        topDragLeave: null,\n        topDragOver: null,\n        topDragStart: null,\n        topDrop: null,\n        topFocus: null,\n        topInput: null,\n        topKeyDown: null,\n        topKeyPress: null,\n        topKeyUp: null,\n        topMouseDown: null,\n        topMouseMove: null,\n        topMouseOut: null,\n        topMouseOver: null,\n        topMouseUp: null,\n        topScroll: null,\n        topSelectionChange: null,\n        topSubmit: null,\n        topTouchCancel: null,\n        topTouchEnd: null,\n        topTouchMove: null,\n        topTouchStart: null,\n        topWheel: null\n    }), j = {\n        topLevelTypes: i,\n        PropagationPhases: h\n    };\n    e.exports = j;\n});\n__d(\"EventListener\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = {\n        listen: g.listen,\n        capture: function(i, j, k) {\n            if (!i.addEventListener) {\n                return;\n            }\n             else i.addEventListener(j, k, true);\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"CallbackRegistry\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        putListener: function(i, j, k) {\n            var l = (g[j] || (g[j] = {\n            }));\n            l[i] = k;\n        },\n        getListener: function(i, j) {\n            var k = g[j];\n            return (k && k[i]);\n        },\n        deleteListener: function(i, j) {\n            var k = g[j];\n            if (k) {\n                delete k[i];\n            };\n        },\n        deleteAllListeners: function(i) {\n            for (var j in g) {\n                delete g[j][i];;\n            };\n        },\n        __purge: function() {\n            g = {\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"EventPluginRegistry\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = null, i = {\n    };\n    function j() {\n        if (!h) {\n            return\n        };\n        for (var n in i) {\n            var o = i[n], p = h.indexOf(n);\n            g((p > -1));\n            if (m.plugins[p]) {\n                continue;\n            };\n            g(o.extractEvents);\n            m.plugins[p] = o;\n            var q = o.eventTypes;\n            for (var r in q) {\n                g(k(q[r], o));;\n            };\n        };\n    };\n    function k(n, o) {\n        var p = n.phasedRegistrationNames;\n        if (p) {\n            for (var q in p) {\n                if (p.hasOwnProperty(q)) {\n                    var r = p[q];\n                    l(r, o);\n                }\n            ;\n            };\n            return true;\n        }\n         else if (n.registrationName) {\n            l(n.registrationName, o);\n            return true;\n        }\n        \n    ;\n        return false;\n    };\n    function l(n, o) {\n        g(!m.registrationNames[n]);\n        m.registrationNames[n] = o;\n        m.registrationNamesKeys.push(n);\n    };\n    var m = {\n        plugins: [],\n        registrationNames: {\n        },\n        registrationNamesKeys: [],\n        injectEventPluginOrder: function(n) {\n            g(!h);\n            h = Array.prototype.slice.call(n);\n            j();\n        },\n        injectEventPluginsByName: function(n) {\n            var o = false;\n            for (var p in n) {\n                if (!n.hasOwnProperty(p)) {\n                    continue;\n                };\n                var q = n[p];\n                if ((i[p] !== q)) {\n                    g(!i[p]);\n                    i[p] = q;\n                    o = true;\n                }\n            ;\n            };\n            if (o) {\n                j();\n            };\n        },\n        getPluginModuleForEvent: function(event) {\n            var n = event.dispatchConfig;\n            if (n.registrationName) {\n                return (m.registrationNames[n.registrationName] || null)\n            };\n            for (var o in n.phasedRegistrationNames) {\n                if (!n.phasedRegistrationNames.hasOwnProperty(o)) {\n                    continue;\n                };\n                var p = m.registrationNames[n.phasedRegistrationNames[o]];\n                if (p) {\n                    return p\n                };\n            };\n            return null;\n        },\n        _resetEventPlugins: function() {\n            h = null;\n            for (var n in i) {\n                if (i.hasOwnProperty(n)) {\n                    delete i[n];\n                };\n            };\n            m.plugins.length = 0;\n            var o = m.registrationNames;\n            for (var p in o) {\n                if (o.hasOwnProperty(p)) {\n                    delete o[p];\n                };\n            };\n            m.registrationNamesKeys.length = 0;\n        }\n    };\n    e.exports = m;\n});\n__d(\"EventPluginUtils\", [\"EventConstants\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"invariant\"), i = g.topLevelTypes;\n    function j(u) {\n        return (((u === i.topMouseUp) || (u === i.topTouchEnd)) || (u === i.topTouchCancel));\n    };\n    function k(u) {\n        return ((u === i.topMouseMove) || (u === i.topTouchMove));\n    };\n    function l(u) {\n        return ((u === i.topMouseDown) || (u === i.topTouchStart));\n    };\n    var m;\n    function n(event, u) {\n        var v = event._dispatchListeners, w = event._dispatchIDs;\n        if (Array.isArray(v)) {\n            for (var x = 0; (x < v.length); x++) {\n                if (event.isPropagationStopped()) {\n                    break;\n                };\n                u(event, v[x], w[x]);\n            };\n        }\n         else if (v) {\n            u(event, v, w);\n        }\n    ;\n    };\n    function o(event, u, v) {\n        u(event, v);\n    };\n    function p(event, u) {\n        n(event, u);\n        event._dispatchListeners = null;\n        event._dispatchIDs = null;\n    };\n    function q(event) {\n        var u = event._dispatchListeners, v = event._dispatchIDs;\n        if (Array.isArray(u)) {\n            for (var w = 0; (w < u.length); w++) {\n                if (event.isPropagationStopped()) {\n                    break;\n                };\n                if (u[w](event, v[w])) {\n                    return v[w]\n                };\n            };\n        }\n         else if (u) {\n            if (u(event, v)) {\n                return v\n            }\n        }\n    ;\n        return null;\n    };\n    function r(event) {\n        var u = event._dispatchListeners, v = event._dispatchIDs;\n        h(!Array.isArray(u));\n        var w = (u ? u(event, v) : null);\n        event._dispatchListeners = null;\n        event._dispatchIDs = null;\n        return w;\n    };\n    function s(event) {\n        return !!event._dispatchListeners;\n    };\n    var t = {\n        isEndish: j,\n        isMoveish: k,\n        isStartish: l,\n        executeDispatchesInOrder: p,\n        executeDispatchesInOrderStopAtTrue: q,\n        executeDirectDispatch: r,\n        hasDispatches: s,\n        executeDispatch: o\n    };\n    e.exports = t;\n});\n__d(\"accumulate\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"INVALID_ACCUM_ARGS\";\n    function i(j, k) {\n        var l = (j == null), m = (k === null);\n        if (m) {\n            return j;\n        }\n         else if (l) {\n            return k;\n        }\n         else {\n            var n = Array.isArray(j), o = Array.isArray(k);\n            if (n) {\n                return j.concat(k);\n            }\n             else if (o) {\n                return [j,].concat(k);\n            }\n             else return [j,k,]\n            \n        ;\n        }\n        \n    ;\n    };\n    e.exports = i;\n});\n__d(\"forEachAccumulated\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i, j) {\n        if (Array.isArray(h)) {\n            h.forEach(i, j);\n        }\n         else if (h) {\n            i.call(j, h);\n        }\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventPropagators\", [\"CallbackRegistry\",\"EventConstants\",\"accumulate\",\"forEachAccumulated\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventConstants\"), i = b(\"accumulate\"), j = b(\"forEachAccumulated\"), k = g.getListener, l = h.PropagationPhases, m = {\n        InstanceHandle: null,\n        injectInstanceHandle: function(w) {\n            m.InstanceHandle = w;\n        },\n        validate: function() {\n            var w = ((!m.InstanceHandle || !m.InstanceHandle.traverseTwoPhase) || !m.InstanceHandle.traverseEnterLeave);\n            if (w) {\n                throw new Error(\"InstanceHandle not injected before use!\")\n            };\n        }\n    };\n    function n(w, event, x) {\n        var y = event.dispatchConfig.phasedRegistrationNames[x];\n        return k(w, y);\n    };\n    function o(w, x, event) {\n        var y = (x ? l.bubbled : l.captured), z = n(w, event, y);\n        if (z) {\n            event._dispatchListeners = i(event._dispatchListeners, z);\n            event._dispatchIDs = i(event._dispatchIDs, w);\n        }\n    ;\n    };\n    function p(event) {\n        if ((event && event.dispatchConfig.phasedRegistrationNames)) {\n            m.InstanceHandle.traverseTwoPhase(event.dispatchMarker, o, event);\n        };\n    };\n    function q(w, x, event) {\n        if ((event && event.dispatchConfig.registrationName)) {\n            var y = event.dispatchConfig.registrationName, z = k(w, y);\n            if (z) {\n                event._dispatchListeners = i(event._dispatchListeners, z);\n                event._dispatchIDs = i(event._dispatchIDs, w);\n            }\n        ;\n        }\n    ;\n    };\n    function r(event) {\n        if ((event && event.dispatchConfig.registrationName)) {\n            q(event.dispatchMarker, null, event);\n        };\n    };\n    function s(w) {\n        j(w, p);\n    };\n    function t(w, x, y, z) {\n        m.InstanceHandle.traverseEnterLeave(y, z, q, w, x);\n    };\n    function u(w) {\n        j(w, r);\n    };\n    var v = {\n        accumulateTwoPhaseDispatches: s,\n        accumulateDirectDispatches: u,\n        accumulateEnterLeaveDispatches: t,\n        injection: m\n    };\n    e.exports = v;\n});\n__d(\"EventPluginHub\", [\"CallbackRegistry\",\"EventPluginRegistry\",\"EventPluginUtils\",\"EventPropagators\",\"ExecutionEnvironment\",\"accumulate\",\"forEachAccumulated\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventPluginRegistry\"), i = b(\"EventPluginUtils\"), j = b(\"EventPropagators\"), k = b(\"ExecutionEnvironment\"), l = b(\"accumulate\"), m = b(\"forEachAccumulated\"), n = b(\"invariant\"), o = null, p = function(event) {\n        if (event) {\n            var r = i.executeDispatch, s = h.getPluginModuleForEvent(event);\n            if ((s && s.executeDispatch)) {\n                r = s.executeDispatch;\n            };\n            i.executeDispatchesInOrder(event, r);\n            if (!event.isPersistent()) {\n                event.constructor.release(event);\n            };\n        }\n    ;\n    }, q = {\n        injection: {\n            injectInstanceHandle: j.injection.injectInstanceHandle,\n            injectEventPluginOrder: h.injectEventPluginOrder,\n            injectEventPluginsByName: h.injectEventPluginsByName\n        },\n        registrationNames: h.registrationNames,\n        putListener: g.putListener,\n        getListener: g.getListener,\n        deleteListener: g.deleteListener,\n        deleteAllListeners: g.deleteAllListeners,\n        extractEvents: function(r, s, t, u) {\n            var v, w = h.plugins;\n            for (var x = 0, y = w.length; (x < y); x++) {\n                var z = w[x];\n                if (z) {\n                    var aa = z.extractEvents(r, s, t, u);\n                    if (aa) {\n                        v = l(v, aa);\n                    };\n                }\n            ;\n            };\n            return v;\n        },\n        enqueueEvents: function(r) {\n            if (r) {\n                o = l(o, r);\n            };\n        },\n        processEventQueue: function() {\n            var r = o;\n            o = null;\n            m(r, p);\n            n(!o);\n        }\n    };\n    if (k.canUseDOM) {\n        window.EventPluginHub = q;\n    };\n    e.exports = q;\n});\n__d(\"ReactUpdates\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = false, i = [];\n    function j(m) {\n        if (h) {\n            m();\n            return;\n        }\n    ;\n        h = true;\n        try {\n            m();\n            for (var o = 0; (o < i.length); o++) {\n                var p = i[o];\n                if (p.isMounted()) {\n                    var q = p._pendingCallbacks;\n                    p._pendingCallbacks = null;\n                    p.performUpdateIfNecessary();\n                    if (q) {\n                        for (var r = 0; (r < q.length); r++) {\n                            q[r]();;\n                        }\n                    };\n                }\n            ;\n            };\n        } catch (n) {\n            throw n;\n        } finally {\n            i.length = 0;\n            h = false;\n        };\n    };\n    function k(m, n) {\n        g((!n || (typeof n === \"function\")));\n        if (!h) {\n            m.performUpdateIfNecessary();\n            (n && n());\n            return;\n        }\n    ;\n        i.push(m);\n        if (n) {\n            if (m._pendingCallbacks) {\n                m._pendingCallbacks.push(n);\n            }\n             else m._pendingCallbacks = [n,];\n        \n        };\n    };\n    var l = {\n        batchedUpdates: j,\n        enqueueUpdate: k\n    };\n    e.exports = l;\n});\n__d(\"ViewportMetrics\", [], function(a, b, c, d, e, f) {\n    var g = {\n        currentScrollLeft: 0,\n        currentScrollTop: 0,\n        refreshScrollValues: function() {\n            g.currentScrollLeft = (document.body.scrollLeft + document.documentElement.scrollLeft);\n            g.currentScrollTop = (document.body.scrollTop + document.documentElement.scrollTop);\n        }\n    };\n    e.exports = g;\n});\n__d(\"isEventSupported\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h, i;\n    if (g.canUseDOM) {\n        h = document.createElement(\"div\");\n        i = ((document.implementation && document.implementation.hasFeature) && (document.implementation.hasFeature(\"\", \"\") !== true));\n    }\n;\n    function j(k, l) {\n        if ((!h || ((l && !h.addEventListener)))) {\n            return false\n        };\n        var m = document.createElement(\"div\"), n = (\"on\" + k), o = (n in m);\n        if (!o) {\n            m.setAttribute(n, \"\");\n            o = (typeof m[n] === \"function\");\n            if ((typeof m[n] !== \"undefined\")) {\n                m[n] = undefined;\n            };\n            m.removeAttribute(n);\n        }\n    ;\n        if (((!o && i) && (k === \"wheel\"))) {\n            o = document.implementation.hasFeature(\"Events.wheel\", \"3.0\");\n        };\n        m = null;\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"ReactEventEmitter\", [\"EventConstants\",\"EventListener\",\"EventPluginHub\",\"ExecutionEnvironment\",\"ReactUpdates\",\"ViewportMetrics\",\"invariant\",\"isEventSupported\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventListener\"), i = b(\"EventPluginHub\"), j = b(\"ExecutionEnvironment\"), k = b(\"ReactUpdates\"), l = b(\"ViewportMetrics\"), m = b(\"invariant\"), n = b(\"isEventSupported\"), o = false;\n    function p(u, v, w) {\n        h.listen(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n    function q(u, v, w) {\n        h.capture(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n    function r() {\n        var u = l.refreshScrollValues;\n        h.listen(window, \"scroll\", u);\n        h.listen(window, \"resize\", u);\n    };\n    function s(u) {\n        m(!o);\n        var v = g.topLevelTypes, w = document;\n        r();\n        p(v.topMouseOver, \"mouseover\", w);\n        p(v.topMouseDown, \"mousedown\", w);\n        p(v.topMouseUp, \"mouseup\", w);\n        p(v.topMouseMove, \"mousemove\", w);\n        p(v.topMouseOut, \"mouseout\", w);\n        p(v.topClick, \"click\", w);\n        p(v.topDoubleClick, \"dblclick\", w);\n        if (u) {\n            p(v.topTouchStart, \"touchstart\", w);\n            p(v.topTouchEnd, \"touchend\", w);\n            p(v.topTouchMove, \"touchmove\", w);\n            p(v.topTouchCancel, \"touchcancel\", w);\n        }\n    ;\n        p(v.topKeyUp, \"keyup\", w);\n        p(v.topKeyPress, \"keypress\", w);\n        p(v.topKeyDown, \"keydown\", w);\n        p(v.topInput, \"input\", w);\n        p(v.topChange, \"change\", w);\n        p(v.topSelectionChange, \"selectionchange\", w);\n        p(v.topDOMCharacterDataModified, \"DOMCharacterDataModified\", w);\n        if (n(\"drag\")) {\n            p(v.topDrag, \"drag\", w);\n            p(v.topDragEnd, \"dragend\", w);\n            p(v.topDragEnter, \"dragenter\", w);\n            p(v.topDragExit, \"dragexit\", w);\n            p(v.topDragLeave, \"dragleave\", w);\n            p(v.topDragOver, \"dragover\", w);\n            p(v.topDragStart, \"dragstart\", w);\n            p(v.topDrop, \"drop\", w);\n        }\n    ;\n        if (n(\"wheel\")) {\n            p(v.topWheel, \"wheel\", w);\n        }\n         else if (n(\"mousewheel\")) {\n            p(v.topWheel, \"mousewheel\", w);\n        }\n         else p(v.topWheel, \"DOMMouseScroll\", w);\n        \n    ;\n        if (n(\"scroll\", true)) {\n            q(v.topScroll, \"scroll\", w);\n        }\n         else p(v.topScroll, \"scroll\", window);\n    ;\n        if (n(\"focus\", true)) {\n            q(v.topFocus, \"focus\", w);\n            q(v.topBlur, \"blur\", w);\n        }\n         else if (n(\"focusin\")) {\n            p(v.topFocus, \"focusin\", w);\n            p(v.topBlur, \"focusout\", w);\n        }\n        \n    ;\n    };\n    var t = {\n        TopLevelCallbackCreator: null,\n        ensureListening: function(u, v) {\n            m(j.canUseDOM);\n            if (!o) {\n                t.TopLevelCallbackCreator = v;\n                s(u);\n                o = true;\n            }\n        ;\n        },\n        setEnabled: function(u) {\n            m(j.canUseDOM);\n            if (t.TopLevelCallbackCreator) {\n                t.TopLevelCallbackCreator.setEnabled(u);\n            };\n        },\n        isEnabled: function() {\n            return !!((t.TopLevelCallbackCreator && t.TopLevelCallbackCreator.isEnabled()));\n        },\n        handleTopLevel: function(u, v, w, x) {\n            var y = i.extractEvents(u, v, w, x);\n            k.batchedUpdates(function() {\n                i.enqueueEvents(y);\n                i.processEventQueue();\n            });\n        },\n        registrationNames: i.registrationNames,\n        putListener: i.putListener,\n        getListener: i.getListener,\n        deleteListener: i.deleteListener,\n        deleteAllListeners: i.deleteAllListeners,\n        trapBubbledEvent: p,\n        trapCapturedEvent: q\n    };\n    e.exports = t;\n});\n__d(\"getEventTarget\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\");\n    function h(i) {\n        var j = ((i.target || i.srcElement) || g.global);\n        return ((j.nodeType === 3) ? j.parentNode : j);\n    };\n    e.exports = h;\n});\n__d(\"ReactEventTopLevelCallback\", [\"ExecutionEnvironment\",\"ReactEventEmitter\",\"ReactID\",\"ReactInstanceHandles\",\"getEventTarget\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactID\"), j = b(\"ReactInstanceHandles\"), k = b(\"getEventTarget\"), l = true, m = {\n        setEnabled: function(n) {\n            l = !!n;\n        },\n        isEnabled: function() {\n            return l;\n        },\n        createTopLevelCallback: function(n) {\n            return function(o) {\n                if (!l) {\n                    return\n                };\n                if ((o.srcElement && (o.srcElement !== o.target))) {\n                    o.target = o.srcElement;\n                };\n                var p = (j.getFirstReactDOM(k(o)) || g.global), q = (i.getID(p) || \"\");\n                h.handleTopLevel(n, p, q, o);\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReactInstanceHandles\", [\"ReactID\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactID\"), h = b(\"invariant\"), i = \".\", j = i.length, k = 100, l = 9999999;\n    function m(v) {\n        return (((i + \"r[\") + v.toString(36)) + \"]\");\n    };\n    function n(v, w) {\n        return ((v.charAt(w) === i) || (w === v.length));\n    };\n    function o(v) {\n        return ((v === \"\") || (((v.charAt(0) === i) && (v.charAt((v.length - 1)) !== i))));\n    };\n    function p(v, w) {\n        return (((w.indexOf(v) === 0) && n(w, v.length)));\n    };\n    function q(v) {\n        return (v ? v.substr(0, v.lastIndexOf(i)) : \"\");\n    };\n    function r(v, w) {\n        h((o(v) && o(w)));\n        h(p(v, w));\n        if ((v === w)) {\n            return v\n        };\n        var x = (v.length + j);\n        for (var y = x; (y < w.length); y++) {\n            if (n(w, y)) {\n                break;\n            };\n        };\n        return w.substr(0, y);\n    };\n    function s(v, w) {\n        var x = Math.min(v.length, w.length);\n        if ((x === 0)) {\n            return \"\"\n        };\n        var y = 0;\n        for (var z = 0; (z <= x); z++) {\n            if ((n(v, z) && n(w, z))) {\n                y = z;\n            }\n             else if ((v.charAt(z) !== w.charAt(z))) {\n                break;\n            }\n        ;\n        };\n        var aa = v.substr(0, y);\n        h(o(aa));\n        return aa;\n    };\n    function t(v, w, x, y, z, aa) {\n        v = (v || \"\");\n        w = (w || \"\");\n        h((v !== w));\n        var ba = p(w, v);\n        h((ba || p(v, w)));\n        var ca = 0, da = (ba ? q : r);\n        for (var ea = v; ; ea = da(ea, w)) {\n            if ((((!z || (ea !== v))) && ((!aa || (ea !== w))))) {\n                x(ea, ba, y);\n            };\n            if ((ea === w)) {\n                break;\n            };\n            h((ca++ < k));\n        };\n    };\n    var u = {\n        separator: i,\n        createReactRootID: function() {\n            return m(Math.ceil((Math.random() * l)));\n        },\n        isRenderedByReact: function(v) {\n            if ((v.nodeType !== 1)) {\n                return false\n            };\n            var w = g.getID(v);\n            return (w ? (w.charAt(0) === i) : false);\n        },\n        getFirstReactDOM: function(v) {\n            var w = v;\n            while ((w && (w.parentNode !== w))) {\n                if (u.isRenderedByReact(w)) {\n                    return w\n                };\n                w = w.parentNode;\n            };\n            return null;\n        },\n        findComponentRoot: function(v, w) {\n            var x = [v.firstChild,], y = 0;\n            while ((y < x.length)) {\n                var z = x[y++];\n                while (z) {\n                    var aa = g.getID(z);\n                    if (aa) {\n                        if ((w === aa)) {\n                            return z;\n                        }\n                         else if (p(aa, w)) {\n                            x.length = y = 0;\n                            x.push(z.firstChild);\n                            break;\n                        }\n                         else x.push(z.firstChild);\n                        \n                    ;\n                    }\n                     else x.push(z.firstChild);\n                ;\n                    z = z.nextSibling;\n                };\n            };\n            ((a.console && emptyFunction) && false);\n            h(false);\n        },\n        getReactRootIDFromNodeID: function(v) {\n            var w = /\\.r\\[[^\\]]+\\]/.exec(v);\n            return (w && w[0]);\n        },\n        traverseEnterLeave: function(v, w, x, y, z) {\n            var aa = s(v, w);\n            if ((aa !== v)) {\n                t(v, aa, x, y, false, true);\n            };\n            if ((aa !== w)) {\n                t(aa, w, x, z, true, false);\n            };\n        },\n        traverseTwoPhase: function(v, w, x) {\n            if (v) {\n                t(\"\", v, w, x, true, false);\n                t(v, \"\", w, x, false, true);\n            }\n        ;\n        },\n        _getFirstCommonAncestorID: s,\n        _getNextDescendantID: r\n    };\n    e.exports = u;\n});\n__d(\"ReactMount\", [\"ReactEventEmitter\",\"ReactInstanceHandles\",\"ReactEventTopLevelCallback\",\"ReactID\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactEventEmitter\"), h = b(\"ReactInstanceHandles\"), i = b(\"ReactEventTopLevelCallback\"), j = b(\"ReactID\"), k = b(\"$\"), l = {\n    }, m = {\n    };\n    function n(q) {\n        return (q && q.firstChild);\n    };\n    function o(q) {\n        var r = n(q);\n        return (r && j.getID(r));\n    };\n    var p = {\n        totalInstantiationTime: 0,\n        totalInjectionTime: 0,\n        useTouchEvents: false,\n        scrollMonitor: function(q, r) {\n            r();\n        },\n        prepareTopLevelEvents: function(q) {\n            g.ensureListening(p.useTouchEvents, q);\n        },\n        _updateRootComponent: function(q, r, s, t) {\n            var u = r.props;\n            p.scrollMonitor(s, function() {\n                q.replaceProps(u, t);\n            });\n            return q;\n        },\n        _registerComponent: function(q, r) {\n            p.prepareTopLevelEvents(i);\n            var s = p.registerContainer(r);\n            l[s] = q;\n            return s;\n        },\n        _renderNewRootComponent: function(q, r, s) {\n            var t = p._registerComponent(q, r);\n            q.mountComponentIntoNode(t, r, s);\n            return q;\n        },\n        renderComponent: function(q, r, s) {\n            var t = l[o(r)];\n            if (t) {\n                if ((t.constructor === q.constructor)) {\n                    return p._updateRootComponent(t, q, r, s);\n                }\n                 else p.unmountAndReleaseReactRootNode(r);\n            \n            };\n            var u = n(r), v = (u && h.isRenderedByReact(u)), w = (v && !t), x = p._renderNewRootComponent(q, r, w);\n            (s && s());\n            return x;\n        },\n        constructAndRenderComponent: function(q, r, s) {\n            return p.renderComponent(q(r), s);\n        },\n        constructAndRenderComponentByID: function(q, r, s) {\n            return p.constructAndRenderComponent(q, r, k(s));\n        },\n        registerContainer: function(q) {\n            var r = o(q);\n            if (r) {\n                r = h.getReactRootIDFromNodeID(r);\n            };\n            if (!r) {\n                r = h.createReactRootID();\n            };\n            m[r] = q;\n            return r;\n        },\n        unmountAndReleaseReactRootNode: function(q) {\n            var r = o(q), s = l[r];\n            if (!s) {\n                return false\n            };\n            s.unmountComponentFromNode(q);\n            delete l[r];\n            delete m[r];\n            return true;\n        },\n        findReactContainerForID: function(q) {\n            var r = h.getReactRootIDFromNodeID(q);\n            return m[r];\n        },\n        findReactNodeByID: function(q) {\n            var r = p.findReactContainerForID(q);\n            return h.findComponentRoot(r, q);\n        }\n    };\n    e.exports = p;\n});\n__d(\"ReactID\", [\"invariant\",\"ReactMount\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactMount\"), i = \"data-reactid\", j = {\n    };\n    function k(s) {\n        var t = l(s);\n        if (t) {\n            if (j.hasOwnProperty(t)) {\n                var u = j[t];\n                if ((u !== s)) {\n                    g(!o(u, t));\n                    j[t] = s;\n                }\n            ;\n            }\n             else j[t] = s;\n        \n        };\n        return t;\n    };\n    function l(s) {\n        if ((s && s.getAttributeNode)) {\n            var t = s.getAttributeNode(i);\n            if (t) {\n                return (t.value || \"\")\n            };\n        }\n    ;\n        return \"\";\n    };\n    function m(s, t) {\n        var u = l(s);\n        if ((u !== t)) {\n            delete j[u];\n        };\n        s.setAttribute(i, t);\n        j[t] = s;\n    };\n    function n(s) {\n        if ((!j.hasOwnProperty(s) || !o(j[s], s))) {\n            j[s] = h.findReactNodeByID(s);\n        };\n        return j[s];\n    };\n    function o(s, t) {\n        if (s) {\n            g((l(s) === t));\n            var u = h.findReactContainerForID(t);\n            if ((u && p(u, s))) {\n                return true\n            };\n        }\n    ;\n        return false;\n    };\n    function p(s, t) {\n        if (s.contains) {\n            return s.contains(t)\n        };\n        if ((t === s)) {\n            return true\n        };\n        if ((t.nodeType === 3)) {\n            t = t.parentNode;\n        };\n        while ((t && (t.nodeType === 1))) {\n            if ((t === s)) {\n                return true\n            };\n            t = t.parentNode;\n        };\n        return false;\n    };\n    function q(s) {\n        delete j[s];\n    };\n    function r() {\n        j = {\n        };\n    };\n    f.ATTR_NAME = i;\n    f.getID = k;\n    f.setID = m;\n    f.getNode = n;\n    f.purgeID = q;\n    f.purgeEntireCache = r;\n});\n__d(\"getTextContentAccessor\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = null;\n    function i() {\n        if ((!h && g.canUseDOM)) {\n            h = ((\"innerText\" in document.createElement(\"div\")) ? \"innerText\" : \"textContent\");\n        };\n        return h;\n    };\n    e.exports = i;\n});\n__d(\"ReactDOMIDOperations\", [\"CSSPropertyOperations\",\"DOMChildrenOperations\",\"DOMPropertyOperations\",\"ReactID\",\"getTextContentAccessor\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMChildrenOperations\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactID\"), k = b(\"getTextContentAccessor\"), l = b(\"invariant\"), m = {\n        dangerouslySetInnerHTML: \"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",\n        style: \"`style` must be set using `updateStylesByID()`.\"\n    }, n = (k() || \"NA\"), o = {\n        updatePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.setValueForProperty(s, q, r);\n        },\n        deletePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.deleteValueForProperty(s, q, r);\n        },\n        updatePropertiesByID: function(p, q) {\n            for (var r in q) {\n                if (!q.hasOwnProperty(r)) {\n                    continue;\n                };\n                o.updatePropertiesByID(p, r, q[r]);\n            };\n        },\n        updateStylesByID: function(p, q) {\n            var r = j.getNode(p);\n            g.setValueForStyles(r, q);\n        },\n        updateInnerHTMLByID: function(p, q) {\n            var r = j.getNode(p);\n            r.innerHTML = (((q && q.__html) || \"\")).replace(/^ /g, \"&nbsp;\");\n        },\n        updateTextContentByID: function(p, q) {\n            var r = j.getNode(p);\n            r[n] = q;\n        },\n        dangerouslyReplaceNodeWithMarkupByID: function(p, q) {\n            var r = j.getNode(p);\n            h.dangerouslyReplaceNodeWithMarkup(r, q);\n            j.purgeEntireCache();\n        },\n        manageChildrenByParentID: function(p, q) {\n            var r = j.getNode(p);\n            h.manageChildren(r, q);\n            j.purgeEntireCache();\n        },\n        setTextNodeValueAtIndexByParentID: function(p, q, r) {\n            var s = j.getNode(p);\n            h.setTextNodeValueAtIndex(s, q, r);\n        }\n    };\n    e.exports = o;\n});\n__d(\"ReactOwner\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        isValidOwner: function(i) {\n            return !!(((i && (typeof i.attachRef === \"function\")) && (typeof i.detachRef === \"function\")));\n        },\n        addComponentAsRefTo: function(i, j, k) {\n            g(h.isValidOwner(k));\n            k.attachRef(j, i);\n        },\n        removeComponentAsRefFrom: function(i, j, k) {\n            g(h.isValidOwner(k));\n            if ((k.refs[j] === i)) {\n                k.detachRef(j);\n            };\n        },\n        Mixin: {\n            attachRef: function(i, j) {\n                g(j.isOwnedBy(this));\n                var k = (this.refs || (this.refs = {\n                }));\n                k[i] = j;\n            },\n            detachRef: function(i) {\n                delete this.refs[i];\n            }\n        }\n    };\n    e.exports = h;\n});\n__d(\"PooledClass\", [], function(a, b, c, d, e, f) {\n    var g = function(p) {\n        var q = this;\n        if (q.instancePool.length) {\n            var r = q.instancePool.pop();\n            q.call(r, p);\n            return r;\n        }\n         else return new q(p)\n    ;\n    }, h = function(p, q) {\n        var r = this;\n        if (r.instancePool.length) {\n            var s = r.instancePool.pop();\n            r.call(s, p, q);\n            return s;\n        }\n         else return new r(p, q)\n    ;\n    }, i = function(p, q, r) {\n        var s = this;\n        if (s.instancePool.length) {\n            var t = s.instancePool.pop();\n            s.call(t, p, q, r);\n            return t;\n        }\n         else return new s(p, q, r)\n    ;\n    }, j = function(p, q, r, s, t) {\n        var u = this;\n        if (u.instancePool.length) {\n            var v = u.instancePool.pop();\n            u.call(v, p, q, r, s, t);\n            return v;\n        }\n         else return new u(p, q, r, s, t)\n    ;\n    }, k = function(p) {\n        var q = this;\n        if (p.destructor) {\n            p.destructor();\n        };\n        if ((q.instancePool.length < q.poolSize)) {\n            q.instancePool.push(p);\n        };\n    }, l = 10, m = g, n = function(p, q) {\n        var r = p;\n        r.instancePool = [];\n        r.getPooled = (q || m);\n        if (!r.poolSize) {\n            r.poolSize = l;\n        };\n        r.release = k;\n        return r;\n    }, o = {\n        addPoolingTo: n,\n        oneArgumentPooler: g,\n        twoArgumentPooler: h,\n        threeArgumentPooler: i,\n        fiveArgumentPooler: j\n    };\n    e.exports = o;\n});\n__d(\"ReactInputSelection\", [], function(a, b, c, d, e, f) {\n    function g() {\n        try {\n            return document.activeElement;\n        } catch (j) {\n        \n        };\n    };\n    function h(j) {\n        return document.documentElement.contains(j);\n    };\n    var i = {\n        hasSelectionCapabilities: function(j) {\n            return (j && ((((((j.nodeName === \"INPUT\") && (j.type === \"text\"))) || (j.nodeName === \"TEXTAREA\")) || (j.contentEditable === \"true\"))));\n        },\n        getSelectionInformation: function() {\n            var j = g();\n            return {\n                focusedElem: j,\n                selectionRange: (i.hasSelectionCapabilities(j) ? i.getSelection(j) : null)\n            };\n        },\n        restoreSelection: function(j) {\n            var k = g(), l = j.focusedElem, m = j.selectionRange;\n            if (((k !== l) && h(l))) {\n                if (i.hasSelectionCapabilities(l)) {\n                    i.setSelection(l, m);\n                };\n                l.focus();\n            }\n        ;\n        },\n        getSelection: function(j) {\n            var k;\n            if (((j.contentEditable === \"true\") && window.getSelection)) {\n                k = window.getSelection().getRangeAt(0);\n                var l = k.commonAncestorContainer;\n                if ((l && (l.nodeType === 3))) {\n                    l = l.parentNode;\n                };\n                if ((l !== j)) {\n                    return {\n                        start: 0,\n                        end: 0\n                    };\n                }\n                 else return {\n                    start: k.startOffset,\n                    end: k.endOffset\n                }\n            ;\n            }\n        ;\n            if (!document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                }\n            };\n            k = document.selection.createRange();\n            if ((k.parentElement() !== j)) {\n                return {\n                    start: 0,\n                    end: 0\n                }\n            };\n            var m = j.value.length;\n            if ((j.nodeName === \"INPUT\")) {\n                return {\n                    start: -k.moveStart(\"character\", -m),\n                    end: -k.moveEnd(\"character\", -m)\n                };\n            }\n             else {\n                var n = k.duplicate();\n                n.moveToElementText(j);\n                n.setEndPoint(\"StartToEnd\", k);\n                var o = (m - n.text.length);\n                n.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: (m - n.text.length),\n                    end: o\n                };\n            }\n        ;\n        },\n        setSelection: function(j, k) {\n            var l, m = k.start, n = k.end;\n            if ((typeof n === \"undefined\")) {\n                n = m;\n            };\n            if (document.selection) {\n                if ((j.tagName === \"TEXTAREA\")) {\n                    var o = ((j.value.slice(0, m).match(/\\r/g) || [])).length, p = ((j.value.slice(m, n).match(/\\r/g) || [])).length;\n                    m -= o;\n                    n -= (o + p);\n                }\n            ;\n                l = j.createTextRange();\n                l.collapse(true);\n                l.moveStart(\"character\", m);\n                l.moveEnd(\"character\", (n - m));\n                l.select();\n            }\n             else if ((j.contentEditable === \"true\")) {\n                if ((j.childNodes.length === 1)) {\n                    l = document.createRange();\n                    l.setStart(j.childNodes[0], m);\n                    l.setEnd(j.childNodes[0], n);\n                    var q = window.getSelection();\n                    q.removeAllRanges();\n                    q.addRange(l);\n                }\n            ;\n            }\n             else {\n                j.selectionStart = m;\n                j.selectionEnd = Math.min(n, j.value.length);\n                j.focus();\n            }\n            \n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"mixInto\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        var j;\n        for (j in i) {\n            if (!i.hasOwnProperty(j)) {\n                continue;\n            };\n            h.prototype[j] = i[j];\n        };\n    };\n    e.exports = g;\n});\n__d(\"ReactOnDOMReady\", [\"PooledClass\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"mixInto\");\n    function i(j) {\n        this._queue = (j || null);\n    };\n    h(i, {\n        enqueue: function(j, k) {\n            this._queue = (this._queue || []);\n            this._queue.push({\n                component: j,\n                callback: k\n            });\n        },\n        notifyAll: function() {\n            var j = this._queue;\n            if (j) {\n                this._queue = null;\n                for (var k = 0, l = j.length; (k < l); k++) {\n                    var m = j[k].component, n = j[k].callback;\n                    n.call(m, m.getDOMNode());\n                };\n                j.length = 0;\n            }\n        ;\n        },\n        reset: function() {\n            this._queue = null;\n        },\n        destructor: function() {\n            this.reset();\n        }\n    });\n    g.addPoolingTo(i);\n    e.exports = i;\n});\n__d(\"Transaction\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"DUAL_TRANSACTION\", i = \"MISSING_TRANSACTION\", j = {\n        reinitializeTransaction: function() {\n            this.transactionWrappers = this.getTransactionWrappers();\n            if (!this.wrapperInitData) {\n                this.wrapperInitData = [];\n            }\n             else this.wrapperInitData.length = 0;\n        ;\n            if (!this.timingMetrics) {\n                this.timingMetrics = {\n                };\n            };\n            this.timingMetrics.methodInvocationTime = 0;\n            if (!this.timingMetrics.wrapperInitTimes) {\n                this.timingMetrics.wrapperInitTimes = [];\n            }\n             else this.timingMetrics.wrapperInitTimes.length = 0;\n        ;\n            if (!this.timingMetrics.wrapperCloseTimes) {\n                this.timingMetrics.wrapperCloseTimes = [];\n            }\n             else this.timingMetrics.wrapperCloseTimes.length = 0;\n        ;\n            this._isInTransaction = false;\n        },\n        _isInTransaction: false,\n        getTransactionWrappers: null,\n        isInTransaction: function() {\n            return !!this._isInTransaction;\n        },\n        perform: function(l, m, n, o, p, q, r, s) {\n            g(this.isInTransaction(), h);\n            var t = Date.now(), u = null, v;\n            try {\n                this.initializeAll();\n                v = l.call(m, n, o, p, q, r, s);\n            } catch (w) {\n                u = w;\n            } finally {\n                var x = Date.now();\n                this.methodInvocationTime += ((x - t));\n                try {\n                    this.closeAll();\n                } catch (y) {\n                    u = (u || y);\n                };\n            };\n            if (u) {\n                throw u\n            };\n            return v;\n        },\n        initializeAll: function() {\n            this._isInTransaction = true;\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperInitTimes, n = null;\n            for (var o = 0; (o < l.length); o++) {\n                var p = Date.now(), q = l[o];\n                try {\n                    this.wrapperInitData[o] = (q.initialize ? q.initialize.call(this) : null);\n                } catch (r) {\n                    n = (n || r);\n                    this.wrapperInitData[o] = k.OBSERVED_ERROR;\n                } finally {\n                    var s = m[o], t = Date.now();\n                    m[o] = (((s || 0)) + ((t - p)));\n                };\n            };\n            if (n) {\n                throw n\n            };\n        },\n        closeAll: function() {\n            g(!this.isInTransaction(), i);\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperCloseTimes, n = null;\n            for (var o = 0; (o < l.length); o++) {\n                var p = l[o], q = Date.now(), r = this.wrapperInitData[o];\n                try {\n                    if ((r !== k.OBSERVED_ERROR)) {\n                        (p.close && p.close.call(this, r));\n                    };\n                } catch (s) {\n                    n = (n || s);\n                } finally {\n                    var t = Date.now(), u = m[o];\n                    m[o] = (((u || 0)) + ((t - q)));\n                };\n            };\n            this.wrapperInitData.length = 0;\n            this._isInTransaction = false;\n            if (n) {\n                throw n\n            };\n        }\n    }, k = {\n        Mixin: j,\n        OBSERVED_ERROR: {\n        }\n    };\n    e.exports = k;\n});\n__d(\"ReactReconcileTransaction\", [\"ExecutionEnvironment\",\"PooledClass\",\"ReactEventEmitter\",\"ReactInputSelection\",\"ReactOnDOMReady\",\"Transaction\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"PooledClass\"), i = b(\"ReactEventEmitter\"), j = b(\"ReactInputSelection\"), k = b(\"ReactOnDOMReady\"), l = b(\"Transaction\"), m = b(\"mixInto\"), n = {\n        initialize: j.getSelectionInformation,\n        close: j.restoreSelection\n    }, o = {\n        initialize: function() {\n            var t = i.isEnabled();\n            i.setEnabled(false);\n            return t;\n        },\n        close: function(t) {\n            i.setEnabled(t);\n        }\n    }, p = {\n        initialize: function() {\n            this.reactOnDOMReady.reset();\n        },\n        close: function() {\n            this.reactOnDOMReady.notifyAll();\n        }\n    }, q = [n,o,p,];\n    function r() {\n        this.reinitializeTransaction();\n        this.reactOnDOMReady = k.getPooled(null);\n    };\n    var s = {\n        getTransactionWrappers: function() {\n            if (g.canUseDOM) {\n                return q;\n            }\n             else return []\n        ;\n        },\n        getReactOnDOMReady: function() {\n            return this.reactOnDOMReady;\n        },\n        destructor: function() {\n            k.release(this.reactOnDOMReady);\n            this.reactOnDOMReady = null;\n        }\n    };\n    m(r, l.Mixin);\n    m(r, s);\n    h.addPoolingTo(r);\n    e.exports = r;\n});\n__d(\"mergeHelpers\", [\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"throwIf\"), i = 36, j = g({\n        MERGE_ARRAY_FAIL: null,\n        MERGE_CORE_FAILURE: null,\n        MERGE_TYPE_USAGE_FAILURE: null,\n        MERGE_DEEP_MAX_LEVELS: null,\n        MERGE_DEEP_NO_ARR_STRATEGY: null\n    }), k = function(m) {\n        return ((typeof m !== \"object\") || (m === null));\n    }, l = {\n        MAX_MERGE_DEPTH: i,\n        isTerminal: k,\n        normalizeMergeArg: function(m) {\n            return (((m === undefined) || (m === null)) ? {\n            } : m);\n        },\n        checkMergeArrayArgs: function(m, n) {\n            h((!Array.isArray(m) || !Array.isArray(n)), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeObjectArgs: function(m, n) {\n            l.checkMergeObjectArg(m);\n            l.checkMergeObjectArg(n);\n        },\n        checkMergeObjectArg: function(m) {\n            h((k(m) || Array.isArray(m)), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeLevel: function(m) {\n            h((m >= i), j.MERGE_DEEP_MAX_LEVELS);\n        },\n        checkArrayStrategy: function(m) {\n            h(((m !== undefined) && !((m in l.ArrayStrategies))), j.MERGE_DEEP_NO_ARR_STRATEGY);\n        },\n        ArrayStrategies: g({\n            Clobber: true,\n            IndexByIndex: true\n        }),\n        ERRORS: j\n    };\n    e.exports = l;\n});\n__d(\"mergeInto\", [\"mergeHelpers\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeHelpers\"), h = g.checkMergeObjectArg;\n    function i(j, k) {\n        h(j);\n        if ((k != null)) {\n            h(k);\n            for (var l in k) {\n                if (!k.hasOwnProperty(l)) {\n                    continue;\n                };\n                j[l] = k[l];\n            };\n        }\n    ;\n    };\n    e.exports = i;\n});\n__d(\"merge\", [\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeInto\"), h = function(i, j) {\n        var k = {\n        };\n        g(k, i);\n        g(k, j);\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"ReactComponent\", [\"ReactCurrentOwner\",\"ReactDOMIDOperations\",\"ReactID\",\"ReactMount\",\"ReactOwner\",\"ReactReconcileTransaction\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCurrentOwner\"), h = b(\"ReactDOMIDOperations\"), i = b(\"ReactID\"), j = b(\"ReactMount\"), k = b(\"ReactOwner\"), l = b(\"ReactReconcileTransaction\"), m = b(\"ReactUpdates\"), n = b(\"invariant\"), o = b(\"keyMirror\"), p = b(\"merge\"), q = \"{owner}\", r = \"{is.key.validated}\", s = o({\n        MOUNTED: null,\n        UNMOUNTED: null\n    }), t = {\n    };\n    function u(x) {\n        if ((x[r] || (x.props.key != null))) {\n            return\n        };\n        x[r] = true;\n        if (!g.current) {\n            return\n        };\n        var y = g.current.constructor.displayName;\n        if (t.hasOwnProperty(y)) {\n            return\n        };\n        t[y] = true;\n        var z = (((\"Each child in an array should have a unique \\\"key\\\" prop. \" + \"Check the render method of \") + y) + \".\");\n        if (!x.isOwnedBy(g.current)) {\n            var aa = (x.props[q] && x.props[q].constructor.displayName);\n            z += ((\" It was passed a child from \" + aa) + \".\");\n        }\n    ;\n    };\n    function v(x) {\n        if (Array.isArray(x)) {\n            for (var y = 0; (y < x.length); y++) {\n                var z = x[y];\n                if (w.isValidComponent(z)) {\n                    u(z);\n                };\n            };\n        }\n         else if (w.isValidComponent(x)) {\n            x[r] = true;\n        }\n    ;\n    };\n    var w = {\n        isValidComponent: function(x) {\n            return !!(((x && (typeof x.mountComponentIntoNode === \"function\")) && (typeof x.receiveProps === \"function\")));\n        },\n        getKey: function(x, y) {\n            if (((x && x.props) && (x.props.key != null))) {\n                return (\"\" + x.props.key)\n            };\n            return (\"\" + y);\n        },\n        LifeCycle: s,\n        DOMIDOperations: h,\n        ReactReconcileTransaction: l,\n        setDOMOperations: function(x) {\n            w.DOMIDOperations = x;\n        },\n        setReactReconcileTransaction: function(x) {\n            w.ReactReconcileTransaction = x;\n        },\n        Mixin: {\n            isMounted: function() {\n                return (this._lifeCycleState === s.MOUNTED);\n            },\n            getDOMNode: function() {\n                n(this.isMounted());\n                return i.getNode(this._rootNodeID);\n            },\n            setProps: function(x, y) {\n                this.replaceProps(p((this._pendingProps || this.props), x), y);\n            },\n            replaceProps: function(x, y) {\n                n(!this.props[q]);\n                this._pendingProps = x;\n                m.enqueueUpdate(this, y);\n            },\n            construct: function(x, y) {\n                this.props = (x || {\n                });\n                this.props[q] = g.current;\n                this._lifeCycleState = s.UNMOUNTED;\n                this._pendingProps = null;\n                this._pendingCallbacks = null;\n                var z = (arguments.length - 1);\n                if ((z === 1)) {\n                    this.props.children = y;\n                }\n                 else if ((z > 1)) {\n                    var aa = Array(z);\n                    for (var ba = 0; (ba < z); ba++) {\n                        aa[ba] = arguments[(ba + 1)];;\n                    };\n                    this.props.children = aa;\n                }\n                \n            ;\n            },\n            mountComponent: function(x, y) {\n                n(!this.isMounted());\n                var z = this.props;\n                if ((z.ref != null)) {\n                    k.addComponentAsRefTo(this, z.ref, z[q]);\n                };\n                this._rootNodeID = x;\n                this._lifeCycleState = s.MOUNTED;\n            },\n            unmountComponent: function() {\n                n(this.isMounted());\n                var x = this.props;\n                if ((x.ref != null)) {\n                    k.removeComponentAsRefFrom(this, x.ref, x[q]);\n                };\n                i.purgeID(this._rootNodeID);\n                this._rootNodeID = null;\n                this._lifeCycleState = s.UNMOUNTED;\n            },\n            receiveProps: function(x, y) {\n                n(this.isMounted());\n                this._pendingProps = x;\n                this._performUpdateIfNecessary(y);\n            },\n            performUpdateIfNecessary: function() {\n                var x = w.ReactReconcileTransaction.getPooled();\n                x.perform(this._performUpdateIfNecessary, this, x);\n                w.ReactReconcileTransaction.release(x);\n            },\n            _performUpdateIfNecessary: function(x) {\n                if ((this._pendingProps == null)) {\n                    return\n                };\n                var y = this.props;\n                this.props = this._pendingProps;\n                this._pendingProps = null;\n                this.updateComponent(x, y);\n            },\n            updateComponent: function(x, y) {\n                var z = this.props;\n                if (((z[q] !== y[q]) || (z.ref !== y.ref))) {\n                    if ((y.ref != null)) {\n                        k.removeComponentAsRefFrom(this, y.ref, y[q]);\n                    };\n                    if ((z.ref != null)) {\n                        k.addComponentAsRefTo(this, z.ref, z[q]);\n                    };\n                }\n            ;\n            },\n            mountComponentIntoNode: function(x, y, z) {\n                var aa = w.ReactReconcileTransaction.getPooled();\n                aa.perform(this._mountComponentIntoNode, this, x, y, aa, z);\n                w.ReactReconcileTransaction.release(aa);\n            },\n            _mountComponentIntoNode: function(x, y, z, aa) {\n                n((y && (y.nodeType === 1)));\n                var ba = Date.now(), ca = this.mountComponent(x, z);\n                j.totalInstantiationTime += ((Date.now() - ba));\n                if (aa) {\n                    return\n                };\n                var da = Date.now(), ea = y.parentNode;\n                if (ea) {\n                    var fa = y.nextSibling;\n                    ea.removeChild(y);\n                    y.innerHTML = ca;\n                    if (fa) {\n                        ea.insertBefore(y, fa);\n                    }\n                     else ea.appendChild(y);\n                ;\n                }\n                 else y.innerHTML = ca;\n            ;\n                j.totalInjectionTime += ((Date.now() - da));\n            },\n            unmountComponentFromNode: function(x) {\n                this.unmountComponent();\n                while (x.lastChild) {\n                    x.removeChild(x.lastChild);;\n                };\n            },\n            isOwnedBy: function(x) {\n                return (this.props[q] === x);\n            },\n            getSiblingByRef: function(x) {\n                var y = this.props[q];\n                if ((!y || !y.refs)) {\n                    return null\n                };\n                return y.refs[x];\n            }\n        }\n    };\n    e.exports = w;\n});\n__d(\"joinClasses\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            h = \"\";\n        };\n        var i, j = arguments.length;\n        if ((j > 1)) {\n            for (var k = 1; (k < j); k++) {\n                i = arguments[k];\n                (i && (h += (\" \" + i)));\n            }\n        };\n        return h;\n    };\n    e.exports = g;\n});\n__d(\"ReactPropTransferer\", [\"emptyFunction\",\"joinClasses\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = b(\"joinClasses\"), i = b(\"merge\");\n    function j(m) {\n        return function(n, o, p) {\n            if (!n.hasOwnProperty(o)) {\n                n[o] = p;\n            }\n             else n[o] = m(n[o], p);\n        ;\n        };\n    };\n    var k = {\n        children: g,\n        className: j(h),\n        ref: g,\n        style: j(i)\n    }, l = {\n        TransferStrategies: k,\n        Mixin: {\n            transferPropsTo: function(m) {\n                var n = {\n                };\n                for (var o in m.props) {\n                    if (m.props.hasOwnProperty(o)) {\n                        n[o] = m.props[o];\n                    };\n                };\n                for (var p in this.props) {\n                    if (!this.props.hasOwnProperty(p)) {\n                        continue;\n                    };\n                    var q = k[p];\n                    if (q) {\n                        q(n, p, this.props[p]);\n                    }\n                     else if (!n.hasOwnProperty(p)) {\n                        n[p] = this.props[p];\n                    }\n                ;\n                };\n                m.props = n;\n                return m;\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"ReactCompositeComponent\", [\"ReactComponent\",\"ReactCurrentOwner\",\"ReactOwner\",\"ReactPropTransferer\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactCurrentOwner\"), i = b(\"ReactOwner\"), j = b(\"ReactPropTransferer\"), k = b(\"ReactUpdates\"), l = b(\"invariant\"), m = b(\"keyMirror\"), n = b(\"merge\"), o = b(\"mixInto\"), p = m({\n        DEFINE_ONCE: null,\n        DEFINE_MANY: null,\n        OVERRIDE_BASE: null\n    }), q = {\n        mixins: p.DEFINE_MANY,\n        props: p.DEFINE_ONCE,\n        getDefaultProps: p.DEFINE_ONCE,\n        getInitialState: p.DEFINE_ONCE,\n        render: p.DEFINE_ONCE,\n        componentWillMount: p.DEFINE_MANY,\n        componentDidMount: p.DEFINE_MANY,\n        componentWillReceiveProps: p.DEFINE_MANY,\n        shouldComponentUpdate: p.DEFINE_ONCE,\n        componentWillUpdate: p.DEFINE_MANY,\n        componentDidUpdate: p.DEFINE_MANY,\n        componentWillUnmount: p.DEFINE_MANY,\n        updateComponent: p.OVERRIDE_BASE\n    }, r = {\n        displayName: function(aa, ba) {\n            aa.displayName = ba;\n        },\n        mixins: function(aa, ba) {\n            if (ba) {\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    u(aa, ba[ca]);;\n                }\n            };\n        },\n        props: function(aa, ba) {\n            aa.propDeclarations = ba;\n        }\n    };\n    function s(aa, ba) {\n        var ca = q[ba];\n        if (x.hasOwnProperty(ba)) {\n            l((ca === p.OVERRIDE_BASE));\n        };\n        if (aa.hasOwnProperty(ba)) {\n            l((ca === p.DEFINE_MANY));\n        };\n    };\n    function t(aa) {\n        var ba = aa._compositeLifeCycleState;\n        l((aa.isMounted() || (ba === w.MOUNTING)));\n        l(((ba !== w.RECEIVING_STATE) && (ba !== w.UNMOUNTING)));\n    };\n    function u(aa, ba) {\n        var ca = aa.prototype;\n        for (var da in ba) {\n            var ea = ba[da];\n            if ((!ba.hasOwnProperty(da) || !ea)) {\n                continue;\n            };\n            s(ca, da);\n            if (r.hasOwnProperty(da)) {\n                r[da](aa, ea);\n            }\n             else {\n                var fa = (da in q), ga = (da in ca), ha = ea.__reactDontBind, ia = (typeof ea === \"function\"), ja = (((ia && !fa) && !ga) && !ha);\n                if (ja) {\n                    if (!ca.__reactAutoBindMap) {\n                        ca.__reactAutoBindMap = {\n                        };\n                    };\n                    ca.__reactAutoBindMap[da] = ea;\n                    ca[da] = ea;\n                }\n                 else if (ga) {\n                    ca[da] = v(ca[da], ea);\n                }\n                 else ca[da] = ea;\n                \n            ;\n            }\n        ;\n        };\n    };\n    function v(aa, ba) {\n        return function ca() {\n            aa.apply(this, arguments);\n            ba.apply(this, arguments);\n        };\n    };\n    var w = m({\n        MOUNTING: null,\n        UNMOUNTING: null,\n        RECEIVING_PROPS: null,\n        RECEIVING_STATE: null\n    }), x = {\n        construct: function(aa, ba) {\n            g.Mixin.construct.apply(this, arguments);\n            this.state = null;\n            this._pendingState = null;\n            this._compositeLifeCycleState = null;\n        },\n        isMounted: function() {\n            return (g.Mixin.isMounted.call(this) && (this._compositeLifeCycleState !== w.MOUNTING));\n        },\n        mountComponent: function(aa, ba) {\n            g.Mixin.mountComponent.call(this, aa, ba);\n            this._compositeLifeCycleState = w.MOUNTING;\n            this._defaultProps = (this.getDefaultProps ? this.getDefaultProps() : null);\n            this._processProps(this.props);\n            if (this.__reactAutoBindMap) {\n                this._bindAutoBindMethods();\n            };\n            this.state = (this.getInitialState ? this.getInitialState() : null);\n            this._pendingState = null;\n            this._pendingForceUpdate = false;\n            if (this.componentWillMount) {\n                this.componentWillMount();\n                if (this._pendingState) {\n                    this.state = this._pendingState;\n                    this._pendingState = null;\n                }\n            ;\n            }\n        ;\n            this._renderedComponent = this._renderValidatedComponent();\n            this._compositeLifeCycleState = null;\n            var ca = this._renderedComponent.mountComponent(aa, ba);\n            if (this.componentDidMount) {\n                ba.getReactOnDOMReady().enqueue(this, this.componentDidMount);\n            };\n            return ca;\n        },\n        unmountComponent: function() {\n            this._compositeLifeCycleState = w.UNMOUNTING;\n            if (this.componentWillUnmount) {\n                this.componentWillUnmount();\n            };\n            this._compositeLifeCycleState = null;\n            this._defaultProps = null;\n            g.Mixin.unmountComponent.call(this);\n            this._renderedComponent.unmountComponent();\n            this._renderedComponent = null;\n            if (this.refs) {\n                this.refs = null;\n            };\n        },\n        setState: function(aa, ba) {\n            this.replaceState(n((this._pendingState || this.state), aa), ba);\n        },\n        replaceState: function(aa, ba) {\n            t.call(null, this);\n            this._pendingState = aa;\n            k.enqueueUpdate(this, ba);\n        },\n        _processProps: function(aa) {\n            var ba, ca = this._defaultProps;\n            for (ba in ca) {\n                if (!((ba in aa))) {\n                    aa[ba] = ca[ba];\n                };\n            };\n            var da = this.constructor.propDeclarations;\n            if (da) {\n                var ea = this.constructor.displayName;\n                for (ba in da) {\n                    var fa = da[ba];\n                    if (fa) {\n                        fa(aa, ba, ea);\n                    };\n                };\n            }\n        ;\n        },\n        performUpdateIfNecessary: function() {\n            var aa = this._compositeLifeCycleState;\n            if (((aa === w.MOUNTING) || (aa === w.RECEIVING_PROPS))) {\n                return\n            };\n            g.Mixin.performUpdateIfNecessary.call(this);\n        },\n        _performUpdateIfNecessary: function(aa) {\n            if ((((this._pendingProps == null) && (this._pendingState == null)) && !this._pendingForceUpdate)) {\n                return\n            };\n            var ba = this.props;\n            if ((this._pendingProps != null)) {\n                ba = this._pendingProps;\n                this._processProps(ba);\n                this._pendingProps = null;\n                this._compositeLifeCycleState = w.RECEIVING_PROPS;\n                if (this.componentWillReceiveProps) {\n                    this.componentWillReceiveProps(ba, aa);\n                };\n            }\n        ;\n            this._compositeLifeCycleState = w.RECEIVING_STATE;\n            var ca = (this._pendingState || this.state);\n            this._pendingState = null;\n            if (((this._pendingForceUpdate || !this.shouldComponentUpdate) || this.shouldComponentUpdate(ba, ca))) {\n                this._pendingForceUpdate = false;\n                this._performComponentUpdate(ba, ca, aa);\n            }\n             else {\n                this.props = ba;\n                this.state = ca;\n            }\n        ;\n            this._compositeLifeCycleState = null;\n        },\n        _performComponentUpdate: function(aa, ba, ca) {\n            var da = this.props, ea = this.state;\n            if (this.componentWillUpdate) {\n                this.componentWillUpdate(aa, ba, ca);\n            };\n            this.props = aa;\n            this.state = ba;\n            this.updateComponent(ca, da, ea);\n            if (this.componentDidUpdate) {\n                ca.getReactOnDOMReady().enqueue(this, this.componentDidUpdate.bind(this, da, ea));\n            };\n        },\n        updateComponent: function(aa, ba, ca) {\n            g.Mixin.updateComponent.call(this, aa, ba);\n            var da = this._renderedComponent, ea = this._renderValidatedComponent();\n            if ((da.constructor === ea.constructor)) {\n                da.receiveProps(ea.props, aa);\n            }\n             else {\n                var fa = this._rootNodeID, ga = da._rootNodeID;\n                da.unmountComponent();\n                var ha = ea.mountComponent(fa, aa);\n                g.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID(ga, ha);\n                this._renderedComponent = ea;\n            }\n        ;\n        },\n        forceUpdate: function(aa) {\n            var ba = this._compositeLifeCycleState;\n            l((this.isMounted() || (ba === w.MOUNTING)));\n            l(((ba !== w.RECEIVING_STATE) && (ba !== w.UNMOUNTING)));\n            this._pendingForceUpdate = true;\n            k.enqueueUpdate(this, aa);\n        },\n        _renderValidatedComponent: function() {\n            var aa;\n            h.current = this;\n            try {\n                aa = this.render();\n            } catch (ba) {\n                throw ba;\n            } finally {\n                h.current = null;\n            };\n            l(g.isValidComponent(aa));\n            return aa;\n        },\n        _bindAutoBindMethods: function() {\n            for (var aa in this.__reactAutoBindMap) {\n                if (!this.__reactAutoBindMap.hasOwnProperty(aa)) {\n                    continue;\n                };\n                var ba = this.__reactAutoBindMap[aa];\n                this[aa] = this._bindAutoBindMethod(ba);\n            };\n        },\n        _bindAutoBindMethod: function(aa) {\n            var ba = this;\n            return function() {\n                return aa.apply(ba, arguments);\n            };\n        }\n    }, y = function() {\n    \n    };\n    o(y, g.Mixin);\n    o(y, i.Mixin);\n    o(y, j.Mixin);\n    o(y, x);\n    var z = {\n        LifeCycle: w,\n        Base: y,\n        createClass: function(aa) {\n            var ba = function() {\n            \n            };\n            ba.prototype = new y();\n            ba.prototype.constructor = ba;\n            u(ba, aa);\n            l(ba.prototype.render);\n            var ca = function(da, ea) {\n                var fa = new ba();\n                fa.construct.apply(fa, arguments);\n                return fa;\n            };\n            ca.componentConstructor = ba;\n            ca.originalSpec = aa;\n            return ca;\n        },\n        autoBind: function(aa) {\n            return aa;\n        }\n    };\n    e.exports = z;\n});\n__d(\"ReactMultiChild\", [\"ReactComponent\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\");\n    function h(k, l) {\n        return ((k && l) && (k.constructor === l.constructor));\n    };\n    var i = {\n        enqueueMarkupAt: function(k, l) {\n            this.domOperations = (this.domOperations || []);\n            this.domOperations.push({\n                insertMarkup: k,\n                finalIndex: l\n            });\n        },\n        enqueueMove: function(k, l) {\n            this.domOperations = (this.domOperations || []);\n            this.domOperations.push({\n                moveFrom: k,\n                finalIndex: l\n            });\n        },\n        enqueueUnmountChildByName: function(k, l) {\n            if (g.isValidComponent(l)) {\n                this.domOperations = (this.domOperations || []);\n                this.domOperations.push({\n                    removeAt: l._domIndex\n                });\n                (l.unmountComponent && l.unmountComponent());\n                delete this._renderedChildren[k];\n            }\n        ;\n        },\n        processChildDOMOperationsQueue: function() {\n            if (this.domOperations) {\n                g.DOMIDOperations.manageChildrenByParentID(this._rootNodeID, this.domOperations);\n                this.domOperations = null;\n            }\n        ;\n        },\n        unmountMultiChild: function() {\n            var k = this._renderedChildren;\n            for (var l in k) {\n                if ((k.hasOwnProperty(l) && k[l])) {\n                    var m = k[l];\n                    (m.unmountComponent && m.unmountComponent());\n                }\n            ;\n            };\n            this._renderedChildren = null;\n        },\n        mountMultiChild: function(k, l) {\n            var m = \"\", n = 0;\n            for (var o in k) {\n                var p = k[o];\n                if ((k.hasOwnProperty(o) && p)) {\n                    m += p.mountComponent(((this._rootNodeID + \".\") + o), l);\n                    p._domIndex = n;\n                    n++;\n                }\n            ;\n            };\n            this._renderedChildren = k;\n            this.domOperations = null;\n            return m;\n        },\n        updateMultiChild: function(k, l) {\n            if ((!k && !this._renderedChildren)) {\n                return;\n            }\n             else if ((k && !this._renderedChildren)) {\n                this._renderedChildren = {\n                };\n            }\n             else if ((!k && this._renderedChildren)) {\n                k = {\n                };\n            }\n            \n        ;\n            var m = (this._rootNodeID + \".\"), n = null, o = 0, p = 0, q = 0;\n            for (var r in k) {\n                if (!k.hasOwnProperty(r)) {\n                    continue;\n                };\n                var s = this._renderedChildren[r], t = k[r];\n                if (h(s, t)) {\n                    if (n) {\n                        this.enqueueMarkupAt(n, (p - o));\n                        n = null;\n                    }\n                ;\n                    o = 0;\n                    if ((s._domIndex < q)) {\n                        this.enqueueMove(s._domIndex, p);\n                    };\n                    q = Math.max(s._domIndex, q);\n                    s.receiveProps(t.props, l);\n                    s._domIndex = p;\n                }\n                 else {\n                    if (s) {\n                        this.enqueueUnmountChildByName(r, s);\n                        q = Math.max(s._domIndex, q);\n                    }\n                ;\n                    if (t) {\n                        this._renderedChildren[r] = t;\n                        var u = t.mountComponent((m + r), l);\n                        n = (n ? (n + u) : u);\n                        o++;\n                        t._domIndex = p;\n                    }\n                ;\n                }\n            ;\n                p = (t ? (p + 1) : p);\n            };\n            if (n) {\n                this.enqueueMarkupAt(n, (p - o));\n            };\n            for (var v in this._renderedChildren) {\n                if (!this._renderedChildren.hasOwnProperty(v)) {\n                    continue;\n                };\n                var w = this._renderedChildren[v];\n                if ((w && !k[v])) {\n                    this.enqueueUnmountChildByName(v, w);\n                };\n            };\n            this.processChildDOMOperationsQueue();\n        }\n    }, j = {\n        Mixin: i\n    };\n    e.exports = j;\n});\n__d(\"ReactTextComponent\", [\"ReactComponent\",\"ReactID\",\"escapeTextForBrowser\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactID\"), i = b(\"escapeTextForBrowser\"), j = b(\"mixInto\"), k = function(l) {\n        this.construct({\n            text: l\n        });\n    };\n    j(k, g.Mixin);\n    j(k, {\n        mountComponent: function(l) {\n            g.Mixin.mountComponent.call(this, l);\n            return (((((((\"\\u003Cspan \" + h.ATTR_NAME) + \"=\\\"\") + l) + \"\\\"\\u003E\") + i(this.props.text)) + \"\\u003C/span\\u003E\"));\n        },\n        receiveProps: function(l, m) {\n            if ((l.text !== this.props.text)) {\n                this.props.text = l.text;\n                g.DOMIDOperations.updateTextContentByID(this._rootNodeID, l.text);\n            }\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"flattenChildren\", [\"ReactComponent\",\"ReactTextComponent\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactTextComponent\"), i = b(\"throwIf\"), j = \"INVALID_CHILD\", k = (\"You have two children with identical keys. Make sure that you set the \" + \"\\\"key\\\" property to a unique value such as a row ID.\"), l = function(n, o, p) {\n        if (Array.isArray(o)) {\n            for (var q = 0; (q < o.length); q++) {\n                var r = o[q];\n                l(n, r, (((p + \"[\") + g.getKey(r, q)) + \"]\"));\n            };\n        }\n         else {\n            var s = typeof o, t = (p === \"\"), u = (t ? ((\"[\" + g.getKey(o, 0)) + \"]\") : p);\n            if ((((o === null) || (o === undefined)) || (s === \"boolean\"))) {\n                n[u] = null;\n            }\n             else if (o.mountComponentIntoNode) {\n                n[u] = o;\n            }\n             else if ((s === \"object\")) {\n                i((o && (o.nodeType === 1)), j);\n                for (var v in o) {\n                    if (o.hasOwnProperty(v)) {\n                        l(n, o[v], (((p + \"{\") + v) + \"}\"));\n                    };\n                };\n            }\n             else if ((s === \"string\")) {\n                n[u] = new h(o);\n            }\n             else if ((s === \"number\")) {\n                n[u] = new h((\"\" + o));\n            }\n            \n            \n            \n        ;\n        }\n    ;\n    };\n    function m(n) {\n        if (((n === null) || (n === undefined))) {\n            return n\n        };\n        var o = {\n        };\n        l(o, n, \"\");\n        return o;\n    };\n    e.exports = m;\n});\n__d(\"ReactNativeComponent\", [\"CSSPropertyOperations\",\"DOMPropertyOperations\",\"ReactComponent\",\"ReactEventEmitter\",\"ReactMultiChild\",\"ReactID\",\"escapeTextForBrowser\",\"flattenChildren\",\"invariant\",\"keyOf\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMPropertyOperations\"), i = b(\"ReactComponent\"), j = b(\"ReactEventEmitter\"), k = b(\"ReactMultiChild\"), l = b(\"ReactID\"), m = b(\"escapeTextForBrowser\"), n = b(\"flattenChildren\"), o = b(\"invariant\"), p = b(\"keyOf\"), q = b(\"merge\"), r = b(\"mixInto\"), s = j.putListener, t = j.deleteListener, u = j.registrationNames, v = {\n        string: true,\n        number: true\n    }, w = p({\n        dangerouslySetInnerHTML: null\n    }), x = p({\n        style: null\n    });\n    function y(aa) {\n        if (!aa) {\n            return\n        };\n        o(((aa.children == null) || (aa.dangerouslySetInnerHTML == null)));\n        o(((aa.style == null) || (typeof aa.style === \"object\")));\n    };\n    function z(aa, ba) {\n        this._tagOpen = ((\"\\u003C\" + aa) + \" \");\n        this._tagClose = (ba ? \"\" : ((\"\\u003C/\" + aa) + \"\\u003E\"));\n        this.tagName = aa.toUpperCase();\n    };\n    z.Mixin = {\n        mountComponent: function(aa, ba) {\n            i.Mixin.mountComponent.call(this, aa, ba);\n            y(this.props);\n            return (((this._createOpenTagMarkup() + this._createContentMarkup(ba)) + this._tagClose));\n        },\n        _createOpenTagMarkup: function() {\n            var aa = this.props, ba = this._tagOpen;\n            for (var ca in aa) {\n                if (!aa.hasOwnProperty(ca)) {\n                    continue;\n                };\n                var da = aa[ca];\n                if ((da == null)) {\n                    continue;\n                };\n                if (u[ca]) {\n                    s(this._rootNodeID, ca, da);\n                }\n                 else {\n                    if ((ca === x)) {\n                        if (da) {\n                            da = aa.style = q(aa.style);\n                        };\n                        da = g.createMarkupForStyles(da);\n                    }\n                ;\n                    var ea = h.createMarkupForProperty(ca, da);\n                    if (ea) {\n                        ba += (\" \" + ea);\n                    };\n                }\n            ;\n            };\n            var fa = m(this._rootNodeID);\n            return (((((ba + \" \") + l.ATTR_NAME) + \"=\\\"\") + fa) + \"\\\"\\u003E\");\n        },\n        _createContentMarkup: function(aa) {\n            var ba = this.props.dangerouslySetInnerHTML;\n            if ((ba != null)) {\n                if ((ba.__html != null)) {\n                    return ba.__html\n                };\n            }\n             else {\n                var ca = (v[typeof this.props.children] ? this.props.children : null), da = ((ca != null) ? null : this.props.children);\n                if ((ca != null)) {\n                    return m(ca);\n                }\n                 else if ((da != null)) {\n                    return this.mountMultiChild(n(da), aa)\n                }\n            ;\n            }\n        ;\n            return \"\";\n        },\n        receiveProps: function(aa, ba) {\n            y(aa);\n            i.Mixin.receiveProps.call(this, aa, ba);\n        },\n        updateComponent: function(aa, ba) {\n            i.Mixin.updateComponent.call(this, aa, ba);\n            this._updateDOMProperties(ba);\n            this._updateDOMChildren(ba, aa);\n        },\n        _updateDOMProperties: function(aa) {\n            var ba = this.props, ca, da, ea;\n            for (ca in aa) {\n                if ((ba.hasOwnProperty(ca) || !aa.hasOwnProperty(ca))) {\n                    continue;\n                };\n                if ((ca === x)) {\n                    var fa = aa[ca];\n                    for (da in fa) {\n                        if (fa.hasOwnProperty(da)) {\n                            ea = (ea || {\n                            });\n                            ea[da] = \"\";\n                        }\n                    ;\n                    };\n                }\n                 else if ((ca === w)) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                }\n                 else if (u[ca]) {\n                    t(this._rootNodeID, ca);\n                }\n                 else i.DOMIDOperations.deletePropertyByID(this._rootNodeID, ca);\n                \n                \n            ;\n            };\n            for (ca in ba) {\n                var ga = ba[ca], ha = aa[ca];\n                if ((!ba.hasOwnProperty(ca) || (ga === ha))) {\n                    continue;\n                };\n                if ((ca === x)) {\n                    if (ga) {\n                        ga = ba.style = q(ga);\n                    };\n                    if (ha) {\n                        for (da in ha) {\n                            if ((ha.hasOwnProperty(da) && !ga.hasOwnProperty(da))) {\n                                ea = (ea || {\n                                });\n                                ea[da] = \"\";\n                            }\n                        ;\n                        };\n                        for (da in ga) {\n                            if ((ga.hasOwnProperty(da) && (ha[da] !== ga[da]))) {\n                                ea = (ea || {\n                                });\n                                ea[da] = ga[da];\n                            }\n                        ;\n                        };\n                    }\n                     else ea = ga;\n                ;\n                }\n                 else if ((ca === w)) {\n                    var ia = (ha && ha.__html), ja = (ga && ga.__html);\n                    if ((ia !== ja)) {\n                        i.DOMIDOperations.updateInnerHTMLByID(this._rootNodeID, ga);\n                    };\n                }\n                 else if (u[ca]) {\n                    s(this._rootNodeID, ca, ga);\n                }\n                 else i.DOMIDOperations.updatePropertyByID(this._rootNodeID, ca, ga);\n                \n                \n            ;\n            };\n            if (ea) {\n                i.DOMIDOperations.updateStylesByID(this._rootNodeID, ea);\n            };\n        },\n        _updateDOMChildren: function(aa, ba) {\n            var ca = this.props, da = (v[typeof aa.children] ? aa.children : null), ea = (v[typeof ca.children] ? ca.children : null), fa = ((da != null) ? null : aa.children), ga = ((ea != null) ? null : ca.children);\n            if ((ea != null)) {\n                var ha = ((fa != null) && (ga == null));\n                if (ha) {\n                    this.updateMultiChild(null, ba);\n                };\n                if ((da !== ea)) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, (\"\" + ea));\n                };\n            }\n             else {\n                var ia = ((da != null) && (ea == null));\n                if (ia) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                };\n                this.updateMultiChild(n(ca.children), ba);\n            }\n        ;\n        },\n        unmountComponent: function() {\n            j.deleteAllListeners(this._rootNodeID);\n            i.Mixin.unmountComponent.call(this);\n            this.unmountMultiChild();\n        }\n    };\n    r(z, i.Mixin);\n    r(z, z.Mixin);\n    r(z, k.Mixin);\n    e.exports = z;\n});\n__d(\"objMapKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (!h) {\n            return null\n        };\n        var k = 0, l = {\n        };\n        for (var m in h) {\n            if (h.hasOwnProperty(m)) {\n                l[m] = i.call(j, m, h[m], k++);\n            };\n        };\n        return l;\n    };\n    e.exports = g;\n});\n__d(\"ReactDOM\", [\"ReactNativeComponent\",\"mergeInto\",\"objMapKeyVal\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactNativeComponent\"), h = b(\"mergeInto\"), i = b(\"objMapKeyVal\");\n    function j(m, n) {\n        var o = function() {\n        \n        };\n        o.prototype = new g(m, n);\n        o.prototype.constructor = o;\n        var p = function(q, r) {\n            var s = new o();\n            s.construct.apply(s, arguments);\n            return s;\n        };\n        p.componentConstructor = o;\n        return p;\n    };\n    var k = i({\n        a: false,\n        abbr: false,\n        address: false,\n        audio: false,\n        b: false,\n        blockquote: false,\n        body: false,\n        br: true,\n        button: false,\n        code: false,\n        col: true,\n        colgroup: false,\n        dd: false,\n        div: false,\n        section: false,\n        dl: false,\n        dt: false,\n        em: false,\n        embed: true,\n        fieldset: false,\n        figcaption: false,\n        figure: false,\n        footer: false,\n        form: false,\n        h1: false,\n        h2: false,\n        h3: false,\n        h4: false,\n        h5: false,\n        h6: false,\n        header: false,\n        hr: true,\n        i: false,\n        iframe: false,\n        img: true,\n        input: true,\n        label: false,\n        legend: false,\n        li: false,\n        line: false,\n        nav: false,\n        object: false,\n        ol: false,\n        optgroup: false,\n        option: false,\n        p: false,\n        param: true,\n        pre: false,\n        select: false,\n        small: false,\n        source: false,\n        span: false,\n        sub: false,\n        sup: false,\n        strong: false,\n        table: false,\n        tbody: false,\n        td: false,\n        textarea: false,\n        tfoot: false,\n        th: false,\n        thead: false,\n        time: false,\n        title: false,\n        tr: false,\n        u: false,\n        ul: false,\n        video: false,\n        wbr: false,\n        circle: false,\n        g: false,\n        path: false,\n        polyline: false,\n        rect: false,\n        svg: false,\n        text: false\n    }, j), l = {\n        injectComponentClasses: function(m) {\n            h(k, m);\n        }\n    };\n    k.injection = l;\n    e.exports = k;\n});\n__d(\"ReactProps\", [\"createObjectFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = b(\"invariant\"), i = {\n        array: k(\"array\"),\n        bool: k(\"boolean\"),\n        func: k(\"function\"),\n        number: k(\"number\"),\n        object: k(\"object\"),\n        string: k(\"string\"),\n        oneOf: l,\n        instanceOf: m\n    }, j = \"\\u003C\\u003Canonymous\\u003E\\u003E\";\n    function k(o) {\n        function p(q, r, s) {\n            var t = typeof q;\n            if (((t === \"object\") && Array.isArray(q))) {\n                t = \"array\";\n            };\n            h((t === o));\n        };\n        return n(p);\n    };\n    function l(o) {\n        var p = g(o);\n        function q(r, s, t) {\n            h(p[r]);\n        };\n        return n(q);\n    };\n    function m(o) {\n        function p(q, r, s) {\n            h((q instanceof o));\n        };\n        return n(p);\n    };\n    function n(o) {\n        function p(q) {\n            function r(s, t, u) {\n                var v = s[t];\n                if ((v != null)) {\n                    o(v, t, (u || j));\n                }\n                 else h(!q);\n            ;\n            };\n            if (!q) {\n                r.isRequired = p(true);\n            };\n            return r;\n        };\n        return p(false);\n    };\n    e.exports = i;\n});\n__d(\"ReactServerRendering\", [\"ReactReconcileTransaction\",\"ReactInstanceHandles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactReconcileTransaction\"), h = b(\"ReactInstanceHandles\");\n    function i(j, k) {\n        var l = h.createReactRootID(), m = g.getPooled();\n        m.reinitializeTransaction();\n        try {\n            m.perform(function() {\n                k(j.mountComponent(l, m));\n            }, null);\n        } finally {\n            g.release(m);\n        };\n    };\n    e.exports = {\n        renderComponentToString: i\n    };\n});\n__d(\"ReactDOMForm\", [\"ReactCompositeComponent\",\"ReactDOM\",\"ReactEventEmitter\",\"EventConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"ReactEventEmitter\"), j = b(\"EventConstants\"), k = h.form, l = g.createClass({\n        render: function() {\n            return this.transferPropsTo(k(null, this.props.children));\n        },\n        componentDidMount: function(m) {\n            i.trapBubbledEvent(j.topLevelTypes.topSubmit, \"submit\", m);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMInput\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"merge\"), k = i.input, l = h.createClass({\n        getInitialState: function() {\n            return {\n                checked: (this.props.defaultChecked || false),\n                value: (this.props.defaultValue || \"\")\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getChecked: function() {\n            return ((this.props.checked != null) ? this.props.checked : this.state.checked);\n        },\n        getValue: function() {\n            return ((this.props.value != null) ? this.props.value : this.state.value);\n        },\n        render: function() {\n            var m = j(this.props);\n            m.checked = this.getChecked();\n            m.value = this.getValue();\n            m.onChange = this.handleChange;\n            return k(m, this.props.children);\n        },\n        componentDidUpdate: function(m, n, o) {\n            if ((this.props.checked != null)) {\n                g.setValueForProperty(o, \"checked\", (this.props.checked || false));\n            };\n            if ((this.props.value != null)) {\n                g.setValueForProperty(o, \"value\", (this.props.value || \"\"));\n            };\n        },\n        handleChange: h.autoBind(function(event) {\n            var m;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                m = this.props.onChange(event);\n                this._isChanging = false;\n            }\n        ;\n            this.setState({\n                checked: event.target.checked,\n                value: event.target.value\n            });\n            return m;\n        })\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMTextarea\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"invariant\"), k = b(\"merge\"), l = i.textarea, m = {\n        string: true,\n        number: true\n    }, n = h.createClass({\n        getInitialState: function() {\n            var o = this.props.defaultValue, p = this.props.children;\n            if ((p != null)) {\n                j((o == null));\n                if (Array.isArray(p)) {\n                    j((p.length <= 1));\n                    p = p[0];\n                }\n            ;\n                j(m[typeof p]);\n                o = (\"\" + p);\n            }\n        ;\n            o = (o || \"\");\n            return {\n                initialValue: ((this.props.value != null) ? this.props.value : o),\n                value: o\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getValue: function() {\n            return ((this.props.value != null) ? this.props.value : this.state.value);\n        },\n        render: function() {\n            var o = k(this.props);\n            j((o.dangerouslySetInnerHTML == null));\n            o.value = this.getValue();\n            o.onChange = this.handleChange;\n            return l(o, this.state.initialValue);\n        },\n        componentDidUpdate: function(o, p, q) {\n            if ((this.props.value != null)) {\n                g.setValueForProperty(q, \"value\", (this.props.value || \"\"));\n            };\n        },\n        handleChange: h.autoBind(function(event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(event);\n                this._isChanging = false;\n            }\n        ;\n            this.setState({\n                value: event.target.value\n            });\n            return o;\n        })\n    });\n    e.exports = n;\n});\n__d(\"DefaultDOMPropertyConfig\", [\"DOMProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = g.injection.MUST_USE_ATTRIBUTE, i = g.injection.MUST_USE_PROPERTY, j = g.injection.HAS_BOOLEAN_VALUE, k = g.injection.HAS_SIDE_EFFECTS, l = {\n        isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n        Properties: {\n            accept: null,\n            action: null,\n            ajaxify: h,\n            allowFullScreen: (h | j),\n            alt: null,\n            autoComplete: null,\n            autoplay: j,\n            cellPadding: null,\n            cellSpacing: null,\n            checked: (i | j),\n            className: i,\n            colSpan: null,\n            contentEditable: null,\n            controls: (i | j),\n            data: null,\n            dir: null,\n            disabled: (i | j),\n            draggable: null,\n            enctype: null,\n            height: h,\n            hidden: (h | j),\n            href: null,\n            htmlFor: null,\n            id: i,\n            max: null,\n            method: null,\n            min: null,\n            multiple: (i | j),\n            name: null,\n            poster: null,\n            preload: null,\n            placeholder: null,\n            rel: null,\n            required: j,\n            role: h,\n            scrollLeft: i,\n            scrollTop: i,\n            selected: (i | j),\n            spellCheck: null,\n            src: null,\n            step: null,\n            style: null,\n            tabIndex: null,\n            target: null,\n            title: null,\n            type: null,\n            value: (i | k),\n            width: h,\n            wmode: h,\n            cx: i,\n            cy: i,\n            d: i,\n            fill: i,\n            fx: i,\n            fy: i,\n            points: i,\n            r: i,\n            stroke: i,\n            strokeLinecap: i,\n            strokeWidth: i,\n            transform: i,\n            x: i,\n            x1: i,\n            x2: i,\n            version: i,\n            viewBox: i,\n            y: i,\n            y1: i,\n            y2: i,\n            spreadMethod: i,\n            offset: i,\n            stopColor: i,\n            stopOpacity: i,\n            gradientUnits: i,\n            gradientTransform: i\n        },\n        DOMAttributeNames: {\n            className: \"class\",\n            htmlFor: \"for\",\n            strokeLinecap: \"stroke-linecap\",\n            strokeWidth: \"stroke-width\",\n            stopColor: \"stop-color\",\n            stopOpacity: \"stop-opacity\"\n        },\n        DOMPropertyNames: {\n            autoComplete: \"autocomplete\",\n            spellCheck: \"spellcheck\"\n        },\n        DOMMutationMethods: {\n            className: function(m, n) {\n                m.className = (n || \"\");\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"DefaultEventPluginOrder\", [\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyOf\"), h = [g({\n        ResponderEventPlugin: null\n    }),g({\n        SimpleEventPlugin: null\n    }),g({\n        TapEventPlugin: null\n    }),g({\n        EnterLeaveEventPlugin: null\n    }),g({\n        ChangeEventPlugin: null\n    }),g({\n        AnalyticsEventPlugin: null\n    }),];\n    e.exports = h;\n});\n__d(\"SyntheticEvent\", [\"PooledClass\",\"emptyFunction\",\"getEventTarget\",\"merge\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"emptyFunction\"), i = b(\"getEventTarget\"), j = b(\"merge\"), k = b(\"mergeInto\"), l = {\n        type: null,\n        target: i,\n        currentTarget: null,\n        eventPhase: null,\n        bubbles: null,\n        cancelable: null,\n        timeStamp: function(event) {\n            return (event.timeStamp || Date.now());\n        },\n        defaultPrevented: null,\n        isTrusted: null\n    };\n    function m(n, o, p) {\n        this.dispatchConfig = n;\n        this.dispatchMarker = o;\n        this.nativeEvent = p;\n        var q = this.constructor.Interface;\n        for (var r in q) {\n            var s = q[r];\n            if (s) {\n                this[r] = s(p);\n            }\n             else this[r] = p[r];\n        ;\n        };\n        if ((p.defaultPrevented || (p.returnValue === false))) {\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        }\n         else this.isDefaultPrevented = h.thatReturnsFalse;\n    ;\n        this.isPropagationStopped = h.thatReturnsFalse;\n    };\n    k(m.prototype, {\n        preventDefault: function() {\n            this.defaultPrevented = true;\n            var event = this.nativeEvent;\n            (event.preventDefault ? event.preventDefault() : event.returnValue = false);\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        },\n        stopPropagation: function() {\n            var event = this.nativeEvent;\n            (event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true);\n            this.isPropagationStopped = h.thatReturnsTrue;\n        },\n        persist: function() {\n            this.isPersistent = h.thatReturnsTrue;\n        },\n        isPersistent: h.thatReturnsFalse,\n        destructor: function() {\n            var n = this.constructor.Interface;\n            for (var o in n) {\n                this[o] = null;;\n            };\n            this.dispatchConfig = null;\n            this.dispatchMarker = null;\n            this.nativeEvent = null;\n        }\n    });\n    m.Interface = l;\n    m.augmentClass = function(n, o) {\n        var p = this, q = Object.create(p.prototype);\n        k(q, n.prototype);\n        n.prototype = q;\n        n.prototype.constructor = n;\n        n.Interface = j(p.Interface, o);\n        n.augmentClass = p.augmentClass;\n        g.addPoolingTo(n, g.threeArgumentPooler);\n    };\n    g.addPoolingTo(m, g.threeArgumentPooler);\n    e.exports = m;\n});\n__d(\"SyntheticUIEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        view: null,\n        detail: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMouseEvent\", [\"SyntheticUIEvent\",\"ViewportMetrics\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = b(\"ViewportMetrics\"), i = {\n        screenX: null,\n        screenY: null,\n        clientX: null,\n        clientY: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        button: function(event) {\n            var k = event.button;\n            if ((\"which\" in event)) {\n                return k\n            };\n            return ((k === 2) ? 2 : ((k === 4) ? 1 : 0));\n        },\n        buttons: null,\n        relatedTarget: function(event) {\n            return (event.relatedTarget || (((event.fromElement === event.srcElement) ? event.toElement : event.fromElement)));\n        },\n        pageX: function(event) {\n            return ((\"pageX\" in event) ? event.pageX : (event.clientX + h.currentScrollLeft));\n        },\n        pageY: function(event) {\n            return ((\"pageY\" in event) ? event.pageY : (event.clientY + h.currentScrollTop));\n        }\n    };\n    function j(k, l, m) {\n        g.call(this, k, l, m);\n    };\n    g.augmentClass(j, i);\n    e.exports = j;\n});\n__d(\"EnterLeaveEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"ExecutionEnvironment\",\"ReactInstanceHandles\",\"SyntheticMouseEvent\",\"ReactID\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"ExecutionEnvironment\"), j = b(\"ReactInstanceHandles\"), k = b(\"SyntheticMouseEvent\"), l = b(\"ReactID\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = j.getFirstReactDOM, p = {\n        mouseEnter: {\n            registrationName: m({\n                onMouseEnter: null\n            })\n        },\n        mouseLeave: {\n            registrationName: m({\n                onMouseLeave: null\n            })\n        }\n    }, q = {\n        eventTypes: p,\n        extractEvents: function(r, s, t, u) {\n            if (((r === n.topMouseOver) && ((u.relatedTarget || u.fromElement)))) {\n                return null\n            };\n            if (((r !== n.topMouseOut) && (r !== n.topMouseOver))) {\n                return null\n            };\n            var v, w;\n            if ((r === n.topMouseOut)) {\n                v = s;\n                w = (o((u.relatedTarget || u.toElement)) || i.global);\n            }\n             else {\n                v = i.global;\n                w = s;\n            }\n        ;\n            if ((v === w)) {\n                return null\n            };\n            var x = (v ? l.getID(v) : \"\"), y = (w ? l.getID(w) : \"\"), z = k.getPooled(p.mouseLeave, x, u), aa = k.getPooled(p.mouseEnter, y, u);\n            h.accumulateEnterLeaveDispatches(z, aa, x, y);\n            return [z,aa,];\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChangeEventPlugin\", [\"EventConstants\",\"EventPluginHub\",\"EventPropagators\",\"ExecutionEnvironment\",\"SyntheticEvent\",\"isEventSupported\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPluginHub\"), i = b(\"EventPropagators\"), j = b(\"ExecutionEnvironment\"), k = b(\"SyntheticEvent\"), l = b(\"isEventSupported\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = {\n        change: {\n            phasedRegistrationNames: {\n                bubbled: m({\n                    onChange: null\n                }),\n                captured: m({\n                    onChangeCapture: null\n                })\n            }\n        }\n    }, p = null, q = null, r = null, s = null;\n    function t(na) {\n        return (((na.nodeName === \"SELECT\") || (((na.nodeName === \"INPUT\") && (na.type === \"file\")))));\n    };\n    var u = false;\n    if (j.canUseDOM) {\n        u = (l(\"change\") && ((!((\"documentMode\" in document)) || (document.documentMode > 8))));\n    };\n    function v(na) {\n        var event = k.getPooled(o.change, q, na);\n        i.accumulateTwoPhaseDispatches(event);\n        h.enqueueEvents(event);\n        h.processEventQueue();\n    };\n    function w(na, oa) {\n        p = na;\n        q = oa;\n        p.attachEvent(\"onchange\", v);\n    };\n    function x() {\n        if (!p) {\n            return\n        };\n        p.detachEvent(\"onchange\", v);\n        p = null;\n        q = null;\n    };\n    function y(na, oa, pa) {\n        if ((na === n.topChange)) {\n            return pa\n        };\n    };\n    function z(na, oa, pa) {\n        if ((na === n.topFocus)) {\n            x();\n            w(oa, pa);\n        }\n         else if ((na === n.topBlur)) {\n            x();\n        }\n    ;\n    };\n    var aa = false;\n    if (j.canUseDOM) {\n        aa = (l(\"input\") && ((!((\"documentMode\" in document)) || (document.documentMode > 9))));\n    };\n    var ba = {\n        color: true,\n        date: true,\n        datetime: true,\n        \"datetime-local\": true,\n        email: true,\n        month: true,\n        number: true,\n        password: true,\n        range: true,\n        search: true,\n        tel: true,\n        text: true,\n        time: true,\n        url: true,\n        week: true\n    };\n    function ca(na) {\n        return (((((na.nodeName === \"INPUT\") && ba[na.type])) || (na.nodeName === \"TEXTAREA\")));\n    };\n    var da = {\n        get: function() {\n            return s.get.call(this);\n        },\n        set: function(na) {\n            r = na;\n            s.set.call(this, na);\n        }\n    };\n    function ea(na, oa) {\n        p = na;\n        q = oa;\n        r = na.value;\n        s = Object.getOwnPropertyDescriptor(na.constructor.prototype, \"value\");\n        Object.defineProperty(p, \"value\", da);\n        p.attachEvent(\"onpropertychange\", ga);\n    };\n    function fa() {\n        if (!p) {\n            return\n        };\n        delete p.value;\n        p.detachEvent(\"onpropertychange\", ga);\n        p = null;\n        q = null;\n        r = null;\n        s = null;\n    };\n    function ga(na) {\n        if ((na.propertyName !== \"value\")) {\n            return\n        };\n        var oa = na.srcElement.value;\n        if ((oa === r)) {\n            return\n        };\n        r = oa;\n        v(na);\n    };\n    function ha(na, oa, pa) {\n        if ((na === n.topInput)) {\n            return pa\n        };\n    };\n    function ia(na, oa, pa) {\n        if ((na === n.topFocus)) {\n            fa();\n            ea(oa, pa);\n        }\n         else if ((na === n.topBlur)) {\n            fa();\n        }\n    ;\n    };\n    function ja(na, oa, pa) {\n        if ((((na === n.topSelectionChange) || (na === n.topKeyUp)) || (na === n.topKeyDown))) {\n            if ((p && (p.value !== r))) {\n                r = p.value;\n                return q;\n            }\n        \n        };\n    };\n    function ka(na) {\n        return (((na.nodeName === \"INPUT\") && (((na.type === \"checkbox\") || (na.type === \"radio\")))));\n    };\n    function la(na, oa, pa) {\n        if ((na === n.topClick)) {\n            return pa\n        };\n    };\n    var ma = {\n        eventTypes: o,\n        extractEvents: function(na, oa, pa, qa) {\n            var ra, sa;\n            if (t(oa)) {\n                if (u) {\n                    ra = y;\n                }\n                 else sa = z;\n            ;\n            }\n             else if (ca(oa)) {\n                if (aa) {\n                    ra = ha;\n                }\n                 else {\n                    ra = ja;\n                    sa = ia;\n                }\n            ;\n            }\n             else if (ka(oa)) {\n                ra = la;\n            }\n            \n        ;\n            if (ra) {\n                var ta = ra(na, oa, pa);\n                if (ta) {\n                    var event = k.getPooled(o.change, ta, qa);\n                    i.accumulateTwoPhaseDispatches(event);\n                    return event;\n                }\n            ;\n            }\n        ;\n            if (sa) {\n                sa(na, oa, pa);\n            };\n        }\n    };\n    e.exports = ma;\n});\n__d(\"SyntheticFocusEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        relatedTarget: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticKeyboardEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        char: null,\n        key: null,\n        location: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        repeat: null,\n        locale: null,\n        charCode: null,\n        keyCode: null,\n        which: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMutationEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        relatedNode: null,\n        prevValue: null,\n        newValue: null,\n        attrName: null,\n        attrChange: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticTouchEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        touches: null,\n        targetTouches: null,\n        changedTouches: null,\n        altKey: null,\n        metaKey: null,\n        ctrlKey: null,\n        shiftKey: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticWheelEvent\", [\"SyntheticMouseEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticMouseEvent\"), h = {\n        deltaX: function(event) {\n            return (((\"deltaX\" in event) ? event.deltaX : ((\"wheelDeltaX\" in event) ? -event.wheelDeltaX : 0)));\n        },\n        deltaY: function(event) {\n            return (((\"deltaY\" in event) ? -event.deltaY : ((\"wheelDeltaY\" in event) ? event.wheelDeltaY : ((\"wheelDelta\" in event) ? event.wheelData : 0))));\n        },\n        deltaZ: null,\n        deltaMode: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SimpleEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"SyntheticEvent\",\"SyntheticFocusEvent\",\"SyntheticKeyboardEvent\",\"SyntheticMouseEvent\",\"SyntheticMutationEvent\",\"SyntheticTouchEvent\",\"SyntheticUIEvent\",\"SyntheticWheelEvent\",\"invariant\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"SyntheticEvent\"), j = b(\"SyntheticFocusEvent\"), k = b(\"SyntheticKeyboardEvent\"), l = b(\"SyntheticMouseEvent\"), m = b(\"SyntheticMutationEvent\"), n = b(\"SyntheticTouchEvent\"), o = b(\"SyntheticUIEvent\"), p = b(\"SyntheticWheelEvent\"), q = b(\"invariant\"), r = b(\"keyOf\"), s = g.topLevelTypes, t = {\n        blur: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onBlur: true\n                }),\n                captured: r({\n                    onBlurCapture: true\n                })\n            }\n        },\n        click: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onClick: true\n                }),\n                captured: r({\n                    onClickCapture: true\n                })\n            }\n        },\n        doubleClick: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDoubleClick: true\n                }),\n                captured: r({\n                    onDoubleClickCapture: true\n                })\n            }\n        },\n        drag: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrag: true\n                }),\n                captured: r({\n                    onDragCapture: true\n                })\n            }\n        },\n        dragEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnd: true\n                }),\n                captured: r({\n                    onDragEndCapture: true\n                })\n            }\n        },\n        dragEnter: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnter: true\n                }),\n                captured: r({\n                    onDragEnterCapture: true\n                })\n            }\n        },\n        dragExit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragExit: true\n                }),\n                captured: r({\n                    onDragExitCapture: true\n                })\n            }\n        },\n        dragLeave: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragLeave: true\n                }),\n                captured: r({\n                    onDragLeaveCapture: true\n                })\n            }\n        },\n        dragOver: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragOver: true\n                }),\n                captured: r({\n                    onDragOverCapture: true\n                })\n            }\n        },\n        dragStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragStart: true\n                }),\n                captured: r({\n                    onDragStartCapture: true\n                })\n            }\n        },\n        drop: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrop: true\n                }),\n                captured: r({\n                    onDropCapture: true\n                })\n            }\n        },\n        DOMCharacterDataModified: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDOMCharacterDataModified: true\n                }),\n                captured: r({\n                    onDOMCharacterDataModifiedCapture: true\n                })\n            }\n        },\n        focus: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onFocus: true\n                }),\n                captured: r({\n                    onFocusCapture: true\n                })\n            }\n        },\n        input: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onInput: true\n                }),\n                captured: r({\n                    onInputCapture: true\n                })\n            }\n        },\n        keyDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyDown: true\n                }),\n                captured: r({\n                    onKeyDownCapture: true\n                })\n            }\n        },\n        keyPress: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyPress: true\n                }),\n                captured: r({\n                    onKeyPressCapture: true\n                })\n            }\n        },\n        keyUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyUp: true\n                }),\n                captured: r({\n                    onKeyUpCapture: true\n                })\n            }\n        },\n        mouseDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseDown: true\n                }),\n                captured: r({\n                    onMouseDownCapture: true\n                })\n            }\n        },\n        mouseMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseMove: true\n                }),\n                captured: r({\n                    onMouseMoveCapture: true\n                })\n            }\n        },\n        mouseUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseUp: true\n                }),\n                captured: r({\n                    onMouseUpCapture: true\n                })\n            }\n        },\n        scroll: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onScroll: true\n                }),\n                captured: r({\n                    onScrollCapture: true\n                })\n            }\n        },\n        submit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onSubmit: true\n                }),\n                captured: r({\n                    onSubmitCapture: true\n                })\n            }\n        },\n        touchCancel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchCancel: true\n                }),\n                captured: r({\n                    onTouchCancelCapture: true\n                })\n            }\n        },\n        touchEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchEnd: true\n                }),\n                captured: r({\n                    onTouchEndCapture: true\n                })\n            }\n        },\n        touchMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchMove: true\n                }),\n                captured: r({\n                    onTouchMoveCapture: true\n                })\n            }\n        },\n        touchStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchStart: true\n                }),\n                captured: r({\n                    onTouchStartCapture: true\n                })\n            }\n        },\n        wheel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onWheel: true\n                }),\n                captured: r({\n                    onWheelCapture: true\n                })\n            }\n        }\n    }, u = {\n        topBlur: t.blur,\n        topClick: t.click,\n        topDoubleClick: t.doubleClick,\n        topDOMCharacterDataModified: t.DOMCharacterDataModified,\n        topDrag: t.drag,\n        topDragEnd: t.dragEnd,\n        topDragEnter: t.dragEnter,\n        topDragExit: t.dragExit,\n        topDragLeave: t.dragLeave,\n        topDragOver: t.dragOver,\n        topDragStart: t.dragStart,\n        topDrop: t.drop,\n        topFocus: t.focus,\n        topInput: t.input,\n        topKeyDown: t.keyDown,\n        topKeyPress: t.keyPress,\n        topKeyUp: t.keyUp,\n        topMouseDown: t.mouseDown,\n        topMouseMove: t.mouseMove,\n        topMouseUp: t.mouseUp,\n        topScroll: t.scroll,\n        topSubmit: t.submit,\n        topTouchCancel: t.touchCancel,\n        topTouchEnd: t.touchEnd,\n        topTouchMove: t.touchMove,\n        topTouchStart: t.touchStart,\n        topWheel: t.wheel\n    }, v = {\n        eventTypes: t,\n        executeDispatch: function(event, w, x) {\n            var y = w(event, x);\n            if ((y === false)) {\n                event.stopPropagation();\n                event.preventDefault();\n            }\n        ;\n        },\n        extractEvents: function(w, x, y, z) {\n            var aa = u[w];\n            if (!aa) {\n                return null\n            };\n            var ba;\n            switch (w) {\n              case s.topInput:\n            \n              case s.topSubmit:\n                ba = i;\n                break;\n              case s.topKeyDown:\n            \n              case s.topKeyPress:\n            \n              case s.topKeyUp:\n                ba = k;\n                break;\n              case s.topBlur:\n            \n              case s.topFocus:\n                ba = j;\n                break;\n              case s.topClick:\n            \n              case s.topDoubleClick:\n            \n              case s.topDrag:\n            \n              case s.topDragEnd:\n            \n              case s.topDragEnter:\n            \n              case s.topDragExit:\n            \n              case s.topDragLeave:\n            \n              case s.topDragOver:\n            \n              case s.topDragStart:\n            \n              case s.topDrop:\n            \n              case s.topMouseDown:\n            \n              case s.topMouseMove:\n            \n              case s.topMouseUp:\n                ba = l;\n                break;\n              case s.topDOMCharacterDataModified:\n                ba = m;\n                break;\n              case s.topTouchCancel:\n            \n              case s.topTouchEnd:\n            \n              case s.topTouchMove:\n            \n              case s.topTouchStart:\n                ba = n;\n                break;\n              case s.topScroll:\n                ba = o;\n                break;\n              case s.topWheel:\n                ba = p;\n                break;\n            };\n            q(ba);\n            var event = ba.getPooled(aa, y, z);\n            h.accumulateTwoPhaseDispatches(event);\n            return event;\n        }\n    };\n    e.exports = v;\n});\n__d(\"ReactDefaultInjection\", [\"ReactDOM\",\"ReactDOMForm\",\"ReactDOMInput\",\"ReactDOMTextarea\",\"DefaultDOMPropertyConfig\",\"DOMProperty\",\"DefaultEventPluginOrder\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"EventPluginHub\",\"ReactInstanceHandles\",\"SimpleEventPlugin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactDOM\"), h = b(\"ReactDOMForm\"), i = b(\"ReactDOMInput\"), j = b(\"ReactDOMTextarea\"), k = b(\"DefaultDOMPropertyConfig\"), l = b(\"DOMProperty\"), m = b(\"DefaultEventPluginOrder\"), n = b(\"EnterLeaveEventPlugin\"), o = b(\"ChangeEventPlugin\"), p = b(\"EventPluginHub\"), q = b(\"ReactInstanceHandles\"), r = b(\"SimpleEventPlugin\");\n    function s() {\n        p.injection.injectEventPluginOrder(m);\n        p.injection.injectInstanceHandle(q);\n        p.injection.injectEventPluginsByName({\n            SimpleEventPlugin: r,\n            EnterLeaveEventPlugin: n,\n            ChangeEventPlugin: o\n        });\n        g.injection.injectComponentClasses({\n            form: h,\n            input: i,\n            textarea: j\n        });\n        l.injection.injectDOMPropertyConfig(k);\n    };\n    e.exports = {\n        inject: s\n    };\n});\n__d(\"React\", [\"ReactCompositeComponent\",\"ReactComponent\",\"ReactDOM\",\"ReactMount\",\"ReactProps\",\"ReactServerRendering\",\"ReactDefaultInjection\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactComponent\"), i = b(\"ReactDOM\"), j = b(\"ReactMount\"), k = b(\"ReactProps\"), l = b(\"ReactServerRendering\"), m = b(\"ReactDefaultInjection\");\n    m.inject();\n    var n = {\n        DOM: i,\n        Props: k,\n        initializeTouchEvents: function(o) {\n            j.useTouchEvents = o;\n        },\n        autoBind: g.autoBind,\n        createClass: g.createClass,\n        constructAndRenderComponent: j.constructAndRenderComponent,\n        constructAndRenderComponentByID: j.constructAndRenderComponentByID,\n        renderComponent: j.renderComponent,\n        renderComponentToString: l.renderComponentToString,\n        unmountAndReleaseReactRootNode: j.unmountAndReleaseReactRootNode,\n        isValidComponent: h.isValidComponent\n    };\n    e.exports = n;\n});\n__d(\"TrackingNodes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            USER_NAME: 2,\n            LIKE_LINK: 5,\n            UNLIKE_LINK: 6,\n            ATTACHMENT: 15,\n            SHARE_LINK: 17,\n            USER_MESSAGE: 18,\n            SOURCE: 21,\n            BLINGBOX: 22,\n            VIEW_ALL_COMMENTS: 24,\n            COMMENT: 25,\n            COMMENT_LINK: 26,\n            SMALL_ACTOR_PHOTO: 27,\n            XBUTTON: 29,\n            HIDE_LINK: 30,\n            REPORT_SPAM_LINK: 31,\n            HIDE_ALL_LINK: 32,\n            ADD_COMMENT_BOX: 34,\n            UFI: 36,\n            DROPDOWN_BUTTON: 55,\n            UNHIDE_LINK: 71\n        },\n        BASE_CODE_START: 58,\n        BASE_CODE_END: 126,\n        BASE_CODE_SIZE: 69,\n        PREFIX_CODE_START: 42,\n        PREFIX_CODE_END: 47,\n        PREFIX_CODE_SIZE: 6,\n        encodeTrackingInfo: function(h, i) {\n            var j = (((h - 1)) % g.BASE_CODE_SIZE), k = parseInt((((h - 1)) / g.BASE_CODE_SIZE), 10);\n            if (((h < 1) || (k > g.PREFIX_CODE_SIZE))) {\n                throw Error((\"Invalid tracking node: \" + h))\n            };\n            var l = \"\";\n            if ((k > 0)) {\n                l += String.fromCharCode(((k - 1) + g.PREFIX_CODE_START));\n            };\n            l += String.fromCharCode((j + g.BASE_CODE_START));\n            if (((typeof i != \"undefined\") && (i > 0))) {\n                l += String.fromCharCode(((48 + Math.min(i, 10)) - 1));\n            };\n            return l;\n        },\n        decodeTN: function(h) {\n            if ((h.length === 0)) {\n                return [0,]\n            };\n            var i = h.charCodeAt(0), j = 1, k, l;\n            if (((i >= g.PREFIX_CODE_START) && (i <= g.PREFIX_CODE_END))) {\n                if ((h.length == 1)) {\n                    return [0,]\n                };\n                l = ((i - g.PREFIX_CODE_START) + 1);\n                k = h.charCodeAt(1);\n                j = 2;\n            }\n             else {\n                l = 0;\n                k = i;\n            }\n        ;\n            if (((k < g.BASE_CODE_START) || (k > g.BASE_CODE_END))) {\n                return [0,]\n            };\n            var m = (((l * g.BASE_CODE_SIZE) + ((k - g.BASE_CODE_START))) + 1);\n            if (((h.length > j) && (((h.charAt(j) >= \"0\") && (h.charAt(j) <= \"9\"))))) {\n                return [(j + 1),[m,(parseInt(h.charAt(j), 10) + 1),],]\n            };\n            return [j,[m,],];\n        },\n        parseTrackingNodeString: function(h) {\n            var i = [];\n            while ((h.length > 0)) {\n                var j = g.decodeTN(h);\n                if ((j.length == 1)) {\n                    return []\n                };\n                i.push(j[1]);\n                h = h.substring(j[0]);\n            };\n            return i;\n        },\n        getTrackingInfo: function(h, i) {\n            return ((\"{\\\"tn\\\":\\\"\" + g.encodeTrackingInfo(h, i)) + \"\\\"}\");\n        }\n    };\n    e.exports = g;\n});\n__d(\"NumberFormat\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = /(\\d{3})(?=\\d)/g, i = 10000, j = function(l) {\n        return ((\"\" + l)).split(\"\").reverse().join(\"\");\n    }, k = {\n        formatIntegerWithDelimiter: function(l, m) {\n            if (((((g.locale == \"nb_NO\") || (g.locale == \"nn_NO\"))) && ((Math.abs(l) < i)))) {\n                return l.toString()\n            };\n            var n = j(l);\n            return j(n.replace(h, (\"$1\" + m)));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UFIBlingItem.react\", [\"React\",\"NumberFormat\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"NumberFormat\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = g.createClass({\n        displayName: \"UFIBlingItem\",\n        render: function() {\n            var l = j(this.props.className, this.props.iconClassName, \"UFIBlingBoxSprite\"), m = h.formatIntegerWithDelimiter(this.props.count, (this.props.contextArgs.numberdelimiter || \",\"));\n            return (g.DOM.span(null, g.DOM.i({\n                className: l\n            }), g.DOM.span({\n                className: \"UFIBlingBoxText\"\n            }, m)));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFIConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COMMENT_LIKE: \"fa-type:comment-like\",\n        COMMENT_SET_SPAM: \"fa-type:mark-spam\",\n        DELETE_COMMENT: \"fa-type:delete-comment\",\n        LIVE_DELETE_COMMENT: \"fa-type:live-delete-comment\",\n        LIKE_ACTION: \"fa-type:like\",\n        REMOVE_PREVIEW: \"fa-type:remove-preview\",\n        CONFIRM_COMMENT_REMOVAL: \"fa-type:confirm-remove\",\n        TRANSLATE_COMMENT: \"fa-type:translate-comment\",\n        SUBSCRIBE_ACTION: \"fa-type:subscribe\",\n        GIFT_SUGGESTION: \"fa-type:gift-suggestion\",\n        UNDO_DELETE_COMMENT: \"fa-type:undo-delete-comment\"\n    }, h = {\n        DELETED: \"status:deleted\",\n        SPAM: \"status:spam\",\n        SPAM_DISPLAY: \"status:spam-display\",\n        LIVE_DELETED: \"status:live-deleted\",\n        FAILED_ADD: \"status:failed-add\",\n        FAILED_EDIT: \"status:failed-edit\",\n        PENDING_EDIT: \"status:pending-edit\",\n        PENDING_UNDO_DELETE: \"status:pending-undo-delete\"\n    }, i = {\n        MOBILE: 1,\n        SMS: 3,\n        EMAIL: 4\n    }, j = {\n        PROFILE: 0,\n        NEWS_FEED: 1,\n        OBJECT: 2,\n        MOBILE: 3,\n        EMAIL: 4,\n        PROFILE_APROVAL: 10,\n        TICKER: 12,\n        NONE: 13,\n        INTERN: 14,\n        ADS: 15,\n        PHOTOS_SNOWLIFT: 17\n    }, k = {\n        UNKNOWN: 0,\n        INITIAL_SERVER: 1,\n        LIVE_SEND: 2,\n        USER_ACTION: 3,\n        COLLAPSED_UFI: 4,\n        ENDPOINT_LIKE: 10,\n        ENDPOINT_COMMENT_LIKE: 11,\n        ENDPOINT_ADD_COMMENT: 12,\n        ENDPOINT_EDIT_COMMENT: 13,\n        ENDPOINT_DELETE_COMMENT: 14,\n        ENDPOINT_UNDO_DELETE_COMMENT: 15,\n        ENDPOINT_COMMENT_SPAM: 16,\n        ENDPOINT_REMOVE_PREVIEW: 17,\n        ENDPOINT_ID_COMMENT_FETCH: 18,\n        ENDPOINT_COMMENT_FETCH: 19,\n        ENDPOINT_TRANSLATE_COMMENT: 20,\n        ENDPOINT_BAN: 21,\n        ENDPOINT_SUBSCRIBE: 22\n    }, l = {\n        CHRONOLOGICAL: \"chronological\",\n        RANKED_THREADED: \"ranked_threaded\",\n        TOPLEVEL: \"toplevel\",\n        RECENT_ACTIVITY: \"recent_activity\"\n    }, m = 50, n = 97244, o = 420, p = 5, q = 80, r = 2;\n    e.exports = {\n        UFIActionType: g,\n        UFIStatus: h,\n        UFISourceType: i,\n        UFIFeedbackSourceType: j,\n        UFIPayloadSourceType: k,\n        UFICommentOrderingMode: l,\n        defaultPageSize: m,\n        commentTruncationLength: o,\n        commentTruncationPercent: n,\n        commentTruncationMaxLines: p,\n        attachmentTruncationLength: q,\n        minCommentsForOrderingModeSelector: r\n    };\n});\n__d(\"UFIBlingBox.react\", [\"React\",\"UFIBlingItem.react\",\"UFIConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIBlingItem.react\"), i = b(\"UFIConstants\"), j = b(\"cx\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIBlingBox\",\n        render: function() {\n            var m = [], n = \"\";\n            if (this.props.likes) {\n                m.push(h({\n                    count: this.props.likes,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxLikeIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.likes == 1)) ? \"1 like\" : k._(\"{count} likes\", {\n                    count: this.props.likes\n                }));\n                n += \" \";\n            }\n        ;\n            if (this.props.comments) {\n                m.push(h({\n                    count: this.props.comments,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxCommentIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.comments == 1)) ? \"1 comment\" : k._(\"{count} comments\", {\n                    count: this.props.comments\n                }));\n                n += \" \";\n            }\n        ;\n            if (this.props.reshares) {\n                m.push(h({\n                    count: this.props.reshares,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxReshareIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.reshares == 1)) ? \"1 share\" : k._(\"{count} shares\", {\n                    count: this.props.reshares\n                }));\n            }\n        ;\n            var o = g.DOM.a({\n                className: \"UFIBlingBox uiBlingBox feedbackBling\",\n                href: this.props.permalink,\n                \"data-ft\": this.props[\"data-ft\"],\n                \"aria-label\": n\n            }, m);\n            if ((this.props.comments < i.defaultPageSize)) {\n                o.props.onClick = this.props.onClick;\n                o.props.rel = \"ignore\";\n            }\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFICentralUpdates\", [\"Arbiter\",\"ChannelConstants\",\"LiveTimer\",\"ShortProfiles\",\"UFIConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveTimer\"), j = b(\"ShortProfiles\"), k = b(\"UFIConstants\"), l = b(\"copyProperties\"), m = b(\"tx\"), n = 0, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [];\n    g.subscribe(h.getArbiterType(\"live-data\"), function(x, y) {\n        if ((y && y.obj)) {\n            var z = y.obj, aa = (z.comments || []);\n            aa.forEach(function(ba) {\n                ba.timestamp.text = \"a few seconds ago\";\n            });\n            w.handleUpdate(k.UFIPayloadSourceType.LIVE_SEND, z);\n        }\n    ;\n    });\n    function t() {\n        if (!n) {\n            var x = q, y = o, z = p, aa = r;\n            q = {\n            };\n            o = {\n            };\n            p = {\n            };\n            r = {\n            };\n            if (Object.keys(x).length) {\n                v(\"feedback-id-changed\", x);\n            };\n            if (Object.keys(y).length) {\n                v(\"feedback-updated\", y);\n            };\n            if (Object.keys(z).length) {\n                v(\"comments-updated\", z);\n            };\n            if (Object.keys(aa).length) {\n                v(\"instance-updated\", aa);\n            };\n            s.pop();\n        }\n    ;\n    };\n    function u() {\n        if (s.length) {\n            return s[(s.length - 1)];\n        }\n         else return k.UFIPayloadSourceType.UNKNOWN\n    ;\n    };\n    function v(event, x) {\n        w.inform(event, {\n            updates: x,\n            payloadSource: u()\n        });\n    };\n    var w = l(new g(), {\n        handleUpdate: function(x, y) {\n            if (Object.keys(y).length) {\n                this.synchronizeInforms(function() {\n                    s.push(x);\n                    var z = l({\n                        payloadsource: u()\n                    }, y);\n                    this.inform(\"update-feedback\", z);\n                    this.inform(\"update-comment-lists\", z);\n                    this.inform(\"update-comments\", z);\n                    this.inform(\"update-actions\", z);\n                    ((y.profiles || [])).forEach(function(aa) {\n                        j.set(aa.id, aa);\n                    });\n                    if (y.servertime) {\n                        i.restart(y.servertime);\n                    };\n                }.bind(this));\n            };\n        },\n        didUpdateFeedback: function(x) {\n            o[x] = true;\n            t();\n        },\n        didUpdateComment: function(x) {\n            p[x] = true;\n            t();\n        },\n        didUpdateFeedbackID: function(x, y) {\n            q[x] = y;\n            t();\n        },\n        didUpdateInstanceState: function(x, y) {\n            if (!r[x]) {\n                r[x] = {\n                };\n            };\n            r[x][y] = true;\n            t();\n        },\n        synchronizeInforms: function(x) {\n            n++;\n            try {\n                x();\n            } catch (y) {\n                throw y;\n            } finally {\n                n--;\n                t();\n            };\n        }\n    });\n    e.exports = w;\n});\n__d(\"randomInt\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        var k = arguments.length;\n        g(((k > 0) && (k <= 2)));\n        if ((k === 1)) {\n            j = i;\n            i = 0;\n        }\n    ;\n        g((j > i));\n        var l = (this.random || Math.random);\n        return Math.floor((i + (l() * ((j - i)))));\n    };\n    e.exports = h;\n});\n__d(\"ClientIDs\", [\"randomInt\",], function(a, b, c, d, e, f) {\n    var g = b(\"randomInt\"), h = {\n    }, i = {\n        getNewClientID: function() {\n            var j = Date.now(), k = ((j + \":\") + ((g(0, 4294967295) + 1)));\n            h[k] = true;\n            return k;\n        },\n        isExistingClientID: function(j) {\n            return !!h[j];\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImmutableObject\", [\"keyMirror\",\"merge\",\"mergeInto\",\"mergeHelpers\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"merge\"), i = b(\"mergeInto\"), j = b(\"mergeHelpers\"), k = b(\"throwIf\"), l = j.checkMergeObjectArgs, m = j.isTerminal, n, o;\n    n = g({\n        INVALID_MAP_SET_ARG: null\n    });\n    o = function(q) {\n        i(this, q);\n    };\n    o.set = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        var s = new o(q);\n        i(s, r);\n        return s;\n    };\n    o.setField = function(q, r, s) {\n        var t = {\n        };\n        t[r] = s;\n        return o.set(q, t);\n    };\n    o.setDeep = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        return p(q, r);\n    };\n    function p(q, r) {\n        l(q, r);\n        var s = {\n        }, t = Object.keys(q);\n        for (var u = 0; (u < t.length); u++) {\n            var v = t[u];\n            if (!r.hasOwnProperty(v)) {\n                s[v] = q[v];\n            }\n             else if ((m(q[v]) || m(r[v]))) {\n                s[v] = r[v];\n            }\n             else s[v] = p(q[v], r[v]);\n            \n        ;\n        };\n        var w = Object.keys(r);\n        for (u = 0; (u < w.length); u++) {\n            var x = w[u];\n            if (q.hasOwnProperty(x)) {\n                continue;\n            };\n            s[x] = r[x];\n        };\n        return ((((q instanceof o) || (r instanceof o))) ? new o(s) : s);\n    };\n    e.exports = o;\n});\n__d(\"debounceAcrossTransitions\", [\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"debounce\");\n    function h(i, j, k) {\n        return g(i, j, k, true);\n    };\n    e.exports = h;\n});\n__d(\"MercuryServerDispatcher\", [\"AsyncRequest\",\"FBAjaxRequest\",\"Env\",\"JSLogger\",\"Run\",\"areObjectsEqual\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"FBAjaxRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = b(\"areObjectsEqual\"), m = b(\"copyProperties\"), n = b(\"debounceAcrossTransitions\"), o = {\n    }, p = j.create(\"mercury_dispatcher\"), q = false, r = {\n        IMMEDIATE: \"immediate\",\n        IDEMPOTENT: \"idempotent\",\n        BATCH_SUCCESSIVE: \"batch-successive\",\n        BATCH_SUCCESSIVE_UNIQUE: \"batch-successive-unique\",\n        BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR: \"batch-successive-piggyback-retry\",\n        BATCH_DEFERRED_MULTI: \"batch-deferred-multi\",\n        BATCH_CONDITIONAL: \"batch-conditional\",\n        registerEndpoints: function(v) {\n            for (var w in v) {\n                var x = v[w], y = (x.request_user_id || i.user);\n                if (!o[w]) {\n                    o[w] = {\n                    };\n                };\n                if (!o[w][y]) {\n                    o[w][y] = {\n                    };\n                };\n                o[w][y] = new s(w, x);\n            };\n        },\n        trySend: function(v, w, x, y) {\n            y = (y || i.user);\n            if (((v == \"/ajax/mercury/client_reliability.php\") && !o[v][y])) {\n                o[v][y] = o[v][undefined];\n            };\n            o[v][y].trySend(w, x);\n        }\n    };\n    function s(v, w) {\n        var x = (w.mode || r.IMMEDIATE);\n        switch (x) {\n          case r.IMMEDIATE:\n        \n          case r.IDEMPOTENT:\n        \n          case r.BATCH_SUCCESSIVE:\n        \n          case r.BATCH_SUCCESSIVE_UNIQUE:\n        \n          case r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR:\n        \n          case r.BATCH_DEFERRED_MULTI:\n        \n          case r.BATCH_CONDITIONAL:\n            break;\n          default:\n            throw new Error((\"Invalid MercuryServerDispatcher mode \" + x));\n        };\n        this._endpoint = v;\n        this._mode = x;\n        this._requestUserID = w.request_user_id;\n        this._combineData = w.batch_function;\n        this._combineDataIf = w.batch_if;\n        this._batchSizeLimit = w.batch_size_limit;\n        this._batches = [];\n        this._handler = w.handler;\n        this._errorHandler = w.error_handler;\n        this._transportErrorHandler = (w.transport_error_handler || w.error_handler);\n        this._connectionRetries = (w.connection_retries || 0);\n        this._timeoutHandler = w.timeout_handler;\n        this._timeout = w.timeout;\n        this._serverDialogCancelHandler = (w.server_dialog_cancel_handler || w.error_handler);\n        this._deferredSend = n(this._batchSend, 0, this);\n        if (this._batchSizeLimit) {\n            k.onUnload(function() {\n                p.bump((\"unload_batches_count_\" + u(this._batches.length)));\n            }.bind(this));\n        };\n    };\n    m(s.prototype, {\n        _inFlight: 0,\n        _handler: null,\n        _errorHandler: null,\n        _transportErrorHandler: null,\n        _timeoutHandler: null,\n        _timeout: null,\n        _serverDialogCancelHandler: null,\n        _combineData: null,\n        trySend: function(v, w) {\n            if (q) {\n                return\n            };\n            if ((typeof v == \"undefined\")) {\n                v = null;\n            };\n            var x = (w || this._mode);\n            if ((x == r.IMMEDIATE)) {\n                this._send(v);\n            }\n             else if ((x == r.IDEMPOTENT)) {\n                if (!this._inFlight) {\n                    this._send(v);\n                };\n            }\n             else if (((x == r.BATCH_SUCCESSIVE) || (x == r.BATCH_SUCCESSIVE_UNIQUE))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n                 else this._batchData(v);\n            ;\n            }\n             else if ((x == r.BATCH_CONDITIONAL)) {\n                var y = (this._batches[0] && this._batches[0].getData());\n                if ((this._inFlight && ((this._combineDataIf(this._pendingRequestData, v) || this._combineDataIf(y, v))))) {\n                    this._batchData(v);\n                }\n                 else this._send(v);\n            ;\n            }\n             else if ((x == r.BATCH_DEFERRED_MULTI)) {\n                this._batchData(v);\n                this._deferredSend();\n            }\n             else if ((x == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) {\n                this._batchData(v);\n                if (!this._inFlight) {\n                    this._batchSend();\n                };\n            }\n            \n            \n            \n            \n            \n        ;\n        },\n        _send: function(v) {\n            this._inFlight++;\n            this._pendingRequestData = m({\n            }, v);\n            if ((this._requestUserID != i.user)) {\n                v.request_user_id = this._requestUserID;\n            };\n            p.log(\"send\", {\n                endpoint: this._endpoint,\n                data: v,\n                inflight_count: this._inFlight\n            });\n            var w = null;\n            if (i.worker_context) {\n                w = new h(\"POST\", this._endpoint, v);\n                w.onError = function(x) {\n                    x.getPayload = function() {\n                        return x.errorText;\n                    };\n                    x.getRequest = function() {\n                        var y = x;\n                        x.getData = function() {\n                            return v;\n                        };\n                        return y;\n                    };\n                    x.getError = function() {\n                        return x.errorText;\n                    };\n                    x.getErrorDescription = function() {\n                        return x.errorText;\n                    };\n                    x.isTransient = function() {\n                        return false;\n                    };\n                    this._handleError(x);\n                }.bind(this);\n                w.onJSON = function(x) {\n                    x.getPayload = function() {\n                        return x.json;\n                    };\n                    x.getRequest = function() {\n                        return w;\n                    };\n                    this._handleResponse(x);\n                }.bind(this);\n                w.getData = function() {\n                    return v;\n                };\n                w.send();\n            }\n             else {\n                w = new g(this._endpoint).setData(v).setOption(\"retries\", this._connectionRetries).setHandler(this._handleResponse.bind(this)).setErrorHandler(this._handleError.bind(this)).setTransportErrorHandler(this._handleTransportError.bind(this)).setServerDialogCancelHandler(this._handleServerDialogCancel.bind(this)).setAllowCrossPageTransition(true);\n                if ((this._timeout && this._timeoutHandler)) {\n                    w.setTimeoutHandler(this._timeout, this._handleTimeout.bind(this));\n                };\n                w.send();\n            }\n        ;\n        },\n        _batchData: function(v, w) {\n            if ((((this._mode == r.BATCH_SUCCESSIVE_UNIQUE) && (typeof this._pendingRequestData != \"undefined\")) && l(v, this._pendingRequestData))) {\n                return;\n            }\n             else {\n                var x = (this._batches.length - 1);\n                if (((x >= 0) && !this._hasReachedBatchLimit(this._batches[x]))) {\n                    (w ? this._batches[x].combineWithOlder(v, this._combineData) : this._batches[x].combineWith(v, this._combineData));\n                }\n                 else {\n                    this._batches.push(new t(v));\n                    p.bump((\"batches_count_\" + u(this._batches.length)));\n                }\n            ;\n                p.debug(\"batch\", {\n                    endpoint: this._endpoint,\n                    batches: this._batches,\n                    batch_limit: this._batchSizeLimit\n                });\n            }\n        ;\n        },\n        _hasReachedBatchLimit: function(v) {\n            return (this._batchSizeLimit && (v.getSize() >= this._batchSizeLimit));\n        },\n        _batchSend: function() {\n            if (this._batches[0]) {\n                this._send(this._batches[0].getData());\n                this._batches.shift();\n            }\n        ;\n        },\n        _handleResponse: function(v) {\n            this._inFlight--;\n            p.log(\"response\", {\n                endpoint: this._endpoint,\n                inflight_count: this._inFlight\n            });\n            var w = v.getPayload();\n            q = (w && w.kill_chat);\n            if (q) {\n                p.log(\"killswitch_enabled\", {\n                    endpoint: this._endpoint,\n                    inflight_count: this._inFlight\n                });\n            };\n            if ((w && w.error_payload)) {\n                if (this._errorHandler) {\n                    this._errorHandler(v);\n                };\n            }\n             else (this._handler && this._handler(w, v.getRequest()));\n        ;\n            if (((((this._mode == r.BATCH_SUCCESSIVE) || (this._mode == r.BATCH_SUCCESSIVE_UNIQUE)) || (this._mode == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) || (this._mode == r.BATCH_CONDITIONAL))) {\n                this._batchSend();\n            };\n            delete this._pendingRequestData;\n        },\n        _postErrorHandler: function() {\n            p.error(\"error\", {\n                endpoint: this._endpoint,\n                inflight_count: (this._inFlight - 1)\n            });\n            this._inFlight--;\n            var v = this._mode;\n            if ((((v == r.BATCH_SUCCESSIVE) || (v == r.BATCH_SUCCESSIVE_UNIQUE)) || (v == r.BATCH_CONDITIONAL))) {\n                this._batchSend();\n            }\n             else if ((v == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) {\n                if (this._batches[0]) {\n                    this._batchData(this._pendingRequestData, true);\n                    this._batchSend();\n                }\n                 else this._batchData(this._pendingRequestData, true);\n            \n            }\n        ;\n            delete this._pendingRequestData;\n        },\n        _handleError: function(v) {\n            (this._errorHandler && this._errorHandler(v));\n            this._postErrorHandler();\n        },\n        _handleTransportError: function(v) {\n            (this._transportErrorHandler && this._transportErrorHandler(v));\n            this._postErrorHandler();\n        },\n        _handleTimeout: function(v) {\n            (this._timeoutHandler && this._timeoutHandler(v));\n            this._postErrorHandler();\n        },\n        _handleServerDialogCancel: function(v) {\n            (this._serverDialogCancelHandler && this._serverDialogCancelHandler(v));\n            this._postErrorHandler();\n        }\n    });\n    function t(v) {\n        this._data = v;\n        this._size = 1;\n    };\n    m(t.prototype, {\n        getData: function() {\n            return this._data;\n        },\n        getSize: function() {\n            return this._size;\n        },\n        combineWith: function(v, w) {\n            this._data = w(this._data, v);\n            this._size++;\n        },\n        combineWithOlder: function(v, w) {\n            this._data = w(v, this._data);\n            this._size++;\n        }\n    });\n    function u(v) {\n        if ((v === 1)) {\n            return \"equals1\";\n        }\n         else if (((v >= 2) && (v <= 3))) {\n            return \"between2and3\";\n        }\n         else return \"over4\"\n        \n    ;\n    };\n    e.exports = r;\n});\n__d(\"UFIFeedbackTargets\", [\"ClientIDs\",\"KeyedCallbackManager\",\"UFICentralUpdates\",\"UFIConstants\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"KeyedCallbackManager\"), i = b(\"UFICentralUpdates\"), j = b(\"UFIConstants\"), k = b(\"copyProperties\"), l = new h();\n    function m(v) {\n        var w = {\n        };\n        v.forEach(function(x) {\n            var y = k({\n            }, x);\n            delete y.commentlist;\n            delete y.commentcount;\n            w[x.entidentifier] = y;\n            i.didUpdateFeedback(x.entidentifier);\n        });\n        l.addResourcesAndExecute(w);\n    };\n    function n(v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            switch (x.actiontype) {\n              case j.UFIActionType.LIKE_ACTION:\n                p(x);\n                break;\n              case j.UFIActionType.SUBSCRIBE_ACTION:\n                q(x);\n                break;\n              case j.UFIActionType.GIFT_SUGGESTION:\n                r(x);\n                break;\n            };\n        };\n    };\n    function o(v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            if (x.orig_ftentidentifier) {\n                t(x.orig_ftentidentifier, x.ftentidentifier);\n            };\n        };\n    };\n    function p(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewerliked = !!v.hasviewerliked;\n            if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewerliked != w.hasviewerliked))) {\n                return\n            };\n            w.likecount = (v.likecount || 0);\n            w.likesentences = v.likesentences;\n            if ((v.actorid == w.actorforpost)) {\n                w.hasviewerliked = v.hasviewerliked;\n            }\n             else if ((v.hasviewerliked != w.hasviewerliked)) {\n                w.likesentences = {\n                    current: v.likesentences.alternate,\n                    alternate: v.likesentences.current\n                };\n                if (w.hasviewerliked) {\n                    w.likecount++;\n                }\n                 else w.likecount--;\n            ;\n            }\n            \n        ;\n            if ((v.actorid != w.actorforpost)) {\n                w.likesentences.isunseen = true;\n            };\n            m([w,]);\n        }\n    ;\n    };\n    function q(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewersubscribed = !!v.hasviewersubscribed;\n            if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewersubscribed != w.hasviewersubscribed))) {\n                return\n            };\n            if ((v.actorid == w.actorforpost)) {\n                w.hasviewersubscribed = v.hasviewersubscribed;\n            };\n            m([w,]);\n        }\n    ;\n    };\n    function r(v) {\n        var w = s(v);\n        if (!w) {\n            return\n        };\n        if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewerliked != w.hasviewerliked))) {\n            return\n        };\n        w.giftdata = v.giftdata;\n        m([w,]);\n    };\n    function s(v) {\n        if (v.orig_entidentifier) {\n            t(v.orig_entidentifier, v.entidentifier);\n        };\n        return l.getResource(v.entidentifier);\n    };\n    function t(v, w) {\n        var x = l.getResource(v);\n        if (x) {\n            l.setResource(v, null);\n            x.entidentifier = w;\n            l.setResource(w, x);\n            i.didUpdateFeedbackID(v, w);\n        }\n    ;\n    };\n    var u = {\n        getFeedbackTarget: function(v, w) {\n            var x = l.executeOrEnqueue(v, w), y = l.getUnavailableResources(x);\n            if (!y.length) {\n                return\n            };\n        }\n    };\n    i.subscribe(\"update-feedback\", function(v, w) {\n        var x = w.feedbacktargets;\n        if ((x && x.length)) {\n            m(x);\n        };\n    });\n    i.subscribe(\"update-actions\", function(v, w) {\n        if ((w.actions && w.actions.length)) {\n            n(w.actions);\n        };\n    });\n    i.subscribe(\"update-comments\", function(v, w) {\n        if ((w.comments && w.comments.length)) {\n            o(w.comments);\n        };\n    });\n    e.exports = u;\n});\n__d(\"UFIInstanceState\", [\"UFICentralUpdates\",], function(a, b, c, d, e, f) {\n    var g = b(\"UFICentralUpdates\"), h = {\n    };\n    function i(k) {\n        if (!h[k]) {\n            h[k] = {\n            };\n        };\n    };\n    var j = {\n        getKeyForInstance: function(k, l) {\n            i(k);\n            return h[k][l];\n        },\n        updateState: function(k, l, m) {\n            i(k);\n            h[k][l] = m;\n            g.didUpdateInstanceState(k, l);\n        },\n        updateStateField: function(k, l, m, n) {\n            var o = (this.getKeyForInstance(k, l) || {\n            });\n            o[m] = n;\n            this.updateState(k, l, o);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UFIComments\", [\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"UFICentralUpdates\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"URI\",\"keyMirror\",\"merge\",\"randomInt\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"ImmutableObject\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = b(\"UFICentralUpdates\"), m = b(\"UFIConstants\"), n = b(\"UFIFeedbackTargets\"), o = b(\"UFIInstanceState\"), p = b(\"URI\"), q = b(\"keyMirror\"), r = b(\"merge\"), s = b(\"randomInt\"), t = b(\"throwIf\"), u = q({\n        INVALID_COMMENT_TYPE: null\n    }), v = i.create(\"UFIComments\"), w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = \"unavailable_comment_key\";\n    function da(ab) {\n        return ((ab in ba) ? ba[ab] : ab);\n    };\n    function ea(ab, bb) {\n        if (!x[ab]) {\n            x[ab] = {\n            };\n        };\n        if (!x[ab][bb]) {\n            x[ab][bb] = new j();\n        };\n        return x[ab][bb];\n    };\n    function fa(ab) {\n        var bb = [];\n        if (x[ab]) {\n            for (var cb in x[ab]) {\n                bb.push(x[ab][cb]);;\n            }\n        };\n        return bb;\n    };\n    function ga(ab) {\n        if (!y[ab]) {\n            y[ab] = new j();\n        };\n        return y[ab];\n    };\n    function ha(ab) {\n        var bb = fa(ab);\n        bb.forEach(function(cb) {\n            cb.reset();\n        });\n    };\n    function ia(ab, bb) {\n        ab.forEach(function(cb) {\n            var db = cb.ftentidentifier, eb = (cb.parentcommentid || db);\n            n.getFeedbackTarget(db, function(fb) {\n                var gb = m.UFIPayloadSourceType, hb = cb.clientid, ib = false, jb = r({\n                }, cb);\n                if (hb) {\n                    delete jb.clientid;\n                    ib = g.isExistingClientID(hb);\n                    if ((ib && ba[hb])) {\n                        return\n                    };\n                }\n            ;\n                if ((((bb === gb.LIVE_SEND) && cb.parentcommentid) && (z[eb] === undefined))) {\n                    return\n                };\n                if ((((((bb === gb.LIVE_SEND)) || ((bb === gb.USER_ACTION))) || ((bb === gb.ENDPOINT_ADD_COMMENT))) || ((bb === gb.ENDPOINT_EDIT_COMMENT)))) {\n                    jb.isunseen = true;\n                };\n                if (((bb === gb.ENDPOINT_COMMENT_FETCH) || (bb === gb.ENDPOINT_ID_COMMENT_FETCH))) {\n                    jb.fromfetch = true;\n                };\n                if (ib) {\n                    if (w[hb].ufiinstanceid) {\n                        o.updateStateField(w[hb].ufiinstanceid, \"locallycomposed\", cb.id, true);\n                    };\n                    jb.ufiinstanceid = w[hb].ufiinstanceid;\n                    ba[hb] = cb.id;\n                    w[cb.id] = w[hb];\n                    delete w[hb];\n                    l.didUpdateComment(hb);\n                }\n            ;\n                var kb, lb;\n                if (cb.parentcommentid) {\n                    lb = [ga(eb),];\n                }\n                 else lb = fa(eb);\n            ;\n                var mb = false;\n                lb.forEach(function(qb) {\n                    var rb = qb.getAllResources(), sb = {\n                    };\n                    for (var tb in rb) {\n                        var ub = rb[tb];\n                        sb[ub] = tb;\n                    };\n                    if (ib) {\n                        if ((hb in sb)) {\n                            sb[cb.id] = sb[hb];\n                            var vb = sb[hb];\n                            qb.setResource(vb, cb.id);\n                        }\n                    \n                    };\n                    if (sb[cb.id]) {\n                        mb = true;\n                    }\n                     else {\n                        var wb = (z[eb] || 0);\n                        sb[cb.id] = wb;\n                        qb.setResource(wb, cb.id);\n                    }\n                ;\n                    kb = sb[cb.id];\n                });\n                if (!mb) {\n                    var nb = (z[eb] || 0);\n                    z[eb] = (nb + 1);\n                    qa(eb);\n                }\n            ;\n                if ((cb.status === m.UFIStatus.FAILED_ADD)) {\n                    aa[eb] = (aa[eb] + 1);\n                };\n                var ob = z[eb];\n                jb.replycount = (((z[cb.id] || 0)) - ((aa[cb.id] || 0)));\n                var pb = ja(kb, ob);\n                if ((cb.parentcommentid && w[cb.parentcommentid])) {\n                    jb.permalink = p(fb.permalink).addQueryData({\n                        comment_id: w[cb.parentcommentid].legacyid,\n                        reply_comment_id: cb.legacyid,\n                        total_comments: ob\n                    }).toString();\n                }\n                 else jb.permalink = p(fb.permalink).addQueryData({\n                    comment_id: cb.legacyid,\n                    offset: pb,\n                    total_comments: ob\n                }).toString();\n            ;\n                za.setComment(cb.id, new h(jb));\n                l.didUpdateComment(cb.id);\n                l.didUpdateFeedback(db);\n            });\n        });\n    };\n    function ja(ab, bb) {\n        return (Math.floor(((((bb - ab) - 1)) / m.defaultPageSize)) * m.defaultPageSize);\n    };\n    function ka(ab) {\n        for (var bb = 0; (bb < ab.length); bb++) {\n            var cb = ab[bb];\n            switch (cb.actiontype) {\n              case m.UFIActionType.COMMENT_LIKE:\n                na(cb);\n                break;\n              case m.UFIActionType.DELETE_COMMENT:\n                ra(cb);\n                break;\n              case m.UFIActionType.LIVE_DELETE_COMMENT:\n                sa(cb);\n                break;\n              case m.UFIActionType.UNDO_DELETE_COMMENT:\n                ta(cb);\n                break;\n              case m.UFIActionType.REMOVE_PREVIEW:\n                ua(cb);\n                break;\n              case m.UFIActionType.COMMENT_SET_SPAM:\n                va(cb);\n                break;\n              case m.UFIActionType.CONFIRM_COMMENT_REMOVAL:\n                wa(cb);\n                break;\n              case m.UFIActionType.TRANSLATE_COMMENT:\n                oa(cb);\n                break;\n            };\n        };\n    };\n    function la(ab, bb, cb) {\n        var db = bb.range, eb = bb.values;\n        if (!db) {\n            v.error(\"nullrange\", {\n                target: ab,\n                commentList: bb\n            });\n            return;\n        }\n    ;\n        var fb = {\n        };\n        for (var gb = 0; (gb < db.length); gb++) {\n            fb[(db.offset + gb)] = (eb[gb] || ca);;\n        };\n        var hb, ib;\n        if (cb) {\n            hb = ea(ab, cb);\n            ib = ab;\n        }\n         else {\n            hb = ga(ab);\n            ib = bb.ftentidentifier;\n            if ((bb.count !== undefined)) {\n                z[ab] = bb.count;\n                aa[ab] = 0;\n            }\n        ;\n        }\n    ;\n        hb.addResourcesAndExecute(fb);\n        l.didUpdateFeedback(ib);\n    };\n    function ma(ab) {\n        ab.forEach(function(bb) {\n            z[bb.entidentifier] = bb.commentcount;\n            aa[bb.entidentifier] = 0;\n            l.didUpdateFeedback(bb.entidentifier);\n        });\n    };\n    function na(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (bb) {\n            var cb = {\n            }, db = (ab.clientid && g.isExistingClientID(ab.clientid));\n            if (!db) {\n                cb.hasviewerliked = ab.viewerliked;\n                cb.likecount = ab.likecount;\n            }\n        ;\n            cb.likeconfirmhash = s(0, 1024);\n            ya(ab.commentid, cb);\n        }\n    ;\n    };\n    function oa(ab) {\n        var bb = ab.commentid, cb = za.getComment(ab.commentid);\n        if (cb) {\n            ya(bb, {\n                translatedtext: ab.translatedtext\n            });\n        };\n    };\n    function pa(ab) {\n        var bb = {\n            reportLink: ab.reportLink,\n            commenterIsFOF: ab.commenterIsFOF,\n            userIsMinor: ab.userIsMinor\n        };\n        if (ab.undoData) {\n            bb.undoData = ab.undoData;\n        };\n        return bb;\n    };\n    function qa(ab, bb) {\n        if (ab) {\n            if ((bb !== undefined)) {\n                var cb = (((aa[ab] || 0)) + ((bb ? 1 : -1)));\n                aa[ab] = Math.max(cb, 0);\n            }\n        ;\n            var db = za.getComment(ab);\n            if (db) {\n                var eb = {\n                    replycount: za.getDisplayedCommentCount(ab)\n                };\n                ya(ab, eb);\n            }\n        ;\n        }\n    ;\n    };\n    function ra(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb.status !== m.UFIStatus.DELETED)) {\n            var cb = (bb.parentcommentid || bb.ftentidentifier);\n            if ((bb.status === m.UFIStatus.FAILED_ADD)) {\n                qa(cb);\n            }\n             else qa(cb, true);\n        ;\n        }\n    ;\n        xa(bb, m.UFIStatus.DELETED);\n    };\n    function sa(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb && (bb.status !== m.UFIStatus.DELETED))) {\n            xa(bb, m.UFIStatus.LIVE_DELETED);\n        };\n    };\n    function ta(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb.status === m.UFIStatus.DELETED)) {\n            var cb = (bb.parentcommentid || bb.ftentidentifier);\n            qa(cb, false);\n        }\n    ;\n        xa(bb, m.UFIStatus.PENDING_UNDO_DELETE);\n    };\n    function ua(ab) {\n        ya(ab.commentid, {\n            attachment: null\n        });\n    };\n    function va(ab) {\n        var bb = za.getComment(ab.commentid), cb = (ab.shouldHideAsSpam ? m.UFIStatus.SPAM_DISPLAY : null);\n        xa(bb, cb);\n    };\n    function wa(ab) {\n        ya(ab.commentid, pa(ab));\n    };\n    function xa(ab, bb) {\n        ya(ab.id, {\n            priorstatus: ab.status,\n            status: bb\n        });\n    };\n    function ya(ab, bb) {\n        var cb = (za.getComment(ab) || new h({\n        }));\n        za.setComment(ab, h.set(cb, bb));\n        l.didUpdateComment(cb.id);\n        l.didUpdateFeedback(cb.ftentidentifier);\n    };\n    var za = {\n        getComments: function(ab) {\n            var bb = {\n            };\n            for (var cb = 0; (cb < ab.length); cb++) {\n                bb[ab[cb]] = za.getComment(ab[cb]);;\n            };\n            return bb;\n        },\n        getComment: function(ab) {\n            return w[da(ab)];\n        },\n        setComment: function(ab, bb) {\n            w[da(ab)] = bb;\n        },\n        resetFeedbackTarget: function(ab) {\n            var bb = fa(ab), cb = {\n            };\n            bb.forEach(function(eb) {\n                var fb = eb.getAllResources();\n                for (var gb in fb) {\n                    var hb = fb[gb];\n                    cb[hb] = 1;\n                };\n            });\n            for (var db in cb) {\n                delete w[da(db)];;\n            };\n            ha(ab);\n        },\n        getCommentsInRange: function(ab, bb, cb, db, eb) {\n            var fb = ea(ab, cb);\n            n.getFeedbackTarget(ab, function(gb) {\n                var hb = [];\n                for (var ib = 0; (ib < bb.length); ib++) {\n                    hb.push((bb.offset + ib));;\n                };\n                var jb = function(pb) {\n                    var qb = [], rb = bb.offset, sb = ((bb.offset + bb.length) - 1);\n                    for (var tb = 0; (tb < bb.length); tb++) {\n                        var ub = (gb.isranked ? (sb - tb) : (rb + tb));\n                        if ((pb[ub] != ca)) {\n                            var vb = this.getComment(pb[ub]);\n                            if (vb) {\n                                qb.push(vb);\n                            };\n                        }\n                    ;\n                    };\n                    eb(qb);\n                }, kb = fb.getUnavailableResourcesFromRequest(hb);\n                if (kb.length) {\n                    var lb = Math.min.apply(Math, kb), mb = Math.max.apply(Math, kb), nb = lb, ob = ((mb - lb) + 1);\n                    k.trySend(\"/ajax/ufi/comment_fetch.php\", {\n                        ft_ent_identifier: gb.entidentifier,\n                        viewas: db,\n                        source: null,\n                        offset: nb,\n                        length: ob,\n                        orderingmode: cb\n                    });\n                }\n                 else fb.deferredExecuteOrEnqueue(hb).addCallback(jb, this);\n            ;\n            }.bind(this));\n        },\n        getRepliesInRanges: function(ab, bb, cb) {\n            var db = {\n            }, eb = {\n            }, fb = {\n            }, gb = false;\n            n.getFeedbackTarget(ab, function(hb) {\n                for (var ib in bb) {\n                    var jb = ga(ib), kb = bb[ib], lb = [];\n                    for (var mb = 0; (mb < kb.length); mb++) {\n                        lb.push((kb.offset + mb));;\n                    };\n                    db[ib] = jb.executeOrEnqueue(lb, function(wb) {\n                        var xb = [];\n                        for (var yb = 0; (yb < kb.length); yb++) {\n                            var zb = (kb.offset + yb);\n                            if ((wb[zb] != ca)) {\n                                var ac = this.getComment(wb[zb]);\n                                if (ac) {\n                                    xb.push(ac);\n                                };\n                            }\n                        ;\n                        };\n                        eb[ib] = xb;\n                    }.bind(this));\n                    fb[ib] = jb.getUnavailableResources(db[ib]);\n                    if (fb[ib].length) {\n                        gb = true;\n                        jb.unsubscribe(db[ib]);\n                    }\n                ;\n                };\n                if (!gb) {\n                    cb(eb);\n                }\n                 else {\n                    var nb = [], ob = [], pb = [];\n                    for (var qb in fb) {\n                        var rb = fb[qb];\n                        if (rb.length) {\n                            var sb = Math.min.apply(Math, rb), tb = Math.max.apply(Math, rb), ub = sb, vb = ((tb - sb) + 1);\n                            nb.push(qb);\n                            ob.push(ub);\n                            pb.push(vb);\n                        }\n                    ;\n                    };\n                    k.trySend(\"/ajax/ufi/reply_fetch.php\", {\n                        ft_ent_identifier: hb.entidentifier,\n                        parent_comment_ids: nb,\n                        source: null,\n                        offsets: ob,\n                        lengths: pb\n                    });\n                }\n            ;\n            }.bind(this));\n            return db;\n        },\n        getCommentCount: function(ab) {\n            return (z[ab] || 0);\n        },\n        getDeletedCount: function(ab) {\n            return (aa[ab] || 0);\n        },\n        getDisplayedCommentCount: function(ab) {\n            return (((z[ab] || 0)) - ((aa[ab] || 0)));\n        },\n        _dump: function() {\n            var ab = {\n                _comments: w,\n                _commentLists: x,\n                _replyLists: y,\n                _commentCounts: z,\n                _deletedCounts: aa,\n                _localIDMap: ba\n            };\n            return JSON.stringify(ab);\n        }\n    };\n    k.registerEndpoints({\n        \"/ajax/ufi/comment_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/reply_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        }\n    });\n    l.subscribe(\"update-comments\", function(ab, bb) {\n        if ((bb.comments && bb.comments.length)) {\n            ia(bb.comments, bb.payloadsource);\n        };\n    });\n    l.subscribe(\"update-actions\", function(ab, bb) {\n        if ((bb.actions && bb.actions.length)) {\n            ka(bb.actions);\n        };\n    });\n    l.subscribe(\"update-comment-lists\", function(ab, bb) {\n        var cb = bb.commentlists;\n        if ((cb && Object.keys(cb).length)) {\n            if (cb.comments) {\n                for (var db in cb.comments) {\n                    for (var eb in cb.comments[db]) {\n                        la(db, cb.comments[db][eb], eb);;\n                    };\n                }\n            };\n            if (cb.replies) {\n                for (var fb in cb.replies) {\n                    la(fb, cb.replies[fb]);;\n                }\n            };\n        }\n    ;\n    });\n    l.subscribe(\"update-feedback\", function(ab, bb) {\n        var cb = bb.feedbacktargets;\n        if ((cb && cb.length)) {\n            ma(cb);\n        };\n    });\n    e.exports = za;\n});\n__d(\"UFILikeLink.react\", [\"React\",\"TrackingNodes\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"tx\"), j = g.createClass({\n        displayName: \"UFILikeLink\",\n        render: function() {\n            var k = (this.props.likeAction ? \"Like\" : \"Unlike\"), l = h.getTrackingInfo((this.props.likeAction ? h.types.LIKE_LINK : h.types.UNLIKE_LINK)), m = (this.props.likeAction ? \"Like this\" : \"Unlike this\");\n            return (g.DOM.a({\n                className: \"UFILikeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: m,\n                onClick: this.props.onClick,\n                \"data-ft\": l\n            }, k));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFISubscribeLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFISubscribeLink\",\n        render: function() {\n            var j = (this.props.subscribeAction ? \"Follow Post\" : \"Unfollow Post\"), k = (this.props.subscribeAction ? \"Get notified when someone comments\" : \"Stop getting notified when someone comments\");\n            return (g.DOM.a({\n                className: \"UFISubscribeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: k,\n                onClick: this.props.onClick\n            }, j));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ProfileBrowserLink\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = \"/ajax/browser/dialog/\", i = \"/browse/\", j = function(l, m, n) {\n        return new g((l + m)).setQueryData(n);\n    }, k = {\n        constructPageURI: function(l, m) {\n            return j(i, l, m);\n        },\n        constructDialogURI: function(l, m) {\n            return j(h, l, m);\n        }\n    };\n    e.exports = k;\n});\n__d(\"ProfileBrowserTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LIKES: \"likes\",\n        GROUP_MESSAGE_VIEWERS: \"group_message_viewers\",\n        MUTUAL_FRIENDS: \"mutual_friends\"\n    };\n    e.exports = g;\n});\n__d(\"UFITimelineBlingBox.react\", [\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIBlingItem.react\",\"URI\",\"cx\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"ProfileBrowserLink\"), h = b(\"ProfileBrowserTypes\"), i = b(\"React\"), j = b(\"UFIBlingItem.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"fbt\"), n = i.createClass({\n        displayName: \"UFITimelineBlingBox\",\n        render: function() {\n            var o = [];\n            if ((this.props.likes && this.props.enableShowLikes)) {\n                var p = this._getProfileBrowserURI(), q = \"See who likes this\", r = i.DOM.a({\n                    ajaxify: p.dialog,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-gt\": this.props[\"data-gt\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    \"data-tooltip-uri\": this._getLikeToolTipURI(),\n                    href: p.page,\n                    rel: \"dialog\",\n                    role: \"button\",\n                    title: q\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.likes,\n                    iconClassName: \"UFIBlingBoxTimelineLikeIcon\"\n                }));\n                o.push(r);\n            }\n        ;\n            if ((this.props.comments && this.props.enableShowComments)) {\n                var s = \"Show comments\", t = i.DOM.a({\n                    \"aria-label\": s,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: \"#\",\n                    onClick: this.props.commentOnClick\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.comments,\n                    iconClassName: \"UFIBlingBoxTimelineCommentIcon\"\n                }));\n                o.push(t);\n            }\n        ;\n            if (this.props.reshares) {\n                var u = \"Show shares\", v = this._getShareViewURI(), w = i.DOM.a({\n                    ajaxify: v.dialog,\n                    \"aria-label\": u,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: v.page,\n                    rel: \"async\"\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.reshares,\n                    iconClassName: \"UFIBlingBoxTimelineReshareIcon\"\n                }));\n                o.push(w);\n            }\n        ;\n            return (i.DOM.span(null, o));\n        },\n        _getItemClassName: function(o) {\n            return (((((o.length > 0) ? \"mls\" : \"\")) + ((\" \" + \"UFIBlingBoxTimelineItem\"))));\n        },\n        _getLikeToolTipURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/timeline/likestooltip.php\").setQueryData({\n                    obj_fbid: this.props.feedbackFBID\n                });\n                return o.toString();\n            }\n             else return null\n        ;\n        },\n        _getProfileBrowserURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = h.LIKES, p = {\n                    id: this.props.feedbackFBID\n                }, q = g.constructDialogURI(o, p), r = g.constructPageURI(o, p), s = {\n                    dialog: q.toString(),\n                    page: r.toString()\n                };\n                return s;\n            }\n        ;\n        },\n        _getShareViewURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/shares/view\").setQueryData({\n                    target_fbid: this.props.feedbackFBID\n                }), p = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: this.props.feedbackFBID\n                }), q = {\n                    dialog: o.toString(),\n                    page: p.toString()\n                };\n                return q;\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"UFIUserActions\", [\"AsyncResponse\",\"CLoggerX\",\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"Nectar\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"MercuryServerDispatcher\",\"collectDataAttributes\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncResponse\"), h = b(\"CLoggerX\"), i = b(\"ClientIDs\"), j = b(\"ImmutableObject\"), k = b(\"JSLogger\"), l = b(\"Nectar\"), m = b(\"UFICentralUpdates\"), n = b(\"UFIComments\"), o = b(\"UFIConstants\"), p = b(\"UFIFeedbackTargets\"), q = b(\"MercuryServerDispatcher\"), r = b(\"collectDataAttributes\"), s = b(\"copyProperties\"), t = b(\"tx\"), u = k.create(\"UFIUserActions\"), v = {\n        BAN: \"ban\",\n        UNDO_BAN: \"undo_ban\"\n    }, w = {\n        changeCommentLike: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if ((na.hasviewerliked != la)) {\n                var oa = x(ma.target), pa = (la ? 1 : -1), qa = {\n                    commentid: ka,\n                    actiontype: o.UFIActionType.COMMENT_LIKE,\n                    viewerliked: la,\n                    likecount: (na.likecount + pa)\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [qa,]\n                });\n                q.trySend(\"/ajax/ufi/comment_like.php\", s({\n                    comment_id: ka,\n                    legacy_id: na.legacyid,\n                    like_action: la,\n                    ft_ent_identifier: na.ftentidentifier,\n                    source: ma.source,\n                    client_id: i.getNewClientID()\n                }, oa));\n            }\n        ;\n        },\n        addComment: function(ka, la, ma, na) {\n            p.getFeedbackTarget(ka, function(oa) {\n                var pa = x(na.target), qa = i.getNewClientID();\n                if (!oa.actorforpost) {\n                    return\n                };\n                var ra = {\n                    ftentidentifier: ka,\n                    body: {\n                        text: la\n                    },\n                    author: oa.actorforpost,\n                    id: qa,\n                    islocal: true,\n                    ufiinstanceid: na.ufiinstanceid,\n                    likecount: 0,\n                    hasviewerliked: false,\n                    parentcommentid: na.replyid,\n                    photo_comment: na.attachedphoto,\n                    timestamp: {\n                        time: Date.now(),\n                        text: \"a few seconds ago\"\n                    }\n                }, sa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: oa.actorforpost,\n                    hasviewersubscribed: true,\n                    entidentifier: ka\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    comments: [ra,],\n                    actions: [sa,]\n                });\n                var ta = null;\n                if (na.replyid) {\n                    ta = (n.getComment(na.replyid)).fbid;\n                };\n                var ua = h.getCLParamsForTarget(na.target, ta);\n                q.trySend(\"/ajax/ufi/add_comment.php\", s({\n                    ft_ent_identifier: oa.entidentifier,\n                    comment_text: ma,\n                    source: na.source,\n                    client_id: qa,\n                    reply_fbid: ta,\n                    parent_comment_id: na.replyid,\n                    timeline_log_data: na.timelinelogdata,\n                    rootid: na.rootid,\n                    clp: ua,\n                    attached_photo_fbid: (na.attachedphoto ? na.attachedphoto.fbid : 0),\n                    giftoccasion: na.giftoccasion\n                }, pa));\n            });\n        },\n        editComment: function(ka, la, ma, na) {\n            var oa = x(na.target), pa = n.getComment(ka);\n            pa = j.set(pa, {\n                status: o.UFIStatus.PENDING_EDIT,\n                body: {\n                    text: la\n                },\n                timestamp: {\n                    time: Date.now(),\n                    text: \"a few seconds ago\"\n                },\n                originalTimestamp: pa.timestamp.time,\n                editnux: null,\n                attachment: null\n            });\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                comments: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/edit_comment.php\", s({\n                ft_ent_identifier: pa.ftentidentifier,\n                comment_text: ma,\n                source: na.source,\n                comment_id: pa.id,\n                parent_comment_id: pa.parentcommentid,\n                attached_photo_fbid: (na.attachedPhoto ? na.attachedPhoto.fbid : 0)\n            }, oa));\n        },\n        translateComment: function(ka, la) {\n            q.trySend(\"/ajax/ufi/translate_comment.php\", {\n                ft_ent_identifier: ka.ftentidentifier,\n                comment_ids: [ka.id,],\n                source: la.source\n            });\n        },\n        setHideAsSpam: function(ka, la, ma) {\n            var na = x(ma.target), oa = n.getComment(ka), pa = {\n                commentid: ka,\n                actiontype: o.UFIActionType.COMMENT_SET_SPAM,\n                shouldHideAsSpam: la\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/comment_spam.php\", s({\n                comment_id: ka,\n                spam_action: la,\n                ft_ent_identifier: oa.ftentidentifier,\n                source: ma.source\n            }, na));\n        },\n        removeComment: function(ka, la) {\n            var ma = x(la.target), na = n.getComment(ka), oa = {\n                actiontype: o.UFIActionType.DELETE_COMMENT,\n                commentid: ka,\n                oneclick: la.oneclick\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [oa,]\n            });\n            q.trySend(\"/ajax/ufi/delete_comment.php\", s({\n                comment_id: na.id,\n                comment_legacyid: na.legacyid,\n                ft_ent_identifier: na.ftentidentifier,\n                one_click: la.oneclick,\n                source: la.source,\n                client_id: i.getNewClientID(),\n                timeline_log_data: la.timelinelogdata\n            }, ma));\n        },\n        undoRemoveComment: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (!na.undoData) {\n                u.error(\"noundodata\", {\n                    comment: ka\n                });\n                return;\n            }\n        ;\n            var oa = x(ma.target), pa = {\n                actiontype: o.UFIActionType.UNDO_DELETE_COMMENT,\n                commentid: ka\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            var qa = na.undoData;\n            qa.page_admin = la;\n            var ra = s(oa, qa);\n            q.trySend(\"/ajax/ufi/undo_delete_comment.php\", ra);\n        },\n        banUser: function(ka, la, ma, na) {\n            var oa = (ma ? v.BAN : v.UNDO_BAN);\n            q.trySend(\"/ajax/ufi/ban_user.php\", {\n                page_id: la,\n                commenter_id: ka.author,\n                action: oa,\n                comment_id: ka.id,\n                client_side: true\n            });\n        },\n        changeLike: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if ((na.hasviewerliked !== la)) {\n                    var pa = (la ? 1 : -1), qa = {\n                        actiontype: o.UFIActionType.LIKE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewerliked: la,\n                        likecount: (na.likecount + pa),\n                        entidentifier: ka,\n                        likesentences: {\n                            current: na.likesentences.alternate,\n                            alternate: na.likesentences.current\n                        }\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [qa,]\n                    });\n                    q.trySend(\"/ajax/ufi/like.php\", s({\n                        like_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        giftoccasion: ma.giftoccasion\n                    }, oa));\n                }\n            ;\n            });\n        },\n        changeSubscribe: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if ((na.hasviewersubscribed !== la)) {\n                    var pa = {\n                        actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewersubscribed: la,\n                        entidentifier: ka\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [pa,]\n                    });\n                    q.trySend(\"/ajax/ufi/subscribe.php\", s({\n                        subscribe_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        comment_expand_mode: ma.commentexpandmode\n                    }, oa));\n                }\n            ;\n            });\n        },\n        fetchSpamComments: function(ka, la, ma, na) {\n            q.trySend(\"/ajax/ufi/id_comment_fetch.php\", {\n                ft_ent_identifier: ka,\n                viewas: na,\n                comment_ids: la,\n                parent_comment_id: ma,\n                source: null\n            });\n        },\n        removePreview: function(ka, la) {\n            var ma = x(la.target), na = {\n                commentid: ka.id,\n                actiontype: o.UFIActionType.REMOVE_PREVIEW\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [na,]\n            });\n            q.trySend(\"/ajax/ufi/remove_preview.php\", s({\n                comment_id: ka.id,\n                ft_ent_identifier: ka.ftentidentifier,\n                source: la.source\n            }, ma));\n        }\n    };\n    function x(ka) {\n        if (!ka) {\n            return {\n                ft: {\n                }\n            }\n        };\n        var la = {\n            ft: r(ka, [\"ft\",]).ft\n        };\n        l.addModuleData(la, ka);\n        return la;\n    };\n    function y(ka) {\n        var la = ka.request.data;\n        g.defaultErrorHandler(ka);\n        var ma = (la.client_id || la.comment_id), na = n.getComment(ma), oa = (((na.status === o.UFIStatus.PENDING_EDIT)) ? o.UFIStatus.FAILED_EDIT : o.UFIStatus.FAILED_ADD);\n        na = j.setDeep(na, {\n            status: oa,\n            allowRetry: z(ka),\n            body: {\n                mentionstext: la.comment_text\n            }\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n    function z(ka) {\n        var la = ka.getError();\n        if ((la === 1404102)) {\n            return false\n        };\n        if (ka.silentError) {\n            return true\n        };\n        if (((la === 1357012) || (la === 1357006))) {\n            return false\n        };\n        return true;\n    };\n    function aa(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        na = j.set(na, {\n            status: (na.priorstatus || null),\n            priorstatus: undefined\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n    function ba(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        if ((la.like_action === na.hasviewerliked)) {\n            var oa = (na.hasviewerliked ? -1 : 1), pa = {\n                commentid: ma,\n                actiontype: o.UFIActionType.COMMENT_LIKE,\n                viewerliked: !na.hasviewerliked,\n                likecount: (na.likecount + oa)\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n        }\n    ;\n        g.defaultErrorHandler(ka);\n    };\n    function ca(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if ((na.hasviewerliked === la.like_action)) {\n                var oa = (na.hasviewerliked ? -1 : 1), pa = {\n                    actiontype: o.UFIActionType.LIKE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewerliked: !na.hasviewerliked,\n                    likecount: (na.likecount + oa),\n                    entidentifier: ma,\n                    likesentences: {\n                        current: na.likesentences.alternate,\n                        alternate: na.likesentences.current\n                    }\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [pa,]\n                });\n            }\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n    function da(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if ((na.hasviewersubscribed === la.subscribe_action)) {\n                var oa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewersubscribed: !na.hasviewersubscribed,\n                    entidentifier: ma\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [oa,]\n                });\n            }\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n    var ea = function(ka) {\n        return m.handleUpdate.bind(m, ka);\n    }, fa = o.UFIPayloadSourceType;\n    q.registerEndpoints({\n        \"/ajax/ufi/comment_like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_COMMENT_LIKE),\n            error_handler: ba,\n            batch_if: ga,\n            batch_function: ja\n        },\n        \"/ajax/ufi/comment_spam.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_COMMENT_SPAM),\n            error_handler: aa\n        },\n        \"/ajax/ufi/add_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ADD_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/undo_delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_UNDO_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/ban_user.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_BAN)\n        },\n        \"/ajax/ufi/edit_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_EDIT_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_LIKE),\n            error_handler: ca,\n            batch_if: ha,\n            batch_function: ja\n        },\n        \"/ajax/ufi/subscribe.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_SUBSCRIBE),\n            error_handler: da,\n            batch_if: ia,\n            batch_function: ja\n        },\n        \"/ajax/ufi/id_comment_fetch.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ID_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/remove_preview.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_REMOVE_PREVIEW)\n        },\n        \"/ajax/ufi/translate_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_TRANSLATE_COMMENT)\n        }\n    });\n    function ga(ka, la) {\n        return ((ka && (ka.ft_ent_identifier == la.ft_ent_identifier)) && (ka.comment_id == la.comment_id));\n    };\n    function ha(ka, la) {\n        return (ka && (ka.ft_ent_identifier == la.ft_ent_identifier));\n    };\n    function ia(ka, la) {\n        return (ka && (ka.ft_ent_identifier == la.ft_ent_identifier));\n    };\n    function ja(ka, la) {\n        return la;\n    };\n    e.exports = w;\n});\n__d(\"UFIActionLinkController\", [\"Arbiter\",\"ClickTTIIdentifiers\",\"CSS\",\"DOMQuery\",\"Parent\",\"React\",\"TrackingNodes\",\"UFIBlingBox.react\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFILikeLink.react\",\"UFISubscribeLink.react\",\"UFITimelineBlingBox.react\",\"UFIUserActions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickTTIIdentifiers\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"Parent\"), l = b(\"React\"), m = b(\"TrackingNodes\"), n = b(\"UFIBlingBox.react\"), o = b(\"UFICentralUpdates\"), p = b(\"UFIComments\"), q = b(\"UFIConstants\"), r = b(\"UFIFeedbackTargets\"), s = b(\"UFILikeLink.react\"), t = b(\"UFISubscribeLink.react\"), u = b(\"UFITimelineBlingBox.react\"), v = b(\"UFIUserActions\"), w = b(\"copyProperties\");\n    function x(z, aa, ba) {\n        if (this._root) {\n            throw new Error((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\"))\n        };\n        var ca = j.scry(z, aa)[0];\n        if (ca) {\n            var da = document.createElement(\"span\");\n            ca.parentNode.replaceChild(da, ca);\n            da.appendChild(ca);\n            if ((typeof ba === \"function\")) {\n                ba(da);\n            };\n        }\n         else var ea = g.subscribe(\"PhotoSnowlift.DATA_CHANGE\", function() {\n            g.unsubscribe(ea);\n            x(z, aa, ba);\n        }, g.SUBSCRIBE_NEW)\n    ;\n    };\n    var y = function(z, aa, ba) {\n        this._id = aa.ftentidentifier;\n        this._ftFBID = ba.targetfbid;\n        this._source = aa.source;\n        this._contextArgs = aa;\n        this._ufiRoot = z;\n        if (this._isSourceProfile(this._contextArgs.source)) {\n            this._attemptInitializeTimelineBling();\n        }\n         else this._attemptInitializeBling();\n    ;\n        if (ba.viewercanlike) {\n            this._attemptInitializeLike();\n        };\n        if (ba.viewercansubscribetopost) {\n            this._attemptInitializeSubscribe();\n        };\n        o.subscribe(\"feedback-updated\", function(ca, da) {\n            var ea = da.updates;\n            if ((this._id in ea)) {\n                this.render();\n            };\n        }.bind(this));\n        o.subscribe(\"feedback-id-changed\", function(ca, da) {\n            var ea = da.updates;\n            if ((this._id in ea)) {\n                this._id = ea[this._id];\n            };\n        }.bind(this));\n    };\n    w(y.prototype, {\n        _attemptInitializeBling: function() {\n            x(this._ufiRoot, \"^form .uiBlingBox\", function(z) {\n                this._blingRoot = z;\n                if (this._dataReady) {\n                    this._renderBling();\n                };\n            }.bind(this));\n        },\n        _attemptInitializeTimelineBling: function() {\n            if (this._root) {\n                throw new Error((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\"))\n            };\n            var z = j.scry(this._ufiRoot, \"^form .fbTimelineFeedbackActions span\")[0];\n            if (z) {\n                i.addClass(z, \"UFIBlingBoxTimeline\");\n                var aa = j.scry(z, \".fbTimelineFeedbackLikes\")[0];\n                this._enableShowLikes = (aa ? true : false);\n                var ba = j.scry(z, \".fbTimelineFeedbackComments\")[0];\n                this._enableShowComments = (ba ? true : false);\n            }\n        ;\n            this._blingTimelineRoot = z;\n            if (this._dataReady) {\n                this._renderTimelineBling();\n            };\n        },\n        _attemptInitializeLike: function() {\n            x(this._ufiRoot, \"^form .like_link\", function(z) {\n                this._likeRoot = z;\n                if (this._dataReady) {\n                    this._renderLike();\n                };\n            }.bind(this));\n        },\n        _attemptInitializeSubscribe: function() {\n            x(this._ufiRoot, \"^form .unsub_link\", function(z) {\n                this._subscribeRoot = z;\n                if (this._dataReady) {\n                    this._renderSubscribe();\n                };\n            }.bind(this));\n        },\n        render: function() {\n            this._dataReady = true;\n            if (this._isSourceProfile(this._contextArgs.source)) {\n                this._renderTimelineBling();\n            }\n             else this._renderBling();\n        ;\n            this._renderLike();\n            this._renderSubscribe();\n        },\n        _renderBling: function() {\n            if (this._blingRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = function(event) {\n                        var da = k.byTag(event.target, \"form\");\n                        i.toggleClass(da, \"collapsed_comments\");\n                        i.toggleClass(da, \"hidden_add_comment\");\n                        event.preventDefault();\n                    }.bind(this), ba = m.getTrackingInfo(m.types.BLINGBOX), ca = n({\n                        likes: z.likecount,\n                        comments: p.getDisplayedCommentCount(this._id),\n                        reshares: z.sharecount,\n                        permalink: z.permalink,\n                        contextArgs: this._contextArgs,\n                        onClick: aa,\n                        \"data-ft\": ba\n                    });\n                    this._blingBox = l.renderComponent(ca, this._blingRoot);\n                }.bind(this));\n            };\n        },\n        _renderTimelineBling: function() {\n            if (this._blingTimelineRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = m.getTrackingInfo(m.types.BLINGBOX), ba = h.getUserActionID(h.types.TIMELINE_SEE_LIKERS), ca = function(event) {\n                        var ea = k.byTag(event.target, \"form\");\n                        i.removeClass(ea, \"collapsed_comments\");\n                        var fa = j.scry(ea, \"a.UFIPagerLink\");\n                        if (fa.length) {\n                            fa[0].click();\n                        };\n                        event.preventDefault();\n                    }.bind(this), da = u({\n                        comments: p.getDisplayedCommentCount(this._id),\n                        commentOnClick: ca,\n                        contextArgs: this._contextArgs,\n                        \"data-ft\": aa,\n                        \"data-gt\": ba,\n                        enableShowComments: this._enableShowComments,\n                        enableShowLikes: this._enableShowLikes,\n                        feedbackFBID: this._ftFBID,\n                        likes: z.likecount,\n                        reshares: z.sharecount\n                    });\n                    l.renderComponent(da, this._blingTimelineRoot);\n                }.bind(this));\n            };\n        },\n        _renderLike: function() {\n            if (this._likeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewerliked, ba = function(event) {\n                        v.changeLike(this._id, aa, {\n                            source: this._source,\n                            target: event.target,\n                            rootid: this._contextArgs.rootid,\n                            giftoccasion: this._contextArgs.giftoccasion\n                        });\n                        event.preventDefault();\n                    }.bind(this), ca = s({\n                        onClick: ba,\n                        likeAction: aa\n                    });\n                    this._likeLink = l.renderComponent(ca, this._likeRoot);\n                }.bind(this));\n            };\n        },\n        _renderSubscribe: function() {\n            if (this._subscribeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewersubscribed, ba = function(event) {\n                        v.changeSubscribe(this._id, aa, {\n                            source: this._source,\n                            target: event.target,\n                            rootid: this._contextArgs.rootid,\n                            commentexpandmode: z.commentexpandmode\n                        });\n                        event.preventDefault();\n                    }.bind(this), ca = t({\n                        onClick: ba,\n                        subscribeAction: aa\n                    });\n                    this._subscribeLink = l.renderComponent(ca, this._subscribeRoot);\n                }.bind(this));\n            };\n        },\n        _isSourceProfile: function(z) {\n            return (z === q.UFIFeedbackSourceType.PROFILE);\n        }\n    });\n    e.exports = y;\n});\n__d(\"MentionsInputUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        generateDataFromTextWithEntities: function(h) {\n            var i = h.text, j = [];\n            ((h.ranges || [])).forEach(function(l) {\n                var m = l.entities[0];\n                if (!m.external) {\n                    j.push({\n                        uid: m.id,\n                        text: i.substr(l.offset, l.length),\n                        offset: l.offset,\n                        length: l.length,\n                        weakreference: !!m.weakreference\n                    });\n                };\n            });\n            var k = {\n                value: i,\n                mentions: j\n            };\n            return k;\n        }\n    };\n    e.exports = g;\n});\n__d(\"ClipboardPhotoUploader\", [\"ArbiterMixin\",\"AsyncRequest\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.uploadURIString = k;\n        this.data = l;\n    };\n    i(j.prototype, g, {\n        handlePaste: function(event) {\n            if (!event.clipboardData) {\n                return\n            };\n            var k = event.clipboardData.items;\n            if (!k) {\n                return\n            };\n            for (var l = 0; (l < k.length); ++l) {\n                var m = k[l];\n                if (((m.kind === \"file\") && (m.type.indexOf(\"image/\") !== -1))) {\n                    var n = new FormData();\n                    n.append(\"pasted_file\", m.getAsFile());\n                    var o = new h();\n                    o.setURI(this.uploadURIString).setData(this.data).setRawData(n).setHandler(function(p) {\n                        this.inform(\"upload_success\", p);\n                    }.bind(this)).setErrorHandler(function(p) {\n                        this.inform(\"upload_error\", p);\n                    }.bind(this));\n                    this.inform(\"upload_start\");\n                    o.send();\n                    break;\n                }\n            ;\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"CloseButton.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"CloseButton\",\n        render: function() {\n            var j = this.props, k = (j.size || \"medium\"), l = (j.appearance || \"normal\"), m = (k === \"small\"), n = (k === \"huge\"), o = (l === \"dark\"), p = (l === \"inverted\"), q = ((((((((\"uiCloseButton\") + ((m ? (\" \" + \"uiCloseButtonSmall\") : \"\"))) + ((n ? (\" \" + \"uiCloseButtonHuge\") : \"\"))) + (((m && o) ? (\" \" + \"uiCloseButtonSmallDark\") : \"\"))) + (((m && p) ? (\" \" + \"uiCloseButtonSmallInverted\") : \"\"))) + (((!m && o) ? (\" \" + \"uiCloseButtonDark\") : \"\"))) + (((!m && p) ? (\" \" + \"uiCloseButtonInverted\") : \"\"))));\n            return this.transferPropsTo(g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                \"aria-label\": j.tooltip,\n                \"data-hover\": (j.tooltip && \"tooltip\"),\n                \"data-tooltip-alignh\": (j.tooltip && \"center\"),\n                className: q\n            }));\n        }\n    });\n    e.exports = i;\n});\n__d(\"LoadingIndicator.react\", [\"React\",\"joinClasses\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"joinClasses\"), i = b(\"keyMirror\"), j = b(\"merge\"), k = i({\n        white: true,\n        blue: true,\n        black: true\n    }), l = i({\n        small: true,\n        medium: true,\n        large: true\n    }), m = {\n        white: {\n            large: \"/images/loaders/indicator_blue_large.gif\",\n            medium: \"/images/loaders/indicator_blue_medium.gif\",\n            small: \"/images/loaders/indicator_blue_small.gif\"\n        },\n        blue: {\n            large: \"/images/loaders/indicator_white_large.gif\",\n            small: \"/images/loaders/indicator_white_small.gif\"\n        },\n        black: {\n            large: \"/images/loaders/indicator_black.gif\"\n        }\n    }, n = g.createClass({\n        displayName: \"LoadingIndicator\",\n        render: function() {\n            var o = this.props.color, p = this.props.size;\n            if (!m[o]) {\n                return g.DOM.span(null)\n            };\n            if (!m[o][p]) {\n                return g.DOM.span(null)\n            };\n            var q = ((this.props.showonasync ? \"uiLoadingIndicatorAsync\" : \"\"));\n            if (this.props.className) {\n                q = h(this.props.className, q);\n            };\n            var r = m[o][p], s = g.DOM.img({\n                src: r,\n                className: q\n            });\n            s.props = j(this.props, s.props);\n            return s;\n        }\n    });\n    n.SIZES = l;\n    n.COLORS = k;\n    e.exports = n;\n});\n__d(\"LegacyMentionsInput.react\", [\"PlaceholderListener\",\"Bootloader\",\"Event\",\"Keys\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"PlaceholderListener\");\n    var g = b(\"Bootloader\"), h = b(\"Event\"), i = b(\"Keys\"), j = b(\"React\"), k = b(\"cx\"), l = j.createClass({\n        displayName: \"ReactLegacyMentionsInput\",\n        componentDidMount: function(m) {\n            (this.props.initialData && this._initializeTextarea(m));\n        },\n        hasEnteredText: function() {\n            return !!((this._mentionsInput && this._mentionsInput.getValue().trim()));\n        },\n        _handleKeydown: function(event) {\n            var m = event.nativeEvent, n = this.props.onEnterSubmit, o = ((h.getKeyCode(m) == i.RETURN) && !h.$E(m).getModifiers().any), p = (this._mentionsInput && this._mentionsInput.getTypeahead().getView().getSelection());\n            if (((n && o) && !p)) {\n                if (this.props.isLoadingPhoto) {\n                    return false\n                };\n                var q = event.target, r = (q.value && q.value.trim());\n                if ((r || this.props.acceptEmptyInput)) {\n                    var s = {\n                        visibleValue: r,\n                        encodedValue: r,\n                        attachedPhoto: null\n                    };\n                    if (this._mentionsInput) {\n                        s.encodedValue = this._mentionsInput.getRawValue().trim();\n                        this._mentionsInput.reset();\n                    }\n                ;\n                    n(s, event);\n                }\n            ;\n                event.preventDefault();\n            }\n        ;\n        },\n        _handleFocus: function() {\n            (this.props.onFocus && this.props.onFocus());\n            this._initializeTextarea(this.refs.root.getDOMNode());\n        },\n        _handleBlur: function() {\n            (this.props.onBlur && this.props.onBlur());\n        },\n        _initializeTextarea: function(m) {\n            if ((this._mentionsInput || this._bootloadingMentions)) {\n                return\n            };\n            this._bootloadingMentions = true;\n            g.loadModules([\"CompactTypeaheadRenderer\",\"ContextualTypeaheadView\",\"InputSelection\",\"MentionsInput\",\"TextAreaControl\",\"Typeahead\",\"TypeaheadAreaCore\",\"TypeaheadBestName\",\"TypeaheadHoistFriends\",\"TypeaheadMetrics\",\"TypingDetector\",], function(n, o, p, q, r, s, t, u, v, w, x) {\n                var y = this.refs.textarea.getDOMNode();\n                new r(y);\n                if (this.props.onTypingStateChange) {\n                    var z = new x(y);\n                    z.init();\n                    z.subscribe(\"change\", this.props.onTypingStateChange);\n                }\n            ;\n                var aa = {\n                    autoSelect: true,\n                    renderer: n,\n                    causalElement: y\n                };\n                if (this.props.viewOptionsTypeObjects) {\n                    aa.typeObjects = this.props.viewOptionsTypeObjects;\n                };\n                if (this.props.viewOptionsTypeObjectsOrder) {\n                    aa.typeObjectsOrder = this.props.viewOptionsTypeObjectsOrder;\n                };\n                var ba = new s(this.props.datasource, {\n                    ctor: o,\n                    options: aa\n                }, {\n                    ctor: t\n                }, this.refs.typeahead.getDOMNode()), ca = [u,v,], da = new w({\n                    extraData: {\n                        event_name: \"mentions\"\n                    }\n                });\n                s.initNow(ba, ca, da);\n                this._mentionsInput = new q(m, ba, y, {\n                    hashtags: this.props.sht\n                });\n                this._mentionsInput.init({\n                    max: 6\n                }, this.props.initialData);\n                if (this.props.initialData) {\n                    p.set(y, y.value.length);\n                };\n                if (this.props.onPaste) {\n                    h.listen(y, \"paste\", this.props.onPaste);\n                };\n                this._bootloadingMentions = false;\n            }.bind(this));\n        },\n        focus: function() {\n            try {\n                this.refs.textarea.getDOMNode().focus();\n            } catch (m) {\n            \n            };\n        },\n        render: function() {\n            var m = (((((((\"textInput\") + ((\" \" + \"mentionsTextarea\"))) + ((\" \" + \"uiTextareaAutogrow\"))) + ((\" \" + \"uiTextareaNoResize\"))) + ((\" \" + \"UFIAddCommentInput\"))) + ((\" \" + \"DOMControl_placeholder\"))));\n            return (j.DOM.div({\n                ref: \"root\",\n                className: \"uiMentionsInput textBoxContainer ReactLegacyMentionsInput\"\n            }, j.DOM.div({\n                className: \"highlighter\"\n            }, j.DOM.div(null, j.DOM.span({\n                className: \"highlighterContent hidden_elem\"\n            }))), j.DOM.div({\n                ref: \"typeahead\",\n                className: \"uiTypeahead mentionsTypeahead\"\n            }, j.DOM.div({\n                className: \"wrap\"\n            }, j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"hiddenInput\"\n            }), j.DOM.div({\n                className: \"innerWrap\"\n            }, j.DOM.textarea({\n                ref: \"textarea\",\n                name: \"add_comment_text\",\n                className: m,\n                title: this.props.placeholder,\n                placeholder: this.props.placeholder,\n                onFocus: this._handleFocus,\n                onBlur: this._handleBlur,\n                onKeyDown: this._handleKeydown,\n                defaultValue: this.props.placeholder\n            })))), j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"mentionsHidden\",\n                defaultValue: \"\"\n            })));\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIClassNames\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        ACTOR_IMAGE: \"img UFIActorImage -cx-PRIVATE-uiSquareImage__size32\",\n        ROW: \"UFIRow\",\n        UNSEEN_ITEM: \"UFIUnseenItem\"\n    };\n});\n__d(\"LeftRight.react\", [\"React\",\"cx\",\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = b(\"keyMirror\"), j = b(\"throwIf\"), k = i({\n        left: true,\n        right: true,\n        both: true\n    });\n    function l(n) {\n        j(((!n.children || (n.children.length < 1)) || (n.children.length > 2)), \"LeftRight component must have one or two children.\");\n    };\n    var m = g.createClass({\n        displayName: \"LeftRight\",\n        render: function() {\n            l(this.props);\n            var n = (this.props.direction || k.both), o = ((n === k.both)), p = g.DOM.div({\n                key: \"left\",\n                className: (((o || (n === k.left)) ? \"lfloat\" : \"\"))\n            }, this.props.children[0]), q = (((this.props.children.length < 2)) ? null : g.DOM.div({\n                key: \"right\",\n                className: (((o || (n === k.right)) ? \"rfloat\" : \"\"))\n            }, this.props.children[1])), r = ((((n === k.right) && q)) ? [q,p,] : [p,q,]);\n            return this.transferPropsTo(g.DOM.div({\n                className: \"clearfix\"\n            }, r));\n        }\n    });\n    m.DIRECTION = k;\n    e.exports = m;\n});\n__d(\"ImageBlock.react\", [\"LeftRight.react\",\"React\",\"cx\",\"joinClasses\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"throwIf\");\n    function l(p) {\n        k(((!p.children || (p.children.length > 3)) || (p.children.length < 1)), \"ImageBlock requires two or three children.\");\n    };\n    function m(p) {\n        return ((((((\"img\") + ((\" \" + \"-cx-PRIVATE-uiImageBlock__image\"))) + (((p === \"small\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__smallimage\") : \"\"))) + (((p === \"medium\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__mediumimage\") : \"\"))) + (((p === \"large\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__largeimage\") : \"\"))));\n    };\n    function n(p, q, r) {\n        p.props.className = j(m(q), p.props.className, r);\n    };\n    var o = h.createClass({\n        displayName: \"ImageBlock\",\n        render: function() {\n            l(this.props);\n            var p = this.props.children[0], q = this.props.children[1], r = this.props.children[2], s = (this.props.spacing || \"small\");\n            n(p, s, this.props.imageClassName);\n            var t = j(this.props.contentClassName, (((\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\") + (((s === \"small\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__smallcontent\") : \"\")))));\n            if ((p.tagName == \"IMG\")) {\n                if ((p.props.alt === undefined)) {\n                    p.props.alt = \"\";\n                };\n            }\n             else if (((((((p.tagName == \"A\") || (p.tagName == \"LINK\"))) && (p.props.tabIndex === undefined)) && (p.props.title === undefined)) && (p.props[\"aria-label\"] === undefined))) {\n                p.props.tabIndex = \"-1\";\n                p.props[\"aria-hidden\"] = \"true\";\n            }\n            \n        ;\n            var u;\n            if (!r) {\n                u = h.DOM.div({\n                    className: t\n                }, q);\n            }\n             else u = g({\n                className: t,\n                direction: g.DIRECTION.right\n            }, q, r);\n        ;\n            return this.transferPropsTo(g({\n                direction: g.DIRECTION.left\n            }, p, u));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIImageBlock.react\", [\"ImageBlock.react\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ImageBlock.react\"), h = b(\"React\"), i = b(\"cx\"), j = h.createClass({\n        displayName: \"UFIImageBlock\",\n        render: function() {\n            return this.transferPropsTo(g({\n                imageClassName: \"UFIImageBlockImage\",\n                contentClassName: \"UFIImageBlockContent\"\n            }, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIAddComment.react\", [\"Bootloader\",\"CLogConfig\",\"ClipboardPhotoUploader\",\"CloseButton.react\",\"Event\",\"Keys\",\"LoadingIndicator.react\",\"React\",\"LegacyMentionsInput.react\",\"TrackingNodes\",\"Run\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CLogConfig\"), i = b(\"ClipboardPhotoUploader\"), j = b(\"CloseButton.react\"), k = b(\"Event\"), l = b(\"Keys\"), m = b(\"LoadingIndicator.react\"), n = b(\"React\"), o = b(\"LegacyMentionsInput.react\"), p = b(\"TrackingNodes\"), q = b(\"Run\"), r = b(\"UFIClassNames\"), s = b(\"UFIImageBlock.react\"), t = b(\"cx\"), u = b(\"joinClasses\"), v = b(\"tx\"), w = \"Write a comment...\", x = \"Write a reply...\", y = \"fcg fss UFICommentTip\", z = 19, aa = \"/ajax/ufi/upload/\", ba = n.createClass({\n        displayName: \"UFIAddComment\",\n        getInitialState: function() {\n            if (this.props.attachedPhoto) {\n                this.props.contextArgs.attachedphoto = this.props.attachedPhoto;\n            };\n            return {\n                attachedPhoto: (this.props.attachedPhoto ? this.props.attachedPhoto : null),\n                isCommenting: false,\n                isLoadingPhoto: false,\n                isOnBeforeUnloadListenerAdded: false\n            };\n        },\n        _onKeyDown: function(event) {\n            if ((this.props.isEditing && (k.getKeyCode(event.nativeEvent) === l.ESC))) {\n                this.props.onCancel();\n            };\n            if ((this.isMounted() && !this.state.isOnBeforeUnloadListenerAdded)) {\n                q.onBeforeUnload(this._handleUnsavedChanges);\n                this.setState({\n                    isOnBeforeUnloadListenerAdded: true\n                });\n            }\n        ;\n        },\n        _handleUnsavedChanges: function() {\n            var ca = a.PageTransitions;\n            if (ca) {\n                var da = ca.getNextURI(), ea = ca.getMostRecentURI();\n                if ((da.getQueryData().hasOwnProperty(\"theater\") || ea.getQueryData().hasOwnProperty(\"theater\"))) {\n                    return\n                };\n            }\n        ;\n            if (((this.refs && this.refs.mentionsinput) && this.refs.mentionsinput.hasEnteredText())) {\n                return \"You haven't finished your comment yet. Do you want to leave without finishing?\"\n            };\n        },\n        _blur: function() {\n            if ((this.refs.mentionsinput && this.refs.mentionsinput.hasEnteredText())) {\n                return\n            };\n            this.setState({\n                isCommenting: false\n            });\n        },\n        _onPaste: function(event) {\n            var ca = new i(aa, this._getPhotoUploadData());\n            this._cancelCurrentSubscriptions();\n            this._subscriptions = [ca.subscribe(\"upload_start\", this._prepareForAttachedPhotoPreview),ca.subscribe(\"upload_error\", this._onRemoveAttachedPhotoPreviewClicked),ca.subscribe(\"upload_success\", function(da, ea) {\n                this._onPhotoUploadComplete(ea);\n            }.bind(this)),];\n            ca.handlePaste(event);\n        },\n        _cancelCurrentSubscriptions: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(function(ca) {\n                    ca.unsubscribe();\n                });\n            };\n        },\n        componentWillUnmount: function() {\n            this._cancelCurrentSubscriptions();\n        },\n        focus: function() {\n            if ((this.refs && this.refs.mentionsinput)) {\n                this.refs.mentionsinput.focus();\n            };\n        },\n        render: function() {\n            var ca = (!this.props.contextArgs.collapseaddcomment || this.state.isCommenting), da = null;\n            if (this.props.isEditing) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Esc to cancel.\");\n            }\n             else if (this.props.showSendOnEnterTip) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Enter to post.\");\n            }\n             else if (this.props.subtitle) {\n                da = n.DOM.span({\n                    className: y\n                }, this.props.subtitle);\n            }\n            \n        ;\n            var ea = null, fa = this.state.attachedPhoto, ga = null;\n            if (this.props.allowPhotoAttachments) {\n                ga = this._onPaste;\n                var ha = n.DOM.input({\n                    ref: \"PhotoInput\",\n                    accept: \"image/*\",\n                    className: \"-cx-PRIVATE-uiFileInput__input\",\n                    name: \"file[]\",\n                    type: \"file\",\n                    multiple: false\n                }), ia = (fa ? \"UFICommentPhotoAttachedIcon\" : \"UFICommentPhotoIcon\"), ja = \"UFIPhotoAttachLinkWrapper -cx-PRIVATE-uiFileInput__container\";\n                ea = n.DOM.div({\n                    ref: \"PhotoInputContainer\",\n                    className: ja,\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"aria-label\": \"Attach a Photo\"\n                }, n.DOM.i({\n                    ref: \"PhotoInputControl\",\n                    className: ia\n                }), ha);\n            }\n        ;\n            var ka = p.getTrackingInfo(p.types.ADD_COMMENT_BOX), la = u(r.ACTOR_IMAGE, ((!ca ? \"hidden_elem\" : \"\"))), ma = n.DOM.div({\n                className: \"UFIReplyActorPhotoWrapper\"\n            }, n.DOM.img({\n                className: la,\n                src: this.props.viewerActor.thumbSrc\n            })), na = u(r.ROW, ((((((((this.props.hide ? \"noDisplay\" : \"\")) + ((\" \" + \"UFIAddComment\"))) + ((this.props.allowPhotoAttachments ? (\" \" + \"UFIAddCommentWithPhotoAttacher\") : \"\"))) + ((this.props.withoutSeparator ? (\" \" + \"UFIAddCommentWithoutSeparator\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), oa = (!!this.props.replyCommentID ? x : w), pa = (this.props.contextArgs.entstream ? this._blur : null), qa = this.props.contextArgs.viewoptionstypeobjects, ra = this.props.contextArgs.viewoptionstypeobjectsorder, sa = null, ta = this.props.onCommentSubmit;\n            if (fa) {\n                sa = n.DOM.div({\n                    isStatic: true,\n                    dangerouslySetInnerHTML: (this.state.attachedPhoto.markupPreview ? this.state.attachedPhoto.markupPreview : this.state.attachedPhoto.markup)\n                });\n                da = null;\n            }\n             else if (this.state.isLoadingPhoto) {\n                sa = m({\n                    color: \"white\",\n                    className: \"UFICommentPhotoAttachedPreviewLoadingIndicator\",\n                    size: \"medium\"\n                });\n            }\n        ;\n            var ua;\n            if ((sa != null)) {\n                ua = n.DOM.div({\n                    className: \"UFICommentPhotoAttachedPreview pas\"\n                }, sa, j({\n                    onClick: this._onRemoveAttachedPhotoPreviewClicked\n                }));\n                ta = function(va, event) {\n                    this.setState({\n                        isLoadingPhoto: false,\n                        attachedPhoto: null\n                    });\n                    va.attachedPhoto = this.props.contextArgs.attachedphoto;\n                    this.props.onCommentSubmit(va, event);\n                }.bind(this);\n            }\n        ;\n            return (n.DOM.li({\n                className: na,\n                onKeyDown: this._onKeyDown,\n                \"data-ft\": ka\n            }, s({\n                className: \"UFIMentionsInputWrap\"\n            }, ma, n.DOM.div(null, o({\n                initialData: this.props.initialData,\n                placeholder: oa,\n                ref: \"mentionsinput\",\n                datasource: this.props.mentionsDataSource,\n                acceptEmptyInput: (this.props.isEditing || this.props.contextArgs.attachedphoto),\n                onEnterSubmit: ta,\n                onFocus: this.setState.bind(this, {\n                    isCommenting: true\n                }),\n                viewOptionsTypeObjects: qa,\n                viewOptionsTypeObjectsOrder: ra,\n                onBlur: pa,\n                onTypingStateChange: this.props.onTypingStateChange,\n                onPaste: ga,\n                sht: this.props.contextArgs.sht,\n                isLoadingPhoto: this.state.isLoadingPhoto\n            }), ea, ua, da))));\n        },\n        componentDidMount: function(ca) {\n            if (h.gkResults) {\n                var da = this.props.replyCommentID;\n                if ((this.refs && this.refs.mentionsinput)) {\n                    var ea = this.refs.mentionsinput.refs.textarea.getDOMNode();\n                    g.loadModules([\"CLoggerX\",\"UFIComments\",], function(ja, ka) {\n                        var la = ka.getComment(da), ma = (la ? la.fbid : null);\n                        ja.trackMentionsInput(ea, ma);\n                    });\n                }\n            ;\n            }\n        ;\n            if (!this.props.allowPhotoAttachments) {\n                return\n            };\n            var fa = this.refs.PhotoInputContainer.getDOMNode(), ga = this.refs.PhotoInputControl.getDOMNode(), ha = this.refs.PhotoInput.getDOMNode(), ia = k.listen(fa, \"click\", function(event) {\n                g.loadModules([\"FileInput\",\"FileInputUploader\",\"Input\",], function(ja, ka, la) {\n                    var ma = new ja(fa, ga, ha), na = new ka().setURI(aa).setData(this._getPhotoUploadData());\n                    ma.subscribe(\"change\", function(event) {\n                        if (ma.getValue()) {\n                            this._prepareForAttachedPhotoPreview();\n                            na.setInput(ma.getInput()).send();\n                        }\n                    ;\n                    }.bind(this));\n                    na.subscribe(\"success\", function(oa, pa) {\n                        ma.clear();\n                        this._onPhotoUploadComplete(pa.response);\n                    }.bind(this));\n                }.bind(this));\n                ia.remove();\n            }.bind(this));\n        },\n        _getPhotoUploadData: function() {\n            return {\n                profile_id: this.props.viewerActor.id,\n                source: z\n            };\n        },\n        _onPhotoUploadComplete: function(ca) {\n            if (!this.state.isLoadingPhoto) {\n                return\n            };\n            var da = ca.getPayload();\n            if ((da && da.fbid)) {\n                this.props.contextArgs.attachedphoto = da;\n                this.setState({\n                    attachedPhoto: da,\n                    isLoadingPhoto: false\n                });\n            }\n        ;\n        },\n        _onRemoveAttachedPhotoPreviewClicked: function(event) {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: false\n            });\n        },\n        _prepareForAttachedPhotoPreview: function() {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: true\n            });\n        }\n    });\n    e.exports = ba;\n});\n__d(\"UFIAddCommentController\", [\"Arbiter\",\"copyProperties\",\"MentionsInputUtils\",\"Parent\",\"UFIAddComment.react\",\"React\",\"ShortProfiles\",\"UFICentralUpdates\",\"UFIComments\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"MentionsInputUtils\"), j = b(\"Parent\"), k = b(\"UFIAddComment.react\"), l = b(\"React\"), m = b(\"ShortProfiles\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIFeedbackTargets\"), q = b(\"UFIInstanceState\"), r = b(\"UFIUserActions\");\n    function s(t, u, v, w) {\n        this.id = u;\n        this._ufiInstanceID = w.instanceid;\n        this._contextArgs = w;\n        this._replyCommentID = v;\n        if (t) {\n            this.root = t;\n            if (!this._contextArgs.rootid) {\n                this._contextArgs.rootid = t.id;\n            };\n            this.render();\n            n.subscribe(\"instance-updated\", function(x, y) {\n                var z = y.updates;\n                if ((this._ufiInstanceID in z)) {\n                    this.render();\n                };\n            }.bind(this));\n        }\n    ;\n        n.subscribe(\"feedback-id-changed\", function(x, y) {\n            var z = y.updates;\n            if ((this.id in z)) {\n                this.id = z[this.id];\n            };\n        }.bind(this));\n    };\n    h(s.prototype, {\n        _onCommentSubmit: function(t, event) {\n            r.addComment(this.id, t.visibleValue, t.encodedValue, {\n                source: this._contextArgs.source,\n                ufiinstanceid: this._ufiInstanceID,\n                target: event.target,\n                replyid: this._replyCommentID,\n                timelinelogdata: this._contextArgs.timelinelogdata,\n                rootid: this._contextArgs.rootid,\n                attachedphoto: this._contextArgs.attachedphoto,\n                giftoccasion: this._contextArgs.giftoccasion\n            });\n            this._contextArgs.attachedphoto = null;\n            p.getFeedbackTarget(this.id, function(u) {\n                var v = j.byTag(this.root, \"form\");\n                if (v) {\n                    g.inform(\"ufi/comment\", {\n                        form: v,\n                        isranked: u.isranked\n                    });\n                };\n            }.bind(this));\n            return false;\n        },\n        _onTypingStateChange: function(t, u) {\n        \n        },\n        renderAddComment: function(t, u, v, w, x, y, z) {\n            var aa = (this._contextArgs.logtyping ? this._onTypingStateChange.bind(this) : null), ba = null, ca = (q.getKeyForInstance(this._ufiInstanceID, \"isediting\") && !this._replyCommentID);\n            return (k({\n                hide: ca,\n                replyCommentID: this._replyCommentID,\n                viewerActor: t,\n                initialData: ba,\n                ref: w,\n                withoutSeparator: x,\n                onCommentSubmit: this._onCommentSubmit.bind(this),\n                mentionsDataSource: u,\n                onTypingStateChange: aa,\n                showSendOnEnterTip: v,\n                allowPhotoAttachments: y,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                subtitle: z\n            }));\n        },\n        renderEditComment: function(t, u, v, w, x, y) {\n            var z = o.getComment(u), aa = i.generateDataFromTextWithEntities(z.body);\n            return (k({\n                viewerActor: t,\n                initialData: aa,\n                onCommentSubmit: w,\n                onCancel: x,\n                mentionsDataSource: v,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                isEditing: true,\n                editingCommentID: u,\n                attachedPhoto: z.photo_comment,\n                allowPhotoAttachments: y\n            }));\n        },\n        render: function() {\n            if (!this.root) {\n                throw new Error(\"render called on UFIAddCommentController with no root\")\n            };\n            p.getFeedbackTarget(this.id, function(t) {\n                if ((t.cancomment && t.actorforpost)) {\n                    m.get(t.actorforpost, function(u) {\n                        var v = this.renderAddComment(u, t.mentionsdatasource, t.showsendonentertip, null, null, t.allowphotoattachments, t.subtitle);\n                        this._addComment = l.renderComponent(v, this.root);\n                    }.bind(this));\n                };\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});\n__d(\"Scrollable\", [\"Event\",\"Parent\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Parent\"), i = b(\"UserAgent\"), j = function(event) {\n        var m = h.byClass(event.getTarget(), \"scrollable\");\n        if (!m) {\n            return\n        };\n        if ((((((typeof event.axis !== \"undefined\") && (event.axis === event.HORIZONTAL_AXIS))) || ((event.wheelDeltaX && !event.wheelDeltaY))) || ((event.deltaX && !event.deltaY)))) {\n            return\n        };\n        var n = ((event.wheelDelta || -event.deltaY) || -event.detail), o = m.scrollHeight, p = m.clientHeight;\n        if ((o > p)) {\n            var q = m.scrollTop;\n            if (((((n > 0) && (q === 0))) || (((n < 0) && (q >= (o - p)))))) {\n                event.prevent();\n            }\n             else if ((i.ie() < 9)) {\n                if (m.currentStyle) {\n                    var r = m.currentStyle.fontSize;\n                    if ((r.indexOf(\"px\") < 0)) {\n                        var s = document.createElement(\"div\");\n                        s.style.fontSize = r;\n                        s.style.height = \"1em\";\n                        r = s.style.pixelHeight;\n                    }\n                     else r = parseInt(r, 10);\n                ;\n                    m.scrollTop = (q - Math.round(((n / 120) * r)));\n                    event.prevent();\n                }\n            \n            }\n        ;\n        }\n    ;\n    }, k = document.documentElement;\n    if (i.firefox()) {\n        var l = (((\"WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\");\n        k.addEventListener(l, j, false);\n    }\n     else g.listen(k, \"mousewheel\", j);\n;\n});\n__d(\"LegacyScrollableArea.react\", [\"Scrollable\",\"Bootloader\",\"React\",\"Style\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"Scrollable\");\n    var g = b(\"Bootloader\"), h = b(\"React\"), i = b(\"Style\"), j = b(\"cx\"), k = \"uiScrollableArea native\", l = \"uiScrollableAreaWrap scrollable\", m = \"uiScrollableAreaBody\", n = \"uiScrollableAreaContent\", o = h.createClass({\n        displayName: \"ReactLegacyScrollableArea\",\n        render: function() {\n            var p = {\n                height: (this.props.height ? (this.props.height + \"px\") : \"auto\")\n            };\n            return (h.DOM.div({\n                className: k,\n                ref: \"root\",\n                style: p\n            }, h.DOM.div({\n                className: l\n            }, h.DOM.div({\n                className: m,\n                ref: \"body\"\n            }, h.DOM.div({\n                className: n\n            }, this.props.children)))));\n        },\n        getArea: function() {\n            return this._area;\n        },\n        componentDidMount: function() {\n            g.loadModules([\"ScrollableArea\",], this._loadScrollableArea);\n        },\n        _loadScrollableArea: function(p) {\n            this._area = p.fromNative(this.refs.root.getDOMNode(), {\n                fade: this.props.fade,\n                persistent: this.props.persistent\n            });\n            var q = this.refs.body.getDOMNode();\n            i.set(q, \"width\", (this.props.width + \"px\"));\n            (this.props.onScroll && this._area.subscribe(\"scroll\", this.props.onScroll));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIAddCommentLink.react\", [\"React\",\"UFIClassNames\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIAddCommentLink\",\n        render: function() {\n            var m = j(h.ROW, ((((((\"UFIAddCommentLink\") + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), n = \"Write a comment...\";\n            return (g.DOM.li({\n                className: m,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, g.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, n)));\n        }\n    });\n    e.exports = l;\n});\n__d(\"HovercardLink\", [\"Bootloader\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"URI\"), i = {\n        getBaseURI: function() {\n            return h(\"/ajax/hovercard/hovercard.php\");\n        },\n        constructEndpoint: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, k, null);\n        },\n        constructEndpointWithLocation: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, null, k);\n        },\n        constructEndpointWithGroupAndLocation: function(j, k, l) {\n            g.loadModules([\"Hovercard\",], function() {\n            \n            });\n            var m = new h(i.getBaseURI()).setQueryData({\n                id: j.id\n            }), n = {\n            };\n            if ((j.weakreference && k)) {\n                n.group_id = k;\n            };\n            if (l) {\n                n.hc_location = l;\n            };\n            m.addQueryData({\n                extragetparams: JSON.stringify(n)\n            });\n            return m;\n        }\n    };\n    e.exports = i;\n});\n__d(\"UntrustedLink\", [\"DOM\",\"Event\",\"URI\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m, n, o, p) {\n        this.dom = m;\n        this.url = m.href;\n        this.hash = n;\n        this.func_get_params = (p || function() {\n            return {\n            };\n        });\n        h.listen(this.dom, \"click\", this.onclick.bind(this));\n        h.listen(this.dom, \"mousedown\", this.onmousedown.bind(this));\n        h.listen(this.dom, \"mouseup\", this.onmouseup.bind(this));\n        h.listen(this.dom, \"mouseout\", this.onmouseout.bind(this));\n        this.onmousedown(h.$E(o));\n    };\n    l.bootstrap = function(m, n, o, p) {\n        if (m.__untrusted) {\n            return\n        };\n        m.__untrusted = true;\n        new l(m, n, o, p);\n    };\n    l.prototype.getRewrittenURI = function() {\n        var m = k({\n            u: this.url,\n            h: this.hash\n        }, this.func_get_params(this.dom)), n = new i(\"/l.php\");\n        return n.setQueryData(m).setSubdomain(\"www\").setProtocol(\"http\");\n    };\n    l.prototype.onclick = function() {\n        (function() {\n            this.setHref(this.url);\n        }).bind(this).defer(100);\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.onmousedown = function(m) {\n        if ((m.button == 2)) {\n            this.setHref(this.getRewrittenURI());\n        };\n    };\n    l.prototype.onmouseup = function() {\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.onmouseout = function() {\n        this.setHref(this.url);\n    };\n    l.prototype.setHref = function(m) {\n        if ((j.ie() < 9)) {\n            var n = g.create(\"span\");\n            g.appendContent(this.dom, n);\n            this.dom.href = m;\n            g.remove(n);\n        }\n         else this.dom.href = m;\n    ;\n    };\n    e.exports = l;\n});\n__d(\"Link.react\", [\"React\",\"UntrustedLink\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UntrustedLink\"), i = b(\"mergeInto\"), j = g.createClass({\n        displayName: \"Link\",\n        _installLinkshimOnMouseDown: function(event) {\n            var k = this.props.href;\n            if (k.shimhash) {\n                h.bootstrap(this.getDOMNode(), k.shimhash);\n            };\n            (this.props.onMouseDown && this.props.onMouseDown(event));\n        },\n        render: function() {\n            var k = this.props.href, l = g.DOM.a(null);\n            i(l.props, this.props);\n            if (k) {\n                l.props.href = k.url;\n                var m = !!k.shimhash;\n                if (m) {\n                    l.props.rel = (l.props.rel ? ((l.props.rel + \" nofollow\")) : \"nofollow\");\n                    l.props.onMouseDown = this._installLinkshimOnMouseDown;\n                }\n            ;\n            }\n             else l.props.href = \"#\";\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"PubContentTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HASHTAG: \"hashtag\",\n        TOPIC: \"topic\",\n        URL: \"url\"\n    };\n    e.exports = g;\n});\n__d(\"HovercardLinkInterpolator\", [\"Bootloader\",\"CSS\",\"Event\",\"HovercardLink\",\"Link.react\",\"Parent\",\"PubContentTypes\",\"React\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\"), i = b(\"Event\"), j = b(\"HovercardLink\"), k = b(\"Link.react\"), l = b(\"Parent\"), m = b(\"PubContentTypes\"), n = b(\"React\"), o = b(\"URI\"), p = b(\"cx\");\n    function q(r, s, t, u, v) {\n        var w = s.entities[0], x = (t || ((w.external ? \"_blank\" : null))), y, z = ((((!w.external ? \"profileLink\" : \"\")) + ((w.weakreference ? (\" \" + \"weakReference\") : \"\"))));\n        if (w.hashtag) {\n            var aa = h.hasClass(document.body, \"-cx-PUBLIC-hasLitestand__body\"), ba = function(ea) {\n                if (i.$E(ea.nativeEvent).isDefaultRequested()) {\n                    return\n                };\n                ea.preventDefault();\n                var fa = l.byTag(ea.target, \"A\");\n                if (aa) {\n                    g.loadModules([\"EntstreamPubContentOverlay\",], function(ga) {\n                        ga.pubClick(fa);\n                    });\n                }\n                 else g.loadModules([\"HashtagLayerPageController\",], function(ga) {\n                    ga.click(fa);\n                });\n            ;\n            }, ca = null;\n            if (aa) {\n                ca = {\n                    type: m.HASHTAG,\n                    id: w.id,\n                    source: \"comment\"\n                };\n            }\n             else ca = {\n                id: w.id\n            };\n        ;\n            var da = new o(w.url).setSubdomain(\"www\");\n            y = n.DOM.a({\n                className: \"-cx-PUBLIC-fbHashtagLink__link\",\n                \"data-pub\": JSON.stringify(ca),\n                href: da.toString(),\n                onClick: ba\n            }, n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__hashmark\"\n            }, r.substring(0, 1)), n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__tagname\"\n            }, r.substring(1)));\n        }\n         else if (w.weakreference) {\n            y = k({\n                className: z,\n                href: w,\n                target: x\n            }, n.DOM.i({\n                className: \"UFIWeakReferenceIcon\"\n            }), r);\n        }\n         else y = k({\n            className: z,\n            href: w,\n            target: x\n        }, r);\n        \n    ;\n        if ((!w.external && !w.hashtag)) {\n            y.props[\"data-hovercard\"] = j.constructEndpointWithGroupAndLocation(w, u, v).toString();\n        };\n        return y;\n    };\n    e.exports = q;\n});\n__d(\"LinkButton\", [\"cx\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"React\"), i = function(j) {\n        var k = ((j.name && j.value) ? (((j.name + \"[\") + encodeURIComponent(j.value)) + \"]\") : null);\n        return (h.DOM.label({\n            className: ((((\"uiLinkButton\") + ((j.subtle ? (\" \" + \"uiLinkButtonSubtle\") : \"\"))) + ((j.showSaving ? (\" \" + \"async_throbber\") : \"\"))))\n        }, h.DOM.input({\n            type: (j.inputType || \"button\"),\n            name: k,\n            value: j.label,\n            className: ((j.showSaving ? \"stat_elem\" : \"\"))\n        })));\n    };\n    e.exports = i;\n});\n__d(\"Timestamp.react\", [\"LiveTimer\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"Timestamp\",\n        render: function() {\n            var j = g.renderRelativeTimeToServer(this.props.time);\n            return this.transferPropsTo(h.DOM.abbr({\n                className: \"livetimestamp\",\n                title: this.props.verbose,\n                \"data-utime\": this.props.time\n            }, (j.text || this.props.text)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"EmoteTypes\", [], function(a, b, c, d, e, f) {\n    f.TEXT = \"text\";\n    f.EMOTE = \"emote\";\n    f.EMOTE_FBID = \"emote_fbid\";\n});\n__d(\"EmoticonsList\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        emotes: {\n            \":)\": \"smile\",\n            \":-)\": \"smile\",\n            \":]\": \"smile\",\n            \"=)\": \"smile\",\n            \":(\": \"frown\",\n            \":-(\": \"frown\",\n            \":[\": \"frown\",\n            \"=(\": \"frown\",\n            \":P\": \"tongue\",\n            \":-P\": \"tongue\",\n            \":-p\": \"tongue\",\n            \":p\": \"tongue\",\n            \"=P\": \"tongue\",\n            \"=D\": \"grin\",\n            \":-D\": \"grin\",\n            \":D\": \"grin\",\n            \":o\": \"gasp\",\n            \":-O\": \"gasp\",\n            \":O\": \"gasp\",\n            \":-o\": \"gasp\",\n            \";)\": \"wink\",\n            \";-)\": \"wink\",\n            \"8)\": \"glasses\",\n            \"8-)\": \"glasses\",\n            \"B)\": \"glasses\",\n            \"B-)\": \"glasses\",\n            \"B|\": \"sunglasses\",\n            \"8-|\": \"sunglasses\",\n            \"8|\": \"sunglasses\",\n            \"B-|\": \"sunglasses\",\n            \"\\u003E:(\": \"grumpy\",\n            \"\\u003E:-(\": \"grumpy\",\n            \":/\": \"unsure\",\n            \":-/\": \"unsure\",\n            \":\\\\\": \"unsure\",\n            \":-\\\\\": \"unsure\",\n            \"=/\": \"unsure\",\n            \"=\\\\\": \"unsure\",\n            \":'(\": \"cry\",\n            \"3:)\": \"devil\",\n            \"3:-)\": \"devil\",\n            \"O:)\": \"angel\",\n            \"O:-)\": \"angel\",\n            \":*\": \"kiss\",\n            \":-*\": \"kiss\",\n            \"\\u003C3\": \"heart\",\n            \"&lt;3\": \"heart\",\n            \"\\u2665\": \"heart\",\n            \"^_^\": \"kiki\",\n            \"-_-\": \"squint\",\n            \"o.O\": \"confused\",\n            \"O.o\": \"confused_rev\",\n            \"\\u003E:o\": \"upset\",\n            \"\\u003E:O\": \"upset\",\n            \"\\u003E:-O\": \"upset\",\n            \"\\u003E:-o\": \"upset\",\n            \"\\u003E_\\u003C\": \"upset\",\n            \"\\u003E.\\u003C\": \"upset\",\n            \":v\": \"pacman\",\n            \":|]\": \"robot\",\n            \":3\": \"colonthree\",\n            \"\\u003C(\\\")\": \"penguin\",\n            \":putnam:\": \"putnam\",\n            \"(^^^)\": \"shark\",\n            \"(y)\": \"like\",\n            \":like:\": \"like\",\n            \"(Y)\": \"like\",\n            \":poop:\": \"poop\"\n        },\n        symbols: {\n            smile: \":)\",\n            frown: \":(\",\n            tongue: \":P\",\n            grin: \"=D\",\n            gasp: \":o\",\n            wink: \";)\",\n            glasses: \"8)\",\n            sunglasses: \"B|\",\n            grumpy: \"\\u003E:(\",\n            unsure: \":/\",\n            cry: \":'(\",\n            devil: \"3:)\",\n            angel: \"O:)\",\n            kiss: \":*\",\n            heart: \"\\u003C3\",\n            kiki: \"^_^\",\n            squint: \"-_-\",\n            confused: \"o.O\",\n            confused_rev: \"O.o\",\n            upset: \"\\u003E:o\",\n            pacman: \":v\",\n            robot: \":|]\",\n            colonthree: \":3\",\n            penguin: \"\\u003C(\\\")\",\n            putnam: \":putnam:\",\n            shark: \"(^^^)\",\n            like: \"(y)\",\n            poop: \":poop:\"\n        },\n        regexp: /(^|[\\s'\".])(:\\)|:\\-\\)|:\\]|=\\)|:\\(|:\\-\\(|:\\[|=\\(|:P|:\\-P|:\\-p|:p|=P|=D|:\\-D|:D|:o|:\\-O|:O|:\\-o|;\\)|;\\-\\)|8\\)|8\\-\\)|B\\)|B\\-\\)|B\\||8\\-\\||8\\||B\\-\\||>:\\(|>:\\-\\(|:\\/|:\\-\\/|:\\\\|:\\-\\\\|=\\/|=\\\\|:'\\(|3:\\)|3:\\-\\)|O:\\)|O:\\-\\)|:\\*|:\\-\\*|<3|&lt;3|\\u2665|\\^_\\^|\\-_\\-|o\\.O|O\\.o|>:o|>:O|>:\\-O|>:\\-o|>_<|>\\.<|:v|:\\|\\]|:3|<\\(\"\\)|:putnam:|\\(\\^\\^\\^\\)|\\(y\\)|:like:|\\(Y\\)|:poop:)([\\s'\".,!?]|<br>|$)/\n    };\n});\n__d(\"createEmoteTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = 40;\n    function i(j) {\n        return function(k) {\n            var l = k, m = [], n = h;\n            while (n--) {\n                var o = j.regexp.exec(l);\n                if ((!o || !o.length)) {\n                    break;\n                };\n                var p = o[2], q = (o.index + o[1].length), r = l.substring(0, q);\n                if (r) {\n                    m.push({\n                        type: g.TEXT,\n                        text: r\n                    });\n                };\n                var s = j.emotes[p];\n                if (s) {\n                    m.push({\n                        type: g.EMOTE,\n                        text: p,\n                        emote: s\n                    });\n                }\n                 else m.push({\n                    type: g.TEXT,\n                    text: p\n                });\n            ;\n                l = l.substring((q + p.length));\n            };\n            if (l) {\n                m.push({\n                    type: g.TEXT,\n                    text: l\n                });\n            };\n            return m;\n        };\n    };\n    e.exports = i;\n});\n__d(\"emoteFBIDTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = /\\[\\[([a-z\\d\\.]+)\\]\\]/gi;\n    function i(j) {\n        return j.split(h).map(function(k, l) {\n            if (((l % 2) === 0)) {\n                return {\n                    type: g.TEXT,\n                    text: k\n                };\n            }\n             else return {\n                type: g.EMOTE_FBID,\n                text: ((\"[[\" + k) + \"]]\"),\n                value: k\n            }\n        ;\n        });\n    };\n    e.exports = i;\n});\n__d(\"Emote\", [\"DOM\",\"EmoteTypes\",\"EmoticonsList\",\"createEmoteTokenizer\",\"emoteFBIDTokenizer\",\"flattenArray\",\"htmlize\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoteTypes\"), i = b(\"EmoticonsList\"), j = b(\"createEmoteTokenizer\"), k = b(\"emoteFBIDTokenizer\"), l = b(\"flattenArray\"), m = b(\"htmlize\"), n = j(i), o = e.exports = {\n    };\n    o.htmlEmoteWithoutFBID = function(p, q) {\n        if ((typeof q != \"function\")) {\n            q = m;\n        };\n        return l(n(p).map(function(r) {\n            if ((r.type === h.TEXT)) {\n                return q(r.text);\n            }\n             else if ((r.type === h.EMOTE)) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"span\", {\n                    title: r.text,\n                    className: (\"emoticon emoticon_\" + r.emote)\n                })).innerHTML,]\n            }\n        ;\n        })).join(\"\");\n    };\n    o.htmlEmote = function(p, q) {\n        if ((typeof q != \"function\")) {\n            q = m;\n        };\n        return l(k(p).map(function(r) {\n            if ((r.type === h.TEXT)) {\n                return o.htmlEmoteWithoutFBID(r.text, q);\n            }\n             else if ((r.type === h.EMOTE_FBID)) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"img\", {\n                    alt: r.text,\n                    className: \"emoticon emoticon_custom\",\n                    src: (((window.location.protocol + \"//graph.facebook.com/\") + encodeURIComponent(r.value)) + \"/picture\")\n                })).innerHTML,]\n            }\n        ;\n        })).join(\"\");\n    };\n});\n__d(\"SupportedEmoji\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        utf16Regex: /[\\u203C\\u2049\\u2100-\\u21FF\\u2300-\\u27FF\\u2900-\\u29FF\\u2B00-\\u2BFF\\u3000-\\u30FF\\u3200-\\u32FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDEFF]/,\n        emoji: {\n            127744: \"-cx-PRIVATE-fbEmoji__icon_1f300\",\n            127746: \"-cx-PRIVATE-fbEmoji__icon_1f302\",\n            127754: \"-cx-PRIVATE-fbEmoji__icon_1f30a\",\n            127769: \"-cx-PRIVATE-fbEmoji__icon_1f319\",\n            127775: \"-cx-PRIVATE-fbEmoji__icon_1f31f\",\n            127793: \"-cx-PRIVATE-fbEmoji__icon_1f331\",\n            127796: \"-cx-PRIVATE-fbEmoji__icon_1f334\",\n            127797: \"-cx-PRIVATE-fbEmoji__icon_1f335\",\n            127799: \"-cx-PRIVATE-fbEmoji__icon_1f337\",\n            127800: \"-cx-PRIVATE-fbEmoji__icon_1f338\",\n            127801: \"-cx-PRIVATE-fbEmoji__icon_1f339\",\n            127802: \"-cx-PRIVATE-fbEmoji__icon_1f33a\",\n            127803: \"-cx-PRIVATE-fbEmoji__icon_1f33b\",\n            127806: \"-cx-PRIVATE-fbEmoji__icon_1f33e\",\n            127808: \"-cx-PRIVATE-fbEmoji__icon_1f340\",\n            127809: \"-cx-PRIVATE-fbEmoji__icon_1f341\",\n            127810: \"-cx-PRIVATE-fbEmoji__icon_1f342\",\n            127811: \"-cx-PRIVATE-fbEmoji__icon_1f343\",\n            127818: \"-cx-PRIVATE-fbEmoji__icon_1f34a\",\n            127822: \"-cx-PRIVATE-fbEmoji__icon_1f34e\",\n            127827: \"-cx-PRIVATE-fbEmoji__icon_1f353\",\n            127828: \"-cx-PRIVATE-fbEmoji__icon_1f354\",\n            127864: \"-cx-PRIVATE-fbEmoji__icon_1f378\",\n            127866: \"-cx-PRIVATE-fbEmoji__icon_1f37a\",\n            127873: \"-cx-PRIVATE-fbEmoji__icon_1f381\",\n            127875: \"-cx-PRIVATE-fbEmoji__icon_1f383\",\n            127876: \"-cx-PRIVATE-fbEmoji__icon_1f384\",\n            127877: \"-cx-PRIVATE-fbEmoji__icon_1f385\",\n            127880: \"-cx-PRIVATE-fbEmoji__icon_1f388\",\n            127881: \"-cx-PRIVATE-fbEmoji__icon_1f389\",\n            127885: \"-cx-PRIVATE-fbEmoji__icon_1f38d\",\n            127886: \"-cx-PRIVATE-fbEmoji__icon_1f38e\",\n            127887: \"-cx-PRIVATE-fbEmoji__icon_1f38f\",\n            127888: \"-cx-PRIVATE-fbEmoji__icon_1f390\",\n            127891: \"-cx-PRIVATE-fbEmoji__icon_1f393\",\n            127925: \"-cx-PRIVATE-fbEmoji__icon_1f3b5\",\n            127926: \"-cx-PRIVATE-fbEmoji__icon_1f3b6\",\n            127932: \"-cx-PRIVATE-fbEmoji__icon_1f3bc\",\n            128013: \"-cx-PRIVATE-fbEmoji__icon_1f40d\",\n            128014: \"-cx-PRIVATE-fbEmoji__icon_1f40e\",\n            128017: \"-cx-PRIVATE-fbEmoji__icon_1f411\",\n            128018: \"-cx-PRIVATE-fbEmoji__icon_1f412\",\n            128020: \"-cx-PRIVATE-fbEmoji__icon_1f414\",\n            128023: \"-cx-PRIVATE-fbEmoji__icon_1f417\",\n            128024: \"-cx-PRIVATE-fbEmoji__icon_1f418\",\n            128025: \"-cx-PRIVATE-fbEmoji__icon_1f419\",\n            128026: \"-cx-PRIVATE-fbEmoji__icon_1f41a\",\n            128027: \"-cx-PRIVATE-fbEmoji__icon_1f41b\",\n            128031: \"-cx-PRIVATE-fbEmoji__icon_1f41f\",\n            128032: \"-cx-PRIVATE-fbEmoji__icon_1f420\",\n            128033: \"-cx-PRIVATE-fbEmoji__icon_1f421\",\n            128037: \"-cx-PRIVATE-fbEmoji__icon_1f425\",\n            128038: \"-cx-PRIVATE-fbEmoji__icon_1f426\",\n            128039: \"-cx-PRIVATE-fbEmoji__icon_1f427\",\n            128040: \"-cx-PRIVATE-fbEmoji__icon_1f428\",\n            128041: \"-cx-PRIVATE-fbEmoji__icon_1f429\",\n            128043: \"-cx-PRIVATE-fbEmoji__icon_1f42b\",\n            128044: \"-cx-PRIVATE-fbEmoji__icon_1f42c\",\n            128045: \"-cx-PRIVATE-fbEmoji__icon_1f42d\",\n            128046: \"-cx-PRIVATE-fbEmoji__icon_1f42e\",\n            128047: \"-cx-PRIVATE-fbEmoji__icon_1f42f\",\n            128048: \"-cx-PRIVATE-fbEmoji__icon_1f430\",\n            128049: \"-cx-PRIVATE-fbEmoji__icon_1f431\",\n            128051: \"-cx-PRIVATE-fbEmoji__icon_1f433\",\n            128052: \"-cx-PRIVATE-fbEmoji__icon_1f434\",\n            128053: \"-cx-PRIVATE-fbEmoji__icon_1f435\",\n            128054: \"-cx-PRIVATE-fbEmoji__icon_1f436\",\n            128055: \"-cx-PRIVATE-fbEmoji__icon_1f437\",\n            128056: \"-cx-PRIVATE-fbEmoji__icon_1f438\",\n            128057: \"-cx-PRIVATE-fbEmoji__icon_1f439\",\n            128058: \"-cx-PRIVATE-fbEmoji__icon_1f43a\",\n            128059: \"-cx-PRIVATE-fbEmoji__icon_1f43b\",\n            128062: \"-cx-PRIVATE-fbEmoji__icon_1f43e\",\n            128064: \"-cx-PRIVATE-fbEmoji__icon_1f440\",\n            128066: \"-cx-PRIVATE-fbEmoji__icon_1f442\",\n            128067: \"-cx-PRIVATE-fbEmoji__icon_1f443\",\n            128068: \"-cx-PRIVATE-fbEmoji__icon_1f444\",\n            128069: \"-cx-PRIVATE-fbEmoji__icon_1f445\",\n            128070: \"-cx-PRIVATE-fbEmoji__icon_1f446\",\n            128071: \"-cx-PRIVATE-fbEmoji__icon_1f447\",\n            128072: \"-cx-PRIVATE-fbEmoji__icon_1f448\",\n            128073: \"-cx-PRIVATE-fbEmoji__icon_1f449\",\n            128074: \"-cx-PRIVATE-fbEmoji__icon_1f44a\",\n            128075: \"-cx-PRIVATE-fbEmoji__icon_1f44b\",\n            128076: \"-cx-PRIVATE-fbEmoji__icon_1f44c\",\n            128077: \"-cx-PRIVATE-fbEmoji__icon_1f44d\",\n            128078: \"-cx-PRIVATE-fbEmoji__icon_1f44e\",\n            128079: \"-cx-PRIVATE-fbEmoji__icon_1f44f\",\n            128080: \"-cx-PRIVATE-fbEmoji__icon_1f450\",\n            128102: \"-cx-PRIVATE-fbEmoji__icon_1f466\",\n            128103: \"-cx-PRIVATE-fbEmoji__icon_1f467\",\n            128104: \"-cx-PRIVATE-fbEmoji__icon_1f468\",\n            128105: \"-cx-PRIVATE-fbEmoji__icon_1f469\",\n            128107: \"-cx-PRIVATE-fbEmoji__icon_1f46b\",\n            128110: \"-cx-PRIVATE-fbEmoji__icon_1f46e\",\n            128111: \"-cx-PRIVATE-fbEmoji__icon_1f46f\",\n            128113: \"-cx-PRIVATE-fbEmoji__icon_1f471\",\n            128114: \"-cx-PRIVATE-fbEmoji__icon_1f472\",\n            128115: \"-cx-PRIVATE-fbEmoji__icon_1f473\",\n            128116: \"-cx-PRIVATE-fbEmoji__icon_1f474\",\n            128117: \"-cx-PRIVATE-fbEmoji__icon_1f475\",\n            128118: \"-cx-PRIVATE-fbEmoji__icon_1f476\",\n            128119: \"-cx-PRIVATE-fbEmoji__icon_1f477\",\n            128120: \"-cx-PRIVATE-fbEmoji__icon_1f478\",\n            128123: \"-cx-PRIVATE-fbEmoji__icon_1f47b\",\n            128124: \"-cx-PRIVATE-fbEmoji__icon_1f47c\",\n            128125: \"-cx-PRIVATE-fbEmoji__icon_1f47d\",\n            128126: \"-cx-PRIVATE-fbEmoji__icon_1f47e\",\n            128127: \"-cx-PRIVATE-fbEmoji__icon_1f47f\",\n            128128: \"-cx-PRIVATE-fbEmoji__icon_1f480\",\n            128130: \"-cx-PRIVATE-fbEmoji__icon_1f482\",\n            128131: \"-cx-PRIVATE-fbEmoji__icon_1f483\",\n            128133: \"-cx-PRIVATE-fbEmoji__icon_1f485\",\n            128139: \"-cx-PRIVATE-fbEmoji__icon_1f48b\",\n            128143: \"-cx-PRIVATE-fbEmoji__icon_1f48f\",\n            128144: \"-cx-PRIVATE-fbEmoji__icon_1f490\",\n            128145: \"-cx-PRIVATE-fbEmoji__icon_1f491\",\n            128147: \"-cx-PRIVATE-fbEmoji__icon_1f493\",\n            128148: \"-cx-PRIVATE-fbEmoji__icon_1f494\",\n            128150: \"-cx-PRIVATE-fbEmoji__icon_1f496\",\n            128151: \"-cx-PRIVATE-fbEmoji__icon_1f497\",\n            128152: \"-cx-PRIVATE-fbEmoji__icon_1f498\",\n            128153: \"-cx-PRIVATE-fbEmoji__icon_1f499\",\n            128154: \"-cx-PRIVATE-fbEmoji__icon_1f49a\",\n            128155: \"-cx-PRIVATE-fbEmoji__icon_1f49b\",\n            128156: \"-cx-PRIVATE-fbEmoji__icon_1f49c\",\n            128157: \"-cx-PRIVATE-fbEmoji__icon_1f49d\",\n            128162: \"-cx-PRIVATE-fbEmoji__icon_1f4a2\",\n            128164: \"-cx-PRIVATE-fbEmoji__icon_1f4a4\",\n            128166: \"-cx-PRIVATE-fbEmoji__icon_1f4a6\",\n            128168: \"-cx-PRIVATE-fbEmoji__icon_1f4a8\",\n            128169: \"-cx-PRIVATE-fbEmoji__icon_1f4a9\",\n            128170: \"-cx-PRIVATE-fbEmoji__icon_1f4aa\",\n            128187: \"-cx-PRIVATE-fbEmoji__icon_1f4bb\",\n            128189: \"-cx-PRIVATE-fbEmoji__icon_1f4bd\",\n            128190: \"-cx-PRIVATE-fbEmoji__icon_1f4be\",\n            128191: \"-cx-PRIVATE-fbEmoji__icon_1f4bf\",\n            128192: \"-cx-PRIVATE-fbEmoji__icon_1f4c0\",\n            128222: \"-cx-PRIVATE-fbEmoji__icon_1f4de\",\n            128224: \"-cx-PRIVATE-fbEmoji__icon_1f4e0\",\n            128241: \"-cx-PRIVATE-fbEmoji__icon_1f4f1\",\n            128242: \"-cx-PRIVATE-fbEmoji__icon_1f4f2\",\n            128250: \"-cx-PRIVATE-fbEmoji__icon_1f4fa\",\n            128276: \"-cx-PRIVATE-fbEmoji__icon_1f514\",\n            128293: \"-cx-PRIVATE-fbEmoji__icon_1f525\",\n            128513: \"-cx-PRIVATE-fbEmoji__icon_1f601\",\n            128514: \"-cx-PRIVATE-fbEmoji__icon_1f602\",\n            128515: \"-cx-PRIVATE-fbEmoji__icon_1f603\",\n            128516: \"-cx-PRIVATE-fbEmoji__icon_1f604\",\n            128518: \"-cx-PRIVATE-fbEmoji__icon_1f606\",\n            128521: \"-cx-PRIVATE-fbEmoji__icon_1f609\",\n            128523: \"-cx-PRIVATE-fbEmoji__icon_1f60b\",\n            128524: \"-cx-PRIVATE-fbEmoji__icon_1f60c\",\n            128525: \"-cx-PRIVATE-fbEmoji__icon_1f60d\",\n            128527: \"-cx-PRIVATE-fbEmoji__icon_1f60f\",\n            128530: \"-cx-PRIVATE-fbEmoji__icon_1f612\",\n            128531: \"-cx-PRIVATE-fbEmoji__icon_1f613\",\n            128532: \"-cx-PRIVATE-fbEmoji__icon_1f614\",\n            128534: \"-cx-PRIVATE-fbEmoji__icon_1f616\",\n            128536: \"-cx-PRIVATE-fbEmoji__icon_1f618\",\n            128538: \"-cx-PRIVATE-fbEmoji__icon_1f61a\",\n            128540: \"-cx-PRIVATE-fbEmoji__icon_1f61c\",\n            128541: \"-cx-PRIVATE-fbEmoji__icon_1f61d\",\n            128542: \"-cx-PRIVATE-fbEmoji__icon_1f61e\",\n            128544: \"-cx-PRIVATE-fbEmoji__icon_1f620\",\n            128545: \"-cx-PRIVATE-fbEmoji__icon_1f621\",\n            128546: \"-cx-PRIVATE-fbEmoji__icon_1f622\",\n            128547: \"-cx-PRIVATE-fbEmoji__icon_1f623\",\n            128548: \"-cx-PRIVATE-fbEmoji__icon_1f624\",\n            128549: \"-cx-PRIVATE-fbEmoji__icon_1f625\",\n            128552: \"-cx-PRIVATE-fbEmoji__icon_1f628\",\n            128553: \"-cx-PRIVATE-fbEmoji__icon_1f629\",\n            128554: \"-cx-PRIVATE-fbEmoji__icon_1f62a\",\n            128555: \"-cx-PRIVATE-fbEmoji__icon_1f62b\",\n            128557: \"-cx-PRIVATE-fbEmoji__icon_1f62d\",\n            128560: \"-cx-PRIVATE-fbEmoji__icon_1f630\",\n            128561: \"-cx-PRIVATE-fbEmoji__icon_1f631\",\n            128562: \"-cx-PRIVATE-fbEmoji__icon_1f632\",\n            128563: \"-cx-PRIVATE-fbEmoji__icon_1f633\",\n            128565: \"-cx-PRIVATE-fbEmoji__icon_1f635\",\n            128567: \"-cx-PRIVATE-fbEmoji__icon_1f637\",\n            128568: \"-cx-PRIVATE-fbEmoji__icon_1f638\",\n            128569: \"-cx-PRIVATE-fbEmoji__icon_1f639\",\n            128570: \"-cx-PRIVATE-fbEmoji__icon_1f63a\",\n            128571: \"-cx-PRIVATE-fbEmoji__icon_1f63b\",\n            128572: \"-cx-PRIVATE-fbEmoji__icon_1f63c\",\n            128573: \"-cx-PRIVATE-fbEmoji__icon_1f63d\",\n            128575: \"-cx-PRIVATE-fbEmoji__icon_1f63f\",\n            128576: \"-cx-PRIVATE-fbEmoji__icon_1f640\",\n            128587: \"-cx-PRIVATE-fbEmoji__icon_1f64b\",\n            128588: \"-cx-PRIVATE-fbEmoji__icon_1f64c\",\n            128589: \"-cx-PRIVATE-fbEmoji__icon_1f64d\",\n            128591: \"-cx-PRIVATE-fbEmoji__icon_1f64f\",\n            9757: \"-cx-PRIVATE-fbEmoji__icon_261d\",\n            9786: \"-cx-PRIVATE-fbEmoji__icon_263a\",\n            9889: \"-cx-PRIVATE-fbEmoji__icon_26a1\",\n            9924: \"-cx-PRIVATE-fbEmoji__icon_26c4\",\n            9994: \"-cx-PRIVATE-fbEmoji__icon_270a\",\n            9995: \"-cx-PRIVATE-fbEmoji__icon_270b\",\n            9996: \"-cx-PRIVATE-fbEmoji__icon_270c\",\n            9728: \"-cx-PRIVATE-fbEmoji__icon_2600\",\n            9729: \"-cx-PRIVATE-fbEmoji__icon_2601\",\n            9748: \"-cx-PRIVATE-fbEmoji__icon_2614\",\n            9749: \"-cx-PRIVATE-fbEmoji__icon_2615\",\n            10024: \"-cx-PRIVATE-fbEmoji__icon_2728\",\n            10084: \"-cx-PRIVATE-fbEmoji__icon_2764\"\n        }\n    };\n});\n__d(\"Utf16\", [], function(a, b, c, d, e, f) {\n    var g = {\n        decode: function(h) {\n            switch (h.length) {\n              case 1:\n                return h.charCodeAt(0);\n              case 2:\n                return ((65536 | ((((h.charCodeAt(0) - 55296)) * 1024))) | ((h.charCodeAt(1) - 56320)));\n            };\n        },\n        encode: function(h) {\n            if ((h < 65536)) {\n                return String.fromCharCode(h);\n            }\n             else return (String.fromCharCode((55296 + ((((h - 65536)) >> 10)))) + String.fromCharCode((56320 + ((h % 1024)))))\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"Emoji\", [\"cx\",\"DOM\",\"Emote\",\"SupportedEmoji\",\"htmlize\",\"Utf16\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"Emote\"), j = b(\"SupportedEmoji\"), k = b(\"htmlize\"), l = b(\"Utf16\"), m = 40, n = e.exports = {\n        htmlEmojiAndEmote: function(o, p) {\n            return n.htmlEmoji(o, function(q) {\n                return i.htmlEmote(q, p);\n            });\n        },\n        htmlEmoji: function(o, p) {\n            if ((typeof p != \"function\")) {\n                p = k;\n            };\n            var q = o, r = [], s = m;\n            while (s--) {\n                var t = j.utf16Regex.exec(q);\n                if ((!t || !t.length)) {\n                    break;\n                };\n                var u = t[0], v = t.index;\n                r.push(p(q.substring(0, v)));\n                var w = l.decode(u);\n                if (j.emoji[w]) {\n                    var x = ((\"-cx-PRIVATE-fbEmoji__icon -cx-PRIVATE-fbEmoji__size_16\" + \" \") + j.emoji[w]), y = h.create(\"span\", {\n                        className: x\n                    });\n                    r.push(h.create(\"span\", {\n                    }, y).innerHTML);\n                }\n                 else r.push(p(u));\n            ;\n                q = q.substring((v + u.length));\n            };\n            r.push(p(q));\n            return r.join(\"\");\n        }\n    };\n});\n__d(\"TextWithEmoticons.react\", [\"Emoji\",\"Emote\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"Emoji\"), h = b(\"Emote\"), i = b(\"React\"), j = i.createClass({\n        displayName: \"ReactTextWithEmoticons\",\n        render: function() {\n            if ((!this.props.renderEmoticons && !this.props.renderEmoji)) {\n                return i.DOM.span(null, this.props.text)\n            };\n            var k;\n            if ((this.props.renderEmoticons && this.props.renderEmoji)) {\n                k = g.htmlEmoji(this.props.text, h.htmlEmoteWithoutFBID);\n            }\n             else if (this.props.renderEmoticons) {\n                k = h.htmlEmoteWithoutFBID(this.props.text);\n            }\n             else k = g.htmlEmoji(this.props.text);\n            \n        ;\n            return i.DOM.span({\n                dangerouslySetInnerHTML: {\n                    __html: k\n                }\n            });\n        }\n    });\n    e.exports = j;\n});\n__d(\"TextWithEntities.react\", [\"Link.react\",\"React\",\"TextWithEmoticons.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"React\"), i = b(\"TextWithEmoticons.react\");\n    function j(o) {\n        return (o).replace(/<3\\b|&hearts;/g, \"\\u2665\");\n    };\n    function k(o, p) {\n        return (g({\n            href: p.entities[0]\n        }, o));\n    };\n    function l(o, p) {\n        return (o.offset - p.offset);\n    };\n    var m = /(\\r\\n|[\\r\\n])/, n = h.createClass({\n        displayName: \"ReactTextWithEntities\",\n        _formatStandardText: function(o) {\n            var p = o.split(m), q = [];\n            for (var r = 0; (r < p.length); r++) {\n                var s = p[r];\n                if (s) {\n                    if (m.test(s)) {\n                        q.push(h.DOM.br(null));\n                    }\n                     else if ((this.props.renderEmoticons || this.props.renderEmoji)) {\n                        q.push(i({\n                            text: s,\n                            renderEmoticons: this.props.renderEmoticons,\n                            renderEmoji: this.props.renderEmoji\n                        }));\n                    }\n                     else q.push(j(s));\n                    \n                \n                };\n            };\n            return q;\n        },\n        render: function() {\n            var o = 0, p = this.props.ranges, q = this.props.aggregatedRanges, r = this.props.text, s = null;\n            if (p) {\n                s = (q ? p.concat(q) : p.slice());\n            }\n             else if (q) {\n                s = q.slice();\n            }\n        ;\n            if (s) {\n                s.sort(l);\n            };\n            var t = [], u = (s ? s.length : 0);\n            for (var v = 0, w = u; (v < w); v++) {\n                var x = s[v];\n                if ((x.offset < o)) {\n                    continue;\n                };\n                if ((x.offset > o)) {\n                    t = t.concat(this._formatStandardText(r.substring(o, x.offset)));\n                };\n                var y = r.substr(x.offset, x.length);\n                t = t.concat([(this.props.interpolator ? this.props.interpolator(y, x) : k(y, x)),]);\n                o = (x.offset + x.length);\n            };\n            if ((r.length > o)) {\n                t = t.concat(this._formatStandardText(r.substr(o)));\n            };\n            return h.DOM.span(null, t);\n        }\n    });\n    e.exports = n;\n});\n__d(\"SeeMore.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"SeeMore\",\n        getInitialState: function() {\n            return {\n                isCollapsed: true\n            };\n        },\n        handleClick: function() {\n            this.setState({\n                isCollapsed: false\n            });\n        },\n        render: function() {\n            var j = this.state.isCollapsed, k = (!j ? null : g.DOM.span(null, \"...\")), l = this.props.children[0], m = (j ? null : g.DOM.span(null, this.props.children[1])), n = (!j ? null : g.DOM.a({\n                className: \"SeeMoreLink fss\",\n                onClick: this.handleClick,\n                href: \"#\",\n                role: \"button\"\n            }, \"See More\"));\n            return (g.DOM.span({\n                className: this.props.className\n            }, l, k, n, m));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TruncatedTextWithEntities.react\", [\"React\",\"TextWithEntities.react\",\"SeeMore.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TextWithEntities.react\"), i = b(\"SeeMore.react\");\n    function j(n, o) {\n        var p = (n.offset + n.length);\n        return ((o > n.offset) && (o < p));\n    };\n    function k(n, o) {\n        for (var p = 0; (p < n.length); p++) {\n            var q = n[p];\n            if (j(q, o)) {\n                return q.offset\n            };\n        };\n        return o;\n    };\n    var l = function(n, o, p) {\n        var q = [], r = [], s = k(o, p);\n        for (var t = 0; (t < o.length); t++) {\n            var u = o[t];\n            if ((u.offset < s)) {\n                q.push(u);\n            }\n             else r.push({\n                offset: (u.offset - s),\n                length: u.length,\n                entities: u.entities\n            });\n        ;\n        };\n        return {\n            first: {\n                ranges: q,\n                text: n.substr(0, s)\n            },\n            second: {\n                ranges: r,\n                text: n.substr(s)\n            }\n        };\n    }, m = g.createClass({\n        displayName: \"TruncatedTextWithEntities\",\n        render: function() {\n            var n = this.props.maxLines, o = this.props.maxLength, p = (this.props.truncationPercent || 181889), q = Math.floor((p * o)), r = (this.props.text || \"\"), s = (this.props.ranges || []), t = r.split(\"\\u000a\"), u = (t.length - 1), v = (o && (r.length > o)), w = (n && (u > n));\n            if (w) {\n                q = Math.min(t.slice(0, n).join(\"\\u000a\").length, q);\n            };\n            if ((v || w)) {\n                var x = l(r, s, q);\n                return (g.DOM.span({\n                    \"data-ft\": this.props[\"data-ft\"],\n                    dir: this.props.dir\n                }, i({\n                    className: this.props.className\n                }, h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.first.ranges,\n                    text: x.first.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }), h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.second.ranges,\n                    text: x.second.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }))));\n            }\n             else return (g.DOM.span({\n                \"data-ft\": this.props[\"data-ft\"],\n                dir: this.props.dir\n            }, h({\n                className: this.props.className,\n                interpolator: this.props.interpolator,\n                ranges: s,\n                text: r,\n                renderEmoticons: this.props.renderEmoticons,\n                renderEmoji: this.props.renderEmoji\n            })))\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFICommentAttachment.react\", [\"DOM\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"UFICommentAttachment\",\n        _attachmentFromCommentData: function(j) {\n            return (j.photo_comment || j.attachment);\n        },\n        componentDidMount: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            if (k) {\n                this.renderAttachment(k);\n            };\n        },\n        shouldComponentUpdate: function(j, k) {\n            var l = this._attachmentFromCommentData(this.props.comment), m = this._attachmentFromCommentData(j.comment);\n            if ((!l && !m)) {\n                return false\n            };\n            if (((!l || !m) || (l.markup != m.markup))) {\n                return true;\n            }\n             else return false\n        ;\n        },\n        componentDidUpdate: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            this.renderAttachment(k);\n        },\n        renderAttachment: function(j) {\n            if ((j && this.refs.contents)) {\n                g.setContent(this.refs.contents.getDOMNode(), j.markup);\n            };\n        },\n        render: function() {\n            if (this._attachmentFromCommentData(this.props.comment)) {\n                return h.DOM.div({\n                    ref: \"contents\"\n                });\n            }\n             else return h.DOM.span(null)\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIReplyLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFIReplyLink\",\n        render: function() {\n            return (g.DOM.a({\n                className: \"UFIReplyLink\",\n                href: \"#\",\n                onClick: this.props.onClick\n            }, \"Reply\"));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFISpamCount\", [\"UFISpamCountImpl\",], function(a, b, c, d, e, f) {\n    e.exports = (b(\"UFISpamCountImpl\").module || {\n        enabled: false\n    });\n});\n__d(\"UFIComment.react\", [\"function-extensions\",\"Bootloader\",\"CloseButton.react\",\"Env\",\"Focus\",\"HovercardLink\",\"HovercardLinkInterpolator\",\"LinkButton\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"Timestamp.react\",\"TrackingNodes\",\"TruncatedTextWithEntities.react\",\"UFIClassNames\",\"UFICommentAttachment.react\",\"UFIConfig\",\"UFIConstants\",\"UFIImageBlock.react\",\"UFIInstanceState\",\"UFIReplyLink.react\",\"UFISpamCount\",\"URI\",\"cx\",\"keyMirror\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CloseButton.react\"), i = b(\"Env\"), j = b(\"Focus\"), k = b(\"HovercardLink\"), l = b(\"HovercardLinkInterpolator\"), m = b(\"LinkButton\"), n = b(\"NumberFormat\"), o = b(\"ProfileBrowserLink\"), p = b(\"ProfileBrowserTypes\"), q = b(\"React\"), r = b(\"Timestamp.react\"), s = b(\"TrackingNodes\"), t = b(\"TruncatedTextWithEntities.react\"), u = b(\"UFIClassNames\"), v = b(\"UFICommentAttachment.react\"), w = b(\"UFIConfig\"), x = b(\"UFIConstants\"), y = b(\"UFIImageBlock.react\"), z = b(\"UFIInstanceState\"), aa = b(\"UFIReplyLink.react\"), ba = b(\"UFISpamCount\"), ca = b(\"URI\"), da = b(\"cx\"), ea = b(\"keyMirror\"), fa = b(\"joinClasses\"), ga = b(\"tx\"), ha = x.UFIStatus, ia = \" \\u00b7 \", ja = ea({\n        edit: true,\n        hide: true,\n        remove: true\n    }), ka = \"UFICommentBody\", la = \"UFICommentActorName\", ma = \"UFICommentNotSpamLink\", na = \"fsm fwn fcg UFICommentActions\", oa = \"UFIDeletedMessageIcon\", pa = \"UFIDeletedMessage\", qa = \"UFIFailureMessageIcon\", ra = \"UFIFailureMessage\", sa = \"UFICommentLikeButton\", ta = \"UFICommentLikeIcon\", ua = \"UFITranslateLink\", va = \"UFITranslatedText\", wa = \"uiLinkSubtle\", xa = \"stat_elem\", ya = \"pls\", za = \"fcg\", ab = 27, bb = null, cb = function(kb, lb) {\n        var mb = new ca(\"/ajax/like/tooltip.php\").setQueryData({\n            comment_fbid: kb.fbid,\n            comment_from: kb.author,\n            cache_buster: (kb.likeconfirmhash || 0)\n        });\n        if (lb) {\n            mb.addQueryData({\n                viewas: lb\n            });\n        };\n        return mb;\n    }, db = function(kb) {\n        var lb = kb.status;\n        return ((lb === ha.FAILED_ADD) || (lb === ha.FAILED_EDIT));\n    };\n    function eb(kb) {\n        return (((kb.commenterIsFOF !== undefined) && (kb.userIsMinor !== undefined)) && (kb.reportLink !== undefined));\n    };\n    var fb = q.createClass({\n        displayName: \"UFICommentLikeCount\",\n        render: function() {\n            var kb = this.props.comment, lb = n.formatIntegerWithDelimiter((kb.likecount || 0), this.props.contextArgs.numberdelimiter), mb = p.LIKES, nb = {\n                id: kb.fbid\n            }, ob = cb(this.props.comment, this.props.viewas), pb = q.DOM.i({\n                className: ta\n            }), qb = q.DOM.span(null, lb);\n            return (q.DOM.a({\n                className: sa,\n                role: \"button\",\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": ob.toString(),\n                ajaxify: o.constructDialogURI(mb, nb).toString(),\n                href: o.constructPageURI(mb, nb).toString()\n            }, pb, qb));\n        }\n    }), gb = q.createClass({\n        displayName: \"UFICommentActions\",\n        render: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.markedAsSpamHere, ob = (lb.status === ha.SPAM_DISPLAY), pb = this.props.showReplyLink, qb = this.props.hideAsSpamForPageAdmin, rb, sb, tb, ub, vb, wb, xb = (!lb.islocal && (lb.status !== ha.LIVE_DELETED));\n            if (xb) {\n                if ((ob && !nb)) {\n                    if (kb.viewerCanMarkNotSpam) {\n                        rb = q.DOM.a({\n                            onClick: kb.onMarkAsNotSpam,\n                            className: ma,\n                            href: \"#\",\n                            role: \"button\"\n                        }, \"Unhide\");\n                    };\n                    if ((((qb && mb.isthreaded) && mb.cancomment) && pb)) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    };\n                }\n                 else {\n                    if (mb.viewercanlike) {\n                        var yb = s.getTrackingInfo((lb.hasviewerliked ? s.types.UNLIKE_LINK : s.types.LIKE_LINK)), zb = (lb.hasviewerliked ? \"Unlike this comment\" : \"Like this comment\");\n                        sb = q.DOM.a({\n                            className: \"UFILikeLink\",\n                            href: \"#\",\n                            role: \"button\",\n                            onClick: kb.onCommentLikeToggle,\n                            \"data-ft\": yb,\n                            title: zb\n                        }, (lb.hasviewerliked ? \"Unlike\" : \"Like\"));\n                    }\n                ;\n                    if (((mb.isthreaded && mb.cancomment) && pb)) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    };\n                    if ((lb.likecount > 0)) {\n                        tb = fb({\n                            comment: lb,\n                            viewas: this.props.viewas,\n                            contextArgs: this.props.contextArgs\n                        });\n                    };\n                    if ((lb.spamcount && ba.enabled)) {\n                        ub = ba({\n                            count: lb.spamcount\n                        });\n                    };\n                }\n            ;\n                if ((lb.attachment && lb.canremove)) {\n                    wb = q.DOM.a({\n                        onClick: kb.onPreviewRemove,\n                        href: \"#\",\n                        role: \"button\"\n                    }, \"Remove Preview\");\n                };\n            }\n        ;\n            var ac = hb({\n                comment: lb,\n                onRetrySubmit: kb.onRetrySubmit,\n                showPermalink: kb.showPermalink\n            }), bc;\n            if (kb.contextArgs.entstream) {\n                bc = [ac,sb,tb,vb,ub,rb,wb,];\n            }\n             else if (mb.isthreaded) {\n                bc = [sb,vb,rb,wb,tb,ub,ac,];\n            }\n             else bc = [ac,sb,tb,ub,vb,rb,wb,];\n            \n        ;\n            if ((lb.status === ha.LIVE_DELETED)) {\n                var cc = q.DOM.span({\n                    className: pa\n                }, q.DOM.i({\n                    className: oa,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Comment deleted\"\n                }));\n                bc.push(cc);\n            }\n        ;\n            var dc = [];\n            for (var ec = 0; (ec < bc.length); ec++) {\n                if (bc[ec]) {\n                    dc.push(ia);\n                    dc.push(bc[ec]);\n                }\n            ;\n            };\n            dc.shift();\n            return (q.DOM.div({\n                className: na\n            }, dc));\n        }\n    }), hb = q.createClass({\n        displayName: \"UFICommentMetadata\",\n        render: function() {\n            var kb = this.props.comment, lb = this.props.onRetrySubmit, mb, nb;\n            if (db(kb)) {\n                mb = [q.DOM.span({\n                    className: ra\n                }, q.DOM.i({\n                    className: qa\n                }), \"Unable to post comment.\"),((kb.allowRetry && lb) ? [\" \",q.DOM.a({\n                    onClick: lb,\n                    href: \"#\",\n                    role: \"button\"\n                }, \"Try Again\"),] : null),];\n            }\n             else {\n                var ob = (this.props.showPermalink ? kb.permalink : null), pb = s.getTrackingInfo(s.types.SOURCE), qb = q.DOM.a({\n                    className: wa,\n                    href: ob,\n                    \"data-ft\": pb\n                }, r({\n                    time: kb.timestamp.time,\n                    text: kb.timestamp.text,\n                    verbose: kb.timestamp.verbose\n                })), rb;\n                switch (kb.source) {\n                  case x.UFISourceType.MOBILE:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/\").setSubdomain(\"www\").toString()\n                    }, \"mobile\");\n                    break;\n                  case x.UFISourceType.SMS:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/?v=texts\").setSubdomain(\"www\").toString()\n                    }, \"text message\");\n                    break;\n                  case x.UFISourceType.EMAIL:\n                    rb = m({\n                        subtle: true,\n                        label: \"email\",\n                        inputType: \"submit\",\n                        name: \"email_explain\",\n                        value: true,\n                        className: xa\n                    });\n                    break;\n                };\n                nb = (rb ? ga._(\"{time} via {source}\", {\n                    time: qb,\n                    source: rb\n                }) : qb);\n            }\n        ;\n            var sb = null;\n            if (kb.originalTimestamp) {\n                var tb = new ca(\"/ajax/edits/browser/comment\").addQueryData({\n                    comment_token: kb.id\n                }).toString();\n                sb = [ia,q.DOM.a({\n                    ref: \"EditLink\",\n                    href: \"#\",\n                    role: \"button\",\n                    rel: \"dialog\",\n                    className: \"uiLinkSubtle\",\n                    ajaxify: tb,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Show edit history\",\n                    title: \"Show edit history\"\n                }, \"Edited\"),];\n            }\n        ;\n            return (q.DOM.span(null, nb, mb, sb));\n        },\n        componentWillUpdate: function(kb) {\n            var lb = this.props.comment, mb = kb.comment;\n            if ((!lb.editnux && !!mb.editnux)) {\n                g.loadModules([\"LegacyContextualDialog\",], function(nb) {\n                    var ob = new nb();\n                    ob.init(mb.editnux).setContext(this.refs.EditLink.getDOMNode()).setWidth(300).setPosition(\"below\").show();\n                }.bind(this));\n            };\n        }\n    }), ib = q.createClass({\n        displayName: \"UFISocialContext\",\n        render: function() {\n            var kb = this.props.topMutualFriend, lb = this.props.otherMutualCount, mb = this.props.commentAuthor, nb = k.constructEndpoint(kb).toString(), ob = q.DOM.a({\n                href: kb.uri,\n                \"data-hovercard\": nb\n            }, kb.name), pb = (mb.name.length + kb.name.length), qb;\n            if ((lb === 0)) {\n                qb = ga._(\"Friends with {name}\", {\n                    name: ob\n                });\n            }\n             else if ((pb < ab)) {\n                var rb;\n                if ((lb == 1)) {\n                    rb = \"1 other\";\n                }\n                 else rb = ga._(\"{count} others\", {\n                    count: lb\n                });\n            ;\n                qb = ga._(\"Friends with {name} and {others}\", {\n                    name: ob,\n                    others: this.getOthersLink(rb, mb, kb)\n                });\n            }\n             else {\n                var sb = ga._(\"{count} mutual friends\", {\n                    count: (lb + 1)\n                });\n                qb = this.getOthersLink(sb, mb);\n            }\n            \n        ;\n            return (q.DOM.span({\n                className: \"UFICommentSocialContext\"\n            }, ia, qb));\n        },\n        getOthersLink: function(kb, lb, mb) {\n            var nb = p.MUTUAL_FRIENDS, ob = {\n                uid: lb.id\n            }, pb = new ca(\"/ajax/mutual_friends/tooltip.php\").setQueryData({\n                friend_id: lb.id\n            });\n            if (mb) {\n                pb.addQueryData({\n                    exclude_id: mb.id\n                });\n            };\n            var qb = o.constructDialogURI(nb, ob).toString();\n            return (q.DOM.a({\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": pb.toString(),\n                ajaxify: qb,\n                href: o.constructPageURI(nb, ob).toString()\n            }, kb));\n        }\n    }), jb = q.createClass({\n        displayName: \"UFIComment\",\n        getInitialState: function() {\n            return {\n                isHighlighting: this.props.comment.highlightcomment,\n                wasHighlighted: this.props.comment.highlightcomment,\n                markedAsSpamHere: false,\n                oneClickRemovedHere: false,\n                isInlinePageDeleted: false,\n                isInlineBanned: false\n            };\n        },\n        _onHideAsSpam: function(event) {\n            this.props.onHideAsSpam(event);\n            this.setState({\n                markedAsSpamHere: true\n            });\n        },\n        _onMarkAsNotSpam: function(event) {\n            this.props.onMarkAsNotSpam(event);\n            this.setState({\n                markedAsSpamHere: false\n            });\n        },\n        _onDeleteSpam: function(event) {\n            this.props.onOneClickRemove(event);\n            this.setState({\n                isInlinePageDeleted: true\n            });\n        },\n        _onUndoDeleteSpam: function(event) {\n            this.props.onUndoOneClickRemove(event);\n            this.setState({\n                isInlinePageDeleted: false\n            });\n        },\n        _onInlineBan: function(event) {\n            this.props.onInlineBan(event);\n            this.setState({\n                isInlineBanned: true\n            });\n        },\n        _onUndoInlineBan: function(event) {\n            this.props.onUndoInlineBan(event);\n            this.setState({\n                isInlineBanned: false\n            });\n        },\n        _onOneClickRemove: function(event) {\n            this.props.onOneClickRemove(event);\n            this.setState({\n                oneClickRemovedHere: true\n            });\n        },\n        _onUndoOneClickRemove: function(event) {\n            this.props.onUndoOneClickRemove(event);\n            this.setState({\n                oneClickRemovedHere: false\n            });\n        },\n        _onAction: function(event, kb) {\n            if ((kb === ja.remove)) {\n                this.props.onRemove(event);\n            }\n             else if ((kb === ja.edit)) {\n                this.props.onEdit(event);\n            }\n             else if ((kb === ja.hide)) {\n                this._onHideAsSpam(event);\n            }\n            \n        ;\n        },\n        _createRemoveReportMenu: function(event) {\n            if (this._removeReportMenu) {\n                return\n            };\n            var kb = [{\n                label: \"Delete Comment...\",\n                value: ja.remove\n            },{\n                label: \"Hide Comment\",\n                value: ja.hide\n            },];\n            if (event.persist) {\n                event.persist();\n            }\n             else event = event.constructor.persistentCloneOf(event);\n        ;\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._removeReportMenu = lb.createAndShowPopoverMenu(event.target, kb, this._onAction.bind(this, event));\n            }.bind(this));\n        },\n        _createEditDeleteMenu: function(event) {\n            if (event.persist) {\n                event.persist();\n            }\n             else event = event.constructor.persistentCloneOf(event);\n        ;\n            if (this._editDeleteMenu) {\n                return\n            };\n            var kb = [{\n                label: \"Edit...\",\n                value: ja.edit\n            },{\n                label: \"Delete...\",\n                value: ja.remove\n            },];\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._editDeleteMenu = lb.createAndShowPopoverMenu(event.target, kb, this._onAction.bind(this, event));\n            }.bind(this));\n        },\n        _renderCloseButton: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = null, nb = null, ob = false;\n            if ((kb.canremove && !this.props.hideAsSpamForPageAdmin)) {\n                if (this.props.viewerIsAuthor) {\n                    if (kb.canedit) {\n                        nb = \"Edit or Delete\";\n                        mb = this._createEditDeleteMenu;\n                        ob = true;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this.props.onRemove;\n                    }\n                ;\n                }\n                 else if (lb.canremoveall) {\n                    if (this.props.showRemoveReportMenu) {\n                        nb = \"Remove or Report\";\n                        mb = this._createRemoveReportMenu;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this._onOneClickRemove;\n                    }\n                \n                }\n            ;\n            }\n             else if (kb.canreport) {\n                nb = \"Hide\";\n                mb = this._onHideAsSpam;\n            }\n            \n        ;\n            var pb = ((((\"UFICommentCloseButton\") + ((ob ? (\" \" + \"UFIEditButton\") : \"\"))) + (((mb === null) ? (\" \" + \"hdn\") : \"\"))));\n            return (h({\n                onClick: mb,\n                tooltip: nb,\n                className: pb\n            }));\n        },\n        componentDidMount: function(kb) {\n            var lb = this.props.comment.ufiinstanceid;\n            if (this.state.isHighlighting) {\n                g.loadModules([\"UFIScrollHighlight\",], function(nb) {\n                    nb.actOn.curry(kb).defer();\n                });\n                this.setState({\n                    isHighlighting: false\n                });\n            }\n        ;\n            var mb = z.getKeyForInstance(lb, \"autofocus\");\n            if (mb) {\n                j.setWithoutOutline(this.refs.AuthorName.getDOMNode());\n                z.updateState(lb, \"autofocus\", false);\n            }\n        ;\n        },\n        shouldComponentUpdate: function(kb) {\n            var lb = this.props;\n            return ((((((((((((kb.comment !== lb.comment) || (kb.showReplyLink !== lb.showReplyLink)) || (kb.showReplies !== lb.showReplies)) || (kb.isFirst !== lb.isFirst)) || (kb.isLast !== lb.isLast)) || (kb.isFirstCommentComponent !== lb.isFirstCommentComponent)) || (kb.isLastCommentComponent !== lb.isLastCommentComponent)) || (kb.isFirstComponent !== lb.isFirstComponent)) || (kb.isLastComponent !== lb.isLastComponent)) || (kb.isFeaturedComment !== lb.isFeaturedComment)) || (kb.hasPartialBorder !== lb.hasPartialBorder)));\n        },\n        render: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = (kb.status === ha.DELETED), nb = (kb.status === ha.LIVE_DELETED), ob = (kb.status === ha.SPAM_DISPLAY), pb = (kb.status === ha.PENDING_UNDO_DELETE), qb = this.state.markedAsSpamHere, rb = this.state.oneClickRemovedHere, sb = this.state.isInlinePageDeleted, tb = this.props.hideAsSpamForPageAdmin, ub = this.state.isInlineBanned, vb = eb(kb), wb = (!kb.status && ((kb.isunseen || kb.islocal)));\n            if ((!kb.status && lb.lastseentime)) {\n                var xb = (kb.originalTimestamp || kb.timestamp.time);\n                wb = (wb || (xb > lb.lastseentime));\n            }\n        ;\n            var yb = this.props.contextArgs.markedcomments;\n            if ((yb && yb[kb.legacyid])) {\n                wb = true;\n            };\n            if (vb) {\n                if (bb) {\n                    var zb, ac = null, bc = null, cc = null;\n                    if (tb) {\n                        bc = (ub ? this._onUndoInlineBan : this._onInlineBan);\n                        if (sb) {\n                            ac = this._onUndoDeleteSpam;\n                            var dc = q.DOM.a({\n                                href: \"#\",\n                                onClick: ac\n                            }, \"Undo\");\n                            zb = ga._(\"You've deleted this comment so no one can see it. {undo}.\", {\n                                undo: dc\n                            });\n                        }\n                         else if (qb) {\n                            zb = \"Now this is only visible to the person who wrote it and their friends.\";\n                            cc = this._onDeleteSpam;\n                            ac = this._onMarkAsNotSpam;\n                        }\n                        \n                    ;\n                    }\n                     else if (qb) {\n                        zb = \"This comment has been hidden.\";\n                        cc = this._onDeleteSpam;\n                        ac = this._onMarkAsNotSpam;\n                    }\n                     else if (rb) {\n                        zb = \"This comment has been removed.\";\n                        ac = this._onUndoOneClickRemove;\n                    }\n                    \n                    \n                ;\n                    if (zb) {\n                        return (q.DOM.li({\n                            className: fa(u.ROW, \"UFIHide\")\n                        }, bb({\n                            notice: zb,\n                            comment: this.props.comment,\n                            authorProfiles: this.props.authorProfiles,\n                            onUndo: ac,\n                            onBanAction: bc,\n                            onDeleteAction: cc,\n                            isInlineBanned: ub,\n                            hideAsSpamForPageAdmin: tb\n                        })))\n                    };\n                }\n                 else g.loadModules([\"UFICommentRemovalControls.react\",], function(gc) {\n                    bb = gc;\n                    setTimeout(function() {\n                        this.forceUpdate();\n                    }.bind(this));\n                }.bind(this));\n            \n            };\n            var ec = fa(u.ROW, ((((((((((((((\"UFIComment\") + ((db(kb) ? (\" \" + \"UFICommentFailed\") : \"\"))) + (((((mb || nb) || ob) || pb) ? (\" \" + \"UFITranslucentComment\") : \"\"))) + ((this.state.isHighlighting ? (\" \" + \"highlightComment\") : \"\"))) + (((mb && !rb) ? (\" \" + \"noDisplay\") : \"\"))) + (((this.props.isFirst && !this.props.isReply) ? (\" \" + \"UFIFirstComment\") : \"\"))) + (((this.props.isLast && !this.props.isReply) ? (\" \" + \"UFILastComment\") : \"\"))) + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))) + ((this.props.isFeatured ? (\" \" + \"UFIFeaturedComment\") : \"\"))) + (((this.props.hasPartialBorder && !this.props.contextArgs.entstream) ? (\" \" + \"UFIPartialBorder\") : \"\"))))), fc = this.renderComment();\n            if (wb) {\n                if (this.props.contextArgs.snowliftredesign) {\n                    fc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenindicator\"\n                    }), fc);\n                }\n                 else if ((this.props.contextArgs.entstream && !this.props.isReply)) {\n                    fc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenindicator\"\n                    }), fc);\n                }\n                 else ec = fa(ec, u.UNSEEN_ITEM);\n                \n            \n            };\n            return (q.DOM.li({\n                className: ec,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, fc));\n        },\n        renderComment: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.authorProfiles[lb.author], ob = (lb.status === ha.SPAM_DISPLAY), pb = (lb.status === ha.LIVE_DELETED), qb = !((ob || pb)), rb = (mb.canremoveall || lb.hiddenbyviewer), sb = null, tb = null;\n            if (((!kb.isLocallyComposed && !this.state.wasHighlighted) && !lb.fromfetch)) {\n                tb = x.commentTruncationLength;\n                sb = x.commentTruncationMaxLines;\n            }\n        ;\n            var ub = s.getTrackingInfo(s.types.SMALL_ACTOR_PHOTO), vb = s.getTrackingInfo(s.types.USER_NAME), wb = s.getTrackingInfo(s.types.USER_MESSAGE), xb = null, yb = null;\n            if ((lb.istranslatable && ((lb.translatedtext === undefined)))) {\n                xb = q.DOM.a({\n                    href: \"#\",\n                    role: \"button\",\n                    title: \"Translate this comment\",\n                    className: ua,\n                    onClick: kb.onCommentTranslate\n                }, \"See Translation\");\n            };\n            if (lb.translatedtext) {\n                var zb = new ca(\"http://bing.com/translator\").addQueryData({\n                    text: lb.body.text\n                });\n                yb = q.DOM.span({\n                    className: va\n                }, lb.translatedtext, q.DOM.span({\n                    className: ya\n                }, \" (\", q.DOM.a({\n                    href: zb.toString(),\n                    className: za\n                }, \"Translated by Bing\"), \") \"));\n            }\n        ;\n            var ac;\n            if ((i.rtl && (lb.body.dir === \"ltr\"))) {\n                ac = \"rtl\";\n            }\n             else if ((!i.rtl && (lb.body.dir === \"rtl\"))) {\n                ac = \"ltr\";\n            }\n        ;\n            var bc = k.constructEndpointWithLocation(nb, \"ufi\").toString(), cc = q.DOM.a({\n                ref: \"AuthorName\",\n                className: la,\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": vb,\n                dir: ac\n            }, nb.name), dc = function(ic, jc) {\n                return l(ic, jc, \"_blank\", mb.grouporeventid, \"ufi\");\n            }, ec = t({\n                className: ka,\n                interpolator: dc,\n                ranges: lb.body.ranges,\n                text: lb.body.text,\n                truncationPercent: x.commentTruncationPercent,\n                maxLength: tb,\n                maxLines: sb,\n                renderEmoticons: w.renderEmoticons,\n                renderEmoji: w.renderEmoji,\n                \"data-ft\": wb,\n                dir: lb.body.dir\n            }), fc;\n            if (lb.socialcontext) {\n                var gc = lb.socialcontext, hc = ib({\n                    topMutualFriend: kb.authorProfiles[gc.topmutualid],\n                    otherMutualCount: gc.othermutualcount,\n                    commentAuthor: nb\n                });\n                fc = [cc,hc,q.DOM.div(null, ec),];\n            }\n             else fc = [cc,\" \",ec,];\n        ;\n            return (y({\n                spacing: \"medium\"\n            }, q.DOM.a({\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": ub\n            }, q.DOM.img({\n                src: nb.thumbSrc,\n                className: u.ACTOR_IMAGE,\n                alt: \"\"\n            })), q.DOM.div(null, q.DOM.div({\n                className: \"UFICommentContent\"\n            }, fc, xb, yb, v({\n                comment: kb.comment\n            })), gb({\n                comment: lb,\n                feedback: mb,\n                onBlingBoxClick: kb.onBlingBoxClick,\n                onCommentLikeToggle: kb.onCommentLikeToggle,\n                onCommentReply: kb.onCommentReply,\n                onPreviewRemove: kb.onPreviewRemove,\n                onRetrySubmit: kb.onRetrySubmit,\n                onMarkAsNotSpam: this._onMarkAsNotSpam,\n                viewerCanMarkNotSpam: rb,\n                viewas: kb.contextArgs.viewas,\n                showPermalink: kb.showPermalink,\n                showReplyLink: kb.showReplyLink,\n                showReplies: kb.showReplies,\n                contextArgs: kb.contextArgs,\n                markedAsSpamHere: this.state.markedAsSpamHere,\n                hideAsSpamForPageAdmin: kb.hideAsSpamForPageAdmin\n            })), (qb ? this._renderCloseButton() : null)));\n        }\n    });\n    e.exports = jb;\n});\n__d(\"UFIContainer.react\", [\"React\",\"TrackingNodes\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"UFIContainer\",\n        render: function() {\n            var k = null;\n            if (this.props.hasNub) {\n                k = g.DOM.li({\n                    className: \"UFIArrow\"\n                }, g.DOM.i(null));\n            };\n            var l = (((((((((!this.props.isReplyList ? \"UFIList\" : \"\")) + ((this.props.isReplyList ? (\" \" + \"UFIReplyList\") : \"\"))) + ((this.props.isParentLiveDeleted ? (\" \" + \"UFITranslucentReplyList\") : \"\"))) + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))));\n            return (g.DOM.ul({\n                className: l,\n                \"data-ft\": h.getTrackingInfo(h.types.UFI)\n            }, k, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"GiftOpportunityLogger\", [\"AsyncRequest\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Event\"), i = {\n        init: function(k, l, m) {\n            var n = false;\n            h.listen(k, \"click\", function(o) {\n                if (n) {\n                    return true\n                };\n                n = true;\n                i.send(l, m);\n            });\n        },\n        send: function(k, l) {\n            if (j[k.opportunity_id]) {\n                return\n            };\n            j[k.opportunity_id] = true;\n            return new g().setURI(\"/ajax/gifts/log/opportunity\").setData({\n                data: k,\n                entry_point: l\n            }).send();\n        }\n    }, j = {\n    };\n    e.exports = i;\n});\n__d(\"InlineBlock.react\", [\"ReactProps\",\"React\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactProps\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = {\n        baseline: null,\n        bottom: \"-cx-PRIVATE-uiInlineBlock__bottom\",\n        middle: \"-cx-PRIVATE-uiInlineBlock__middle\",\n        top: \"-cx-PRIVATE-uiInlineBlock__top\"\n    }, l = h.createClass({\n        displayName: \"InlineBlock\",\n        props: {\n            alignv: g.oneOf([\"baseline\",\"bottom\",\"middle\",\"top\",]),\n            height: g.number\n        },\n        getDefaultProps: function() {\n            return {\n                alignv: \"baseline\"\n            };\n        },\n        render: function() {\n            var m = k[this.props.alignv], n = h.DOM.div({\n                className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m)\n            }, this.props.children);\n            if ((this.props.height != null)) {\n                var o = h.DOM.div({\n                    className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m),\n                    style: {\n                        height: (this.props.height + \"px\")\n                    }\n                });\n                n = h.DOM.div({\n                    className: \"-cx-PRIVATE-uiInlineBlock__root\",\n                    height: null\n                }, o, n);\n            }\n        ;\n            return this.transferPropsTo(n);\n        }\n    });\n    e.exports = l;\n});\n__d(\"Image.react\", [\"React\",\"invariant\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"invariant\"), i = b(\"joinClasses\"), j = g.createClass({\n        displayName: \"ReactImage\",\n        props: {\n            src: function(k, l, m) {\n                var n = k[l];\n                h(((typeof n === \"string\") || (((typeof n === \"object\") && (((((n.sprited && n.spriteMapCssClass) && n.spriteCssClass)) || ((!n.sprited && n.uri))))))));\n            }\n        },\n        render: function() {\n            var k, l, m = this.props.src, n = \"img\";\n            l = true;\n            if ((typeof m === \"string\")) {\n                k = g.DOM.img({\n                    className: n,\n                    src: m\n                });\n            }\n             else if (m.sprited) {\n                n = i(n, m.spriteMapCssClass, m.spriteCssClass);\n                k = g.DOM.i({\n                    className: n,\n                    src: null\n                });\n                l = false;\n            }\n             else {\n                k = g.DOM.img({\n                    className: n,\n                    src: m.uri\n                });\n                if (((typeof this.props.width === \"undefined\") && (typeof this.props.height === \"undefined\"))) {\n                    k.props.width = m.width;\n                    k.props.height = m.height;\n                }\n            ;\n            }\n            \n        ;\n            if (this.props.alt) {\n                if (l) {\n                    k.props.alt = this.props.alt;\n                }\n                 else k.props.children = g.DOM.u(null, this.props.alt);\n            \n            };\n            return this.transferPropsTo(k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIGiftSentence.react\", [\"AsyncRequest\",\"CloseButton.react\",\"GiftOpportunityLogger\",\"ImageBlock.react\",\"InlineBlock.react\",\"LeftRight.react\",\"Link.react\",\"React\",\"Image.react\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"DOM\",\"ix\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CloseButton.react\"), i = b(\"GiftOpportunityLogger\"), j = b(\"ImageBlock.react\"), k = b(\"InlineBlock.react\"), l = b(\"LeftRight.react\"), m = b(\"Link.react\"), n = b(\"React\"), o = b(\"Image.react\"), p = b(\"UFIClassNames\"), q = b(\"UFIImageBlock.react\"), r = b(\"URI\"), s = b(\"DOM\"), t = b(\"ix\"), u = b(\"tx\"), v = n.createClass({\n        displayName: \"UFIGiftSentence\",\n        _entry_point: \"detected_gift_worthy_story_inline\",\n        render: function() {\n            var w = this.props.recipient, x = this.props.giftdata, y = (x ? x.giftproductid : null), z = this._getURI(y).toString();\n            this._log();\n            return (n.DOM.li({\n                className: p.ROW,\n                ref: \"UFIGiftSentence\"\n            }, l({\n                direction: \"right\"\n            }, (x ? this._renderGiftSuggestion(z, w, x) : this._renderGiftLink(z, w)), h({\n                size: \"small\",\n                onClick: function() {\n                    var aa = this.refs.UFIGiftSentence.getDOMNode();\n                    s.remove(aa);\n                    this._requestClose();\n                }.bind(this)\n            }))));\n        },\n        _renderGiftSuggestion: function(w, x, y) {\n            return (q(null, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            }), n.DOM.div(null, n.DOM.span({\n                className: \"fwb\"\n            }, u._(\"Surprise {name} with a gift\", {\n                name: x.firstName\n            })), j({\n                spacing: \"medium\",\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, o({\n                className: \"UFIGiftProductImg\",\n                src: y.giftproductimgsrc,\n                alt: \"product image\"\n            })), k({\n                alignv: \"middle\",\n                height: 79\n            }, n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, y.giftproductname)), n.DOM.p({\n                className: \"mvs fcg\"\n            }, y.giftproductpricerange), n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, \"Give This Gift\"), \" \\u00b7 \", m({\n                rel: \"async-post\",\n                ajaxify: this._getURI().toString(),\n                href: {\n                    url: \"#\"\n                }\n            }, \"See All Gifts\")))))));\n        },\n        _renderGiftLink: function(w, x) {\n            return (q(null, m({\n                className: \"UFIGiftIcon\",\n                tabIndex: \"-1\",\n                href: {\n                    url: \"#\"\n                },\n                rel: \"async-post\",\n                ajaxify: w\n            }, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            })), m({\n                rel: \"async-post\",\n                href: {\n                    url: \"#\"\n                },\n                ajaxify: w\n            }, u._(\"Surprise {name} with a gift\", {\n                name: x.firstName\n            }))));\n        },\n        _log: function() {\n            var w = this.props.giftdata, x = {\n                opportunity_id: this.props.contextArgs.ftentidentifier,\n                sender_id: this.props.sender.id,\n                recipient_id: this.props.recipient.id,\n                link_description: \"UFIGiftSentence\",\n                product_id: (w ? w.giftproductid : null),\n                custom: {\n                    gift_occasion: this.props.contextArgs.giftoccasion,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                }\n            };\n            i.send([x,], this._entry_point);\n        },\n        _getURI: function(w) {\n            return r(\"/ajax/gifts/send\").addQueryData({\n                gift_occasion: this.props.contextArgs.giftoccasion,\n                recipient_id: this.props.recipient.id,\n                entry_point: this._entry_point,\n                product_id: w\n            });\n        },\n        _requestClose: function() {\n            var w = r(\"/ajax/gifts/moments/close/\");\n            new g().setMethod(\"POST\").setReadOnly(false).setURI(w).setData({\n                action: \"hide\",\n                data: JSON.stringify({\n                    type: \"detected_moment\",\n                    friend_id: this.props.recipient.id,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                })\n            }).send();\n        }\n    });\n    e.exports = v;\n});\n__d(\"UFILikeSentenceText.react\", [\"HovercardLinkInterpolator\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"TextWithEntities.react\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"HovercardLinkInterpolator\"), h = b(\"ProfileBrowserLink\"), i = b(\"ProfileBrowserTypes\"), j = b(\"React\"), k = b(\"TextWithEntities.react\"), l = b(\"URI\");\n    function m(p, q, r, s) {\n        if ((s.count != null)) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            };\n            return (j.DOM.a({\n                href: h.constructPageURI(t, u).toString(),\n                target: \"_blank\"\n            }, r));\n        }\n         else return g(r, s, \"_blank\", null, \"ufi\")\n    ;\n    };\n    function n(p, q, r, s) {\n        if ((s.count != null)) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            }, v = [];\n            for (var w = 0; (w < q.length); w++) {\n                if (!q[w].count) {\n                    v.push(q[w].entities[0].id);\n                };\n            };\n            var x = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                comment_fbid: p.targetfbid,\n                comment_from: p.actorforpost,\n                seen_user_fbids: (v.length ? v : true)\n            });\n            return (j.DOM.a({\n                rel: \"dialog\",\n                ajaxify: h.constructDialogURI(t, u).toString(),\n                href: h.constructPageURI(t, u).toString(),\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": x.toString()\n            }, r));\n        }\n         else return g(r, s, null, null, \"ufi\")\n    ;\n    };\n    var o = j.createClass({\n        displayName: \"UFILikeSentenceText\",\n        render: function() {\n            var p = this.props.feedback, q = this.props.likeSentenceData, r;\n            if (this.props.contextArgs.embedded) {\n                r = m;\n            }\n             else r = n;\n        ;\n            r = r.bind(null, p, q.ranges);\n            return (k({\n                interpolator: r,\n                ranges: q.ranges,\n                aggregatedRanges: q.aggregatedranges,\n                text: q.text\n            }));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFILikeSentence.react\", [\"Bootloader\",\"LeftRight.react\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"UFILikeSentenceText.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"LeftRight.react\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"UFIClassNames\"), m = b(\"UFIImageBlock.react\"), n = b(\"UFILikeSentenceText.react\"), o = b(\"URI\"), p = b(\"cx\"), q = b(\"joinClasses\"), r = b(\"tx\"), s = k.createClass({\n        displayName: \"UFILikeSentence\",\n        getInitialState: function() {\n            return {\n                selectorModule: null,\n                bootloadedSelectorModule: false\n            };\n        },\n        componentWillMount: function() {\n            this._bootloadSelectorModule(this.props);\n        },\n        componentWillReceiveProps: function(t) {\n            this._bootloadSelectorModule(t);\n        },\n        _bootloadSelectorModule: function(t) {\n            if ((t.showOrderingModeSelector && !this.state.bootloadedSelectorModule)) {\n                var u = function(v) {\n                    this.setState({\n                        selectorModule: v\n                    });\n                }.bind(this);\n                if (t.contextArgs.entstream) {\n                    g.loadModules([\"UFIEntStreamOrderingModeSelector.react\",], u);\n                }\n                 else g.loadModules([\"UFIOrderingModeSelector.react\",], u);\n            ;\n                this.setState({\n                    bootloadedSelectorModule: true\n                });\n            }\n        ;\n        },\n        render: function() {\n            var t = this.props.feedback, u = t.likesentences.current, v = this.props.contextArgs.entstream, w = q(l.ROW, (t.likesentences.isunseen ? l.UNSEEN_ITEM : \"\"), ((((\"UFILikeSentence\") + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), x = null, y = null;\n            if (u.text) {\n                y = k.DOM.div({\n                    className: \"UFILikeSentenceText\"\n                }, n({\n                    contextArgs: this.props.contextArgs,\n                    feedback: t,\n                    likeSentenceData: u\n                }));\n            };\n            if ((y && !v)) {\n                x = k.DOM.i({\n                    className: \"UFILikeIcon\"\n                });\n                if ((t.viewercanlike && !t.hasviewerliked)) {\n                    x = k.DOM.a({\n                        className: \"UFILikeThumb\",\n                        href: \"#\",\n                        tabIndex: \"-1\",\n                        title: \"Like this\",\n                        onClick: this.props.onTargetLikeToggle\n                    }, x);\n                };\n            }\n        ;\n            var z = y, aa = null;\n            if (((t.seencount > 0) && !v)) {\n                var ba = j.GROUP_MESSAGE_VIEWERS, ca = {\n                    id: t.targetfbid\n                }, da = i.constructDialogURI(ba, ca), ea = i.constructPageURI(ba, ca), fa = new o(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: t.entidentifier,\n                    displayed_count: t.seencount\n                }), ga;\n                if (t.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((t.seencount == 1) ? \"Seen by 1\" : r._(\"Seen by {count}\", {\n                    count: t.seencount\n                }));\n            ;\n                aa = k.DOM.a({\n                    rel: \"dialog\",\n                    ajaxify: da.toString(),\n                    href: ea.toString(),\n                    tabindex: \"-1\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"left\",\n                    \"data-tooltip-uri\": fa.toString(),\n                    className: (((\"UFISeenCount\") + ((!!u.text ? (\" \" + \"UFISeenCountRight\") : \"\"))))\n                }, k.DOM.span({\n                    className: \"UFISeenCountIcon\"\n                }), ga);\n            }\n             else if ((this.props.showOrderingModeSelector && this.state.selectorModule)) {\n                var ha = this.state.selectorModule;\n                aa = ha({\n                    currentOrderingMode: this.props.orderingMode,\n                    entstream: v,\n                    orderingmodes: t.orderingmodes,\n                    onOrderChanged: this.props.onOrderingModeChange\n                });\n                if (!z) {\n                    z = k.DOM.div(null);\n                };\n            }\n            \n        ;\n            var ia = null;\n            if ((x && y)) {\n                ia = m(null, x, y, aa);\n            }\n             else if (z) {\n                ia = h(null, z, aa);\n            }\n             else ia = aa;\n            \n        ;\n            return (k.DOM.li({\n                className: w\n            }, ia));\n        }\n    });\n    e.exports = s;\n});\n__d(\"UFIPager.react\", [\"LeftRight.react\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"UFIPager\",\n        onPagerClick: function(n) {\n            ((!this.props.isLoading && this.props.onPagerClick) && this.props.onPagerClick());\n            n.nativeEvent.prevent();\n        },\n        render: function() {\n            var n = this.onPagerClick, o = ((this.props.isLoading ? \"ufiPagerLoading\" : \"\")), p = l(i.ROW, (this.props.isUnseen ? i.UNSEEN_ITEM : \"\"), ((((((\"UFIPagerRow\") + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), q = h.DOM.a({\n                className: \"UFIPagerLink\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }, h.DOM.span({\n                className: o\n            }, this.props.pagerLabel)), r = (((\"fcg\") + ((\" \" + \"UFIPagerCount\")))), s = h.DOM.span({\n                className: r\n            }, this.props.countSentence), t;\n            if (this.props.contextArgs.entstream) {\n                t = (g({\n                    direction: g.DIRECTION.right\n                }, q, s));\n            }\n             else t = (j(null, h.DOM.a({\n                className: \"UFIPagerIcon\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }), q, s));\n        ;\n            return (h.DOM.li({\n                className: p,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, t));\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFIReplySocialSentence.react\", [\"LiveTimer\",\"React\",\"Timestamp.react\",\"UFIClassNames\",\"UFIConstants\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = b(\"Timestamp.react\"), j = b(\"UFIClassNames\"), k = b(\"UFIConstants\"), l = b(\"UFIImageBlock.react\"), m = b(\"cx\"), n = b(\"joinClasses\"), o = b(\"tx\"), p = \" \\u00b7 \", q = 43200, r = h.createClass({\n        displayName: \"UFIReplySocialSentence\",\n        render: function() {\n            var s = ((this.props.isLoading ? \"UFIReplySocialSentenceLoading\" : \"\")), t = n(j.ROW, ((((\"UFIReplySocialSentenceRow\") + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), u, v;\n            if (this.props.isExpanded) {\n                u = ((this.props.replies > 1) ? o._(\"Hide {count} Replies\", {\n                    count: this.props.replies\n                }) : \"Hide 1 Reply\");\n            }\n             else {\n                u = ((this.props.replies > 1) ? o._(\"{count} Replies\", {\n                    count: this.props.replies\n                }) : \"1 Reply\");\n                if (this.props.timestamp) {\n                    var w = ((g.getApproximateServerTime() / 1000) - this.props.timestamp.time);\n                    if (((w < q) || (this.props.orderingMode == k.UFICommentOrderingMode.RECENT_ACTIVITY))) {\n                        v = h.DOM.span({\n                            className: \"fcg\"\n                        }, p, i({\n                            time: this.props.timestamp.time,\n                            text: this.props.timestamp.text,\n                            verbose: this.props.timestamp.verbose\n                        }));\n                    };\n                }\n            ;\n            }\n        ;\n            var x = Object.keys(this.props.authors), y = (x.length && !this.props.isExpanded), z, aa;\n            if (y) {\n                var ba = this.props.authors[x[0]];\n                z = h.DOM.img({\n                    alt: \"\",\n                    src: ba.thumbSrc,\n                    className: j.ACTOR_IMAGE\n                });\n                aa = [o._(\"{author} replied\", {\n                    author: ba.name\n                }),p,u,];\n            }\n             else {\n                z = h.DOM.i({\n                    className: ((((!this.props.isExpanded ? \"UFIPagerIcon\" : \"\")) + ((this.props.isExpanded ? (\" \" + \"UFICollapseIcon\") : \"\"))))\n                });\n                aa = u;\n            }\n        ;\n            return (h.DOM.li({\n                className: t,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, h.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, l(null, h.DOM.div({\n                className: ((y ? \"UFIReplyActorPhotoWrapper\" : \"\"))\n            }, z), h.DOM.span({\n                className: s\n            }, h.DOM.span({\n                className: \"UFIReplySocialSentenceLinkText\"\n            }, aa), v)))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"UFIShareRow.react\", [\"NumberFormat\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"joinClasses\"), n = b(\"tx\"), o = h.createClass({\n        displayName: \"UFIShareRow\",\n        render: function() {\n            var p = new k(\"/ajax/shares/view\").setQueryData({\n                target_fbid: this.props.targetID\n            }), q = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                id: this.props.targetID\n            }), r;\n            if ((this.props.shareCount > 1)) {\n                var s = g.formatIntegerWithDelimiter(this.props.shareCount, (this.props.contextArgs.numberdelimiter || \",\"));\n                r = n._(\"{count} shares\", {\n                    count: s\n                });\n            }\n             else r = \"1 share\";\n        ;\n            var t = m(i.ROW, ((((this.props.isFirstComponent ? \"UFIFirstComponent\" : \"\")) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\")))));\n            return (h.DOM.li({\n                className: t\n            }, j(null, h.DOM.a({\n                className: \"UFIShareIcon\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }), h.DOM.a({\n                className: \"UFIShareLink\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }, r))));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFISpamPlaceholder.react\", [\"React\",\"UFIClassNames\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"tx\"), k = g.createClass({\n        displayName: \"UFISpamPlaceholder\",\n        render: function() {\n            var l = (((\"UFISpamCommentWrapper\") + ((this.props.isLoading ? (\" \" + \"UFISpamCommentLoading\") : \"\"))));\n            return (g.DOM.li({\n                className: h.ROW\n            }, g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                className: \"UFISpamCommentLink\",\n                onClick: this.props.onClick\n            }, g.DOM.span({\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"aria-label\": j._(\"{count} hidden\", {\n                    count: this.props.numHidden\n                }),\n                className: l\n            }, g.DOM.i({\n                className: \"placeholderIcon\"\n            })))));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFI.react\", [\"NumberFormat\",\"React\",\"LegacyScrollableArea.react\",\"TrackingNodes\",\"UFIAddCommentController\",\"UFIAddCommentLink.react\",\"UFIComment.react\",\"UFIConstants\",\"UFIContainer.react\",\"UFIGiftSentence.react\",\"UFIInstanceState\",\"UFILikeSentence.react\",\"UFIPager.react\",\"UFIReplySocialSentence.react\",\"UFIShareRow.react\",\"UFISpamPlaceholder.react\",\"copyProperties\",\"isEmpty\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"LegacyScrollableArea.react\"), j = b(\"TrackingNodes\"), k = b(\"UFIAddCommentController\"), l = b(\"UFIAddCommentLink.react\"), m = b(\"UFIComment.react\"), n = b(\"UFIConstants\"), o = b(\"UFIContainer.react\"), p = b(\"UFIGiftSentence.react\"), q = b(\"UFIInstanceState\"), r = b(\"UFILikeSentence.react\"), s = b(\"UFIPager.react\"), t = b(\"UFIReplySocialSentence.react\"), u = b(\"UFIShareRow.react\"), v = b(\"UFISpamPlaceholder.react\"), w = b(\"copyProperties\"), x = b(\"isEmpty\"), y = b(\"tx\"), z = h.createClass({\n        displayName: \"UFI\",\n        getInitialState: function() {\n            return {\n                requestRanges: w({\n                }, this.props.availableRanges),\n                instanceShowRepliesMap: {\n                },\n                instanceShowReplySocialSentenceMap: {\n                },\n                loadingSpamIDs: {\n                },\n                isActiveLoading: false,\n                hasPagedToplevel: false\n            };\n        },\n        componentWillReceiveProps: function(aa) {\n            if (this.state.isActiveLoading) {\n                var ba = this.props.availableRanges[this.props.id], ca = aa.availableRanges[this.props.id];\n                if (((ba.offset != ca.offset) || (ba.length != ca.length))) {\n                    var da = (((ca.offset < ba.offset)) ? 0 : ba.length);\n                    if ((da < aa.availableComments.length)) {\n                        var ea = aa.availableComments[da].ufiinstanceid;\n                        q.updateState(ea, \"autofocus\", true);\n                    }\n                ;\n                }\n            ;\n                this.setState({\n                    isActiveLoading: false\n                });\n            }\n        ;\n            if ((aa.orderingMode != this.props.orderingMode)) {\n                this.setState({\n                    requestRanges: w({\n                    }, aa.availableRanges)\n                });\n            };\n        },\n        render: function() {\n            var aa = this.props, ba = aa.feedback, ca = aa.contextArgs, da = (aa.source != n.UFIFeedbackSourceType.ADS), ea = (ba.orderingmodes && (aa.commentCounts[aa.id] >= n.minCommentsForOrderingModeSelector)), fa = ((((!x(ba.likesentences.current) || (((ba.seencount > 0) && !ca.entstream))) || ea)) && da), ga = null;\n            if (fa) {\n                ga = r({\n                    contextArgs: ca,\n                    feedback: ba,\n                    onTargetLikeToggle: aa.onTargetLikeToggle,\n                    onOrderingModeChange: aa.onOrderingModeChange,\n                    orderingMode: aa.orderingMode,\n                    showOrderingModeSelector: ea\n                });\n            };\n            var ha = null;\n            if ((aa.feedback.hasviewerliked && this._shouldShowGiftSentence())) {\n                ha = p({\n                    contextArgs: ca,\n                    recipient: aa.giftRecipient,\n                    sender: aa.authorProfiles[ba.actorforpost],\n                    giftdata: aa.feedback.giftdata\n                });\n            };\n            var ia = ((aa.availableComments && aa.availableComments.length) && da), ja = null;\n            if (ia) {\n                ja = this.renderCommentMap(aa.availableComments, aa.availableRanges[aa.id].offset);\n            };\n            var ka = null, la = ba.cancomment, ma = ((la && ca.showaddcomment) && ba.actorforpost);\n            if (ma) {\n                var na = new k(null, aa.id, null, ca), oa = aa.authorProfiles[ba.actorforpost];\n                ka = na.renderAddComment(oa, ba.mentionsdatasource, ba.showsendonentertip, \"toplevelcomposer\", null, ba.allowphotoattachments, ba.subtitle);\n            }\n        ;\n            var pa = null, qa = ((ca.showshares && ba.sharecount) && da);\n            if ((qa && !ca.entstream)) {\n                pa = u({\n                    targetID: ba.targetfbid,\n                    shareCount: ba.sharecount,\n                    contextArgs: ca\n                });\n            };\n            var ra = (((fa || qa) || ia) || la), sa = this.renderPagers();\n            this.applyToUFIComponents([sa.topPager,], ja, [sa.bottomPager,], {\n                isFirstCommentComponent: true\n            }, {\n                isLastCommentComponent: true\n            });\n            var ta = (ba.commentboxhoisted ? ka : null), ua = (ba.commentboxhoisted ? null : ka), va = null;\n            if (((ma && ba.hasaddcommentlink) && this.state.hasPagedToplevel)) {\n                va = l({\n                    onClick: this.onComment\n                });\n            };\n            this.applyToUFIComponents([ga,pa,ta,sa.topPager,], ja, [sa.bottomPager,ua,va,], {\n                isFirstComponent: true\n            }, {\n                isLastComponent: true\n            });\n            var wa = [sa.topPager,ja,sa.bottomPager,];\n            if ((ca.scrollcomments && ca.scrollwidth)) {\n                wa = h.DOM.li(null, i({\n                    width: ca.scrollwidth\n                }, h.DOM.ul(null, wa)));\n            };\n            return (o({\n                hasNub: (ca.shownub && ra)\n            }, ga, ha, pa, ta, wa, ua, va));\n        },\n        applyToUFIComponents: function(aa, ba, ca, da, ea) {\n            var fa = Object.keys((ba || {\n            })).map(function(ha) {\n                return ba[ha];\n            }), ga = [].concat(aa, fa, ca);\n            this._applyToFirstComponent(ga, da);\n            ga.reverse();\n            this._applyToFirstComponent(ga, ea);\n        },\n        _applyToFirstComponent: function(aa, ba) {\n            for (var ca = 0; (ca < ((aa || [])).length); ca++) {\n                if (aa[ca]) {\n                    w(aa[ca].props, ba);\n                    return;\n                }\n            ;\n            };\n        },\n        renderCommentMap: function(aa, ba) {\n            var ca = this.props, da = {\n            }, ea = aa.length;\n            if (!ea) {\n                return da\n            };\n            var fa = aa[0].parentcommentid, ga = [], ha = function() {\n                if ((ga.length > 0)) {\n                    var qa = function(ra, sa) {\n                        this.state.loadingSpamIDs[ra[0]] = true;\n                        this.forceUpdate();\n                        ca.onSpamFetch(ra, sa);\n                    }.bind(this, ga, fa);\n                    da[(\"spam\" + ga[0])] = v({\n                        onClick: qa,\n                        numHidden: ga.length,\n                        isLoading: !!this.state.loadingSpamIDs[ga[0]]\n                    });\n                    ga = [];\n                }\n            ;\n            }.bind(this), ia = ca.instanceid, ja = q.getKeyForInstance(ia, \"editcommentid\"), ka = !!aa[0].parentcommentid, la = false;\n            for (var ma = 0; (ma < ea); ma++) {\n                if ((aa[ma].status == n.UFIStatus.SPAM)) {\n                    ga.push(aa[ma].id);\n                }\n                 else {\n                    ha();\n                    var na = Math.max(((ca.loggingOffset - ma) - ba), 0), oa = aa[ma], pa;\n                    if ((oa.id == ja)) {\n                        pa = this.renderEditCommentBox(oa);\n                    }\n                     else {\n                        pa = this.renderComment(oa, na);\n                        pa.props.isFirst = (ma === 0);\n                        pa.props.isLast = (ma === (ea - 1));\n                        if (!ka) {\n                            pa.props.showReplyLink = true;\n                        };\n                    }\n                ;\n                    da[(\"comment\" + oa.id)] = pa;\n                    if (((((ca.feedback.actorforpost === oa.author) && !la) && !ca.feedback.hasviewerliked) && this._shouldShowGiftSentence())) {\n                        da[(\"gift\" + oa.id)] = p({\n                            contextArgs: ca.contextArgs,\n                            recipient: ca.giftRecipient,\n                            sender: ca.authorProfiles[ca.feedback.actorforpost],\n                            giftdata: ca.feedback.giftdata\n                        });\n                        la = true;\n                    }\n                ;\n                    if ((oa.status !== n.UFIStatus.DELETED)) {\n                        da[(\"replies\" + oa.id)] = this.renderReplyContainer(oa);\n                    };\n                }\n            ;\n            };\n            ha();\n            return da;\n        },\n        _shouldShowGiftSentence: function() {\n            var aa = this.props;\n            return (aa.contextArgs.giftoccasion && !aa.contextArgs.entstream);\n        },\n        renderReplyContainer: function(aa) {\n            var ba = this.props, ca = {\n            };\n            for (var da = 0; (da < ((aa.replyauthors || [])).length); da++) {\n                var ea = ba.authorProfiles[aa.replyauthors[da]];\n                if (ea) {\n                    ca[ea.id] = ea;\n                };\n            };\n            var fa = ((ba.repliesMap && ba.repliesMap[aa.id]) && this._shouldShowCommentReplies(aa.id)), ga, ha = Math.max((aa.replycount - aa.spamreplycount), 0);\n            if ((ha && this._shouldShowReplySocialSentence(aa.id))) {\n                var ia = (this._shouldShowCommentReplies(aa.id) && ((this.isLoadingPrev(aa.id) || this.isLoadingNext(aa.id))));\n                ga = t({\n                    authors: ca,\n                    replies: ha,\n                    timestamp: aa.recentreplytimestamp,\n                    onClick: this.onToggleReplies.bind(this, aa),\n                    isLoading: ia,\n                    isExpanded: fa,\n                    orderingMode: this.props.orderingMode\n                });\n            }\n        ;\n            var ja, ka, la, ma;\n            if (fa) {\n                var na = this.renderPagers(aa.id);\n                ja = na.topPager;\n                la = na.bottomPager;\n                ka = this.renderCommentMap(ba.repliesMap[aa.id], ba.availableRanges[aa.id].offset);\n                var oa = Object.keys(ka);\n                for (var pa = 0; (pa < oa.length); pa++) {\n                    var qa = ka[oa[pa]];\n                    if (qa) {\n                        qa.props.hasPartialBorder = (pa !== 0);\n                    };\n                };\n                if (ba.feedback.cancomment) {\n                    var ra = false, sa = Object.keys(ka);\n                    for (var da = (sa.length - 1); (da >= 0); da--) {\n                        var ta = sa[da];\n                        if ((ta && ka[ta])) {\n                            ra = ka[ta].props.isAuthorReply;\n                            break;\n                        }\n                    ;\n                    };\n                    ma = this.renderReplyComposer(aa, !ra);\n                }\n            ;\n            }\n        ;\n            var ua;\n            if (((((ga || ja) || ka) || la) || ma)) {\n                this.applyToUFIComponents([ga,ja,], ka, [la,ma,], {\n                    isFirstComponent: true\n                }, {\n                    isLastComponent: true\n                });\n                var va = (aa.status === n.UFIStatus.LIVE_DELETED);\n                ua = o({\n                    isParentLiveDeleted: va,\n                    isReplyList: true\n                }, ga, ja, ka, la, ma);\n            }\n        ;\n            return ua;\n        },\n        renderReplyComposer: function(aa, ba) {\n            var ca = this.props;\n            return (new k(null, ca.id, aa.id, ca.contextArgs)).renderAddComment(ca.authorProfiles[ca.feedback.actorforpost], ca.feedback.mentionsdatasource, false, (\"replycomposer-\" + aa.id), ba, ca.feedback.allowphotoattachments);\n        },\n        renderEditCommentBox: function(aa) {\n            var ba = new k(null, this.props.id, null, {\n            }), ca = ba.renderEditComment(this.props.authorProfiles[this.props.feedback.actorforpost], aa.id, this.props.feedback.mentionsdatasource, this.props.onEditAttempt.bind(null, aa), this.props.onCancelEdit, this.props.feedback.allowphotoattachments);\n            return ca;\n        },\n        _shouldShowCommentReplies: function(aa) {\n            if ((aa in this.state.instanceShowRepliesMap)) {\n                return this.state.instanceShowRepliesMap[aa];\n            }\n             else if ((aa in this.props.showRepliesMap)) {\n                return this.props.showRepliesMap[aa]\n            }\n        ;\n            return false;\n        },\n        _shouldShowReplySocialSentence: function(aa) {\n            if ((aa in this.state.instanceShowReplySocialSentenceMap)) {\n                return this.state.instanceShowReplySocialSentenceMap[aa];\n            }\n             else if ((aa in this.props.showReplySocialSentenceMap)) {\n                return this.props.showReplySocialSentenceMap[aa]\n            }\n        ;\n            return false;\n        },\n        renderComment: function(aa, ba) {\n            var ca = this.props, da = ca.feedback, ea = (da.actorforpost === aa.author), fa = q.getKeyForInstance(this.props.instanceid, \"locallycomposed\"), ga = (aa.islocal || (fa && fa[aa.id])), ha = (da.showremovemenu || ((da.viewerid === aa.author))), ia = ((da.canremoveall && da.isownerpage) && !ea), ja = (ca.source != n.UFIFeedbackSourceType.INTERN), ka = j.getTrackingInfo(j.types.COMMENT, ba), la = !!aa.parentcommentid, ma = this._shouldShowCommentReplies(aa.id), na = !!aa.isfeatured;\n            return (m({\n                comment: aa,\n                authorProfiles: this.props.authorProfiles,\n                viewerIsAuthor: ea,\n                feedback: da,\n                \"data-ft\": ka,\n                contextArgs: this.props.contextArgs,\n                hideAsSpamForPageAdmin: ia,\n                isLocallyComposed: ga,\n                isReply: la,\n                isFeatured: na,\n                showPermalink: ja,\n                showRemoveReportMenu: ha,\n                showReplies: ma,\n                onCommentLikeToggle: ca.onCommentLikeToggle.bind(null, aa),\n                onCommentReply: this.onCommentReply.bind(this, aa),\n                onCommentTranslate: ca.onCommentTranslate.bind(null, aa),\n                onEdit: ca.onCommentEdit.bind(null, aa),\n                onHideAsSpam: ca.onCommentHideAsSpam.bind(null, aa),\n                onInlineBan: ca.onCommentInlineBan.bind(null, aa),\n                onMarkAsNotSpam: ca.onCommentMarkAsNotSpam.bind(null, aa),\n                onOneClickRemove: ca.onCommentOneClickRemove.bind(null, aa),\n                onPreviewRemove: ca.onPreviewRemove.bind(null, aa),\n                onRemove: ca.onCommentRemove.bind(null, aa),\n                onRetrySubmit: ca.onRetrySubmit.bind(null, aa),\n                onUndoInlineBan: ca.onCommentUndoInlineBan.bind(null, aa),\n                onUndoOneClickRemove: ca.onCommentUndoOneClickRemove.bind(null, aa)\n            }));\n        },\n        _updateRepliesState: function(aa, ba, ca) {\n            var da = this.state.instanceShowRepliesMap;\n            da[aa] = ba;\n            var ea = this.state.instanceShowReplySocialSentenceMap;\n            ea[aa] = ca;\n            this.setState({\n                instanceShowRepliesMap: da,\n                instanceShowReplySocialSentenceMap: ea\n            });\n        },\n        onToggleReplies: function(aa) {\n            var ba = !this._shouldShowCommentReplies(aa.id), ca = (this._shouldShowReplySocialSentence(aa.id) && !((ba && (aa.replycount <= this.props.replySocialSentenceMaxReplies))));\n            this._updateRepliesState(aa.id, ba, ca);\n            var da = (this.state.requestRanges[aa.id].length - this.props.deletedCounts[aa.id]);\n            if ((ba && (da === 0))) {\n                var ea = this.props.commentCounts[aa.id], fa = Math.min(ea, this.props.pageSize);\n                this.onPage(aa.id, {\n                    offset: (ea - fa),\n                    length: fa\n                });\n            }\n        ;\n        },\n        onPage: function(aa, ba) {\n            var ca = this.state.requestRanges;\n            ca[aa] = ba;\n            var da = (this.state.hasPagedToplevel || (aa === this.props.id));\n            this.setState({\n                requestRanges: ca,\n                isActiveLoading: true,\n                hasPagedToplevel: da\n            });\n            this.props.onChangeRange(aa, ba);\n        },\n        isLoadingPrev: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            };\n            var ca = this.state.requestRanges[aa].offset, da = ba.availableRanges[aa].offset;\n            return (ca < da);\n        },\n        isLoadingNext: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            };\n            var ca = this.state.requestRanges[aa].offset, da = this.state.requestRanges[aa].length, ea = ba.availableRanges[aa].offset, fa = ba.availableRanges[aa].length;\n            return ((ca + da) > (ea + fa));\n        },\n        renderPagers: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            var ca = ba.availableRanges[aa].offset, da = ba.availableRanges[aa].length, ea = ba.deletedCounts[aa], fa = ba.commentCounts[aa], ga = (fa - ea), ha = (da - ea), ia = (ba.contextArgs.numberdelimiter || \",\"), ja = (aa !== ba.id), ka = {\n                topPager: null,\n                bottomPager: null\n            };\n            if ((ba.source == n.UFIFeedbackSourceType.ADS)) {\n                return ka\n            };\n            var la = this.isLoadingPrev(aa), ma = this.isLoadingNext(aa);\n            if ((da == fa)) {\n                return ka\n            };\n            var na = (((ca + da)) == fa);\n            if (((((fa < ba.pageSize) && na)) || (ha === 0))) {\n                var oa = Math.min(fa, ba.pageSize), pa = this.onPage.bind(this, aa, {\n                    offset: (fa - oa),\n                    length: oa\n                }), qa, ra;\n                if ((ha === 0)) {\n                    if ((ga == 1)) {\n                        qa = (ja ? \"View 1 reply\" : \"View 1 comment\");\n                    }\n                     else {\n                        ra = g.formatIntegerWithDelimiter(ga, ia);\n                        qa = (ja ? y._(\"View all {count} replies\", {\n                            count: ra\n                        }) : y._(\"View all {count} comments\", {\n                            count: ra\n                        }));\n                    }\n                ;\n                }\n                 else if (((ga - ha) == 1)) {\n                    qa = (ja ? \"View 1 more reply\" : \"View 1 more comment\");\n                }\n                 else {\n                    ra = g.formatIntegerWithDelimiter((ga - ha), ia);\n                    qa = (ja ? y._(\"View {count} more replies\", {\n                        count: ra\n                    }) : y._(\"View {count} more comments\", {\n                        count: ra\n                    }));\n                }\n                \n            ;\n                var sa = j.getTrackingInfo(j.types.VIEW_ALL_COMMENTS), ta = s({\n                    contextArgs: ba.contextArgs,\n                    isUnseen: ba.feedback.hasunseencollapsed,\n                    isLoading: la,\n                    pagerLabel: qa,\n                    onPagerClick: pa,\n                    \"data-ft\": sa\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.bottomPager = ta;\n                }\n                 else ka.topPager = ta;\n            ;\n                return ka;\n            }\n        ;\n            if ((ca > 0)) {\n                var ua = Math.max((ca - ba.pageSize), 0), oa = ((ca + da) - ua), va = this.onPage.bind(this, aa, {\n                    offset: ua,\n                    length: oa\n                }), wa = g.formatIntegerWithDelimiter(ha, ia), xa = g.formatIntegerWithDelimiter(ga, ia), ya = y._(\"{countshown} of {totalcount}\", {\n                    countshown: wa,\n                    totalcount: xa\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: \"View more comments\",\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n                 else {\n                    var za = (ja ? \"View previous replies\" : \"View previous comments\");\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: za,\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n            ;\n            }\n        ;\n            if (((ca + da) < fa)) {\n                var ab = Math.min((da + ba.pageSize), (fa - ca)), bb = this.onPage.bind(this, aa, {\n                    offset: ca,\n                    length: ab\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: \"View previous comments\",\n                        onPagerClick: bb\n                    });\n                }\n                 else {\n                    var cb = (ja ? \"View more replies\" : \"View more comments\");\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: cb,\n                        onPagerClick: bb\n                    });\n                }\n            ;\n            }\n        ;\n            return ka;\n        },\n        onCommentReply: function(aa) {\n            var ba = (aa.parentcommentid || aa.id);\n            if (!this._shouldShowCommentReplies(ba)) {\n                this.onToggleReplies(aa);\n            };\n            if ((this.refs && this.refs[(\"replycomposer-\" + ba)])) {\n                this.refs[(\"replycomposer-\" + ba)].focus();\n            };\n        },\n        onComment: function() {\n            if ((this.refs && this.refs.toplevelcomposer)) {\n                this.refs.toplevelcomposer.focus();\n            };\n        }\n    });\n    e.exports = z;\n});\n__d(\"UFIController\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"ImmutableObject\",\"LayerRemoveOnHide\",\"LiveTimer\",\"Parent\",\"React\",\"ReactMount\",\"ShortProfiles\",\"UFI.react\",\"UFIActionLinkController\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",\"URI\",\"copyProperties\",\"isEmpty\",\"tx\",\"UFICommentTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"ImmutableObject\"), m = b(\"LayerRemoveOnHide\"), n = b(\"LiveTimer\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"ReactMount\"), r = b(\"ShortProfiles\"), s = b(\"UFI.react\"), t = b(\"UFIActionLinkController\"), u = b(\"UFICentralUpdates\"), v = b(\"UFIComments\"), w = b(\"UFIConstants\"), x = b(\"UFIFeedbackTargets\"), y = b(\"UFIInstanceState\"), z = b(\"UFIUserActions\"), aa = b(\"URI\"), ba = b(\"copyProperties\"), ca = b(\"isEmpty\"), da = b(\"tx\"), ea = b(\"UFICommentTemplates\"), fa = function(ia, ja, ka, la) {\n        var ma = ((ia.offset + ia.length) === ja);\n        return {\n            offset: ia.offset,\n            length: (((ma && ga(la))) ? (ka - ia.offset) : ia.length)\n        };\n    }, ga = function(ia) {\n        return ((ia == w.UFIPayloadSourceType.USER_ACTION) || (ia == w.UFIPayloadSourceType.LIVE_SEND));\n    };\n    function ha(ia, ja, ka) {\n        this.root = ia;\n        this.id = ja.ftentidentifier;\n        this.source = ja.source;\n        this._ufiInstanceID = ja.instanceid;\n        this._contextArgs = ja;\n        this._contextArgs.rootid = this.root.id;\n        this._verifiedCommentsExpanded = false;\n        var la = ka.feedbacktargets[0];\n        this.actionLink = new t(ia, this._contextArgs, la);\n        this.orderingMode = la.defaultcommentorderingmode;\n        var ma = ka.commentlists.comments[this.id][this.orderingMode];\n        this.replyRanges = {\n        };\n        this.repliesMap = {\n        };\n        this.showRepliesMap = {\n        };\n        this.showReplySocialSentenceMap = {\n        };\n        this.commentcounts = {\n        };\n        this.commentcounts[this.id] = v.getCommentCount(this.id);\n        var na = {\n        }, oa = (la.orderingmodes || [{\n            value: this.orderingMode\n        },]);\n        oa.forEach(function(sa) {\n            na[sa.value] = ba({\n            }, ma.range);\n        });\n        this.ranges = na;\n        if (ka.commentlists.replies) {\n            for (var pa = 0; (pa < ma.values.length); pa++) {\n                var qa = ma.values[pa], ra = ka.commentlists.replies[qa];\n                if (ra) {\n                    this.commentcounts[qa] = v.getCommentCount(qa);\n                    this.replyRanges[qa] = ba({\n                    }, ra.range);\n                }\n            ;\n            }\n        };\n        this._loggingOffset = null;\n        this._ufi = null;\n        this.ufiCentralUpdatesSubscriptions = [u.subscribe(\"feedback-updated\", function(sa, ta) {\n            var ua = ta.updates, va = ta.payloadSource;\n            if (((va != w.UFIPayloadSourceType.COLLAPSED_UFI) && (this.id in ua))) {\n                this.fetchAndUpdate(this.render.bind(this), va);\n            };\n        }.bind(this)),u.subscribe(\"feedback-id-changed\", function(sa, ta) {\n            var ua = ta.updates;\n            if ((this.id in ua)) {\n                this.id = ua[this.id];\n            };\n        }.bind(this)),u.subscribe(\"instance-updated\", function(sa, ta) {\n            var ua = ta.updates;\n            if ((this._ufiInstanceID in ua)) {\n                var va = ua[this._ufiInstanceID];\n                if (va.editcommentid) {\n                    this.render(ta.payloadSource);\n                };\n            }\n        ;\n        }.bind(this)),u.subscribe(\"update-comment-lists\", function(sa, ta) {\n            if ((ta.commentlists && ta.commentlists.replies)) {\n                var ua = ta.commentlists.replies;\n                for (var va in ua) {\n                    if (((((this.id != va) && ua[va]) && (ua[va].ftentidentifier == this.id)) && !this.replyRanges[va])) {\n                        this.replyRanges[va] = ua[va].range;\n                    };\n                };\n            }\n        ;\n        }.bind(this)),];\n        this.clearPageletSubscription = g.subscribe(\"pagelet/destroy\", this.onPageletDestroy.bind(this));\n        this.clearPageSubscription = g.subscribe(\"ufi/page_cleared\", this._onDestroy.bind(this));\n        u.handleUpdate(w.UFIPayloadSourceType.INITIAL_SERVER, ka);\n        if (this._contextArgs.viewas) {\n            this.viewasUFICleanSubscription = g.subscribe(\"pre_page_transition\", function(sa, ta) {\n                if ((this._contextArgs.viewas !== aa(ta.to).getQueryData(\"viewas\"))) {\n                    v.resetFeedbackTarget(this.id);\n                };\n            }.bind(this));\n        };\n        h.loadModules([\"ScrollAwareDOM\",], function(sa) {\n            q.scrollMonitor = sa.monitor;\n        });\n    };\n    ba(ha.prototype, {\n        _getParentForm: function() {\n            if (!this._form) {\n                this._form = o.byTag(this.root, \"form\");\n            };\n            return this._form;\n        },\n        _onTargetLikeToggle: function(event) {\n            var ia = !this.feedback.hasviewerliked;\n            z.changeLike(this.id, ia, {\n                source: this.source,\n                target: event.target,\n                rootid: this._contextArgs.rootid\n            });\n            event.preventDefault();\n        },\n        _onCommentLikeToggle: function(ia, event) {\n            var ja = !ia.hasviewerliked;\n            z.changeCommentLike(ia.id, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentEdit: function(ia) {\n            y.updateState(this._ufiInstanceID, \"isediting\", true);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", ia.id);\n        },\n        _onEditAttempt: function(ia, ja, event) {\n            if ((!ja.visibleValue && !ja.attachedPhoto)) {\n                this._onCommentRemove(ia, event);\n            }\n             else z.editComment(ia.id, ja.visibleValue, ja.encodedValue, {\n                source: this._contextArgs.source,\n                target: event.target,\n                attachedPhoto: ja.attachedPhoto\n            });\n        ;\n            y.updateStateField(this._ufiInstanceID, \"locallycomposed\", ia.id, true);\n            this._onEditReset();\n        },\n        _onEditReset: function() {\n            y.updateState(this._ufiInstanceID, \"isediting\", false);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", null);\n        },\n        _onCommentRemove: function(ia, event) {\n            var ja = ea[\":fb:ufi:hide-dialog-template\"].build();\n            j.setContent(ja.getNode(\"body\"), \"Are you sure you want to delete this comment?\");\n            j.setContent(ja.getNode(\"title\"), \"Delete Comment\");\n            h.loadModules([\"DialogX\",], function(ka) {\n                var la = new ka({\n                    modal: true,\n                    width: 465,\n                    addedBehaviors: [m,]\n                }, ja.getRoot());\n                la.subscribe(\"confirm\", function() {\n                    z.removeComment(ia.id, {\n                        source: this.source,\n                        oneclick: false,\n                        target: event.target,\n                        timelinelogdata: this._contextArgs.timelinelogdata\n                    });\n                    la.hide();\n                }.bind(this));\n                la.show();\n            }.bind(this));\n        },\n        _onCommentOneClickRemove: function(ia, event) {\n            z.removeComment(ia.id, {\n                source: this.source,\n                oneclick: true,\n                target: event.target,\n                timelinelogdata: this._contextArgs.timelinelogdata\n            });\n        },\n        _onCommentUndoOneClickRemove: function(ia, event) {\n            var ja = ((this.feedback.canremoveall && this.feedback.isownerpage) && (this.feedback.actorforpost !== this.authorProfiles[ia.author]));\n            z.undoRemoveComment(ia.id, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentHideAsSpam: function(ia, event) {\n            z.setHideAsSpam(ia.id, true, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentMarkAsNotSpam: function(ia, event) {\n            z.setHideAsSpam(ia.id, false, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentTranslate: function(ia, event) {\n            z.translateComment(ia, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentInlineBanChange: function(ia, ja, event) {\n            z.banUser(ia, this.feedback.ownerid, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentInlineBan: function(ia, event) {\n            this._onCommentInlineBanChange(ia, true, event);\n        },\n        _onCommentUndoInlineBan: function(ia, event) {\n            this._onCommentInlineBanChange(ia, false, event);\n        },\n        _fetchSpamComments: function(ia, ja) {\n            z.fetchSpamComments(this.id, ia, ja, this._contextArgs.viewas);\n        },\n        _removePreview: function(ia, event) {\n            z.removePreview(ia, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _retrySubmit: function(ia) {\n            h.loadModules([\"UFIRetryActions\",], function(ja) {\n                ja.retrySubmit(ia, {\n                    source: this.source\n                });\n            }.bind(this));\n        },\n        _ensureCommentsExpanded: function() {\n            if (this._verifiedCommentsExpanded) {\n                return\n            };\n            var ia = o.byTag(this.root, \"form\");\n            if (ia) {\n                i.removeClass(ia, \"collapsed_comments\");\n                this._verifiedCommentsExpanded = true;\n            }\n        ;\n        },\n        render: function(ia) {\n            var ja = (this.comments.length || !ca(this.feedback.likesentences.current));\n            if ((ja && ga(ia))) {\n                this._ensureCommentsExpanded();\n            };\n            if ((this._loggingOffset === null)) {\n                this._loggingOffset = ((this.ranges[this.orderingMode].offset + this.comments.length) - 1);\n            };\n            var ka = (this.feedback.replysocialsentencemaxreplies || -1), la = {\n            };\n            la[this.id] = v.getDeletedCount(this.id);\n            this.comments.forEach(function(oa) {\n                la[oa.id] = v.getDeletedCount(oa.id);\n            });\n            var ma = ba({\n            }, this.replyRanges);\n            ma[this.id] = this.ranges[this.orderingMode];\n            ma = new l(ma);\n            var na = s({\n                feedback: this.feedback,\n                id: this.id,\n                onTargetLikeToggle: this._onTargetLikeToggle.bind(this),\n                onCommentLikeToggle: this._onCommentLikeToggle.bind(this),\n                onCommentRemove: this._onCommentRemove.bind(this),\n                onCommentHideAsSpam: this._onCommentHideAsSpam.bind(this),\n                onCommentMarkAsNotSpam: this._onCommentMarkAsNotSpam.bind(this),\n                onCommentEdit: this._onCommentEdit.bind(this),\n                onCommentOneClickRemove: this._onCommentOneClickRemove.bind(this),\n                onCommentUndoOneClickRemove: this._onCommentUndoOneClickRemove.bind(this),\n                onCommentTranslate: this._onCommentTranslate.bind(this),\n                onCommentInlineBan: this._onCommentInlineBan.bind(this),\n                onCommentUndoInlineBan: this._onCommentUndoInlineBan.bind(this),\n                onEditAttempt: this._onEditAttempt.bind(this),\n                onCancelEdit: this._onEditReset.bind(this),\n                onChangeRange: this._changeRange.bind(this),\n                onSpamFetch: this._fetchSpamComments.bind(this),\n                onPreviewRemove: this._removePreview.bind(this),\n                onRetrySubmit: this._retrySubmit.bind(this),\n                onOrderingModeChange: this._onOrderingModeChange.bind(this),\n                contextArgs: this._contextArgs,\n                repliesMap: this.repliesMap,\n                showRepliesMap: this.showRepliesMap,\n                showReplySocialSentenceMap: this.showReplySocialSentenceMap,\n                commentCounts: this.commentcounts,\n                deletedCounts: la,\n                availableComments: this.comments,\n                source: this.source,\n                availableRanges: ma,\n                pageSize: w.defaultPageSize,\n                authorProfiles: this.authorProfiles,\n                instanceid: this._ufiInstanceID,\n                loggingOffset: this._loggingOffset,\n                replySocialSentenceMaxReplies: ka,\n                giftRecipient: this._giftRecipient,\n                orderingMode: this.orderingMode\n            });\n            this._ufi = p.renderComponent(na, this.root);\n            n.updateTimeStamps();\n            if (this._getParentForm()) {\n                g.inform(\"ufi/changed\", {\n                    form: this._getParentForm()\n                });\n            };\n            if (((ia != w.UFIPayloadSourceType.INITIAL_SERVER) && (ia != w.UFIPayloadSourceType.COLLAPSED_UFI))) {\n                g.inform(\"reflow\");\n            };\n        },\n        fetchAndUpdate: function(ia, ja) {\n            x.getFeedbackTarget(this.id, function(ka) {\n                var la = v.getCommentCount(this.id), ma = fa(this.ranges[this.orderingMode], this.commentcounts[this.id], la, ja);\n                v.getCommentsInRange(this.id, ma, this.orderingMode, this._contextArgs.viewas, function(na) {\n                    var oa = [], pa = {\n                    }, qa = {\n                    };\n                    if (ka.actorforpost) {\n                        oa.push(ka.actorforpost);\n                    };\n                    for (var ra = 0; (ra < na.length); ra++) {\n                        if (na[ra].author) {\n                            oa.push(na[ra].author);\n                        };\n                        if (na[ra].socialcontext) {\n                            oa.push(na[ra].socialcontext.topmutualid);\n                        };\n                        if ((na[ra].replyauthors && na[ra].replyauthors.length)) {\n                            for (var sa = 0; (sa < na[ra].replyauthors.length); sa++) {\n                                oa.push(na[ra].replyauthors[sa]);;\n                            }\n                        };\n                        if (ka.isthreaded) {\n                            var ta = na[ra].id, ua = v.getCommentCount(ta), va;\n                            if (this.replyRanges[ta]) {\n                                va = fa(this.replyRanges[ta], this.commentcounts[ta], ua, ja);\n                            }\n                             else va = {\n                                offset: 0,\n                                length: Math.min(ua, 2)\n                            };\n                        ;\n                            pa[ta] = va;\n                            qa[ta] = ua;\n                        }\n                    ;\n                    };\n                    v.getRepliesInRanges(this.id, pa, function(wa) {\n                        for (var xa = 0; (xa < na.length); xa++) {\n                            var ya = na[xa].id, za = (wa[ya] || []);\n                            for (var ab = 0; (ab < za.length); ab++) {\n                                if (za[ab].author) {\n                                    oa.push(za[ab].author);\n                                };\n                                if (za[ab].socialcontext) {\n                                    oa.push(za[ab].socialcontext.topmutualid);\n                                };\n                            };\n                        };\n                        if (this._contextArgs.giftoccasion) {\n                            oa.push(ka.actorid);\n                        };\n                        r.getMulti(oa, function(bb) {\n                            if (this._contextArgs.giftoccasion) {\n                                this._giftRecipient = bb[ka.actorid];\n                            };\n                            this.authorProfiles = bb;\n                            this.feedback = ka;\n                            this.commentcounts[this.id] = la;\n                            this.comments = na;\n                            this.ranges[this.orderingMode] = ma;\n                            for (var cb = 0; (cb < na.length); cb++) {\n                                var db = na[cb].id, eb = pa[db];\n                                this.repliesMap[db] = wa[db];\n                                this.replyRanges[db] = eb;\n                                this.commentcounts[db] = qa[db];\n                                this.showRepliesMap[db] = (eb && (eb.length > 0));\n                                if (((this.showReplySocialSentenceMap[db] === undefined) && (qa[db] > 0))) {\n                                    this.showReplySocialSentenceMap[db] = !this.showRepliesMap[db];\n                                };\n                            };\n                            ia(ja);\n                            if ((ja == w.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)) {\n                                g.inform(\"CommentUFI.Pager\");\n                            };\n                        }.bind(this));\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n        },\n        _changeRange: function(ia, ja) {\n            if ((ia == this.id)) {\n                this.ranges[this.orderingMode] = ja;\n            }\n             else this.replyRanges[ia] = ja;\n        ;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        },\n        onPageletDestroy: function(ia, ja) {\n            if (k.contains(ja.root, this.root)) {\n                this._onDestroy();\n            };\n        },\n        _onDestroy: function() {\n            p.unmountAndReleaseReactRootNode(this.root);\n            this.ufiCentralUpdatesSubscriptions.forEach(u.unsubscribe.bind(u));\n            g.unsubscribe(this.clearPageletSubscription);\n            g.unsubscribe(this.clearPageSubscription);\n            (this.viewasUFICleanSubscription && g.unsubscribe(this.viewasUFICleanSubscription));\n        },\n        _onOrderingModeChange: function(ia) {\n            this.orderingMode = ia;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        }\n    });\n    e.exports = ha;\n});\n__d(\"Ease\", [], function(a, b, c, d, e, f) {\n    var g = {\n        makePowerOut: function(h) {\n            return function(i) {\n                var j = (1 - Math.pow((1 - i), h));\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        makePowerIn: function(h) {\n            return function(i) {\n                var j = Math.pow(i, h);\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        makePowerInOut: function(h) {\n            return function(i) {\n                var j = ((((i *= 2) < 1)) ? (Math.pow(i, h) * 239723) : (1 - (Math.abs(Math.pow((2 - i), h)) * 239754)));\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        sineOut: function(h) {\n            return Math.sin(((h * Math.PI) * 239832));\n        },\n        sineIn: function(h) {\n            return (1 - Math.cos(((h * Math.PI) * 239885)));\n        },\n        sineInOut: function(h) {\n            return (-239921 * ((Math.cos((Math.PI * h)) - 1)));\n        },\n        circOut: function(h) {\n            return Math.sqrt((1 - ((--h) * h)));\n        },\n        circIn: function(h) {\n            return -((Math.sqrt((1 - (h * h))) - 1));\n        },\n        circInOut: function(h) {\n            return ((((h *= 2) < 1)) ? (-240091 * ((Math.sqrt((1 - (h * h))) - 1))) : (240115 * ((Math.sqrt((1 - ((h -= 2) * h))) + 1))));\n        },\n        bounceOut: function(h) {\n            if ((h < (1 / 2.75))) {\n                return (((7.5625 * h) * h));\n            }\n             else if ((h < (2 / 2.75))) {\n                return ((((7.5625 * (h -= (1.5 / 2.75))) * h) + 240251));\n            }\n             else if ((h < (2.5 / 2.75))) {\n                return ((((7.5625 * (h -= (2.25 / 2.75))) * h) + 240309));\n            }\n             else return ((((7.5625 * (h -= (2.625 / 2.75))) * h) + 240355))\n            \n            \n        ;\n        },\n        bounceIn: function(h) {\n            return (1 - g.bounceOut((1 - h)));\n        },\n        bounceInOut: function(h) {\n            return (((h < 240449)) ? (g.bounceIn((h * 2)) * 240469) : ((g.bounceOut(((h * 2) - 1)) * 240491) + 240494));\n        },\n        _makeBouncy: function(h) {\n            h = (h || 1);\n            return function(i) {\n                i = (((((1 - Math.cos(((i * Math.PI) * h)))) * ((1 - i)))) + i);\n                return ((i <= 1) ? i : (2 - i));\n            };\n        },\n        makeBounceOut: function(h) {\n            return this._makeBouncy(h);\n        },\n        makeBounceIn: function(h) {\n            var i = this._makeBouncy(h);\n            return function(j) {\n                return (1 - i((1 - j)));\n            };\n        },\n        makeElasticOut: function(h, i) {\n            ((h < 1) && (h = 1));\n            var j = (Math.PI * 2);\n            return function(k) {\n                if (((k === 0) || (k === 1))) {\n                    return k\n                };\n                var l = ((i / j) * Math.asin((1 / h)));\n                return (((h * Math.pow(2, (-10 * k))) * Math.sin(((((k - l)) * j) / i))) + 1);\n            };\n        },\n        makeElasticIn: function(h, i) {\n            ((h < 1) && (h = 1));\n            var j = (Math.PI * 2);\n            return function(k) {\n                if (((k === 0) || (k === 1))) {\n                    return k\n                };\n                var l = ((i / j) * Math.asin((1 / h)));\n                return -(((h * Math.pow(2, (10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i))));\n            };\n        },\n        makeElasticInOut: function(h, i) {\n            ((h < 1) && (h = 1));\n            i *= 1.5;\n            var j = (Math.PI * 2);\n            return function(k) {\n                var l = ((i / j) * Math.asin((1 / h)));\n                return ((((k *= 2) < 1)) ? (((-241242 * h) * Math.pow(2, (10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i))) : (1 + (((241291 * h) * Math.pow(2, (-10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i)))));\n            };\n        },\n        makeBackOut: function(h) {\n            return function(i) {\n                return ((((--i * i) * (((((h + 1)) * i) + h))) + 1));\n            };\n        },\n        makeBackIn: function(h) {\n            return function(i) {\n                return ((i * i) * (((((h + 1)) * i) - h)));\n            };\n        },\n        makeBackInOut: function(h) {\n            h *= 1.525;\n            return function(i) {\n                return ((((i *= 2) < 1)) ? (241560 * (((i * i) * (((((h + 1)) * i) - h))))) : (241581 * (((((i -= 2) * i) * (((((h + 1)) * i) + h))) + 2))));\n            };\n        },\n        easeOutExpo: function(h) {\n            return (-Math.pow(2, (-10 * h)) + 1);\n        }\n    };\n    g.elasticOut = g.makeElasticOut(1, 241700);\n    g.elasticIn = g.makeElasticIn(1, 241734);\n    g.elasticInOut = g.makeElasticInOut(1, 241774);\n    g.backOut = g.makeBackOut(1.7);\n    g.backIn = g.makeBackIn(1.7);\n    g.backInOut = g.makeBackInOut(1.7);\n    e.exports = g;\n});\n__d(\"EntstreamCollapsedUFIActions\", [\"PopupWindow\",\"React\",\"TrackingNodes\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"PopupWindow\"), h = b(\"React\"), i = b(\"TrackingNodes\"), j = b(\"URI\"), k = b(\"cx\"), l = b(\"tx\"), m = h.createClass({\n        displayName: \"EntstreamCollapsedUFIActions\",\n        getLikeButton: function() {\n            return this.refs.likeButton.getDOMNode();\n        },\n        getLikeIcon: function() {\n            return this.refs.likeIcon.getDOMNode();\n        },\n        render: function() {\n            var n;\n            if ((this.props.shareHref !== null)) {\n                var o = i.getTrackingInfo(i.types.SHARE_LINK), p = j(this.props.shareHref), q = [h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__shareicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\"\n                }),\"Share\",];\n                if ((p.getPath().indexOf(\"/ajax\") === 0)) {\n                    n = h.DOM.a({\n                        ajaxify: this.props.shareHref,\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: \"#\",\n                        rel: \"dialog\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n                 else {\n                    var r = function() {\n                        g.open(this.props.shareHref, 480, 600);\n                        return false;\n                    }.bind(this);\n                    n = h.DOM.a({\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: this.props.shareHref,\n                        onClick: r,\n                        target: \"_blank\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n            ;\n            }\n        ;\n            var s;\n            if (this.props.canComment) {\n                var t = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commenticon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\", u = [h.DOM.i({\n                    className: t\n                }),\"Comment\",], v = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commentlink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\", w = i.getTrackingInfo(i.types.COMMENT_LINK);\n                if (this.props.storyHref) {\n                    s = h.DOM.a({\n                        className: v,\n                        \"data-ft\": w,\n                        href: this.props.storyHref,\n                        target: \"_blank\",\n                        title: \"Write a comment...\"\n                    }, u);\n                }\n                 else s = h.DOM.a({\n                    className: v,\n                    \"data-ft\": w,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick,\n                    title: \"Write a comment...\"\n                }, u);\n            ;\n            }\n        ;\n            var x;\n            if (this.props.canLike) {\n                var y = (((((this.props.hasViewerLiked ? \"-cx-PUBLIC-fbEntstreamFeedback__liked\" : \"\")) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likelink\"))) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__action\")))), z = i.getTrackingInfo((this.props.hasViewerLiked ? i.types.UNLIKE_LINK : i.types.LIKE_LINK)), aa = (this.props.hasViewerLiked ? \"Unlike this\" : \"Like this\");\n                x = h.DOM.a({\n                    className: y,\n                    \"data-ft\": z,\n                    href: \"#\",\n                    onClick: this.props.onLike,\n                    onMouseDown: this.props.onLikeMouseDown,\n                    ref: \"likeButton\",\n                    title: aa\n                }, h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likeicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\",\n                    ref: \"likeIcon\"\n                }), \"Like\", h.DOM.div({\n                    className: \"-cx-PRIVATE-fbEntstreamCollapsedUFI__likecover\"\n                }));\n            }\n        ;\n            return (h.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__icons\"\n            }, x, s, n));\n        }\n    });\n    e.exports = m;\n});\n__d(\"EntstreamCollapsedUFISentence\", [\"Bootloader\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"NumberFormat\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"URI\"), m = b(\"cx\"), n = b(\"tx\"), o = k.createClass({\n        displayName: \"EntstreamCollapsedUFISentence\",\n        _showShareDialog: function(event) {\n            event = event.nativeEvent;\n            if (event.isDefaultRequested()) {\n                return\n            };\n            g.loadModules([\"EntstreamShareOverlay\",], function(p) {\n                p.display(this.props.feedback.targetfbid, this._getShareString());\n            }.bind(this));\n            event.prevent();\n        },\n        _getShareString: function() {\n            var p = this.props.feedback.sharecount, q = (this.props.numberDelimiter || \",\");\n            if ((p === 1)) {\n                return \"1 Share\";\n            }\n             else if ((p > 1)) {\n                var r = h.formatIntegerWithDelimiter(p, q);\n                return n._(\"{count} Shares\", {\n                    count: r\n                });\n            }\n            \n        ;\n        },\n        render: function() {\n            var p = this.props.feedback, q = p.likecount, r = this.props.commentCount, s = p.sharecount, t = p.seencount, u = this.props.hasAttachedUFIExpanded, v = (this.props.numberDelimiter || \",\");\n            if (u) {\n                q = 0;\n                r = 0;\n            }\n        ;\n            if ((((!q && !r) && !s) && !t)) {\n                return k.DOM.span(null)\n            };\n            var w;\n            if ((q === 1)) {\n                w = \"1 Like\";\n            }\n             else if ((q > 1)) {\n                var x = h.formatIntegerWithDelimiter(q, v);\n                w = n._(\"{count} Likes\", {\n                    count: x\n                });\n            }\n            \n        ;\n            var y;\n            if ((r === 1)) {\n                y = \"1 Comment\";\n            }\n             else if ((r > 1)) {\n                var z = h.formatIntegerWithDelimiter(r, v);\n                y = n._(\"{count} Comments\", {\n                    count: z\n                });\n            }\n            \n        ;\n            var aa = this._getShareString(), ba, ca, da;\n            if (w) {\n                ca = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                    comment_fbid: p.targetfbid,\n                    comment_from: p.actorforpost,\n                    seen_user_fbids: true\n                });\n                var ea = (((y || aa) ? \"prm\" : \"\"));\n                ba = j.LIKES;\n                da = {\n                    id: p.targetfbid\n                };\n                var fa = i.constructDialogURI(ba, da).toString();\n                if (this.props.storyHref) {\n                    w = null;\n                }\n                 else w = k.DOM.a({\n                    ajaxify: fa,\n                    className: ea,\n                    href: i.constructPageURI(ba, da).toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    rel: \"dialog\"\n                }, w);\n            ;\n            }\n        ;\n            var ga;\n            if ((t > 0)) {\n                ba = j.GROUP_MESSAGE_VIEWERS;\n                da = {\n                    id: p.targetfbid\n                };\n                var ha = i.constructDialogURI(ba, da), ia = i.constructPageURI(ba, da);\n                ca = new l(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: p.entidentifier,\n                    displayed_count: t\n                });\n                var ja = h.formatIntegerWithDelimiter(t, v);\n                if (p.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((ja == 1) ? \"Seen by 1\" : n._(\"Seen by {count}\", {\n                    count: ja\n                }));\n            ;\n                ga = k.DOM.a({\n                    ajaxify: ha.toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    href: ia.toString(),\n                    rel: \"dialog\",\n                    tabindex: \"-1\"\n                }, ga);\n            }\n        ;\n            if (y) {\n                var ka = ((aa ? \"prm\" : \"\"));\n                if (this.props.storyHref) {\n                    y = k.DOM.a({\n                        className: ka,\n                        href: this.props.storyHref,\n                        target: \"_blank\"\n                    }, y);\n                }\n                 else y = k.DOM.a({\n                    className: ka,\n                    onClick: this.props.onCommentClick\n                }, y);\n            ;\n            }\n        ;\n            if (aa) {\n                var la = new l(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: p.targetfbid\n                });\n                if (this.props.storyHref) {\n                    aa = k.DOM.a({\n                        href: la.toString(),\n                        target: \"_blank\"\n                    }, aa);\n                }\n                 else aa = k.DOM.a({\n                    href: la.toString(),\n                    onClick: this._showShareDialog,\n                    rel: \"ignore\"\n                }, aa);\n            ;\n            }\n        ;\n            return (k.DOM.span({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentencerow\"\n            }, w, y, aa, ga));\n        }\n    });\n    e.exports = o;\n});\n__d(\"EntstreamCollapsedUFI\", [\"Event\",\"Animation\",\"BrowserSupport\",\"CSS\",\"DOM\",\"Ease\",\"EntstreamCollapsedUFIActions\",\"EntstreamCollapsedUFISentence\",\"React\",\"TrackingNodes\",\"Vector\",\"cx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Animation\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Ease\"), m = b(\"EntstreamCollapsedUFIActions\"), n = b(\"EntstreamCollapsedUFISentence\"), o = b(\"React\"), p = b(\"TrackingNodes\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"queryThenMutateDOM\"), t = 16, u = o.createClass({\n        displayName: \"EntstreamCollapsedUFI\",\n        _animate: function(v, w, x, y) {\n            if (!i.hasCSSTransforms()) {\n                return\n            };\n            var z = this.refs.icons.getLikeIcon();\n            (this._animation && this._animation.stop());\n            this._animation = new h(z).from(\"scaleX\", v).from(\"scaleY\", v).to(\"scaleX\", w).to(\"scaleY\", w).duration(x);\n            (y && this._animation.ease(y));\n            this._animation.go();\n        },\n        bounceLike: function() {\n            this._animate(1.35, 1, 750, l.bounceOut);\n        },\n        shrinkLike: function() {\n            this._animate(1, 248221, 150);\n            this._mouseUpListener = g.listen(document.body, \"mouseup\", this._onMouseUp);\n        },\n        _onMouseUp: function(event) {\n            this._mouseUpListener.remove();\n            if (!k.contains(this.refs.icons.getLikeButton(), event.getTarget())) {\n                this._animate(248442, 1, 150);\n            };\n        },\n        render: function() {\n            var v = this.props.feedback, w = p.getTrackingInfo(p.types.BLINGBOX);\n            return (o.DOM.div({\n                className: \"clearfix\"\n            }, m({\n                canLike: v.viewercanlike,\n                canComment: v.cancomment,\n                hasViewerLiked: v.hasviewerliked,\n                onCommentClick: this.props.onCommentClick,\n                onLike: this.props.onLike,\n                onLikeMouseDown: this.props.onLikeMouseDown,\n                ref: \"icons\",\n                shareHref: this.props.shareHref,\n                storyHref: this.props.storyHref\n            }), o.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentence\",\n                \"data-ft\": w,\n                ref: \"sentence\"\n            }, n({\n                commentCount: this.props.commentCount,\n                feedback: v,\n                hasAttachedUFIExpanded: this.props.hasAttachedUFIExpanded,\n                numberDelimiter: this.props.numberDelimiter,\n                onCommentClick: this.props.onCommentClick,\n                storyHref: this.props.storyHref\n            }))));\n        },\n        componentDidMount: function(v) {\n            var w = this.refs.icons.getDOMNode(), x = this.refs.sentence.getDOMNode(), y, z, aa;\n            s(function() {\n                y = q.getElementDimensions(v).x;\n                z = q.getElementDimensions(w).x;\n                aa = q.getElementDimensions(x).x;\n            }, function() {\n                if (((z + aa) > (y + t))) {\n                    j.addClass(v, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__tworow\");\n                };\n            });\n        }\n    });\n    e.exports = u;\n});\n__d(\"EntstreamCollapsedUFIController\", [\"Bootloader\",\"CommentPrelude\",\"CSS\",\"DOM\",\"EntstreamCollapsedUFI\",\"React\",\"ReactMount\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIUserActions\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"EntstreamCollapsedUFI\"), l = b(\"React\"), m = b(\"ReactMount\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIConstants\"), q = b(\"UFIFeedbackTargets\"), r = b(\"UFIUserActions\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = p.UFIPayloadSourceType;\n    function v(w, x, y) {\n        this._root = w;\n        this._id = y.ftentidentifier;\n        this._contextArgs = y;\n        this._ufiVisible = y.hasattachedufiexpanded;\n        n.subscribe(\"feedback-updated\", function(z, aa) {\n            if (((aa.payloadSource != u.INITIAL_SERVER) && (this._id in aa.updates))) {\n                this.render();\n            };\n        }.bind(this));\n        n.handleUpdate(p.UFIPayloadSourceType.COLLAPSED_UFI, x);\n        g.loadModules([\"ScrollAwareDOM\",], function(z) {\n            m.scrollMonitor = z.monitor;\n        });\n    };\n    s(v.prototype, {\n        _onLike: function(event) {\n            q.getFeedbackTarget(this._id, function(w) {\n                r.changeLike(this._id, !w.hasviewerliked, {\n                    source: this._contextArgs.source,\n                    target: event.target,\n                    rootid: j.getID(this._root)\n                });\n            }.bind(this));\n            this._ufi.bounceLike();\n            event.preventDefault();\n        },\n        _onLikeMouseDown: function(event) {\n            this._ufi.shrinkLike();\n            event.preventDefault();\n        },\n        _onCommentClick: function(event) {\n            if (!this._ufiVisible) {\n                this._ufiVisible = true;\n                i.addClass(this._root, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__hasattachedufiexpanded\");\n            }\n        ;\n            h.click(this._root);\n            event.preventDefault();\n        },\n        render: function() {\n            q.getFeedbackTarget(this._id, function(w) {\n                var x = k({\n                    commentCount: o.getCommentCount(this._id),\n                    feedback: w,\n                    hasAttachedUFIExpanded: this._contextArgs.hasattachedufiexpanded,\n                    numberDelimiter: this._contextArgs.numberdelimiter,\n                    onCommentClick: this._onCommentClick.bind(this),\n                    onLike: this._onLike.bind(this),\n                    onLikeMouseDown: this._onLikeMouseDown.bind(this),\n                    shareHref: this._contextArgs.sharehref,\n                    storyHref: this._contextArgs.storyhref\n                });\n                l.renderComponent(x, this._root);\n                this._ufi = (this._ufi || x);\n            }.bind(this));\n        }\n    });\n    e.exports = v;\n});\n__d(\"TypeaheadUtil\", [\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"repeatString\"), h = /[ ]+/g, i = /[^ ]+/g, j = /[.,+*?$|#{}()\\^\\-\\[\\]\\\\\\/!@%'\"~=<>_:;\\u30fb\\u3001\\u3002\\u3008-\\u3011\\u3014-\\u301f\\uff1a-\\uff1f\\uff01-\\uff0f\\uff3b-\\uff40\\uff5b-\\uff65\\u2E2E\\u061f\\u066a-\\u066c\\u061b\\u060c\\u060d\\uFD3e\\uFD3F\\u1801\\u0964\\u104a\\u104b\\u2010-\\u2027\\u2030-\\u205e\\u00a1-\\u00b1\\u00b4-\\u00b8\\u00ba\\u00bb\\u00bf]/g, k = {\n    }, l = {\n        a: \"\\u0430 \\u00e0 \\u00e1 \\u00e2 \\u00e3 \\u00e4 \\u00e5\",\n        b: \"\\u0431\",\n        c: \"\\u0446 \\u00e7 \\u010d\",\n        d: \"\\u0434 \\u00f0 \\u010f \\u0111\",\n        e: \"\\u044d \\u0435 \\u00e8 \\u00e9 \\u00ea \\u00eb \\u011b\",\n        f: \"\\u0444\",\n        g: \"\\u0433 \\u011f\",\n        h: \"\\u0445 \\u0127\",\n        i: \"\\u0438 \\u00ec \\u00ed \\u00ee \\u00ef \\u0131\",\n        j: \"\\u0439\",\n        k: \"\\u043a \\u0138\",\n        l: \"\\u043b \\u013e \\u013a \\u0140 \\u0142\",\n        m: \"\\u043c\",\n        n: \"\\u043d \\u00f1 \\u0148 \\u0149 \\u014b\",\n        o: \"\\u043e \\u00f8 \\u00f6 \\u00f5 \\u00f4 \\u00f3 \\u00f2\",\n        p: \"\\u043f\",\n        r: \"\\u0440 \\u0159 \\u0155\",\n        s: \"\\u0441 \\u015f \\u0161 \\u017f\",\n        t: \"\\u0442 \\u0165 \\u0167 \\u00fe\",\n        u: \"\\u0443 \\u044e \\u00fc \\u00fb \\u00fa \\u00f9 \\u016f\",\n        v: \"\\u0432\",\n        y: \"\\u044b \\u00ff \\u00fd\",\n        z: \"\\u0437 \\u017e\",\n        ae: \"\\u00e6\",\n        oe: \"\\u0153\",\n        ts: \"\\u0446\",\n        ch: \"\\u0447\",\n        ij: \"\\u0133\",\n        sh: \"\\u0448\",\n        ss: \"\\u00df\",\n        ya: \"\\u044f\"\n    };\n    for (var m in l) {\n        var n = l[m].split(\" \");\n        for (var o = 0; (o < n.length); o++) {\n            k[n[o]] = m;;\n        };\n    };\n    var p = {\n    };\n    function q(w) {\n        return (w ? w.replace(j, \" \") : \"\");\n    };\n    function r(w) {\n        w = w.toLowerCase();\n        var x = \"\", y = \"\";\n        for (var z = w.length; z--; ) {\n            y = w.charAt(z);\n            x = (((k[y] || y)) + x);\n        };\n        return x.replace(h, \" \");\n    };\n    function s(w) {\n        var x = [], y = i.exec(w);\n        while (y) {\n            y = y[0];\n            x.push(y);\n            y = i.exec(w);\n        };\n        return x;\n    };\n    function t(w, x) {\n        if (!p.hasOwnProperty(w)) {\n            var y = r(w), z = q(y);\n            p[w] = {\n                value: w,\n                flatValue: y,\n                tokens: s(z),\n                isPrefixQuery: (z && (z[(z.length - 1)] != \" \"))\n            };\n        }\n    ;\n        if ((x && (typeof p[w].sortedTokens == \"undefined\"))) {\n            p[w].sortedTokens = p[w].tokens.slice();\n            p[w].sortedTokens.sort(function(aa, ba) {\n                return (ba.length - aa.length);\n            });\n        }\n    ;\n        return p[w];\n    };\n    function u(w, x, y) {\n        var z = t(x, (w == \"prefix\")), aa = ((w == \"prefix\") ? z.sortedTokens : z.tokens), ba = t(y).tokens, ca = {\n        }, da = ((z.isPrefixQuery && (w == \"query\")) ? (aa.length - 1) : null), ea = function(fa, ga) {\n            for (var ha = 0; (ha < ba.length); ++ha) {\n                var ia = ba[ha];\n                if ((!ca[ha] && (((ia == fa) || ((((((w == \"query\") && (ga === da)) || (w == \"prefix\"))) && (ia.indexOf(fa) === 0))))))) {\n                    return (ca[ha] = true)\n                };\n            };\n            return false;\n        };\n        return Boolean((aa.length && aa.every(ea)));\n    };\n    var v = {\n        flatten: r,\n        parse: t,\n        isExactMatch: u.bind(null, \"exact\"),\n        isQueryMatch: u.bind(null, \"query\"),\n        isPrefixMatch: u.bind(null, \"prefix\")\n    };\n    e.exports = v;\n});\n__d(\"KanaUtils\", [], function(a, b, c, d, e, f) {\n    var g = 12353, h = 12436, i = 96, j = {\n        normalizeHiragana: function(k) {\n            if ((k !== null)) {\n                var l = [];\n                for (var m = 0; (m < k.length); m++) {\n                    var n = k.charCodeAt(m);\n                    if (((n < g) || (n > h))) {\n                        l.push(k.charAt(m));\n                    }\n                     else {\n                        var o = (n + i);\n                        l.push(String.fromCharCode(o));\n                    }\n                ;\n                };\n                return l.join(\"\");\n            }\n             else return null\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DataSource\", [\"ArbiterMixin\",\"AsyncRequest\",\"TypeaheadUtil\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"KanaUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"TypeaheadUtil\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\"), n = b(\"KanaUtils\");\n    function o(p) {\n        this._maxResults = (p.maxResults || 10);\n        this.token = p.token;\n        this.queryData = (p.queryData || {\n        });\n        this.queryEndpoint = (p.queryEndpoint || \"\");\n        this.bootstrapData = (p.bootstrapData || {\n        });\n        this.bootstrapEndpoint = (p.bootstrapEndpoint || \"\");\n        this._exclusions = (p.exclusions || []);\n        this._indexedFields = (p.indexedFields || [\"text\",\"tokens\",]);\n        this._titleFields = (p.titleFields || []);\n        this._alwaysPrefixMatch = (p.alwaysPrefixMatch || false);\n        this._deduplicationKey = (p.deduplicationKey || null);\n        this._enabledQueryCache = (p.enabledQueryCache || true);\n        this._queryExactMatch = (p.queryExactMatch || false);\n        this._acrossTransitions = (p.acrossTransitions || false);\n        this._kanaNormalization = (p.kanaNormalization || false);\n        this._minQueryLength = (p.minQueryLength || -1);\n        this._minExactMatchLength = 4;\n        this._filters = [];\n    };\n    j(o.prototype, g, {\n        events: [\"bootstrap\",\"query\",\"respond\",],\n        init: function() {\n            this.init = m;\n            this._fields = l(this._indexedFields);\n            this._activeQueries = 0;\n            this.dirty();\n        },\n        dirty: function() {\n            this.value = \"\";\n            this._bootstrapped = false;\n            this._bootstrapping = false;\n            this._data = {\n            };\n            this.localCache = {\n            };\n            this.queryCache = {\n            };\n            this.inform(\"dirty\", {\n            });\n            return this;\n        },\n        bootstrap: function() {\n            if (this._bootstrapped) {\n                return\n            };\n            this.bootstrapWithoutToken();\n            this._bootstrapped = true;\n            this._bootstrapping = true;\n            this.inform(\"bootstrap\", {\n                bootstrapping: true\n            });\n        },\n        bootstrapWithoutToken: function() {\n            this.fetch(this.bootstrapEndpoint, this.bootstrapData, {\n                bootstrap: true,\n                token: this.token\n            });\n        },\n        bootstrapWithToken: function() {\n            var p = j({\n            }, this.bootstrapData);\n            p.token = this.token;\n            this.fetch(this.bootstrapEndpoint, p, {\n                bootstrap: true,\n                replaceCache: true\n            });\n        },\n        query: function(p, q, r, s) {\n            this.inform(\"beforeQuery\", {\n                value: p,\n                local_only: q,\n                exclusions: r,\n                time_waited: s\n            });\n            if (!this._enabledQueryCache) {\n                this.queryCache = {\n                };\n            };\n            var t = this.buildUids(p, [], r), u = this.respond(p, t);\n            this.value = p;\n            this.inform(\"query\", {\n                value: p,\n                results: u\n            });\n            var v = this._normalizeString(p).flatValue;\n            if ((((((q || !v) || this._isQueryTooShort(v)) || !this.queryEndpoint) || this.getQueryCache().hasOwnProperty(v)) || !this.shouldFetchMoreResults(u))) {\n                return false\n            };\n            this.inform(\"queryEndpoint\", {\n                value: p\n            });\n            this.fetch(this.queryEndpoint, this.getQueryData(p, t), {\n                value: p,\n                exclusions: r\n            });\n            return true;\n        },\n        _isQueryTooShort: function(p) {\n            return ((p.length < this._minQueryLength));\n        },\n        _normalizeString: function(p, q) {\n            var r = p;\n            if (this._kanaNormalization) {\n                r = n.normalizeHiragana(p);\n            };\n            return i.parse(r, q);\n        },\n        shouldFetchMoreResults: function(p) {\n            return (p.length < this._maxResults);\n        },\n        getQueryData: function(p, q) {\n            var r = j({\n                value: p\n            }, (this.queryData || {\n            }));\n            q = (q || []);\n            if (q.length) {\n                r.existing_ids = q.join(\",\");\n            };\n            if (this._bootstrapping) {\n                r.bsp = true;\n            };\n            return r;\n        },\n        setQueryData: function(p, q) {\n            if (q) {\n                this.queryData = {\n                };\n            };\n            j(this.queryData, p);\n            return this;\n        },\n        setBootstrapData: function(p, q) {\n            if (q) {\n                this.bootstrapData = {\n                };\n            };\n            j(this.bootstrapData, p);\n            return this;\n        },\n        getExclusions: function() {\n            return k(this._exclusions);\n        },\n        setExclusions: function(p) {\n            this._exclusions = (p || []);\n        },\n        addFilter: function(p) {\n            var q = this._filters;\n            q.push(p);\n            return {\n                remove: function() {\n                    q.splice(q.indexOf(p), 1);\n                }\n            };\n        },\n        clearFilters: function() {\n            this._filters = [];\n        },\n        respond: function(p, q, r) {\n            var s = this.buildData(q);\n            this.inform(\"respond\", {\n                value: p,\n                results: s,\n                isAsync: !!r\n            });\n            return s;\n        },\n        asyncErrorHandler: m,\n        fetch: function(p, q, r) {\n            if (!p) {\n                return\n            };\n            var s = new h().setURI(p).setData(q).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._acrossTransitions).setHandler(function(t) {\n                this.fetchHandler(t, (r || {\n                }));\n            }.bind(this));\n            if ((p === this.queryEndpoint)) {\n                s.setFinallyHandler(function() {\n                    this._activeQueries--;\n                    if (!this._activeQueries) {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                    };\n                }.bind(this));\n            };\n            s.setErrorHandler(this.asyncErrorHandler);\n            this.inform(\"beforeFetch\", {\n                request: s,\n                fetch_context: r\n            });\n            s.send();\n            if ((p === this.queryEndpoint)) {\n                if (!this._activeQueries) {\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                };\n                this._activeQueries++;\n            }\n        ;\n        },\n        fetchHandler: function(p, q) {\n            var r = q.value, s = q.exclusions;\n            if ((!r && q.replaceCache)) {\n                this.localCache = {\n                };\n            };\n            this.inform(\"buildQueryCache\", {\n            });\n            var t = p.getPayload().entries;\n            this.addEntries(t, r);\n            this.inform(\"fetchComplete\", {\n                entries: t,\n                response: p,\n                value: r,\n                fetch_context: q\n            });\n            var u = (((!r && this.value)) ? this.value : r);\n            this.respond(u, this.buildUids(u, [], s), true);\n            if (!r) {\n                if (this._bootstrapping) {\n                    this._bootstrapping = false;\n                    this.inform(\"bootstrap\", {\n                        bootstrapping: false\n                    });\n                }\n            ;\n                if ((q.token && (p.getPayload().token !== q.token))) {\n                    this.bootstrapWithToken();\n                };\n            }\n        ;\n        },\n        addEntries: function(p, q) {\n            var r = this.processEntries(k((p || [])), q), s = this.buildUids(q, r);\n            if (q) {\n                var t = this.getQueryCache();\n                t[this._normalizeString(q).flatValue] = s;\n            }\n             else this.fillCache(s);\n        ;\n        },\n        processEntries: function(p, q) {\n            return p.map(function(r, s) {\n                var t = (r.uid = (r.uid + \"\")), u = this.getEntry(t);\n                if (!u) {\n                    u = r;\n                    u.query = q;\n                    this.setEntry(t, u);\n                }\n                 else j(u, r);\n            ;\n                ((u.index === undefined) && (u.index = s));\n                return t;\n            }, this);\n        },\n        getAllEntries: function() {\n            return (this._data || {\n            });\n        },\n        getEntry: function(p) {\n            return (this._data[p] || null);\n        },\n        setEntry: function(p, q) {\n            this._data[p] = q;\n        },\n        fillCache: function(p) {\n            var q = this.localCache;\n            p.forEach(function(r) {\n                var s = this.getEntry(r);\n                if (!s) {\n                    return\n                };\n                s.bootstrapped = true;\n                var t = this._normalizeString(this.getTextToIndex(s)).tokens;\n                for (var u = 0, v = t.length; (u < v); ++u) {\n                    var w = t[u];\n                    if (!q.hasOwnProperty(w)) {\n                        q[w] = {\n                        };\n                    };\n                    q[w][r] = true;\n                };\n            }, this);\n        },\n        getTextToIndex: function(p) {\n            if ((p.textToIndex && !p.needs_update)) {\n                return p.textToIndex\n            };\n            p.needs_update = false;\n            p.textToIndex = this.getTextToIndexFromFields(p, this._indexedFields);\n            return p.textToIndex;\n        },\n        getTextToIndexFromFields: function(p, q) {\n            var r = [];\n            for (var s = 0; (s < q.length); ++s) {\n                var t = p[q[s]];\n                if (t) {\n                    r.push((t.join ? t.join(\" \") : t));\n                };\n            };\n            return r.join(\" \");\n        },\n        mergeUids: function(p, q, r, s) {\n            this.inform(\"mergeUids\", {\n                local_uids: p,\n                query_uids: q,\n                new_uids: r,\n                value: s\n            });\n            var t = function(u, v) {\n                var w = this.getEntry(u), x = this.getEntry(v);\n                if ((w.extended_match !== x.extended_match)) {\n                    return (w.extended_match ? 1 : -1)\n                };\n                if ((w.index !== x.index)) {\n                    return (w.index - x.index)\n                };\n                if ((w.text.length !== x.text.length)) {\n                    return (w.text.length - x.text.length)\n                };\n                return (w.uid < x.uid);\n            }.bind(this);\n            this._checkExtendedMatch(s, p);\n            return this.deduplicateByKey(p.sort(t).concat(q, r));\n        },\n        _checkExtendedMatch: function(p, q) {\n            var r = (this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch);\n            for (var s = 0; (s < q.length); ++s) {\n                var t = this.getEntry(q[s]);\n                t.extended_match = (t.tokens ? !r(p, t.text) : false);\n            };\n        },\n        buildUids: function(p, q, r) {\n            if (!q) {\n                q = [];\n            };\n            if (!p) {\n                return q\n            };\n            if (!r) {\n                r = [];\n            };\n            var s = this.buildCacheResults(p, this.localCache), t = this.buildQueryResults(p), u = this.mergeUids(s, t, q, p), v = l(r.concat(this._exclusions)), w = u.filter(function(x) {\n                if ((v.hasOwnProperty(x) || !this.getEntry(x))) {\n                    return false\n                };\n                for (var y = 0; (y < this._filters.length); ++y) {\n                    if (!this._filters[y](this.getEntry(x), p)) {\n                        return false\n                    };\n                };\n                return (v[x] = true);\n            }, this);\n            return this.uidsIncludingExact(p, w, v);\n        },\n        uidsIncludingExact: function(p, q, r) {\n            var s = q.length;\n            if (((p.length < this._minExactMatchLength) || (s <= this._maxResults))) {\n                return q\n            };\n            for (var t = 0; (t < s); ++t) {\n                var u = this.getEntry(q[t]);\n                (u.text_lower || (u.text_lower = u.text.toLowerCase()));\n                if ((u.text_lower === this._normalizeString(p).flatValue)) {\n                    if ((t >= this._maxResults)) {\n                        var v = q.splice(t, 1);\n                        q.splice((this._maxResults - 1), 0, v);\n                    }\n                ;\n                    break;\n                }\n            ;\n            };\n            return q;\n        },\n        buildData: function(p) {\n            var q = [], r = Math.min(p.length, this._maxResults);\n            for (var s = 0; (s < r); ++s) {\n                q.push(this.getEntry(p[s]));;\n            };\n            return q;\n        },\n        findQueryCache: function(p) {\n            var q = 0, r = null, s = this.getQueryCache();\n            if (this._queryExactMatch) {\n                return (s[p] || [])\n            };\n            for (var t in s) {\n                if (((p.indexOf(t) === 0) && (t.length > q))) {\n                    q = t.length;\n                    r = t;\n                }\n            ;\n            };\n            return (s[r] || []);\n        },\n        buildQueryResults: function(p) {\n            var q = this._normalizeString(p).flatValue, r = this.findQueryCache(q);\n            if (this.getQueryCache().hasOwnProperty(q)) {\n                return r\n            };\n            return this.filterQueryResults(p, r);\n        },\n        filterQueryResults: function(p, q) {\n            var r = (this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch);\n            return q.filter(function(s) {\n                return r(p, this.getTextToIndex(this.getEntry(s)));\n            }, this);\n        },\n        buildCacheResults: function(p, q) {\n            var r = this._normalizeString(p, this._alwaysPrefixMatch), s = (this._alwaysPrefixMatch ? r.sortedTokens : r.tokens), t = s.length, u = (r.isPrefixQuery ? (t - 1) : null), v = {\n            }, w = {\n            }, x = {\n            }, y = [], z = false, aa = {\n            }, ba = 0;\n            for (var ca = 0; (ca < t); ++ca) {\n                var da = s[ca];\n                if (!aa.hasOwnProperty(da)) {\n                    ba++;\n                    aa[da] = true;\n                }\n                 else continue;\n            ;\n                for (var ea in q) {\n                    if ((((!v.hasOwnProperty(ea) && (ea === da))) || ((((this._alwaysPrefixMatch || (u === ca))) && (ea.indexOf(da) === 0))))) {\n                        if ((ea === da)) {\n                            if (w.hasOwnProperty(ea)) {\n                                z = true;\n                            };\n                            v[ea] = true;\n                        }\n                         else {\n                            if ((v.hasOwnProperty(ea) || w.hasOwnProperty(ea))) {\n                                z = true;\n                            };\n                            w[ea] = true;\n                        }\n                    ;\n                        for (var fa in q[ea]) {\n                            if (((ca === 0) || ((x.hasOwnProperty(fa) && (x[fa] == (ba - 1)))))) {\n                                x[fa] = ba;\n                            };\n                        };\n                    }\n                ;\n                };\n            };\n            for (var ga in x) {\n                if ((x[ga] == ba)) {\n                    y.push(ga);\n                };\n            };\n            if ((z || (ba < t))) {\n                y = this.filterQueryResults(p, y);\n            };\n            if ((this._titleFields && (this._titleFields.length > 0))) {\n                y = this.filterNonTitleMatchQueryResults(p, y);\n            };\n            return y;\n        },\n        filterNonTitleMatchQueryResults: function(p, q) {\n            return q.filter(function(r) {\n                var s = this._normalizeString(p), t = s.tokens.length;\n                if ((t === 0)) {\n                    return true\n                };\n                var u = this.getTitleTerms(this.getEntry(r)), v = s.tokens[0];\n                return (((((t === 1)) || this._alwaysPrefixMatch)) ? i.isPrefixMatch(v, u) : i.isQueryMatch(v, u));\n            }, this);\n        },\n        getTitleTerms: function(p) {\n            if (!p.titleToIndex) {\n                p.titleToIndex = this.getTextToIndexFromFields(p, this._titleFields);\n            };\n            return p.titleToIndex;\n        },\n        deduplicateByKey: function(p) {\n            if (!this._deduplicationKey) {\n                return p\n            };\n            var q = l(p.map(this._getDeduplicationKey.bind(this)), p);\n            return p.filter(function(r) {\n                return (q[this._getDeduplicationKey(r)] == r);\n            }.bind(this));\n        },\n        _getDeduplicationKey: function(p) {\n            var q = this.getEntry(p);\n            return (q[this._deduplicationKey] || ((\"__\" + p) + \"__\"));\n        },\n        getQueryCache: function() {\n            return this.queryCache;\n        },\n        setMaxResults: function(p) {\n            this._maxResults = p;\n            (this.value && this.respond(this.value, this.buildUids(this.value)));\n        },\n        updateToken: function(p) {\n            this.token = p;\n            this.dirty();\n            return this;\n        }\n    });\n    e.exports = o;\n});\n__d(\"BanzaiNectar\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\");\n    function h(j) {\n        return {\n            log: function(k, l, m) {\n                var n = {\n                    e: l,\n                    a: m\n                };\n                g.post((\"nectar:\" + k), n, j);\n            }\n        };\n    };\n    var i = h();\n    i.create = h;\n    e.exports = i;\n});\n__d(\"DimensionLogging\", [\"BanzaiNectar\",\"DOMDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiNectar\"), h = b(\"DOMDimensions\"), i = h.getViewportDimensions();\n    g.log(\"browser_dimension\", \"homeload\", {\n        x: i.width,\n        y: i.height,\n        sw: window.screen.width,\n        sh: window.screen.height,\n        aw: window.screen.availWidth,\n        ah: window.screen.availHeight,\n        at: window.screen.availTop,\n        al: window.screen.availLeft\n    });\n});\n__d(\"MultiBootstrapDataSource\", [\"Class\",\"DataSource\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\");\n    function i(j) {\n        this._bootstrapEndpoints = j.bootstrapEndpoints;\n        this.parent.construct(this, j);\n    };\n    g.extend(i, h);\n    i.prototype.bootstrapWithoutToken = function() {\n        for (var j = 0; (j < this._bootstrapEndpoints.length); j++) {\n            this.fetch(this._bootstrapEndpoints[j].endpoint, (this._bootstrapEndpoints[j].data || {\n            }), {\n                bootstrap: true\n            });;\n        };\n    };\n    e.exports = i;\n});\n__d(\"XHPTemplate\", [\"DataStore\",\"DOM\",\"HTML\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"copyProperties\");\n    function k(m) {\n        this._model = m;\n    };\n    j(k.prototype, {\n        render: function() {\n            if (i.isHTML(this._model)) {\n                this._model = h.setContent(document.createDocumentFragment(), this._model)[0];\n            };\n            return this._model.cloneNode(true);\n        },\n        build: function() {\n            return new l(this.render());\n        }\n    });\n    j(k, {\n        getNode: function(m, n) {\n            return k.getNodes(m)[n];\n        },\n        getNodes: function(m) {\n            var n = g.get(m, \"XHPTemplate:nodes\");\n            if (!n) {\n                n = {\n                };\n                var o = h.scry(m, \"[data-jsid]\");\n                o.push(m);\n                var p = o.length;\n                while (p--) {\n                    var q = o[p];\n                    n[q.getAttribute(\"data-jsid\")] = q;\n                    q.removeAttribute(\"data-jsid\");\n                };\n                g.set(m, \"XHPTemplate:nodes\", n);\n            }\n        ;\n            return n;\n        }\n    });\n    function l(m) {\n        this._root = m;\n        this._populateNodes();\n    };\n    j(l.prototype, {\n        _populateNodes: function() {\n            this._nodes = {\n            };\n            this._leaves = {\n            };\n            var m = this._root.getElementsByTagName(\"*\");\n            for (var n = 0, o = m.length; (n < o); n++) {\n                var p = m[n], q = p.getAttribute(\"data-jsid\");\n                if (q) {\n                    p.removeAttribute(\"data-jsid\");\n                    this._nodes[q] = p;\n                    this._leaves[q] = !p.childNodes.length;\n                }\n            ;\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNode: function(m) {\n            return this._nodes[m];\n        },\n        setNodeProperty: function(m, n, o) {\n            this.getNode(m)[n] = o;\n            return this;\n        },\n        setNodeContent: function(m, n) {\n            if (!this._leaves[m]) {\n                throw new Error((\"Can't setContent on non-leaf node: \" + m))\n            };\n            h.setContent(this.getNode(m), n);\n            return this;\n        }\n    });\n    e.exports = k;\n});");
// 1058
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s89b45f8367840725134eb4d5bfbd7b4248c14bdd");
// 1059
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"OJTM4\",]);\n}\n;\n;\n__d(\"AjaxRequest\", [\"ErrorUtils\",\"Keys\",\"URI\",\"UserAgent\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"Keys\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(q, r, s) {\n        this.xhr = k.create();\n        if (!((r instanceof i))) {\n            r = new i(r);\n        }\n    ;\n    ;\n        if (((s && ((q == \"GET\"))))) {\n            r.setQueryData(s);\n        }\n         else this._params = s;\n    ;\n    ;\n        this.method = q;\n        this.uri = r;\n        this.xhr.open(q, r);\n    };\n;\n    var n = ((window.JSBNG__XMLHttpRequest && ((\"withCredentials\" in new JSBNG__XMLHttpRequest()))));\n    m.supportsCORS = function() {\n        return n;\n    };\n    m.ERROR = \"ar:error\";\n    m.TIMEOUT = \"ar:timeout\";\n    m.PROXY_ERROR = \"ar:proxy error\";\n    m.TRANSPORT_ERROR = \"ar:transport error\";\n    m.SERVER_ERROR = \"ar:http error\";\n    m.PARSE_ERROR = \"ar:parse error\";\n    m._inflight = [];\n    function o() {\n        var q = m._inflight;\n        m._inflight = [];\n        q.forEach(function(r) {\n            r.abort();\n        });\n    };\n;\n    function p(q) {\n        q.onJSON = q.onError = q.onSuccess = null;\n        JSBNG__clearTimeout(q._timer);\n        if (((q.xhr && ((q.xhr.readyState < 4))))) {\n            q.xhr.abort();\n            q.xhr = null;\n        }\n    ;\n    ;\n        m._inflight = m._inflight.filter(function(r) {\n            return ((((((r && ((r != q)))) && r.xhr)) && ((r.xhr.readyState < 4))));\n        });\n    };\n;\n    l(m.prototype, {\n        timeout: 60000,\n        streamMode: true,\n        prelude: /^for \\(;;\\);/,\n        JSBNG__status: null,\n        _eol: -1,\n        _call: function(q) {\n            if (this[q]) {\n                this[q](this);\n            }\n        ;\n        ;\n        },\n        _parseStatus: function() {\n            var q;\n            try {\n                this.JSBNG__status = this.xhr.JSBNG__status;\n                q = this.xhr.statusText;\n            } catch (r) {\n                if (((this.xhr.readyState >= 4))) {\n                    this.errorType = m.TRANSPORT_ERROR;\n                    this.errorText = r.message;\n                }\n            ;\n            ;\n                return;\n            };\n        ;\n            if (((((this.JSBNG__status === 0)) && !(/^(file|ftp)/.test(this.uri))))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 100)) && ((this.JSBNG__status < 200))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 200)) && ((this.JSBNG__status < 300))))) {\n                return;\n            }\n             else if (((((this.JSBNG__status >= 300)) && ((this.JSBNG__status < 400))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 400)) && ((this.JSBNG__status < 500))))) {\n                this.errorType = m.SERVER_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 500)) && ((this.JSBNG__status < 600))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.JSBNG__status == 1223))) {\n                return;\n            }\n             else if (((((this.JSBNG__status >= 12001)) && ((this.JSBNG__status <= 12156))))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else {\n                q = ((\"unrecognized status code: \" + this.JSBNG__status));\n                this.errorType = m.ERROR;\n            }\n            \n            \n            \n            \n            \n            \n            \n        ;\n        ;\n            if (!this.errorText) {\n                this.errorText = q;\n            }\n        ;\n        ;\n        },\n        _parseResponse: function() {\n            var q, r = this.xhr.readyState;\n            try {\n                q = ((this.xhr.responseText || \"\"));\n            } catch (s) {\n                if (((r >= 4))) {\n                    this.errorType = m.ERROR;\n                    this.errorText = ((\"responseText not available - \" + s.message));\n                }\n            ;\n            ;\n                return;\n            };\n        ;\n            while (this.xhr) {\n                var t = ((this._eol + 1)), u = ((this.streamMode ? q.indexOf(\"\\u000a\", t) : q.length));\n                if (((((u < 0)) && ((r == 4))))) {\n                    u = q.length;\n                }\n            ;\n            ;\n                if (((u <= this._eol))) {\n                    break;\n                }\n            ;\n            ;\n                var v = q;\n                if (this.streamMode) {\n                    v = q.substr(t, ((u - t))).replace(/^\\s*|\\s*$/g, \"\");\n                }\n            ;\n            ;\n                if (((((t === 0)) && this.prelude))) {\n                    if (this.prelude.test(v)) {\n                        v = v.replace(this.prelude, \"\");\n                    }\n                ;\n                }\n            ;\n            ;\n                this._eol = u;\n                if (v) {\n                    try {\n                        this.json = JSON.parse(v);\n                    } catch (s) {\n                        var w = (((/(<body[\\S\\s]+?<\\/body>)/i).test(q) && RegExp.$1)), x = {\n                            message: s.message,\n                            char: t,\n                            excerpt: ((((((t === 0)) && w)) || v)).substr(512)\n                        };\n                        this.errorType = m.PARSE_ERROR;\n                        this.errorText = ((\"parse error - \" + JSON.stringify(x)));\n                        return;\n                    };\n                ;\n                    g.applyWithGuard(this._call, this, [\"onJSON\",]);\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _onReadyState: function() {\n            var q = ((((this.xhr && this.xhr.readyState)) || 0));\n            if (((((this.JSBNG__status == null)) && ((q >= 2))))) {\n                this._parseStatus();\n            }\n        ;\n        ;\n            if (((!this.errorType && ((this.JSBNG__status != null))))) {\n                if (((((((q == 3)) && this.streamMode)) || ((q == 4))))) {\n                    this._parseResponse();\n                }\n            ;\n            }\n        ;\n        ;\n            if (((this.errorType || ((q == 4))))) {\n                this._time = ((JSBNG__Date.now() - this._sentAt));\n                this._call(((!this.errorType ? \"onSuccess\" : \"onError\")));\n                p(this);\n            }\n        ;\n        ;\n        },\n        send: function(q) {\n            this.xhr.onreadystatechange = function() {\n                g.applyWithGuard(this._onReadyState, this, arguments);\n            }.bind(this);\n            var r = this.timeout;\n            if (r) {\n                this._timer = JSBNG__setTimeout((function() {\n                    this.errorType = m.TIMEOUT;\n                    this.errorText = \"timeout\";\n                    this._time = ((JSBNG__Date.now() - this._sentAt));\n                    this._call(\"onError\");\n                    p(this);\n                }).bind(this), r, false);\n            }\n        ;\n        ;\n            m._inflight.push(this);\n            if (((this.method == \"POST\"))) {\n                this.xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            }\n        ;\n        ;\n            this._sentAt = JSBNG__Date.now();\n            this.xhr.send(((q ? i.implodeQuery(q) : \"\")));\n        },\n        abort: function() {\n            p(this);\n        },\n        toString: function() {\n            var q = ((\"[AjaxRequest readyState=\" + this.xhr.readyState));\n            if (this.errorType) {\n                q += ((((((((\" errorType=\" + this.errorType)) + \" (\")) + this.errorText)) + \")\"));\n            }\n        ;\n        ;\n            return ((q + \"]\"));\n        },\n        toJSON: function() {\n            var q = {\n                json: this.json,\n                JSBNG__status: this.JSBNG__status,\n                errorType: this.errorType,\n                errorText: this.errorText,\n                time: this._time\n            };\n            if (this.errorType) {\n                q.uri = this.uri;\n            }\n        ;\n        ;\n            {\n                var fin48keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin48i = (0);\n                var r;\n                for (; (fin48i < fin48keys.length); (fin48i++)) {\n                    ((r) = (fin48keys[fin48i]));\n                    {\n                        if (((q[r] == null))) {\n                            delete q[r];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return q;\n        }\n    });\n    if (((window.JSBNG__addEventListener && j.firefox()))) {\n        window.JSBNG__addEventListener(\"keydown\", function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === h.ESC))) {\n                JSBNG__event.prevent();\n            }\n        ;\n        ;\n        }, false);\n    }\n;\n;\n    if (window.JSBNG__attachEvent) {\n        window.JSBNG__attachEvent(\"JSBNG__onunload\", o);\n    }\n;\n;\n    e.exports = m;\n});\n__d(\"FBAjaxRequest\", [\"AjaxRequest\",\"copyProperties\",\"XHR\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxRequest\"), h = b(\"copyProperties\"), i = b(\"XHR\");\n    function j(k, l, m) {\n        m = h(i.getAsyncParams(k), m);\n        var n = new g(k, l, m);\n        n.streamMode = false;\n        var o = n._call;\n        n._call = function(p) {\n            if (((((p == \"onJSON\")) && this.json))) {\n                if (this.json.error) {\n                    this.errorType = g.SERVER_ERROR;\n                    this.errorText = ((\"AsyncResponse error: \" + this.json.error));\n                }\n            ;\n            ;\n                this.json = this.json.payload;\n            }\n        ;\n        ;\n            o.apply(this, arguments);\n        };\n        n.ajaxReqSend = n.send;\n        n.send = function(p) {\n            this.ajaxReqSend(h(p, m));\n        };\n        return n;\n    };\n;\n    e.exports = j;\n});\n__d(\"CallbackManagerController\", [\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"copyProperties\"), i = function(j) {\n        this._pendingIDs = [];\n        this._allRequests = [undefined,];\n        this._callbackArgHandler = j;\n    };\n    h(i.prototype, {\n        executeOrEnqueue: function(j, k, l) {\n            l = ((l || {\n            }));\n            var m = this._attemptCallback(k, j, l);\n            if (m) {\n                return 0;\n            }\n        ;\n        ;\n            this._allRequests.push({\n                fn: k,\n                request: j,\n                options: l\n            });\n            var n = ((this._allRequests.length - 1));\n            this._pendingIDs.push(n);\n            return n;\n        },\n        unsubscribe: function(j) {\n            delete this._allRequests[j];\n        },\n        reset: function() {\n            this._allRequests = [];\n        },\n        getRequest: function(j) {\n            return this._allRequests[j];\n        },\n        runPossibleCallbacks: function() {\n            var j = this._pendingIDs;\n            this._pendingIDs = [];\n            var k = [];\n            j.forEach(function(l) {\n                var m = this._allRequests[l];\n                if (!m) {\n                    return;\n                }\n            ;\n            ;\n                if (this._callbackArgHandler(m.request, m.options)) {\n                    k.push(l);\n                }\n                 else this._pendingIDs.push(l);\n            ;\n            ;\n            }.bind(this));\n            k.forEach(function(l) {\n                var m = this._allRequests[l];\n                delete this._allRequests[l];\n                this._attemptCallback(m.fn, m.request, m.options);\n            }.bind(this));\n        },\n        _attemptCallback: function(j, k, l) {\n            var m = this._callbackArgHandler(k, l);\n            if (m) {\n                var n = {\n                    ids: k\n                };\n                g.applyWithGuard(j, n, m);\n            }\n        ;\n        ;\n            return !!m;\n        }\n    });\n    e.exports = i;\n});\n__d(\"deferred\", [], function(a, b, c, d, e, f) {\n    var g = 0, h = 1, i = 2, j = 4, k = \"callbacks\", l = \"errbacks\", m = \"cancelbacks\", n = \"completeCallbacks\", o = [], p = o.slice, q = o.unshift;\n    function r(w, x) {\n        return ((w ? p.call(w, x) : o));\n    };\n;\n    function s(w, x) {\n        return ((((x < w.length)) ? r(w, x) : o));\n    };\n;\n    function t() {\n        this.$Deferred0 = g;\n    };\n;\n    t.prototype.addCallback = function(w, x) {\n        return this.$Deferred1(h, this.$Deferred2(k), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(k), w, x);\n    };\n    t.prototype.addCompleteCallback = function(w, x) {\n        return this.$Deferred1(null, this.$Deferred2(n), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCompleteCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(n), w, x);\n    };\n    t.prototype.addErrback = function(w, x) {\n        return this.$Deferred1(i, this.$Deferred2(l), w, x, s(arguments, 2));\n    };\n    t.prototype.removeErrback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(l), w, x);\n    };\n    t.prototype.addCancelback = function(w, x) {\n        return this.$Deferred1(j, this.$Deferred2(m), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCancelback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(m), w, x);\n    };\n    t.prototype.getStatus = function() {\n        return this.$Deferred0;\n    };\n    t.prototype.setStatus = function(w) {\n        var x;\n        this.$Deferred0 = w;\n        this.callbackArgs = r(arguments, 1);\n        if (((w === i))) {\n            x = l;\n        }\n         else if (((w === h))) {\n            x = k;\n        }\n         else if (((w === j))) {\n            x = m;\n        }\n        \n        \n    ;\n    ;\n        if (x) {\n            this.$Deferred4(this[x], this.callbackArgs);\n        }\n    ;\n    ;\n        this.$Deferred4(this[n], this.callbackArgs);\n        return this;\n    };\n    t.prototype.JSBNG__setTimeout = function(w) {\n        if (this.timeout) {\n            this.JSBNG__clearTimeout();\n        }\n    ;\n    ;\n        this.$Deferred5 = ((this.$Deferred5 || this.fail.bind(this)));\n        this.timeout = window.JSBNG__setTimeout(this.$Deferred5, w);\n    };\n    t.prototype.JSBNG__clearTimeout = function() {\n        window.JSBNG__clearTimeout(this.timeout);\n        delete this.timeout;\n    };\n    t.prototype.succeed = function() {\n        return this.$Deferred6(h, arguments);\n    };\n    t.prototype.fail = function() {\n        return this.$Deferred6(i, arguments);\n    };\n    t.prototype.cancel = function() {\n        delete this[k];\n        delete this[l];\n        return this.$Deferred6(j, arguments);\n    };\n    t.prototype.$Deferred6 = function(w, x) {\n        q.call(x, w);\n        return this.setStatus.apply(this, x);\n    };\n    t.prototype.$Deferred2 = function(w) {\n        return ((this[w] || (this[w] = [])));\n    };\n    t.prototype.then = function(w, x, y, z) {\n        var aa = new t(), w, ba, ca, da = r(arguments, 0);\n        if (((typeof da[0] === \"function\"))) {\n            w = da.shift();\n        }\n    ;\n    ;\n        if (((typeof da[0] === \"function\"))) {\n            ba = da.shift();\n        }\n    ;\n    ;\n        if (((typeof da[0] === \"function\"))) {\n            ca = da.shift();\n        }\n    ;\n    ;\n        var ea = da.shift();\n        if (w) {\n            var fa = [this.$Deferred7,this,aa,\"succeed\",w,ea,].concat(da);\n            this.addCallback.apply(this, fa);\n        }\n         else this.addCallback(aa.succeed, aa);\n    ;\n    ;\n        if (ba) {\n            var ga = [this.$Deferred7,this,aa,\"fail\",ba,ea,].concat(da);\n            this.addErrback.apply(this, ga);\n        }\n         else this.addErrback(aa.fail, aa);\n    ;\n    ;\n        if (ca) {\n            var ha = [this.$Deferred7,this,aa,\"cancel\",ca,ea,].concat(da);\n            this.addCancelback.apply(this, ha);\n        }\n         else this.addCancelback(aa.cancel, aa);\n    ;\n    ;\n        return aa;\n    };\n    t.prototype.$Deferred1 = function(w, x, y, z, aa) {\n        var ba = this.getStatus();\n        if (((((!w && ((ba !== g)))) || ((ba === w))))) {\n            y.apply(((z || this)), aa.concat(this.callbackArgs));\n        }\n         else x.push(y, z, aa);\n    ;\n    ;\n        return this;\n    };\n    t.prototype.$Deferred3 = function(w, x, y) {\n        for (var z = 0; ((z < w.length)); z += 3) {\n            if (((((w[z] === x)) && ((!y || ((w[((z + 1))] === y))))))) {\n                w.splice(z, 3);\n                if (y) {\n                    break;\n                }\n            ;\n            ;\n                z -= 3;\n            }\n        ;\n        ;\n        };\n    ;\n        return this;\n    };\n    t.prototype.pipe = function(w) {\n        this.addCallback(w.succeed, w).addErrback(w.fail, w).addCancelback(w.cancel, w);\n    };\n    t.prototype.$Deferred4 = function(w, x) {\n        for (var y = 0; ((y < ((w || o)).length)); y += 3) {\n            w[y].apply(((w[((y + 1))] || this)), ((w[((y + 2))] || o)).concat(x));\n        ;\n        };\n    ;\n    };\n    t.prototype.$Deferred7 = function(w, x, y, z) {\n        var aa = r(arguments, 4), ba = y.apply(z, aa);\n        if (((ba instanceof t))) {\n            ba.pipe(w);\n        }\n         else w[x](ba);\n    ;\n    ;\n    };\n    var u = ((((t === null)) ? null : t.prototype));\n    v.prototype = Object.create(u);\n    v.prototype.constructor = v;\n    v.__superConstructor__ = t;\n    function v(w) {\n        t.call(this);\n        this.completed = 0;\n        this.list = [];\n        if (w) {\n            w.forEach(this.waitFor, this);\n            this.startWaiting();\n        }\n    ;\n    ;\n    };\n;\n    v.prototype.startWaiting = function() {\n        this.waiting = true;\n        this.checkDeferreds();\n        return this;\n    };\n    v.prototype.waitFor = function(w) {\n        this.list.push(w);\n        this.checkDeferreds();\n        w.addCompleteCallback(this.deferredComplete, this);\n        return this;\n    };\n    v.prototype.createWaitForDeferred = function() {\n        var w = new t();\n        this.waitFor(w);\n        return w;\n    };\n    v.prototype.createWaitForCallback = function() {\n        var w = this.createWaitForDeferred();\n        return w.succeed.bind(w);\n    };\n    v.prototype.deferredComplete = function() {\n        this.completed++;\n        if (((this.completed === this.list.length))) {\n            this.checkDeferreds();\n        }\n    ;\n    ;\n    };\n    v.prototype.checkDeferreds = function() {\n        if (((!this.waiting || ((this.completed !== this.list.length))))) {\n            return;\n        }\n    ;\n    ;\n        var w = false, x = false, y = [g,];\n        for (var z = 0, aa = this.list.length; ((z < aa)); z++) {\n            var ba = this.list[z];\n            y.push([ba,].concat(ba.callbackArgs));\n            if (((ba.getStatus() === i))) {\n                w = true;\n            }\n             else if (((ba.getStatus() === j))) {\n                x = true;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (w) {\n            y[0] = i;\n            this.fail.apply(this, y);\n        }\n         else if (x) {\n            y[0] = j;\n            this.cancel.apply(this, y);\n        }\n         else {\n            y[0] = h;\n            this.succeed.apply(this, y);\n        }\n        \n    ;\n    ;\n    };\n    f.Deferred = t;\n    f.DeferredList = v;\n    f.Deferred.toArray = r;\n    f.Deferred.STATUS_UNKNOWN = g;\n    f.Deferred.STATUS_SUCCEEDED = h;\n    f.Deferred.STATUS_CANCELED = j;\n    f.Deferred.STATUS_FAILED = i;\n});\n__d(\"KeyedCallbackManager\", [\"CallbackManagerController\",\"deferred\",\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"deferred\").Deferred, i = b(\"ErrorUtils\"), j = b(\"copyProperties\"), k = function() {\n        this._resources = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n    };\n    j(k.prototype, {\n        executeOrEnqueue: function(l, m) {\n            if (!((l instanceof Array))) {\n                var n = l, o = m;\n                l = [l,];\n                m = function(p) {\n                    o(p[n]);\n                };\n            }\n        ;\n        ;\n            l = l.filter(function(p) {\n                var q = ((((p !== null)) && ((p !== undefined))));\n                if (!q) {\n                    i.applyWithGuard(function() {\n                        throw new Error(((((\"KeyedCallbackManager.executeOrEnqueue: key \" + JSON.stringify(p))) + \" is invalid\")));\n                    });\n                }\n            ;\n            ;\n                return q;\n            });\n            return this._controller.executeOrEnqueue(l, m);\n        },\n        deferredExecuteOrEnqueue: function(l) {\n            var m = new h();\n            this.executeOrEnqueue(l, m.succeed.bind(m));\n            return m;\n        },\n        unsubscribe: function(l) {\n            this._controller.unsubscribe(l);\n        },\n        reset: function() {\n            this._controller.reset();\n            this._resources = {\n            };\n        },\n        getUnavailableResources: function(l) {\n            var m = this._controller.getRequest(l), n = [];\n            if (m) {\n                n = m.request.filter(function(o) {\n                    return !this._resources[o];\n                }.bind(this));\n            }\n        ;\n        ;\n            return n;\n        },\n        getUnavailableResourcesFromRequest: function(l) {\n            var m = ((Array.isArray(l) ? l : [l,]));\n            return m.filter(function(n) {\n                if (((((n !== null)) && ((n !== undefined))))) {\n                    return !this._resources[n];\n                }\n            ;\n            ;\n            }, this);\n        },\n        addResourcesAndExecute: function(l) {\n            j(this._resources, l);\n            this._controller.runPossibleCallbacks();\n        },\n        setResource: function(l, m) {\n            this._resources[l] = m;\n            this._controller.runPossibleCallbacks();\n        },\n        getResource: function(l) {\n            return this._resources[l];\n        },\n        getAllResources: function() {\n            return this._resources;\n        },\n        dumpResources: function() {\n            var l = {\n            };\n            {\n                var fin49keys = ((window.top.JSBNG_Replay.forInKeys)((this._resources))), fin49i = (0);\n                var m;\n                for (; (fin49i < fin49keys.length); (fin49i++)) {\n                    ((m) = (fin49keys[fin49i]));\n                    {\n                        var n = this._resources[m];\n                        if (((typeof n === \"object\"))) {\n                            n = j({\n                            }, n);\n                        }\n                    ;\n                    ;\n                        l[m] = n;\n                    };\n                };\n            };\n        ;\n            return l;\n        },\n        _constructCallbackArg: function(l) {\n            var m = {\n            };\n            for (var n = 0; ((n < l.length)); n++) {\n                var o = l[n], p = this._resources[o];\n                if (((typeof p == \"undefined\"))) {\n                    return false;\n                }\n            ;\n            ;\n                m[o] = p;\n            };\n        ;\n            return [m,];\n        }\n    });\n    e.exports = k;\n});\n__d(\"BaseAsyncLoader\", [\"KeyedCallbackManager\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"copyProperties\"), i = {\n    };\n    function j(l, m, n) {\n        var o = new g(), p = false, q = [];\n        function r() {\n            if (((!q.length || p))) {\n                return;\n            }\n        ;\n        ;\n            p = true;\n            t.defer();\n        };\n    ;\n        function s(w) {\n            p = false;\n            w.forEach(o.unsubscribe.bind(o));\n            r();\n        };\n    ;\n        {\n            function t() {\n                var w = {\n                }, x = [];\n                q = q.filter(function(z) {\n                    var aa = o.getUnavailableResources(z);\n                    if (aa.length) {\n                        aa.forEach(function(ba) {\n                            w[ba] = true;\n                        });\n                        x.push(z);\n                        return true;\n                    }\n                ;\n                ;\n                    return false;\n                });\n                var y = Object.keys(w);\n                if (y.length) {\n                    n(l, y, x, u.curry(x), v.curry(x));\n                }\n                 else p = false;\n            ;\n            ;\n            };\n            ((window.top.JSBNG_Replay.s89b45f8367840725134eb4d5bfbd7b4248c14bdd_89.push)((t)));\n        };\n    ;\n        function u(w, x) {\n            var y = ((x.payload[m] || x.payload));\n            o.addResourcesAndExecute(y);\n            s(w);\n        };\n    ;\n        function v(w) {\n            s(w);\n        };\n    ;\n        return {\n            get: function(w, x) {\n                var y = o.executeOrEnqueue(w, x), z = o.getUnavailableResources(y);\n                if (z.length) {\n                    q.push(y);\n                    r();\n                }\n            ;\n            ;\n            },\n            getCachedKeys: function() {\n                return Object.keys(o.getAllResources());\n            },\n            getNow: function(w) {\n                return ((o.getResource(w) || null));\n            },\n            set: function(w) {\n                o.addResourcesAndExecute(w);\n            }\n        };\n    };\n;\n    function k(l, m) {\n        throw (\"BaseAsyncLoader can't be instantiated\");\n    };\n;\n    h(k.prototype, {\n        _getLoader: function() {\n            if (!i[this._endpoint]) {\n                i[this._endpoint] = j(this._endpoint, this._type, this.send);\n            }\n        ;\n        ;\n            return i[this._endpoint];\n        },\n        get: function(l, m) {\n            return this._getLoader().get(l, m);\n        },\n        getCachedKeys: function() {\n            return this._getLoader().getCachedKeys();\n        },\n        getNow: function(l) {\n            return this._getLoader().getNow(l);\n        },\n        reset: function() {\n            i[this._endpoint] = null;\n        },\n        set: function(l) {\n            this._getLoader().set(l);\n        }\n    });\n    e.exports = k;\n});\n__d(\"AjaxLoader\", [\"copyProperties\",\"FBAjaxRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"FBAjaxRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n;\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        var p = new h(\"GET\", k, {\n            ids: l\n        });\n        p.onJSON = function(q) {\n            n({\n                payload: q.json\n            });\n        };\n        p.onError = o;\n        p.send();\n    };\n    e.exports = j;\n});\n__d(\"CLoggerX\", [\"Banzai\",\"DOM\",\"debounce\",\"JSBNG__Event\",\"ge\",\"Parent\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"DOM\"), i = b(\"debounce\"), j = b(\"JSBNG__Event\"), k = b(\"ge\"), l = b(\"Parent\"), m = ((((10 * 60)) * 1000)), n = b(\"Keys\").RETURN, o = {\n    }, p = function(s) {\n        var t = ((s.target || s.srcElement)).id, u = ((s.target || s.srcElement)).value.trim().length, v = q.getTracker(t);\n        if (!v) {\n            return;\n        }\n    ;\n    ;\n        if (((((u > 5)) && !v.submitted))) {\n            g.post(\"censorlogger\", {\n                cl_impid: v.impid,\n                clearcounter: v.clearcounter,\n                instrument: v.type,\n                elementid: t,\n                parent_fbid: ((((v.parent_fbid == \"unknown\")) ? null : v.parent_fbid)),\n                version: \"x\"\n            }, g.VITAL);\n            q.setSubmitted(t, true);\n        }\n         else if (((((((u === 0)) && v.submitted)) && ((s.which != n))))) {\n            o[t] = r(t);\n            o[t]();\n        }\n         else if (((((u > 0)) && v.submitted))) {\n            if (o[t]) {\n                o[t].reset();\n            }\n        ;\n        }\n        \n        \n    ;\n    ;\n    }, q = {\n        init: function() {\n            this.trackedElements = ((this.trackedElements || {\n            }));\n            this.feedbackForms = ((this.feedbackForms || {\n            }));\n        },\n        setImpressionID: function(s) {\n            this.init();\n            this.impressionID = s;\n            this.clean();\n        },\n        setComposerTargetData: function(s) {\n            this.cTargetID = ((s.targetID || \"unknown\"));\n            this.cTargetFBType = ((s.targetType || \"unknown\"));\n        },\n        clean: function() {\n            {\n                var fin50keys = ((window.top.JSBNG_Replay.forInKeys)((this.trackedElements))), fin50i = (0);\n                var s;\n                for (; (fin50i < fin50keys.length); (fin50i++)) {\n                    ((s) = (fin50keys[fin50i]));\n                    {\n                        if (o[s]) {\n                            o[s].reset();\n                            delete o[s];\n                        }\n                    ;\n                    ;\n                        delete this.trackedElements[s];\n                    };\n                };\n            };\n        ;\n        },\n        trackComposer: function(s, t, u) {\n            this.setComposerTargetData(u);\n            this.startTracking(s, \"composer\", this.cTargetID, this.cTargetFBType, t);\n        },\n        trackFeedbackForm: function(s, t, u) {\n            this.init();\n            this.impressionID = ((this.impressionID || u));\n            var v, w, x;\n            v = h.getID(s);\n            w = ((t ? ((t.targetID || \"unknown\")) : \"unknown\"));\n            x = ((t ? ((t.targetType || \"unknown\")) : \"unknown\"));\n            this.feedbackForms[v] = {\n                parent_fbid: w,\n                parent_type: x\n            };\n        },\n        trackMentionsInput: function(s, t) {\n            this.init();\n            var u, v, w;\n            if (!s) {\n                return;\n            }\n        ;\n        ;\n            u = l.byTag(s, \"form\");\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            v = h.getID(u);\n            w = this.feedbackForms[v];\n            if (!w) {\n                return;\n            }\n        ;\n        ;\n            var x = ((t || w.parent_fbid)), y = ((t ? 416 : w.parent_type));\n            this.startTracking(s, \"comment\", x, y, u);\n        },\n        startTracking: function(s, t, u, v, w) {\n            this.init();\n            var x = h.getID(s);\n            if (this.getTracker(x)) {\n                return;\n            }\n        ;\n        ;\n            var y = h.getID(w);\n            j.listen(s, \"keyup\", p.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: t,\n                impid: this.impressionID,\n                parent_fbid: u,\n                parent_type: v,\n                parentElID: y\n            };\n            this.addJoinTableInfoToForm(w, x);\n        },\n        getTracker: function(s) {\n            return ((this.trackedElements ? this.trackedElements[s] : null));\n        },\n        setSubmitted: function(s, t) {\n            if (this.trackedElements[s]) {\n                this.trackedElements[s].submitted = t;\n            }\n        ;\n        ;\n        },\n        incrementClearCounter: function(s) {\n            var t = this.getTracker(s);\n            if (!t) {\n                return;\n            }\n        ;\n        ;\n            t.clearcounter++;\n            t.submitted = false;\n            var u = h.scry(k(t.parentElID), \"input[name=\\\"clp\\\"]\")[0];\n            if (u) {\n                u.value = this.getJSONRepForTrackerID(s);\n            }\n        ;\n        ;\n            this.trackedElements[s] = t;\n        },\n        addJoinTableInfoToForm: function(s, t) {\n            var u = this.getTracker(t);\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            var v = h.scry(s, \"input[name=\\\"clp\\\"]\")[0];\n            if (!v) {\n                h.prependContent(s, h.create(\"input\", {\n                    type: \"hidden\",\n                    JSBNG__name: \"clp\",\n                    value: this.getJSONRepForTrackerID(t)\n                }));\n            }\n        ;\n        ;\n        },\n        getCLParamsForTarget: function(s, t) {\n            if (!s) {\n                return \"\";\n            }\n        ;\n        ;\n            var u = h.getID(s);\n            return this.getJSONRepForTrackerID(u, t);\n        },\n        getJSONRepForTrackerID: function(s, t) {\n            var u = this.getTracker(s);\n            if (!u) {\n                return \"\";\n            }\n        ;\n        ;\n            return JSON.stringify({\n                cl_impid: u.impid,\n                clearcounter: u.clearcounter,\n                elementid: s,\n                version: \"x\",\n                parent_fbid: ((t || u.parent_fbid))\n            });\n        }\n    }, r = function(s) {\n        return i(function() {\n            q.incrementClearCounter(s);\n        }, m, q);\n    };\n    e.exports = q;\n});\n__d(\"ChannelConstants\", [], function(a, b, c, d, e, f) {\n    var g = \"channel/\", h = {\n        ON_SHUTDOWN: ((g + \"shutdown\")),\n        ON_INVALID_HISTORY: ((g + \"invalid_history\")),\n        ON_CONFIG: ((g + \"config\")),\n        ON_ENTER_STATE: ((g + \"enter_state\")),\n        ON_EXIT_STATE: ((g + \"exit_state\")),\n        OK: \"ok\",\n        ERROR: \"error\",\n        ERROR_MAX: \"error_max\",\n        ERROR_MISSING: \"error_missing\",\n        ERROR_MSG_TYPE: \"error_msg_type\",\n        ERROR_SHUTDOWN: \"error_shutdown\",\n        ERROR_STALE: \"error_stale\",\n        SYS_OWNER: \"sys_owner\",\n        SYS_NONOWNER: \"sys_nonowner\",\n        SYS_ONLINE: \"sys_online\",\n        SYS_OFFLINE: \"sys_offline\",\n        SYS_TIMETRAVEL: \"sys_timetravel\",\n        HINT_AUTH: \"shutdown auth\",\n        HINT_CONN: \"shutdown conn\",\n        HINT_DISABLED: \"shutdown disabled\",\n        HINT_INVALID_STATE: \"shutdown invalid state\",\n        HINT_MAINT: \"shutdown maint\",\n        HINT_UNSUPPORTED: \"shutdown unsupported\",\n        reason_Unknown: 0,\n        reason_AsyncError: 1,\n        reason_TooLong: 2,\n        reason_Refresh: 3,\n        reason_RefreshDelay: 4,\n        reason_UIRestart: 5,\n        reason_NeedSeq: 6,\n        reason_PrevFailed: 7,\n        reason_IFrameLoadGiveUp: 8,\n        reason_IFrameLoadRetry: 9,\n        reason_IFrameLoadRetryWorked: 10,\n        reason_PageTransitionRetry: 11,\n        reason_IFrameLoadMaxSubdomain: 12,\n        reason_NoChannelInfo: 13,\n        reason_NoChannelHost: 14,\n        CAPABILITY_VOIP: 8,\n        getArbiterType: function(i) {\n            return ((((g + \"message:\")) + i));\n        }\n    };\n    e.exports = h;\n});\n__d(\"ShortProfiles\", [\"ArbiterMixin\",\"AjaxLoader\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AjaxLoader\"), i = b(\"Env\"), j = b(\"FBAjaxRequest\"), k = b(\"JSLogger\"), l = b(\"copyProperties\"), m = \"/ajax/chat/user_info.php\", n = \"/ajax/chat/user_info_all.php\", o = new h(m, \"profiles\"), p = false, q = k.create(\"short_profiles\");\n    function r() {\n        if (!p) {\n            q.log(\"fetch_all\");\n            p = true;\n            var u = new j(\"GET\", n, {\n                viewer: i.user\n            });\n            u.onJSON = function(v) {\n                o.set(v.json);\n                t.inform(\"updated\");\n            };\n            u.send();\n        }\n    ;\n    ;\n    };\n;\n    function s(u) {\n        return JSON.parse(JSON.stringify(u));\n    };\n;\n    var t = {\n    };\n    l(t, g, {\n        get: function(u, v) {\n            this.getMulti([u,], function(w) {\n                v(w[u], u);\n            });\n        },\n        getMulti: function(u, v) {\n            function w(x) {\n                v(s(x));\n            };\n        ;\n            o.get(u, w);\n        },\n        getNow: function(u) {\n            return s(((o.getNow(u) || null)));\n        },\n        getNowUnsafe: function(u) {\n            return ((o.getNow(u) || null));\n        },\n        getCachedProfileIDs: function() {\n            return o.getCachedKeys();\n        },\n        hasAll: function() {\n            return p;\n        },\n        fetchAll: function() {\n            r();\n        },\n        set: function(u, v) {\n            var w = {\n            };\n            w[u] = v;\n            this.setMulti(w);\n        },\n        setMulti: function(u) {\n            o.set(s(u));\n        }\n    });\n    e.exports = t;\n});\n__d(\"ClickTTIIdentifiers\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            TIMELINE_SEE_LIKERS: \"timeline:seelikes\"\n        },\n        getUserActionID: function(h) {\n            return ((((\"{\\\"ua_id\\\":\\\"\" + h)) + \"\\\"}\"));\n        }\n    };\n    e.exports = g;\n});\n__d(\"ReactCurrentOwner\", [], function(a, b, c, d, e, f) {\n    var g = {\n        current: null\n    };\n    e.exports = g;\n});\n__d(\"CSSProperty\", [], function(a, b, c, d, e, f) {\n    var g = {\n        fillOpacity: true,\n        fontWeight: true,\n        opacity: true,\n        orphans: true,\n        zIndex: true,\n        zoom: true\n    }, h = {\n        background: {\n            backgroundImage: true,\n            backgroundPosition: true,\n            backgroundRepeat: true,\n            backgroundColor: true\n        },\n        border: {\n            borderWidth: true,\n            borderStyle: true,\n            borderColor: true\n        },\n        borderBottom: {\n            borderBottomWidth: true,\n            borderBottomStyle: true,\n            borderBottomColor: true\n        },\n        borderLeft: {\n            borderLeftWidth: true,\n            borderLeftStyle: true,\n            borderLeftColor: true\n        },\n        borderRight: {\n            borderRightWidth: true,\n            borderRightStyle: true,\n            borderRightColor: true\n        },\n        borderTop: {\n            borderTopWidth: true,\n            borderTopStyle: true,\n            borderTopColor: true\n        },\n        font: {\n            fontStyle: true,\n            fontVariant: true,\n            fontWeight: true,\n            fontSize: true,\n            lineHeight: true,\n            fontFamily: true\n        }\n    }, i = {\n        isUnitlessNumber: g,\n        shorthandPropertyExpansions: h\n    };\n    e.exports = i;\n});\n__d(\"dangerousStyleValue\", [\"CSSProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\");\n    function h(i, j) {\n        var k = ((((((j == null)) || ((typeof j === \"boolean\")))) || ((j === \"\"))));\n        if (k) {\n            return \"\";\n        }\n    ;\n    ;\n        var l = isNaN(j);\n        if (((((l || ((j === 0)))) || g.isUnitlessNumber[i]))) {\n            return ((\"\" + j));\n        }\n    ;\n    ;\n        return ((j + \"px\"));\n    };\n;\n    e.exports = h;\n});\n__d(\"throwIf\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        if (h) {\n            throw new Error(i);\n        }\n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"escapeTextForBrowser\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h, i = {\n        \"&\": \"&amp;\",\n        \"\\u003E\": \"&gt;\",\n        \"\\u003C\": \"&lt;\",\n        \"\\\"\": \"&quot;\",\n        \"'\": \"&#x27;\",\n        \"/\": \"&#x2f;\"\n    };\n    function j(l) {\n        return i[l];\n    };\n;\n    var k = function(l) {\n        var m = typeof l, n = ((m === \"object\"));\n        if (((((l === \"\")) || n))) {\n            return \"\";\n        }\n         else if (((m === \"string\"))) {\n            return l.replace(/[&><\"'\\/]/g, j);\n        }\n         else return ((\"\" + l)).replace(/[&><\"'\\/]/g, j)\n        \n    ;\n    };\n    e.exports = k;\n});\n__d(\"memoizeStringOnly\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = {\n        };\n        return function(j) {\n            if (i.hasOwnProperty(j)) {\n                return i[j];\n            }\n             else return i[j] = h.call(this, j)\n        ;\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"CSSPropertyOperations\", [\"CSSProperty\",\"dangerousStyleValue\",\"escapeTextForBrowser\",\"hyphenate\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\"), h = b(\"dangerousStyleValue\"), i = b(\"escapeTextForBrowser\"), j = b(\"hyphenate\"), k = b(\"memoizeStringOnly\"), l = k(function(n) {\n        return i(j(n));\n    }), m = {\n        createMarkupForStyles: function(n) {\n            var o = \"\";\n            {\n                var fin51keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin51i = (0);\n                var p;\n                for (; (fin51i < fin51keys.length); (fin51i++)) {\n                    ((p) = (fin51keys[fin51i]));\n                    {\n                        if (!n.hasOwnProperty(p)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var q = n[p];\n                        if (((q != null))) {\n                            o += ((l(p) + \":\"));\n                            o += ((h(p, q) + \";\"));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ((o || null));\n        },\n        setValueForStyles: function(n, o) {\n            var p = n.style;\n            {\n                var fin52keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin52i = (0);\n                var q;\n                for (; (fin52i < fin52keys.length); (fin52i++)) {\n                    ((q) = (fin52keys[fin52i]));\n                    {\n                        if (!o.hasOwnProperty(q)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var r = h(q, o[q]);\n                        if (r) {\n                            p[q] = r;\n                        }\n                         else {\n                            var s = g.shorthandPropertyExpansions[q];\n                            if (s) {\n                                {\n                                    var fin53keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin53i = (0);\n                                    var t;\n                                    for (; (fin53i < fin53keys.length); (fin53i++)) {\n                                        ((t) = (fin53keys[fin53i]));\n                                        {\n                                            p[t] = \"\";\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                             else p[q] = \"\";\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ExecutionEnvironment\", [], function(a, b, c, d, e, f) {\n    var g = ((typeof window !== \"undefined\")), h = {\n        canUseDOM: g,\n        canUseWorkers: ((typeof JSBNG__Worker !== \"undefined\")),\n        isInWorker: !g,\n        global: new Function(\"return this;\")()\n    };\n    e.exports = h;\n});\n__d(\"Danger\", [\"ExecutionEnvironment\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"throwIf\"), i, j, k, l, m = {\n    };\n    function n(t) {\n        var u = t.tagName;\n        return ((m[u] || (m[u] = JSBNG__document.createElement(u))));\n    };\n;\n    function o(t, u, v) {\n        if (v) {\n            if (v.nextSibling) {\n                return t.insertBefore(u, v.nextSibling);\n            }\n             else return t.appendChild(u)\n        ;\n        }\n         else return t.insertBefore(u, t.firstChild)\n    ;\n    };\n;\n    function p(t, u, v) {\n        var w, x = u.length;\n        for (var y = 0; ((y < x)); y++) {\n            w = o(t, u[0], ((w || v)));\n        ;\n        };\n    ;\n    };\n;\n    function q(t, u, v) {\n        var w = n(t);\n        w.innerHTML = u;\n        var x = w.childNodes, y = ((v ? t.childNodes[((v - 1))] : null));\n        p(t, x, y);\n    };\n;\n    function r(t, u) {\n        var v = t.parentNode, w = n(v);\n        w.innerHTML = u;\n        var x = w.childNodes;\n        v.replaceChild(x[0], t);\n    };\n;\n    var s = {\n        dangerouslyInsertMarkupAt: q,\n        dangerouslyReplaceNodeWithMarkup: r\n    };\n    e.exports = s;\n});\n__d(\"insertNodeAt\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = h.childNodes, l = h.childNodes[j];\n        if (((l === i))) {\n            return i;\n        }\n    ;\n    ;\n        if (i.parentNode) {\n            i.parentNode.removeChild(i);\n        }\n    ;\n    ;\n        if (((j >= k.length))) {\n            h.appendChild(i);\n        }\n         else h.insertBefore(i, k[j]);\n    ;\n    ;\n        return i;\n    };\n;\n    e.exports = g;\n});\n__d(\"keyOf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i;\n        {\n            var fin54keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin54i = (0);\n            (0);\n            for (; (fin54i < fin54keys.length); (fin54i++)) {\n                ((i) = (fin54keys[fin54i]));\n                {\n                    if (!h.hasOwnProperty(i)) {\n                        continue;\n                    }\n                ;\n                ;\n                    return i;\n                };\n            };\n        };\n    ;\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"DOMChildrenOperations\", [\"Danger\",\"insertNodeAt\",\"keyOf\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"Danger\"), h = b(\"insertNodeAt\"), i = b(\"keyOf\"), j = b(\"throwIf\"), k, l = i({\n        moveFrom: null\n    }), m = i({\n        insertMarkup: null\n    }), n = i({\n        removeAt: null\n    }), o = function(u, v) {\n        var w, x, y;\n        for (var z = 0; ((z < v.length)); z++) {\n            x = v[z];\n            if (((l in x))) {\n                w = ((w || []));\n                y = x.moveFrom;\n                w[y] = u.childNodes[y];\n            }\n             else if (((n in x))) {\n                w = ((w || []));\n                y = x.removeAt;\n                w[y] = u.childNodes[y];\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return w;\n    }, p = function(u, v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            if (x) {\n                u.removeChild(v[w]);\n            }\n        ;\n        ;\n        };\n    ;\n    }, q = function(u, v, w) {\n        var x, y, z = -1, aa;\n        for (var ba = 0; ((ba < v.length)); ba++) {\n            aa = v[ba];\n            if (((l in aa))) {\n                x = w[aa.moveFrom];\n                y = aa.finalIndex;\n                h(u, x, y);\n            }\n             else if (!((n in aa))) {\n                if (((m in aa))) {\n                    y = aa.finalIndex;\n                    var ca = aa.insertMarkup;\n                    g.dangerouslyInsertMarkupAt(u, ca, y);\n                }\n            ;\n            }\n            \n        ;\n        ;\n        };\n    ;\n    }, r = function(u, v) {\n        var w = o(u, v);\n        if (w) {\n            p(u, w);\n        }\n    ;\n    ;\n        q(u, v, w);\n    }, s = function(u, v, w) {\n        u.childNodes[v].nodeValue = w;\n    }, t = {\n        dangerouslyReplaceNodeWithMarkup: g.dangerouslyReplaceNodeWithMarkup,\n        manageChildren: r,\n        setTextNodeValueAtIndex: s\n    };\n    e.exports = t;\n});\n__d(\"DOMProperty\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        MUST_USE_ATTRIBUTE: 1,\n        MUST_USE_PROPERTY: 2,\n        HAS_BOOLEAN_VALUE: 4,\n        HAS_SIDE_EFFECTS: 8,\n        injectDOMPropertyConfig: function(k) {\n            var l = ((k.Properties || {\n            })), m = ((k.DOMAttributeNames || {\n            })), n = ((k.DOMPropertyNames || {\n            })), o = ((k.DOMMutationMethods || {\n            }));\n            if (k.isCustomAttribute) {\n                j._isCustomAttributeFunctions.push(k.isCustomAttribute);\n            }\n        ;\n        ;\n            {\n                var fin55keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin55i = (0);\n                var p;\n                for (; (fin55i < fin55keys.length); (fin55i++)) {\n                    ((p) = (fin55keys[fin55i]));\n                    {\n                        g(!j.isStandardName[p]);\n                        j.isStandardName[p] = true;\n                        j.getAttributeName[p] = ((m[p] || p.toLowerCase()));\n                        j.getPropertyName[p] = ((n[p] || p));\n                        var q = o[p];\n                        if (q) {\n                            j.getMutationMethod[p] = q;\n                        }\n                    ;\n                    ;\n                        var r = l[p];\n                        j.mustUseAttribute[p] = ((r & h.MUST_USE_ATTRIBUTE));\n                        j.mustUseProperty[p] = ((r & h.MUST_USE_PROPERTY));\n                        j.hasBooleanValue[p] = ((r & h.HAS_BOOLEAN_VALUE));\n                        j.hasSideEffects[p] = ((r & h.HAS_SIDE_EFFECTS));\n                        g(((!j.mustUseAttribute[p] || !j.mustUseProperty[p])));\n                        g(((j.mustUseProperty[p] || !j.hasSideEffects[p])));\n                    };\n                };\n            };\n        ;\n        }\n    }, i = {\n    }, j = {\n        isStandardName: {\n        },\n        getAttributeName: {\n        },\n        getPropertyName: {\n        },\n        getMutationMethod: {\n        },\n        mustUseAttribute: {\n        },\n        mustUseProperty: {\n        },\n        hasBooleanValue: {\n        },\n        hasSideEffects: {\n        },\n        _isCustomAttributeFunctions: [],\n        isCustomAttribute: function(k) {\n            return j._isCustomAttributeFunctions.some(function(l) {\n                return l.call(null, k);\n            });\n        },\n        getDefaultValueForProperty: function(k, l) {\n            var m = i[k], n;\n            if (!m) {\n                i[k] = m = {\n                };\n            }\n        ;\n        ;\n            if (!((l in m))) {\n                n = JSBNG__document.createElement(k);\n                m[l] = n[l];\n            }\n        ;\n        ;\n            return m[l];\n        },\n        injection: h\n    };\n    e.exports = j;\n});\n__d(\"DOMPropertyOperations\", [\"DOMProperty\",\"escapeTextForBrowser\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = b(\"escapeTextForBrowser\"), i = b(\"memoizeStringOnly\"), j = i(function(l) {\n        return ((h(l) + \"=\\\"\"));\n    }), k = {\n        createMarkupForProperty: function(l, m) {\n            if (g.isStandardName[l]) {\n                if (((((m == null)) || ((g.hasBooleanValue[l] && !m))))) {\n                    return \"\";\n                }\n            ;\n            ;\n                var n = g.getAttributeName[l];\n                return ((((j(n) + h(m))) + \"\\\"\"));\n            }\n             else if (g.isCustomAttribute(l)) {\n                if (((m == null))) {\n                    return \"\";\n                }\n            ;\n            ;\n                return ((((j(l) + h(m))) + \"\\\"\"));\n            }\n             else return null\n            \n        ;\n        },\n        setValueForProperty: function(l, m, n) {\n            if (g.isStandardName[m]) {\n                var o = g.getMutationMethod[m];\n                if (o) {\n                    o(l, n);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    if (((g.hasBooleanValue[m] && !n))) {\n                        l.removeAttribute(g.getAttributeName[m]);\n                    }\n                     else l.setAttribute(g.getAttributeName[m], n);\n                ;\n                ;\n                }\n                 else {\n                    var p = g.getPropertyName[m];\n                    if (((!g.hasSideEffects[m] || ((l[p] !== n))))) {\n                        l[p] = n;\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.setAttribute(m, n);\n            }\n            \n        ;\n        ;\n        },\n        deleteValueForProperty: function(l, m) {\n            if (g.isStandardName[m]) {\n                var n = g.getMutationMethod[m];\n                if (n) {\n                    n(l, undefined);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    l.removeAttribute(g.getAttributeName[m]);\n                }\n                 else {\n                    var o = g.getPropertyName[m];\n                    l[o] = g.getDefaultValueForProperty(l.nodeName, m);\n                }\n                \n            ;\n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.removeAttribute(m);\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"keyMirror\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"NOT_OBJECT_ERROR\", i = function(j) {\n        var k = {\n        }, l;\n        g(((!((j instanceof Object)) || Array.isArray(j))), h);\n        {\n            var fin56keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin56i = (0);\n            (0);\n            for (; (fin56i < fin56keys.length); (fin56i++)) {\n                ((l) = (fin56keys[fin56i]));\n                {\n                    if (!j.hasOwnProperty(l)) {\n                        continue;\n                    }\n                ;\n                ;\n                    k[l] = l;\n                };\n            };\n        };\n    ;\n        return k;\n    };\n    e.exports = i;\n});\n__d(\"EventConstants\", [\"keyMirror\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = g({\n        bubbled: null,\n        captured: null\n    }), i = g({\n        topBlur: null,\n        topChange: null,\n        topClick: null,\n        topDOMCharacterDataModified: null,\n        topDoubleClick: null,\n        topDrag: null,\n        topDragEnd: null,\n        topDragEnter: null,\n        topDragExit: null,\n        topDragLeave: null,\n        topDragOver: null,\n        topDragStart: null,\n        topDrop: null,\n        topFocus: null,\n        topInput: null,\n        topKeyDown: null,\n        topKeyPress: null,\n        topKeyUp: null,\n        topMouseDown: null,\n        topMouseMove: null,\n        topMouseOut: null,\n        topMouseOver: null,\n        topMouseUp: null,\n        topScroll: null,\n        topSelectionChange: null,\n        topSubmit: null,\n        topTouchCancel: null,\n        topTouchEnd: null,\n        topTouchMove: null,\n        topTouchStart: null,\n        topWheel: null\n    }), j = {\n        topLevelTypes: i,\n        PropagationPhases: h\n    };\n    e.exports = j;\n});\n__d(\"EventListener\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = {\n        listen: g.listen,\n        capture: function(i, j, k) {\n            if (!i.JSBNG__addEventListener) {\n                return;\n            }\n             else i.JSBNG__addEventListener(j, k, true);\n        ;\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"CallbackRegistry\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        putListener: function(i, j, k) {\n            var l = ((g[j] || (g[j] = {\n            })));\n            l[i] = k;\n        },\n        getListener: function(i, j) {\n            var k = g[j];\n            return ((k && k[i]));\n        },\n        deleteListener: function(i, j) {\n            var k = g[j];\n            if (k) {\n                delete k[i];\n            }\n        ;\n        ;\n        },\n        deleteAllListeners: function(i) {\n            {\n                var fin57keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin57i = (0);\n                var j;\n                for (; (fin57i < fin57keys.length); (fin57i++)) {\n                    ((j) = (fin57keys[fin57i]));\n                    {\n                        delete g[j][i];\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        __purge: function() {\n            g = {\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"EventPluginRegistry\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = null, i = {\n    };\n    function j() {\n        if (!h) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin58keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin58i = (0);\n            var n;\n            for (; (fin58i < fin58keys.length); (fin58i++)) {\n                ((n) = (fin58keys[fin58i]));\n                {\n                    var o = i[n], p = h.indexOf(n);\n                    g(((p > -1)));\n                    if (m.plugins[p]) {\n                        continue;\n                    }\n                ;\n                ;\n                    g(o.extractEvents);\n                    m.plugins[p] = o;\n                    var q = o.eventTypes;\n                    {\n                        var fin59keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin59i = (0);\n                        var r;\n                        for (; (fin59i < fin59keys.length); (fin59i++)) {\n                            ((r) = (fin59keys[fin59i]));\n                            {\n                                g(k(q[r], o));\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function k(n, o) {\n        var p = n.phasedRegistrationNames;\n        if (p) {\n            {\n                var fin60keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin60i = (0);\n                var q;\n                for (; (fin60i < fin60keys.length); (fin60i++)) {\n                    ((q) = (fin60keys[fin60i]));\n                    {\n                        if (p.hasOwnProperty(q)) {\n                            var r = p[q];\n                            l(r, o);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return true;\n        }\n         else if (n.registrationName) {\n            l(n.registrationName, o);\n            return true;\n        }\n        \n    ;\n    ;\n        return false;\n    };\n;\n    function l(n, o) {\n        g(!m.registrationNames[n]);\n        m.registrationNames[n] = o;\n        m.registrationNamesKeys.push(n);\n    };\n;\n    var m = {\n        plugins: [],\n        registrationNames: {\n        },\n        registrationNamesKeys: [],\n        injectEventPluginOrder: function(n) {\n            g(!h);\n            h = Array.prototype.slice.call(n);\n            j();\n        },\n        injectEventPluginsByName: function(n) {\n            var o = false;\n            {\n                var fin61keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin61i = (0);\n                var p;\n                for (; (fin61i < fin61keys.length); (fin61i++)) {\n                    ((p) = (fin61keys[fin61i]));\n                    {\n                        if (!n.hasOwnProperty(p)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var q = n[p];\n                        if (((i[p] !== q))) {\n                            g(!i[p]);\n                            i[p] = q;\n                            o = true;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (o) {\n                j();\n            }\n        ;\n        ;\n        },\n        getPluginModuleForEvent: function(JSBNG__event) {\n            var n = JSBNG__event.dispatchConfig;\n            if (n.registrationName) {\n                return ((m.registrationNames[n.registrationName] || null));\n            }\n        ;\n        ;\n            {\n                var fin62keys = ((window.top.JSBNG_Replay.forInKeys)((n.phasedRegistrationNames))), fin62i = (0);\n                var o;\n                for (; (fin62i < fin62keys.length); (fin62i++)) {\n                    ((o) = (fin62keys[fin62i]));\n                    {\n                        if (!n.phasedRegistrationNames.hasOwnProperty(o)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var p = m.registrationNames[n.phasedRegistrationNames[o]];\n                        if (p) {\n                            return p;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return null;\n        },\n        _resetEventPlugins: function() {\n            h = null;\n            {\n                var fin63keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin63i = (0);\n                var n;\n                for (; (fin63i < fin63keys.length); (fin63i++)) {\n                    ((n) = (fin63keys[fin63i]));\n                    {\n                        if (i.hasOwnProperty(n)) {\n                            delete i[n];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            m.plugins.length = 0;\n            var o = m.registrationNames;\n            {\n                var fin64keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin64i = (0);\n                var p;\n                for (; (fin64i < fin64keys.length); (fin64i++)) {\n                    ((p) = (fin64keys[fin64i]));\n                    {\n                        if (o.hasOwnProperty(p)) {\n                            delete o[p];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            m.registrationNamesKeys.length = 0;\n        }\n    };\n    e.exports = m;\n});\n__d(\"EventPluginUtils\", [\"EventConstants\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"invariant\"), i = g.topLevelTypes;\n    function j(u) {\n        return ((((((u === i.topMouseUp)) || ((u === i.topTouchEnd)))) || ((u === i.topTouchCancel))));\n    };\n;\n    function k(u) {\n        return ((((u === i.topMouseMove)) || ((u === i.topTouchMove))));\n    };\n;\n    function l(u) {\n        return ((((u === i.topMouseDown)) || ((u === i.topTouchStart))));\n    };\n;\n    var m;\n    function n(JSBNG__event, u) {\n        var v = JSBNG__event._dispatchListeners, w = JSBNG__event._dispatchIDs;\n        if (Array.isArray(v)) {\n            for (var x = 0; ((x < v.length)); x++) {\n                if (JSBNG__event.isPropagationStopped()) {\n                    break;\n                }\n            ;\n            ;\n                u(JSBNG__event, v[x], w[x]);\n            };\n        ;\n        }\n         else if (v) {\n            u(JSBNG__event, v, w);\n        }\n        \n    ;\n    ;\n    };\n;\n    function o(JSBNG__event, u, v) {\n        u(JSBNG__event, v);\n    };\n;\n    function p(JSBNG__event, u) {\n        n(JSBNG__event, u);\n        JSBNG__event._dispatchListeners = null;\n        JSBNG__event._dispatchIDs = null;\n    };\n;\n    function q(JSBNG__event) {\n        var u = JSBNG__event._dispatchListeners, v = JSBNG__event._dispatchIDs;\n        if (Array.isArray(u)) {\n            for (var w = 0; ((w < u.length)); w++) {\n                if (JSBNG__event.isPropagationStopped()) {\n                    break;\n                }\n            ;\n            ;\n                if (u[w](JSBNG__event, v[w])) {\n                    return v[w];\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else if (u) {\n            if (u(JSBNG__event, v)) {\n                return v;\n            }\n        ;\n        }\n        \n    ;\n    ;\n        return null;\n    };\n;\n    function r(JSBNG__event) {\n        var u = JSBNG__event._dispatchListeners, v = JSBNG__event._dispatchIDs;\n        h(!Array.isArray(u));\n        var w = ((u ? u(JSBNG__event, v) : null));\n        JSBNG__event._dispatchListeners = null;\n        JSBNG__event._dispatchIDs = null;\n        return w;\n    };\n;\n    function s(JSBNG__event) {\n        return !!JSBNG__event._dispatchListeners;\n    };\n;\n    var t = {\n        isEndish: j,\n        isMoveish: k,\n        isStartish: l,\n        executeDispatchesInOrder: p,\n        executeDispatchesInOrderStopAtTrue: q,\n        executeDirectDispatch: r,\n        hasDispatches: s,\n        executeDispatch: o\n    };\n    e.exports = t;\n});\n__d(\"accumulate\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"INVALID_ACCUM_ARGS\";\n    function i(j, k) {\n        var l = ((j == null)), m = ((k === null));\n        if (m) {\n            return j;\n        }\n         else if (l) {\n            return k;\n        }\n         else {\n            var n = Array.isArray(j), o = Array.isArray(k);\n            if (n) {\n                return j.concat(k);\n            }\n             else if (o) {\n                return [j,].concat(k);\n            }\n             else return [j,k,]\n            \n        ;\n        }\n        \n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"forEachAccumulated\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i, j) {\n        if (Array.isArray(h)) {\n            h.forEach(i, j);\n        }\n         else if (h) {\n            i.call(j, h);\n        }\n        \n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventPropagators\", [\"CallbackRegistry\",\"EventConstants\",\"accumulate\",\"forEachAccumulated\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventConstants\"), i = b(\"accumulate\"), j = b(\"forEachAccumulated\"), k = g.getListener, l = h.PropagationPhases, m = {\n        InstanceHandle: null,\n        injectInstanceHandle: function(w) {\n            m.InstanceHandle = w;\n        },\n        validate: function() {\n            var w = ((((!m.InstanceHandle || !m.InstanceHandle.traverseTwoPhase)) || !m.InstanceHandle.traverseEnterLeave));\n            if (w) {\n                throw new Error(\"InstanceHandle not injected before use!\");\n            }\n        ;\n        ;\n        }\n    };\n    function n(w, JSBNG__event, x) {\n        var y = JSBNG__event.dispatchConfig.phasedRegistrationNames[x];\n        return k(w, y);\n    };\n;\n    function o(w, x, JSBNG__event) {\n        var y = ((x ? l.bubbled : l.captured)), z = n(w, JSBNG__event, y);\n        if (z) {\n            JSBNG__event._dispatchListeners = i(JSBNG__event._dispatchListeners, z);\n            JSBNG__event._dispatchIDs = i(JSBNG__event._dispatchIDs, w);\n        }\n    ;\n    ;\n    };\n;\n    function p(JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.phasedRegistrationNames))) {\n            m.InstanceHandle.traverseTwoPhase(JSBNG__event.dispatchMarker, o, JSBNG__event);\n        }\n    ;\n    ;\n    };\n;\n    function q(w, x, JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.registrationName))) {\n            var y = JSBNG__event.dispatchConfig.registrationName, z = k(w, y);\n            if (z) {\n                JSBNG__event._dispatchListeners = i(JSBNG__event._dispatchListeners, z);\n                JSBNG__event._dispatchIDs = i(JSBNG__event._dispatchIDs, w);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function r(JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.registrationName))) {\n            q(JSBNG__event.dispatchMarker, null, JSBNG__event);\n        }\n    ;\n    ;\n    };\n;\n    function s(w) {\n        j(w, p);\n    };\n;\n    function t(w, x, y, z) {\n        m.InstanceHandle.traverseEnterLeave(y, z, q, w, x);\n    };\n;\n    function u(w) {\n        j(w, r);\n    };\n;\n    var v = {\n        accumulateTwoPhaseDispatches: s,\n        accumulateDirectDispatches: u,\n        accumulateEnterLeaveDispatches: t,\n        injection: m\n    };\n    e.exports = v;\n});\n__d(\"EventPluginHub\", [\"CallbackRegistry\",\"EventPluginRegistry\",\"EventPluginUtils\",\"EventPropagators\",\"ExecutionEnvironment\",\"accumulate\",\"forEachAccumulated\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventPluginRegistry\"), i = b(\"EventPluginUtils\"), j = b(\"EventPropagators\"), k = b(\"ExecutionEnvironment\"), l = b(\"accumulate\"), m = b(\"forEachAccumulated\"), n = b(\"invariant\"), o = null, p = function(JSBNG__event) {\n        if (JSBNG__event) {\n            var r = i.executeDispatch, s = h.getPluginModuleForEvent(JSBNG__event);\n            if (((s && s.executeDispatch))) {\n                r = s.executeDispatch;\n            }\n        ;\n        ;\n            i.executeDispatchesInOrder(JSBNG__event, r);\n            if (!JSBNG__event.isPersistent()) {\n                JSBNG__event.constructor.release(JSBNG__event);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    }, q = {\n        injection: {\n            injectInstanceHandle: j.injection.injectInstanceHandle,\n            injectEventPluginOrder: h.injectEventPluginOrder,\n            injectEventPluginsByName: h.injectEventPluginsByName\n        },\n        registrationNames: h.registrationNames,\n        putListener: g.putListener,\n        getListener: g.getListener,\n        deleteListener: g.deleteListener,\n        deleteAllListeners: g.deleteAllListeners,\n        extractEvents: function(r, s, t, u) {\n            var v, w = h.plugins;\n            for (var x = 0, y = w.length; ((x < y)); x++) {\n                var z = w[x];\n                if (z) {\n                    var aa = z.extractEvents(r, s, t, u);\n                    if (aa) {\n                        v = l(v, aa);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return v;\n        },\n        enqueueEvents: function(r) {\n            if (r) {\n                o = l(o, r);\n            }\n        ;\n        ;\n        },\n        processEventQueue: function() {\n            var r = o;\n            o = null;\n            m(r, p);\n            n(!o);\n        }\n    };\n    if (k.canUseDOM) {\n        window.EventPluginHub = q;\n    }\n;\n;\n    e.exports = q;\n});\n__d(\"ReactUpdates\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = false, i = [];\n    function j(m) {\n        if (h) {\n            m();\n            return;\n        }\n    ;\n    ;\n        h = true;\n        try {\n            m();\n            for (var o = 0; ((o < i.length)); o++) {\n                var p = i[o];\n                if (p.isMounted()) {\n                    var q = p._pendingCallbacks;\n                    p._pendingCallbacks = null;\n                    p.performUpdateIfNecessary();\n                    if (q) {\n                        for (var r = 0; ((r < q.length)); r++) {\n                            q[r]();\n                        ;\n                        };\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        } catch (n) {\n            throw n;\n        } finally {\n            i.length = 0;\n            h = false;\n        };\n    ;\n    };\n;\n    function k(m, n) {\n        g(((!n || ((typeof n === \"function\")))));\n        if (!h) {\n            m.performUpdateIfNecessary();\n            ((n && n()));\n            return;\n        }\n    ;\n    ;\n        i.push(m);\n        if (n) {\n            if (m._pendingCallbacks) {\n                m._pendingCallbacks.push(n);\n            }\n             else m._pendingCallbacks = [n,];\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var l = {\n        batchedUpdates: j,\n        enqueueUpdate: k\n    };\n    e.exports = l;\n});\n__d(\"ViewportMetrics\", [], function(a, b, c, d, e, f) {\n    var g = {\n        currentScrollLeft: 0,\n        currentScrollTop: 0,\n        refreshScrollValues: function() {\n            g.currentScrollLeft = ((JSBNG__document.body.scrollLeft + JSBNG__document.documentElement.scrollLeft));\n            g.currentScrollTop = ((JSBNG__document.body.scrollTop + JSBNG__document.documentElement.scrollTop));\n        }\n    };\n    e.exports = g;\n});\n__d(\"isEventSupported\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h, i;\n    if (g.canUseDOM) {\n        h = JSBNG__document.createElement(\"div\");\n        i = ((((JSBNG__document.implementation && JSBNG__document.implementation.hasFeature)) && ((JSBNG__document.implementation.hasFeature(\"\", \"\") !== true))));\n    }\n;\n;\n    function j(k, l) {\n        if (((!h || ((l && !h.JSBNG__addEventListener))))) {\n            return false;\n        }\n    ;\n    ;\n        var m = JSBNG__document.createElement(\"div\"), n = ((\"JSBNG__on\" + k)), o = ((n in m));\n        if (!o) {\n            m.setAttribute(n, \"\");\n            o = ((typeof m[n] === \"function\"));\n            if (((typeof m[n] !== \"undefined\"))) {\n                m[n] = undefined;\n            }\n        ;\n        ;\n            m.removeAttribute(n);\n        }\n    ;\n    ;\n        if (((((!o && i)) && ((k === \"wheel\"))))) {\n            o = JSBNG__document.implementation.hasFeature(\"Events.wheel\", \"3.0\");\n        }\n    ;\n    ;\n        m = null;\n        return o;\n    };\n;\n    e.exports = j;\n});\n__d(\"ReactEventEmitter\", [\"EventConstants\",\"EventListener\",\"EventPluginHub\",\"ExecutionEnvironment\",\"ReactUpdates\",\"ViewportMetrics\",\"invariant\",\"isEventSupported\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventListener\"), i = b(\"EventPluginHub\"), j = b(\"ExecutionEnvironment\"), k = b(\"ReactUpdates\"), l = b(\"ViewportMetrics\"), m = b(\"invariant\"), n = b(\"isEventSupported\"), o = false;\n    function p(u, v, w) {\n        h.listen(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n;\n    function q(u, v, w) {\n        h.capture(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n;\n    function r() {\n        var u = l.refreshScrollValues;\n        h.listen(window, \"JSBNG__scroll\", u);\n        h.listen(window, \"resize\", u);\n    };\n;\n    function s(u) {\n        m(!o);\n        var v = g.topLevelTypes, w = JSBNG__document;\n        r();\n        p(v.topMouseOver, \"mouseover\", w);\n        p(v.topMouseDown, \"mousedown\", w);\n        p(v.topMouseUp, \"mouseup\", w);\n        p(v.topMouseMove, \"mousemove\", w);\n        p(v.topMouseOut, \"mouseout\", w);\n        p(v.topClick, \"click\", w);\n        p(v.topDoubleClick, \"dblclick\", w);\n        if (u) {\n            p(v.topTouchStart, \"touchstart\", w);\n            p(v.topTouchEnd, \"touchend\", w);\n            p(v.topTouchMove, \"touchmove\", w);\n            p(v.topTouchCancel, \"touchcancel\", w);\n        }\n    ;\n    ;\n        p(v.topKeyUp, \"keyup\", w);\n        p(v.topKeyPress, \"keypress\", w);\n        p(v.topKeyDown, \"keydown\", w);\n        p(v.topInput, \"input\", w);\n        p(v.topChange, \"change\", w);\n        p(v.topSelectionChange, \"selectionchange\", w);\n        p(v.topDOMCharacterDataModified, \"DOMCharacterDataModified\", w);\n        if (n(\"drag\")) {\n            p(v.topDrag, \"drag\", w);\n            p(v.topDragEnd, \"dragend\", w);\n            p(v.topDragEnter, \"dragenter\", w);\n            p(v.topDragExit, \"dragexit\", w);\n            p(v.topDragLeave, \"dragleave\", w);\n            p(v.topDragOver, \"dragover\", w);\n            p(v.topDragStart, \"dragstart\", w);\n            p(v.topDrop, \"drop\", w);\n        }\n    ;\n    ;\n        if (n(\"wheel\")) {\n            p(v.topWheel, \"wheel\", w);\n        }\n         else if (n(\"mousewheel\")) {\n            p(v.topWheel, \"mousewheel\", w);\n        }\n         else p(v.topWheel, \"DOMMouseScroll\", w);\n        \n    ;\n    ;\n        if (n(\"JSBNG__scroll\", true)) {\n            q(v.topScroll, \"JSBNG__scroll\", w);\n        }\n         else p(v.topScroll, \"JSBNG__scroll\", window);\n    ;\n    ;\n        if (n(\"JSBNG__focus\", true)) {\n            q(v.topFocus, \"JSBNG__focus\", w);\n            q(v.topBlur, \"JSBNG__blur\", w);\n        }\n         else if (n(\"focusin\")) {\n            p(v.topFocus, \"focusin\", w);\n            p(v.topBlur, \"focusout\", w);\n        }\n        \n    ;\n    ;\n    };\n;\n    var t = {\n        TopLevelCallbackCreator: null,\n        ensureListening: function(u, v) {\n            m(j.canUseDOM);\n            if (!o) {\n                t.TopLevelCallbackCreator = v;\n                s(u);\n                o = true;\n            }\n        ;\n        ;\n        },\n        setEnabled: function(u) {\n            m(j.canUseDOM);\n            if (t.TopLevelCallbackCreator) {\n                t.TopLevelCallbackCreator.setEnabled(u);\n            }\n        ;\n        ;\n        },\n        isEnabled: function() {\n            return !!((t.TopLevelCallbackCreator && t.TopLevelCallbackCreator.isEnabled()));\n        },\n        handleTopLevel: function(u, v, w, x) {\n            var y = i.extractEvents(u, v, w, x);\n            k.batchedUpdates(function() {\n                i.enqueueEvents(y);\n                i.processEventQueue();\n            });\n        },\n        registrationNames: i.registrationNames,\n        putListener: i.putListener,\n        getListener: i.getListener,\n        deleteListener: i.deleteListener,\n        deleteAllListeners: i.deleteAllListeners,\n        trapBubbledEvent: p,\n        trapCapturedEvent: q\n    };\n    e.exports = t;\n});\n__d(\"getEventTarget\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\");\n    function h(i) {\n        var j = ((((i.target || i.srcElement)) || g.global));\n        return ((((j.nodeType === 3)) ? j.parentNode : j));\n    };\n;\n    e.exports = h;\n});\n__d(\"ReactEventTopLevelCallback\", [\"ExecutionEnvironment\",\"ReactEventEmitter\",\"ReactID\",\"ReactInstanceHandles\",\"getEventTarget\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactID\"), j = b(\"ReactInstanceHandles\"), k = b(\"getEventTarget\"), l = true, m = {\n        setEnabled: function(n) {\n            l = !!n;\n        },\n        isEnabled: function() {\n            return l;\n        },\n        createTopLevelCallback: function(n) {\n            return function(o) {\n                if (!l) {\n                    return;\n                }\n            ;\n            ;\n                if (((o.srcElement && ((o.srcElement !== o.target))))) {\n                    o.target = o.srcElement;\n                }\n            ;\n            ;\n                var p = ((j.getFirstReactDOM(k(o)) || g.global)), q = ((i.getID(p) || \"\"));\n                h.handleTopLevel(n, p, q, o);\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReactInstanceHandles\", [\"ReactID\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactID\"), h = b(\"invariant\"), i = \".\", j = i.length, k = 100, l = 9999999;\n    function m(v) {\n        return ((((((i + \"r[\")) + v.toString(36))) + \"]\"));\n    };\n;\n    function n(v, w) {\n        return ((((v.charAt(w) === i)) || ((w === v.length))));\n    };\n;\n    function o(v) {\n        return ((((v === \"\")) || ((((v.charAt(0) === i)) && ((v.charAt(((v.length - 1))) !== i))))));\n    };\n;\n    function p(v, w) {\n        return ((((w.indexOf(v) === 0)) && n(w, v.length)));\n    };\n;\n    function q(v) {\n        return ((v ? v.substr(0, v.lastIndexOf(i)) : \"\"));\n    };\n;\n    function r(v, w) {\n        h(((o(v) && o(w))));\n        h(p(v, w));\n        if (((v === w))) {\n            return v;\n        }\n    ;\n    ;\n        var x = ((v.length + j));\n        for (var y = x; ((y < w.length)); y++) {\n            if (n(w, y)) {\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        return w.substr(0, y);\n    };\n;\n    function s(v, w) {\n        var x = Math.min(v.length, w.length);\n        if (((x === 0))) {\n            return \"\";\n        }\n    ;\n    ;\n        var y = 0;\n        for (var z = 0; ((z <= x)); z++) {\n            if (((n(v, z) && n(w, z)))) {\n                y = z;\n            }\n             else if (((v.charAt(z) !== w.charAt(z)))) {\n                break;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        var aa = v.substr(0, y);\n        h(o(aa));\n        return aa;\n    };\n;\n    function t(v, w, x, y, z, aa) {\n        v = ((v || \"\"));\n        w = ((w || \"\"));\n        h(((v !== w)));\n        var ba = p(w, v);\n        h(((ba || p(v, w))));\n        var ca = 0, da = ((ba ? q : r));\n        for (var ea = v; ; ea = da(ea, w)) {\n            if (((((!z || ((ea !== v)))) && ((!aa || ((ea !== w))))))) {\n                x(ea, ba, y);\n            }\n        ;\n        ;\n            if (((ea === w))) {\n                break;\n            }\n        ;\n        ;\n            h(((ca++ < k)));\n        };\n    ;\n    };\n;\n    var u = {\n        separator: i,\n        createReactRootID: function() {\n            return m(Math.ceil(((Math.JSBNG__random() * l))));\n        },\n        isRenderedByReact: function(v) {\n            if (((v.nodeType !== 1))) {\n                return false;\n            }\n        ;\n        ;\n            var w = g.getID(v);\n            return ((w ? ((w.charAt(0) === i)) : false));\n        },\n        getFirstReactDOM: function(v) {\n            var w = v;\n            while (((w && ((w.parentNode !== w))))) {\n                if (u.isRenderedByReact(w)) {\n                    return w;\n                }\n            ;\n            ;\n                w = w.parentNode;\n            };\n        ;\n            return null;\n        },\n        findComponentRoot: function(v, w) {\n            var x = [v.firstChild,], y = 0;\n            while (((y < x.length))) {\n                var z = x[y++];\n                while (z) {\n                    var aa = g.getID(z);\n                    if (aa) {\n                        if (((w === aa))) {\n                            return z;\n                        }\n                         else if (p(aa, w)) {\n                            x.length = y = 0;\n                            x.push(z.firstChild);\n                            break;\n                        }\n                         else x.push(z.firstChild);\n                        \n                    ;\n                    ;\n                    }\n                     else x.push(z.firstChild);\n                ;\n                ;\n                    z = z.nextSibling;\n                };\n            ;\n            };\n        ;\n            ((((a.JSBNG__console && emptyFunction)) && false));\n            h(false);\n        },\n        getReactRootIDFromNodeID: function(v) {\n            var w = /\\.r\\[[^\\]]+\\]/.exec(v);\n            return ((w && w[0]));\n        },\n        traverseEnterLeave: function(v, w, x, y, z) {\n            var aa = s(v, w);\n            if (((aa !== v))) {\n                t(v, aa, x, y, false, true);\n            }\n        ;\n        ;\n            if (((aa !== w))) {\n                t(aa, w, x, z, true, false);\n            }\n        ;\n        ;\n        },\n        traverseTwoPhase: function(v, w, x) {\n            if (v) {\n                t(\"\", v, w, x, true, false);\n                t(v, \"\", w, x, false, true);\n            }\n        ;\n        ;\n        },\n        _getFirstCommonAncestorID: s,\n        _getNextDescendantID: r\n    };\n    e.exports = u;\n});\n__d(\"ReactMount\", [\"ReactEventEmitter\",\"ReactInstanceHandles\",\"ReactEventTopLevelCallback\",\"ReactID\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactEventEmitter\"), h = b(\"ReactInstanceHandles\"), i = b(\"ReactEventTopLevelCallback\"), j = b(\"ReactID\"), k = b(\"$\"), l = {\n    }, m = {\n    };\n    function n(q) {\n        return ((q && q.firstChild));\n    };\n;\n    function o(q) {\n        var r = n(q);\n        return ((r && j.getID(r)));\n    };\n;\n    var p = {\n        totalInstantiationTime: 0,\n        totalInjectionTime: 0,\n        useTouchEvents: false,\n        scrollMonitor: function(q, r) {\n            r();\n        },\n        prepareTopLevelEvents: function(q) {\n            g.ensureListening(p.useTouchEvents, q);\n        },\n        _updateRootComponent: function(q, r, s, t) {\n            var u = r.props;\n            p.scrollMonitor(s, function() {\n                q.replaceProps(u, t);\n            });\n            return q;\n        },\n        _registerComponent: function(q, r) {\n            p.prepareTopLevelEvents(i);\n            var s = p.registerContainer(r);\n            l[s] = q;\n            return s;\n        },\n        _renderNewRootComponent: function(q, r, s) {\n            var t = p._registerComponent(q, r);\n            q.mountComponentIntoNode(t, r, s);\n            return q;\n        },\n        renderComponent: function(q, r, s) {\n            var t = l[o(r)];\n            if (t) {\n                if (((t.constructor === q.constructor))) {\n                    return p._updateRootComponent(t, q, r, s);\n                }\n                 else p.unmountAndReleaseReactRootNode(r);\n            ;\n            }\n        ;\n        ;\n            var u = n(r), v = ((u && h.isRenderedByReact(u))), w = ((v && !t)), x = p._renderNewRootComponent(q, r, w);\n            ((s && s()));\n            return x;\n        },\n        constructAndRenderComponent: function(q, r, s) {\n            return p.renderComponent(q(r), s);\n        },\n        constructAndRenderComponentByID: function(q, r, s) {\n            return p.constructAndRenderComponent(q, r, k(s));\n        },\n        registerContainer: function(q) {\n            var r = o(q);\n            if (r) {\n                r = h.getReactRootIDFromNodeID(r);\n            }\n        ;\n        ;\n            if (!r) {\n                r = h.createReactRootID();\n            }\n        ;\n        ;\n            m[r] = q;\n            return r;\n        },\n        unmountAndReleaseReactRootNode: function(q) {\n            var r = o(q), s = l[r];\n            if (!s) {\n                return false;\n            }\n        ;\n        ;\n            s.unmountComponentFromNode(q);\n            delete l[r];\n            delete m[r];\n            return true;\n        },\n        findReactContainerForID: function(q) {\n            var r = h.getReactRootIDFromNodeID(q);\n            return m[r];\n        },\n        findReactNodeByID: function(q) {\n            var r = p.findReactContainerForID(q);\n            return h.findComponentRoot(r, q);\n        }\n    };\n    e.exports = p;\n});\n__d(\"ReactID\", [\"invariant\",\"ReactMount\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactMount\"), i = \"data-reactid\", j = {\n    };\n    function k(s) {\n        var t = l(s);\n        if (t) {\n            if (j.hasOwnProperty(t)) {\n                var u = j[t];\n                if (((u !== s))) {\n                    g(!o(u, t));\n                    j[t] = s;\n                }\n            ;\n            ;\n            }\n             else j[t] = s;\n        ;\n        }\n    ;\n    ;\n        return t;\n    };\n;\n    function l(s) {\n        if (((s && s.getAttributeNode))) {\n            var t = s.getAttributeNode(i);\n            if (t) {\n                return ((t.value || \"\"));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return \"\";\n    };\n;\n    function m(s, t) {\n        var u = l(s);\n        if (((u !== t))) {\n            delete j[u];\n        }\n    ;\n    ;\n        s.setAttribute(i, t);\n        j[t] = s;\n    };\n;\n    function n(s) {\n        if (((!j.hasOwnProperty(s) || !o(j[s], s)))) {\n            j[s] = h.findReactNodeByID(s);\n        }\n    ;\n    ;\n        return j[s];\n    };\n;\n    function o(s, t) {\n        if (s) {\n            g(((l(s) === t)));\n            var u = h.findReactContainerForID(t);\n            if (((u && p(u, s)))) {\n                return true;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function p(s, t) {\n        if (s.contains) {\n            return s.contains(t);\n        }\n    ;\n    ;\n        if (((t === s))) {\n            return true;\n        }\n    ;\n    ;\n        if (((t.nodeType === 3))) {\n            t = t.parentNode;\n        }\n    ;\n    ;\n        while (((t && ((t.nodeType === 1))))) {\n            if (((t === s))) {\n                return true;\n            }\n        ;\n        ;\n            t = t.parentNode;\n        };\n    ;\n        return false;\n    };\n;\n    function q(s) {\n        delete j[s];\n    };\n;\n    function r() {\n        j = {\n        };\n    };\n;\n    f.ATTR_NAME = i;\n    f.getID = k;\n    f.setID = m;\n    f.getNode = n;\n    f.purgeID = q;\n    f.purgeEntireCache = r;\n});\n__d(\"getTextContentAccessor\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = null;\n    function i() {\n        if (((!h && g.canUseDOM))) {\n            h = ((((\"innerText\" in JSBNG__document.createElement(\"div\"))) ? \"innerText\" : \"textContent\"));\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = i;\n});\n__d(\"ReactDOMIDOperations\", [\"CSSPropertyOperations\",\"DOMChildrenOperations\",\"DOMPropertyOperations\",\"ReactID\",\"getTextContentAccessor\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMChildrenOperations\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactID\"), k = b(\"getTextContentAccessor\"), l = b(\"invariant\"), m = {\n        dangerouslySetInnerHTML: \"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",\n        style: \"`style` must be set using `updateStylesByID()`.\"\n    }, n = ((k() || \"NA\")), o = {\n        updatePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.setValueForProperty(s, q, r);\n        },\n        deletePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.deleteValueForProperty(s, q, r);\n        },\n        updatePropertiesByID: function(p, q) {\n            {\n                var fin65keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin65i = (0);\n                var r;\n                for (; (fin65i < fin65keys.length); (fin65i++)) {\n                    ((r) = (fin65keys[fin65i]));\n                    {\n                        if (!q.hasOwnProperty(r)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        o.updatePropertiesByID(p, r, q[r]);\n                    };\n                };\n            };\n        ;\n        },\n        updateStylesByID: function(p, q) {\n            var r = j.getNode(p);\n            g.setValueForStyles(r, q);\n        },\n        updateInnerHTMLByID: function(p, q) {\n            var r = j.getNode(p);\n            r.innerHTML = ((((q && q.__html)) || \"\")).replace(/^ /g, \"&nbsp;\");\n        },\n        updateTextContentByID: function(p, q) {\n            var r = j.getNode(p);\n            r[n] = q;\n        },\n        dangerouslyReplaceNodeWithMarkupByID: function(p, q) {\n            var r = j.getNode(p);\n            h.dangerouslyReplaceNodeWithMarkup(r, q);\n            j.purgeEntireCache();\n        },\n        manageChildrenByParentID: function(p, q) {\n            var r = j.getNode(p);\n            h.manageChildren(r, q);\n            j.purgeEntireCache();\n        },\n        setTextNodeValueAtIndexByParentID: function(p, q, r) {\n            var s = j.getNode(p);\n            h.setTextNodeValueAtIndex(s, q, r);\n        }\n    };\n    e.exports = o;\n});\n__d(\"ReactOwner\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        isValidOwner: function(i) {\n            return !!((((i && ((typeof i.attachRef === \"function\")))) && ((typeof i.detachRef === \"function\"))));\n        },\n        addComponentAsRefTo: function(i, j, k) {\n            g(h.isValidOwner(k));\n            k.attachRef(j, i);\n        },\n        removeComponentAsRefFrom: function(i, j, k) {\n            g(h.isValidOwner(k));\n            if (((k.refs[j] === i))) {\n                k.detachRef(j);\n            }\n        ;\n        ;\n        },\n        Mixin: {\n            attachRef: function(i, j) {\n                g(j.isOwnedBy(this));\n                var k = ((this.refs || (this.refs = {\n                })));\n                k[i] = j;\n            },\n            detachRef: function(i) {\n                delete this.refs[i];\n            }\n        }\n    };\n    e.exports = h;\n});\n__d(\"PooledClass\", [], function(a, b, c, d, e, f) {\n    var g = function(p) {\n        var q = this;\n        if (q.instancePool.length) {\n            var r = q.instancePool.pop();\n            q.call(r, p);\n            return r;\n        }\n         else return new q(p)\n    ;\n    }, h = function(p, q) {\n        var r = this;\n        if (r.instancePool.length) {\n            var s = r.instancePool.pop();\n            r.call(s, p, q);\n            return s;\n        }\n         else return new r(p, q)\n    ;\n    }, i = function(p, q, r) {\n        var s = this;\n        if (s.instancePool.length) {\n            var t = s.instancePool.pop();\n            s.call(t, p, q, r);\n            return t;\n        }\n         else return new s(p, q, r)\n    ;\n    }, j = function(p, q, r, s, t) {\n        var u = this;\n        if (u.instancePool.length) {\n            var v = u.instancePool.pop();\n            u.call(v, p, q, r, s, t);\n            return v;\n        }\n         else return new u(p, q, r, s, t)\n    ;\n    }, k = function(p) {\n        var q = this;\n        if (p.destructor) {\n            p.destructor();\n        }\n    ;\n    ;\n        if (((q.instancePool.length < q.poolSize))) {\n            q.instancePool.push(p);\n        }\n    ;\n    ;\n    }, l = 10, m = g, n = function(p, q) {\n        var r = p;\n        r.instancePool = [];\n        r.getPooled = ((q || m));\n        if (!r.poolSize) {\n            r.poolSize = l;\n        }\n    ;\n    ;\n        r.release = k;\n        return r;\n    }, o = {\n        addPoolingTo: n,\n        oneArgumentPooler: g,\n        twoArgumentPooler: h,\n        threeArgumentPooler: i,\n        fiveArgumentPooler: j\n    };\n    e.exports = o;\n});\n__d(\"ReactInputSelection\", [], function(a, b, c, d, e, f) {\n    function g() {\n        try {\n            return JSBNG__document.activeElement;\n        } catch (j) {\n        \n        };\n    ;\n    };\n;\n    function h(j) {\n        return JSBNG__document.documentElement.contains(j);\n    };\n;\n    var i = {\n        hasSelectionCapabilities: function(j) {\n            return ((j && ((((((((j.nodeName === \"INPUT\")) && ((j.type === \"text\")))) || ((j.nodeName === \"TEXTAREA\")))) || ((j.contentEditable === \"true\"))))));\n        },\n        getSelectionInformation: function() {\n            var j = g();\n            return {\n                focusedElem: j,\n                selectionRange: ((i.hasSelectionCapabilities(j) ? i.JSBNG__getSelection(j) : null))\n            };\n        },\n        restoreSelection: function(j) {\n            var k = g(), l = j.focusedElem, m = j.selectionRange;\n            if (((((k !== l)) && h(l)))) {\n                if (i.hasSelectionCapabilities(l)) {\n                    i.setSelection(l, m);\n                }\n            ;\n            ;\n                l.JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        JSBNG__getSelection: function(j) {\n            var k;\n            if (((((j.contentEditable === \"true\")) && window.JSBNG__getSelection))) {\n                k = window.JSBNG__getSelection().getRangeAt(0);\n                var l = k.commonAncestorContainer;\n                if (((l && ((l.nodeType === 3))))) {\n                    l = l.parentNode;\n                }\n            ;\n            ;\n                if (((l !== j))) {\n                    return {\n                        start: 0,\n                        end: 0\n                    };\n                }\n                 else return {\n                    start: k.startOffset,\n                    end: k.endOffset\n                }\n            ;\n            }\n        ;\n        ;\n            if (!JSBNG__document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                };\n            }\n        ;\n        ;\n            k = JSBNG__document.selection.createRange();\n            if (((k.parentElement() !== j))) {\n                return {\n                    start: 0,\n                    end: 0\n                };\n            }\n        ;\n        ;\n            var m = j.value.length;\n            if (((j.nodeName === \"INPUT\"))) {\n                return {\n                    start: -k.moveStart(\"character\", -m),\n                    end: -k.moveEnd(\"character\", -m)\n                };\n            }\n             else {\n                var n = k.duplicate();\n                n.moveToElementText(j);\n                n.setEndPoint(\"StartToEnd\", k);\n                var o = ((m - n.text.length));\n                n.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: ((m - n.text.length)),\n                    end: o\n                };\n            }\n        ;\n        ;\n        },\n        setSelection: function(j, k) {\n            var l, m = k.start, n = k.end;\n            if (((typeof n === \"undefined\"))) {\n                n = m;\n            }\n        ;\n        ;\n            if (JSBNG__document.selection) {\n                if (((j.tagName === \"TEXTAREA\"))) {\n                    var o = ((j.value.slice(0, m).match(/\\r/g) || [])).length, p = ((j.value.slice(m, n).match(/\\r/g) || [])).length;\n                    m -= o;\n                    n -= ((o + p));\n                }\n            ;\n            ;\n                l = j.createTextRange();\n                l.collapse(true);\n                l.moveStart(\"character\", m);\n                l.moveEnd(\"character\", ((n - m)));\n                l.select();\n            }\n             else if (((j.contentEditable === \"true\"))) {\n                if (((j.childNodes.length === 1))) {\n                    l = JSBNG__document.createRange();\n                    l.setStart(j.childNodes[0], m);\n                    l.setEnd(j.childNodes[0], n);\n                    var q = window.JSBNG__getSelection();\n                    q.removeAllRanges();\n                    q.addRange(l);\n                }\n            ;\n            ;\n            }\n             else {\n                j.selectionStart = m;\n                j.selectionEnd = Math.min(n, j.value.length);\n                j.JSBNG__focus();\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"mixInto\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        var j;\n        {\n            var fin66keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin66i = (0);\n            (0);\n            for (; (fin66i < fin66keys.length); (fin66i++)) {\n                ((j) = (fin66keys[fin66i]));\n                {\n                    if (!i.hasOwnProperty(j)) {\n                        continue;\n                    }\n                ;\n                ;\n                    h.prototype[j] = i[j];\n                };\n            };\n        };\n    ;\n    };\n    e.exports = g;\n});\n__d(\"ReactOnDOMReady\", [\"PooledClass\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"mixInto\");\n    function i(j) {\n        this._queue = ((j || null));\n    };\n;\n    h(i, {\n        enqueue: function(j, k) {\n            this._queue = ((this._queue || []));\n            this._queue.push({\n                component: j,\n                callback: k\n            });\n        },\n        notifyAll: function() {\n            var j = this._queue;\n            if (j) {\n                this._queue = null;\n                for (var k = 0, l = j.length; ((k < l)); k++) {\n                    var m = j[k].component, n = j[k].callback;\n                    n.call(m, m.getDOMNode());\n                };\n            ;\n                j.length = 0;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this._queue = null;\n        },\n        destructor: function() {\n            this.reset();\n        }\n    });\n    g.addPoolingTo(i);\n    e.exports = i;\n});\n__d(\"Transaction\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"DUAL_TRANSACTION\", i = \"MISSING_TRANSACTION\", j = {\n        reinitializeTransaction: function() {\n            this.transactionWrappers = this.getTransactionWrappers();\n            if (!this.wrapperInitData) {\n                this.wrapperInitData = [];\n            }\n             else this.wrapperInitData.length = 0;\n        ;\n        ;\n            if (!this.timingMetrics) {\n                this.timingMetrics = {\n                };\n            }\n        ;\n        ;\n            this.timingMetrics.methodInvocationTime = 0;\n            if (!this.timingMetrics.wrapperInitTimes) {\n                this.timingMetrics.wrapperInitTimes = [];\n            }\n             else this.timingMetrics.wrapperInitTimes.length = 0;\n        ;\n        ;\n            if (!this.timingMetrics.wrapperCloseTimes) {\n                this.timingMetrics.wrapperCloseTimes = [];\n            }\n             else this.timingMetrics.wrapperCloseTimes.length = 0;\n        ;\n        ;\n            this._isInTransaction = false;\n        },\n        _isInTransaction: false,\n        getTransactionWrappers: null,\n        isInTransaction: function() {\n            return !!this._isInTransaction;\n        },\n        perform: function(l, m, n, o, p, q, r, s) {\n            g(this.isInTransaction(), h);\n            var t = JSBNG__Date.now(), u = null, v;\n            try {\n                this.initializeAll();\n                v = l.call(m, n, o, p, q, r, s);\n            } catch (w) {\n                u = w;\n            } finally {\n                var x = JSBNG__Date.now();\n                this.methodInvocationTime += ((x - t));\n                try {\n                    this.closeAll();\n                } catch (y) {\n                    u = ((u || y));\n                };\n            ;\n            };\n        ;\n            if (u) {\n                throw u;\n            }\n        ;\n        ;\n            return v;\n        },\n        initializeAll: function() {\n            this._isInTransaction = true;\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperInitTimes, n = null;\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = JSBNG__Date.now(), q = l[o];\n                try {\n                    this.wrapperInitData[o] = ((q.initialize ? q.initialize.call(this) : null));\n                } catch (r) {\n                    n = ((n || r));\n                    this.wrapperInitData[o] = k.OBSERVED_ERROR;\n                } finally {\n                    var s = m[o], t = JSBNG__Date.now();\n                    m[o] = ((((s || 0)) + ((t - p))));\n                };\n            ;\n            };\n        ;\n            if (n) {\n                throw n;\n            }\n        ;\n        ;\n        },\n        closeAll: function() {\n            g(!this.isInTransaction(), i);\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperCloseTimes, n = null;\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = l[o], q = JSBNG__Date.now(), r = this.wrapperInitData[o];\n                try {\n                    if (((r !== k.OBSERVED_ERROR))) {\n                        ((p.close && p.close.call(this, r)));\n                    }\n                ;\n                ;\n                } catch (s) {\n                    n = ((n || s));\n                } finally {\n                    var t = JSBNG__Date.now(), u = m[o];\n                    m[o] = ((((u || 0)) + ((t - q))));\n                };\n            ;\n            };\n        ;\n            this.wrapperInitData.length = 0;\n            this._isInTransaction = false;\n            if (n) {\n                throw n;\n            }\n        ;\n        ;\n        }\n    }, k = {\n        Mixin: j,\n        OBSERVED_ERROR: {\n        }\n    };\n    e.exports = k;\n});\n__d(\"ReactReconcileTransaction\", [\"ExecutionEnvironment\",\"PooledClass\",\"ReactEventEmitter\",\"ReactInputSelection\",\"ReactOnDOMReady\",\"Transaction\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"PooledClass\"), i = b(\"ReactEventEmitter\"), j = b(\"ReactInputSelection\"), k = b(\"ReactOnDOMReady\"), l = b(\"Transaction\"), m = b(\"mixInto\"), n = {\n        initialize: j.getSelectionInformation,\n        close: j.restoreSelection\n    }, o = {\n        initialize: function() {\n            var t = i.isEnabled();\n            i.setEnabled(false);\n            return t;\n        },\n        close: function(t) {\n            i.setEnabled(t);\n        }\n    }, p = {\n        initialize: function() {\n            this.reactOnDOMReady.reset();\n        },\n        close: function() {\n            this.reactOnDOMReady.notifyAll();\n        }\n    }, q = [n,o,p,];\n    function r() {\n        this.reinitializeTransaction();\n        this.reactOnDOMReady = k.getPooled(null);\n    };\n;\n    var s = {\n        getTransactionWrappers: function() {\n            if (g.canUseDOM) {\n                return q;\n            }\n             else return []\n        ;\n        },\n        getReactOnDOMReady: function() {\n            return this.reactOnDOMReady;\n        },\n        destructor: function() {\n            k.release(this.reactOnDOMReady);\n            this.reactOnDOMReady = null;\n        }\n    };\n    m(r, l.Mixin);\n    m(r, s);\n    h.addPoolingTo(r);\n    e.exports = r;\n});\n__d(\"mergeHelpers\", [\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"throwIf\"), i = 36, j = g({\n        MERGE_ARRAY_FAIL: null,\n        MERGE_CORE_FAILURE: null,\n        MERGE_TYPE_USAGE_FAILURE: null,\n        MERGE_DEEP_MAX_LEVELS: null,\n        MERGE_DEEP_NO_ARR_STRATEGY: null\n    }), k = function(m) {\n        return ((((typeof m !== \"object\")) || ((m === null))));\n    }, l = {\n        MAX_MERGE_DEPTH: i,\n        isTerminal: k,\n        normalizeMergeArg: function(m) {\n            return ((((((m === undefined)) || ((m === null)))) ? {\n            } : m));\n        },\n        checkMergeArrayArgs: function(m, n) {\n            h(((!Array.isArray(m) || !Array.isArray(n))), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeObjectArgs: function(m, n) {\n            l.checkMergeObjectArg(m);\n            l.checkMergeObjectArg(n);\n        },\n        checkMergeObjectArg: function(m) {\n            h(((k(m) || Array.isArray(m))), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeLevel: function(m) {\n            h(((m >= i)), j.MERGE_DEEP_MAX_LEVELS);\n        },\n        checkArrayStrategy: function(m) {\n            h(((((m !== undefined)) && !((m in l.ArrayStrategies)))), j.MERGE_DEEP_NO_ARR_STRATEGY);\n        },\n        ArrayStrategies: g({\n            Clobber: true,\n            IndexByIndex: true\n        }),\n        ERRORS: j\n    };\n    e.exports = l;\n});\n__d(\"mergeInto\", [\"mergeHelpers\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeHelpers\"), h = g.checkMergeObjectArg;\n    function i(j, k) {\n        h(j);\n        if (((k != null))) {\n            h(k);\n            {\n                var fin67keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin67i = (0);\n                var l;\n                for (; (fin67i < fin67keys.length); (fin67i++)) {\n                    ((l) = (fin67keys[fin67i]));\n                    {\n                        if (!k.hasOwnProperty(l)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        j[l] = k[l];\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"merge\", [\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeInto\"), h = function(i, j) {\n        var k = {\n        };\n        g(k, i);\n        g(k, j);\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"ReactComponent\", [\"ReactCurrentOwner\",\"ReactDOMIDOperations\",\"ReactID\",\"ReactMount\",\"ReactOwner\",\"ReactReconcileTransaction\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCurrentOwner\"), h = b(\"ReactDOMIDOperations\"), i = b(\"ReactID\"), j = b(\"ReactMount\"), k = b(\"ReactOwner\"), l = b(\"ReactReconcileTransaction\"), m = b(\"ReactUpdates\"), n = b(\"invariant\"), o = b(\"keyMirror\"), p = b(\"merge\"), q = \"{owner}\", r = \"{is.key.validated}\", s = o({\n        MOUNTED: null,\n        UNMOUNTED: null\n    }), t = {\n    };\n    function u(x) {\n        if (((x[r] || ((x.props.key != null))))) {\n            return;\n        }\n    ;\n    ;\n        x[r] = true;\n        if (!g.current) {\n            return;\n        }\n    ;\n    ;\n        var y = g.current.constructor.displayName;\n        if (t.hasOwnProperty(y)) {\n            return;\n        }\n    ;\n    ;\n        t[y] = true;\n        var z = ((((((\"Each child in an array should have a unique \\\"key\\\" prop. \" + \"Check the render method of \")) + y)) + \".\"));\n        if (!x.isOwnedBy(g.current)) {\n            var aa = ((x.props[q] && x.props[q].constructor.displayName));\n            z += ((((\" It was passed a child from \" + aa)) + \".\"));\n        }\n    ;\n    ;\n    };\n;\n    function v(x) {\n        if (Array.isArray(x)) {\n            for (var y = 0; ((y < x.length)); y++) {\n                var z = x[y];\n                if (w.isValidComponent(z)) {\n                    u(z);\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else if (w.isValidComponent(x)) {\n            x[r] = true;\n        }\n        \n    ;\n    ;\n    };\n;\n    var w = {\n        isValidComponent: function(x) {\n            return !!((((x && ((typeof x.mountComponentIntoNode === \"function\")))) && ((typeof x.receiveProps === \"function\"))));\n        },\n        getKey: function(x, y) {\n            if (((((x && x.props)) && ((x.props.key != null))))) {\n                return ((\"\" + x.props.key));\n            }\n        ;\n        ;\n            return ((\"\" + y));\n        },\n        LifeCycle: s,\n        DOMIDOperations: h,\n        ReactReconcileTransaction: l,\n        setDOMOperations: function(x) {\n            w.DOMIDOperations = x;\n        },\n        setReactReconcileTransaction: function(x) {\n            w.ReactReconcileTransaction = x;\n        },\n        Mixin: {\n            isMounted: function() {\n                return ((this._lifeCycleState === s.MOUNTED));\n            },\n            getDOMNode: function() {\n                n(this.isMounted());\n                return i.getNode(this._rootNodeID);\n            },\n            setProps: function(x, y) {\n                this.replaceProps(p(((this._pendingProps || this.props)), x), y);\n            },\n            replaceProps: function(x, y) {\n                n(!this.props[q]);\n                this._pendingProps = x;\n                m.enqueueUpdate(this, y);\n            },\n            construct: function(x, y) {\n                this.props = ((x || {\n                }));\n                this.props[q] = g.current;\n                this._lifeCycleState = s.UNMOUNTED;\n                this._pendingProps = null;\n                this._pendingCallbacks = null;\n                var z = ((arguments.length - 1));\n                if (((z === 1))) {\n                    this.props.children = y;\n                }\n                 else if (((z > 1))) {\n                    var aa = Array(z);\n                    for (var ba = 0; ((ba < z)); ba++) {\n                        aa[ba] = arguments[((ba + 1))];\n                    ;\n                    };\n                ;\n                    this.props.children = aa;\n                }\n                \n            ;\n            ;\n            },\n            mountComponent: function(x, y) {\n                n(!this.isMounted());\n                var z = this.props;\n                if (((z.ref != null))) {\n                    k.addComponentAsRefTo(this, z.ref, z[q]);\n                }\n            ;\n            ;\n                this._rootNodeID = x;\n                this._lifeCycleState = s.MOUNTED;\n            },\n            unmountComponent: function() {\n                n(this.isMounted());\n                var x = this.props;\n                if (((x.ref != null))) {\n                    k.removeComponentAsRefFrom(this, x.ref, x[q]);\n                }\n            ;\n            ;\n                i.purgeID(this._rootNodeID);\n                this._rootNodeID = null;\n                this._lifeCycleState = s.UNMOUNTED;\n            },\n            receiveProps: function(x, y) {\n                n(this.isMounted());\n                this._pendingProps = x;\n                this._performUpdateIfNecessary(y);\n            },\n            performUpdateIfNecessary: function() {\n                var x = w.ReactReconcileTransaction.getPooled();\n                x.perform(this._performUpdateIfNecessary, this, x);\n                w.ReactReconcileTransaction.release(x);\n            },\n            _performUpdateIfNecessary: function(x) {\n                if (((this._pendingProps == null))) {\n                    return;\n                }\n            ;\n            ;\n                var y = this.props;\n                this.props = this._pendingProps;\n                this._pendingProps = null;\n                this.updateComponent(x, y);\n            },\n            updateComponent: function(x, y) {\n                var z = this.props;\n                if (((((z[q] !== y[q])) || ((z.ref !== y.ref))))) {\n                    if (((y.ref != null))) {\n                        k.removeComponentAsRefFrom(this, y.ref, y[q]);\n                    }\n                ;\n                ;\n                    if (((z.ref != null))) {\n                        k.addComponentAsRefTo(this, z.ref, z[q]);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            },\n            mountComponentIntoNode: function(x, y, z) {\n                var aa = w.ReactReconcileTransaction.getPooled();\n                aa.perform(this._mountComponentIntoNode, this, x, y, aa, z);\n                w.ReactReconcileTransaction.release(aa);\n            },\n            _mountComponentIntoNode: function(x, y, z, aa) {\n                n(((y && ((y.nodeType === 1)))));\n                var ba = JSBNG__Date.now(), ca = this.mountComponent(x, z);\n                j.totalInstantiationTime += ((JSBNG__Date.now() - ba));\n                if (aa) {\n                    return;\n                }\n            ;\n            ;\n                var da = JSBNG__Date.now(), ea = y.parentNode;\n                if (ea) {\n                    var fa = y.nextSibling;\n                    ea.removeChild(y);\n                    y.innerHTML = ca;\n                    if (fa) {\n                        ea.insertBefore(y, fa);\n                    }\n                     else ea.appendChild(y);\n                ;\n                ;\n                }\n                 else y.innerHTML = ca;\n            ;\n            ;\n                j.totalInjectionTime += ((JSBNG__Date.now() - da));\n            },\n            unmountComponentFromNode: function(x) {\n                this.unmountComponent();\n                while (x.lastChild) {\n                    x.removeChild(x.lastChild);\n                ;\n                };\n            ;\n            },\n            isOwnedBy: function(x) {\n                return ((this.props[q] === x));\n            },\n            getSiblingByRef: function(x) {\n                var y = this.props[q];\n                if (((!y || !y.refs))) {\n                    return null;\n                }\n            ;\n            ;\n                return y.refs[x];\n            }\n        }\n    };\n    e.exports = w;\n});\n__d(\"joinClasses\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            h = \"\";\n        }\n    ;\n    ;\n        var i, j = arguments.length;\n        if (((j > 1))) {\n            for (var k = 1; ((k < j)); k++) {\n                i = arguments[k];\n                ((i && (h += ((\" \" + i)))));\n            };\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"ReactPropTransferer\", [\"emptyFunction\",\"joinClasses\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = b(\"joinClasses\"), i = b(\"merge\");\n    function j(m) {\n        return function(n, o, p) {\n            if (!n.hasOwnProperty(o)) {\n                n[o] = p;\n            }\n             else n[o] = m(n[o], p);\n        ;\n        ;\n        };\n    };\n;\n    var k = {\n        children: g,\n        className: j(h),\n        ref: g,\n        style: j(i)\n    }, l = {\n        TransferStrategies: k,\n        Mixin: {\n            transferPropsTo: function(m) {\n                var n = {\n                };\n                {\n                    var fin68keys = ((window.top.JSBNG_Replay.forInKeys)((m.props))), fin68i = (0);\n                    var o;\n                    for (; (fin68i < fin68keys.length); (fin68i++)) {\n                        ((o) = (fin68keys[fin68i]));\n                        {\n                            if (m.props.hasOwnProperty(o)) {\n                                n[o] = m.props[o];\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin69keys = ((window.top.JSBNG_Replay.forInKeys)((this.props))), fin69i = (0);\n                    var p;\n                    for (; (fin69i < fin69keys.length); (fin69i++)) {\n                        ((p) = (fin69keys[fin69i]));\n                        {\n                            if (!this.props.hasOwnProperty(p)) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            var q = k[p];\n                            if (q) {\n                                q(n, p, this.props[p]);\n                            }\n                             else if (!n.hasOwnProperty(p)) {\n                                n[p] = this.props[p];\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                m.props = n;\n                return m;\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"ReactCompositeComponent\", [\"ReactComponent\",\"ReactCurrentOwner\",\"ReactOwner\",\"ReactPropTransferer\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactCurrentOwner\"), i = b(\"ReactOwner\"), j = b(\"ReactPropTransferer\"), k = b(\"ReactUpdates\"), l = b(\"invariant\"), m = b(\"keyMirror\"), n = b(\"merge\"), o = b(\"mixInto\"), p = m({\n        DEFINE_ONCE: null,\n        DEFINE_MANY: null,\n        OVERRIDE_BASE: null\n    }), q = {\n        mixins: p.DEFINE_MANY,\n        props: p.DEFINE_ONCE,\n        getDefaultProps: p.DEFINE_ONCE,\n        getInitialState: p.DEFINE_ONCE,\n        render: p.DEFINE_ONCE,\n        componentWillMount: p.DEFINE_MANY,\n        componentDidMount: p.DEFINE_MANY,\n        componentWillReceiveProps: p.DEFINE_MANY,\n        shouldComponentUpdate: p.DEFINE_ONCE,\n        componentWillUpdate: p.DEFINE_MANY,\n        componentDidUpdate: p.DEFINE_MANY,\n        componentWillUnmount: p.DEFINE_MANY,\n        updateComponent: p.OVERRIDE_BASE\n    }, r = {\n        displayName: function(aa, ba) {\n            aa.displayName = ba;\n        },\n        mixins: function(aa, ba) {\n            if (ba) {\n                for (var ca = 0; ((ca < ba.length)); ca++) {\n                    u(aa, ba[ca]);\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        props: function(aa, ba) {\n            aa.propDeclarations = ba;\n        }\n    };\n    function s(aa, ba) {\n        var ca = q[ba];\n        if (x.hasOwnProperty(ba)) {\n            l(((ca === p.OVERRIDE_BASE)));\n        }\n    ;\n    ;\n        if (aa.hasOwnProperty(ba)) {\n            l(((ca === p.DEFINE_MANY)));\n        }\n    ;\n    ;\n    };\n;\n    function t(aa) {\n        var ba = aa._compositeLifeCycleState;\n        l(((aa.isMounted() || ((ba === w.MOUNTING)))));\n        l(((((ba !== w.RECEIVING_STATE)) && ((ba !== w.UNMOUNTING)))));\n    };\n;\n    function u(aa, ba) {\n        var ca = aa.prototype;\n        {\n            var fin70keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin70i = (0);\n            var da;\n            for (; (fin70i < fin70keys.length); (fin70i++)) {\n                ((da) = (fin70keys[fin70i]));\n                {\n                    var ea = ba[da];\n                    if (((!ba.hasOwnProperty(da) || !ea))) {\n                        continue;\n                    }\n                ;\n                ;\n                    s(ca, da);\n                    if (r.hasOwnProperty(da)) {\n                        r[da](aa, ea);\n                    }\n                     else {\n                        var fa = ((da in q)), ga = ((da in ca)), ha = ea.__reactDontBind, ia = ((typeof ea === \"function\")), ja = ((((((ia && !fa)) && !ga)) && !ha));\n                        if (ja) {\n                            if (!ca.__reactAutoBindMap) {\n                                ca.__reactAutoBindMap = {\n                                };\n                            }\n                        ;\n                        ;\n                            ca.__reactAutoBindMap[da] = ea;\n                            ca[da] = ea;\n                        }\n                         else if (ga) {\n                            ca[da] = v(ca[da], ea);\n                        }\n                         else ca[da] = ea;\n                        \n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function v(aa, ba) {\n        return function ca() {\n            aa.apply(this, arguments);\n            ba.apply(this, arguments);\n        };\n    };\n;\n    var w = m({\n        MOUNTING: null,\n        UNMOUNTING: null,\n        RECEIVING_PROPS: null,\n        RECEIVING_STATE: null\n    }), x = {\n        construct: function(aa, ba) {\n            g.Mixin.construct.apply(this, arguments);\n            this.state = null;\n            this._pendingState = null;\n            this._compositeLifeCycleState = null;\n        },\n        isMounted: function() {\n            return ((g.Mixin.isMounted.call(this) && ((this._compositeLifeCycleState !== w.MOUNTING))));\n        },\n        mountComponent: function(aa, ba) {\n            g.Mixin.mountComponent.call(this, aa, ba);\n            this._compositeLifeCycleState = w.MOUNTING;\n            this._defaultProps = ((this.getDefaultProps ? this.getDefaultProps() : null));\n            this._processProps(this.props);\n            if (this.__reactAutoBindMap) {\n                this._bindAutoBindMethods();\n            }\n        ;\n        ;\n            this.state = ((this.getInitialState ? this.getInitialState() : null));\n            this._pendingState = null;\n            this._pendingForceUpdate = false;\n            if (this.componentWillMount) {\n                this.componentWillMount();\n                if (this._pendingState) {\n                    this.state = this._pendingState;\n                    this._pendingState = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._renderedComponent = this._renderValidatedComponent();\n            this._compositeLifeCycleState = null;\n            var ca = this._renderedComponent.mountComponent(aa, ba);\n            if (this.componentDidMount) {\n                ba.getReactOnDOMReady().enqueue(this, this.componentDidMount);\n            }\n        ;\n        ;\n            return ca;\n        },\n        unmountComponent: function() {\n            this._compositeLifeCycleState = w.UNMOUNTING;\n            if (this.componentWillUnmount) {\n                this.componentWillUnmount();\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = null;\n            this._defaultProps = null;\n            g.Mixin.unmountComponent.call(this);\n            this._renderedComponent.unmountComponent();\n            this._renderedComponent = null;\n            if (this.refs) {\n                this.refs = null;\n            }\n        ;\n        ;\n        },\n        setState: function(aa, ba) {\n            this.replaceState(n(((this._pendingState || this.state)), aa), ba);\n        },\n        replaceState: function(aa, ba) {\n            t.call(null, this);\n            this._pendingState = aa;\n            k.enqueueUpdate(this, ba);\n        },\n        _processProps: function(aa) {\n            var ba, ca = this._defaultProps;\n            {\n                var fin71keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin71i = (0);\n                (0);\n                for (; (fin71i < fin71keys.length); (fin71i++)) {\n                    ((ba) = (fin71keys[fin71i]));\n                    {\n                        if (!((ba in aa))) {\n                            aa[ba] = ca[ba];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = this.constructor.propDeclarations;\n            if (da) {\n                var ea = this.constructor.displayName;\n                {\n                    var fin72keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin72i = (0);\n                    (0);\n                    for (; (fin72i < fin72keys.length); (fin72i++)) {\n                        ((ba) = (fin72keys[fin72i]));\n                        {\n                            var fa = da[ba];\n                            if (fa) {\n                                fa(aa, ba, ea);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        performUpdateIfNecessary: function() {\n            var aa = this._compositeLifeCycleState;\n            if (((((aa === w.MOUNTING)) || ((aa === w.RECEIVING_PROPS))))) {\n                return;\n            }\n        ;\n        ;\n            g.Mixin.performUpdateIfNecessary.call(this);\n        },\n        _performUpdateIfNecessary: function(aa) {\n            if (((((((this._pendingProps == null)) && ((this._pendingState == null)))) && !this._pendingForceUpdate))) {\n                return;\n            }\n        ;\n        ;\n            var ba = this.props;\n            if (((this._pendingProps != null))) {\n                ba = this._pendingProps;\n                this._processProps(ba);\n                this._pendingProps = null;\n                this._compositeLifeCycleState = w.RECEIVING_PROPS;\n                if (this.componentWillReceiveProps) {\n                    this.componentWillReceiveProps(ba, aa);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = w.RECEIVING_STATE;\n            var ca = ((this._pendingState || this.state));\n            this._pendingState = null;\n            if (((((this._pendingForceUpdate || !this.shouldComponentUpdate)) || this.shouldComponentUpdate(ba, ca)))) {\n                this._pendingForceUpdate = false;\n                this._performComponentUpdate(ba, ca, aa);\n            }\n             else {\n                this.props = ba;\n                this.state = ca;\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = null;\n        },\n        _performComponentUpdate: function(aa, ba, ca) {\n            var da = this.props, ea = this.state;\n            if (this.componentWillUpdate) {\n                this.componentWillUpdate(aa, ba, ca);\n            }\n        ;\n        ;\n            this.props = aa;\n            this.state = ba;\n            this.updateComponent(ca, da, ea);\n            if (this.componentDidUpdate) {\n                ca.getReactOnDOMReady().enqueue(this, this.componentDidUpdate.bind(this, da, ea));\n            }\n        ;\n        ;\n        },\n        updateComponent: function(aa, ba, ca) {\n            g.Mixin.updateComponent.call(this, aa, ba);\n            var da = this._renderedComponent, ea = this._renderValidatedComponent();\n            if (((da.constructor === ea.constructor))) {\n                da.receiveProps(ea.props, aa);\n            }\n             else {\n                var fa = this._rootNodeID, ga = da._rootNodeID;\n                da.unmountComponent();\n                var ha = ea.mountComponent(fa, aa);\n                g.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID(ga, ha);\n                this._renderedComponent = ea;\n            }\n        ;\n        ;\n        },\n        forceUpdate: function(aa) {\n            var ba = this._compositeLifeCycleState;\n            l(((this.isMounted() || ((ba === w.MOUNTING)))));\n            l(((((ba !== w.RECEIVING_STATE)) && ((ba !== w.UNMOUNTING)))));\n            this._pendingForceUpdate = true;\n            k.enqueueUpdate(this, aa);\n        },\n        _renderValidatedComponent: function() {\n            var aa;\n            h.current = this;\n            try {\n                aa = this.render();\n            } catch (ba) {\n                throw ba;\n            } finally {\n                h.current = null;\n            };\n        ;\n            l(g.isValidComponent(aa));\n            return aa;\n        },\n        _bindAutoBindMethods: function() {\n            {\n                var fin73keys = ((window.top.JSBNG_Replay.forInKeys)((this.__reactAutoBindMap))), fin73i = (0);\n                var aa;\n                for (; (fin73i < fin73keys.length); (fin73i++)) {\n                    ((aa) = (fin73keys[fin73i]));\n                    {\n                        if (!this.__reactAutoBindMap.hasOwnProperty(aa)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var ba = this.__reactAutoBindMap[aa];\n                        this[aa] = this._bindAutoBindMethod(ba);\n                    };\n                };\n            };\n        ;\n        },\n        _bindAutoBindMethod: function(aa) {\n            var ba = this;\n            return function() {\n                return aa.apply(ba, arguments);\n            };\n        }\n    }, y = function() {\n    \n    };\n    o(y, g.Mixin);\n    o(y, i.Mixin);\n    o(y, j.Mixin);\n    o(y, x);\n    var z = {\n        LifeCycle: w,\n        Base: y,\n        createClass: function(aa) {\n            var ba = function() {\n            \n            };\n            ba.prototype = new y();\n            ba.prototype.constructor = ba;\n            u(ba, aa);\n            l(ba.prototype.render);\n            var ca = function(da, ea) {\n                var fa = new ba();\n                fa.construct.apply(fa, arguments);\n                return fa;\n            };\n            ca.componentConstructor = ba;\n            ca.originalSpec = aa;\n            return ca;\n        },\n        autoBind: function(aa) {\n            return aa;\n        }\n    };\n    e.exports = z;\n});\n__d(\"ReactMultiChild\", [\"ReactComponent\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\");\n    function h(k, l) {\n        return ((((k && l)) && ((k.constructor === l.constructor))));\n    };\n;\n    var i = {\n        enqueueMarkupAt: function(k, l) {\n            this.domOperations = ((this.domOperations || []));\n            this.domOperations.push({\n                insertMarkup: k,\n                finalIndex: l\n            });\n        },\n        enqueueMove: function(k, l) {\n            this.domOperations = ((this.domOperations || []));\n            this.domOperations.push({\n                moveFrom: k,\n                finalIndex: l\n            });\n        },\n        enqueueUnmountChildByName: function(k, l) {\n            if (g.isValidComponent(l)) {\n                this.domOperations = ((this.domOperations || []));\n                this.domOperations.push({\n                    removeAt: l._domIndex\n                });\n                ((l.unmountComponent && l.unmountComponent()));\n                delete this._renderedChildren[k];\n            }\n        ;\n        ;\n        },\n        processChildDOMOperationsQueue: function() {\n            if (this.domOperations) {\n                g.DOMIDOperations.manageChildrenByParentID(this._rootNodeID, this.domOperations);\n                this.domOperations = null;\n            }\n        ;\n        ;\n        },\n        unmountMultiChild: function() {\n            var k = this._renderedChildren;\n            {\n                var fin74keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin74i = (0);\n                var l;\n                for (; (fin74i < fin74keys.length); (fin74i++)) {\n                    ((l) = (fin74keys[fin74i]));\n                    {\n                        if (((k.hasOwnProperty(l) && k[l]))) {\n                            var m = k[l];\n                            ((m.unmountComponent && m.unmountComponent()));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._renderedChildren = null;\n        },\n        mountMultiChild: function(k, l) {\n            var m = \"\", n = 0;\n            {\n                var fin75keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin75i = (0);\n                var o;\n                for (; (fin75i < fin75keys.length); (fin75i++)) {\n                    ((o) = (fin75keys[fin75i]));\n                    {\n                        var p = k[o];\n                        if (((k.hasOwnProperty(o) && p))) {\n                            m += p.mountComponent(((((this._rootNodeID + \".\")) + o)), l);\n                            p._domIndex = n;\n                            n++;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._renderedChildren = k;\n            this.domOperations = null;\n            return m;\n        },\n        updateMultiChild: function(k, l) {\n            if (((!k && !this._renderedChildren))) {\n                return;\n            }\n             else if (((k && !this._renderedChildren))) {\n                this._renderedChildren = {\n                };\n            }\n             else if (((!k && this._renderedChildren))) {\n                k = {\n                };\n            }\n            \n            \n        ;\n        ;\n            var m = ((this._rootNodeID + \".\")), n = null, o = 0, p = 0, q = 0;\n            {\n                var fin76keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin76i = (0);\n                var r;\n                for (; (fin76i < fin76keys.length); (fin76i++)) {\n                    ((r) = (fin76keys[fin76i]));\n                    {\n                        if (!k.hasOwnProperty(r)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var s = this._renderedChildren[r], t = k[r];\n                        if (h(s, t)) {\n                            if (n) {\n                                this.enqueueMarkupAt(n, ((p - o)));\n                                n = null;\n                            }\n                        ;\n                        ;\n                            o = 0;\n                            if (((s._domIndex < q))) {\n                                this.enqueueMove(s._domIndex, p);\n                            }\n                        ;\n                        ;\n                            q = Math.max(s._domIndex, q);\n                            s.receiveProps(t.props, l);\n                            s._domIndex = p;\n                        }\n                         else {\n                            if (s) {\n                                this.enqueueUnmountChildByName(r, s);\n                                q = Math.max(s._domIndex, q);\n                            }\n                        ;\n                        ;\n                            if (t) {\n                                this._renderedChildren[r] = t;\n                                var u = t.mountComponent(((m + r)), l);\n                                n = ((n ? ((n + u)) : u));\n                                o++;\n                                t._domIndex = p;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        p = ((t ? ((p + 1)) : p));\n                    };\n                };\n            };\n        ;\n            if (n) {\n                this.enqueueMarkupAt(n, ((p - o)));\n            }\n        ;\n        ;\n            {\n                var fin77keys = ((window.top.JSBNG_Replay.forInKeys)((this._renderedChildren))), fin77i = (0);\n                var v;\n                for (; (fin77i < fin77keys.length); (fin77i++)) {\n                    ((v) = (fin77keys[fin77i]));\n                    {\n                        if (!this._renderedChildren.hasOwnProperty(v)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var w = this._renderedChildren[v];\n                        if (((w && !k[v]))) {\n                            this.enqueueUnmountChildByName(v, w);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.processChildDOMOperationsQueue();\n        }\n    }, j = {\n        Mixin: i\n    };\n    e.exports = j;\n});\n__d(\"ReactTextComponent\", [\"ReactComponent\",\"ReactID\",\"escapeTextForBrowser\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactID\"), i = b(\"escapeTextForBrowser\"), j = b(\"mixInto\"), k = function(l) {\n        this.construct({\n            text: l\n        });\n    };\n    j(k, g.Mixin);\n    j(k, {\n        mountComponent: function(l) {\n            g.Mixin.mountComponent.call(this, l);\n            return ((((((((((((\"\\u003Cspan \" + h.ATTR_NAME)) + \"=\\\"\")) + l)) + \"\\\"\\u003E\")) + i(this.props.text))) + \"\\u003C/span\\u003E\"));\n        },\n        receiveProps: function(l, m) {\n            if (((l.text !== this.props.text))) {\n                this.props.text = l.text;\n                g.DOMIDOperations.updateTextContentByID(this._rootNodeID, l.text);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"flattenChildren\", [\"ReactComponent\",\"ReactTextComponent\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactTextComponent\"), i = b(\"throwIf\"), j = \"INVALID_CHILD\", k = ((\"You have two children with identical keys. Make sure that you set the \" + \"\\\"key\\\" property to a unique value such as a row ID.\")), l = function(n, o, p) {\n        if (Array.isArray(o)) {\n            for (var q = 0; ((q < o.length)); q++) {\n                var r = o[q];\n                l(n, r, ((((((p + \"[\")) + g.getKey(r, q))) + \"]\")));\n            };\n        ;\n        }\n         else {\n            var s = typeof o, t = ((p === \"\")), u = ((t ? ((((\"[\" + g.getKey(o, 0))) + \"]\")) : p));\n            if (((((((o === null)) || ((o === undefined)))) || ((s === \"boolean\"))))) {\n                n[u] = null;\n            }\n             else if (o.mountComponentIntoNode) {\n                n[u] = o;\n            }\n             else if (((s === \"object\"))) {\n                i(((o && ((o.nodeType === 1)))), j);\n                {\n                    var fin78keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin78i = (0);\n                    var v;\n                    for (; (fin78i < fin78keys.length); (fin78i++)) {\n                        ((v) = (fin78keys[fin78i]));\n                        {\n                            if (o.hasOwnProperty(v)) {\n                                l(n, o[v], ((((((p + \"{\")) + v)) + \"}\")));\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n             else if (((s === \"string\"))) {\n                n[u] = new h(o);\n            }\n             else if (((s === \"number\"))) {\n                n[u] = new h(((\"\" + o)));\n            }\n            \n            \n            \n            \n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    function m(n) {\n        if (((((n === null)) || ((n === undefined))))) {\n            return n;\n        }\n    ;\n    ;\n        var o = {\n        };\n        l(o, n, \"\");\n        return o;\n    };\n;\n    e.exports = m;\n});\n__d(\"ReactNativeComponent\", [\"CSSPropertyOperations\",\"DOMPropertyOperations\",\"ReactComponent\",\"ReactEventEmitter\",\"ReactMultiChild\",\"ReactID\",\"escapeTextForBrowser\",\"flattenChildren\",\"invariant\",\"keyOf\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMPropertyOperations\"), i = b(\"ReactComponent\"), j = b(\"ReactEventEmitter\"), k = b(\"ReactMultiChild\"), l = b(\"ReactID\"), m = b(\"escapeTextForBrowser\"), n = b(\"flattenChildren\"), o = b(\"invariant\"), p = b(\"keyOf\"), q = b(\"merge\"), r = b(\"mixInto\"), s = j.putListener, t = j.deleteListener, u = j.registrationNames, v = {\n        string: true,\n        number: true\n    }, w = p({\n        dangerouslySetInnerHTML: null\n    }), x = p({\n        style: null\n    });\n    function y(aa) {\n        if (!aa) {\n            return;\n        }\n    ;\n    ;\n        o(((((aa.children == null)) || ((aa.dangerouslySetInnerHTML == null)))));\n        o(((((aa.style == null)) || ((typeof aa.style === \"object\")))));\n    };\n;\n    function z(aa, ba) {\n        this._tagOpen = ((((\"\\u003C\" + aa)) + \" \"));\n        this._tagClose = ((ba ? \"\" : ((((\"\\u003C/\" + aa)) + \"\\u003E\"))));\n        this.tagName = aa.toUpperCase();\n    };\n;\n    z.Mixin = {\n        mountComponent: function(aa, ba) {\n            i.Mixin.mountComponent.call(this, aa, ba);\n            y(this.props);\n            return ((((this._createOpenTagMarkup() + this._createContentMarkup(ba))) + this._tagClose));\n        },\n        _createOpenTagMarkup: function() {\n            var aa = this.props, ba = this._tagOpen;\n            {\n                var fin79keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin79i = (0);\n                var ca;\n                for (; (fin79i < fin79keys.length); (fin79i++)) {\n                    ((ca) = (fin79keys[fin79i]));\n                    {\n                        if (!aa.hasOwnProperty(ca)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var da = aa[ca];\n                        if (((da == null))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (u[ca]) {\n                            s(this._rootNodeID, ca, da);\n                        }\n                         else {\n                            if (((ca === x))) {\n                                if (da) {\n                                    da = aa.style = q(aa.style);\n                                }\n                            ;\n                            ;\n                                da = g.createMarkupForStyles(da);\n                            }\n                        ;\n                        ;\n                            var ea = h.createMarkupForProperty(ca, da);\n                            if (ea) {\n                                ba += ((\" \" + ea));\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var fa = m(this._rootNodeID);\n            return ((((((((((ba + \" \")) + l.ATTR_NAME)) + \"=\\\"\")) + fa)) + \"\\\"\\u003E\"));\n        },\n        _createContentMarkup: function(aa) {\n            var ba = this.props.dangerouslySetInnerHTML;\n            if (((ba != null))) {\n                if (((ba.__html != null))) {\n                    return ba.__html;\n                }\n            ;\n            ;\n            }\n             else {\n                var ca = ((v[typeof this.props.children] ? this.props.children : null)), da = ((((ca != null)) ? null : this.props.children));\n                if (((ca != null))) {\n                    return m(ca);\n                }\n                 else if (((da != null))) {\n                    return this.mountMultiChild(n(da), aa);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return \"\";\n        },\n        receiveProps: function(aa, ba) {\n            y(aa);\n            i.Mixin.receiveProps.call(this, aa, ba);\n        },\n        updateComponent: function(aa, ba) {\n            i.Mixin.updateComponent.call(this, aa, ba);\n            this._updateDOMProperties(ba);\n            this._updateDOMChildren(ba, aa);\n        },\n        _updateDOMProperties: function(aa) {\n            var ba = this.props, ca, da, ea;\n            {\n                var fin80keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin80i = (0);\n                (0);\n                for (; (fin80i < fin80keys.length); (fin80i++)) {\n                    ((ca) = (fin80keys[fin80i]));\n                    {\n                        if (((ba.hasOwnProperty(ca) || !aa.hasOwnProperty(ca)))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((ca === x))) {\n                            var fa = aa[ca];\n                            {\n                                var fin81keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin81i = (0);\n                                (0);\n                                for (; (fin81i < fin81keys.length); (fin81i++)) {\n                                    ((da) = (fin81keys[fin81i]));\n                                    {\n                                        if (fa.hasOwnProperty(da)) {\n                                            ea = ((ea || {\n                                            }));\n                                            ea[da] = \"\";\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        }\n                         else if (((ca === w))) {\n                            i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                        }\n                         else if (u[ca]) {\n                            t(this._rootNodeID, ca);\n                        }\n                         else i.DOMIDOperations.deletePropertyByID(this._rootNodeID, ca);\n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin82keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin82i = (0);\n                (0);\n                for (; (fin82i < fin82keys.length); (fin82i++)) {\n                    ((ca) = (fin82keys[fin82i]));\n                    {\n                        var ga = ba[ca], ha = aa[ca];\n                        if (((!ba.hasOwnProperty(ca) || ((ga === ha))))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((ca === x))) {\n                            if (ga) {\n                                ga = ba.style = q(ga);\n                            }\n                        ;\n                        ;\n                            if (ha) {\n                                {\n                                    var fin83keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin83i = (0);\n                                    (0);\n                                    for (; (fin83i < fin83keys.length); (fin83i++)) {\n                                        ((da) = (fin83keys[fin83i]));\n                                        {\n                                            if (((ha.hasOwnProperty(da) && !ga.hasOwnProperty(da)))) {\n                                                ea = ((ea || {\n                                                }));\n                                                ea[da] = \"\";\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                                {\n                                    var fin84keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin84i = (0);\n                                    (0);\n                                    for (; (fin84i < fin84keys.length); (fin84i++)) {\n                                        ((da) = (fin84keys[fin84i]));\n                                        {\n                                            if (((ga.hasOwnProperty(da) && ((ha[da] !== ga[da]))))) {\n                                                ea = ((ea || {\n                                                }));\n                                                ea[da] = ga[da];\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                             else ea = ga;\n                        ;\n                        ;\n                        }\n                         else if (((ca === w))) {\n                            var ia = ((ha && ha.__html)), ja = ((ga && ga.__html));\n                            if (((ia !== ja))) {\n                                i.DOMIDOperations.updateInnerHTMLByID(this._rootNodeID, ga);\n                            }\n                        ;\n                        ;\n                        }\n                         else if (u[ca]) {\n                            s(this._rootNodeID, ca, ga);\n                        }\n                         else i.DOMIDOperations.updatePropertyByID(this._rootNodeID, ca, ga);\n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (ea) {\n                i.DOMIDOperations.updateStylesByID(this._rootNodeID, ea);\n            }\n        ;\n        ;\n        },\n        _updateDOMChildren: function(aa, ba) {\n            var ca = this.props, da = ((v[typeof aa.children] ? aa.children : null)), ea = ((v[typeof ca.children] ? ca.children : null)), fa = ((((da != null)) ? null : aa.children)), ga = ((((ea != null)) ? null : ca.children));\n            if (((ea != null))) {\n                var ha = ((((fa != null)) && ((ga == null))));\n                if (ha) {\n                    this.updateMultiChild(null, ba);\n                }\n            ;\n            ;\n                if (((da !== ea))) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, ((\"\" + ea)));\n                }\n            ;\n            ;\n            }\n             else {\n                var ia = ((((da != null)) && ((ea == null))));\n                if (ia) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                }\n            ;\n            ;\n                this.updateMultiChild(n(ca.children), ba);\n            }\n        ;\n        ;\n        },\n        unmountComponent: function() {\n            j.deleteAllListeners(this._rootNodeID);\n            i.Mixin.unmountComponent.call(this);\n            this.unmountMultiChild();\n        }\n    };\n    r(z, i.Mixin);\n    r(z, z.Mixin);\n    r(z, k.Mixin);\n    e.exports = z;\n});\n__d(\"objMapKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (!h) {\n            return null;\n        }\n    ;\n    ;\n        var k = 0, l = {\n        };\n        {\n            var fin85keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin85i = (0);\n            var m;\n            for (; (fin85i < fin85keys.length); (fin85i++)) {\n                ((m) = (fin85keys[fin85i]));\n                {\n                    if (h.hasOwnProperty(m)) {\n                        l[m] = i.call(j, m, h[m], k++);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return l;\n    };\n;\n    e.exports = g;\n});\n__d(\"ReactDOM\", [\"ReactNativeComponent\",\"mergeInto\",\"objMapKeyVal\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactNativeComponent\"), h = b(\"mergeInto\"), i = b(\"objMapKeyVal\");\n    function j(m, n) {\n        var o = function() {\n        \n        };\n        o.prototype = new g(m, n);\n        o.prototype.constructor = o;\n        var p = function(q, r) {\n            var s = new o();\n            s.construct.apply(s, arguments);\n            return s;\n        };\n        p.componentConstructor = o;\n        return p;\n    };\n;\n    var k = i({\n        a: false,\n        abbr: false,\n        address: false,\n        audio: false,\n        b: false,\n        blockquote: false,\n        body: false,\n        br: true,\n        button: false,\n        code: false,\n        col: true,\n        colgroup: false,\n        dd: false,\n        div: false,\n        section: false,\n        dl: false,\n        dt: false,\n        em: false,\n        embed: true,\n        fieldset: false,\n        figcaption: false,\n        figure: false,\n        footer: false,\n        form: false,\n        h1: false,\n        h2: false,\n        h3: false,\n        h4: false,\n        h5: false,\n        h6: false,\n        header: false,\n        hr: true,\n        i: false,\n        iframe: false,\n        img: true,\n        input: true,\n        label: false,\n        legend: false,\n        li: false,\n        line: false,\n        nav: false,\n        object: false,\n        ol: false,\n        optgroup: false,\n        option: false,\n        p: false,\n        param: true,\n        pre: false,\n        select: false,\n        small: false,\n        source: false,\n        span: false,\n        sub: false,\n        sup: false,\n        strong: false,\n        table: false,\n        tbody: false,\n        td: false,\n        textarea: false,\n        tfoot: false,\n        th: false,\n        thead: false,\n        time: false,\n        title: false,\n        tr: false,\n        u: false,\n        ul: false,\n        video: false,\n        wbr: false,\n        circle: false,\n        g: false,\n        path: false,\n        polyline: false,\n        rect: false,\n        svg: false,\n        text: false\n    }, j), l = {\n        injectComponentClasses: function(m) {\n            h(k, m);\n        }\n    };\n    k.injection = l;\n    e.exports = k;\n});\n__d(\"ReactProps\", [\"createObjectFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = b(\"invariant\"), i = {\n        array: k(\"array\"),\n        bool: k(\"boolean\"),\n        func: k(\"function\"),\n        number: k(\"number\"),\n        object: k(\"object\"),\n        string: k(\"string\"),\n        oneOf: l,\n        instanceOf: m\n    }, j = \"\\u003C\\u003Canonymous\\u003E\\u003E\";\n    function k(o) {\n        function p(q, r, s) {\n            var t = typeof q;\n            if (((((t === \"object\")) && Array.isArray(q)))) {\n                t = \"array\";\n            }\n        ;\n        ;\n            h(((t === o)));\n        };\n    ;\n        return n(p);\n    };\n;\n    function l(o) {\n        var p = g(o);\n        function q(r, s, t) {\n            h(p[r]);\n        };\n    ;\n        return n(q);\n    };\n;\n    function m(o) {\n        function p(q, r, s) {\n            h(((q instanceof o)));\n        };\n    ;\n        return n(p);\n    };\n;\n    function n(o) {\n        function p(q) {\n            function r(s, t, u) {\n                var v = s[t];\n                if (((v != null))) {\n                    o(v, t, ((u || j)));\n                }\n                 else h(!q);\n            ;\n            ;\n            };\n        ;\n            if (!q) {\n                r.isRequired = p(true);\n            }\n        ;\n        ;\n            return r;\n        };\n    ;\n        return p(false);\n    };\n;\n    e.exports = i;\n});\n__d(\"ReactServerRendering\", [\"ReactReconcileTransaction\",\"ReactInstanceHandles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactReconcileTransaction\"), h = b(\"ReactInstanceHandles\");\n    function i(j, k) {\n        var l = h.createReactRootID(), m = g.getPooled();\n        m.reinitializeTransaction();\n        try {\n            m.perform(function() {\n                k(j.mountComponent(l, m));\n            }, null);\n        } finally {\n            g.release(m);\n        };\n    ;\n    };\n;\n    e.exports = {\n        renderComponentToString: i\n    };\n});\n__d(\"ReactDOMForm\", [\"ReactCompositeComponent\",\"ReactDOM\",\"ReactEventEmitter\",\"EventConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"ReactEventEmitter\"), j = b(\"EventConstants\"), k = h.form, l = g.createClass({\n        render: function() {\n            return this.transferPropsTo(k(null, this.props.children));\n        },\n        componentDidMount: function(m) {\n            i.trapBubbledEvent(j.topLevelTypes.topSubmit, \"submit\", m);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMInput\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"merge\"), k = i.input, l = h.createClass({\n        getInitialState: function() {\n            return {\n                checked: ((this.props.defaultChecked || false)),\n                value: ((this.props.defaultValue || \"\"))\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getChecked: function() {\n            return ((((this.props.checked != null)) ? this.props.checked : this.state.checked));\n        },\n        getValue: function() {\n            return ((((this.props.value != null)) ? this.props.value : this.state.value));\n        },\n        render: function() {\n            var m = j(this.props);\n            m.checked = this.getChecked();\n            m.value = this.getValue();\n            m.onChange = this.handleChange;\n            return k(m, this.props.children);\n        },\n        componentDidUpdate: function(m, n, o) {\n            if (((this.props.checked != null))) {\n                g.setValueForProperty(o, \"checked\", ((this.props.checked || false)));\n            }\n        ;\n        ;\n            if (((this.props.value != null))) {\n                g.setValueForProperty(o, \"value\", ((this.props.value || \"\")));\n            }\n        ;\n        ;\n        },\n        handleChange: h.autoBind(function(JSBNG__event) {\n            var m;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                m = this.props.onChange(JSBNG__event);\n                this._isChanging = false;\n            }\n        ;\n        ;\n            this.setState({\n                checked: JSBNG__event.target.checked,\n                value: JSBNG__event.target.value\n            });\n            return m;\n        })\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMTextarea\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"invariant\"), k = b(\"merge\"), l = i.textarea, m = {\n        string: true,\n        number: true\n    }, n = h.createClass({\n        getInitialState: function() {\n            var o = this.props.defaultValue, p = this.props.children;\n            if (((p != null))) {\n                j(((o == null)));\n                if (Array.isArray(p)) {\n                    j(((p.length <= 1)));\n                    p = p[0];\n                }\n            ;\n            ;\n                j(m[typeof p]);\n                o = ((\"\" + p));\n            }\n        ;\n        ;\n            o = ((o || \"\"));\n            return {\n                initialValue: ((((this.props.value != null)) ? this.props.value : o)),\n                value: o\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getValue: function() {\n            return ((((this.props.value != null)) ? this.props.value : this.state.value));\n        },\n        render: function() {\n            var o = k(this.props);\n            j(((o.dangerouslySetInnerHTML == null)));\n            o.value = this.getValue();\n            o.onChange = this.handleChange;\n            return l(o, this.state.initialValue);\n        },\n        componentDidUpdate: function(o, p, q) {\n            if (((this.props.value != null))) {\n                g.setValueForProperty(q, \"value\", ((this.props.value || \"\")));\n            }\n        ;\n        ;\n        },\n        handleChange: h.autoBind(function(JSBNG__event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(JSBNG__event);\n                this._isChanging = false;\n            }\n        ;\n        ;\n            this.setState({\n                value: JSBNG__event.target.value\n            });\n            return o;\n        })\n    });\n    e.exports = n;\n});\n__d(\"DefaultDOMPropertyConfig\", [\"DOMProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = g.injection.MUST_USE_ATTRIBUTE, i = g.injection.MUST_USE_PROPERTY, j = g.injection.HAS_BOOLEAN_VALUE, k = g.injection.HAS_SIDE_EFFECTS, l = {\n        isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n        Properties: {\n            accept: null,\n            action: null,\n            ajaxify: h,\n            allowFullScreen: ((h | j)),\n            alt: null,\n            autoComplete: null,\n            autoplay: j,\n            cellPadding: null,\n            cellSpacing: null,\n            checked: ((i | j)),\n            className: i,\n            colSpan: null,\n            contentEditable: null,\n            controls: ((i | j)),\n            data: null,\n            dir: null,\n            disabled: ((i | j)),\n            draggable: null,\n            enctype: null,\n            height: h,\n            hidden: ((h | j)),\n            href: null,\n            htmlFor: null,\n            id: i,\n            max: null,\n            method: null,\n            min: null,\n            multiple: ((i | j)),\n            JSBNG__name: null,\n            poster: null,\n            preload: null,\n            placeholder: null,\n            rel: null,\n            required: j,\n            role: h,\n            scrollLeft: i,\n            scrollTop: i,\n            selected: ((i | j)),\n            spellCheck: null,\n            src: null,\n            step: null,\n            style: null,\n            tabIndex: null,\n            target: null,\n            title: null,\n            type: null,\n            value: ((i | k)),\n            width: h,\n            wmode: h,\n            cx: i,\n            cy: i,\n            d: i,\n            fill: i,\n            fx: i,\n            fy: i,\n            points: i,\n            r: i,\n            stroke: i,\n            strokeLinecap: i,\n            strokeWidth: i,\n            transform: i,\n            x: i,\n            x1: i,\n            x2: i,\n            version: i,\n            viewBox: i,\n            y: i,\n            y1: i,\n            y2: i,\n            spreadMethod: i,\n            offset: i,\n            stopColor: i,\n            stopOpacity: i,\n            gradientUnits: i,\n            gradientTransform: i\n        },\n        DOMAttributeNames: {\n            className: \"class\",\n            htmlFor: \"for\",\n            strokeLinecap: \"stroke-linecap\",\n            strokeWidth: \"stroke-width\",\n            stopColor: \"stop-color\",\n            stopOpacity: \"stop-opacity\"\n        },\n        DOMPropertyNames: {\n            autoComplete: \"autocomplete\",\n            spellCheck: \"spellcheck\"\n        },\n        DOMMutationMethods: {\n            className: function(m, n) {\n                m.className = ((n || \"\"));\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"DefaultEventPluginOrder\", [\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyOf\"), h = [g({\n        ResponderEventPlugin: null\n    }),g({\n        SimpleEventPlugin: null\n    }),g({\n        TapEventPlugin: null\n    }),g({\n        EnterLeaveEventPlugin: null\n    }),g({\n        ChangeEventPlugin: null\n    }),g({\n        AnalyticsEventPlugin: null\n    }),];\n    e.exports = h;\n});\n__d(\"SyntheticEvent\", [\"PooledClass\",\"emptyFunction\",\"getEventTarget\",\"merge\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"emptyFunction\"), i = b(\"getEventTarget\"), j = b(\"merge\"), k = b(\"mergeInto\"), l = {\n        type: null,\n        target: i,\n        currentTarget: null,\n        eventPhase: null,\n        bubbles: null,\n        cancelable: null,\n        timeStamp: function(JSBNG__event) {\n            return ((JSBNG__event.timeStamp || JSBNG__Date.now()));\n        },\n        defaultPrevented: null,\n        isTrusted: null\n    };\n    function m(n, o, p) {\n        this.dispatchConfig = n;\n        this.dispatchMarker = o;\n        this.nativeEvent = p;\n        var q = this.constructor.Interface;\n        {\n            var fin86keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin86i = (0);\n            var r;\n            for (; (fin86i < fin86keys.length); (fin86i++)) {\n                ((r) = (fin86keys[fin86i]));\n                {\n                    var s = q[r];\n                    if (s) {\n                        this[r] = s(p);\n                    }\n                     else this[r] = p[r];\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        if (((p.defaultPrevented || ((p.returnValue === false))))) {\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        }\n         else this.isDefaultPrevented = h.thatReturnsFalse;\n    ;\n    ;\n        this.isPropagationStopped = h.thatReturnsFalse;\n    };\n;\n    k(m.prototype, {\n        preventDefault: function() {\n            this.defaultPrevented = true;\n            var JSBNG__event = this.nativeEvent;\n            ((JSBNG__event.preventDefault ? JSBNG__event.preventDefault() : JSBNG__event.returnValue = false));\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        },\n        stopPropagation: function() {\n            var JSBNG__event = this.nativeEvent;\n            ((JSBNG__event.stopPropagation ? JSBNG__event.stopPropagation() : JSBNG__event.cancelBubble = true));\n            this.isPropagationStopped = h.thatReturnsTrue;\n        },\n        persist: function() {\n            this.isPersistent = h.thatReturnsTrue;\n        },\n        isPersistent: h.thatReturnsFalse,\n        destructor: function() {\n            var n = this.constructor.Interface;\n            {\n                var fin87keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin87i = (0);\n                var o;\n                for (; (fin87i < fin87keys.length); (fin87i++)) {\n                    ((o) = (fin87keys[fin87i]));\n                    {\n                        this[o] = null;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.dispatchConfig = null;\n            this.dispatchMarker = null;\n            this.nativeEvent = null;\n        }\n    });\n    m.Interface = l;\n    m.augmentClass = function(n, o) {\n        var p = this, q = Object.create(p.prototype);\n        k(q, n.prototype);\n        n.prototype = q;\n        n.prototype.constructor = n;\n        n.Interface = j(p.Interface, o);\n        n.augmentClass = p.augmentClass;\n        g.addPoolingTo(n, g.threeArgumentPooler);\n    };\n    g.addPoolingTo(m, g.threeArgumentPooler);\n    e.exports = m;\n});\n__d(\"SyntheticUIEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        view: null,\n        detail: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMouseEvent\", [\"SyntheticUIEvent\",\"ViewportMetrics\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = b(\"ViewportMetrics\"), i = {\n        JSBNG__screenX: null,\n        JSBNG__screenY: null,\n        clientX: null,\n        clientY: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        button: function(JSBNG__event) {\n            var k = JSBNG__event.button;\n            if (((\"which\" in JSBNG__event))) {\n                return k;\n            }\n        ;\n        ;\n            return ((((k === 2)) ? 2 : ((((k === 4)) ? 1 : 0))));\n        },\n        buttons: null,\n        relatedTarget: function(JSBNG__event) {\n            return ((JSBNG__event.relatedTarget || ((((JSBNG__event.fromElement === JSBNG__event.srcElement)) ? JSBNG__event.toElement : JSBNG__event.fromElement))));\n        },\n        pageX: function(JSBNG__event) {\n            return ((((\"pageX\" in JSBNG__event)) ? JSBNG__event.pageX : ((JSBNG__event.clientX + h.currentScrollLeft))));\n        },\n        pageY: function(JSBNG__event) {\n            return ((((\"pageY\" in JSBNG__event)) ? JSBNG__event.pageY : ((JSBNG__event.clientY + h.currentScrollTop))));\n        }\n    };\n    function j(k, l, m) {\n        g.call(this, k, l, m);\n    };\n;\n    g.augmentClass(j, i);\n    e.exports = j;\n});\n__d(\"EnterLeaveEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"ExecutionEnvironment\",\"ReactInstanceHandles\",\"SyntheticMouseEvent\",\"ReactID\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"ExecutionEnvironment\"), j = b(\"ReactInstanceHandles\"), k = b(\"SyntheticMouseEvent\"), l = b(\"ReactID\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = j.getFirstReactDOM, p = {\n        mouseEnter: {\n            registrationName: m({\n                onMouseEnter: null\n            })\n        },\n        mouseLeave: {\n            registrationName: m({\n                onMouseLeave: null\n            })\n        }\n    }, q = {\n        eventTypes: p,\n        extractEvents: function(r, s, t, u) {\n            if (((((r === n.topMouseOver)) && ((u.relatedTarget || u.fromElement))))) {\n                return null;\n            }\n        ;\n        ;\n            if (((((r !== n.topMouseOut)) && ((r !== n.topMouseOver))))) {\n                return null;\n            }\n        ;\n        ;\n            var v, w;\n            if (((r === n.topMouseOut))) {\n                v = s;\n                w = ((o(((u.relatedTarget || u.toElement))) || i.global));\n            }\n             else {\n                v = i.global;\n                w = s;\n            }\n        ;\n        ;\n            if (((v === w))) {\n                return null;\n            }\n        ;\n        ;\n            var x = ((v ? l.getID(v) : \"\")), y = ((w ? l.getID(w) : \"\")), z = k.getPooled(p.mouseLeave, x, u), aa = k.getPooled(p.mouseEnter, y, u);\n            h.accumulateEnterLeaveDispatches(z, aa, x, y);\n            return [z,aa,];\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChangeEventPlugin\", [\"EventConstants\",\"EventPluginHub\",\"EventPropagators\",\"ExecutionEnvironment\",\"SyntheticEvent\",\"isEventSupported\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPluginHub\"), i = b(\"EventPropagators\"), j = b(\"ExecutionEnvironment\"), k = b(\"SyntheticEvent\"), l = b(\"isEventSupported\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = {\n        change: {\n            phasedRegistrationNames: {\n                bubbled: m({\n                    onChange: null\n                }),\n                captured: m({\n                    onChangeCapture: null\n                })\n            }\n        }\n    }, p = null, q = null, r = null, s = null;\n    function t(na) {\n        return ((((na.nodeName === \"SELECT\")) || ((((na.nodeName === \"INPUT\")) && ((na.type === \"file\"))))));\n    };\n;\n    var u = false;\n    if (j.canUseDOM) {\n        u = ((l(\"change\") && ((!((\"documentMode\" in JSBNG__document)) || ((JSBNG__document.documentMode > 8))))));\n    }\n;\n;\n    function v(na) {\n        var JSBNG__event = k.getPooled(o.change, q, na);\n        i.accumulateTwoPhaseDispatches(JSBNG__event);\n        h.enqueueEvents(JSBNG__event);\n        h.processEventQueue();\n    };\n;\n    function w(na, oa) {\n        p = na;\n        q = oa;\n        p.JSBNG__attachEvent(\"JSBNG__onchange\", v);\n    };\n;\n    function x() {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        p.JSBNG__detachEvent(\"JSBNG__onchange\", v);\n        p = null;\n        q = null;\n    };\n;\n    function y(na, oa, pa) {\n        if (((na === n.topChange))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    function z(na, oa, pa) {\n        if (((na === n.topFocus))) {\n            x();\n            w(oa, pa);\n        }\n         else if (((na === n.topBlur))) {\n            x();\n        }\n        \n    ;\n    ;\n    };\n;\n    var aa = false;\n    if (j.canUseDOM) {\n        aa = ((l(\"input\") && ((!((\"documentMode\" in JSBNG__document)) || ((JSBNG__document.documentMode > 9))))));\n    }\n;\n;\n    var ba = {\n        color: true,\n        date: true,\n        datetime: true,\n        \"datetime-local\": true,\n        email: true,\n        month: true,\n        number: true,\n        password: true,\n        range: true,\n        search: true,\n        tel: true,\n        text: true,\n        time: true,\n        url: true,\n        week: true\n    };\n    function ca(na) {\n        return ((((((na.nodeName === \"INPUT\")) && ba[na.type])) || ((na.nodeName === \"TEXTAREA\"))));\n    };\n;\n    var da = {\n        get: function() {\n            return s.get.call(this);\n        },\n        set: function(na) {\n            r = na;\n            s.set.call(this, na);\n        }\n    };\n    function ea(na, oa) {\n        p = na;\n        q = oa;\n        r = na.value;\n        s = Object.getOwnPropertyDescriptor(na.constructor.prototype, \"value\");\n        Object.defineProperty(p, \"value\", da);\n        p.JSBNG__attachEvent(\"onpropertychange\", ga);\n    };\n;\n    function fa() {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        delete p.value;\n        p.JSBNG__detachEvent(\"onpropertychange\", ga);\n        p = null;\n        q = null;\n        r = null;\n        s = null;\n    };\n;\n    function ga(na) {\n        if (((na.propertyName !== \"value\"))) {\n            return;\n        }\n    ;\n    ;\n        var oa = na.srcElement.value;\n        if (((oa === r))) {\n            return;\n        }\n    ;\n    ;\n        r = oa;\n        v(na);\n    };\n;\n    function ha(na, oa, pa) {\n        if (((na === n.topInput))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    function ia(na, oa, pa) {\n        if (((na === n.topFocus))) {\n            fa();\n            ea(oa, pa);\n        }\n         else if (((na === n.topBlur))) {\n            fa();\n        }\n        \n    ;\n    ;\n    };\n;\n    function ja(na, oa, pa) {\n        if (((((((na === n.topSelectionChange)) || ((na === n.topKeyUp)))) || ((na === n.topKeyDown))))) {\n            if (((p && ((p.value !== r))))) {\n                r = p.value;\n                return q;\n            }\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ka(na) {\n        return ((((na.nodeName === \"INPUT\")) && ((((na.type === \"checkbox\")) || ((na.type === \"radio\"))))));\n    };\n;\n    function la(na, oa, pa) {\n        if (((na === n.topClick))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    var ma = {\n        eventTypes: o,\n        extractEvents: function(na, oa, pa, qa) {\n            var ra, sa;\n            if (t(oa)) {\n                if (u) {\n                    ra = y;\n                }\n                 else sa = z;\n            ;\n            ;\n            }\n             else if (ca(oa)) {\n                if (aa) {\n                    ra = ha;\n                }\n                 else {\n                    ra = ja;\n                    sa = ia;\n                }\n            ;\n            ;\n            }\n             else if (ka(oa)) {\n                ra = la;\n            }\n            \n            \n        ;\n        ;\n            if (ra) {\n                var ta = ra(na, oa, pa);\n                if (ta) {\n                    var JSBNG__event = k.getPooled(o.change, ta, qa);\n                    i.accumulateTwoPhaseDispatches(JSBNG__event);\n                    return JSBNG__event;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (sa) {\n                sa(na, oa, pa);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ma;\n});\n__d(\"SyntheticFocusEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        relatedTarget: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticKeyboardEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        char: null,\n        key: null,\n        JSBNG__location: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        repeat: null,\n        locale: null,\n        charCode: null,\n        keyCode: null,\n        which: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMutationEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        relatedNode: null,\n        prevValue: null,\n        newValue: null,\n        attrName: null,\n        attrChange: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticTouchEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        touches: null,\n        targetTouches: null,\n        changedTouches: null,\n        altKey: null,\n        metaKey: null,\n        ctrlKey: null,\n        shiftKey: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticWheelEvent\", [\"SyntheticMouseEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticMouseEvent\"), h = {\n        deltaX: function(JSBNG__event) {\n            return ((((\"deltaX\" in JSBNG__event)) ? JSBNG__event.deltaX : ((((\"wheelDeltaX\" in JSBNG__event)) ? -JSBNG__event.wheelDeltaX : 0))));\n        },\n        deltaY: function(JSBNG__event) {\n            return ((((\"deltaY\" in JSBNG__event)) ? -JSBNG__event.deltaY : ((((\"wheelDeltaY\" in JSBNG__event)) ? JSBNG__event.wheelDeltaY : ((((\"wheelDelta\" in JSBNG__event)) ? JSBNG__event.wheelData : 0))))));\n        },\n        deltaZ: null,\n        deltaMode: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SimpleEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"SyntheticEvent\",\"SyntheticFocusEvent\",\"SyntheticKeyboardEvent\",\"SyntheticMouseEvent\",\"SyntheticMutationEvent\",\"SyntheticTouchEvent\",\"SyntheticUIEvent\",\"SyntheticWheelEvent\",\"invariant\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"SyntheticEvent\"), j = b(\"SyntheticFocusEvent\"), k = b(\"SyntheticKeyboardEvent\"), l = b(\"SyntheticMouseEvent\"), m = b(\"SyntheticMutationEvent\"), n = b(\"SyntheticTouchEvent\"), o = b(\"SyntheticUIEvent\"), p = b(\"SyntheticWheelEvent\"), q = b(\"invariant\"), r = b(\"keyOf\"), s = g.topLevelTypes, t = {\n        JSBNG__blur: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onBlur: true\n                }),\n                captured: r({\n                    onBlurCapture: true\n                })\n            }\n        },\n        click: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onClick: true\n                }),\n                captured: r({\n                    onClickCapture: true\n                })\n            }\n        },\n        doubleClick: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDoubleClick: true\n                }),\n                captured: r({\n                    onDoubleClickCapture: true\n                })\n            }\n        },\n        drag: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrag: true\n                }),\n                captured: r({\n                    onDragCapture: true\n                })\n            }\n        },\n        dragEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnd: true\n                }),\n                captured: r({\n                    onDragEndCapture: true\n                })\n            }\n        },\n        dragEnter: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnter: true\n                }),\n                captured: r({\n                    onDragEnterCapture: true\n                })\n            }\n        },\n        dragExit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragExit: true\n                }),\n                captured: r({\n                    onDragExitCapture: true\n                })\n            }\n        },\n        dragLeave: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragLeave: true\n                }),\n                captured: r({\n                    onDragLeaveCapture: true\n                })\n            }\n        },\n        dragOver: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragOver: true\n                }),\n                captured: r({\n                    onDragOverCapture: true\n                })\n            }\n        },\n        dragStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragStart: true\n                }),\n                captured: r({\n                    onDragStartCapture: true\n                })\n            }\n        },\n        drop: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrop: true\n                }),\n                captured: r({\n                    onDropCapture: true\n                })\n            }\n        },\n        DOMCharacterDataModified: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDOMCharacterDataModified: true\n                }),\n                captured: r({\n                    onDOMCharacterDataModifiedCapture: true\n                })\n            }\n        },\n        JSBNG__focus: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onFocus: true\n                }),\n                captured: r({\n                    onFocusCapture: true\n                })\n            }\n        },\n        input: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onInput: true\n                }),\n                captured: r({\n                    onInputCapture: true\n                })\n            }\n        },\n        keyDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyDown: true\n                }),\n                captured: r({\n                    onKeyDownCapture: true\n                })\n            }\n        },\n        keyPress: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyPress: true\n                }),\n                captured: r({\n                    onKeyPressCapture: true\n                })\n            }\n        },\n        keyUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyUp: true\n                }),\n                captured: r({\n                    onKeyUpCapture: true\n                })\n            }\n        },\n        mouseDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseDown: true\n                }),\n                captured: r({\n                    onMouseDownCapture: true\n                })\n            }\n        },\n        mouseMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseMove: true\n                }),\n                captured: r({\n                    onMouseMoveCapture: true\n                })\n            }\n        },\n        mouseUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseUp: true\n                }),\n                captured: r({\n                    onMouseUpCapture: true\n                })\n            }\n        },\n        JSBNG__scroll: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onScroll: true\n                }),\n                captured: r({\n                    onScrollCapture: true\n                })\n            }\n        },\n        submit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onSubmit: true\n                }),\n                captured: r({\n                    onSubmitCapture: true\n                })\n            }\n        },\n        touchCancel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchCancel: true\n                }),\n                captured: r({\n                    onTouchCancelCapture: true\n                })\n            }\n        },\n        touchEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchEnd: true\n                }),\n                captured: r({\n                    onTouchEndCapture: true\n                })\n            }\n        },\n        touchMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchMove: true\n                }),\n                captured: r({\n                    onTouchMoveCapture: true\n                })\n            }\n        },\n        touchStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchStart: true\n                }),\n                captured: r({\n                    onTouchStartCapture: true\n                })\n            }\n        },\n        wheel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onWheel: true\n                }),\n                captured: r({\n                    onWheelCapture: true\n                })\n            }\n        }\n    }, u = {\n        topBlur: t.JSBNG__blur,\n        topClick: t.click,\n        topDoubleClick: t.doubleClick,\n        topDOMCharacterDataModified: t.DOMCharacterDataModified,\n        topDrag: t.drag,\n        topDragEnd: t.dragEnd,\n        topDragEnter: t.dragEnter,\n        topDragExit: t.dragExit,\n        topDragLeave: t.dragLeave,\n        topDragOver: t.dragOver,\n        topDragStart: t.dragStart,\n        topDrop: t.drop,\n        topFocus: t.JSBNG__focus,\n        topInput: t.input,\n        topKeyDown: t.keyDown,\n        topKeyPress: t.keyPress,\n        topKeyUp: t.keyUp,\n        topMouseDown: t.mouseDown,\n        topMouseMove: t.mouseMove,\n        topMouseUp: t.mouseUp,\n        topScroll: t.JSBNG__scroll,\n        topSubmit: t.submit,\n        topTouchCancel: t.touchCancel,\n        topTouchEnd: t.touchEnd,\n        topTouchMove: t.touchMove,\n        topTouchStart: t.touchStart,\n        topWheel: t.wheel\n    }, v = {\n        eventTypes: t,\n        executeDispatch: function(JSBNG__event, w, x) {\n            var y = w(JSBNG__event, x);\n            if (((y === false))) {\n                JSBNG__event.stopPropagation();\n                JSBNG__event.preventDefault();\n            }\n        ;\n        ;\n        },\n        extractEvents: function(w, x, y, z) {\n            var aa = u[w];\n            if (!aa) {\n                return null;\n            }\n        ;\n        ;\n            var ba;\n            switch (w) {\n              case s.topInput:\n            \n              case s.topSubmit:\n                ba = i;\n                break;\n              case s.topKeyDown:\n            \n              case s.topKeyPress:\n            \n              case s.topKeyUp:\n                ba = k;\n                break;\n              case s.topBlur:\n            \n              case s.topFocus:\n                ba = j;\n                break;\n              case s.topClick:\n            \n              case s.topDoubleClick:\n            \n              case s.topDrag:\n            \n              case s.topDragEnd:\n            \n              case s.topDragEnter:\n            \n              case s.topDragExit:\n            \n              case s.topDragLeave:\n            \n              case s.topDragOver:\n            \n              case s.topDragStart:\n            \n              case s.topDrop:\n            \n              case s.topMouseDown:\n            \n              case s.topMouseMove:\n            \n              case s.topMouseUp:\n                ba = l;\n                break;\n              case s.topDOMCharacterDataModified:\n                ba = m;\n                break;\n              case s.topTouchCancel:\n            \n              case s.topTouchEnd:\n            \n              case s.topTouchMove:\n            \n              case s.topTouchStart:\n                ba = n;\n                break;\n              case s.topScroll:\n                ba = o;\n                break;\n              case s.topWheel:\n                ba = p;\n                break;\n            };\n        ;\n            q(ba);\n            var JSBNG__event = ba.getPooled(aa, y, z);\n            h.accumulateTwoPhaseDispatches(JSBNG__event);\n            return JSBNG__event;\n        }\n    };\n    e.exports = v;\n});\n__d(\"ReactDefaultInjection\", [\"ReactDOM\",\"ReactDOMForm\",\"ReactDOMInput\",\"ReactDOMTextarea\",\"DefaultDOMPropertyConfig\",\"DOMProperty\",\"DefaultEventPluginOrder\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"EventPluginHub\",\"ReactInstanceHandles\",\"SimpleEventPlugin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactDOM\"), h = b(\"ReactDOMForm\"), i = b(\"ReactDOMInput\"), j = b(\"ReactDOMTextarea\"), k = b(\"DefaultDOMPropertyConfig\"), l = b(\"DOMProperty\"), m = b(\"DefaultEventPluginOrder\"), n = b(\"EnterLeaveEventPlugin\"), o = b(\"ChangeEventPlugin\"), p = b(\"EventPluginHub\"), q = b(\"ReactInstanceHandles\"), r = b(\"SimpleEventPlugin\");\n    function s() {\n        p.injection.injectEventPluginOrder(m);\n        p.injection.injectInstanceHandle(q);\n        p.injection.injectEventPluginsByName({\n            SimpleEventPlugin: r,\n            EnterLeaveEventPlugin: n,\n            ChangeEventPlugin: o\n        });\n        g.injection.injectComponentClasses({\n            form: h,\n            input: i,\n            textarea: j\n        });\n        l.injection.injectDOMPropertyConfig(k);\n    };\n;\n    e.exports = {\n        inject: s\n    };\n});\n__d(\"React\", [\"ReactCompositeComponent\",\"ReactComponent\",\"ReactDOM\",\"ReactMount\",\"ReactProps\",\"ReactServerRendering\",\"ReactDefaultInjection\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactComponent\"), i = b(\"ReactDOM\"), j = b(\"ReactMount\"), k = b(\"ReactProps\"), l = b(\"ReactServerRendering\"), m = b(\"ReactDefaultInjection\");\n    m.inject();\n    var n = {\n        DOM: i,\n        Props: k,\n        initializeTouchEvents: function(o) {\n            j.useTouchEvents = o;\n        },\n        autoBind: g.autoBind,\n        createClass: g.createClass,\n        constructAndRenderComponent: j.constructAndRenderComponent,\n        constructAndRenderComponentByID: j.constructAndRenderComponentByID,\n        renderComponent: j.renderComponent,\n        renderComponentToString: l.renderComponentToString,\n        unmountAndReleaseReactRootNode: j.unmountAndReleaseReactRootNode,\n        isValidComponent: h.isValidComponent\n    };\n    e.exports = n;\n});\n__d(\"TrackingNodes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            USER_NAME: 2,\n            LIKE_LINK: 5,\n            UNLIKE_LINK: 6,\n            ATTACHMENT: 15,\n            SHARE_LINK: 17,\n            USER_MESSAGE: 18,\n            SOURCE: 21,\n            BLINGBOX: 22,\n            VIEW_ALL_COMMENTS: 24,\n            COMMENT: 25,\n            COMMENT_LINK: 26,\n            SMALL_ACTOR_PHOTO: 27,\n            XBUTTON: 29,\n            HIDE_LINK: 30,\n            REPORT_SPAM_LINK: 31,\n            HIDE_ALL_LINK: 32,\n            ADD_COMMENT_BOX: 34,\n            UFI: 36,\n            DROPDOWN_BUTTON: 55,\n            UNHIDE_LINK: 71\n        },\n        BASE_CODE_START: 58,\n        BASE_CODE_END: 126,\n        BASE_CODE_SIZE: 69,\n        PREFIX_CODE_START: 42,\n        PREFIX_CODE_END: 47,\n        PREFIX_CODE_SIZE: 6,\n        encodeTrackingInfo: function(h, i) {\n            var j = ((((h - 1)) % g.BASE_CODE_SIZE)), k = parseInt(((((h - 1)) / g.BASE_CODE_SIZE)), 10);\n            if (((((h < 1)) || ((k > g.PREFIX_CODE_SIZE))))) {\n                throw Error(((\"Invalid tracking node: \" + h)));\n            }\n        ;\n        ;\n            var l = \"\";\n            if (((k > 0))) {\n                l += String.fromCharCode(((((k - 1)) + g.PREFIX_CODE_START)));\n            }\n        ;\n        ;\n            l += String.fromCharCode(((j + g.BASE_CODE_START)));\n            if (((((typeof i != \"undefined\")) && ((i > 0))))) {\n                l += String.fromCharCode(((((48 + Math.min(i, 10))) - 1)));\n            }\n        ;\n        ;\n            return l;\n        },\n        decodeTN: function(h) {\n            if (((h.length === 0))) {\n                return [0,];\n            }\n        ;\n        ;\n            var i = h.charCodeAt(0), j = 1, k, l;\n            if (((((i >= g.PREFIX_CODE_START)) && ((i <= g.PREFIX_CODE_END))))) {\n                if (((h.length == 1))) {\n                    return [0,];\n                }\n            ;\n            ;\n                l = ((((i - g.PREFIX_CODE_START)) + 1));\n                k = h.charCodeAt(1);\n                j = 2;\n            }\n             else {\n                l = 0;\n                k = i;\n            }\n        ;\n        ;\n            if (((((k < g.BASE_CODE_START)) || ((k > g.BASE_CODE_END))))) {\n                return [0,];\n            }\n        ;\n        ;\n            var m = ((((((l * g.BASE_CODE_SIZE)) + ((k - g.BASE_CODE_START)))) + 1));\n            if (((((h.length > j)) && ((((h.charAt(j) >= \"0\")) && ((h.charAt(j) <= \"9\"))))))) {\n                return [((j + 1)),[m,((parseInt(h.charAt(j), 10) + 1)),],];\n            }\n        ;\n        ;\n            return [j,[m,],];\n        },\n        parseTrackingNodeString: function(h) {\n            var i = [];\n            while (((h.length > 0))) {\n                var j = g.decodeTN(h);\n                if (((j.length == 1))) {\n                    return [];\n                }\n            ;\n            ;\n                i.push(j[1]);\n                h = h.substring(j[0]);\n            };\n        ;\n            return i;\n        },\n        getTrackingInfo: function(h, i) {\n            return ((((\"{\\\"tn\\\":\\\"\" + g.encodeTrackingInfo(h, i))) + \"\\\"}\"));\n        }\n    };\n    e.exports = g;\n});\n__d(\"NumberFormat\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = /(\\d{3})(?=\\d)/g, i = 10000, j = function(l) {\n        return ((\"\" + l)).split(\"\").reverse().join(\"\");\n    }, k = {\n        formatIntegerWithDelimiter: function(l, m) {\n            if (((((((g.locale == \"nb_NO\")) || ((g.locale == \"nn_NO\")))) && ((Math.abs(l) < i))))) {\n                return l.toString();\n            }\n        ;\n        ;\n            var n = j(l);\n            return j(n.replace(h, ((\"$1\" + m))));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UFIBlingItem.react\", [\"React\",\"NumberFormat\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"NumberFormat\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = g.createClass({\n        displayName: \"UFIBlingItem\",\n        render: function() {\n            var l = j(this.props.className, this.props.iconClassName, \"UFIBlingBoxSprite\"), m = h.formatIntegerWithDelimiter(this.props.count, ((this.props.contextArgs.numberdelimiter || \",\")));\n            return (g.DOM.span(null, g.DOM.i({\n                className: l\n            }), g.DOM.span({\n                className: \"UFIBlingBoxText\"\n            }, m)));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFIConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COMMENT_LIKE: \"fa-type:comment-like\",\n        COMMENT_SET_SPAM: \"fa-type:mark-spam\",\n        DELETE_COMMENT: \"fa-type:delete-comment\",\n        LIVE_DELETE_COMMENT: \"fa-type:live-delete-comment\",\n        LIKE_ACTION: \"fa-type:like\",\n        REMOVE_PREVIEW: \"fa-type:remove-preview\",\n        CONFIRM_COMMENT_REMOVAL: \"fa-type:confirm-remove\",\n        TRANSLATE_COMMENT: \"fa-type:translate-comment\",\n        SUBSCRIBE_ACTION: \"fa-type:subscribe\",\n        GIFT_SUGGESTION: \"fa-type:gift-suggestion\",\n        UNDO_DELETE_COMMENT: \"fa-type:undo-delete-comment\"\n    }, h = {\n        DELETED: \"status:deleted\",\n        SPAM: \"status:spam\",\n        SPAM_DISPLAY: \"status:spam-display\",\n        LIVE_DELETED: \"status:live-deleted\",\n        FAILED_ADD: \"status:failed-add\",\n        FAILED_EDIT: \"status:failed-edit\",\n        PENDING_EDIT: \"status:pending-edit\",\n        PENDING_UNDO_DELETE: \"status:pending-undo-delete\"\n    }, i = {\n        MOBILE: 1,\n        SMS: 3,\n        EMAIL: 4\n    }, j = {\n        PROFILE: 0,\n        NEWS_FEED: 1,\n        OBJECT: 2,\n        MOBILE: 3,\n        EMAIL: 4,\n        PROFILE_APROVAL: 10,\n        TICKER: 12,\n        NONE: 13,\n        INTERN: 14,\n        ADS: 15,\n        PHOTOS_SNOWLIFT: 17\n    }, k = {\n        UNKNOWN: 0,\n        INITIAL_SERVER: 1,\n        LIVE_SEND: 2,\n        USER_ACTION: 3,\n        COLLAPSED_UFI: 4,\n        ENDPOINT_LIKE: 10,\n        ENDPOINT_COMMENT_LIKE: 11,\n        ENDPOINT_ADD_COMMENT: 12,\n        ENDPOINT_EDIT_COMMENT: 13,\n        ENDPOINT_DELETE_COMMENT: 14,\n        ENDPOINT_UNDO_DELETE_COMMENT: 15,\n        ENDPOINT_COMMENT_SPAM: 16,\n        ENDPOINT_REMOVE_PREVIEW: 17,\n        ENDPOINT_ID_COMMENT_FETCH: 18,\n        ENDPOINT_COMMENT_FETCH: 19,\n        ENDPOINT_TRANSLATE_COMMENT: 20,\n        ENDPOINT_BAN: 21,\n        ENDPOINT_SUBSCRIBE: 22\n    }, l = {\n        CHRONOLOGICAL: \"chronological\",\n        RANKED_THREADED: \"ranked_threaded\",\n        TOPLEVEL: \"toplevel\",\n        RECENT_ACTIVITY: \"recent_activity\"\n    }, m = 50, n = 97244, o = 420, p = 5, q = 80, r = 2;\n    e.exports = {\n        UFIActionType: g,\n        UFIStatus: h,\n        UFISourceType: i,\n        UFIFeedbackSourceType: j,\n        UFIPayloadSourceType: k,\n        UFICommentOrderingMode: l,\n        defaultPageSize: m,\n        commentTruncationLength: o,\n        commentTruncationPercent: n,\n        commentTruncationMaxLines: p,\n        attachmentTruncationLength: q,\n        minCommentsForOrderingModeSelector: r\n    };\n});\n__d(\"UFIBlingBox.react\", [\"React\",\"UFIBlingItem.react\",\"UFIConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIBlingItem.react\"), i = b(\"UFIConstants\"), j = b(\"cx\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIBlingBox\",\n        render: function() {\n            var m = [], n = \"\";\n            if (this.props.likes) {\n                m.push(h({\n                    count: this.props.likes,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxLikeIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.likes == 1)) ? \"1 like\" : k._(\"{count} likes\", {\n                    count: this.props.likes\n                })));\n                n += \" \";\n            }\n        ;\n        ;\n            if (this.props.comments) {\n                m.push(h({\n                    count: this.props.comments,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxCommentIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.comments == 1)) ? \"1 comment\" : k._(\"{count} comments\", {\n                    count: this.props.comments\n                })));\n                n += \" \";\n            }\n        ;\n        ;\n            if (this.props.reshares) {\n                m.push(h({\n                    count: this.props.reshares,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxReshareIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.reshares == 1)) ? \"1 share\" : k._(\"{count} shares\", {\n                    count: this.props.reshares\n                })));\n            }\n        ;\n        ;\n            var o = g.DOM.a({\n                className: \"UFIBlingBox uiBlingBox feedbackBling\",\n                href: this.props.permalink,\n                \"data-ft\": this.props[\"data-ft\"],\n                \"aria-label\": n\n            }, m);\n            if (((this.props.comments < i.defaultPageSize))) {\n                o.props.onClick = this.props.onClick;\n                o.props.rel = \"ignore\";\n            }\n        ;\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFICentralUpdates\", [\"Arbiter\",\"ChannelConstants\",\"LiveTimer\",\"ShortProfiles\",\"UFIConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveTimer\"), j = b(\"ShortProfiles\"), k = b(\"UFIConstants\"), l = b(\"copyProperties\"), m = b(\"tx\"), n = 0, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [];\n    g.subscribe(h.getArbiterType(\"live-data\"), function(x, y) {\n        if (((y && y.obj))) {\n            var z = y.obj, aa = ((z.comments || []));\n            aa.forEach(function(ba) {\n                ba.timestamp.text = \"a few seconds ago\";\n            });\n            w.handleUpdate(k.UFIPayloadSourceType.LIVE_SEND, z);\n        }\n    ;\n    ;\n    });\n    function t() {\n        if (!n) {\n            var x = q, y = o, z = p, aa = r;\n            q = {\n            };\n            o = {\n            };\n            p = {\n            };\n            r = {\n            };\n            if (Object.keys(x).length) {\n                v(\"feedback-id-changed\", x);\n            }\n        ;\n        ;\n            if (Object.keys(y).length) {\n                v(\"feedback-updated\", y);\n            }\n        ;\n        ;\n            if (Object.keys(z).length) {\n                v(\"comments-updated\", z);\n            }\n        ;\n        ;\n            if (Object.keys(aa).length) {\n                v(\"instance-updated\", aa);\n            }\n        ;\n        ;\n            s.pop();\n        }\n    ;\n    ;\n    };\n;\n    function u() {\n        if (s.length) {\n            return s[((s.length - 1))];\n        }\n         else return k.UFIPayloadSourceType.UNKNOWN\n    ;\n    };\n;\n    function v(JSBNG__event, x) {\n        w.inform(JSBNG__event, {\n            updates: x,\n            payloadSource: u()\n        });\n    };\n;\n    var w = l(new g(), {\n        handleUpdate: function(x, y) {\n            if (Object.keys(y).length) {\n                this.synchronizeInforms(function() {\n                    s.push(x);\n                    var z = l({\n                        payloadsource: u()\n                    }, y);\n                    this.inform(\"update-feedback\", z);\n                    this.inform(\"update-comment-lists\", z);\n                    this.inform(\"update-comments\", z);\n                    this.inform(\"update-actions\", z);\n                    ((y.profiles || [])).forEach(function(aa) {\n                        j.set(aa.id, aa);\n                    });\n                    if (y.servertime) {\n                        i.restart(y.servertime);\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        didUpdateFeedback: function(x) {\n            o[x] = true;\n            t();\n        },\n        didUpdateComment: function(x) {\n            p[x] = true;\n            t();\n        },\n        didUpdateFeedbackID: function(x, y) {\n            q[x] = y;\n            t();\n        },\n        didUpdateInstanceState: function(x, y) {\n            if (!r[x]) {\n                r[x] = {\n                };\n            }\n        ;\n        ;\n            r[x][y] = true;\n            t();\n        },\n        synchronizeInforms: function(x) {\n            n++;\n            try {\n                x();\n            } catch (y) {\n                throw y;\n            } finally {\n                n--;\n                t();\n            };\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"randomInt\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        var k = arguments.length;\n        g(((((k > 0)) && ((k <= 2)))));\n        if (((k === 1))) {\n            j = i;\n            i = 0;\n        }\n    ;\n    ;\n        g(((j > i)));\n        var l = ((this.JSBNG__random || Math.JSBNG__random));\n        return Math.floor(((i + ((l() * ((j - i)))))));\n    };\n;\n    e.exports = h;\n});\n__d(\"ClientIDs\", [\"randomInt\",], function(a, b, c, d, e, f) {\n    var g = b(\"randomInt\"), h = {\n    }, i = {\n        getNewClientID: function() {\n            var j = JSBNG__Date.now(), k = ((((j + \":\")) + ((g(0, 4294967295) + 1))));\n            h[k] = true;\n            return k;\n        },\n        isExistingClientID: function(j) {\n            return !!h[j];\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImmutableObject\", [\"keyMirror\",\"merge\",\"mergeInto\",\"mergeHelpers\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"merge\"), i = b(\"mergeInto\"), j = b(\"mergeHelpers\"), k = b(\"throwIf\"), l = j.checkMergeObjectArgs, m = j.isTerminal, n, o;\n    n = g({\n        INVALID_MAP_SET_ARG: null\n    });\n    o = function(q) {\n        i(this, q);\n    };\n    o.set = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        var s = new o(q);\n        i(s, r);\n        return s;\n    };\n    o.setField = function(q, r, s) {\n        var t = {\n        };\n        t[r] = s;\n        return o.set(q, t);\n    };\n    o.setDeep = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        return p(q, r);\n    };\n    function p(q, r) {\n        l(q, r);\n        var s = {\n        }, t = Object.keys(q);\n        for (var u = 0; ((u < t.length)); u++) {\n            var v = t[u];\n            if (!r.hasOwnProperty(v)) {\n                s[v] = q[v];\n            }\n             else if (((m(q[v]) || m(r[v])))) {\n                s[v] = r[v];\n            }\n             else s[v] = p(q[v], r[v]);\n            \n        ;\n        ;\n        };\n    ;\n        var w = Object.keys(r);\n        for (u = 0; ((u < w.length)); u++) {\n            var x = w[u];\n            if (q.hasOwnProperty(x)) {\n                continue;\n            }\n        ;\n        ;\n            s[x] = r[x];\n        };\n    ;\n        return ((((((q instanceof o)) || ((r instanceof o)))) ? new o(s) : s));\n    };\n;\n    e.exports = o;\n});\n__d(\"debounceAcrossTransitions\", [\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"debounce\");\n    function h(i, j, k) {\n        return g(i, j, k, true);\n    };\n;\n    e.exports = h;\n});\n__d(\"MercuryServerDispatcher\", [\"AsyncRequest\",\"FBAjaxRequest\",\"Env\",\"JSLogger\",\"Run\",\"areObjectsEqual\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"FBAjaxRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = b(\"areObjectsEqual\"), m = b(\"copyProperties\"), n = b(\"debounceAcrossTransitions\"), o = {\n    }, p = j.create(\"mercury_dispatcher\"), q = false, r = {\n        IMMEDIATE: \"immediate\",\n        IDEMPOTENT: \"idempotent\",\n        BATCH_SUCCESSIVE: \"batch-successive\",\n        BATCH_SUCCESSIVE_UNIQUE: \"batch-successive-unique\",\n        BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR: \"batch-successive-piggyback-retry\",\n        BATCH_DEFERRED_MULTI: \"batch-deferred-multi\",\n        BATCH_CONDITIONAL: \"batch-conditional\",\n        registerEndpoints: function(v) {\n            {\n                var fin88keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin88i = (0);\n                var w;\n                for (; (fin88i < fin88keys.length); (fin88i++)) {\n                    ((w) = (fin88keys[fin88i]));\n                    {\n                        var x = v[w], y = ((x.request_user_id || i.user));\n                        if (!o[w]) {\n                            o[w] = {\n                            };\n                        }\n                    ;\n                    ;\n                        if (!o[w][y]) {\n                            o[w][y] = {\n                            };\n                        }\n                    ;\n                    ;\n                        o[w][y] = new s(w, x);\n                    };\n                };\n            };\n        ;\n        },\n        trySend: function(v, w, x, y) {\n            y = ((y || i.user));\n            if (((((v == \"/ajax/mercury/client_reliability.php\")) && !o[v][y]))) {\n                o[v][y] = o[v][undefined];\n            }\n        ;\n        ;\n            o[v][y].trySend(w, x);\n        }\n    };\n    function s(v, w) {\n        var x = ((w.mode || r.IMMEDIATE));\n        switch (x) {\n          case r.IMMEDIATE:\n        \n          case r.IDEMPOTENT:\n        \n          case r.BATCH_SUCCESSIVE:\n        \n          case r.BATCH_SUCCESSIVE_UNIQUE:\n        \n          case r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR:\n        \n          case r.BATCH_DEFERRED_MULTI:\n        \n          case r.BATCH_CONDITIONAL:\n            break;\n          default:\n            throw new Error(((\"Invalid MercuryServerDispatcher mode \" + x)));\n        };\n    ;\n        this._endpoint = v;\n        this._mode = x;\n        this._requestUserID = w.request_user_id;\n        this._combineData = w.batch_function;\n        this._combineDataIf = w.batch_if;\n        this._batchSizeLimit = w.batch_size_limit;\n        this._batches = [];\n        this._handler = w.handler;\n        this._errorHandler = w.error_handler;\n        this._transportErrorHandler = ((w.transport_error_handler || w.error_handler));\n        this._connectionRetries = ((w.connection_retries || 0));\n        this._timeoutHandler = w.timeout_handler;\n        this._timeout = w.timeout;\n        this._serverDialogCancelHandler = ((w.server_dialog_cancel_handler || w.error_handler));\n        this._deferredSend = n(this._batchSend, 0, this);\n        if (this._batchSizeLimit) {\n            k.onUnload(function() {\n                p.bump(((\"unload_batches_count_\" + u(this._batches.length))));\n            }.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    m(s.prototype, {\n        _inFlight: 0,\n        _handler: null,\n        _errorHandler: null,\n        _transportErrorHandler: null,\n        _timeoutHandler: null,\n        _timeout: null,\n        _serverDialogCancelHandler: null,\n        _combineData: null,\n        trySend: function(v, w) {\n            if (q) {\n                return;\n            }\n        ;\n        ;\n            if (((typeof v == \"undefined\"))) {\n                v = null;\n            }\n        ;\n        ;\n            var x = ((w || this._mode));\n            if (((x == r.IMMEDIATE))) {\n                this._send(v);\n            }\n             else if (((x == r.IDEMPOTENT))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n            ;\n            ;\n            }\n             else if (((((x == r.BATCH_SUCCESSIVE)) || ((x == r.BATCH_SUCCESSIVE_UNIQUE))))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n                 else this._batchData(v);\n            ;\n            ;\n            }\n             else if (((x == r.BATCH_CONDITIONAL))) {\n                var y = ((this._batches[0] && this._batches[0].getData()));\n                if (((this._inFlight && ((this._combineDataIf(this._pendingRequestData, v) || this._combineDataIf(y, v)))))) {\n                    this._batchData(v);\n                }\n                 else this._send(v);\n            ;\n            ;\n            }\n             else if (((x == r.BATCH_DEFERRED_MULTI))) {\n                this._batchData(v);\n                this._deferredSend();\n            }\n             else if (((x == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR))) {\n                this._batchData(v);\n                if (!this._inFlight) {\n                    this._batchSend();\n                }\n            ;\n            ;\n            }\n            \n            \n            \n            \n            \n        ;\n        ;\n        },\n        _send: function(v) {\n            this._inFlight++;\n            this._pendingRequestData = m({\n            }, v);\n            if (((this._requestUserID != i.user))) {\n                v.request_user_id = this._requestUserID;\n            }\n        ;\n        ;\n            p.log(\"send\", {\n                endpoint: this._endpoint,\n                data: v,\n                inflight_count: this._inFlight\n            });\n            var w = null;\n            if (i.worker_context) {\n                w = new h(\"POST\", this._endpoint, v);\n                w.onError = function(x) {\n                    x.getPayload = function() {\n                        return x.errorText;\n                    };\n                    x.getRequest = function() {\n                        var y = x;\n                        x.getData = function() {\n                            return v;\n                        };\n                        return y;\n                    };\n                    x.getError = function() {\n                        return x.errorText;\n                    };\n                    x.getErrorDescription = function() {\n                        return x.errorText;\n                    };\n                    x.isTransient = function() {\n                        return false;\n                    };\n                    this._handleError(x);\n                }.bind(this);\n                w.onJSON = function(x) {\n                    x.getPayload = function() {\n                        return x.json;\n                    };\n                    x.getRequest = function() {\n                        return w;\n                    };\n                    this._handleResponse(x);\n                }.bind(this);\n                w.getData = function() {\n                    return v;\n                };\n                w.send();\n            }\n             else {\n                w = new g(this._endpoint).setData(v).setOption(\"retries\", this._connectionRetries).setHandler(this._handleResponse.bind(this)).setErrorHandler(this._handleError.bind(this)).setTransportErrorHandler(this._handleTransportError.bind(this)).setServerDialogCancelHandler(this._handleServerDialogCancel.bind(this)).setAllowCrossPageTransition(true);\n                if (((this._timeout && this._timeoutHandler))) {\n                    w.setTimeoutHandler(this._timeout, this._handleTimeout.bind(this));\n                }\n            ;\n            ;\n                w.send();\n            }\n        ;\n        ;\n        },\n        _batchData: function(v, w) {\n            if (((((((this._mode == r.BATCH_SUCCESSIVE_UNIQUE)) && ((typeof this._pendingRequestData != \"undefined\")))) && l(v, this._pendingRequestData)))) {\n                return;\n            }\n             else {\n                var x = ((this._batches.length - 1));\n                if (((((x >= 0)) && !this._hasReachedBatchLimit(this._batches[x])))) {\n                    ((w ? this._batches[x].combineWithOlder(v, this._combineData) : this._batches[x].combineWith(v, this._combineData)));\n                }\n                 else {\n                    this._batches.push(new t(v));\n                    p.bump(((\"batches_count_\" + u(this._batches.length))));\n                }\n            ;\n            ;\n                p.debug(\"batch\", {\n                    endpoint: this._endpoint,\n                    batches: this._batches,\n                    batch_limit: this._batchSizeLimit\n                });\n            }\n        ;\n        ;\n        },\n        _hasReachedBatchLimit: function(v) {\n            return ((this._batchSizeLimit && ((v.getSize() >= this._batchSizeLimit))));\n        },\n        _batchSend: function() {\n            if (this._batches[0]) {\n                this._send(this._batches[0].getData());\n                this._batches.shift();\n            }\n        ;\n        ;\n        },\n        _handleResponse: function(v) {\n            this._inFlight--;\n            p.log(\"response\", {\n                endpoint: this._endpoint,\n                inflight_count: this._inFlight\n            });\n            var w = v.getPayload();\n            q = ((w && w.kill_chat));\n            if (q) {\n                p.log(\"killswitch_enabled\", {\n                    endpoint: this._endpoint,\n                    inflight_count: this._inFlight\n                });\n            }\n        ;\n        ;\n            if (((w && w.error_payload))) {\n                if (this._errorHandler) {\n                    this._errorHandler(v);\n                }\n            ;\n            ;\n            }\n             else ((this._handler && this._handler(w, v.getRequest())));\n        ;\n        ;\n            if (((((((((this._mode == r.BATCH_SUCCESSIVE)) || ((this._mode == r.BATCH_SUCCESSIVE_UNIQUE)))) || ((this._mode == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)))) || ((this._mode == r.BATCH_CONDITIONAL))))) {\n                this._batchSend();\n            }\n        ;\n        ;\n            delete this._pendingRequestData;\n        },\n        _postErrorHandler: function() {\n            p.error(\"error\", {\n                endpoint: this._endpoint,\n                inflight_count: ((this._inFlight - 1))\n            });\n            this._inFlight--;\n            var v = this._mode;\n            if (((((((v == r.BATCH_SUCCESSIVE)) || ((v == r.BATCH_SUCCESSIVE_UNIQUE)))) || ((v == r.BATCH_CONDITIONAL))))) {\n                this._batchSend();\n            }\n             else if (((v == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR))) {\n                if (this._batches[0]) {\n                    this._batchData(this._pendingRequestData, true);\n                    this._batchSend();\n                }\n                 else this._batchData(this._pendingRequestData, true);\n            ;\n            }\n            \n        ;\n        ;\n            delete this._pendingRequestData;\n        },\n        _handleError: function(v) {\n            ((this._errorHandler && this._errorHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleTransportError: function(v) {\n            ((this._transportErrorHandler && this._transportErrorHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleTimeout: function(v) {\n            ((this._timeoutHandler && this._timeoutHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleServerDialogCancel: function(v) {\n            ((this._serverDialogCancelHandler && this._serverDialogCancelHandler(v)));\n            this._postErrorHandler();\n        }\n    });\n    function t(v) {\n        this._data = v;\n        this._size = 1;\n    };\n;\n    m(t.prototype, {\n        getData: function() {\n            return this._data;\n        },\n        getSize: function() {\n            return this._size;\n        },\n        combineWith: function(v, w) {\n            this._data = w(this._data, v);\n            this._size++;\n        },\n        combineWithOlder: function(v, w) {\n            this._data = w(v, this._data);\n            this._size++;\n        }\n    });\n    function u(v) {\n        if (((v === 1))) {\n            return \"equals1\";\n        }\n         else if (((((v >= 2)) && ((v <= 3))))) {\n            return \"between2and3\";\n        }\n         else return \"over4\"\n        \n    ;\n    };\n;\n    e.exports = r;\n});\n__d(\"UFIFeedbackTargets\", [\"ClientIDs\",\"KeyedCallbackManager\",\"UFICentralUpdates\",\"UFIConstants\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"KeyedCallbackManager\"), i = b(\"UFICentralUpdates\"), j = b(\"UFIConstants\"), k = b(\"copyProperties\"), l = new h();\n    function m(v) {\n        var w = {\n        };\n        v.forEach(function(x) {\n            var y = k({\n            }, x);\n            delete y.commentlist;\n            delete y.commentcount;\n            w[x.entidentifier] = y;\n            i.didUpdateFeedback(x.entidentifier);\n        });\n        l.addResourcesAndExecute(w);\n    };\n;\n    function n(v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            switch (x.actiontype) {\n              case j.UFIActionType.LIKE_ACTION:\n                p(x);\n                break;\n              case j.UFIActionType.SUBSCRIBE_ACTION:\n                q(x);\n                break;\n              case j.UFIActionType.GIFT_SUGGESTION:\n                r(x);\n                break;\n            };\n        ;\n        };\n    ;\n    };\n;\n    function o(v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            if (x.orig_ftentidentifier) {\n                t(x.orig_ftentidentifier, x.ftentidentifier);\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function p(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewerliked = !!v.hasviewerliked;\n            if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewerliked != w.hasviewerliked))))) {\n                return;\n            }\n        ;\n        ;\n            w.likecount = ((v.likecount || 0));\n            w.likesentences = v.likesentences;\n            if (((v.actorid == w.actorforpost))) {\n                w.hasviewerliked = v.hasviewerliked;\n            }\n             else if (((v.hasviewerliked != w.hasviewerliked))) {\n                w.likesentences = {\n                    current: v.likesentences.alternate,\n                    alternate: v.likesentences.current\n                };\n                if (w.hasviewerliked) {\n                    w.likecount++;\n                }\n                 else w.likecount--;\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (((v.actorid != w.actorforpost))) {\n                w.likesentences.isunseen = true;\n            }\n        ;\n        ;\n            m([w,]);\n        }\n    ;\n    ;\n    };\n;\n    function q(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewersubscribed = !!v.hasviewersubscribed;\n            if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewersubscribed != w.hasviewersubscribed))))) {\n                return;\n            }\n        ;\n        ;\n            if (((v.actorid == w.actorforpost))) {\n                w.hasviewersubscribed = v.hasviewersubscribed;\n            }\n        ;\n        ;\n            m([w,]);\n        }\n    ;\n    ;\n    };\n;\n    function r(v) {\n        var w = s(v);\n        if (!w) {\n            return;\n        }\n    ;\n    ;\n        if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewerliked != w.hasviewerliked))))) {\n            return;\n        }\n    ;\n    ;\n        w.giftdata = v.giftdata;\n        m([w,]);\n    };\n;\n    function s(v) {\n        if (v.orig_entidentifier) {\n            t(v.orig_entidentifier, v.entidentifier);\n        }\n    ;\n    ;\n        return l.getResource(v.entidentifier);\n    };\n;\n    function t(v, w) {\n        var x = l.getResource(v);\n        if (x) {\n            l.setResource(v, null);\n            x.entidentifier = w;\n            l.setResource(w, x);\n            i.didUpdateFeedbackID(v, w);\n        }\n    ;\n    ;\n    };\n;\n    var u = {\n        getFeedbackTarget: function(v, w) {\n            var x = l.executeOrEnqueue(v, w), y = l.getUnavailableResources(x);\n            if (!y.length) {\n                return;\n            }\n        ;\n        ;\n        }\n    };\n    i.subscribe(\"update-feedback\", function(v, w) {\n        var x = w.feedbacktargets;\n        if (((x && x.length))) {\n            m(x);\n        }\n    ;\n    ;\n    });\n    i.subscribe(\"update-actions\", function(v, w) {\n        if (((w.actions && w.actions.length))) {\n            n(w.actions);\n        }\n    ;\n    ;\n    });\n    i.subscribe(\"update-comments\", function(v, w) {\n        if (((w.comments && w.comments.length))) {\n            o(w.comments);\n        }\n    ;\n    ;\n    });\n    e.exports = u;\n});\n__d(\"UFIInstanceState\", [\"UFICentralUpdates\",], function(a, b, c, d, e, f) {\n    var g = b(\"UFICentralUpdates\"), h = {\n    };\n    function i(k) {\n        if (!h[k]) {\n            h[k] = {\n            };\n        }\n    ;\n    ;\n    };\n;\n    var j = {\n        getKeyForInstance: function(k, l) {\n            i(k);\n            return h[k][l];\n        },\n        updateState: function(k, l, m) {\n            i(k);\n            h[k][l] = m;\n            g.didUpdateInstanceState(k, l);\n        },\n        updateStateField: function(k, l, m, n) {\n            var o = ((this.getKeyForInstance(k, l) || {\n            }));\n            o[m] = n;\n            this.updateState(k, l, o);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UFIComments\", [\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"UFICentralUpdates\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"URI\",\"keyMirror\",\"merge\",\"randomInt\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"ImmutableObject\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = b(\"UFICentralUpdates\"), m = b(\"UFIConstants\"), n = b(\"UFIFeedbackTargets\"), o = b(\"UFIInstanceState\"), p = b(\"URI\"), q = b(\"keyMirror\"), r = b(\"merge\"), s = b(\"randomInt\"), t = b(\"throwIf\"), u = q({\n        INVALID_COMMENT_TYPE: null\n    }), v = i.create(\"UFIComments\"), w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = \"unavailable_comment_key\";\n    function da(ab) {\n        return ((((ab in ba)) ? ba[ab] : ab));\n    };\n;\n    function ea(ab, bb) {\n        if (!x[ab]) {\n            x[ab] = {\n            };\n        }\n    ;\n    ;\n        if (!x[ab][bb]) {\n            x[ab][bb] = new j();\n        }\n    ;\n    ;\n        return x[ab][bb];\n    };\n;\n    function fa(ab) {\n        var bb = [];\n        if (x[ab]) {\n            {\n                var fin89keys = ((window.top.JSBNG_Replay.forInKeys)((x[ab]))), fin89i = (0);\n                var cb;\n                for (; (fin89i < fin89keys.length); (fin89i++)) {\n                    ((cb) = (fin89keys[fin89i]));\n                    {\n                        bb.push(x[ab][cb]);\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        return bb;\n    };\n;\n    function ga(ab) {\n        if (!y[ab]) {\n            y[ab] = new j();\n        }\n    ;\n    ;\n        return y[ab];\n    };\n;\n    function ha(ab) {\n        var bb = fa(ab);\n        bb.forEach(function(cb) {\n            cb.reset();\n        });\n    };\n;\n    function ia(ab, bb) {\n        ab.forEach(function(cb) {\n            var db = cb.ftentidentifier, eb = ((cb.parentcommentid || db));\n            n.getFeedbackTarget(db, function(fb) {\n                var gb = m.UFIPayloadSourceType, hb = cb.clientid, ib = false, jb = r({\n                }, cb);\n                if (hb) {\n                    delete jb.clientid;\n                    ib = g.isExistingClientID(hb);\n                    if (((ib && ba[hb]))) {\n                        return;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (((((((bb === gb.LIVE_SEND)) && cb.parentcommentid)) && ((z[eb] === undefined))))) {\n                    return;\n                }\n            ;\n            ;\n                if (((((((((bb === gb.LIVE_SEND)) || ((bb === gb.USER_ACTION)))) || ((bb === gb.ENDPOINT_ADD_COMMENT)))) || ((bb === gb.ENDPOINT_EDIT_COMMENT))))) {\n                    jb.isunseen = true;\n                }\n            ;\n            ;\n                if (((((bb === gb.ENDPOINT_COMMENT_FETCH)) || ((bb === gb.ENDPOINT_ID_COMMENT_FETCH))))) {\n                    jb.fromfetch = true;\n                }\n            ;\n            ;\n                if (ib) {\n                    if (w[hb].ufiinstanceid) {\n                        o.updateStateField(w[hb].ufiinstanceid, \"locallycomposed\", cb.id, true);\n                    }\n                ;\n                ;\n                    jb.ufiinstanceid = w[hb].ufiinstanceid;\n                    ba[hb] = cb.id;\n                    w[cb.id] = w[hb];\n                    delete w[hb];\n                    l.didUpdateComment(hb);\n                }\n            ;\n            ;\n                var kb, lb;\n                if (cb.parentcommentid) {\n                    lb = [ga(eb),];\n                }\n                 else lb = fa(eb);\n            ;\n            ;\n                var mb = false;\n                lb.forEach(function(qb) {\n                    var rb = qb.getAllResources(), sb = {\n                    };\n                    {\n                        var fin90keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin90i = (0);\n                        var tb;\n                        for (; (fin90i < fin90keys.length); (fin90i++)) {\n                            ((tb) = (fin90keys[fin90i]));\n                            {\n                                var ub = rb[tb];\n                                sb[ub] = tb;\n                            };\n                        };\n                    };\n                ;\n                    if (ib) {\n                        if (((hb in sb))) {\n                            sb[cb.id] = sb[hb];\n                            var vb = sb[hb];\n                            qb.setResource(vb, cb.id);\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    if (sb[cb.id]) {\n                        mb = true;\n                    }\n                     else {\n                        var wb = ((z[eb] || 0));\n                        sb[cb.id] = wb;\n                        qb.setResource(wb, cb.id);\n                    }\n                ;\n                ;\n                    kb = sb[cb.id];\n                });\n                if (!mb) {\n                    var nb = ((z[eb] || 0));\n                    z[eb] = ((nb + 1));\n                    qa(eb);\n                }\n            ;\n            ;\n                if (((cb.JSBNG__status === m.UFIStatus.FAILED_ADD))) {\n                    aa[eb] = ((aa[eb] + 1));\n                }\n            ;\n            ;\n                var ob = z[eb];\n                jb.replycount = ((((z[cb.id] || 0)) - ((aa[cb.id] || 0))));\n                var pb = ja(kb, ob);\n                if (((cb.parentcommentid && w[cb.parentcommentid]))) {\n                    jb.permalink = p(fb.permalink).addQueryData({\n                        comment_id: w[cb.parentcommentid].legacyid,\n                        reply_comment_id: cb.legacyid,\n                        total_comments: ob\n                    }).toString();\n                }\n                 else jb.permalink = p(fb.permalink).addQueryData({\n                    comment_id: cb.legacyid,\n                    offset: pb,\n                    total_comments: ob\n                }).toString();\n            ;\n            ;\n                za.setComment(cb.id, new h(jb));\n                l.didUpdateComment(cb.id);\n                l.didUpdateFeedback(db);\n            });\n        });\n    };\n;\n    function ja(ab, bb) {\n        return ((Math.floor(((((((bb - ab)) - 1)) / m.defaultPageSize))) * m.defaultPageSize));\n    };\n;\n    function ka(ab) {\n        for (var bb = 0; ((bb < ab.length)); bb++) {\n            var cb = ab[bb];\n            switch (cb.actiontype) {\n              case m.UFIActionType.COMMENT_LIKE:\n                na(cb);\n                break;\n              case m.UFIActionType.DELETE_COMMENT:\n                ra(cb);\n                break;\n              case m.UFIActionType.LIVE_DELETE_COMMENT:\n                sa(cb);\n                break;\n              case m.UFIActionType.UNDO_DELETE_COMMENT:\n                ta(cb);\n                break;\n              case m.UFIActionType.REMOVE_PREVIEW:\n                ua(cb);\n                break;\n              case m.UFIActionType.COMMENT_SET_SPAM:\n                va(cb);\n                break;\n              case m.UFIActionType.CONFIRM_COMMENT_REMOVAL:\n                wa(cb);\n                break;\n              case m.UFIActionType.TRANSLATE_COMMENT:\n                oa(cb);\n                break;\n            };\n        ;\n        };\n    ;\n    };\n;\n    function la(ab, bb, cb) {\n        var db = bb.range, eb = bb.values;\n        if (!db) {\n            v.error(\"nullrange\", {\n                target: ab,\n                commentList: bb\n            });\n            return;\n        }\n    ;\n    ;\n        var fb = {\n        };\n        for (var gb = 0; ((gb < db.length)); gb++) {\n            fb[((db.offset + gb))] = ((eb[gb] || ca));\n        ;\n        };\n    ;\n        var hb, ib;\n        if (cb) {\n            hb = ea(ab, cb);\n            ib = ab;\n        }\n         else {\n            hb = ga(ab);\n            ib = bb.ftentidentifier;\n            if (((bb.count !== undefined))) {\n                z[ab] = bb.count;\n                aa[ab] = 0;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        hb.addResourcesAndExecute(fb);\n        l.didUpdateFeedback(ib);\n    };\n;\n    function ma(ab) {\n        ab.forEach(function(bb) {\n            z[bb.entidentifier] = bb.commentcount;\n            aa[bb.entidentifier] = 0;\n            l.didUpdateFeedback(bb.entidentifier);\n        });\n    };\n;\n    function na(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (bb) {\n            var cb = {\n            }, db = ((ab.clientid && g.isExistingClientID(ab.clientid)));\n            if (!db) {\n                cb.hasviewerliked = ab.viewerliked;\n                cb.likecount = ab.likecount;\n            }\n        ;\n        ;\n            cb.likeconfirmhash = s(0, 1024);\n            ya(ab.commentid, cb);\n        }\n    ;\n    ;\n    };\n;\n    function oa(ab) {\n        var bb = ab.commentid, cb = za.getComment(ab.commentid);\n        if (cb) {\n            ya(bb, {\n                translatedtext: ab.translatedtext\n            });\n        }\n    ;\n    ;\n    };\n;\n    function pa(ab) {\n        var bb = {\n            reportLink: ab.reportLink,\n            commenterIsFOF: ab.commenterIsFOF,\n            userIsMinor: ab.userIsMinor\n        };\n        if (ab.undoData) {\n            bb.undoData = ab.undoData;\n        }\n    ;\n    ;\n        return bb;\n    };\n;\n    function qa(ab, bb) {\n        if (ab) {\n            if (((bb !== undefined))) {\n                var cb = ((((aa[ab] || 0)) + ((bb ? 1 : -1))));\n                aa[ab] = Math.max(cb, 0);\n            }\n        ;\n        ;\n            var db = za.getComment(ab);\n            if (db) {\n                var eb = {\n                    replycount: za.getDisplayedCommentCount(ab)\n                };\n                ya(ab, eb);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ra(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb.JSBNG__status !== m.UFIStatus.DELETED))) {\n            var cb = ((bb.parentcommentid || bb.ftentidentifier));\n            if (((bb.JSBNG__status === m.UFIStatus.FAILED_ADD))) {\n                qa(cb);\n            }\n             else qa(cb, true);\n        ;\n        ;\n        }\n    ;\n    ;\n        xa(bb, m.UFIStatus.DELETED);\n    };\n;\n    function sa(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb && ((bb.JSBNG__status !== m.UFIStatus.DELETED))))) {\n            xa(bb, m.UFIStatus.LIVE_DELETED);\n        }\n    ;\n    ;\n    };\n;\n    function ta(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb.JSBNG__status === m.UFIStatus.DELETED))) {\n            var cb = ((bb.parentcommentid || bb.ftentidentifier));\n            qa(cb, false);\n        }\n    ;\n    ;\n        xa(bb, m.UFIStatus.PENDING_UNDO_DELETE);\n    };\n;\n    function ua(ab) {\n        ya(ab.commentid, {\n            attachment: null\n        });\n    };\n;\n    function va(ab) {\n        var bb = za.getComment(ab.commentid), cb = ((ab.shouldHideAsSpam ? m.UFIStatus.SPAM_DISPLAY : null));\n        xa(bb, cb);\n    };\n;\n    function wa(ab) {\n        ya(ab.commentid, pa(ab));\n    };\n;\n    function xa(ab, bb) {\n        ya(ab.id, {\n            priorstatus: ab.JSBNG__status,\n            JSBNG__status: bb\n        });\n    };\n;\n    function ya(ab, bb) {\n        var cb = ((za.getComment(ab) || new h({\n        })));\n        za.setComment(ab, h.set(cb, bb));\n        l.didUpdateComment(cb.id);\n        l.didUpdateFeedback(cb.ftentidentifier);\n    };\n;\n    var za = {\n        getComments: function(ab) {\n            var bb = {\n            };\n            for (var cb = 0; ((cb < ab.length)); cb++) {\n                bb[ab[cb]] = za.getComment(ab[cb]);\n            ;\n            };\n        ;\n            return bb;\n        },\n        getComment: function(ab) {\n            return w[da(ab)];\n        },\n        setComment: function(ab, bb) {\n            w[da(ab)] = bb;\n        },\n        resetFeedbackTarget: function(ab) {\n            var bb = fa(ab), cb = {\n            };\n            bb.forEach(function(eb) {\n                var fb = eb.getAllResources();\n                {\n                    var fin91keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin91i = (0);\n                    var gb;\n                    for (; (fin91i < fin91keys.length); (fin91i++)) {\n                        ((gb) = (fin91keys[fin91i]));\n                        {\n                            var hb = fb[gb];\n                            cb[hb] = 1;\n                        };\n                    };\n                };\n            ;\n            });\n            {\n                var fin92keys = ((window.top.JSBNG_Replay.forInKeys)((cb))), fin92i = (0);\n                var db;\n                for (; (fin92i < fin92keys.length); (fin92i++)) {\n                    ((db) = (fin92keys[fin92i]));\n                    {\n                        delete w[da(db)];\n                    ;\n                    };\n                };\n            };\n        ;\n            ha(ab);\n        },\n        getCommentsInRange: function(ab, bb, cb, db, eb) {\n            var fb = ea(ab, cb);\n            n.getFeedbackTarget(ab, function(gb) {\n                var hb = [];\n                for (var ib = 0; ((ib < bb.length)); ib++) {\n                    hb.push(((bb.offset + ib)));\n                ;\n                };\n            ;\n                var jb = function(pb) {\n                    var qb = [], rb = bb.offset, sb = ((((bb.offset + bb.length)) - 1));\n                    for (var tb = 0; ((tb < bb.length)); tb++) {\n                        var ub = ((gb.isranked ? ((sb - tb)) : ((rb + tb))));\n                        if (((pb[ub] != ca))) {\n                            var vb = this.getComment(pb[ub]);\n                            if (vb) {\n                                qb.push(vb);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    eb(qb);\n                }, kb = fb.getUnavailableResourcesFromRequest(hb);\n                if (kb.length) {\n                    var lb = Math.min.apply(Math, kb), mb = Math.max.apply(Math, kb), nb = lb, ob = ((((mb - lb)) + 1));\n                    k.trySend(\"/ajax/ufi/comment_fetch.php\", {\n                        ft_ent_identifier: gb.entidentifier,\n                        viewas: db,\n                        source: null,\n                        offset: nb,\n                        length: ob,\n                        orderingmode: cb\n                    });\n                }\n                 else fb.deferredExecuteOrEnqueue(hb).addCallback(jb, this);\n            ;\n            ;\n            }.bind(this));\n        },\n        getRepliesInRanges: function(ab, bb, cb) {\n            var db = {\n            }, eb = {\n            }, fb = {\n            }, gb = false;\n            n.getFeedbackTarget(ab, function(hb) {\n                {\n                    var fin93keys = ((window.top.JSBNG_Replay.forInKeys)((bb))), fin93i = (0);\n                    var ib;\n                    for (; (fin93i < fin93keys.length); (fin93i++)) {\n                        ((ib) = (fin93keys[fin93i]));\n                        {\n                            var jb = ga(ib), kb = bb[ib], lb = [];\n                            for (var mb = 0; ((mb < kb.length)); mb++) {\n                                lb.push(((kb.offset + mb)));\n                            ;\n                            };\n                        ;\n                            db[ib] = jb.executeOrEnqueue(lb, function(wb) {\n                                var xb = [];\n                                for (var yb = 0; ((yb < kb.length)); yb++) {\n                                    var zb = ((kb.offset + yb));\n                                    if (((wb[zb] != ca))) {\n                                        var ac = this.getComment(wb[zb]);\n                                        if (ac) {\n                                            xb.push(ac);\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                };\n                            ;\n                                eb[ib] = xb;\n                            }.bind(this));\n                            fb[ib] = jb.getUnavailableResources(db[ib]);\n                            if (fb[ib].length) {\n                                gb = true;\n                                jb.unsubscribe(db[ib]);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (!gb) {\n                    cb(eb);\n                }\n                 else {\n                    var nb = [], ob = [], pb = [];\n                    {\n                        var fin94keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin94i = (0);\n                        var qb;\n                        for (; (fin94i < fin94keys.length); (fin94i++)) {\n                            ((qb) = (fin94keys[fin94i]));\n                            {\n                                var rb = fb[qb];\n                                if (rb.length) {\n                                    var sb = Math.min.apply(Math, rb), tb = Math.max.apply(Math, rb), ub = sb, vb = ((((tb - sb)) + 1));\n                                    nb.push(qb);\n                                    ob.push(ub);\n                                    pb.push(vb);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    k.trySend(\"/ajax/ufi/reply_fetch.php\", {\n                        ft_ent_identifier: hb.entidentifier,\n                        parent_comment_ids: nb,\n                        source: null,\n                        offsets: ob,\n                        lengths: pb\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return db;\n        },\n        getCommentCount: function(ab) {\n            return ((z[ab] || 0));\n        },\n        getDeletedCount: function(ab) {\n            return ((aa[ab] || 0));\n        },\n        getDisplayedCommentCount: function(ab) {\n            return ((((z[ab] || 0)) - ((aa[ab] || 0))));\n        },\n        _dump: function() {\n            var ab = {\n                _comments: w,\n                _commentLists: x,\n                _replyLists: y,\n                _commentCounts: z,\n                _deletedCounts: aa,\n                _localIDMap: ba\n            };\n            return JSON.stringify(ab);\n        }\n    };\n    k.registerEndpoints({\n        \"/ajax/ufi/comment_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/reply_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        }\n    });\n    l.subscribe(\"update-comments\", function(ab, bb) {\n        if (((bb.comments && bb.comments.length))) {\n            ia(bb.comments, bb.payloadsource);\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-actions\", function(ab, bb) {\n        if (((bb.actions && bb.actions.length))) {\n            ka(bb.actions);\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-comment-lists\", function(ab, bb) {\n        var cb = bb.commentlists;\n        if (((cb && Object.keys(cb).length))) {\n            if (cb.comments) {\n                {\n                    var fin95keys = ((window.top.JSBNG_Replay.forInKeys)((cb.comments))), fin95i = (0);\n                    var db;\n                    for (; (fin95i < fin95keys.length); (fin95i++)) {\n                        ((db) = (fin95keys[fin95i]));\n                        {\n                            {\n                                var fin96keys = ((window.top.JSBNG_Replay.forInKeys)((cb.comments[db]))), fin96i = (0);\n                                var eb;\n                                for (; (fin96i < fin96keys.length); (fin96i++)) {\n                                    ((eb) = (fin96keys[fin96i]));\n                                    {\n                                        la(db, cb.comments[db][eb], eb);\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            if (cb.replies) {\n                {\n                    var fin97keys = ((window.top.JSBNG_Replay.forInKeys)((cb.replies))), fin97i = (0);\n                    var fb;\n                    for (; (fin97i < fin97keys.length); (fin97i++)) {\n                        ((fb) = (fin97keys[fin97i]));\n                        {\n                            la(fb, cb.replies[fb]);\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-feedback\", function(ab, bb) {\n        var cb = bb.feedbacktargets;\n        if (((cb && cb.length))) {\n            ma(cb);\n        }\n    ;\n    ;\n    });\n    e.exports = za;\n});\n__d(\"UFILikeLink.react\", [\"React\",\"TrackingNodes\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"tx\"), j = g.createClass({\n        displayName: \"UFILikeLink\",\n        render: function() {\n            var k = ((this.props.likeAction ? \"Like\" : \"Unlike\")), l = h.getTrackingInfo(((this.props.likeAction ? h.types.LIKE_LINK : h.types.UNLIKE_LINK))), m = ((this.props.likeAction ? \"Like this\" : \"Unlike this\"));\n            return (g.DOM.a({\n                className: \"UFILikeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: m,\n                onClick: this.props.onClick,\n                \"data-ft\": l\n            }, k));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFISubscribeLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFISubscribeLink\",\n        render: function() {\n            var j = ((this.props.subscribeAction ? \"Follow Post\" : \"Unfollow Post\")), k = ((this.props.subscribeAction ? \"Get notified when someone comments\" : \"Stop getting notified when someone comments\"));\n            return (g.DOM.a({\n                className: \"UFISubscribeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: k,\n                onClick: this.props.onClick\n            }, j));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ProfileBrowserLink\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = \"/ajax/browser/dialog/\", i = \"/browse/\", j = function(l, m, n) {\n        return new g(((l + m))).setQueryData(n);\n    }, k = {\n        constructPageURI: function(l, m) {\n            return j(i, l, m);\n        },\n        constructDialogURI: function(l, m) {\n            return j(h, l, m);\n        }\n    };\n    e.exports = k;\n});\n__d(\"ProfileBrowserTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LIKES: \"likes\",\n        GROUP_MESSAGE_VIEWERS: \"group_message_viewers\",\n        MUTUAL_FRIENDS: \"mutual_friends\"\n    };\n    e.exports = g;\n});\n__d(\"UFITimelineBlingBox.react\", [\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIBlingItem.react\",\"URI\",\"cx\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"ProfileBrowserLink\"), h = b(\"ProfileBrowserTypes\"), i = b(\"React\"), j = b(\"UFIBlingItem.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"fbt\"), n = i.createClass({\n        displayName: \"UFITimelineBlingBox\",\n        render: function() {\n            var o = [];\n            if (((this.props.likes && this.props.enableShowLikes))) {\n                var p = this._getProfileBrowserURI(), q = \"See who likes this\", r = i.DOM.a({\n                    ajaxify: p.dialog,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-gt\": this.props[\"data-gt\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    \"data-tooltip-uri\": this._getLikeToolTipURI(),\n                    href: p.page,\n                    rel: \"dialog\",\n                    role: \"button\",\n                    title: q\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.likes,\n                    iconClassName: \"UFIBlingBoxTimelineLikeIcon\"\n                }));\n                o.push(r);\n            }\n        ;\n        ;\n            if (((this.props.comments && this.props.enableShowComments))) {\n                var s = \"Show comments\", t = i.DOM.a({\n                    \"aria-label\": s,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: \"#\",\n                    onClick: this.props.commentOnClick\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.comments,\n                    iconClassName: \"UFIBlingBoxTimelineCommentIcon\"\n                }));\n                o.push(t);\n            }\n        ;\n        ;\n            if (this.props.reshares) {\n                var u = \"Show shares\", v = this._getShareViewURI(), w = i.DOM.a({\n                    ajaxify: v.dialog,\n                    \"aria-label\": u,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: v.page,\n                    rel: \"async\"\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.reshares,\n                    iconClassName: \"UFIBlingBoxTimelineReshareIcon\"\n                }));\n                o.push(w);\n            }\n        ;\n        ;\n            return (i.DOM.span(null, o));\n        },\n        _getItemClassName: function(o) {\n            return ((((((o.length > 0)) ? \"mls\" : \"\")) + ((\" \" + \"UFIBlingBoxTimelineItem\"))));\n        },\n        _getLikeToolTipURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/timeline/likestooltip.php\").setQueryData({\n                    obj_fbid: this.props.feedbackFBID\n                });\n                return o.toString();\n            }\n             else return null\n        ;\n        },\n        _getProfileBrowserURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = h.LIKES, p = {\n                    id: this.props.feedbackFBID\n                }, q = g.constructDialogURI(o, p), r = g.constructPageURI(o, p), s = {\n                    dialog: q.toString(),\n                    page: r.toString()\n                };\n                return s;\n            }\n        ;\n        ;\n        },\n        _getShareViewURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/shares/view\").setQueryData({\n                    target_fbid: this.props.feedbackFBID\n                }), p = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: this.props.feedbackFBID\n                }), q = {\n                    dialog: o.toString(),\n                    page: p.toString()\n                };\n                return q;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"UFIUserActions\", [\"AsyncResponse\",\"CLoggerX\",\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"Nectar\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"MercuryServerDispatcher\",\"collectDataAttributes\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncResponse\"), h = b(\"CLoggerX\"), i = b(\"ClientIDs\"), j = b(\"ImmutableObject\"), k = b(\"JSLogger\"), l = b(\"Nectar\"), m = b(\"UFICentralUpdates\"), n = b(\"UFIComments\"), o = b(\"UFIConstants\"), p = b(\"UFIFeedbackTargets\"), q = b(\"MercuryServerDispatcher\"), r = b(\"collectDataAttributes\"), s = b(\"copyProperties\"), t = b(\"tx\"), u = k.create(\"UFIUserActions\"), v = {\n        BAN: \"ban\",\n        UNDO_BAN: \"undo_ban\"\n    }, w = {\n        changeCommentLike: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (((na.hasviewerliked != la))) {\n                var oa = x(ma.target), pa = ((la ? 1 : -1)), qa = {\n                    commentid: ka,\n                    actiontype: o.UFIActionType.COMMENT_LIKE,\n                    viewerliked: la,\n                    likecount: ((na.likecount + pa))\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [qa,]\n                });\n                q.trySend(\"/ajax/ufi/comment_like.php\", s({\n                    comment_id: ka,\n                    legacy_id: na.legacyid,\n                    like_action: la,\n                    ft_ent_identifier: na.ftentidentifier,\n                    source: ma.source,\n                    client_id: i.getNewClientID()\n                }, oa));\n            }\n        ;\n        ;\n        },\n        addComment: function(ka, la, ma, na) {\n            p.getFeedbackTarget(ka, function(oa) {\n                var pa = x(na.target), qa = i.getNewClientID();\n                if (!oa.actorforpost) {\n                    return;\n                }\n            ;\n            ;\n                var ra = {\n                    ftentidentifier: ka,\n                    body: {\n                        text: la\n                    },\n                    author: oa.actorforpost,\n                    id: qa,\n                    islocal: true,\n                    ufiinstanceid: na.ufiinstanceid,\n                    likecount: 0,\n                    hasviewerliked: false,\n                    parentcommentid: na.replyid,\n                    photo_comment: na.attachedphoto,\n                    timestamp: {\n                        time: JSBNG__Date.now(),\n                        text: \"a few seconds ago\"\n                    }\n                }, sa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: oa.actorforpost,\n                    hasviewersubscribed: true,\n                    entidentifier: ka\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    comments: [ra,],\n                    actions: [sa,]\n                });\n                var ta = null;\n                if (na.replyid) {\n                    ta = (n.getComment(na.replyid)).fbid;\n                }\n            ;\n            ;\n                var ua = h.getCLParamsForTarget(na.target, ta);\n                q.trySend(\"/ajax/ufi/add_comment.php\", s({\n                    ft_ent_identifier: oa.entidentifier,\n                    comment_text: ma,\n                    source: na.source,\n                    client_id: qa,\n                    reply_fbid: ta,\n                    parent_comment_id: na.replyid,\n                    timeline_log_data: na.timelinelogdata,\n                    rootid: na.rootid,\n                    clp: ua,\n                    attached_photo_fbid: ((na.attachedphoto ? na.attachedphoto.fbid : 0)),\n                    giftoccasion: na.giftoccasion\n                }, pa));\n            });\n        },\n        editComment: function(ka, la, ma, na) {\n            var oa = x(na.target), pa = n.getComment(ka);\n            pa = j.set(pa, {\n                JSBNG__status: o.UFIStatus.PENDING_EDIT,\n                body: {\n                    text: la\n                },\n                timestamp: {\n                    time: JSBNG__Date.now(),\n                    text: \"a few seconds ago\"\n                },\n                originalTimestamp: pa.timestamp.time,\n                editnux: null,\n                attachment: null\n            });\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                comments: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/edit_comment.php\", s({\n                ft_ent_identifier: pa.ftentidentifier,\n                comment_text: ma,\n                source: na.source,\n                comment_id: pa.id,\n                parent_comment_id: pa.parentcommentid,\n                attached_photo_fbid: ((na.attachedPhoto ? na.attachedPhoto.fbid : 0))\n            }, oa));\n        },\n        translateComment: function(ka, la) {\n            q.trySend(\"/ajax/ufi/translate_comment.php\", {\n                ft_ent_identifier: ka.ftentidentifier,\n                comment_ids: [ka.id,],\n                source: la.source\n            });\n        },\n        setHideAsSpam: function(ka, la, ma) {\n            var na = x(ma.target), oa = n.getComment(ka), pa = {\n                commentid: ka,\n                actiontype: o.UFIActionType.COMMENT_SET_SPAM,\n                shouldHideAsSpam: la\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/comment_spam.php\", s({\n                comment_id: ka,\n                spam_action: la,\n                ft_ent_identifier: oa.ftentidentifier,\n                source: ma.source\n            }, na));\n        },\n        removeComment: function(ka, la) {\n            var ma = x(la.target), na = n.getComment(ka), oa = {\n                actiontype: o.UFIActionType.DELETE_COMMENT,\n                commentid: ka,\n                oneclick: la.oneclick\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [oa,]\n            });\n            q.trySend(\"/ajax/ufi/delete_comment.php\", s({\n                comment_id: na.id,\n                comment_legacyid: na.legacyid,\n                ft_ent_identifier: na.ftentidentifier,\n                one_click: la.oneclick,\n                source: la.source,\n                client_id: i.getNewClientID(),\n                timeline_log_data: la.timelinelogdata\n            }, ma));\n        },\n        undoRemoveComment: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (!na.undoData) {\n                u.error(\"noundodata\", {\n                    comment: ka\n                });\n                return;\n            }\n        ;\n        ;\n            var oa = x(ma.target), pa = {\n                actiontype: o.UFIActionType.UNDO_DELETE_COMMENT,\n                commentid: ka\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            var qa = na.undoData;\n            qa.page_admin = la;\n            var ra = s(oa, qa);\n            q.trySend(\"/ajax/ufi/undo_delete_comment.php\", ra);\n        },\n        banUser: function(ka, la, ma, na) {\n            var oa = ((ma ? v.BAN : v.UNDO_BAN));\n            q.trySend(\"/ajax/ufi/ban_user.php\", {\n                page_id: la,\n                commenter_id: ka.author,\n                action: oa,\n                comment_id: ka.id,\n                client_side: true\n            });\n        },\n        changeLike: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if (((na.hasviewerliked !== la))) {\n                    var pa = ((la ? 1 : -1)), qa = {\n                        actiontype: o.UFIActionType.LIKE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewerliked: la,\n                        likecount: ((na.likecount + pa)),\n                        entidentifier: ka,\n                        likesentences: {\n                            current: na.likesentences.alternate,\n                            alternate: na.likesentences.current\n                        }\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [qa,]\n                    });\n                    q.trySend(\"/ajax/ufi/like.php\", s({\n                        like_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        giftoccasion: ma.giftoccasion\n                    }, oa));\n                }\n            ;\n            ;\n            });\n        },\n        changeSubscribe: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if (((na.hasviewersubscribed !== la))) {\n                    var pa = {\n                        actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewersubscribed: la,\n                        entidentifier: ka\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [pa,]\n                    });\n                    q.trySend(\"/ajax/ufi/subscribe.php\", s({\n                        subscribe_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        comment_expand_mode: ma.commentexpandmode\n                    }, oa));\n                }\n            ;\n            ;\n            });\n        },\n        fetchSpamComments: function(ka, la, ma, na) {\n            q.trySend(\"/ajax/ufi/id_comment_fetch.php\", {\n                ft_ent_identifier: ka,\n                viewas: na,\n                comment_ids: la,\n                parent_comment_id: ma,\n                source: null\n            });\n        },\n        removePreview: function(ka, la) {\n            var ma = x(la.target), na = {\n                commentid: ka.id,\n                actiontype: o.UFIActionType.REMOVE_PREVIEW\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [na,]\n            });\n            q.trySend(\"/ajax/ufi/remove_preview.php\", s({\n                comment_id: ka.id,\n                ft_ent_identifier: ka.ftentidentifier,\n                source: la.source\n            }, ma));\n        }\n    };\n    function x(ka) {\n        if (!ka) {\n            return {\n                ft: {\n                }\n            };\n        }\n    ;\n    ;\n        var la = {\n            ft: r(ka, [\"ft\",]).ft\n        };\n        l.addModuleData(la, ka);\n        return la;\n    };\n;\n    function y(ka) {\n        var la = ka.request.data;\n        g.defaultErrorHandler(ka);\n        var ma = ((la.client_id || la.comment_id)), na = n.getComment(ma), oa = ((((na.JSBNG__status === o.UFIStatus.PENDING_EDIT)) ? o.UFIStatus.FAILED_EDIT : o.UFIStatus.FAILED_ADD));\n        na = j.setDeep(na, {\n            JSBNG__status: oa,\n            allowRetry: z(ka),\n            body: {\n                mentionstext: la.comment_text\n            }\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n;\n    function z(ka) {\n        var la = ka.getError();\n        if (((la === 1404102))) {\n            return false;\n        }\n    ;\n    ;\n        if (ka.silentError) {\n            return true;\n        }\n    ;\n    ;\n        if (((((la === 1357012)) || ((la === 1357006))))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function aa(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        na = j.set(na, {\n            JSBNG__status: ((na.priorstatus || null)),\n            priorstatus: undefined\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n;\n    function ba(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        if (((la.like_action === na.hasviewerliked))) {\n            var oa = ((na.hasviewerliked ? -1 : 1)), pa = {\n                commentid: ma,\n                actiontype: o.UFIActionType.COMMENT_LIKE,\n                viewerliked: !na.hasviewerliked,\n                likecount: ((na.likecount + oa))\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n        }\n    ;\n    ;\n        g.defaultErrorHandler(ka);\n    };\n;\n    function ca(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if (((na.hasviewerliked === la.like_action))) {\n                var oa = ((na.hasviewerliked ? -1 : 1)), pa = {\n                    actiontype: o.UFIActionType.LIKE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewerliked: !na.hasviewerliked,\n                    likecount: ((na.likecount + oa)),\n                    entidentifier: ma,\n                    likesentences: {\n                        current: na.likesentences.alternate,\n                        alternate: na.likesentences.current\n                    }\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [pa,]\n                });\n            }\n        ;\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n;\n    function da(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if (((na.hasviewersubscribed === la.subscribe_action))) {\n                var oa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewersubscribed: !na.hasviewersubscribed,\n                    entidentifier: ma\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [oa,]\n                });\n            }\n        ;\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n;\n    var ea = function(ka) {\n        return m.handleUpdate.bind(m, ka);\n    }, fa = o.UFIPayloadSourceType;\n    q.registerEndpoints({\n        \"/ajax/ufi/comment_like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_COMMENT_LIKE),\n            error_handler: ba,\n            batch_if: ga,\n            batch_function: ja\n        },\n        \"/ajax/ufi/comment_spam.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_COMMENT_SPAM),\n            error_handler: aa\n        },\n        \"/ajax/ufi/add_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ADD_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/undo_delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_UNDO_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/ban_user.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_BAN)\n        },\n        \"/ajax/ufi/edit_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_EDIT_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_LIKE),\n            error_handler: ca,\n            batch_if: ha,\n            batch_function: ja\n        },\n        \"/ajax/ufi/subscribe.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_SUBSCRIBE),\n            error_handler: da,\n            batch_if: ia,\n            batch_function: ja\n        },\n        \"/ajax/ufi/id_comment_fetch.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ID_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/remove_preview.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_REMOVE_PREVIEW)\n        },\n        \"/ajax/ufi/translate_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_TRANSLATE_COMMENT)\n        }\n    });\n    function ga(ka, la) {\n        return ((((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier)))) && ((ka.comment_id == la.comment_id))));\n    };\n;\n    function ha(ka, la) {\n        return ((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier))));\n    };\n;\n    function ia(ka, la) {\n        return ((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier))));\n    };\n;\n    function ja(ka, la) {\n        return la;\n    };\n;\n    e.exports = w;\n});\n__d(\"UFIActionLinkController\", [\"Arbiter\",\"ClickTTIIdentifiers\",\"CSS\",\"DOMQuery\",\"Parent\",\"React\",\"TrackingNodes\",\"UFIBlingBox.react\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFILikeLink.react\",\"UFISubscribeLink.react\",\"UFITimelineBlingBox.react\",\"UFIUserActions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickTTIIdentifiers\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"Parent\"), l = b(\"React\"), m = b(\"TrackingNodes\"), n = b(\"UFIBlingBox.react\"), o = b(\"UFICentralUpdates\"), p = b(\"UFIComments\"), q = b(\"UFIConstants\"), r = b(\"UFIFeedbackTargets\"), s = b(\"UFILikeLink.react\"), t = b(\"UFISubscribeLink.react\"), u = b(\"UFITimelineBlingBox.react\"), v = b(\"UFIUserActions\"), w = b(\"copyProperties\");\n    function x(z, aa, ba) {\n        if (this._root) {\n            throw new Error(((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\")));\n        }\n    ;\n    ;\n        var ca = j.scry(z, aa)[0];\n        if (ca) {\n            var da = JSBNG__document.createElement(\"span\");\n            ca.parentNode.replaceChild(da, ca);\n            da.appendChild(ca);\n            if (((typeof ba === \"function\"))) {\n                ba(da);\n            }\n        ;\n        ;\n        }\n         else var ea = g.subscribe(\"PhotoSnowlift.DATA_CHANGE\", function() {\n            g.unsubscribe(ea);\n            x(z, aa, ba);\n        }, g.SUBSCRIBE_NEW)\n    ;\n    };\n;\n    var y = function(z, aa, ba) {\n        this._id = aa.ftentidentifier;\n        this._ftFBID = ba.targetfbid;\n        this._source = aa.source;\n        this._contextArgs = aa;\n        this._ufiRoot = z;\n        if (this._isSourceProfile(this._contextArgs.source)) {\n            this._attemptInitializeTimelineBling();\n        }\n         else this._attemptInitializeBling();\n    ;\n    ;\n        if (ba.viewercanlike) {\n            this._attemptInitializeLike();\n        }\n    ;\n    ;\n        if (ba.viewercansubscribetopost) {\n            this._attemptInitializeSubscribe();\n        }\n    ;\n    ;\n        o.subscribe(\"feedback-updated\", function(ca, da) {\n            var ea = da.updates;\n            if (((this._id in ea))) {\n                this.render();\n            }\n        ;\n        ;\n        }.bind(this));\n        o.subscribe(\"feedback-id-changed\", function(ca, da) {\n            var ea = da.updates;\n            if (((this._id in ea))) {\n                this._id = ea[this._id];\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n    w(y.prototype, {\n        _attemptInitializeBling: function() {\n            x(this._ufiRoot, \"^form .uiBlingBox\", function(z) {\n                this._blingRoot = z;\n                if (this._dataReady) {\n                    this._renderBling();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _attemptInitializeTimelineBling: function() {\n            if (this._root) {\n                throw new Error(((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\")));\n            }\n        ;\n        ;\n            var z = j.scry(this._ufiRoot, \"^form .fbTimelineFeedbackActions span\")[0];\n            if (z) {\n                i.addClass(z, \"UFIBlingBoxTimeline\");\n                var aa = j.scry(z, \".fbTimelineFeedbackLikes\")[0];\n                this._enableShowLikes = ((aa ? true : false));\n                var ba = j.scry(z, \".fbTimelineFeedbackComments\")[0];\n                this._enableShowComments = ((ba ? true : false));\n            }\n        ;\n        ;\n            this._blingTimelineRoot = z;\n            if (this._dataReady) {\n                this._renderTimelineBling();\n            }\n        ;\n        ;\n        },\n        _attemptInitializeLike: function() {\n            x(this._ufiRoot, \"^form .like_link\", function(z) {\n                this._likeRoot = z;\n                if (this._dataReady) {\n                    this._renderLike();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _attemptInitializeSubscribe: function() {\n            x(this._ufiRoot, \"^form .unsub_link\", function(z) {\n                this._subscribeRoot = z;\n                if (this._dataReady) {\n                    this._renderSubscribe();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        render: function() {\n            this._dataReady = true;\n            if (this._isSourceProfile(this._contextArgs.source)) {\n                this._renderTimelineBling();\n            }\n             else this._renderBling();\n        ;\n        ;\n            this._renderLike();\n            this._renderSubscribe();\n        },\n        _renderBling: function() {\n            if (this._blingRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = function(JSBNG__event) {\n                        var da = k.byTag(JSBNG__event.target, \"form\");\n                        i.toggleClass(da, \"collapsed_comments\");\n                        i.toggleClass(da, \"hidden_add_comment\");\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ba = m.getTrackingInfo(m.types.BLINGBOX), ca = n({\n                        likes: z.likecount,\n                        comments: p.getDisplayedCommentCount(this._id),\n                        reshares: z.sharecount,\n                        permalink: z.permalink,\n                        contextArgs: this._contextArgs,\n                        onClick: aa,\n                        \"data-ft\": ba\n                    });\n                    this._blingBox = l.renderComponent(ca, this._blingRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderTimelineBling: function() {\n            if (this._blingTimelineRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = m.getTrackingInfo(m.types.BLINGBOX), ba = h.getUserActionID(h.types.TIMELINE_SEE_LIKERS), ca = function(JSBNG__event) {\n                        var ea = k.byTag(JSBNG__event.target, \"form\");\n                        i.removeClass(ea, \"collapsed_comments\");\n                        var fa = j.scry(ea, \"a.UFIPagerLink\");\n                        if (fa.length) {\n                            fa[0].click();\n                        }\n                    ;\n                    ;\n                        JSBNG__event.preventDefault();\n                    }.bind(this), da = u({\n                        comments: p.getDisplayedCommentCount(this._id),\n                        commentOnClick: ca,\n                        contextArgs: this._contextArgs,\n                        \"data-ft\": aa,\n                        \"data-gt\": ba,\n                        enableShowComments: this._enableShowComments,\n                        enableShowLikes: this._enableShowLikes,\n                        feedbackFBID: this._ftFBID,\n                        likes: z.likecount,\n                        reshares: z.sharecount\n                    });\n                    l.renderComponent(da, this._blingTimelineRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderLike: function() {\n            if (this._likeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewerliked, ba = function(JSBNG__event) {\n                        v.changeLike(this._id, aa, {\n                            source: this._source,\n                            target: JSBNG__event.target,\n                            rootid: this._contextArgs.rootid,\n                            giftoccasion: this._contextArgs.giftoccasion\n                        });\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ca = s({\n                        onClick: ba,\n                        likeAction: aa\n                    });\n                    this._likeLink = l.renderComponent(ca, this._likeRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderSubscribe: function() {\n            if (this._subscribeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewersubscribed, ba = function(JSBNG__event) {\n                        v.changeSubscribe(this._id, aa, {\n                            source: this._source,\n                            target: JSBNG__event.target,\n                            rootid: this._contextArgs.rootid,\n                            commentexpandmode: z.commentexpandmode\n                        });\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ca = t({\n                        onClick: ba,\n                        subscribeAction: aa\n                    });\n                    this._subscribeLink = l.renderComponent(ca, this._subscribeRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _isSourceProfile: function(z) {\n            return ((z === q.UFIFeedbackSourceType.PROFILE));\n        }\n    });\n    e.exports = y;\n});\n__d(\"MentionsInputUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        generateDataFromTextWithEntities: function(h) {\n            var i = h.text, j = [];\n            ((h.ranges || [])).forEach(function(l) {\n                var m = l.entities[0];\n                if (!m.JSBNG__external) {\n                    j.push({\n                        uid: m.id,\n                        text: i.substr(l.offset, l.length),\n                        offset: l.offset,\n                        length: l.length,\n                        weakreference: !!m.weakreference\n                    });\n                }\n            ;\n            ;\n            });\n            var k = {\n                value: i,\n                mentions: j\n            };\n            return k;\n        }\n    };\n    e.exports = g;\n});\n__d(\"ClipboardPhotoUploader\", [\"ArbiterMixin\",\"AsyncRequest\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.uploadURIString = k;\n        this.data = l;\n    };\n;\n    i(j.prototype, g, {\n        handlePaste: function(JSBNG__event) {\n            if (!JSBNG__event.JSBNG__clipboardData) {\n                return;\n            }\n        ;\n        ;\n            var k = JSBNG__event.JSBNG__clipboardData.items;\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            for (var l = 0; ((l < k.length)); ++l) {\n                var m = k[l];\n                if (((((m.kind === \"file\")) && ((m.type.indexOf(\"image/\") !== -1))))) {\n                    var n = new JSBNG__FormData();\n                    n.append(\"pasted_file\", m.getAsFile());\n                    var o = new h();\n                    o.setURI(this.uploadURIString).setData(this.data).setRawData(n).setHandler(function(p) {\n                        this.inform(\"upload_success\", p);\n                    }.bind(this)).setErrorHandler(function(p) {\n                        this.inform(\"upload_error\", p);\n                    }.bind(this));\n                    this.inform(\"upload_start\");\n                    o.send();\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"CloseButton.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"CloseButton\",\n        render: function() {\n            var j = this.props, k = ((j.size || \"medium\")), l = ((j.appearance || \"normal\")), m = ((k === \"small\")), n = ((k === \"huge\")), o = ((l === \"dark\")), p = ((l === \"inverted\")), q = (((((((((((((\"uiCloseButton\") + ((m ? ((\" \" + \"uiCloseButtonSmall\")) : \"\")))) + ((n ? ((\" \" + \"uiCloseButtonHuge\")) : \"\")))) + ((((m && o)) ? ((\" \" + \"uiCloseButtonSmallDark\")) : \"\")))) + ((((m && p)) ? ((\" \" + \"uiCloseButtonSmallInverted\")) : \"\")))) + ((((!m && o)) ? ((\" \" + \"uiCloseButtonDark\")) : \"\")))) + ((((!m && p)) ? ((\" \" + \"uiCloseButtonInverted\")) : \"\"))));\n            return this.transferPropsTo(g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                \"aria-label\": j.tooltip,\n                \"data-hover\": ((j.tooltip && \"tooltip\")),\n                \"data-tooltip-alignh\": ((j.tooltip && \"center\")),\n                className: q\n            }));\n        }\n    });\n    e.exports = i;\n});\n__d(\"LoadingIndicator.react\", [\"React\",\"joinClasses\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"joinClasses\"), i = b(\"keyMirror\"), j = b(\"merge\"), k = i({\n        white: true,\n        blue: true,\n        black: true\n    }), l = i({\n        small: true,\n        medium: true,\n        large: true\n    }), m = {\n        white: {\n            large: \"/images/loaders/indicator_blue_large.gif\",\n            medium: \"/images/loaders/indicator_blue_medium.gif\",\n            small: \"/images/loaders/indicator_blue_small.gif\"\n        },\n        blue: {\n            large: \"/images/loaders/indicator_white_large.gif\",\n            small: \"/images/loaders/indicator_white_small.gif\"\n        },\n        black: {\n            large: \"/images/loaders/indicator_black.gif\"\n        }\n    }, n = g.createClass({\n        displayName: \"LoadingIndicator\",\n        render: function() {\n            var o = this.props.color, p = this.props.size;\n            if (!m[o]) {\n                return g.DOM.span(null);\n            }\n        ;\n        ;\n            if (!m[o][p]) {\n                return g.DOM.span(null);\n            }\n        ;\n        ;\n            var q = ((this.props.showonasync ? \"uiLoadingIndicatorAsync\" : \"\"));\n            if (this.props.className) {\n                q = h(this.props.className, q);\n            }\n        ;\n        ;\n            var r = m[o][p], s = g.DOM.img({\n                src: r,\n                className: q\n            });\n            s.props = j(this.props, s.props);\n            return s;\n        }\n    });\n    n.SIZES = l;\n    n.COLORS = k;\n    e.exports = n;\n});\n__d(\"LegacyMentionsInput.react\", [\"PlaceholderListener\",\"Bootloader\",\"JSBNG__Event\",\"Keys\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"PlaceholderListener\");\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__Event\"), i = b(\"Keys\"), j = b(\"React\"), k = b(\"cx\"), l = j.createClass({\n        displayName: \"ReactLegacyMentionsInput\",\n        componentDidMount: function(m) {\n            ((this.props.initialData && this._initializeTextarea(m)));\n        },\n        hasEnteredText: function() {\n            return !!((this._mentionsInput && this._mentionsInput.getValue().trim()));\n        },\n        _handleKeydown: function(JSBNG__event) {\n            var m = JSBNG__event.nativeEvent, n = this.props.onEnterSubmit, o = ((((h.getKeyCode(m) == i.RETURN)) && !h.$E(m).getModifiers().any)), p = ((this._mentionsInput && this._mentionsInput.getTypeahead().getView().JSBNG__getSelection()));\n            if (((((n && o)) && !p))) {\n                if (this.props.isLoadingPhoto) {\n                    return false;\n                }\n            ;\n            ;\n                var q = JSBNG__event.target, r = ((q.value && q.value.trim()));\n                if (((r || this.props.acceptEmptyInput))) {\n                    var s = {\n                        visibleValue: r,\n                        encodedValue: r,\n                        attachedPhoto: null\n                    };\n                    if (this._mentionsInput) {\n                        s.encodedValue = this._mentionsInput.getRawValue().trim();\n                        this._mentionsInput.reset();\n                    }\n                ;\n                ;\n                    n(s, JSBNG__event);\n                }\n            ;\n            ;\n                JSBNG__event.preventDefault();\n            }\n        ;\n        ;\n        },\n        _handleFocus: function() {\n            ((this.props.onFocus && this.props.onFocus()));\n            this._initializeTextarea(this.refs.root.getDOMNode());\n        },\n        _handleBlur: function() {\n            ((this.props.onBlur && this.props.onBlur()));\n        },\n        _initializeTextarea: function(m) {\n            if (((this._mentionsInput || this._bootloadingMentions))) {\n                return;\n            }\n        ;\n        ;\n            this._bootloadingMentions = true;\n            g.loadModules([\"CompactTypeaheadRenderer\",\"ContextualTypeaheadView\",\"InputSelection\",\"MentionsInput\",\"TextAreaControl\",\"Typeahead\",\"TypeaheadAreaCore\",\"TypeaheadBestName\",\"TypeaheadHoistFriends\",\"TypeaheadMetrics\",\"TypingDetector\",], function(n, o, p, q, r, s, t, u, v, w, x) {\n                var y = this.refs.textarea.getDOMNode();\n                new r(y);\n                if (this.props.onTypingStateChange) {\n                    var z = new x(y);\n                    z.init();\n                    z.subscribe(\"change\", this.props.onTypingStateChange);\n                }\n            ;\n            ;\n                var aa = {\n                    autoSelect: true,\n                    renderer: n,\n                    causalElement: y\n                };\n                if (this.props.viewOptionsTypeObjects) {\n                    aa.typeObjects = this.props.viewOptionsTypeObjects;\n                }\n            ;\n            ;\n                if (this.props.viewOptionsTypeObjectsOrder) {\n                    aa.typeObjectsOrder = this.props.viewOptionsTypeObjectsOrder;\n                }\n            ;\n            ;\n                var ba = new s(this.props.datasource, {\n                    ctor: o,\n                    options: aa\n                }, {\n                    ctor: t\n                }, this.refs.typeahead.getDOMNode()), ca = [u,v,], da = new w({\n                    extraData: {\n                        event_name: \"mentions\"\n                    }\n                });\n                s.initNow(ba, ca, da);\n                this._mentionsInput = new q(m, ba, y, {\n                    hashtags: this.props.sht\n                });\n                this._mentionsInput.init({\n                    max: 6\n                }, this.props.initialData);\n                if (this.props.initialData) {\n                    p.set(y, y.value.length);\n                }\n            ;\n            ;\n                if (this.props.onPaste) {\n                    h.listen(y, \"paste\", this.props.onPaste);\n                }\n            ;\n            ;\n                this._bootloadingMentions = false;\n            }.bind(this));\n        },\n        JSBNG__focus: function() {\n            try {\n                this.refs.textarea.getDOMNode().JSBNG__focus();\n            } catch (m) {\n            \n            };\n        ;\n        },\n        render: function() {\n            var m = (((((((((((\"textInput\") + ((\" \" + \"mentionsTextarea\")))) + ((\" \" + \"uiTextareaAutogrow\")))) + ((\" \" + \"uiTextareaNoResize\")))) + ((\" \" + \"UFIAddCommentInput\")))) + ((\" \" + \"DOMControl_placeholder\"))));\n            return (j.DOM.div({\n                ref: \"root\",\n                className: \"uiMentionsInput textBoxContainer ReactLegacyMentionsInput\"\n            }, j.DOM.div({\n                className: \"highlighter\"\n            }, j.DOM.div(null, j.DOM.span({\n                className: \"highlighterContent hidden_elem\"\n            }))), j.DOM.div({\n                ref: \"typeahead\",\n                className: \"uiTypeahead mentionsTypeahead\"\n            }, j.DOM.div({\n                className: \"wrap\"\n            }, j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"hiddenInput\"\n            }), j.DOM.div({\n                className: \"innerWrap\"\n            }, j.DOM.textarea({\n                ref: \"textarea\",\n                JSBNG__name: \"add_comment_text\",\n                className: m,\n                title: this.props.placeholder,\n                placeholder: this.props.placeholder,\n                onFocus: this._handleFocus,\n                onBlur: this._handleBlur,\n                onKeyDown: this._handleKeydown,\n                defaultValue: this.props.placeholder\n            })))), j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"mentionsHidden\",\n                defaultValue: \"\"\n            })));\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIClassNames\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        ACTOR_IMAGE: \"img UFIActorImage -cx-PRIVATE-uiSquareImage__size32\",\n        ROW: \"UFIRow\",\n        UNSEEN_ITEM: \"UFIUnseenItem\"\n    };\n});\n__d(\"LeftRight.react\", [\"React\",\"cx\",\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = b(\"keyMirror\"), j = b(\"throwIf\"), k = i({\n        left: true,\n        right: true,\n        both: true\n    });\n    function l(n) {\n        j(((((!n.children || ((n.children.length < 1)))) || ((n.children.length > 2)))), \"LeftRight component must have one or two children.\");\n    };\n;\n    var m = g.createClass({\n        displayName: \"LeftRight\",\n        render: function() {\n            l(this.props);\n            var n = ((this.props.direction || k.both)), o = ((n === k.both)), p = g.DOM.div({\n                key: \"left\",\n                className: ((((o || ((n === k.left)))) ? \"lfloat\" : \"\"))\n            }, this.props.children[0]), q = ((((this.props.children.length < 2)) ? null : g.DOM.div({\n                key: \"right\",\n                className: ((((o || ((n === k.right)))) ? \"rfloat\" : \"\"))\n            }, this.props.children[1]))), r = ((((((n === k.right)) && q)) ? [q,p,] : [p,q,]));\n            return this.transferPropsTo(g.DOM.div({\n                className: \"clearfix\"\n            }, r));\n        }\n    });\n    m.DIRECTION = k;\n    e.exports = m;\n});\n__d(\"ImageBlock.react\", [\"LeftRight.react\",\"React\",\"cx\",\"joinClasses\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"throwIf\");\n    function l(p) {\n        k(((((!p.children || ((p.children.length > 3)))) || ((p.children.length < 1)))), \"ImageBlock requires two or three children.\");\n    };\n;\n    function m(p) {\n        return (((((((((\"img\") + ((\" \" + \"-cx-PRIVATE-uiImageBlock__image\")))) + ((((p === \"small\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__smallimage\")) : \"\")))) + ((((p === \"medium\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__mediumimage\")) : \"\")))) + ((((p === \"large\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__largeimage\")) : \"\"))));\n    };\n;\n    function n(p, q, r) {\n        p.props.className = j(m(q), p.props.className, r);\n    };\n;\n    var o = h.createClass({\n        displayName: \"ImageBlock\",\n        render: function() {\n            l(this.props);\n            var p = this.props.children[0], q = this.props.children[1], r = this.props.children[2], s = ((this.props.spacing || \"small\"));\n            n(p, s, this.props.imageClassName);\n            var t = j(this.props.contentClassName, (((\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\") + ((((s === \"small\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__smallcontent\")) : \"\")))));\n            if (((p.tagName == \"IMG\"))) {\n                if (((p.props.alt === undefined))) {\n                    p.props.alt = \"\";\n                }\n            ;\n            ;\n            }\n             else if (((((((((((p.tagName == \"A\")) || ((p.tagName == \"LINK\")))) && ((p.props.tabIndex === undefined)))) && ((p.props.title === undefined)))) && ((p.props[\"aria-label\"] === undefined))))) {\n                p.props.tabIndex = \"-1\";\n                p.props[\"aria-hidden\"] = \"true\";\n            }\n            \n        ;\n        ;\n            var u;\n            if (!r) {\n                u = h.DOM.div({\n                    className: t\n                }, q);\n            }\n             else u = g({\n                className: t,\n                direction: g.DIRECTION.right\n            }, q, r);\n        ;\n        ;\n            return this.transferPropsTo(g({\n                direction: g.DIRECTION.left\n            }, p, u));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIImageBlock.react\", [\"ImageBlock.react\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ImageBlock.react\"), h = b(\"React\"), i = b(\"cx\"), j = h.createClass({\n        displayName: \"UFIImageBlock\",\n        render: function() {\n            return this.transferPropsTo(g({\n                imageClassName: \"UFIImageBlockImage\",\n                contentClassName: \"UFIImageBlockContent\"\n            }, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIAddComment.react\", [\"Bootloader\",\"CLogConfig\",\"ClipboardPhotoUploader\",\"CloseButton.react\",\"JSBNG__Event\",\"Keys\",\"LoadingIndicator.react\",\"React\",\"LegacyMentionsInput.react\",\"TrackingNodes\",\"Run\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CLogConfig\"), i = b(\"ClipboardPhotoUploader\"), j = b(\"CloseButton.react\"), k = b(\"JSBNG__Event\"), l = b(\"Keys\"), m = b(\"LoadingIndicator.react\"), n = b(\"React\"), o = b(\"LegacyMentionsInput.react\"), p = b(\"TrackingNodes\"), q = b(\"Run\"), r = b(\"UFIClassNames\"), s = b(\"UFIImageBlock.react\"), t = b(\"cx\"), u = b(\"joinClasses\"), v = b(\"tx\"), w = \"Write a comment...\", x = \"Write a reply...\", y = \"fcg fss UFICommentTip\", z = 19, aa = \"/ajax/ufi/upload/\", ba = n.createClass({\n        displayName: \"UFIAddComment\",\n        getInitialState: function() {\n            if (this.props.attachedPhoto) {\n                this.props.contextArgs.attachedphoto = this.props.attachedPhoto;\n            }\n        ;\n        ;\n            return {\n                attachedPhoto: ((this.props.attachedPhoto ? this.props.attachedPhoto : null)),\n                isCommenting: false,\n                isLoadingPhoto: false,\n                isOnBeforeUnloadListenerAdded: false\n            };\n        },\n        _onKeyDown: function(JSBNG__event) {\n            if (((this.props.isEditing && ((k.getKeyCode(JSBNG__event.nativeEvent) === l.ESC))))) {\n                this.props.onCancel();\n            }\n        ;\n        ;\n            if (((this.isMounted() && !this.state.isOnBeforeUnloadListenerAdded))) {\n                q.onBeforeUnload(this._handleUnsavedChanges);\n                this.setState({\n                    isOnBeforeUnloadListenerAdded: true\n                });\n            }\n        ;\n        ;\n        },\n        _handleUnsavedChanges: function() {\n            var ca = a.PageTransitions;\n            if (ca) {\n                var da = ca.getNextURI(), ea = ca.getMostRecentURI();\n                if (((da.getQueryData().hasOwnProperty(\"theater\") || ea.getQueryData().hasOwnProperty(\"theater\")))) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((this.refs && this.refs.mentionsinput)) && this.refs.mentionsinput.hasEnteredText()))) {\n                return \"You haven't finished your comment yet. Do you want to leave without finishing?\";\n            }\n        ;\n        ;\n        },\n        _blur: function() {\n            if (((this.refs.mentionsinput && this.refs.mentionsinput.hasEnteredText()))) {\n                return;\n            }\n        ;\n        ;\n            this.setState({\n                isCommenting: false\n            });\n        },\n        _onPaste: function(JSBNG__event) {\n            var ca = new i(aa, this._getPhotoUploadData());\n            this._cancelCurrentSubscriptions();\n            this._subscriptions = [ca.subscribe(\"upload_start\", this._prepareForAttachedPhotoPreview),ca.subscribe(\"upload_error\", this._onRemoveAttachedPhotoPreviewClicked),ca.subscribe(\"upload_success\", function(da, ea) {\n                this._onPhotoUploadComplete(ea);\n            }.bind(this)),];\n            ca.handlePaste(JSBNG__event);\n        },\n        _cancelCurrentSubscriptions: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(function(ca) {\n                    ca.unsubscribe();\n                });\n            }\n        ;\n        ;\n        },\n        componentWillUnmount: function() {\n            this._cancelCurrentSubscriptions();\n        },\n        JSBNG__focus: function() {\n            if (((this.refs && this.refs.mentionsinput))) {\n                this.refs.mentionsinput.JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var ca = ((!this.props.contextArgs.collapseaddcomment || this.state.isCommenting)), da = null;\n            if (this.props.isEditing) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Esc to cancel.\");\n            }\n             else if (this.props.showSendOnEnterTip) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Enter to post.\");\n            }\n             else if (this.props.subtitle) {\n                da = n.DOM.span({\n                    className: y\n                }, this.props.subtitle);\n            }\n            \n            \n        ;\n        ;\n            var ea = null, fa = this.state.attachedPhoto, ga = null;\n            if (this.props.allowPhotoAttachments) {\n                ga = this._onPaste;\n                var ha = n.DOM.input({\n                    ref: \"PhotoInput\",\n                    accept: \"image/*\",\n                    className: \"-cx-PRIVATE-uiFileInput__input\",\n                    JSBNG__name: \"file[]\",\n                    type: \"file\",\n                    multiple: false\n                }), ia = ((fa ? \"UFICommentPhotoAttachedIcon\" : \"UFICommentPhotoIcon\")), ja = \"UFIPhotoAttachLinkWrapper -cx-PRIVATE-uiFileInput__container\";\n                ea = n.DOM.div({\n                    ref: \"PhotoInputContainer\",\n                    className: ja,\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"aria-label\": \"Attach a Photo\"\n                }, n.DOM.i({\n                    ref: \"PhotoInputControl\",\n                    className: ia\n                }), ha);\n            }\n        ;\n        ;\n            var ka = p.getTrackingInfo(p.types.ADD_COMMENT_BOX), la = u(r.ACTOR_IMAGE, ((!ca ? \"hidden_elem\" : \"\"))), ma = n.DOM.div({\n                className: \"UFIReplyActorPhotoWrapper\"\n            }, n.DOM.img({\n                className: la,\n                src: this.props.viewerActor.thumbSrc\n            })), na = u(r.ROW, ((((((((((((this.props.hide ? \"noDisplay\" : \"\")) + ((\" \" + \"UFIAddComment\")))) + ((this.props.allowPhotoAttachments ? ((\" \" + \"UFIAddCommentWithPhotoAttacher\")) : \"\")))) + ((this.props.withoutSeparator ? ((\" \" + \"UFIAddCommentWithoutSeparator\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), oa = ((!!this.props.replyCommentID ? x : w)), pa = ((this.props.contextArgs.entstream ? this._blur : null)), qa = this.props.contextArgs.viewoptionstypeobjects, ra = this.props.contextArgs.viewoptionstypeobjectsorder, sa = null, ta = this.props.onCommentSubmit;\n            if (fa) {\n                sa = n.DOM.div({\n                    isStatic: true,\n                    dangerouslySetInnerHTML: ((this.state.attachedPhoto.markupPreview ? this.state.attachedPhoto.markupPreview : this.state.attachedPhoto.markup))\n                });\n                da = null;\n            }\n             else if (this.state.isLoadingPhoto) {\n                sa = m({\n                    color: \"white\",\n                    className: \"UFICommentPhotoAttachedPreviewLoadingIndicator\",\n                    size: \"medium\"\n                });\n            }\n            \n        ;\n        ;\n            var ua;\n            if (((sa != null))) {\n                ua = n.DOM.div({\n                    className: \"UFICommentPhotoAttachedPreview pas\"\n                }, sa, j({\n                    onClick: this._onRemoveAttachedPhotoPreviewClicked\n                }));\n                ta = function(va, JSBNG__event) {\n                    this.setState({\n                        isLoadingPhoto: false,\n                        attachedPhoto: null\n                    });\n                    va.attachedPhoto = this.props.contextArgs.attachedphoto;\n                    this.props.onCommentSubmit(va, JSBNG__event);\n                }.bind(this);\n            }\n        ;\n        ;\n            return (n.DOM.li({\n                className: na,\n                onKeyDown: this._onKeyDown,\n                \"data-ft\": ka\n            }, s({\n                className: \"UFIMentionsInputWrap\"\n            }, ma, n.DOM.div(null, o({\n                initialData: this.props.initialData,\n                placeholder: oa,\n                ref: \"mentionsinput\",\n                datasource: this.props.mentionsDataSource,\n                acceptEmptyInput: ((this.props.isEditing || this.props.contextArgs.attachedphoto)),\n                onEnterSubmit: ta,\n                onFocus: this.setState.bind(this, {\n                    isCommenting: true\n                }),\n                viewOptionsTypeObjects: qa,\n                viewOptionsTypeObjectsOrder: ra,\n                onBlur: pa,\n                onTypingStateChange: this.props.onTypingStateChange,\n                onPaste: ga,\n                sht: this.props.contextArgs.sht,\n                isLoadingPhoto: this.state.isLoadingPhoto\n            }), ea, ua, da))));\n        },\n        componentDidMount: function(ca) {\n            if (h.gkResults) {\n                var da = this.props.replyCommentID;\n                if (((this.refs && this.refs.mentionsinput))) {\n                    var ea = this.refs.mentionsinput.refs.textarea.getDOMNode();\n                    g.loadModules([\"CLoggerX\",\"UFIComments\",], function(ja, ka) {\n                        var la = ka.getComment(da), ma = ((la ? la.fbid : null));\n                        ja.trackMentionsInput(ea, ma);\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!this.props.allowPhotoAttachments) {\n                return;\n            }\n        ;\n        ;\n            var fa = this.refs.PhotoInputContainer.getDOMNode(), ga = this.refs.PhotoInputControl.getDOMNode(), ha = this.refs.PhotoInput.getDOMNode(), ia = k.listen(fa, \"click\", function(JSBNG__event) {\n                g.loadModules([\"FileInput\",\"FileInputUploader\",\"Input\",], function(ja, ka, la) {\n                    var ma = new ja(fa, ga, ha), na = new ka().setURI(aa).setData(this._getPhotoUploadData());\n                    ma.subscribe(\"change\", function(JSBNG__event) {\n                        if (ma.getValue()) {\n                            this._prepareForAttachedPhotoPreview();\n                            na.setInput(ma.getInput()).send();\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                    na.subscribe(\"success\", function(oa, pa) {\n                        ma.clear();\n                        this._onPhotoUploadComplete(pa.response);\n                    }.bind(this));\n                }.bind(this));\n                ia.remove();\n            }.bind(this));\n        },\n        _getPhotoUploadData: function() {\n            return {\n                profile_id: this.props.viewerActor.id,\n                source: z\n            };\n        },\n        _onPhotoUploadComplete: function(ca) {\n            if (!this.state.isLoadingPhoto) {\n                return;\n            }\n        ;\n        ;\n            var da = ca.getPayload();\n            if (((da && da.fbid))) {\n                this.props.contextArgs.attachedphoto = da;\n                this.setState({\n                    attachedPhoto: da,\n                    isLoadingPhoto: false\n                });\n            }\n        ;\n        ;\n        },\n        _onRemoveAttachedPhotoPreviewClicked: function(JSBNG__event) {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: false\n            });\n        },\n        _prepareForAttachedPhotoPreview: function() {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: true\n            });\n        }\n    });\n    e.exports = ba;\n});\n__d(\"UFIAddCommentController\", [\"Arbiter\",\"copyProperties\",\"MentionsInputUtils\",\"Parent\",\"UFIAddComment.react\",\"React\",\"ShortProfiles\",\"UFICentralUpdates\",\"UFIComments\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"MentionsInputUtils\"), j = b(\"Parent\"), k = b(\"UFIAddComment.react\"), l = b(\"React\"), m = b(\"ShortProfiles\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIFeedbackTargets\"), q = b(\"UFIInstanceState\"), r = b(\"UFIUserActions\");\n    function s(t, u, v, w) {\n        this.id = u;\n        this._ufiInstanceID = w.instanceid;\n        this._contextArgs = w;\n        this._replyCommentID = v;\n        if (t) {\n            this.root = t;\n            if (!this._contextArgs.rootid) {\n                this._contextArgs.rootid = t.id;\n            }\n        ;\n        ;\n            this.render();\n            n.subscribe(\"instance-updated\", function(x, y) {\n                var z = y.updates;\n                if (((this._ufiInstanceID in z))) {\n                    this.render();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        n.subscribe(\"feedback-id-changed\", function(x, y) {\n            var z = y.updates;\n            if (((this.id in z))) {\n                this.id = z[this.id];\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    h(s.prototype, {\n        _onCommentSubmit: function(t, JSBNG__event) {\n            r.addComment(this.id, t.visibleValue, t.encodedValue, {\n                source: this._contextArgs.source,\n                ufiinstanceid: this._ufiInstanceID,\n                target: JSBNG__event.target,\n                replyid: this._replyCommentID,\n                timelinelogdata: this._contextArgs.timelinelogdata,\n                rootid: this._contextArgs.rootid,\n                attachedphoto: this._contextArgs.attachedphoto,\n                giftoccasion: this._contextArgs.giftoccasion\n            });\n            this._contextArgs.attachedphoto = null;\n            p.getFeedbackTarget(this.id, function(u) {\n                var v = j.byTag(this.root, \"form\");\n                if (v) {\n                    g.inform(\"ufi/comment\", {\n                        form: v,\n                        isranked: u.isranked\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return false;\n        },\n        _onTypingStateChange: function(t, u) {\n        \n        },\n        renderAddComment: function(t, u, v, w, x, y, z) {\n            var aa = ((this._contextArgs.logtyping ? this._onTypingStateChange.bind(this) : null)), ba = null, ca = ((q.getKeyForInstance(this._ufiInstanceID, \"isediting\") && !this._replyCommentID));\n            return (k({\n                hide: ca,\n                replyCommentID: this._replyCommentID,\n                viewerActor: t,\n                initialData: ba,\n                ref: w,\n                withoutSeparator: x,\n                onCommentSubmit: this._onCommentSubmit.bind(this),\n                mentionsDataSource: u,\n                onTypingStateChange: aa,\n                showSendOnEnterTip: v,\n                allowPhotoAttachments: y,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                subtitle: z\n            }));\n        },\n        renderEditComment: function(t, u, v, w, x, y) {\n            var z = o.getComment(u), aa = i.generateDataFromTextWithEntities(z.body);\n            return (k({\n                viewerActor: t,\n                initialData: aa,\n                onCommentSubmit: w,\n                onCancel: x,\n                mentionsDataSource: v,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                isEditing: true,\n                editingCommentID: u,\n                attachedPhoto: z.photo_comment,\n                allowPhotoAttachments: y\n            }));\n        },\n        render: function() {\n            if (!this.root) {\n                throw new Error(\"render called on UFIAddCommentController with no root\");\n            }\n        ;\n        ;\n            p.getFeedbackTarget(this.id, function(t) {\n                if (((t.cancomment && t.actorforpost))) {\n                    m.get(t.actorforpost, function(u) {\n                        var v = this.renderAddComment(u, t.mentionsdatasource, t.showsendonentertip, null, null, t.allowphotoattachments, t.subtitle);\n                        this._addComment = l.renderComponent(v, this.root);\n                    }.bind(this));\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});\n__d(\"Scrollable\", [\"JSBNG__Event\",\"Parent\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Parent\"), i = b(\"UserAgent\"), j = function(JSBNG__event) {\n        var m = h.byClass(JSBNG__event.getTarget(), \"scrollable\");\n        if (!m) {\n            return;\n        }\n    ;\n    ;\n        if (((((((((typeof JSBNG__event.axis !== \"undefined\")) && ((JSBNG__event.axis === JSBNG__event.HORIZONTAL_AXIS)))) || ((JSBNG__event.wheelDeltaX && !JSBNG__event.wheelDeltaY)))) || ((JSBNG__event.deltaX && !JSBNG__event.deltaY))))) {\n            return;\n        }\n    ;\n    ;\n        var n = ((((JSBNG__event.wheelDelta || -JSBNG__event.deltaY)) || -JSBNG__event.detail)), o = m.scrollHeight, p = m.clientHeight;\n        if (((o > p))) {\n            var q = m.scrollTop;\n            if (((((((n > 0)) && ((q === 0)))) || ((((n < 0)) && ((q >= ((o - p))))))))) {\n                JSBNG__event.prevent();\n            }\n             else if (((i.ie() < 9))) {\n                if (m.currentStyle) {\n                    var r = m.currentStyle.fontSize;\n                    if (((r.indexOf(\"px\") < 0))) {\n                        var s = JSBNG__document.createElement(\"div\");\n                        s.style.fontSize = r;\n                        s.style.height = \"1em\";\n                        r = s.style.pixelHeight;\n                    }\n                     else r = parseInt(r, 10);\n                ;\n                ;\n                    m.scrollTop = ((q - Math.round(((((n / 120)) * r)))));\n                    JSBNG__event.prevent();\n                }\n            ;\n            }\n            \n        ;\n        ;\n        }\n    ;\n    ;\n    }, k = JSBNG__document.documentElement;\n    if (i.firefox()) {\n        var l = ((((\"JSBNG__WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\"));\n        k.JSBNG__addEventListener(l, j, false);\n    }\n     else g.listen(k, \"mousewheel\", j);\n;\n;\n});\n__d(\"LegacyScrollableArea.react\", [\"Scrollable\",\"Bootloader\",\"React\",\"Style\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"Scrollable\");\n    var g = b(\"Bootloader\"), h = b(\"React\"), i = b(\"Style\"), j = b(\"cx\"), k = \"uiScrollableArea native\", l = \"uiScrollableAreaWrap scrollable\", m = \"uiScrollableAreaBody\", n = \"uiScrollableAreaContent\", o = h.createClass({\n        displayName: \"ReactLegacyScrollableArea\",\n        render: function() {\n            var p = {\n                height: ((this.props.height ? ((this.props.height + \"px\")) : \"auto\"))\n            };\n            return (h.DOM.div({\n                className: k,\n                ref: \"root\",\n                style: p\n            }, h.DOM.div({\n                className: l\n            }, h.DOM.div({\n                className: m,\n                ref: \"body\"\n            }, h.DOM.div({\n                className: n\n            }, this.props.children)))));\n        },\n        getArea: function() {\n            return this._area;\n        },\n        componentDidMount: function() {\n            g.loadModules([\"ScrollableArea\",], this._loadScrollableArea);\n        },\n        _loadScrollableArea: function(p) {\n            this._area = p.fromNative(this.refs.root.getDOMNode(), {\n                fade: this.props.fade,\n                persistent: this.props.persistent\n            });\n            var q = this.refs.body.getDOMNode();\n            i.set(q, \"width\", ((this.props.width + \"px\")));\n            ((this.props.onScroll && this._area.subscribe(\"JSBNG__scroll\", this.props.onScroll)));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIAddCommentLink.react\", [\"React\",\"UFIClassNames\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIAddCommentLink\",\n        render: function() {\n            var m = j(h.ROW, (((((((((\"UFIAddCommentLink\") + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), n = \"Write a comment...\";\n            return (g.DOM.li({\n                className: m,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, g.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, n)));\n        }\n    });\n    e.exports = l;\n});\n__d(\"HovercardLink\", [\"Bootloader\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"URI\"), i = {\n        getBaseURI: function() {\n            return h(\"/ajax/hovercard/hovercard.php\");\n        },\n        constructEndpoint: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, k, null);\n        },\n        constructEndpointWithLocation: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, null, k);\n        },\n        constructEndpointWithGroupAndLocation: function(j, k, l) {\n            g.loadModules([\"Hovercard\",], function() {\n            \n            });\n            var m = new h(i.getBaseURI()).setQueryData({\n                id: j.id\n            }), n = {\n            };\n            if (((j.weakreference && k))) {\n                n.group_id = k;\n            }\n        ;\n        ;\n            if (l) {\n                n.hc_location = l;\n            }\n        ;\n        ;\n            m.addQueryData({\n                extragetparams: JSON.stringify(n)\n            });\n            return m;\n        }\n    };\n    e.exports = i;\n});\n__d(\"UntrustedLink\", [\"DOM\",\"JSBNG__Event\",\"URI\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m, n, o, p) {\n        this.dom = m;\n        this.url = m.href;\n        this.hash = n;\n        this.func_get_params = ((p || function() {\n            return {\n            };\n        }));\n        h.listen(this.dom, \"click\", this.JSBNG__onclick.bind(this));\n        h.listen(this.dom, \"mousedown\", this.JSBNG__onmousedown.bind(this));\n        h.listen(this.dom, \"mouseup\", this.JSBNG__onmouseup.bind(this));\n        h.listen(this.dom, \"mouseout\", this.JSBNG__onmouseout.bind(this));\n        this.JSBNG__onmousedown(h.$E(o));\n    };\n;\n    l.bootstrap = function(m, n, o, p) {\n        if (m.__untrusted) {\n            return;\n        }\n    ;\n    ;\n        m.__untrusted = true;\n        new l(m, n, o, p);\n    };\n    l.prototype.getRewrittenURI = function() {\n        var m = k({\n            u: this.url,\n            h: this.hash\n        }, this.func_get_params(this.dom)), n = new i(\"/l.php\");\n        return n.setQueryData(m).setSubdomain(\"www\").setProtocol(\"http\");\n    };\n    l.prototype.JSBNG__onclick = function() {\n        (function() {\n            this.setHref(this.url);\n        }).bind(this).defer(100);\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.JSBNG__onmousedown = function(m) {\n        if (((m.button == 2))) {\n            this.setHref(this.getRewrittenURI());\n        }\n    ;\n    ;\n    };\n    l.prototype.JSBNG__onmouseup = function() {\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.JSBNG__onmouseout = function() {\n        this.setHref(this.url);\n    };\n    l.prototype.setHref = function(m) {\n        if (((j.ie() < 9))) {\n            var n = g.create(\"span\");\n            g.appendContent(this.dom, n);\n            this.dom.href = m;\n            g.remove(n);\n        }\n         else this.dom.href = m;\n    ;\n    ;\n    };\n    e.exports = l;\n});\n__d(\"Link.react\", [\"React\",\"UntrustedLink\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UntrustedLink\"), i = b(\"mergeInto\"), j = g.createClass({\n        displayName: \"Link\",\n        _installLinkshimOnMouseDown: function(JSBNG__event) {\n            var k = this.props.href;\n            if (k.shimhash) {\n                h.bootstrap(this.getDOMNode(), k.shimhash);\n            }\n        ;\n        ;\n            ((this.props.onMouseDown && this.props.onMouseDown(JSBNG__event)));\n        },\n        render: function() {\n            var k = this.props.href, l = g.DOM.a(null);\n            i(l.props, this.props);\n            if (k) {\n                l.props.href = k.url;\n                var m = !!k.shimhash;\n                if (m) {\n                    l.props.rel = ((l.props.rel ? ((l.props.rel + \" nofollow\")) : \"nofollow\"));\n                    l.props.onMouseDown = this._installLinkshimOnMouseDown;\n                }\n            ;\n            ;\n            }\n             else l.props.href = \"#\";\n        ;\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"PubContentTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HASHTAG: \"hashtag\",\n        TOPIC: \"topic\",\n        JSBNG__URL: \"url\"\n    };\n    e.exports = g;\n});\n__d(\"HovercardLinkInterpolator\", [\"Bootloader\",\"CSS\",\"JSBNG__Event\",\"HovercardLink\",\"Link.react\",\"Parent\",\"PubContentTypes\",\"React\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\"), i = b(\"JSBNG__Event\"), j = b(\"HovercardLink\"), k = b(\"Link.react\"), l = b(\"Parent\"), m = b(\"PubContentTypes\"), n = b(\"React\"), o = b(\"URI\"), p = b(\"cx\");\n    function q(r, s, t, u, v) {\n        var w = s.entities[0], x = ((t || ((w.JSBNG__external ? \"_blank\" : null)))), y, z = ((((!w.JSBNG__external ? \"profileLink\" : \"\")) + ((w.weakreference ? ((\" \" + \"weakReference\")) : \"\"))));\n        if (w.hashtag) {\n            var aa = h.hasClass(JSBNG__document.body, \"-cx-PUBLIC-hasLitestand__body\"), ba = function(ea) {\n                if (i.$E(ea.nativeEvent).isDefaultRequested()) {\n                    return;\n                }\n            ;\n            ;\n                ea.preventDefault();\n                var fa = l.byTag(ea.target, \"A\");\n                if (aa) {\n                    g.loadModules([\"EntstreamPubContentOverlay\",], function(ga) {\n                        ga.pubClick(fa);\n                    });\n                }\n                 else g.loadModules([\"HashtagLayerPageController\",], function(ga) {\n                    ga.click(fa);\n                });\n            ;\n            ;\n            }, ca = null;\n            if (aa) {\n                ca = {\n                    type: m.HASHTAG,\n                    id: w.id,\n                    source: \"comment\"\n                };\n            }\n             else ca = {\n                id: w.id\n            };\n        ;\n        ;\n            var da = new o(w.url).setSubdomain(\"www\");\n            y = n.DOM.a({\n                className: \"-cx-PUBLIC-fbHashtagLink__link\",\n                \"data-pub\": JSON.stringify(ca),\n                href: da.toString(),\n                onClick: ba\n            }, n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__hashmark\"\n            }, r.substring(0, 1)), n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__tagname\"\n            }, r.substring(1)));\n        }\n         else if (w.weakreference) {\n            y = k({\n                className: z,\n                href: w,\n                target: x\n            }, n.DOM.i({\n                className: \"UFIWeakReferenceIcon\"\n            }), r);\n        }\n         else y = k({\n            className: z,\n            href: w,\n            target: x\n        }, r);\n        \n    ;\n    ;\n        if (((!w.JSBNG__external && !w.hashtag))) {\n            y.props[\"data-hovercard\"] = j.constructEndpointWithGroupAndLocation(w, u, v).toString();\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    e.exports = q;\n});\n__d(\"LinkButton\", [\"cx\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"React\"), i = function(j) {\n        var k = ((((j.JSBNG__name && j.value)) ? ((((((j.JSBNG__name + \"[\")) + encodeURIComponent(j.value))) + \"]\")) : null));\n        return (h.DOM.label({\n            className: (((((\"uiLinkButton\") + ((j.subtle ? ((\" \" + \"uiLinkButtonSubtle\")) : \"\")))) + ((j.showSaving ? ((\" \" + \"async_throbber\")) : \"\"))))\n        }, h.DOM.input({\n            type: ((j.inputType || \"button\")),\n            JSBNG__name: k,\n            value: j.label,\n            className: ((j.showSaving ? \"stat_elem\" : \"\"))\n        })));\n    };\n    e.exports = i;\n});\n__d(\"Timestamp.react\", [\"LiveTimer\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"Timestamp\",\n        render: function() {\n            var j = g.renderRelativeTimeToServer(this.props.time);\n            return this.transferPropsTo(h.DOM.abbr({\n                className: \"livetimestamp\",\n                title: this.props.verbose,\n                \"data-utime\": this.props.time\n            }, ((j.text || this.props.text))));\n        }\n    });\n    e.exports = i;\n});\n__d(\"EmoteTypes\", [], function(a, b, c, d, e, f) {\n    f.TEXT = \"text\";\n    f.EMOTE = \"emote\";\n    f.EMOTE_FBID = \"emote_fbid\";\n});\n__d(\"EmoticonsList\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        emotes: {\n            \":)\": \"smile\",\n            \":-)\": \"smile\",\n            \":]\": \"smile\",\n            \"=)\": \"smile\",\n            \":(\": \"frown\",\n            \":-(\": \"frown\",\n            \":[\": \"frown\",\n            \"=(\": \"frown\",\n            \":P\": \"tongue\",\n            \":-P\": \"tongue\",\n            \":-p\": \"tongue\",\n            \":p\": \"tongue\",\n            \"=P\": \"tongue\",\n            \"=D\": \"grin\",\n            \":-D\": \"grin\",\n            \":D\": \"grin\",\n            \":o\": \"gasp\",\n            \":-O\": \"gasp\",\n            \":O\": \"gasp\",\n            \":-o\": \"gasp\",\n            \";)\": \"wink\",\n            \";-)\": \"wink\",\n            \"8)\": \"glasses\",\n            \"8-)\": \"glasses\",\n            \"B)\": \"glasses\",\n            \"B-)\": \"glasses\",\n            \"B|\": \"sunglasses\",\n            \"8-|\": \"sunglasses\",\n            \"8|\": \"sunglasses\",\n            \"B-|\": \"sunglasses\",\n            \"\\u003E:(\": \"grumpy\",\n            \"\\u003E:-(\": \"grumpy\",\n            \":/\": \"unsure\",\n            \":-/\": \"unsure\",\n            \":\\\\\": \"unsure\",\n            \":-\\\\\": \"unsure\",\n            \"=/\": \"unsure\",\n            \"=\\\\\": \"unsure\",\n            \":'(\": \"cry\",\n            \"3:)\": \"devil\",\n            \"3:-)\": \"devil\",\n            \"O:)\": \"angel\",\n            \"O:-)\": \"angel\",\n            \":*\": \"kiss\",\n            \":-*\": \"kiss\",\n            \"\\u003C3\": \"heart\",\n            \"&lt;3\": \"heart\",\n            \"\\u2665\": \"heart\",\n            \"^_^\": \"kiki\",\n            \"-_-\": \"squint\",\n            \"o.O\": \"confused\",\n            \"O.o\": \"confused_rev\",\n            \"\\u003E:o\": \"upset\",\n            \"\\u003E:O\": \"upset\",\n            \"\\u003E:-O\": \"upset\",\n            \"\\u003E:-o\": \"upset\",\n            \"\\u003E_\\u003C\": \"upset\",\n            \"\\u003E.\\u003C\": \"upset\",\n            \":v\": \"pacman\",\n            \":|]\": \"robot\",\n            \":3\": \"colonthree\",\n            \"\\u003C(\\\")\": \"penguin\",\n            \":putnam:\": \"putnam\",\n            \"(^^^)\": \"shark\",\n            \"(y)\": \"like\",\n            \":like:\": \"like\",\n            \"(Y)\": \"like\",\n            \":poop:\": \"poop\"\n        },\n        symbols: {\n            smile: \":)\",\n            frown: \":(\",\n            tongue: \":P\",\n            grin: \"=D\",\n            gasp: \":o\",\n            wink: \";)\",\n            glasses: \"8)\",\n            sunglasses: \"B|\",\n            grumpy: \"\\u003E:(\",\n            unsure: \":/\",\n            cry: \":'(\",\n            devil: \"3:)\",\n            angel: \"O:)\",\n            kiss: \":*\",\n            heart: \"\\u003C3\",\n            kiki: \"^_^\",\n            squint: \"-_-\",\n            confused: \"o.O\",\n            confused_rev: \"O.o\",\n            upset: \"\\u003E:o\",\n            pacman: \":v\",\n            robot: \":|]\",\n            colonthree: \":3\",\n            penguin: \"\\u003C(\\\")\",\n            putnam: \":putnam:\",\n            shark: \"(^^^)\",\n            like: \"(y)\",\n            poop: \":poop:\"\n        },\n        regexp: /(^|[\\s'\".])(:\\)|:\\-\\)|:\\]|=\\)|:\\(|:\\-\\(|:\\[|=\\(|:P|:\\-P|:\\-p|:p|=P|=D|:\\-D|:D|:o|:\\-O|:O|:\\-o|;\\)|;\\-\\)|8\\)|8\\-\\)|B\\)|B\\-\\)|B\\||8\\-\\||8\\||B\\-\\||>:\\(|>:\\-\\(|:\\/|:\\-\\/|:\\\\|:\\-\\\\|=\\/|=\\\\|:'\\(|3:\\)|3:\\-\\)|O:\\)|O:\\-\\)|:\\*|:\\-\\*|<3|&lt;3|\\u2665|\\^_\\^|\\-_\\-|o\\.O|O\\.o|>:o|>:O|>:\\-O|>:\\-o|>_<|>\\.<|:v|:\\|\\]|:3|<\\(\"\\)|:putnam:|\\(\\^\\^\\^\\)|\\(y\\)|:like:|\\(Y\\)|:poop:)([\\s'\".,!?]|<br>|$)/\n    };\n});\n__d(\"createEmoteTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = 40;\n    function i(j) {\n        return function(k) {\n            var l = k, m = [], n = h;\n            while (n--) {\n                var o = j.regexp.exec(l);\n                if (((!o || !o.length))) {\n                    break;\n                }\n            ;\n            ;\n                var p = o[2], q = ((o.index + o[1].length)), r = l.substring(0, q);\n                if (r) {\n                    m.push({\n                        type: g.TEXT,\n                        text: r\n                    });\n                }\n            ;\n            ;\n                var s = j.emotes[p];\n                if (s) {\n                    m.push({\n                        type: g.EMOTE,\n                        text: p,\n                        emote: s\n                    });\n                }\n                 else m.push({\n                    type: g.TEXT,\n                    text: p\n                });\n            ;\n            ;\n                l = l.substring(((q + p.length)));\n            };\n        ;\n            if (l) {\n                m.push({\n                    type: g.TEXT,\n                    text: l\n                });\n            }\n        ;\n        ;\n            return m;\n        };\n    };\n;\n    e.exports = i;\n});\n__d(\"emoteFBIDTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = /\\[\\[([a-z\\d\\.]+)\\]\\]/gi;\n    function i(j) {\n        return j.split(h).map(function(k, l) {\n            if (((((l % 2)) === 0))) {\n                return {\n                    type: g.TEXT,\n                    text: k\n                };\n            }\n             else return {\n                type: g.EMOTE_FBID,\n                text: ((((\"[[\" + k)) + \"]]\")),\n                value: k\n            }\n        ;\n        });\n    };\n;\n    e.exports = i;\n});\n__d(\"Emote\", [\"DOM\",\"EmoteTypes\",\"EmoticonsList\",\"createEmoteTokenizer\",\"emoteFBIDTokenizer\",\"flattenArray\",\"htmlize\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoteTypes\"), i = b(\"EmoticonsList\"), j = b(\"createEmoteTokenizer\"), k = b(\"emoteFBIDTokenizer\"), l = b(\"flattenArray\"), m = b(\"htmlize\"), n = j(i), o = e.exports = {\n    };\n    o.htmlEmoteWithoutFBID = function(p, q) {\n        if (((typeof q != \"function\"))) {\n            q = m;\n        }\n    ;\n    ;\n        return l(n(p).map(function(r) {\n            if (((r.type === h.TEXT))) {\n                return q(r.text);\n            }\n             else if (((r.type === h.EMOTE))) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"span\", {\n                    title: r.text,\n                    className: ((\"emoticon emoticon_\" + r.emote))\n                })).innerHTML,];\n            }\n            \n        ;\n        ;\n        })).join(\"\");\n    };\n    o.htmlEmote = function(p, q) {\n        if (((typeof q != \"function\"))) {\n            q = m;\n        }\n    ;\n    ;\n        return l(k(p).map(function(r) {\n            if (((r.type === h.TEXT))) {\n                return o.htmlEmoteWithoutFBID(r.text, q);\n            }\n             else if (((r.type === h.EMOTE_FBID))) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"img\", {\n                    alt: r.text,\n                    className: \"emoticon emoticon_custom\",\n                    src: ((((((window.JSBNG__location.protocol + \"//graph.facebook.com/\")) + encodeURIComponent(r.value))) + \"/picture\"))\n                })).innerHTML,];\n            }\n            \n        ;\n        ;\n        })).join(\"\");\n    };\n});\n__d(\"SupportedEmoji\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        utf16Regex: /[\\u203C\\u2049\\u2100-\\u21FF\\u2300-\\u27FF\\u2900-\\u29FF\\u2B00-\\u2BFF\\u3000-\\u30FF\\u3200-\\u32FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDEFF]/,\n        emoji: {\n            127744: \"-cx-PRIVATE-fbEmoji__icon_1f300\",\n            127746: \"-cx-PRIVATE-fbEmoji__icon_1f302\",\n            127754: \"-cx-PRIVATE-fbEmoji__icon_1f30a\",\n            127769: \"-cx-PRIVATE-fbEmoji__icon_1f319\",\n            127775: \"-cx-PRIVATE-fbEmoji__icon_1f31f\",\n            127793: \"-cx-PRIVATE-fbEmoji__icon_1f331\",\n            127796: \"-cx-PRIVATE-fbEmoji__icon_1f334\",\n            127797: \"-cx-PRIVATE-fbEmoji__icon_1f335\",\n            127799: \"-cx-PRIVATE-fbEmoji__icon_1f337\",\n            127800: \"-cx-PRIVATE-fbEmoji__icon_1f338\",\n            127801: \"-cx-PRIVATE-fbEmoji__icon_1f339\",\n            127802: \"-cx-PRIVATE-fbEmoji__icon_1f33a\",\n            127803: \"-cx-PRIVATE-fbEmoji__icon_1f33b\",\n            127806: \"-cx-PRIVATE-fbEmoji__icon_1f33e\",\n            127808: \"-cx-PRIVATE-fbEmoji__icon_1f340\",\n            127809: \"-cx-PRIVATE-fbEmoji__icon_1f341\",\n            127810: \"-cx-PRIVATE-fbEmoji__icon_1f342\",\n            127811: \"-cx-PRIVATE-fbEmoji__icon_1f343\",\n            127818: \"-cx-PRIVATE-fbEmoji__icon_1f34a\",\n            127822: \"-cx-PRIVATE-fbEmoji__icon_1f34e\",\n            127827: \"-cx-PRIVATE-fbEmoji__icon_1f353\",\n            127828: \"-cx-PRIVATE-fbEmoji__icon_1f354\",\n            127864: \"-cx-PRIVATE-fbEmoji__icon_1f378\",\n            127866: \"-cx-PRIVATE-fbEmoji__icon_1f37a\",\n            127873: \"-cx-PRIVATE-fbEmoji__icon_1f381\",\n            127875: \"-cx-PRIVATE-fbEmoji__icon_1f383\",\n            127876: \"-cx-PRIVATE-fbEmoji__icon_1f384\",\n            127877: \"-cx-PRIVATE-fbEmoji__icon_1f385\",\n            127880: \"-cx-PRIVATE-fbEmoji__icon_1f388\",\n            127881: \"-cx-PRIVATE-fbEmoji__icon_1f389\",\n            127885: \"-cx-PRIVATE-fbEmoji__icon_1f38d\",\n            127886: \"-cx-PRIVATE-fbEmoji__icon_1f38e\",\n            127887: \"-cx-PRIVATE-fbEmoji__icon_1f38f\",\n            127888: \"-cx-PRIVATE-fbEmoji__icon_1f390\",\n            127891: \"-cx-PRIVATE-fbEmoji__icon_1f393\",\n            127925: \"-cx-PRIVATE-fbEmoji__icon_1f3b5\",\n            127926: \"-cx-PRIVATE-fbEmoji__icon_1f3b6\",\n            127932: \"-cx-PRIVATE-fbEmoji__icon_1f3bc\",\n            128013: \"-cx-PRIVATE-fbEmoji__icon_1f40d\",\n            128014: \"-cx-PRIVATE-fbEmoji__icon_1f40e\",\n            128017: \"-cx-PRIVATE-fbEmoji__icon_1f411\",\n            128018: \"-cx-PRIVATE-fbEmoji__icon_1f412\",\n            128020: \"-cx-PRIVATE-fbEmoji__icon_1f414\",\n            128023: \"-cx-PRIVATE-fbEmoji__icon_1f417\",\n            128024: \"-cx-PRIVATE-fbEmoji__icon_1f418\",\n            128025: \"-cx-PRIVATE-fbEmoji__icon_1f419\",\n            128026: \"-cx-PRIVATE-fbEmoji__icon_1f41a\",\n            128027: \"-cx-PRIVATE-fbEmoji__icon_1f41b\",\n            128031: \"-cx-PRIVATE-fbEmoji__icon_1f41f\",\n            128032: \"-cx-PRIVATE-fbEmoji__icon_1f420\",\n            128033: \"-cx-PRIVATE-fbEmoji__icon_1f421\",\n            128037: \"-cx-PRIVATE-fbEmoji__icon_1f425\",\n            128038: \"-cx-PRIVATE-fbEmoji__icon_1f426\",\n            128039: \"-cx-PRIVATE-fbEmoji__icon_1f427\",\n            128040: \"-cx-PRIVATE-fbEmoji__icon_1f428\",\n            128041: \"-cx-PRIVATE-fbEmoji__icon_1f429\",\n            128043: \"-cx-PRIVATE-fbEmoji__icon_1f42b\",\n            128044: \"-cx-PRIVATE-fbEmoji__icon_1f42c\",\n            128045: \"-cx-PRIVATE-fbEmoji__icon_1f42d\",\n            128046: \"-cx-PRIVATE-fbEmoji__icon_1f42e\",\n            128047: \"-cx-PRIVATE-fbEmoji__icon_1f42f\",\n            128048: \"-cx-PRIVATE-fbEmoji__icon_1f430\",\n            128049: \"-cx-PRIVATE-fbEmoji__icon_1f431\",\n            128051: \"-cx-PRIVATE-fbEmoji__icon_1f433\",\n            128052: \"-cx-PRIVATE-fbEmoji__icon_1f434\",\n            128053: \"-cx-PRIVATE-fbEmoji__icon_1f435\",\n            128054: \"-cx-PRIVATE-fbEmoji__icon_1f436\",\n            128055: \"-cx-PRIVATE-fbEmoji__icon_1f437\",\n            128056: \"-cx-PRIVATE-fbEmoji__icon_1f438\",\n            128057: \"-cx-PRIVATE-fbEmoji__icon_1f439\",\n            128058: \"-cx-PRIVATE-fbEmoji__icon_1f43a\",\n            128059: \"-cx-PRIVATE-fbEmoji__icon_1f43b\",\n            128062: \"-cx-PRIVATE-fbEmoji__icon_1f43e\",\n            128064: \"-cx-PRIVATE-fbEmoji__icon_1f440\",\n            128066: \"-cx-PRIVATE-fbEmoji__icon_1f442\",\n            128067: \"-cx-PRIVATE-fbEmoji__icon_1f443\",\n            128068: \"-cx-PRIVATE-fbEmoji__icon_1f444\",\n            128069: \"-cx-PRIVATE-fbEmoji__icon_1f445\",\n            128070: \"-cx-PRIVATE-fbEmoji__icon_1f446\",\n            128071: \"-cx-PRIVATE-fbEmoji__icon_1f447\",\n            128072: \"-cx-PRIVATE-fbEmoji__icon_1f448\",\n            128073: \"-cx-PRIVATE-fbEmoji__icon_1f449\",\n            128074: \"-cx-PRIVATE-fbEmoji__icon_1f44a\",\n            128075: \"-cx-PRIVATE-fbEmoji__icon_1f44b\",\n            128076: \"-cx-PRIVATE-fbEmoji__icon_1f44c\",\n            128077: \"-cx-PRIVATE-fbEmoji__icon_1f44d\",\n            128078: \"-cx-PRIVATE-fbEmoji__icon_1f44e\",\n            128079: \"-cx-PRIVATE-fbEmoji__icon_1f44f\",\n            128080: \"-cx-PRIVATE-fbEmoji__icon_1f450\",\n            128102: \"-cx-PRIVATE-fbEmoji__icon_1f466\",\n            128103: \"-cx-PRIVATE-fbEmoji__icon_1f467\",\n            128104: \"-cx-PRIVATE-fbEmoji__icon_1f468\",\n            128105: \"-cx-PRIVATE-fbEmoji__icon_1f469\",\n            128107: \"-cx-PRIVATE-fbEmoji__icon_1f46b\",\n            128110: \"-cx-PRIVATE-fbEmoji__icon_1f46e\",\n            128111: \"-cx-PRIVATE-fbEmoji__icon_1f46f\",\n            128113: \"-cx-PRIVATE-fbEmoji__icon_1f471\",\n            128114: \"-cx-PRIVATE-fbEmoji__icon_1f472\",\n            128115: \"-cx-PRIVATE-fbEmoji__icon_1f473\",\n            128116: \"-cx-PRIVATE-fbEmoji__icon_1f474\",\n            128117: \"-cx-PRIVATE-fbEmoji__icon_1f475\",\n            128118: \"-cx-PRIVATE-fbEmoji__icon_1f476\",\n            128119: \"-cx-PRIVATE-fbEmoji__icon_1f477\",\n            128120: \"-cx-PRIVATE-fbEmoji__icon_1f478\",\n            128123: \"-cx-PRIVATE-fbEmoji__icon_1f47b\",\n            128124: \"-cx-PRIVATE-fbEmoji__icon_1f47c\",\n            128125: \"-cx-PRIVATE-fbEmoji__icon_1f47d\",\n            128126: \"-cx-PRIVATE-fbEmoji__icon_1f47e\",\n            128127: \"-cx-PRIVATE-fbEmoji__icon_1f47f\",\n            128128: \"-cx-PRIVATE-fbEmoji__icon_1f480\",\n            128130: \"-cx-PRIVATE-fbEmoji__icon_1f482\",\n            128131: \"-cx-PRIVATE-fbEmoji__icon_1f483\",\n            128133: \"-cx-PRIVATE-fbEmoji__icon_1f485\",\n            128139: \"-cx-PRIVATE-fbEmoji__icon_1f48b\",\n            128143: \"-cx-PRIVATE-fbEmoji__icon_1f48f\",\n            128144: \"-cx-PRIVATE-fbEmoji__icon_1f490\",\n            128145: \"-cx-PRIVATE-fbEmoji__icon_1f491\",\n            128147: \"-cx-PRIVATE-fbEmoji__icon_1f493\",\n            128148: \"-cx-PRIVATE-fbEmoji__icon_1f494\",\n            128150: \"-cx-PRIVATE-fbEmoji__icon_1f496\",\n            128151: \"-cx-PRIVATE-fbEmoji__icon_1f497\",\n            128152: \"-cx-PRIVATE-fbEmoji__icon_1f498\",\n            128153: \"-cx-PRIVATE-fbEmoji__icon_1f499\",\n            128154: \"-cx-PRIVATE-fbEmoji__icon_1f49a\",\n            128155: \"-cx-PRIVATE-fbEmoji__icon_1f49b\",\n            128156: \"-cx-PRIVATE-fbEmoji__icon_1f49c\",\n            128157: \"-cx-PRIVATE-fbEmoji__icon_1f49d\",\n            128162: \"-cx-PRIVATE-fbEmoji__icon_1f4a2\",\n            128164: \"-cx-PRIVATE-fbEmoji__icon_1f4a4\",\n            128166: \"-cx-PRIVATE-fbEmoji__icon_1f4a6\",\n            128168: \"-cx-PRIVATE-fbEmoji__icon_1f4a8\",\n            128169: \"-cx-PRIVATE-fbEmoji__icon_1f4a9\",\n            128170: \"-cx-PRIVATE-fbEmoji__icon_1f4aa\",\n            128187: \"-cx-PRIVATE-fbEmoji__icon_1f4bb\",\n            128189: \"-cx-PRIVATE-fbEmoji__icon_1f4bd\",\n            128190: \"-cx-PRIVATE-fbEmoji__icon_1f4be\",\n            128191: \"-cx-PRIVATE-fbEmoji__icon_1f4bf\",\n            128192: \"-cx-PRIVATE-fbEmoji__icon_1f4c0\",\n            128222: \"-cx-PRIVATE-fbEmoji__icon_1f4de\",\n            128224: \"-cx-PRIVATE-fbEmoji__icon_1f4e0\",\n            128241: \"-cx-PRIVATE-fbEmoji__icon_1f4f1\",\n            128242: \"-cx-PRIVATE-fbEmoji__icon_1f4f2\",\n            128250: \"-cx-PRIVATE-fbEmoji__icon_1f4fa\",\n            128276: \"-cx-PRIVATE-fbEmoji__icon_1f514\",\n            128293: \"-cx-PRIVATE-fbEmoji__icon_1f525\",\n            128513: \"-cx-PRIVATE-fbEmoji__icon_1f601\",\n            128514: \"-cx-PRIVATE-fbEmoji__icon_1f602\",\n            128515: \"-cx-PRIVATE-fbEmoji__icon_1f603\",\n            128516: \"-cx-PRIVATE-fbEmoji__icon_1f604\",\n            128518: \"-cx-PRIVATE-fbEmoji__icon_1f606\",\n            128521: \"-cx-PRIVATE-fbEmoji__icon_1f609\",\n            128523: \"-cx-PRIVATE-fbEmoji__icon_1f60b\",\n            128524: \"-cx-PRIVATE-fbEmoji__icon_1f60c\",\n            128525: \"-cx-PRIVATE-fbEmoji__icon_1f60d\",\n            128527: \"-cx-PRIVATE-fbEmoji__icon_1f60f\",\n            128530: \"-cx-PRIVATE-fbEmoji__icon_1f612\",\n            128531: \"-cx-PRIVATE-fbEmoji__icon_1f613\",\n            128532: \"-cx-PRIVATE-fbEmoji__icon_1f614\",\n            128534: \"-cx-PRIVATE-fbEmoji__icon_1f616\",\n            128536: \"-cx-PRIVATE-fbEmoji__icon_1f618\",\n            128538: \"-cx-PRIVATE-fbEmoji__icon_1f61a\",\n            128540: \"-cx-PRIVATE-fbEmoji__icon_1f61c\",\n            128541: \"-cx-PRIVATE-fbEmoji__icon_1f61d\",\n            128542: \"-cx-PRIVATE-fbEmoji__icon_1f61e\",\n            128544: \"-cx-PRIVATE-fbEmoji__icon_1f620\",\n            128545: \"-cx-PRIVATE-fbEmoji__icon_1f621\",\n            128546: \"-cx-PRIVATE-fbEmoji__icon_1f622\",\n            128547: \"-cx-PRIVATE-fbEmoji__icon_1f623\",\n            128548: \"-cx-PRIVATE-fbEmoji__icon_1f624\",\n            128549: \"-cx-PRIVATE-fbEmoji__icon_1f625\",\n            128552: \"-cx-PRIVATE-fbEmoji__icon_1f628\",\n            128553: \"-cx-PRIVATE-fbEmoji__icon_1f629\",\n            128554: \"-cx-PRIVATE-fbEmoji__icon_1f62a\",\n            128555: \"-cx-PRIVATE-fbEmoji__icon_1f62b\",\n            128557: \"-cx-PRIVATE-fbEmoji__icon_1f62d\",\n            128560: \"-cx-PRIVATE-fbEmoji__icon_1f630\",\n            128561: \"-cx-PRIVATE-fbEmoji__icon_1f631\",\n            128562: \"-cx-PRIVATE-fbEmoji__icon_1f632\",\n            128563: \"-cx-PRIVATE-fbEmoji__icon_1f633\",\n            128565: \"-cx-PRIVATE-fbEmoji__icon_1f635\",\n            128567: \"-cx-PRIVATE-fbEmoji__icon_1f637\",\n            128568: \"-cx-PRIVATE-fbEmoji__icon_1f638\",\n            128569: \"-cx-PRIVATE-fbEmoji__icon_1f639\",\n            128570: \"-cx-PRIVATE-fbEmoji__icon_1f63a\",\n            128571: \"-cx-PRIVATE-fbEmoji__icon_1f63b\",\n            128572: \"-cx-PRIVATE-fbEmoji__icon_1f63c\",\n            128573: \"-cx-PRIVATE-fbEmoji__icon_1f63d\",\n            128575: \"-cx-PRIVATE-fbEmoji__icon_1f63f\",\n            128576: \"-cx-PRIVATE-fbEmoji__icon_1f640\",\n            128587: \"-cx-PRIVATE-fbEmoji__icon_1f64b\",\n            128588: \"-cx-PRIVATE-fbEmoji__icon_1f64c\",\n            128589: \"-cx-PRIVATE-fbEmoji__icon_1f64d\",\n            128591: \"-cx-PRIVATE-fbEmoji__icon_1f64f\",\n            9757: \"-cx-PRIVATE-fbEmoji__icon_261d\",\n            9786: \"-cx-PRIVATE-fbEmoji__icon_263a\",\n            9889: \"-cx-PRIVATE-fbEmoji__icon_26a1\",\n            9924: \"-cx-PRIVATE-fbEmoji__icon_26c4\",\n            9994: \"-cx-PRIVATE-fbEmoji__icon_270a\",\n            9995: \"-cx-PRIVATE-fbEmoji__icon_270b\",\n            9996: \"-cx-PRIVATE-fbEmoji__icon_270c\",\n            9728: \"-cx-PRIVATE-fbEmoji__icon_2600\",\n            9729: \"-cx-PRIVATE-fbEmoji__icon_2601\",\n            9748: \"-cx-PRIVATE-fbEmoji__icon_2614\",\n            9749: \"-cx-PRIVATE-fbEmoji__icon_2615\",\n            10024: \"-cx-PRIVATE-fbEmoji__icon_2728\",\n            10084: \"-cx-PRIVATE-fbEmoji__icon_2764\"\n        }\n    };\n});\n__d(\"Utf16\", [], function(a, b, c, d, e, f) {\n    var g = {\n        decode: function(h) {\n            switch (h.length) {\n              case 1:\n                return h.charCodeAt(0);\n              case 2:\n                return ((((65536 | ((((h.charCodeAt(0) - 55296)) * 1024)))) | ((h.charCodeAt(1) - 56320))));\n            };\n        ;\n        },\n        encode: function(h) {\n            if (((h < 65536))) {\n                return String.fromCharCode(h);\n            }\n             else return ((String.fromCharCode(((55296 + ((((h - 65536)) >> 10))))) + String.fromCharCode(((56320 + ((h % 1024)))))))\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"Emoji\", [\"cx\",\"DOM\",\"Emote\",\"SupportedEmoji\",\"htmlize\",\"Utf16\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"Emote\"), j = b(\"SupportedEmoji\"), k = b(\"htmlize\"), l = b(\"Utf16\"), m = 40, n = e.exports = {\n        htmlEmojiAndEmote: function(o, p) {\n            return n.htmlEmoji(o, function(q) {\n                return i.htmlEmote(q, p);\n            });\n        },\n        htmlEmoji: function(o, p) {\n            if (((typeof p != \"function\"))) {\n                p = k;\n            }\n        ;\n        ;\n            var q = o, r = [], s = m;\n            while (s--) {\n                var t = j.utf16Regex.exec(q);\n                if (((!t || !t.length))) {\n                    break;\n                }\n            ;\n            ;\n                var u = t[0], v = t.index;\n                r.push(p(q.substring(0, v)));\n                var w = l.decode(u);\n                if (j.emoji[w]) {\n                    var x = ((((\"-cx-PRIVATE-fbEmoji__icon -cx-PRIVATE-fbEmoji__size_16\" + \" \")) + j.emoji[w])), y = h.create(\"span\", {\n                        className: x\n                    });\n                    r.push(h.create(\"span\", {\n                    }, y).innerHTML);\n                }\n                 else r.push(p(u));\n            ;\n            ;\n                q = q.substring(((v + u.length)));\n            };\n        ;\n            r.push(p(q));\n            return r.join(\"\");\n        }\n    };\n});\n__d(\"TextWithEmoticons.react\", [\"Emoji\",\"Emote\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"Emoji\"), h = b(\"Emote\"), i = b(\"React\"), j = i.createClass({\n        displayName: \"ReactTextWithEmoticons\",\n        render: function() {\n            if (((!this.props.renderEmoticons && !this.props.renderEmoji))) {\n                return i.DOM.span(null, this.props.text);\n            }\n        ;\n        ;\n            var k;\n            if (((this.props.renderEmoticons && this.props.renderEmoji))) {\n                k = g.htmlEmoji(this.props.text, h.htmlEmoteWithoutFBID);\n            }\n             else if (this.props.renderEmoticons) {\n                k = h.htmlEmoteWithoutFBID(this.props.text);\n            }\n             else k = g.htmlEmoji(this.props.text);\n            \n        ;\n        ;\n            return i.DOM.span({\n                dangerouslySetInnerHTML: {\n                    __html: k\n                }\n            });\n        }\n    });\n    e.exports = j;\n});\n__d(\"TextWithEntities.react\", [\"Link.react\",\"React\",\"TextWithEmoticons.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"React\"), i = b(\"TextWithEmoticons.react\");\n    function j(o) {\n        return (o).replace(/<3\\b|&hearts;/g, \"\\u2665\");\n    };\n;\n    function k(o, p) {\n        return (g({\n            href: p.entities[0]\n        }, o));\n    };\n;\n    function l(o, p) {\n        return ((o.offset - p.offset));\n    };\n;\n    var m = /(\\r\\n|[\\r\\n])/, n = h.createClass({\n        displayName: \"ReactTextWithEntities\",\n        _formatStandardText: function(o) {\n            var p = o.split(m), q = [];\n            for (var r = 0; ((r < p.length)); r++) {\n                var s = p[r];\n                if (s) {\n                    if (m.test(s)) {\n                        q.push(h.DOM.br(null));\n                    }\n                     else if (((this.props.renderEmoticons || this.props.renderEmoji))) {\n                        q.push(i({\n                            text: s,\n                            renderEmoticons: this.props.renderEmoticons,\n                            renderEmoji: this.props.renderEmoji\n                        }));\n                    }\n                     else q.push(j(s));\n                    \n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        },\n        render: function() {\n            var o = 0, p = this.props.ranges, q = this.props.aggregatedRanges, r = this.props.text, s = null;\n            if (p) {\n                s = ((q ? p.concat(q) : p.slice()));\n            }\n             else if (q) {\n                s = q.slice();\n            }\n            \n        ;\n        ;\n            if (s) {\n                s.sort(l);\n            }\n        ;\n        ;\n            var t = [], u = ((s ? s.length : 0));\n            for (var v = 0, w = u; ((v < w)); v++) {\n                var x = s[v];\n                if (((x.offset < o))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((x.offset > o))) {\n                    t = t.concat(this._formatStandardText(r.substring(o, x.offset)));\n                }\n            ;\n            ;\n                var y = r.substr(x.offset, x.length);\n                t = t.concat([((this.props.interpolator ? this.props.interpolator(y, x) : k(y, x))),]);\n                o = ((x.offset + x.length));\n            };\n        ;\n            if (((r.length > o))) {\n                t = t.concat(this._formatStandardText(r.substr(o)));\n            }\n        ;\n        ;\n            return h.DOM.span(null, t);\n        }\n    });\n    e.exports = n;\n});\n__d(\"SeeMore.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"SeeMore\",\n        getInitialState: function() {\n            return {\n                isCollapsed: true\n            };\n        },\n        handleClick: function() {\n            this.setState({\n                isCollapsed: false\n            });\n        },\n        render: function() {\n            var j = this.state.isCollapsed, k = ((!j ? null : g.DOM.span(null, \"...\"))), l = this.props.children[0], m = ((j ? null : g.DOM.span(null, this.props.children[1]))), n = ((!j ? null : g.DOM.a({\n                className: \"SeeMoreLink fss\",\n                onClick: this.handleClick,\n                href: \"#\",\n                role: \"button\"\n            }, \"See More\")));\n            return (g.DOM.span({\n                className: this.props.className\n            }, l, k, n, m));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TruncatedTextWithEntities.react\", [\"React\",\"TextWithEntities.react\",\"SeeMore.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TextWithEntities.react\"), i = b(\"SeeMore.react\");\n    function j(n, o) {\n        var p = ((n.offset + n.length));\n        return ((((o > n.offset)) && ((o < p))));\n    };\n;\n    function k(n, o) {\n        for (var p = 0; ((p < n.length)); p++) {\n            var q = n[p];\n            if (j(q, o)) {\n                return q.offset;\n            }\n        ;\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    var l = function(n, o, p) {\n        var q = [], r = [], s = k(o, p);\n        for (var t = 0; ((t < o.length)); t++) {\n            var u = o[t];\n            if (((u.offset < s))) {\n                q.push(u);\n            }\n             else r.push({\n                offset: ((u.offset - s)),\n                length: u.length,\n                entities: u.entities\n            });\n        ;\n        ;\n        };\n    ;\n        return {\n            first: {\n                ranges: q,\n                text: n.substr(0, s)\n            },\n            second: {\n                ranges: r,\n                text: n.substr(s)\n            }\n        };\n    }, m = g.createClass({\n        displayName: \"TruncatedTextWithEntities\",\n        render: function() {\n            var n = this.props.maxLines, o = this.props.maxLength, p = ((this.props.truncationPercent || 181889)), q = Math.floor(((p * o))), r = ((this.props.text || \"\")), s = ((this.props.ranges || [])), t = r.split(\"\\u000a\"), u = ((t.length - 1)), v = ((o && ((r.length > o)))), w = ((n && ((u > n))));\n            if (w) {\n                q = Math.min(t.slice(0, n).join(\"\\u000a\").length, q);\n            }\n        ;\n        ;\n            if (((v || w))) {\n                var x = l(r, s, q);\n                return (g.DOM.span({\n                    \"data-ft\": this.props[\"data-ft\"],\n                    dir: this.props.dir\n                }, i({\n                    className: this.props.className\n                }, h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.first.ranges,\n                    text: x.first.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }), h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.second.ranges,\n                    text: x.second.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }))));\n            }\n             else return (g.DOM.span({\n                \"data-ft\": this.props[\"data-ft\"],\n                dir: this.props.dir\n            }, h({\n                className: this.props.className,\n                interpolator: this.props.interpolator,\n                ranges: s,\n                text: r,\n                renderEmoticons: this.props.renderEmoticons,\n                renderEmoji: this.props.renderEmoji\n            })))\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFICommentAttachment.react\", [\"DOM\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"UFICommentAttachment\",\n        _attachmentFromCommentData: function(j) {\n            return ((j.photo_comment || j.attachment));\n        },\n        componentDidMount: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            if (k) {\n                this.renderAttachment(k);\n            }\n        ;\n        ;\n        },\n        shouldComponentUpdate: function(j, k) {\n            var l = this._attachmentFromCommentData(this.props.comment), m = this._attachmentFromCommentData(j.comment);\n            if (((!l && !m))) {\n                return false;\n            }\n        ;\n        ;\n            if (((((!l || !m)) || ((l.markup != m.markup))))) {\n                return true;\n            }\n             else return false\n        ;\n        },\n        componentDidUpdate: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            this.renderAttachment(k);\n        },\n        renderAttachment: function(j) {\n            if (((j && this.refs.contents))) {\n                g.setContent(this.refs.contents.getDOMNode(), j.markup);\n            }\n        ;\n        ;\n        },\n        render: function() {\n            if (this._attachmentFromCommentData(this.props.comment)) {\n                return h.DOM.div({\n                    ref: \"contents\"\n                });\n            }\n             else return h.DOM.span(null)\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIReplyLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFIReplyLink\",\n        render: function() {\n            return (g.DOM.a({\n                className: \"UFIReplyLink\",\n                href: \"#\",\n                onClick: this.props.onClick\n            }, \"Reply\"));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFISpamCount\", [\"UFISpamCountImpl\",], function(a, b, c, d, e, f) {\n    e.exports = ((b(\"UFISpamCountImpl\").module || {\n        enabled: false\n    }));\n});\n__d(\"UFIComment.react\", [\"function-extensions\",\"Bootloader\",\"CloseButton.react\",\"Env\",\"Focus\",\"HovercardLink\",\"HovercardLinkInterpolator\",\"LinkButton\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"Timestamp.react\",\"TrackingNodes\",\"TruncatedTextWithEntities.react\",\"UFIClassNames\",\"UFICommentAttachment.react\",\"UFIConfig\",\"UFIConstants\",\"UFIImageBlock.react\",\"UFIInstanceState\",\"UFIReplyLink.react\",\"UFISpamCount\",\"URI\",\"cx\",\"keyMirror\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CloseButton.react\"), i = b(\"Env\"), j = b(\"Focus\"), k = b(\"HovercardLink\"), l = b(\"HovercardLinkInterpolator\"), m = b(\"LinkButton\"), n = b(\"NumberFormat\"), o = b(\"ProfileBrowserLink\"), p = b(\"ProfileBrowserTypes\"), q = b(\"React\"), r = b(\"Timestamp.react\"), s = b(\"TrackingNodes\"), t = b(\"TruncatedTextWithEntities.react\"), u = b(\"UFIClassNames\"), v = b(\"UFICommentAttachment.react\"), w = b(\"UFIConfig\"), x = b(\"UFIConstants\"), y = b(\"UFIImageBlock.react\"), z = b(\"UFIInstanceState\"), aa = b(\"UFIReplyLink.react\"), ba = b(\"UFISpamCount\"), ca = b(\"URI\"), da = b(\"cx\"), ea = b(\"keyMirror\"), fa = b(\"joinClasses\"), ga = b(\"tx\"), ha = x.UFIStatus, ia = \" \\u00b7 \", ja = ea({\n        edit: true,\n        hide: true,\n        remove: true\n    }), ka = \"UFICommentBody\", la = \"UFICommentActorName\", ma = \"UFICommentNotSpamLink\", na = \"fsm fwn fcg UFICommentActions\", oa = \"UFIDeletedMessageIcon\", pa = \"UFIDeletedMessage\", qa = \"UFIFailureMessageIcon\", ra = \"UFIFailureMessage\", sa = \"UFICommentLikeButton\", ta = \"UFICommentLikeIcon\", ua = \"UFITranslateLink\", va = \"UFITranslatedText\", wa = \"uiLinkSubtle\", xa = \"stat_elem\", ya = \"pls\", za = \"fcg\", ab = 27, bb = null, cb = function(kb, lb) {\n        var mb = new ca(\"/ajax/like/tooltip.php\").setQueryData({\n            comment_fbid: kb.fbid,\n            comment_from: kb.author,\n            cache_buster: ((kb.likeconfirmhash || 0))\n        });\n        if (lb) {\n            mb.addQueryData({\n                viewas: lb\n            });\n        }\n    ;\n    ;\n        return mb;\n    }, db = function(kb) {\n        var lb = kb.JSBNG__status;\n        return ((((lb === ha.FAILED_ADD)) || ((lb === ha.FAILED_EDIT))));\n    };\n    function eb(kb) {\n        return ((((((kb.commenterIsFOF !== undefined)) && ((kb.userIsMinor !== undefined)))) && ((kb.reportLink !== undefined))));\n    };\n;\n    var fb = q.createClass({\n        displayName: \"UFICommentLikeCount\",\n        render: function() {\n            var kb = this.props.comment, lb = n.formatIntegerWithDelimiter(((kb.likecount || 0)), this.props.contextArgs.numberdelimiter), mb = p.LIKES, nb = {\n                id: kb.fbid\n            }, ob = cb(this.props.comment, this.props.viewas), pb = q.DOM.i({\n                className: ta\n            }), qb = q.DOM.span(null, lb);\n            return (q.DOM.a({\n                className: sa,\n                role: \"button\",\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": ob.toString(),\n                ajaxify: o.constructDialogURI(mb, nb).toString(),\n                href: o.constructPageURI(mb, nb).toString()\n            }, pb, qb));\n        }\n    }), gb = q.createClass({\n        displayName: \"UFICommentActions\",\n        render: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.markedAsSpamHere, ob = ((lb.JSBNG__status === ha.SPAM_DISPLAY)), pb = this.props.showReplyLink, qb = this.props.hideAsSpamForPageAdmin, rb, sb, tb, ub, vb, wb, xb = ((!lb.islocal && ((lb.JSBNG__status !== ha.LIVE_DELETED))));\n            if (xb) {\n                if (((ob && !nb))) {\n                    if (kb.viewerCanMarkNotSpam) {\n                        rb = q.DOM.a({\n                            onClick: kb.onMarkAsNotSpam,\n                            className: ma,\n                            href: \"#\",\n                            role: \"button\"\n                        }, \"Unhide\");\n                    }\n                ;\n                ;\n                    if (((((((qb && mb.isthreaded)) && mb.cancomment)) && pb))) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    }\n                ;\n                ;\n                }\n                 else {\n                    if (mb.viewercanlike) {\n                        var yb = s.getTrackingInfo(((lb.hasviewerliked ? s.types.UNLIKE_LINK : s.types.LIKE_LINK))), zb = ((lb.hasviewerliked ? \"Unlike this comment\" : \"Like this comment\"));\n                        sb = q.DOM.a({\n                            className: \"UFILikeLink\",\n                            href: \"#\",\n                            role: \"button\",\n                            onClick: kb.onCommentLikeToggle,\n                            \"data-ft\": yb,\n                            title: zb\n                        }, ((lb.hasviewerliked ? \"Unlike\" : \"Like\")));\n                    }\n                ;\n                ;\n                    if (((((mb.isthreaded && mb.cancomment)) && pb))) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    }\n                ;\n                ;\n                    if (((lb.likecount > 0))) {\n                        tb = fb({\n                            comment: lb,\n                            viewas: this.props.viewas,\n                            contextArgs: this.props.contextArgs\n                        });\n                    }\n                ;\n                ;\n                    if (((lb.spamcount && ba.enabled))) {\n                        ub = ba({\n                            count: lb.spamcount\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (((lb.attachment && lb.canremove))) {\n                    wb = q.DOM.a({\n                        onClick: kb.onPreviewRemove,\n                        href: \"#\",\n                        role: \"button\"\n                    }, \"Remove Preview\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ac = hb({\n                comment: lb,\n                onRetrySubmit: kb.onRetrySubmit,\n                showPermalink: kb.showPermalink\n            }), bc;\n            if (kb.contextArgs.entstream) {\n                bc = [ac,sb,tb,vb,ub,rb,wb,];\n            }\n             else if (mb.isthreaded) {\n                bc = [sb,vb,rb,wb,tb,ub,ac,];\n            }\n             else bc = [ac,sb,tb,ub,vb,rb,wb,];\n            \n        ;\n        ;\n            if (((lb.JSBNG__status === ha.LIVE_DELETED))) {\n                var cc = q.DOM.span({\n                    className: pa\n                }, q.DOM.i({\n                    className: oa,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Comment deleted\"\n                }));\n                bc.push(cc);\n            }\n        ;\n        ;\n            var dc = [];\n            for (var ec = 0; ((ec < bc.length)); ec++) {\n                if (bc[ec]) {\n                    dc.push(ia);\n                    dc.push(bc[ec]);\n                }\n            ;\n            ;\n            };\n        ;\n            dc.shift();\n            return (q.DOM.div({\n                className: na\n            }, dc));\n        }\n    }), hb = q.createClass({\n        displayName: \"UFICommentMetadata\",\n        render: function() {\n            var kb = this.props.comment, lb = this.props.onRetrySubmit, mb, nb;\n            if (db(kb)) {\n                mb = [q.DOM.span({\n                    className: ra\n                }, q.DOM.i({\n                    className: qa\n                }), \"Unable to post comment.\"),((((kb.allowRetry && lb)) ? [\" \",q.DOM.a({\n                    onClick: lb,\n                    href: \"#\",\n                    role: \"button\"\n                }, \"Try Again\"),] : null)),];\n            }\n             else {\n                var ob = ((this.props.showPermalink ? kb.permalink : null)), pb = s.getTrackingInfo(s.types.SOURCE), qb = q.DOM.a({\n                    className: wa,\n                    href: ob,\n                    \"data-ft\": pb\n                }, r({\n                    time: kb.timestamp.time,\n                    text: kb.timestamp.text,\n                    verbose: kb.timestamp.verbose\n                })), rb;\n                switch (kb.source) {\n                  case x.UFISourceType.MOBILE:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/\").setSubdomain(\"www\").toString()\n                    }, \"mobile\");\n                    break;\n                  case x.UFISourceType.SMS:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/?v=texts\").setSubdomain(\"www\").toString()\n                    }, \"text message\");\n                    break;\n                  case x.UFISourceType.EMAIL:\n                    rb = m({\n                        subtle: true,\n                        label: \"email\",\n                        inputType: \"submit\",\n                        JSBNG__name: \"email_explain\",\n                        value: true,\n                        className: xa\n                    });\n                    break;\n                };\n            ;\n                nb = ((rb ? ga._(\"{time} via {source}\", {\n                    time: qb,\n                    source: rb\n                }) : qb));\n            }\n        ;\n        ;\n            var sb = null;\n            if (kb.originalTimestamp) {\n                var tb = new ca(\"/ajax/edits/browser/comment\").addQueryData({\n                    comment_token: kb.id\n                }).toString();\n                sb = [ia,q.DOM.a({\n                    ref: \"EditLink\",\n                    href: \"#\",\n                    role: \"button\",\n                    rel: \"dialog\",\n                    className: \"uiLinkSubtle\",\n                    ajaxify: tb,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Show edit history\",\n                    title: \"Show edit history\"\n                }, \"Edited\"),];\n            }\n        ;\n        ;\n            return (q.DOM.span(null, nb, mb, sb));\n        },\n        componentWillUpdate: function(kb) {\n            var lb = this.props.comment, mb = kb.comment;\n            if (((!lb.editnux && !!mb.editnux))) {\n                g.loadModules([\"LegacyContextualDialog\",], function(nb) {\n                    var ob = new nb();\n                    ob.init(mb.editnux).setContext(this.refs.EditLink.getDOMNode()).setWidth(300).setPosition(\"below\").show();\n                }.bind(this));\n            }\n        ;\n        ;\n        }\n    }), ib = q.createClass({\n        displayName: \"UFISocialContext\",\n        render: function() {\n            var kb = this.props.topMutualFriend, lb = this.props.otherMutualCount, mb = this.props.commentAuthor, nb = k.constructEndpoint(kb).toString(), ob = q.DOM.a({\n                href: kb.uri,\n                \"data-hovercard\": nb\n            }, kb.JSBNG__name), pb = ((mb.JSBNG__name.length + kb.JSBNG__name.length)), qb;\n            if (((lb === 0))) {\n                qb = ga._(\"Friends with {name}\", {\n                    JSBNG__name: ob\n                });\n            }\n             else if (((pb < ab))) {\n                var rb;\n                if (((lb == 1))) {\n                    rb = \"1 other\";\n                }\n                 else rb = ga._(\"{count} others\", {\n                    count: lb\n                });\n            ;\n            ;\n                qb = ga._(\"Friends with {name} and {others}\", {\n                    JSBNG__name: ob,\n                    others: this.getOthersLink(rb, mb, kb)\n                });\n            }\n             else {\n                var sb = ga._(\"{count} mutual friends\", {\n                    count: ((lb + 1))\n                });\n                qb = this.getOthersLink(sb, mb);\n            }\n            \n        ;\n        ;\n            return (q.DOM.span({\n                className: \"UFICommentSocialContext\"\n            }, ia, qb));\n        },\n        getOthersLink: function(kb, lb, mb) {\n            var nb = p.MUTUAL_FRIENDS, ob = {\n                uid: lb.id\n            }, pb = new ca(\"/ajax/mutual_friends/tooltip.php\").setQueryData({\n                friend_id: lb.id\n            });\n            if (mb) {\n                pb.addQueryData({\n                    exclude_id: mb.id\n                });\n            }\n        ;\n        ;\n            var qb = o.constructDialogURI(nb, ob).toString();\n            return (q.DOM.a({\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": pb.toString(),\n                ajaxify: qb,\n                href: o.constructPageURI(nb, ob).toString()\n            }, kb));\n        }\n    }), jb = q.createClass({\n        displayName: \"UFIComment\",\n        getInitialState: function() {\n            return {\n                isHighlighting: this.props.comment.highlightcomment,\n                wasHighlighted: this.props.comment.highlightcomment,\n                markedAsSpamHere: false,\n                oneClickRemovedHere: false,\n                isInlinePageDeleted: false,\n                isInlineBanned: false\n            };\n        },\n        _onHideAsSpam: function(JSBNG__event) {\n            this.props.onHideAsSpam(JSBNG__event);\n            this.setState({\n                markedAsSpamHere: true\n            });\n        },\n        _onMarkAsNotSpam: function(JSBNG__event) {\n            this.props.onMarkAsNotSpam(JSBNG__event);\n            this.setState({\n                markedAsSpamHere: false\n            });\n        },\n        _onDeleteSpam: function(JSBNG__event) {\n            this.props.onOneClickRemove(JSBNG__event);\n            this.setState({\n                isInlinePageDeleted: true\n            });\n        },\n        _onUndoDeleteSpam: function(JSBNG__event) {\n            this.props.onUndoOneClickRemove(JSBNG__event);\n            this.setState({\n                isInlinePageDeleted: false\n            });\n        },\n        _onInlineBan: function(JSBNG__event) {\n            this.props.onInlineBan(JSBNG__event);\n            this.setState({\n                isInlineBanned: true\n            });\n        },\n        _onUndoInlineBan: function(JSBNG__event) {\n            this.props.onUndoInlineBan(JSBNG__event);\n            this.setState({\n                isInlineBanned: false\n            });\n        },\n        _onOneClickRemove: function(JSBNG__event) {\n            this.props.onOneClickRemove(JSBNG__event);\n            this.setState({\n                oneClickRemovedHere: true\n            });\n        },\n        _onUndoOneClickRemove: function(JSBNG__event) {\n            this.props.onUndoOneClickRemove(JSBNG__event);\n            this.setState({\n                oneClickRemovedHere: false\n            });\n        },\n        _onAction: function(JSBNG__event, kb) {\n            if (((kb === ja.remove))) {\n                this.props.onRemove(JSBNG__event);\n            }\n             else if (((kb === ja.edit))) {\n                this.props.onEdit(JSBNG__event);\n            }\n             else if (((kb === ja.hide))) {\n                this._onHideAsSpam(JSBNG__event);\n            }\n            \n            \n        ;\n        ;\n        },\n        _createRemoveReportMenu: function(JSBNG__event) {\n            if (this._removeReportMenu) {\n                return;\n            }\n        ;\n        ;\n            var kb = [{\n                label: \"Delete Comment...\",\n                value: ja.remove\n            },{\n                label: \"Hide Comment\",\n                value: ja.hide\n            },];\n            if (JSBNG__event.persist) {\n                JSBNG__event.persist();\n            }\n             else JSBNG__event = JSBNG__event.constructor.persistentCloneOf(JSBNG__event);\n        ;\n        ;\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._removeReportMenu = lb.createAndShowPopoverMenu(JSBNG__event.target, kb, this._onAction.bind(this, JSBNG__event));\n            }.bind(this));\n        },\n        _createEditDeleteMenu: function(JSBNG__event) {\n            if (JSBNG__event.persist) {\n                JSBNG__event.persist();\n            }\n             else JSBNG__event = JSBNG__event.constructor.persistentCloneOf(JSBNG__event);\n        ;\n        ;\n            if (this._editDeleteMenu) {\n                return;\n            }\n        ;\n        ;\n            var kb = [{\n                label: \"Edit...\",\n                value: ja.edit\n            },{\n                label: \"Delete...\",\n                value: ja.remove\n            },];\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._editDeleteMenu = lb.createAndShowPopoverMenu(JSBNG__event.target, kb, this._onAction.bind(this, JSBNG__event));\n            }.bind(this));\n        },\n        _renderCloseButton: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = null, nb = null, ob = false;\n            if (((kb.canremove && !this.props.hideAsSpamForPageAdmin))) {\n                if (this.props.viewerIsAuthor) {\n                    if (kb.canedit) {\n                        nb = \"Edit or Delete\";\n                        mb = this._createEditDeleteMenu;\n                        ob = true;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this.props.onRemove;\n                    }\n                ;\n                ;\n                }\n                 else if (lb.canremoveall) {\n                    if (this.props.showRemoveReportMenu) {\n                        nb = \"Remove or Report\";\n                        mb = this._createRemoveReportMenu;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this._onOneClickRemove;\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            }\n             else if (kb.canreport) {\n                nb = \"Hide\";\n                mb = this._onHideAsSpam;\n            }\n            \n        ;\n        ;\n            var pb = (((((\"UFICommentCloseButton\") + ((ob ? ((\" \" + \"UFIEditButton\")) : \"\")))) + ((((mb === null)) ? ((\" \" + \"hdn\")) : \"\"))));\n            return (h({\n                onClick: mb,\n                tooltip: nb,\n                className: pb\n            }));\n        },\n        componentDidMount: function(kb) {\n            var lb = this.props.comment.ufiinstanceid;\n            if (this.state.isHighlighting) {\n                g.loadModules([\"UFIScrollHighlight\",], function(nb) {\n                    nb.actOn.curry(kb).defer();\n                });\n                this.setState({\n                    isHighlighting: false\n                });\n            }\n        ;\n        ;\n            var mb = z.getKeyForInstance(lb, \"autofocus\");\n            if (mb) {\n                j.setWithoutOutline(this.refs.AuthorName.getDOMNode());\n                z.updateState(lb, \"autofocus\", false);\n            }\n        ;\n        ;\n        },\n        shouldComponentUpdate: function(kb) {\n            var lb = this.props;\n            return ((((((((((((((((((((((kb.comment !== lb.comment)) || ((kb.showReplyLink !== lb.showReplyLink)))) || ((kb.showReplies !== lb.showReplies)))) || ((kb.isFirst !== lb.isFirst)))) || ((kb.isLast !== lb.isLast)))) || ((kb.isFirstCommentComponent !== lb.isFirstCommentComponent)))) || ((kb.isLastCommentComponent !== lb.isLastCommentComponent)))) || ((kb.isFirstComponent !== lb.isFirstComponent)))) || ((kb.isLastComponent !== lb.isLastComponent)))) || ((kb.isFeaturedComment !== lb.isFeaturedComment)))) || ((kb.hasPartialBorder !== lb.hasPartialBorder))));\n        },\n        render: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = ((kb.JSBNG__status === ha.DELETED)), nb = ((kb.JSBNG__status === ha.LIVE_DELETED)), ob = ((kb.JSBNG__status === ha.SPAM_DISPLAY)), pb = ((kb.JSBNG__status === ha.PENDING_UNDO_DELETE)), qb = this.state.markedAsSpamHere, rb = this.state.oneClickRemovedHere, sb = this.state.isInlinePageDeleted, tb = this.props.hideAsSpamForPageAdmin, ub = this.state.isInlineBanned, vb = eb(kb), wb = ((!kb.JSBNG__status && ((kb.isunseen || kb.islocal))));\n            if (((!kb.JSBNG__status && lb.lastseentime))) {\n                var xb = ((kb.originalTimestamp || kb.timestamp.time));\n                wb = ((wb || ((xb > lb.lastseentime))));\n            }\n        ;\n        ;\n            var yb = this.props.contextArgs.markedcomments;\n            if (((yb && yb[kb.legacyid]))) {\n                wb = true;\n            }\n        ;\n        ;\n            if (vb) {\n                if (bb) {\n                    var zb, ac = null, bc = null, cc = null;\n                    if (tb) {\n                        bc = ((ub ? this._onUndoInlineBan : this._onInlineBan));\n                        if (sb) {\n                            ac = this._onUndoDeleteSpam;\n                            var dc = q.DOM.a({\n                                href: \"#\",\n                                onClick: ac\n                            }, \"Undo\");\n                            zb = ga._(\"You've deleted this comment so no one can see it. {undo}.\", {\n                                undo: dc\n                            });\n                        }\n                         else if (qb) {\n                            zb = \"Now this is only visible to the person who wrote it and their friends.\";\n                            cc = this._onDeleteSpam;\n                            ac = this._onMarkAsNotSpam;\n                        }\n                        \n                    ;\n                    ;\n                    }\n                     else if (qb) {\n                        zb = \"This comment has been hidden.\";\n                        cc = this._onDeleteSpam;\n                        ac = this._onMarkAsNotSpam;\n                    }\n                     else if (rb) {\n                        zb = \"This comment has been removed.\";\n                        ac = this._onUndoOneClickRemove;\n                    }\n                    \n                    \n                ;\n                ;\n                    if (zb) {\n                        return (q.DOM.li({\n                            className: fa(u.ROW, \"UFIHide\")\n                        }, bb({\n                            notice: zb,\n                            comment: this.props.comment,\n                            authorProfiles: this.props.authorProfiles,\n                            onUndo: ac,\n                            onBanAction: bc,\n                            onDeleteAction: cc,\n                            isInlineBanned: ub,\n                            hideAsSpamForPageAdmin: tb\n                        })));\n                    }\n                ;\n                ;\n                }\n                 else g.loadModules([\"UFICommentRemovalControls.react\",], function(gc) {\n                    bb = gc;\n                    JSBNG__setTimeout(function() {\n                        this.forceUpdate();\n                    }.bind(this));\n                }.bind(this));\n            ;\n            }\n        ;\n        ;\n            var ec = fa(u.ROW, (((((((((((((((((((((((((\"UFIComment\") + ((db(kb) ? ((\" \" + \"UFICommentFailed\")) : \"\")))) + ((((((((mb || nb)) || ob)) || pb)) ? ((\" \" + \"UFITranslucentComment\")) : \"\")))) + ((this.state.isHighlighting ? ((\" \" + \"highlightComment\")) : \"\")))) + ((((mb && !rb)) ? ((\" \" + \"noDisplay\")) : \"\")))) + ((((this.props.isFirst && !this.props.isReply)) ? ((\" \" + \"UFIFirstComment\")) : \"\")))) + ((((this.props.isLast && !this.props.isReply)) ? ((\" \" + \"UFILastComment\")) : \"\")))) + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\")))) + ((this.props.isFeatured ? ((\" \" + \"UFIFeaturedComment\")) : \"\")))) + ((((this.props.hasPartialBorder && !this.props.contextArgs.entstream)) ? ((\" \" + \"UFIPartialBorder\")) : \"\"))))), fc = this.renderComment();\n            if (wb) {\n                if (this.props.contextArgs.snowliftredesign) {\n                    fc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenindicator\"\n                    }), fc);\n                }\n                 else if (((this.props.contextArgs.entstream && !this.props.isReply))) {\n                    fc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenindicator\"\n                    }), fc);\n                }\n                 else ec = fa(ec, u.UNSEEN_ITEM);\n                \n            ;\n            }\n        ;\n        ;\n            return (q.DOM.li({\n                className: ec,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, fc));\n        },\n        renderComment: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.authorProfiles[lb.author], ob = ((lb.JSBNG__status === ha.SPAM_DISPLAY)), pb = ((lb.JSBNG__status === ha.LIVE_DELETED)), qb = !((ob || pb)), rb = ((mb.canremoveall || lb.hiddenbyviewer)), sb = null, tb = null;\n            if (((((!kb.isLocallyComposed && !this.state.wasHighlighted)) && !lb.fromfetch))) {\n                tb = x.commentTruncationLength;\n                sb = x.commentTruncationMaxLines;\n            }\n        ;\n        ;\n            var ub = s.getTrackingInfo(s.types.SMALL_ACTOR_PHOTO), vb = s.getTrackingInfo(s.types.USER_NAME), wb = s.getTrackingInfo(s.types.USER_MESSAGE), xb = null, yb = null;\n            if (((lb.istranslatable && ((lb.translatedtext === undefined))))) {\n                xb = q.DOM.a({\n                    href: \"#\",\n                    role: \"button\",\n                    title: \"Translate this comment\",\n                    className: ua,\n                    onClick: kb.onCommentTranslate\n                }, \"See Translation\");\n            }\n        ;\n        ;\n            if (lb.translatedtext) {\n                var zb = new ca(\"http://bing.com/translator\").addQueryData({\n                    text: lb.body.text\n                });\n                yb = q.DOM.span({\n                    className: va\n                }, lb.translatedtext, q.DOM.span({\n                    className: ya\n                }, \" (\", q.DOM.a({\n                    href: zb.toString(),\n                    className: za\n                }, \"Translated by Bing\"), \") \"));\n            }\n        ;\n        ;\n            var ac;\n            if (((i.rtl && ((lb.body.dir === \"ltr\"))))) {\n                ac = \"rtl\";\n            }\n             else if (((!i.rtl && ((lb.body.dir === \"rtl\"))))) {\n                ac = \"ltr\";\n            }\n            \n        ;\n        ;\n            var bc = k.constructEndpointWithLocation(nb, \"ufi\").toString(), cc = q.DOM.a({\n                ref: \"AuthorName\",\n                className: la,\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": vb,\n                dir: ac\n            }, nb.JSBNG__name), dc = function(ic, jc) {\n                return l(ic, jc, \"_blank\", mb.grouporeventid, \"ufi\");\n            }, ec = t({\n                className: ka,\n                interpolator: dc,\n                ranges: lb.body.ranges,\n                text: lb.body.text,\n                truncationPercent: x.commentTruncationPercent,\n                maxLength: tb,\n                maxLines: sb,\n                renderEmoticons: w.renderEmoticons,\n                renderEmoji: w.renderEmoji,\n                \"data-ft\": wb,\n                dir: lb.body.dir\n            }), fc;\n            if (lb.socialcontext) {\n                var gc = lb.socialcontext, hc = ib({\n                    topMutualFriend: kb.authorProfiles[gc.topmutualid],\n                    otherMutualCount: gc.othermutualcount,\n                    commentAuthor: nb\n                });\n                fc = [cc,hc,q.DOM.div(null, ec),];\n            }\n             else fc = [cc,\" \",ec,];\n        ;\n        ;\n            return (y({\n                spacing: \"medium\"\n            }, q.DOM.a({\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": ub\n            }, q.DOM.img({\n                src: nb.thumbSrc,\n                className: u.ACTOR_IMAGE,\n                alt: \"\"\n            })), q.DOM.div(null, q.DOM.div({\n                className: \"UFICommentContent\"\n            }, fc, xb, yb, v({\n                comment: kb.comment\n            })), gb({\n                comment: lb,\n                feedback: mb,\n                onBlingBoxClick: kb.onBlingBoxClick,\n                onCommentLikeToggle: kb.onCommentLikeToggle,\n                onCommentReply: kb.onCommentReply,\n                onPreviewRemove: kb.onPreviewRemove,\n                onRetrySubmit: kb.onRetrySubmit,\n                onMarkAsNotSpam: this._onMarkAsNotSpam,\n                viewerCanMarkNotSpam: rb,\n                viewas: kb.contextArgs.viewas,\n                showPermalink: kb.showPermalink,\n                showReplyLink: kb.showReplyLink,\n                showReplies: kb.showReplies,\n                contextArgs: kb.contextArgs,\n                markedAsSpamHere: this.state.markedAsSpamHere,\n                hideAsSpamForPageAdmin: kb.hideAsSpamForPageAdmin\n            })), ((qb ? this._renderCloseButton() : null))));\n        }\n    });\n    e.exports = jb;\n});\n__d(\"UFIContainer.react\", [\"React\",\"TrackingNodes\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"UFIContainer\",\n        render: function() {\n            var k = null;\n            if (this.props.hasNub) {\n                k = g.DOM.li({\n                    className: \"UFIArrow\"\n                }, g.DOM.i(null));\n            }\n        ;\n        ;\n            var l = ((((((((((((((!this.props.isReplyList ? \"UFIList\" : \"\")) + ((this.props.isReplyList ? ((\" \" + \"UFIReplyList\")) : \"\")))) + ((this.props.isParentLiveDeleted ? ((\" \" + \"UFITranslucentReplyList\")) : \"\")))) + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))));\n            return (g.DOM.ul({\n                className: l,\n                \"data-ft\": h.getTrackingInfo(h.types.UFI)\n            }, k, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"GiftOpportunityLogger\", [\"AsyncRequest\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__Event\"), i = {\n        init: function(k, l, m) {\n            var n = false;\n            h.listen(k, \"click\", function(o) {\n                if (n) {\n                    return true;\n                }\n            ;\n            ;\n                n = true;\n                i.send(l, m);\n            });\n        },\n        send: function(k, l) {\n            if (j[k.opportunity_id]) {\n                return;\n            }\n        ;\n        ;\n            j[k.opportunity_id] = true;\n            return new g().setURI(\"/ajax/gifts/log/opportunity\").setData({\n                data: k,\n                entry_point: l\n            }).send();\n        }\n    }, j = {\n    };\n    e.exports = i;\n});\n__d(\"InlineBlock.react\", [\"ReactProps\",\"React\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactProps\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = {\n        baseline: null,\n        bottom: \"-cx-PRIVATE-uiInlineBlock__bottom\",\n        middle: \"-cx-PRIVATE-uiInlineBlock__middle\",\n        JSBNG__top: \"-cx-PRIVATE-uiInlineBlock__top\"\n    }, l = h.createClass({\n        displayName: \"InlineBlock\",\n        props: {\n            alignv: g.oneOf([\"baseline\",\"bottom\",\"middle\",\"JSBNG__top\",]),\n            height: g.number\n        },\n        getDefaultProps: function() {\n            return {\n                alignv: \"baseline\"\n            };\n        },\n        render: function() {\n            var m = k[this.props.alignv], n = h.DOM.div({\n                className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m)\n            }, this.props.children);\n            if (((this.props.height != null))) {\n                var o = h.DOM.div({\n                    className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m),\n                    style: {\n                        height: ((this.props.height + \"px\"))\n                    }\n                });\n                n = h.DOM.div({\n                    className: \"-cx-PRIVATE-uiInlineBlock__root\",\n                    height: null\n                }, o, n);\n            }\n        ;\n        ;\n            return this.transferPropsTo(n);\n        }\n    });\n    e.exports = l;\n});\n__d(\"JSBNG__Image.react\", [\"React\",\"invariant\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"invariant\"), i = b(\"joinClasses\"), j = g.createClass({\n        displayName: \"ReactImage\",\n        props: {\n            src: function(k, l, m) {\n                var n = k[l];\n                h(((((typeof n === \"string\")) || ((((typeof n === \"object\")) && ((((((n.sprited && n.spriteMapCssClass)) && n.spriteCssClass)) || ((!n.sprited && n.uri)))))))));\n            }\n        },\n        render: function() {\n            var k, l, m = this.props.src, n = \"img\";\n            l = true;\n            if (((typeof m === \"string\"))) {\n                k = g.DOM.img({\n                    className: n,\n                    src: m\n                });\n            }\n             else if (m.sprited) {\n                n = i(n, m.spriteMapCssClass, m.spriteCssClass);\n                k = g.DOM.i({\n                    className: n,\n                    src: null\n                });\n                l = false;\n            }\n             else {\n                k = g.DOM.img({\n                    className: n,\n                    src: m.uri\n                });\n                if (((((typeof this.props.width === \"undefined\")) && ((typeof this.props.height === \"undefined\"))))) {\n                    k.props.width = m.width;\n                    k.props.height = m.height;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (this.props.alt) {\n                if (l) {\n                    k.props.alt = this.props.alt;\n                }\n                 else k.props.children = g.DOM.u(null, this.props.alt);\n            ;\n            }\n        ;\n        ;\n            return this.transferPropsTo(k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIGiftSentence.react\", [\"AsyncRequest\",\"CloseButton.react\",\"GiftOpportunityLogger\",\"ImageBlock.react\",\"InlineBlock.react\",\"LeftRight.react\",\"Link.react\",\"React\",\"JSBNG__Image.react\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"DOM\",\"ix\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CloseButton.react\"), i = b(\"GiftOpportunityLogger\"), j = b(\"ImageBlock.react\"), k = b(\"InlineBlock.react\"), l = b(\"LeftRight.react\"), m = b(\"Link.react\"), n = b(\"React\"), o = b(\"JSBNG__Image.react\"), p = b(\"UFIClassNames\"), q = b(\"UFIImageBlock.react\"), r = b(\"URI\"), s = b(\"DOM\"), t = b(\"ix\"), u = b(\"tx\"), v = n.createClass({\n        displayName: \"UFIGiftSentence\",\n        _entry_point: \"detected_gift_worthy_story_inline\",\n        render: function() {\n            var w = this.props.recipient, x = this.props.giftdata, y = ((x ? x.giftproductid : null)), z = this._getURI(y).toString();\n            this._log();\n            return (n.DOM.li({\n                className: p.ROW,\n                ref: \"UFIGiftSentence\"\n            }, l({\n                direction: \"right\"\n            }, ((x ? this._renderGiftSuggestion(z, w, x) : this._renderGiftLink(z, w))), h({\n                size: \"small\",\n                onClick: function() {\n                    var aa = this.refs.UFIGiftSentence.getDOMNode();\n                    s.remove(aa);\n                    this._requestClose();\n                }.bind(this)\n            }))));\n        },\n        _renderGiftSuggestion: function(w, x, y) {\n            return (q(null, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            }), n.DOM.div(null, n.DOM.span({\n                className: \"fwb\"\n            }, u._(\"Surprise {name} with a gift\", {\n                JSBNG__name: x.firstName\n            })), j({\n                spacing: \"medium\",\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, o({\n                className: \"UFIGiftProductImg\",\n                src: y.giftproductimgsrc,\n                alt: \"product image\"\n            })), k({\n                alignv: \"middle\",\n                height: 79\n            }, n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, y.giftproductname)), n.DOM.p({\n                className: \"mvs fcg\"\n            }, y.giftproductpricerange), n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, \"Give This Gift\"), \" \\u00b7 \", m({\n                rel: \"async-post\",\n                ajaxify: this._getURI().toString(),\n                href: {\n                    url: \"#\"\n                }\n            }, \"See All Gifts\")))))));\n        },\n        _renderGiftLink: function(w, x) {\n            return (q(null, m({\n                className: \"UFIGiftIcon\",\n                tabIndex: \"-1\",\n                href: {\n                    url: \"#\"\n                },\n                rel: \"async-post\",\n                ajaxify: w\n            }, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            })), m({\n                rel: \"async-post\",\n                href: {\n                    url: \"#\"\n                },\n                ajaxify: w\n            }, u._(\"Surprise {name} with a gift\", {\n                JSBNG__name: x.firstName\n            }))));\n        },\n        _log: function() {\n            var w = this.props.giftdata, x = {\n                opportunity_id: this.props.contextArgs.ftentidentifier,\n                sender_id: this.props.sender.id,\n                recipient_id: this.props.recipient.id,\n                link_description: \"UFIGiftSentence\",\n                product_id: ((w ? w.giftproductid : null)),\n                custom: {\n                    gift_occasion: this.props.contextArgs.giftoccasion,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                }\n            };\n            i.send([x,], this._entry_point);\n        },\n        _getURI: function(w) {\n            return r(\"/ajax/gifts/send\").addQueryData({\n                gift_occasion: this.props.contextArgs.giftoccasion,\n                recipient_id: this.props.recipient.id,\n                entry_point: this._entry_point,\n                product_id: w\n            });\n        },\n        _requestClose: function() {\n            var w = r(\"/ajax/gifts/moments/close/\");\n            new g().setMethod(\"POST\").setReadOnly(false).setURI(w).setData({\n                action: \"hide\",\n                data: JSON.stringify({\n                    type: \"detected_moment\",\n                    friend_id: this.props.recipient.id,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                })\n            }).send();\n        }\n    });\n    e.exports = v;\n});\n__d(\"UFILikeSentenceText.react\", [\"HovercardLinkInterpolator\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"TextWithEntities.react\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"HovercardLinkInterpolator\"), h = b(\"ProfileBrowserLink\"), i = b(\"ProfileBrowserTypes\"), j = b(\"React\"), k = b(\"TextWithEntities.react\"), l = b(\"URI\");\n    function m(p, q, r, s) {\n        if (((s.count != null))) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            };\n            return (j.DOM.a({\n                href: h.constructPageURI(t, u).toString(),\n                target: \"_blank\"\n            }, r));\n        }\n         else return g(r, s, \"_blank\", null, \"ufi\")\n    ;\n    };\n;\n    function n(p, q, r, s) {\n        if (((s.count != null))) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            }, v = [];\n            for (var w = 0; ((w < q.length)); w++) {\n                if (!q[w].count) {\n                    v.push(q[w].entities[0].id);\n                }\n            ;\n            ;\n            };\n        ;\n            var x = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                comment_fbid: p.targetfbid,\n                comment_from: p.actorforpost,\n                seen_user_fbids: ((v.length ? v : true))\n            });\n            return (j.DOM.a({\n                rel: \"dialog\",\n                ajaxify: h.constructDialogURI(t, u).toString(),\n                href: h.constructPageURI(t, u).toString(),\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": x.toString()\n            }, r));\n        }\n         else return g(r, s, null, null, \"ufi\")\n    ;\n    };\n;\n    var o = j.createClass({\n        displayName: \"UFILikeSentenceText\",\n        render: function() {\n            var p = this.props.feedback, q = this.props.likeSentenceData, r;\n            if (this.props.contextArgs.embedded) {\n                r = m;\n            }\n             else r = n;\n        ;\n        ;\n            r = r.bind(null, p, q.ranges);\n            return (k({\n                interpolator: r,\n                ranges: q.ranges,\n                aggregatedRanges: q.aggregatedranges,\n                text: q.text\n            }));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFILikeSentence.react\", [\"Bootloader\",\"LeftRight.react\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"UFILikeSentenceText.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"LeftRight.react\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"UFIClassNames\"), m = b(\"UFIImageBlock.react\"), n = b(\"UFILikeSentenceText.react\"), o = b(\"URI\"), p = b(\"cx\"), q = b(\"joinClasses\"), r = b(\"tx\"), s = k.createClass({\n        displayName: \"UFILikeSentence\",\n        getInitialState: function() {\n            return {\n                selectorModule: null,\n                bootloadedSelectorModule: false\n            };\n        },\n        componentWillMount: function() {\n            this._bootloadSelectorModule(this.props);\n        },\n        componentWillReceiveProps: function(t) {\n            this._bootloadSelectorModule(t);\n        },\n        _bootloadSelectorModule: function(t) {\n            if (((t.showOrderingModeSelector && !this.state.bootloadedSelectorModule))) {\n                var u = function(v) {\n                    this.setState({\n                        selectorModule: v\n                    });\n                }.bind(this);\n                if (t.contextArgs.entstream) {\n                    g.loadModules([\"UFIEntStreamOrderingModeSelector.react\",], u);\n                }\n                 else g.loadModules([\"UFIOrderingModeSelector.react\",], u);\n            ;\n            ;\n                this.setState({\n                    bootloadedSelectorModule: true\n                });\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var t = this.props.feedback, u = t.likesentences.current, v = this.props.contextArgs.entstream, w = q(l.ROW, ((t.likesentences.isunseen ? l.UNSEEN_ITEM : \"\")), (((((\"UFILikeSentence\") + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), x = null, y = null;\n            if (u.text) {\n                y = k.DOM.div({\n                    className: \"UFILikeSentenceText\"\n                }, n({\n                    contextArgs: this.props.contextArgs,\n                    feedback: t,\n                    likeSentenceData: u\n                }));\n            }\n        ;\n        ;\n            if (((y && !v))) {\n                x = k.DOM.i({\n                    className: \"UFILikeIcon\"\n                });\n                if (((t.viewercanlike && !t.hasviewerliked))) {\n                    x = k.DOM.a({\n                        className: \"UFILikeThumb\",\n                        href: \"#\",\n                        tabIndex: \"-1\",\n                        title: \"Like this\",\n                        onClick: this.props.onTargetLikeToggle\n                    }, x);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var z = y, aa = null;\n            if (((((t.seencount > 0)) && !v))) {\n                var ba = j.GROUP_MESSAGE_VIEWERS, ca = {\n                    id: t.targetfbid\n                }, da = i.constructDialogURI(ba, ca), ea = i.constructPageURI(ba, ca), fa = new o(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: t.entidentifier,\n                    displayed_count: t.seencount\n                }), ga;\n                if (t.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((((t.seencount == 1)) ? \"Seen by 1\" : r._(\"Seen by {count}\", {\n                    count: t.seencount\n                })));\n            ;\n            ;\n                aa = k.DOM.a({\n                    rel: \"dialog\",\n                    ajaxify: da.toString(),\n                    href: ea.toString(),\n                    tabindex: \"-1\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"left\",\n                    \"data-tooltip-uri\": fa.toString(),\n                    className: (((\"UFISeenCount\") + ((!!u.text ? ((\" \" + \"UFISeenCountRight\")) : \"\"))))\n                }, k.DOM.span({\n                    className: \"UFISeenCountIcon\"\n                }), ga);\n            }\n             else if (((this.props.showOrderingModeSelector && this.state.selectorModule))) {\n                var ha = this.state.selectorModule;\n                aa = ha({\n                    currentOrderingMode: this.props.orderingMode,\n                    entstream: v,\n                    orderingmodes: t.orderingmodes,\n                    onOrderChanged: this.props.onOrderingModeChange\n                });\n                if (!z) {\n                    z = k.DOM.div(null);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ia = null;\n            if (((x && y))) {\n                ia = m(null, x, y, aa);\n            }\n             else if (z) {\n                ia = h(null, z, aa);\n            }\n             else ia = aa;\n            \n        ;\n        ;\n            return (k.DOM.li({\n                className: w\n            }, ia));\n        }\n    });\n    e.exports = s;\n});\n__d(\"UFIPager.react\", [\"LeftRight.react\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"UFIPager\",\n        onPagerClick: function(n) {\n            ((((!this.props.isLoading && this.props.onPagerClick)) && this.props.onPagerClick()));\n            n.nativeEvent.prevent();\n        },\n        render: function() {\n            var n = this.onPagerClick, o = ((this.props.isLoading ? \"ufiPagerLoading\" : \"\")), p = l(i.ROW, ((this.props.isUnseen ? i.UNSEEN_ITEM : \"\")), (((((((((\"UFIPagerRow\") + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), q = h.DOM.a({\n                className: \"UFIPagerLink\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }, h.DOM.span({\n                className: o\n            }, this.props.pagerLabel)), r = (((\"fcg\") + ((\" \" + \"UFIPagerCount\")))), s = h.DOM.span({\n                className: r\n            }, this.props.countSentence), t;\n            if (this.props.contextArgs.entstream) {\n                t = (g({\n                    direction: g.DIRECTION.right\n                }, q, s));\n            }\n             else t = (j(null, h.DOM.a({\n                className: \"UFIPagerIcon\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }), q, s));\n        ;\n        ;\n            return (h.DOM.li({\n                className: p,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, t));\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFIReplySocialSentence.react\", [\"LiveTimer\",\"React\",\"Timestamp.react\",\"UFIClassNames\",\"UFIConstants\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = b(\"Timestamp.react\"), j = b(\"UFIClassNames\"), k = b(\"UFIConstants\"), l = b(\"UFIImageBlock.react\"), m = b(\"cx\"), n = b(\"joinClasses\"), o = b(\"tx\"), p = \" \\u00b7 \", q = 43200, r = h.createClass({\n        displayName: \"UFIReplySocialSentence\",\n        render: function() {\n            var s = ((this.props.isLoading ? \"UFIReplySocialSentenceLoading\" : \"\")), t = n(j.ROW, (((((\"UFIReplySocialSentenceRow\") + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), u, v;\n            if (this.props.isExpanded) {\n                u = ((((this.props.replies > 1)) ? o._(\"Hide {count} Replies\", {\n                    count: this.props.replies\n                }) : \"Hide 1 Reply\"));\n            }\n             else {\n                u = ((((this.props.replies > 1)) ? o._(\"{count} Replies\", {\n                    count: this.props.replies\n                }) : \"1 Reply\"));\n                if (this.props.timestamp) {\n                    var w = ((((g.getApproximateServerTime() / 1000)) - this.props.timestamp.time));\n                    if (((((w < q)) || ((this.props.orderingMode == k.UFICommentOrderingMode.RECENT_ACTIVITY))))) {\n                        v = h.DOM.span({\n                            className: \"fcg\"\n                        }, p, i({\n                            time: this.props.timestamp.time,\n                            text: this.props.timestamp.text,\n                            verbose: this.props.timestamp.verbose\n                        }));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var x = Object.keys(this.props.authors), y = ((x.length && !this.props.isExpanded)), z, aa;\n            if (y) {\n                var ba = this.props.authors[x[0]];\n                z = h.DOM.img({\n                    alt: \"\",\n                    src: ba.thumbSrc,\n                    className: j.ACTOR_IMAGE\n                });\n                aa = [o._(\"{author} replied\", {\n                    author: ba.JSBNG__name\n                }),p,u,];\n            }\n             else {\n                z = h.DOM.i({\n                    className: ((((!this.props.isExpanded ? \"UFIPagerIcon\" : \"\")) + ((this.props.isExpanded ? ((\" \" + \"UFICollapseIcon\")) : \"\"))))\n                });\n                aa = u;\n            }\n        ;\n        ;\n            return (h.DOM.li({\n                className: t,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, h.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, l(null, h.DOM.div({\n                className: ((y ? \"UFIReplyActorPhotoWrapper\" : \"\"))\n            }, z), h.DOM.span({\n                className: s\n            }, h.DOM.span({\n                className: \"UFIReplySocialSentenceLinkText\"\n            }, aa), v)))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"UFIShareRow.react\", [\"NumberFormat\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"joinClasses\"), n = b(\"tx\"), o = h.createClass({\n        displayName: \"UFIShareRow\",\n        render: function() {\n            var p = new k(\"/ajax/shares/view\").setQueryData({\n                target_fbid: this.props.targetID\n            }), q = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                id: this.props.targetID\n            }), r;\n            if (((this.props.shareCount > 1))) {\n                var s = g.formatIntegerWithDelimiter(this.props.shareCount, ((this.props.contextArgs.numberdelimiter || \",\")));\n                r = n._(\"{count} shares\", {\n                    count: s\n                });\n            }\n             else r = \"1 share\";\n        ;\n        ;\n            var t = m(i.ROW, ((((this.props.isFirstComponent ? \"UFIFirstComponent\" : \"\")) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\")))));\n            return (h.DOM.li({\n                className: t\n            }, j(null, h.DOM.a({\n                className: \"UFIShareIcon\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }), h.DOM.a({\n                className: \"UFIShareLink\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }, r))));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFISpamPlaceholder.react\", [\"React\",\"UFIClassNames\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"tx\"), k = g.createClass({\n        displayName: \"UFISpamPlaceholder\",\n        render: function() {\n            var l = (((\"UFISpamCommentWrapper\") + ((this.props.isLoading ? ((\" \" + \"UFISpamCommentLoading\")) : \"\"))));\n            return (g.DOM.li({\n                className: h.ROW\n            }, g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                className: \"UFISpamCommentLink\",\n                onClick: this.props.onClick\n            }, g.DOM.span({\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"aria-label\": j._(\"{count} hidden\", {\n                    count: this.props.numHidden\n                }),\n                className: l\n            }, g.DOM.i({\n                className: \"placeholderIcon\"\n            })))));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFI.react\", [\"NumberFormat\",\"React\",\"LegacyScrollableArea.react\",\"TrackingNodes\",\"UFIAddCommentController\",\"UFIAddCommentLink.react\",\"UFIComment.react\",\"UFIConstants\",\"UFIContainer.react\",\"UFIGiftSentence.react\",\"UFIInstanceState\",\"UFILikeSentence.react\",\"UFIPager.react\",\"UFIReplySocialSentence.react\",\"UFIShareRow.react\",\"UFISpamPlaceholder.react\",\"copyProperties\",\"isEmpty\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"LegacyScrollableArea.react\"), j = b(\"TrackingNodes\"), k = b(\"UFIAddCommentController\"), l = b(\"UFIAddCommentLink.react\"), m = b(\"UFIComment.react\"), n = b(\"UFIConstants\"), o = b(\"UFIContainer.react\"), p = b(\"UFIGiftSentence.react\"), q = b(\"UFIInstanceState\"), r = b(\"UFILikeSentence.react\"), s = b(\"UFIPager.react\"), t = b(\"UFIReplySocialSentence.react\"), u = b(\"UFIShareRow.react\"), v = b(\"UFISpamPlaceholder.react\"), w = b(\"copyProperties\"), x = b(\"isEmpty\"), y = b(\"tx\"), z = h.createClass({\n        displayName: \"UFI\",\n        getInitialState: function() {\n            return {\n                requestRanges: w({\n                }, this.props.availableRanges),\n                instanceShowRepliesMap: {\n                },\n                instanceShowReplySocialSentenceMap: {\n                },\n                loadingSpamIDs: {\n                },\n                isActiveLoading: false,\n                hasPagedToplevel: false\n            };\n        },\n        componentWillReceiveProps: function(aa) {\n            if (this.state.isActiveLoading) {\n                var ba = this.props.availableRanges[this.props.id], ca = aa.availableRanges[this.props.id];\n                if (((((ba.offset != ca.offset)) || ((ba.length != ca.length))))) {\n                    var da = ((((ca.offset < ba.offset)) ? 0 : ba.length));\n                    if (((da < aa.availableComments.length))) {\n                        var ea = aa.availableComments[da].ufiinstanceid;\n                        q.updateState(ea, \"autofocus\", true);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.setState({\n                    isActiveLoading: false\n                });\n            }\n        ;\n        ;\n            if (((aa.orderingMode != this.props.orderingMode))) {\n                this.setState({\n                    requestRanges: w({\n                    }, aa.availableRanges)\n                });\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var aa = this.props, ba = aa.feedback, ca = aa.contextArgs, da = ((aa.source != n.UFIFeedbackSourceType.ADS)), ea = ((ba.orderingmodes && ((aa.commentCounts[aa.id] >= n.minCommentsForOrderingModeSelector)))), fa = ((((((!x(ba.likesentences.current) || ((((ba.seencount > 0)) && !ca.entstream)))) || ea)) && da)), ga = null;\n            if (fa) {\n                ga = r({\n                    contextArgs: ca,\n                    feedback: ba,\n                    onTargetLikeToggle: aa.onTargetLikeToggle,\n                    onOrderingModeChange: aa.onOrderingModeChange,\n                    orderingMode: aa.orderingMode,\n                    showOrderingModeSelector: ea\n                });\n            }\n        ;\n        ;\n            var ha = null;\n            if (((aa.feedback.hasviewerliked && this._shouldShowGiftSentence()))) {\n                ha = p({\n                    contextArgs: ca,\n                    recipient: aa.giftRecipient,\n                    sender: aa.authorProfiles[ba.actorforpost],\n                    giftdata: aa.feedback.giftdata\n                });\n            }\n        ;\n        ;\n            var ia = ((((aa.availableComments && aa.availableComments.length)) && da)), ja = null;\n            if (ia) {\n                ja = this.renderCommentMap(aa.availableComments, aa.availableRanges[aa.id].offset);\n            }\n        ;\n        ;\n            var ka = null, la = ba.cancomment, ma = ((((la && ca.showaddcomment)) && ba.actorforpost));\n            if (ma) {\n                var na = new k(null, aa.id, null, ca), oa = aa.authorProfiles[ba.actorforpost];\n                ka = na.renderAddComment(oa, ba.mentionsdatasource, ba.showsendonentertip, \"toplevelcomposer\", null, ba.allowphotoattachments, ba.subtitle);\n            }\n        ;\n        ;\n            var pa = null, qa = ((((ca.showshares && ba.sharecount)) && da));\n            if (((qa && !ca.entstream))) {\n                pa = u({\n                    targetID: ba.targetfbid,\n                    shareCount: ba.sharecount,\n                    contextArgs: ca\n                });\n            }\n        ;\n        ;\n            var ra = ((((((fa || qa)) || ia)) || la)), sa = this.renderPagers();\n            this.applyToUFIComponents([sa.topPager,], ja, [sa.bottomPager,], {\n                isFirstCommentComponent: true\n            }, {\n                isLastCommentComponent: true\n            });\n            var ta = ((ba.commentboxhoisted ? ka : null)), ua = ((ba.commentboxhoisted ? null : ka)), va = null;\n            if (((((ma && ba.hasaddcommentlink)) && this.state.hasPagedToplevel))) {\n                va = l({\n                    onClick: this.onComment\n                });\n            }\n        ;\n        ;\n            this.applyToUFIComponents([ga,pa,ta,sa.topPager,], ja, [sa.bottomPager,ua,va,], {\n                isFirstComponent: true\n            }, {\n                isLastComponent: true\n            });\n            var wa = [sa.topPager,ja,sa.bottomPager,];\n            if (((ca.scrollcomments && ca.scrollwidth))) {\n                wa = h.DOM.li(null, i({\n                    width: ca.scrollwidth\n                }, h.DOM.ul(null, wa)));\n            }\n        ;\n        ;\n            return (o({\n                hasNub: ((ca.shownub && ra))\n            }, ga, ha, pa, ta, wa, ua, va));\n        },\n        applyToUFIComponents: function(aa, ba, ca, da, ea) {\n            var fa = Object.keys(((ba || {\n            }))).map(function(ha) {\n                return ba[ha];\n            }), ga = [].concat(aa, fa, ca);\n            this._applyToFirstComponent(ga, da);\n            ga.reverse();\n            this._applyToFirstComponent(ga, ea);\n        },\n        _applyToFirstComponent: function(aa, ba) {\n            for (var ca = 0; ((ca < ((aa || [])).length)); ca++) {\n                if (aa[ca]) {\n                    w(aa[ca].props, ba);\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        renderCommentMap: function(aa, ba) {\n            var ca = this.props, da = {\n            }, ea = aa.length;\n            if (!ea) {\n                return da;\n            }\n        ;\n        ;\n            var fa = aa[0].parentcommentid, ga = [], ha = function() {\n                if (((ga.length > 0))) {\n                    var qa = function(ra, sa) {\n                        this.state.loadingSpamIDs[ra[0]] = true;\n                        this.forceUpdate();\n                        ca.onSpamFetch(ra, sa);\n                    }.bind(this, ga, fa);\n                    da[((\"spam\" + ga[0]))] = v({\n                        onClick: qa,\n                        numHidden: ga.length,\n                        isLoading: !!this.state.loadingSpamIDs[ga[0]]\n                    });\n                    ga = [];\n                }\n            ;\n            ;\n            }.bind(this), ia = ca.instanceid, ja = q.getKeyForInstance(ia, \"editcommentid\"), ka = !!aa[0].parentcommentid, la = false;\n            for (var ma = 0; ((ma < ea)); ma++) {\n                if (((aa[ma].JSBNG__status == n.UFIStatus.SPAM))) {\n                    ga.push(aa[ma].id);\n                }\n                 else {\n                    ha();\n                    var na = Math.max(((((ca.loggingOffset - ma)) - ba)), 0), oa = aa[ma], pa;\n                    if (((oa.id == ja))) {\n                        pa = this.renderEditCommentBox(oa);\n                    }\n                     else {\n                        pa = this.renderComment(oa, na);\n                        pa.props.isFirst = ((ma === 0));\n                        pa.props.isLast = ((ma === ((ea - 1))));\n                        if (!ka) {\n                            pa.props.showReplyLink = true;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    da[((\"comment\" + oa.id))] = pa;\n                    if (((((((((ca.feedback.actorforpost === oa.author)) && !la)) && !ca.feedback.hasviewerliked)) && this._shouldShowGiftSentence()))) {\n                        da[((\"gift\" + oa.id))] = p({\n                            contextArgs: ca.contextArgs,\n                            recipient: ca.giftRecipient,\n                            sender: ca.authorProfiles[ca.feedback.actorforpost],\n                            giftdata: ca.feedback.giftdata\n                        });\n                        la = true;\n                    }\n                ;\n                ;\n                    if (((oa.JSBNG__status !== n.UFIStatus.DELETED))) {\n                        da[((\"replies\" + oa.id))] = this.renderReplyContainer(oa);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            ha();\n            return da;\n        },\n        _shouldShowGiftSentence: function() {\n            var aa = this.props;\n            return ((aa.contextArgs.giftoccasion && !aa.contextArgs.entstream));\n        },\n        renderReplyContainer: function(aa) {\n            var ba = this.props, ca = {\n            };\n            for (var da = 0; ((da < ((aa.replyauthors || [])).length)); da++) {\n                var ea = ba.authorProfiles[aa.replyauthors[da]];\n                if (ea) {\n                    ca[ea.id] = ea;\n                }\n            ;\n            ;\n            };\n        ;\n            var fa = ((((ba.repliesMap && ba.repliesMap[aa.id])) && this._shouldShowCommentReplies(aa.id))), ga, ha = Math.max(((aa.replycount - aa.spamreplycount)), 0);\n            if (((ha && this._shouldShowReplySocialSentence(aa.id)))) {\n                var ia = ((this._shouldShowCommentReplies(aa.id) && ((this.isLoadingPrev(aa.id) || this.isLoadingNext(aa.id)))));\n                ga = t({\n                    authors: ca,\n                    replies: ha,\n                    timestamp: aa.recentreplytimestamp,\n                    onClick: this.onToggleReplies.bind(this, aa),\n                    isLoading: ia,\n                    isExpanded: fa,\n                    orderingMode: this.props.orderingMode\n                });\n            }\n        ;\n        ;\n            var ja, ka, la, ma;\n            if (fa) {\n                var na = this.renderPagers(aa.id);\n                ja = na.topPager;\n                la = na.bottomPager;\n                ka = this.renderCommentMap(ba.repliesMap[aa.id], ba.availableRanges[aa.id].offset);\n                var oa = Object.keys(ka);\n                for (var pa = 0; ((pa < oa.length)); pa++) {\n                    var qa = ka[oa[pa]];\n                    if (qa) {\n                        qa.props.hasPartialBorder = ((pa !== 0));\n                    }\n                ;\n                ;\n                };\n            ;\n                if (ba.feedback.cancomment) {\n                    var ra = false, sa = Object.keys(ka);\n                    for (var da = ((sa.length - 1)); ((da >= 0)); da--) {\n                        var ta = sa[da];\n                        if (((ta && ka[ta]))) {\n                            ra = ka[ta].props.isAuthorReply;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    ma = this.renderReplyComposer(aa, !ra);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ua;\n            if (((((((((ga || ja)) || ka)) || la)) || ma))) {\n                this.applyToUFIComponents([ga,ja,], ka, [la,ma,], {\n                    isFirstComponent: true\n                }, {\n                    isLastComponent: true\n                });\n                var va = ((aa.JSBNG__status === n.UFIStatus.LIVE_DELETED));\n                ua = o({\n                    isParentLiveDeleted: va,\n                    isReplyList: true\n                }, ga, ja, ka, la, ma);\n            }\n        ;\n        ;\n            return ua;\n        },\n        renderReplyComposer: function(aa, ba) {\n            var ca = this.props;\n            return (new k(null, ca.id, aa.id, ca.contextArgs)).renderAddComment(ca.authorProfiles[ca.feedback.actorforpost], ca.feedback.mentionsdatasource, false, ((\"replycomposer-\" + aa.id)), ba, ca.feedback.allowphotoattachments);\n        },\n        renderEditCommentBox: function(aa) {\n            var ba = new k(null, this.props.id, null, {\n            }), ca = ba.renderEditComment(this.props.authorProfiles[this.props.feedback.actorforpost], aa.id, this.props.feedback.mentionsdatasource, this.props.onEditAttempt.bind(null, aa), this.props.onCancelEdit, this.props.feedback.allowphotoattachments);\n            return ca;\n        },\n        _shouldShowCommentReplies: function(aa) {\n            if (((aa in this.state.instanceShowRepliesMap))) {\n                return this.state.instanceShowRepliesMap[aa];\n            }\n             else if (((aa in this.props.showRepliesMap))) {\n                return this.props.showRepliesMap[aa];\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        _shouldShowReplySocialSentence: function(aa) {\n            if (((aa in this.state.instanceShowReplySocialSentenceMap))) {\n                return this.state.instanceShowReplySocialSentenceMap[aa];\n            }\n             else if (((aa in this.props.showReplySocialSentenceMap))) {\n                return this.props.showReplySocialSentenceMap[aa];\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        renderComment: function(aa, ba) {\n            var ca = this.props, da = ca.feedback, ea = ((da.actorforpost === aa.author)), fa = q.getKeyForInstance(this.props.instanceid, \"locallycomposed\"), ga = ((aa.islocal || ((fa && fa[aa.id])))), ha = ((da.showremovemenu || ((da.viewerid === aa.author)))), ia = ((((da.canremoveall && da.isownerpage)) && !ea)), ja = ((ca.source != n.UFIFeedbackSourceType.INTERN)), ka = j.getTrackingInfo(j.types.COMMENT, ba), la = !!aa.parentcommentid, ma = this._shouldShowCommentReplies(aa.id), na = !!aa.isfeatured;\n            return (m({\n                comment: aa,\n                authorProfiles: this.props.authorProfiles,\n                viewerIsAuthor: ea,\n                feedback: da,\n                \"data-ft\": ka,\n                contextArgs: this.props.contextArgs,\n                hideAsSpamForPageAdmin: ia,\n                isLocallyComposed: ga,\n                isReply: la,\n                isFeatured: na,\n                showPermalink: ja,\n                showRemoveReportMenu: ha,\n                showReplies: ma,\n                onCommentLikeToggle: ca.onCommentLikeToggle.bind(null, aa),\n                onCommentReply: this.onCommentReply.bind(this, aa),\n                onCommentTranslate: ca.onCommentTranslate.bind(null, aa),\n                onEdit: ca.onCommentEdit.bind(null, aa),\n                onHideAsSpam: ca.onCommentHideAsSpam.bind(null, aa),\n                onInlineBan: ca.onCommentInlineBan.bind(null, aa),\n                onMarkAsNotSpam: ca.onCommentMarkAsNotSpam.bind(null, aa),\n                onOneClickRemove: ca.onCommentOneClickRemove.bind(null, aa),\n                onPreviewRemove: ca.onPreviewRemove.bind(null, aa),\n                onRemove: ca.onCommentRemove.bind(null, aa),\n                onRetrySubmit: ca.onRetrySubmit.bind(null, aa),\n                onUndoInlineBan: ca.onCommentUndoInlineBan.bind(null, aa),\n                onUndoOneClickRemove: ca.onCommentUndoOneClickRemove.bind(null, aa)\n            }));\n        },\n        _updateRepliesState: function(aa, ba, ca) {\n            var da = this.state.instanceShowRepliesMap;\n            da[aa] = ba;\n            var ea = this.state.instanceShowReplySocialSentenceMap;\n            ea[aa] = ca;\n            this.setState({\n                instanceShowRepliesMap: da,\n                instanceShowReplySocialSentenceMap: ea\n            });\n        },\n        onToggleReplies: function(aa) {\n            var ba = !this._shouldShowCommentReplies(aa.id), ca = ((this._shouldShowReplySocialSentence(aa.id) && !((ba && ((aa.replycount <= this.props.replySocialSentenceMaxReplies))))));\n            this._updateRepliesState(aa.id, ba, ca);\n            var da = ((this.state.requestRanges[aa.id].length - this.props.deletedCounts[aa.id]));\n            if (((ba && ((da === 0))))) {\n                var ea = this.props.commentCounts[aa.id], fa = Math.min(ea, this.props.pageSize);\n                this.onPage(aa.id, {\n                    offset: ((ea - fa)),\n                    length: fa\n                });\n            }\n        ;\n        ;\n        },\n        onPage: function(aa, ba) {\n            var ca = this.state.requestRanges;\n            ca[aa] = ba;\n            var da = ((this.state.hasPagedToplevel || ((aa === this.props.id))));\n            this.setState({\n                requestRanges: ca,\n                isActiveLoading: true,\n                hasPagedToplevel: da\n            });\n            this.props.onChangeRange(aa, ba);\n        },\n        isLoadingPrev: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            }\n        ;\n        ;\n            var ca = this.state.requestRanges[aa].offset, da = ba.availableRanges[aa].offset;\n            return ((ca < da));\n        },\n        isLoadingNext: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            }\n        ;\n        ;\n            var ca = this.state.requestRanges[aa].offset, da = this.state.requestRanges[aa].length, ea = ba.availableRanges[aa].offset, fa = ba.availableRanges[aa].length;\n            return ((((ca + da)) > ((ea + fa))));\n        },\n        renderPagers: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            var ca = ba.availableRanges[aa].offset, da = ba.availableRanges[aa].length, ea = ba.deletedCounts[aa], fa = ba.commentCounts[aa], ga = ((fa - ea)), ha = ((da - ea)), ia = ((ba.contextArgs.numberdelimiter || \",\")), ja = ((aa !== ba.id)), ka = {\n                topPager: null,\n                bottomPager: null\n            };\n            if (((ba.source == n.UFIFeedbackSourceType.ADS))) {\n                return ka;\n            }\n        ;\n        ;\n            var la = this.isLoadingPrev(aa), ma = this.isLoadingNext(aa);\n            if (((da == fa))) {\n                return ka;\n            }\n        ;\n        ;\n            var na = ((((ca + da)) == fa));\n            if (((((((fa < ba.pageSize)) && na)) || ((ha === 0))))) {\n                var oa = Math.min(fa, ba.pageSize), pa = this.onPage.bind(this, aa, {\n                    offset: ((fa - oa)),\n                    length: oa\n                }), qa, ra;\n                if (((ha === 0))) {\n                    if (((ga == 1))) {\n                        qa = ((ja ? \"View 1 reply\" : \"View 1 comment\"));\n                    }\n                     else {\n                        ra = g.formatIntegerWithDelimiter(ga, ia);\n                        qa = ((ja ? y._(\"View all {count} replies\", {\n                            count: ra\n                        }) : y._(\"View all {count} comments\", {\n                            count: ra\n                        })));\n                    }\n                ;\n                ;\n                }\n                 else if (((((ga - ha)) == 1))) {\n                    qa = ((ja ? \"View 1 more reply\" : \"View 1 more comment\"));\n                }\n                 else {\n                    ra = g.formatIntegerWithDelimiter(((ga - ha)), ia);\n                    qa = ((ja ? y._(\"View {count} more replies\", {\n                        count: ra\n                    }) : y._(\"View {count} more comments\", {\n                        count: ra\n                    })));\n                }\n                \n            ;\n            ;\n                var sa = j.getTrackingInfo(j.types.VIEW_ALL_COMMENTS), ta = s({\n                    contextArgs: ba.contextArgs,\n                    isUnseen: ba.feedback.hasunseencollapsed,\n                    isLoading: la,\n                    pagerLabel: qa,\n                    onPagerClick: pa,\n                    \"data-ft\": sa\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.bottomPager = ta;\n                }\n                 else ka.topPager = ta;\n            ;\n            ;\n                return ka;\n            }\n        ;\n        ;\n            if (((ca > 0))) {\n                var ua = Math.max(((ca - ba.pageSize)), 0), oa = ((((ca + da)) - ua)), va = this.onPage.bind(this, aa, {\n                    offset: ua,\n                    length: oa\n                }), wa = g.formatIntegerWithDelimiter(ha, ia), xa = g.formatIntegerWithDelimiter(ga, ia), ya = y._(\"{countshown} of {totalcount}\", {\n                    countshown: wa,\n                    totalcount: xa\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: \"View more comments\",\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n                 else {\n                    var za = ((ja ? \"View previous replies\" : \"View previous comments\"));\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: za,\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((ca + da)) < fa))) {\n                var ab = Math.min(((da + ba.pageSize)), ((fa - ca))), bb = this.onPage.bind(this, aa, {\n                    offset: ca,\n                    length: ab\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: \"View previous comments\",\n                        onPagerClick: bb\n                    });\n                }\n                 else {\n                    var cb = ((ja ? \"View more replies\" : \"View more comments\"));\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: cb,\n                        onPagerClick: bb\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ka;\n        },\n        onCommentReply: function(aa) {\n            var ba = ((aa.parentcommentid || aa.id));\n            if (!this._shouldShowCommentReplies(ba)) {\n                this.onToggleReplies(aa);\n            }\n        ;\n        ;\n            if (((this.refs && this.refs[((\"replycomposer-\" + ba))]))) {\n                this.refs[((\"replycomposer-\" + ba))].JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        onComment: function() {\n            if (((this.refs && this.refs.toplevelcomposer))) {\n                this.refs.toplevelcomposer.JSBNG__focus();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = z;\n});\n__d(\"UFIController\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"ImmutableObject\",\"LayerRemoveOnHide\",\"LiveTimer\",\"Parent\",\"React\",\"ReactMount\",\"ShortProfiles\",\"UFI.react\",\"UFIActionLinkController\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",\"URI\",\"copyProperties\",\"isEmpty\",\"tx\",\"UFICommentTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"ImmutableObject\"), m = b(\"LayerRemoveOnHide\"), n = b(\"LiveTimer\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"ReactMount\"), r = b(\"ShortProfiles\"), s = b(\"UFI.react\"), t = b(\"UFIActionLinkController\"), u = b(\"UFICentralUpdates\"), v = b(\"UFIComments\"), w = b(\"UFIConstants\"), x = b(\"UFIFeedbackTargets\"), y = b(\"UFIInstanceState\"), z = b(\"UFIUserActions\"), aa = b(\"URI\"), ba = b(\"copyProperties\"), ca = b(\"isEmpty\"), da = b(\"tx\"), ea = b(\"UFICommentTemplates\"), fa = function(ia, ja, ka, la) {\n        var ma = ((((ia.offset + ia.length)) === ja));\n        return {\n            offset: ia.offset,\n            length: ((((ma && ga(la))) ? ((ka - ia.offset)) : ia.length))\n        };\n    }, ga = function(ia) {\n        return ((((ia == w.UFIPayloadSourceType.USER_ACTION)) || ((ia == w.UFIPayloadSourceType.LIVE_SEND))));\n    };\n    function ha(ia, ja, ka) {\n        this.root = ia;\n        this.id = ja.ftentidentifier;\n        this.source = ja.source;\n        this._ufiInstanceID = ja.instanceid;\n        this._contextArgs = ja;\n        this._contextArgs.rootid = this.root.id;\n        this._verifiedCommentsExpanded = false;\n        var la = ka.feedbacktargets[0];\n        this.actionLink = new t(ia, this._contextArgs, la);\n        this.orderingMode = la.defaultcommentorderingmode;\n        var ma = ka.commentlists.comments[this.id][this.orderingMode];\n        this.replyRanges = {\n        };\n        this.repliesMap = {\n        };\n        this.showRepliesMap = {\n        };\n        this.showReplySocialSentenceMap = {\n        };\n        this.commentcounts = {\n        };\n        this.commentcounts[this.id] = v.getCommentCount(this.id);\n        var na = {\n        }, oa = ((la.orderingmodes || [{\n            value: this.orderingMode\n        },]));\n        oa.forEach(function(sa) {\n            na[sa.value] = ba({\n            }, ma.range);\n        });\n        this.ranges = na;\n        if (ka.commentlists.replies) {\n            for (var pa = 0; ((pa < ma.values.length)); pa++) {\n                var qa = ma.values[pa], ra = ka.commentlists.replies[qa];\n                if (ra) {\n                    this.commentcounts[qa] = v.getCommentCount(qa);\n                    this.replyRanges[qa] = ba({\n                    }, ra.range);\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        this._loggingOffset = null;\n        this._ufi = null;\n        this.ufiCentralUpdatesSubscriptions = [u.subscribe(\"feedback-updated\", function(sa, ta) {\n            var ua = ta.updates, va = ta.payloadSource;\n            if (((((va != w.UFIPayloadSourceType.COLLAPSED_UFI)) && ((this.id in ua))))) {\n                this.fetchAndUpdate(this.render.bind(this), va);\n            }\n        ;\n        ;\n        }.bind(this)),u.subscribe(\"feedback-id-changed\", function(sa, ta) {\n            var ua = ta.updates;\n            if (((this.id in ua))) {\n                this.id = ua[this.id];\n            }\n        ;\n        ;\n        }.bind(this)),u.subscribe(\"instance-updated\", function(sa, ta) {\n            var ua = ta.updates;\n            if (((this._ufiInstanceID in ua))) {\n                var va = ua[this._ufiInstanceID];\n                if (va.editcommentid) {\n                    this.render(ta.payloadSource);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),u.subscribe(\"update-comment-lists\", function(sa, ta) {\n            if (((ta.commentlists && ta.commentlists.replies))) {\n                var ua = ta.commentlists.replies;\n                {\n                    var fin98keys = ((window.top.JSBNG_Replay.forInKeys)((ua))), fin98i = (0);\n                    var va;\n                    for (; (fin98i < fin98keys.length); (fin98i++)) {\n                        ((va) = (fin98keys[fin98i]));\n                        {\n                            if (((((((((this.id != va)) && ua[va])) && ((ua[va].ftentidentifier == this.id)))) && !this.replyRanges[va]))) {\n                                this.replyRanges[va] = ua[va].range;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),];\n        this.clearPageletSubscription = g.subscribe(\"pagelet/destroy\", this.onPageletDestroy.bind(this));\n        this.clearPageSubscription = g.subscribe(\"ufi/page_cleared\", this._onDestroy.bind(this));\n        u.handleUpdate(w.UFIPayloadSourceType.INITIAL_SERVER, ka);\n        if (this._contextArgs.viewas) {\n            this.viewasUFICleanSubscription = g.subscribe(\"pre_page_transition\", function(sa, ta) {\n                if (((this._contextArgs.viewas !== aa(ta.to).getQueryData(\"viewas\")))) {\n                    v.resetFeedbackTarget(this.id);\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        h.loadModules([\"ScrollAwareDOM\",], function(sa) {\n            q.scrollMonitor = sa.monitor;\n        });\n    };\n;\n    ba(ha.prototype, {\n        _getParentForm: function() {\n            if (!this._form) {\n                this._form = o.byTag(this.root, \"form\");\n            }\n        ;\n        ;\n            return this._form;\n        },\n        _onTargetLikeToggle: function(JSBNG__event) {\n            var ia = !this.feedback.hasviewerliked;\n            z.changeLike(this.id, ia, {\n                source: this.source,\n                target: JSBNG__event.target,\n                rootid: this._contextArgs.rootid\n            });\n            JSBNG__event.preventDefault();\n        },\n        _onCommentLikeToggle: function(ia, JSBNG__event) {\n            var ja = !ia.hasviewerliked;\n            z.changeCommentLike(ia.id, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentEdit: function(ia) {\n            y.updateState(this._ufiInstanceID, \"isediting\", true);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", ia.id);\n        },\n        _onEditAttempt: function(ia, ja, JSBNG__event) {\n            if (((!ja.visibleValue && !ja.attachedPhoto))) {\n                this._onCommentRemove(ia, JSBNG__event);\n            }\n             else z.editComment(ia.id, ja.visibleValue, ja.encodedValue, {\n                source: this._contextArgs.source,\n                target: JSBNG__event.target,\n                attachedPhoto: ja.attachedPhoto\n            });\n        ;\n        ;\n            y.updateStateField(this._ufiInstanceID, \"locallycomposed\", ia.id, true);\n            this._onEditReset();\n        },\n        _onEditReset: function() {\n            y.updateState(this._ufiInstanceID, \"isediting\", false);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", null);\n        },\n        _onCommentRemove: function(ia, JSBNG__event) {\n            var ja = ea[\":fb:ufi:hide-dialog-template\"].build();\n            j.setContent(ja.getNode(\"body\"), \"Are you sure you want to delete this comment?\");\n            j.setContent(ja.getNode(\"title\"), \"Delete Comment\");\n            h.loadModules([\"DialogX\",], function(ka) {\n                var la = new ka({\n                    modal: true,\n                    width: 465,\n                    addedBehaviors: [m,]\n                }, ja.getRoot());\n                la.subscribe(\"JSBNG__confirm\", function() {\n                    z.removeComment(ia.id, {\n                        source: this.source,\n                        oneclick: false,\n                        target: JSBNG__event.target,\n                        timelinelogdata: this._contextArgs.timelinelogdata\n                    });\n                    la.hide();\n                }.bind(this));\n                la.show();\n            }.bind(this));\n        },\n        _onCommentOneClickRemove: function(ia, JSBNG__event) {\n            z.removeComment(ia.id, {\n                source: this.source,\n                oneclick: true,\n                target: JSBNG__event.target,\n                timelinelogdata: this._contextArgs.timelinelogdata\n            });\n        },\n        _onCommentUndoOneClickRemove: function(ia, JSBNG__event) {\n            var ja = ((((this.feedback.canremoveall && this.feedback.isownerpage)) && ((this.feedback.actorforpost !== this.authorProfiles[ia.author]))));\n            z.undoRemoveComment(ia.id, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentHideAsSpam: function(ia, JSBNG__event) {\n            z.setHideAsSpam(ia.id, true, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentMarkAsNotSpam: function(ia, JSBNG__event) {\n            z.setHideAsSpam(ia.id, false, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentTranslate: function(ia, JSBNG__event) {\n            z.translateComment(ia, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentInlineBanChange: function(ia, ja, JSBNG__event) {\n            z.banUser(ia, this.feedback.ownerid, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentInlineBan: function(ia, JSBNG__event) {\n            this._onCommentInlineBanChange(ia, true, JSBNG__event);\n        },\n        _onCommentUndoInlineBan: function(ia, JSBNG__event) {\n            this._onCommentInlineBanChange(ia, false, JSBNG__event);\n        },\n        _fetchSpamComments: function(ia, ja) {\n            z.fetchSpamComments(this.id, ia, ja, this._contextArgs.viewas);\n        },\n        _removePreview: function(ia, JSBNG__event) {\n            z.removePreview(ia, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _retrySubmit: function(ia) {\n            h.loadModules([\"UFIRetryActions\",], function(ja) {\n                ja.retrySubmit(ia, {\n                    source: this.source\n                });\n            }.bind(this));\n        },\n        _ensureCommentsExpanded: function() {\n            if (this._verifiedCommentsExpanded) {\n                return;\n            }\n        ;\n        ;\n            var ia = o.byTag(this.root, \"form\");\n            if (ia) {\n                i.removeClass(ia, \"collapsed_comments\");\n                this._verifiedCommentsExpanded = true;\n            }\n        ;\n        ;\n        },\n        render: function(ia) {\n            var ja = ((this.comments.length || !ca(this.feedback.likesentences.current)));\n            if (((ja && ga(ia)))) {\n                this._ensureCommentsExpanded();\n            }\n        ;\n        ;\n            if (((this._loggingOffset === null))) {\n                this._loggingOffset = ((((this.ranges[this.orderingMode].offset + this.comments.length)) - 1));\n            }\n        ;\n        ;\n            var ka = ((this.feedback.replysocialsentencemaxreplies || -1)), la = {\n            };\n            la[this.id] = v.getDeletedCount(this.id);\n            this.comments.forEach(function(oa) {\n                la[oa.id] = v.getDeletedCount(oa.id);\n            });\n            var ma = ba({\n            }, this.replyRanges);\n            ma[this.id] = this.ranges[this.orderingMode];\n            ma = new l(ma);\n            var na = s({\n                feedback: this.feedback,\n                id: this.id,\n                onTargetLikeToggle: this._onTargetLikeToggle.bind(this),\n                onCommentLikeToggle: this._onCommentLikeToggle.bind(this),\n                onCommentRemove: this._onCommentRemove.bind(this),\n                onCommentHideAsSpam: this._onCommentHideAsSpam.bind(this),\n                onCommentMarkAsNotSpam: this._onCommentMarkAsNotSpam.bind(this),\n                onCommentEdit: this._onCommentEdit.bind(this),\n                onCommentOneClickRemove: this._onCommentOneClickRemove.bind(this),\n                onCommentUndoOneClickRemove: this._onCommentUndoOneClickRemove.bind(this),\n                onCommentTranslate: this._onCommentTranslate.bind(this),\n                onCommentInlineBan: this._onCommentInlineBan.bind(this),\n                onCommentUndoInlineBan: this._onCommentUndoInlineBan.bind(this),\n                onEditAttempt: this._onEditAttempt.bind(this),\n                onCancelEdit: this._onEditReset.bind(this),\n                onChangeRange: this._changeRange.bind(this),\n                onSpamFetch: this._fetchSpamComments.bind(this),\n                onPreviewRemove: this._removePreview.bind(this),\n                onRetrySubmit: this._retrySubmit.bind(this),\n                onOrderingModeChange: this._onOrderingModeChange.bind(this),\n                contextArgs: this._contextArgs,\n                repliesMap: this.repliesMap,\n                showRepliesMap: this.showRepliesMap,\n                showReplySocialSentenceMap: this.showReplySocialSentenceMap,\n                commentCounts: this.commentcounts,\n                deletedCounts: la,\n                availableComments: this.comments,\n                source: this.source,\n                availableRanges: ma,\n                pageSize: w.defaultPageSize,\n                authorProfiles: this.authorProfiles,\n                instanceid: this._ufiInstanceID,\n                loggingOffset: this._loggingOffset,\n                replySocialSentenceMaxReplies: ka,\n                giftRecipient: this._giftRecipient,\n                orderingMode: this.orderingMode\n            });\n            this._ufi = p.renderComponent(na, this.root);\n            n.updateTimeStamps();\n            if (this._getParentForm()) {\n                g.inform(\"ufi/changed\", {\n                    form: this._getParentForm()\n                });\n            }\n        ;\n        ;\n            if (((((ia != w.UFIPayloadSourceType.INITIAL_SERVER)) && ((ia != w.UFIPayloadSourceType.COLLAPSED_UFI))))) {\n                g.inform(\"reflow\");\n            }\n        ;\n        ;\n        },\n        fetchAndUpdate: function(ia, ja) {\n            x.getFeedbackTarget(this.id, function(ka) {\n                var la = v.getCommentCount(this.id), ma = fa(this.ranges[this.orderingMode], this.commentcounts[this.id], la, ja);\n                v.getCommentsInRange(this.id, ma, this.orderingMode, this._contextArgs.viewas, function(na) {\n                    var oa = [], pa = {\n                    }, qa = {\n                    };\n                    if (ka.actorforpost) {\n                        oa.push(ka.actorforpost);\n                    }\n                ;\n                ;\n                    for (var ra = 0; ((ra < na.length)); ra++) {\n                        if (na[ra].author) {\n                            oa.push(na[ra].author);\n                        }\n                    ;\n                    ;\n                        if (na[ra].socialcontext) {\n                            oa.push(na[ra].socialcontext.topmutualid);\n                        }\n                    ;\n                    ;\n                        if (((na[ra].replyauthors && na[ra].replyauthors.length))) {\n                            for (var sa = 0; ((sa < na[ra].replyauthors.length)); sa++) {\n                                oa.push(na[ra].replyauthors[sa]);\n                            ;\n                            };\n                        }\n                    ;\n                    ;\n                        if (ka.isthreaded) {\n                            var ta = na[ra].id, ua = v.getCommentCount(ta), va;\n                            if (this.replyRanges[ta]) {\n                                va = fa(this.replyRanges[ta], this.commentcounts[ta], ua, ja);\n                            }\n                             else va = {\n                                offset: 0,\n                                length: Math.min(ua, 2)\n                            };\n                        ;\n                        ;\n                            pa[ta] = va;\n                            qa[ta] = ua;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    v.getRepliesInRanges(this.id, pa, function(wa) {\n                        for (var xa = 0; ((xa < na.length)); xa++) {\n                            var ya = na[xa].id, za = ((wa[ya] || []));\n                            for (var ab = 0; ((ab < za.length)); ab++) {\n                                if (za[ab].author) {\n                                    oa.push(za[ab].author);\n                                }\n                            ;\n                            ;\n                                if (za[ab].socialcontext) {\n                                    oa.push(za[ab].socialcontext.topmutualid);\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        };\n                    ;\n                        if (this._contextArgs.giftoccasion) {\n                            oa.push(ka.actorid);\n                        }\n                    ;\n                    ;\n                        r.getMulti(oa, function(bb) {\n                            if (this._contextArgs.giftoccasion) {\n                                this._giftRecipient = bb[ka.actorid];\n                            }\n                        ;\n                        ;\n                            this.authorProfiles = bb;\n                            this.feedback = ka;\n                            this.commentcounts[this.id] = la;\n                            this.comments = na;\n                            this.ranges[this.orderingMode] = ma;\n                            for (var cb = 0; ((cb < na.length)); cb++) {\n                                var db = na[cb].id, eb = pa[db];\n                                this.repliesMap[db] = wa[db];\n                                this.replyRanges[db] = eb;\n                                this.commentcounts[db] = qa[db];\n                                this.showRepliesMap[db] = ((eb && ((eb.length > 0))));\n                                if (((((this.showReplySocialSentenceMap[db] === undefined)) && ((qa[db] > 0))))) {\n                                    this.showReplySocialSentenceMap[db] = !this.showRepliesMap[db];\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                            ia(ja);\n                            if (((ja == w.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH))) {\n                                g.inform(\"CommentUFI.Pager\");\n                            }\n                        ;\n                        ;\n                        }.bind(this));\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n        },\n        _changeRange: function(ia, ja) {\n            if (((ia == this.id))) {\n                this.ranges[this.orderingMode] = ja;\n            }\n             else this.replyRanges[ia] = ja;\n        ;\n        ;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        },\n        onPageletDestroy: function(ia, ja) {\n            if (k.contains(ja.root, this.root)) {\n                this._onDestroy();\n            }\n        ;\n        ;\n        },\n        _onDestroy: function() {\n            p.unmountAndReleaseReactRootNode(this.root);\n            this.ufiCentralUpdatesSubscriptions.forEach(u.unsubscribe.bind(u));\n            g.unsubscribe(this.clearPageletSubscription);\n            g.unsubscribe(this.clearPageSubscription);\n            ((this.viewasUFICleanSubscription && g.unsubscribe(this.viewasUFICleanSubscription)));\n        },\n        _onOrderingModeChange: function(ia) {\n            this.orderingMode = ia;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        }\n    });\n    e.exports = ha;\n});\n__d(\"Ease\", [], function(a, b, c, d, e, f) {\n    var g = {\n        makePowerOut: function(h) {\n            return function(i) {\n                var j = ((1 - Math.pow(((1 - i)), h)));\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        makePowerIn: function(h) {\n            return function(i) {\n                var j = Math.pow(i, h);\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        makePowerInOut: function(h) {\n            return function(i) {\n                var j = (((((i *= 2) < 1)) ? ((Math.pow(i, h) * 239723)) : ((1 - ((Math.abs(Math.pow(((2 - i)), h)) * 239754))))));\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        sineOut: function(h) {\n            return Math.sin(((((h * Math.PI)) * 239832)));\n        },\n        sineIn: function(h) {\n            return ((1 - Math.cos(((((h * Math.PI)) * 239885)))));\n        },\n        sineInOut: function(h) {\n            return ((-239921 * ((Math.cos(((Math.PI * h))) - 1))));\n        },\n        circOut: function(h) {\n            return Math.sqrt(((1 - (((--h) * h)))));\n        },\n        circIn: function(h) {\n            return -((Math.sqrt(((1 - ((h * h))))) - 1));\n        },\n        circInOut: function(h) {\n            return (((((h *= 2) < 1)) ? ((-240091 * ((Math.sqrt(((1 - ((h * h))))) - 1)))) : ((240115 * ((Math.sqrt(((1 - (((h -= 2) * h))))) + 1))))));\n        },\n        bounceOut: function(h) {\n            if (((h < ((1 / 2.75))))) {\n                return ((((7.5625 * h)) * h));\n            }\n             else if (((h < ((2 / 2.75))))) {\n                return ((((((7.5625 * (h -= ((1.5 / 2.75))))) * h)) + 240251));\n            }\n             else if (((h < ((2.5 / 2.75))))) {\n                return ((((((7.5625 * (h -= ((2.25 / 2.75))))) * h)) + 240309));\n            }\n             else return ((((((7.5625 * (h -= ((2.625 / 2.75))))) * h)) + 240355))\n            \n            \n        ;\n        },\n        bounceIn: function(h) {\n            return ((1 - g.bounceOut(((1 - h)))));\n        },\n        bounceInOut: function(h) {\n            return ((((h < 240449)) ? ((g.bounceIn(((h * 2))) * 240469)) : ((((g.bounceOut(((((h * 2)) - 1))) * 240491)) + 240494))));\n        },\n        _makeBouncy: function(h) {\n            h = ((h || 1));\n            return function(i) {\n                i = ((((((1 - Math.cos(((((i * Math.PI)) * h))))) * ((1 - i)))) + i));\n                return ((((i <= 1)) ? i : ((2 - i))));\n            };\n        },\n        makeBounceOut: function(h) {\n            return this._makeBouncy(h);\n        },\n        makeBounceIn: function(h) {\n            var i = this._makeBouncy(h);\n            return function(j) {\n                return ((1 - i(((1 - j)))));\n            };\n        },\n        makeElasticOut: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            var j = ((Math.PI * 2));\n            return function(k) {\n                if (((((k === 0)) || ((k === 1))))) {\n                    return k;\n                }\n            ;\n            ;\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return ((((((h * Math.pow(2, ((-10 * k))))) * Math.sin(((((((k - l)) * j)) / i))))) + 1));\n            };\n        },\n        makeElasticIn: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            var j = ((Math.PI * 2));\n            return function(k) {\n                if (((((k === 0)) || ((k === 1))))) {\n                    return k;\n                }\n            ;\n            ;\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return -((((h * Math.pow(2, ((10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i)))));\n            };\n        },\n        makeElasticInOut: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            i *= 1.5;\n            var j = ((Math.PI * 2));\n            return function(k) {\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return (((((k *= 2) < 1)) ? ((((((-241242 * h)) * Math.pow(2, ((10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i))))) : ((1 + ((((((241291 * h)) * Math.pow(2, ((-10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i)))))))));\n            };\n        },\n        makeBackOut: function(h) {\n            return function(i) {\n                return ((((((--i * i)) * ((((((h + 1)) * i)) + h)))) + 1));\n            };\n        },\n        makeBackIn: function(h) {\n            return function(i) {\n                return ((((i * i)) * ((((((h + 1)) * i)) - h))));\n            };\n        },\n        makeBackInOut: function(h) {\n            h *= 1.525;\n            return function(i) {\n                return (((((i *= 2) < 1)) ? ((241560 * ((((i * i)) * ((((((h + 1)) * i)) - h)))))) : ((241581 * (((((((i -= 2) * i)) * ((((((h + 1)) * i)) + h)))) + 2))))));\n            };\n        },\n        easeOutExpo: function(h) {\n            return ((-Math.pow(2, ((-10 * h))) + 1));\n        }\n    };\n    g.elasticOut = g.makeElasticOut(1, 241700);\n    g.elasticIn = g.makeElasticIn(1, 241734);\n    g.elasticInOut = g.makeElasticInOut(1, 241774);\n    g.backOut = g.makeBackOut(1.7);\n    g.backIn = g.makeBackIn(1.7);\n    g.backInOut = g.makeBackInOut(1.7);\n    e.exports = g;\n});\n__d(\"EntstreamCollapsedUFIActions\", [\"PopupWindow\",\"React\",\"TrackingNodes\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"PopupWindow\"), h = b(\"React\"), i = b(\"TrackingNodes\"), j = b(\"URI\"), k = b(\"cx\"), l = b(\"tx\"), m = h.createClass({\n        displayName: \"EntstreamCollapsedUFIActions\",\n        getLikeButton: function() {\n            return this.refs.likeButton.getDOMNode();\n        },\n        getLikeIcon: function() {\n            return this.refs.likeIcon.getDOMNode();\n        },\n        render: function() {\n            var n;\n            if (((this.props.shareHref !== null))) {\n                var o = i.getTrackingInfo(i.types.SHARE_LINK), p = j(this.props.shareHref), q = [h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__shareicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\"\n                }),\"Share\",];\n                if (((p.getPath().indexOf(\"/ajax\") === 0))) {\n                    n = h.DOM.a({\n                        ajaxify: this.props.shareHref,\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: \"#\",\n                        rel: \"dialog\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n                 else {\n                    var r = function() {\n                        g.open(this.props.shareHref, 480, 600);\n                        return false;\n                    }.bind(this);\n                    n = h.DOM.a({\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: this.props.shareHref,\n                        onClick: r,\n                        target: \"_blank\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s;\n            if (this.props.canComment) {\n                var t = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commenticon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\", u = [h.DOM.i({\n                    className: t\n                }),\"JSBNG__Comment\",], v = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commentlink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\", w = i.getTrackingInfo(i.types.COMMENT_LINK);\n                if (this.props.storyHref) {\n                    s = h.DOM.a({\n                        className: v,\n                        \"data-ft\": w,\n                        href: this.props.storyHref,\n                        target: \"_blank\",\n                        title: \"Write a comment...\"\n                    }, u);\n                }\n                 else s = h.DOM.a({\n                    className: v,\n                    \"data-ft\": w,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick,\n                    title: \"Write a comment...\"\n                }, u);\n            ;\n            ;\n            }\n        ;\n        ;\n            var x;\n            if (this.props.canLike) {\n                var y = ((((((this.props.hasViewerLiked ? \"-cx-PUBLIC-fbEntstreamFeedback__liked\" : \"\")) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likelink\")))) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__action\")))), z = i.getTrackingInfo(((this.props.hasViewerLiked ? i.types.UNLIKE_LINK : i.types.LIKE_LINK))), aa = ((this.props.hasViewerLiked ? \"Unlike this\" : \"Like this\"));\n                x = h.DOM.a({\n                    className: y,\n                    \"data-ft\": z,\n                    href: \"#\",\n                    onClick: this.props.onLike,\n                    onMouseDown: this.props.onLikeMouseDown,\n                    ref: \"likeButton\",\n                    title: aa\n                }, h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likeicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\",\n                    ref: \"likeIcon\"\n                }), \"Like\", h.DOM.div({\n                    className: \"-cx-PRIVATE-fbEntstreamCollapsedUFI__likecover\"\n                }));\n            }\n        ;\n        ;\n            return (h.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__icons\"\n            }, x, s, n));\n        }\n    });\n    e.exports = m;\n});\n__d(\"EntstreamCollapsedUFISentence\", [\"Bootloader\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"NumberFormat\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"URI\"), m = b(\"cx\"), n = b(\"tx\"), o = k.createClass({\n        displayName: \"EntstreamCollapsedUFISentence\",\n        _showShareDialog: function(JSBNG__event) {\n            JSBNG__event = JSBNG__event.nativeEvent;\n            if (JSBNG__event.isDefaultRequested()) {\n                return;\n            }\n        ;\n        ;\n            g.loadModules([\"EntstreamShareOverlay\",], function(p) {\n                p.display(this.props.feedback.targetfbid, this._getShareString());\n            }.bind(this));\n            JSBNG__event.prevent();\n        },\n        _getShareString: function() {\n            var p = this.props.feedback.sharecount, q = ((this.props.numberDelimiter || \",\"));\n            if (((p === 1))) {\n                return \"1 Share\";\n            }\n             else if (((p > 1))) {\n                var r = h.formatIntegerWithDelimiter(p, q);\n                return n._(\"{count} Shares\", {\n                    count: r\n                });\n            }\n            \n        ;\n        ;\n        },\n        render: function() {\n            var p = this.props.feedback, q = p.likecount, r = this.props.commentCount, s = p.sharecount, t = p.seencount, u = this.props.hasAttachedUFIExpanded, v = ((this.props.numberDelimiter || \",\"));\n            if (u) {\n                q = 0;\n                r = 0;\n            }\n        ;\n        ;\n            if (((((((!q && !r)) && !s)) && !t))) {\n                return k.DOM.span(null);\n            }\n        ;\n        ;\n            var w;\n            if (((q === 1))) {\n                w = \"1 Like\";\n            }\n             else if (((q > 1))) {\n                var x = h.formatIntegerWithDelimiter(q, v);\n                w = n._(\"{count} Likes\", {\n                    count: x\n                });\n            }\n            \n        ;\n        ;\n            var y;\n            if (((r === 1))) {\n                y = \"1 Comment\";\n            }\n             else if (((r > 1))) {\n                var z = h.formatIntegerWithDelimiter(r, v);\n                y = n._(\"{count} Comments\", {\n                    count: z\n                });\n            }\n            \n        ;\n        ;\n            var aa = this._getShareString(), ba, ca, da;\n            if (w) {\n                ca = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                    comment_fbid: p.targetfbid,\n                    comment_from: p.actorforpost,\n                    seen_user_fbids: true\n                });\n                var ea = ((((y || aa)) ? \"prm\" : \"\"));\n                ba = j.LIKES;\n                da = {\n                    id: p.targetfbid\n                };\n                var fa = i.constructDialogURI(ba, da).toString();\n                if (this.props.storyHref) {\n                    w = null;\n                }\n                 else w = k.DOM.a({\n                    ajaxify: fa,\n                    className: ea,\n                    href: i.constructPageURI(ba, da).toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    rel: \"dialog\"\n                }, w);\n            ;\n            ;\n            }\n        ;\n        ;\n            var ga;\n            if (((t > 0))) {\n                ba = j.GROUP_MESSAGE_VIEWERS;\n                da = {\n                    id: p.targetfbid\n                };\n                var ha = i.constructDialogURI(ba, da), ia = i.constructPageURI(ba, da);\n                ca = new l(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: p.entidentifier,\n                    displayed_count: t\n                });\n                var ja = h.formatIntegerWithDelimiter(t, v);\n                if (p.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((((ja == 1)) ? \"Seen by 1\" : n._(\"Seen by {count}\", {\n                    count: ja\n                })));\n            ;\n            ;\n                ga = k.DOM.a({\n                    ajaxify: ha.toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    href: ia.toString(),\n                    rel: \"dialog\",\n                    tabindex: \"-1\"\n                }, ga);\n            }\n        ;\n        ;\n            if (y) {\n                var ka = ((aa ? \"prm\" : \"\"));\n                if (this.props.storyHref) {\n                    y = k.DOM.a({\n                        className: ka,\n                        href: this.props.storyHref,\n                        target: \"_blank\"\n                    }, y);\n                }\n                 else y = k.DOM.a({\n                    className: ka,\n                    onClick: this.props.onCommentClick\n                }, y);\n            ;\n            ;\n            }\n        ;\n        ;\n            if (aa) {\n                var la = new l(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: p.targetfbid\n                });\n                if (this.props.storyHref) {\n                    aa = k.DOM.a({\n                        href: la.toString(),\n                        target: \"_blank\"\n                    }, aa);\n                }\n                 else aa = k.DOM.a({\n                    href: la.toString(),\n                    onClick: this._showShareDialog,\n                    rel: \"ignore\"\n                }, aa);\n            ;\n            ;\n            }\n        ;\n        ;\n            return (k.DOM.span({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentencerow\"\n            }, w, y, aa, ga));\n        }\n    });\n    e.exports = o;\n});\n__d(\"EntstreamCollapsedUFI\", [\"JSBNG__Event\",\"Animation\",\"BrowserSupport\",\"CSS\",\"DOM\",\"Ease\",\"EntstreamCollapsedUFIActions\",\"EntstreamCollapsedUFISentence\",\"React\",\"TrackingNodes\",\"Vector\",\"cx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Ease\"), m = b(\"EntstreamCollapsedUFIActions\"), n = b(\"EntstreamCollapsedUFISentence\"), o = b(\"React\"), p = b(\"TrackingNodes\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"queryThenMutateDOM\"), t = 16, u = o.createClass({\n        displayName: \"EntstreamCollapsedUFI\",\n        _animate: function(v, w, x, y) {\n            if (!i.hasCSSTransforms()) {\n                return;\n            }\n        ;\n        ;\n            var z = this.refs.icons.getLikeIcon();\n            ((this._animation && this._animation.JSBNG__stop()));\n            this._animation = new h(z).from(\"scaleX\", v).from(\"scaleY\", v).to(\"scaleX\", w).to(\"scaleY\", w).duration(x);\n            ((y && this._animation.ease(y)));\n            this._animation.go();\n        },\n        bounceLike: function() {\n            this._animate(1.35, 1, 750, l.bounceOut);\n        },\n        shrinkLike: function() {\n            this._animate(1, 248221, 150);\n            this._mouseUpListener = g.listen(JSBNG__document.body, \"mouseup\", this._onMouseUp);\n        },\n        _onMouseUp: function(JSBNG__event) {\n            this._mouseUpListener.remove();\n            if (!k.contains(this.refs.icons.getLikeButton(), JSBNG__event.getTarget())) {\n                this._animate(248442, 1, 150);\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var v = this.props.feedback, w = p.getTrackingInfo(p.types.BLINGBOX);\n            return (o.DOM.div({\n                className: \"clearfix\"\n            }, m({\n                canLike: v.viewercanlike,\n                canComment: v.cancomment,\n                hasViewerLiked: v.hasviewerliked,\n                onCommentClick: this.props.onCommentClick,\n                onLike: this.props.onLike,\n                onLikeMouseDown: this.props.onLikeMouseDown,\n                ref: \"icons\",\n                shareHref: this.props.shareHref,\n                storyHref: this.props.storyHref\n            }), o.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentence\",\n                \"data-ft\": w,\n                ref: \"sentence\"\n            }, n({\n                commentCount: this.props.commentCount,\n                feedback: v,\n                hasAttachedUFIExpanded: this.props.hasAttachedUFIExpanded,\n                numberDelimiter: this.props.numberDelimiter,\n                onCommentClick: this.props.onCommentClick,\n                storyHref: this.props.storyHref\n            }))));\n        },\n        componentDidMount: function(v) {\n            var w = this.refs.icons.getDOMNode(), x = this.refs.sentence.getDOMNode(), y, z, aa;\n            s(function() {\n                y = q.getElementDimensions(v).x;\n                z = q.getElementDimensions(w).x;\n                aa = q.getElementDimensions(x).x;\n            }, function() {\n                if (((((z + aa)) > ((y + t))))) {\n                    j.addClass(v, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__tworow\");\n                }\n            ;\n            ;\n            });\n        }\n    });\n    e.exports = u;\n});\n__d(\"EntstreamCollapsedUFIController\", [\"Bootloader\",\"CommentPrelude\",\"CSS\",\"DOM\",\"EntstreamCollapsedUFI\",\"React\",\"ReactMount\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIUserActions\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"EntstreamCollapsedUFI\"), l = b(\"React\"), m = b(\"ReactMount\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIConstants\"), q = b(\"UFIFeedbackTargets\"), r = b(\"UFIUserActions\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = p.UFIPayloadSourceType;\n    function v(w, x, y) {\n        this._root = w;\n        this._id = y.ftentidentifier;\n        this._contextArgs = y;\n        this._ufiVisible = y.hasattachedufiexpanded;\n        n.subscribe(\"feedback-updated\", function(z, aa) {\n            if (((((aa.payloadSource != u.INITIAL_SERVER)) && ((this._id in aa.updates))))) {\n                this.render();\n            }\n        ;\n        ;\n        }.bind(this));\n        n.handleUpdate(p.UFIPayloadSourceType.COLLAPSED_UFI, x);\n        g.loadModules([\"ScrollAwareDOM\",], function(z) {\n            m.scrollMonitor = z.monitor;\n        });\n    };\n;\n    s(v.prototype, {\n        _onLike: function(JSBNG__event) {\n            q.getFeedbackTarget(this._id, function(w) {\n                r.changeLike(this._id, !w.hasviewerliked, {\n                    source: this._contextArgs.source,\n                    target: JSBNG__event.target,\n                    rootid: j.getID(this._root)\n                });\n            }.bind(this));\n            this._ufi.bounceLike();\n            JSBNG__event.preventDefault();\n        },\n        _onLikeMouseDown: function(JSBNG__event) {\n            this._ufi.shrinkLike();\n            JSBNG__event.preventDefault();\n        },\n        _onCommentClick: function(JSBNG__event) {\n            if (!this._ufiVisible) {\n                this._ufiVisible = true;\n                i.addClass(this._root, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__hasattachedufiexpanded\");\n            }\n        ;\n        ;\n            h.click(this._root);\n            JSBNG__event.preventDefault();\n        },\n        render: function() {\n            q.getFeedbackTarget(this._id, function(w) {\n                var x = k({\n                    commentCount: o.getCommentCount(this._id),\n                    feedback: w,\n                    hasAttachedUFIExpanded: this._contextArgs.hasattachedufiexpanded,\n                    numberDelimiter: this._contextArgs.numberdelimiter,\n                    onCommentClick: this._onCommentClick.bind(this),\n                    onLike: this._onLike.bind(this),\n                    onLikeMouseDown: this._onLikeMouseDown.bind(this),\n                    shareHref: this._contextArgs.sharehref,\n                    storyHref: this._contextArgs.storyhref\n                });\n                l.renderComponent(x, this._root);\n                this._ufi = ((this._ufi || x));\n            }.bind(this));\n        }\n    });\n    e.exports = v;\n});\n__d(\"TypeaheadUtil\", [\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"repeatString\"), h = /[ ]+/g, i = /[^ ]+/g, j = /[.,+*?$|#{}()\\^\\-\\[\\]\\\\\\/!@%'\"~=<>_:;\\u30fb\\u3001\\u3002\\u3008-\\u3011\\u3014-\\u301f\\uff1a-\\uff1f\\uff01-\\uff0f\\uff3b-\\uff40\\uff5b-\\uff65\\u2E2E\\u061f\\u066a-\\u066c\\u061b\\u060c\\u060d\\uFD3e\\uFD3F\\u1801\\u0964\\u104a\\u104b\\u2010-\\u2027\\u2030-\\u205e\\u00a1-\\u00b1\\u00b4-\\u00b8\\u00ba\\u00bb\\u00bf]/g, k = {\n    }, l = {\n        a: \"\\u0430 \\u00e0 \\u00e1 \\u00e2 \\u00e3 \\u00e4 \\u00e5\",\n        b: \"\\u0431\",\n        c: \"\\u0446 \\u00e7 \\u010d\",\n        d: \"\\u0434 \\u00f0 \\u010f \\u0111\",\n        e: \"\\u044d \\u0435 \\u00e8 \\u00e9 \\u00ea \\u00eb \\u011b\",\n        f: \"\\u0444\",\n        g: \"\\u0433 \\u011f\",\n        h: \"\\u0445 \\u0127\",\n        i: \"\\u0438 \\u00ec \\u00ed \\u00ee \\u00ef \\u0131\",\n        j: \"\\u0439\",\n        k: \"\\u043a \\u0138\",\n        l: \"\\u043b \\u013e \\u013a \\u0140 \\u0142\",\n        m: \"\\u043c\",\n        n: \"\\u043d \\u00f1 \\u0148 \\u0149 \\u014b\",\n        o: \"\\u043e \\u00f8 \\u00f6 \\u00f5 \\u00f4 \\u00f3 \\u00f2\",\n        p: \"\\u043f\",\n        r: \"\\u0440 \\u0159 \\u0155\",\n        s: \"\\u0441 \\u015f \\u0161 \\u017f\",\n        t: \"\\u0442 \\u0165 \\u0167 \\u00fe\",\n        u: \"\\u0443 \\u044e \\u00fc \\u00fb \\u00fa \\u00f9 \\u016f\",\n        v: \"\\u0432\",\n        y: \"\\u044b \\u00ff \\u00fd\",\n        z: \"\\u0437 \\u017e\",\n        ae: \"\\u00e6\",\n        oe: \"\\u0153\",\n        ts: \"\\u0446\",\n        ch: \"\\u0447\",\n        ij: \"\\u0133\",\n        sh: \"\\u0448\",\n        ss: \"\\u00df\",\n        ya: \"\\u044f\"\n    };\n    {\n        var fin99keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin99i = (0);\n        var m;\n        for (; (fin99i < fin99keys.length); (fin99i++)) {\n            ((m) = (fin99keys[fin99i]));\n            {\n                var n = l[m].split(\" \");\n                for (var o = 0; ((o < n.length)); o++) {\n                    k[n[o]] = m;\n                ;\n                };\n            ;\n            };\n        };\n    };\n;\n    var p = {\n    };\n    function q(w) {\n        return ((w ? w.replace(j, \" \") : \"\"));\n    };\n;\n    function r(w) {\n        w = w.toLowerCase();\n        var x = \"\", y = \"\";\n        for (var z = w.length; z--; ) {\n            y = w.charAt(z);\n            x = ((((k[y] || y)) + x));\n        };\n    ;\n        return x.replace(h, \" \");\n    };\n;\n    function s(w) {\n        var x = [], y = i.exec(w);\n        while (y) {\n            y = y[0];\n            x.push(y);\n            y = i.exec(w);\n        };\n    ;\n        return x;\n    };\n;\n    function t(w, x) {\n        if (!p.hasOwnProperty(w)) {\n            var y = r(w), z = q(y);\n            p[w] = {\n                value: w,\n                flatValue: y,\n                tokens: s(z),\n                isPrefixQuery: ((z && ((z[((z.length - 1))] != \" \"))))\n            };\n        }\n    ;\n    ;\n        if (((x && ((typeof p[w].sortedTokens == \"undefined\"))))) {\n            p[w].sortedTokens = p[w].tokens.slice();\n            p[w].sortedTokens.sort(function(aa, ba) {\n                return ((ba.length - aa.length));\n            });\n        }\n    ;\n    ;\n        return p[w];\n    };\n;\n    function u(w, x, y) {\n        var z = t(x, ((w == \"prefix\"))), aa = ((((w == \"prefix\")) ? z.sortedTokens : z.tokens)), ba = t(y).tokens, ca = {\n        }, da = ((((z.isPrefixQuery && ((w == \"query\")))) ? ((aa.length - 1)) : null)), ea = function(fa, ga) {\n            for (var ha = 0; ((ha < ba.length)); ++ha) {\n                var ia = ba[ha];\n                if (((!ca[ha] && ((((ia == fa)) || ((((((((w == \"query\")) && ((ga === da)))) || ((w == \"prefix\")))) && ((ia.indexOf(fa) === 0))))))))) {\n                    return (ca[ha] = true);\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        };\n        return Boolean(((aa.length && aa.every(ea))));\n    };\n;\n    var v = {\n        flatten: r,\n        parse: t,\n        isExactMatch: u.bind(null, \"exact\"),\n        isQueryMatch: u.bind(null, \"query\"),\n        isPrefixMatch: u.bind(null, \"prefix\")\n    };\n    e.exports = v;\n});\n__d(\"KanaUtils\", [], function(a, b, c, d, e, f) {\n    var g = 12353, h = 12436, i = 96, j = {\n        normalizeHiragana: function(k) {\n            if (((k !== null))) {\n                var l = [];\n                for (var m = 0; ((m < k.length)); m++) {\n                    var n = k.charCodeAt(m);\n                    if (((((n < g)) || ((n > h))))) {\n                        l.push(k.charAt(m));\n                    }\n                     else {\n                        var o = ((n + i));\n                        l.push(String.fromCharCode(o));\n                    }\n                ;\n                ;\n                };\n            ;\n                return l.join(\"\");\n            }\n             else return null\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DataSource\", [\"ArbiterMixin\",\"AsyncRequest\",\"TypeaheadUtil\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"KanaUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"TypeaheadUtil\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\"), n = b(\"KanaUtils\");\n    function o(p) {\n        this._maxResults = ((p.maxResults || 10));\n        this.token = p.token;\n        this.queryData = ((p.queryData || {\n        }));\n        this.queryEndpoint = ((p.queryEndpoint || \"\"));\n        this.bootstrapData = ((p.bootstrapData || {\n        }));\n        this.bootstrapEndpoint = ((p.bootstrapEndpoint || \"\"));\n        this._exclusions = ((p.exclusions || []));\n        this._indexedFields = ((p.indexedFields || [\"text\",\"tokens\",]));\n        this._titleFields = ((p.titleFields || []));\n        this._alwaysPrefixMatch = ((p.alwaysPrefixMatch || false));\n        this._deduplicationKey = ((p.deduplicationKey || null));\n        this._enabledQueryCache = ((p.enabledQueryCache || true));\n        this._queryExactMatch = ((p.queryExactMatch || false));\n        this._acrossTransitions = ((p.acrossTransitions || false));\n        this._kanaNormalization = ((p.kanaNormalization || false));\n        this._minQueryLength = ((p.minQueryLength || -1));\n        this._minExactMatchLength = 4;\n        this._filters = [];\n    };\n;\n    j(o.prototype, g, {\n        events: [\"bootstrap\",\"query\",\"respond\",],\n        init: function() {\n            this.init = m;\n            this._fields = l(this._indexedFields);\n            this._activeQueries = 0;\n            this.dirty();\n        },\n        dirty: function() {\n            this.value = \"\";\n            this._bootstrapped = false;\n            this._bootstrapping = false;\n            this._data = {\n            };\n            this.localCache = {\n            };\n            this.queryCache = {\n            };\n            this.inform(\"dirty\", {\n            });\n            return this;\n        },\n        bootstrap: function() {\n            if (this._bootstrapped) {\n                return;\n            }\n        ;\n        ;\n            this.bootstrapWithoutToken();\n            this._bootstrapped = true;\n            this._bootstrapping = true;\n            this.inform(\"bootstrap\", {\n                bootstrapping: true\n            });\n        },\n        bootstrapWithoutToken: function() {\n            this.fetch(this.bootstrapEndpoint, this.bootstrapData, {\n                bootstrap: true,\n                token: this.token\n            });\n        },\n        bootstrapWithToken: function() {\n            var p = j({\n            }, this.bootstrapData);\n            p.token = this.token;\n            this.fetch(this.bootstrapEndpoint, p, {\n                bootstrap: true,\n                replaceCache: true\n            });\n        },\n        query: function(p, q, r, s) {\n            this.inform(\"beforeQuery\", {\n                value: p,\n                local_only: q,\n                exclusions: r,\n                time_waited: s\n            });\n            if (!this._enabledQueryCache) {\n                this.queryCache = {\n                };\n            }\n        ;\n        ;\n            var t = this.buildUids(p, [], r), u = this.respond(p, t);\n            this.value = p;\n            this.inform(\"query\", {\n                value: p,\n                results: u\n            });\n            var v = this._normalizeString(p).flatValue;\n            if (((((((((((q || !v)) || this._isQueryTooShort(v))) || !this.queryEndpoint)) || this.getQueryCache().hasOwnProperty(v))) || !this.shouldFetchMoreResults(u)))) {\n                return false;\n            }\n        ;\n        ;\n            this.inform(\"queryEndpoint\", {\n                value: p\n            });\n            this.fetch(this.queryEndpoint, this.getQueryData(p, t), {\n                value: p,\n                exclusions: r\n            });\n            return true;\n        },\n        _isQueryTooShort: function(p) {\n            return ((p.length < this._minQueryLength));\n        },\n        _normalizeString: function(p, q) {\n            var r = p;\n            if (this._kanaNormalization) {\n                r = n.normalizeHiragana(p);\n            }\n        ;\n        ;\n            return i.parse(r, q);\n        },\n        shouldFetchMoreResults: function(p) {\n            return ((p.length < this._maxResults));\n        },\n        getQueryData: function(p, q) {\n            var r = j({\n                value: p\n            }, ((this.queryData || {\n            })));\n            q = ((q || []));\n            if (q.length) {\n                r.existing_ids = q.join(\",\");\n            }\n        ;\n        ;\n            if (this._bootstrapping) {\n                r.bsp = true;\n            }\n        ;\n        ;\n            return r;\n        },\n        setQueryData: function(p, q) {\n            if (q) {\n                this.queryData = {\n                };\n            }\n        ;\n        ;\n            j(this.queryData, p);\n            return this;\n        },\n        setBootstrapData: function(p, q) {\n            if (q) {\n                this.bootstrapData = {\n                };\n            }\n        ;\n        ;\n            j(this.bootstrapData, p);\n            return this;\n        },\n        getExclusions: function() {\n            return k(this._exclusions);\n        },\n        setExclusions: function(p) {\n            this._exclusions = ((p || []));\n        },\n        addFilter: function(p) {\n            var q = this._filters;\n            q.push(p);\n            return {\n                remove: function() {\n                    q.splice(q.indexOf(p), 1);\n                }\n            };\n        },\n        clearFilters: function() {\n            this._filters = [];\n        },\n        respond: function(p, q, r) {\n            var s = this.buildData(q);\n            this.inform(\"respond\", {\n                value: p,\n                results: s,\n                isAsync: !!r\n            });\n            return s;\n        },\n        asyncErrorHandler: m,\n        fetch: function(p, q, r) {\n            if (!p) {\n                return;\n            }\n        ;\n        ;\n            var s = new h().setURI(p).setData(q).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._acrossTransitions).setHandler(function(t) {\n                this.fetchHandler(t, ((r || {\n                })));\n            }.bind(this));\n            if (((p === this.queryEndpoint))) {\n                s.setFinallyHandler(function() {\n                    this._activeQueries--;\n                    if (!this._activeQueries) {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            s.setErrorHandler(this.asyncErrorHandler);\n            this.inform(\"beforeFetch\", {\n                request: s,\n                fetch_context: r\n            });\n            s.send();\n            if (((p === this.queryEndpoint))) {\n                if (!this._activeQueries) {\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                }\n            ;\n            ;\n                this._activeQueries++;\n            }\n        ;\n        ;\n        },\n        fetchHandler: function(p, q) {\n            var r = q.value, s = q.exclusions;\n            if (((!r && q.replaceCache))) {\n                this.localCache = {\n                };\n            }\n        ;\n        ;\n            this.inform(\"buildQueryCache\", {\n            });\n            var t = p.getPayload().entries;\n            this.addEntries(t, r);\n            this.inform(\"fetchComplete\", {\n                entries: t,\n                response: p,\n                value: r,\n                fetch_context: q\n            });\n            var u = ((((!r && this.value)) ? this.value : r));\n            this.respond(u, this.buildUids(u, [], s), true);\n            if (!r) {\n                if (this._bootstrapping) {\n                    this._bootstrapping = false;\n                    this.inform(\"bootstrap\", {\n                        bootstrapping: false\n                    });\n                }\n            ;\n            ;\n                if (((q.token && ((p.getPayload().token !== q.token))))) {\n                    this.bootstrapWithToken();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        addEntries: function(p, q) {\n            var r = this.processEntries(k(((p || []))), q), s = this.buildUids(q, r);\n            if (q) {\n                var t = this.getQueryCache();\n                t[this._normalizeString(q).flatValue] = s;\n            }\n             else this.fillCache(s);\n        ;\n        ;\n        },\n        processEntries: function(p, q) {\n            return p.map(function(r, s) {\n                var t = (r.uid = ((r.uid + \"\"))), u = this.getEntry(t);\n                if (!u) {\n                    u = r;\n                    u.query = q;\n                    this.setEntry(t, u);\n                }\n                 else j(u, r);\n            ;\n            ;\n                ((((u.index === undefined)) && (u.index = s)));\n                return t;\n            }, this);\n        },\n        getAllEntries: function() {\n            return ((this._data || {\n            }));\n        },\n        getEntry: function(p) {\n            return ((this._data[p] || null));\n        },\n        setEntry: function(p, q) {\n            this._data[p] = q;\n        },\n        fillCache: function(p) {\n            var q = this.localCache;\n            p.forEach(function(r) {\n                var s = this.getEntry(r);\n                if (!s) {\n                    return;\n                }\n            ;\n            ;\n                s.bootstrapped = true;\n                var t = this._normalizeString(this.getTextToIndex(s)).tokens;\n                for (var u = 0, v = t.length; ((u < v)); ++u) {\n                    var w = t[u];\n                    if (!q.hasOwnProperty(w)) {\n                        q[w] = {\n                        };\n                    }\n                ;\n                ;\n                    q[w][r] = true;\n                };\n            ;\n            }, this);\n        },\n        getTextToIndex: function(p) {\n            if (((p.textToIndex && !p.needs_update))) {\n                return p.textToIndex;\n            }\n        ;\n        ;\n            p.needs_update = false;\n            p.textToIndex = this.getTextToIndexFromFields(p, this._indexedFields);\n            return p.textToIndex;\n        },\n        getTextToIndexFromFields: function(p, q) {\n            var r = [];\n            for (var s = 0; ((s < q.length)); ++s) {\n                var t = p[q[s]];\n                if (t) {\n                    r.push(((t.join ? t.join(\" \") : t)));\n                }\n            ;\n            ;\n            };\n        ;\n            return r.join(\" \");\n        },\n        mergeUids: function(p, q, r, s) {\n            this.inform(\"mergeUids\", {\n                local_uids: p,\n                query_uids: q,\n                new_uids: r,\n                value: s\n            });\n            var t = function(u, v) {\n                var w = this.getEntry(u), x = this.getEntry(v);\n                if (((w.extended_match !== x.extended_match))) {\n                    return ((w.extended_match ? 1 : -1));\n                }\n            ;\n            ;\n                if (((w.index !== x.index))) {\n                    return ((w.index - x.index));\n                }\n            ;\n            ;\n                if (((w.text.length !== x.text.length))) {\n                    return ((w.text.length - x.text.length));\n                }\n            ;\n            ;\n                return ((w.uid < x.uid));\n            }.bind(this);\n            this._checkExtendedMatch(s, p);\n            return this.deduplicateByKey(p.sort(t).concat(q, r));\n        },\n        _checkExtendedMatch: function(p, q) {\n            var r = ((this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch));\n            for (var s = 0; ((s < q.length)); ++s) {\n                var t = this.getEntry(q[s]);\n                t.extended_match = ((t.tokens ? !r(p, t.text) : false));\n            };\n        ;\n        },\n        buildUids: function(p, q, r) {\n            if (!q) {\n                q = [];\n            }\n        ;\n        ;\n            if (!p) {\n                return q;\n            }\n        ;\n        ;\n            if (!r) {\n                r = [];\n            }\n        ;\n        ;\n            var s = this.buildCacheResults(p, this.localCache), t = this.buildQueryResults(p), u = this.mergeUids(s, t, q, p), v = l(r.concat(this._exclusions)), w = u.filter(function(x) {\n                if (((v.hasOwnProperty(x) || !this.getEntry(x)))) {\n                    return false;\n                }\n            ;\n            ;\n                for (var y = 0; ((y < this._filters.length)); ++y) {\n                    if (!this._filters[y](this.getEntry(x), p)) {\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n                return (v[x] = true);\n            }, this);\n            return this.uidsIncludingExact(p, w, v);\n        },\n        uidsIncludingExact: function(p, q, r) {\n            var s = q.length;\n            if (((((p.length < this._minExactMatchLength)) || ((s <= this._maxResults))))) {\n                return q;\n            }\n        ;\n        ;\n            for (var t = 0; ((t < s)); ++t) {\n                var u = this.getEntry(q[t]);\n                ((u.text_lower || (u.text_lower = u.text.toLowerCase())));\n                if (((u.text_lower === this._normalizeString(p).flatValue))) {\n                    if (((t >= this._maxResults))) {\n                        var v = q.splice(t, 1);\n                        q.splice(((this._maxResults - 1)), 0, v);\n                    }\n                ;\n                ;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        },\n        buildData: function(p) {\n            var q = [], r = Math.min(p.length, this._maxResults);\n            for (var s = 0; ((s < r)); ++s) {\n                q.push(this.getEntry(p[s]));\n            ;\n            };\n        ;\n            return q;\n        },\n        findQueryCache: function(p) {\n            var q = 0, r = null, s = this.getQueryCache();\n            if (this._queryExactMatch) {\n                return ((s[p] || []));\n            }\n        ;\n        ;\n            {\n                var fin100keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin100i = (0);\n                var t;\n                for (; (fin100i < fin100keys.length); (fin100i++)) {\n                    ((t) = (fin100keys[fin100i]));\n                    {\n                        if (((((p.indexOf(t) === 0)) && ((t.length > q))))) {\n                            q = t.length;\n                            r = t;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ((s[r] || []));\n        },\n        buildQueryResults: function(p) {\n            var q = this._normalizeString(p).flatValue, r = this.findQueryCache(q);\n            if (this.getQueryCache().hasOwnProperty(q)) {\n                return r;\n            }\n        ;\n        ;\n            return this.filterQueryResults(p, r);\n        },\n        filterQueryResults: function(p, q) {\n            var r = ((this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch));\n            return q.filter(function(s) {\n                return r(p, this.getTextToIndex(this.getEntry(s)));\n            }, this);\n        },\n        buildCacheResults: function(p, q) {\n            var r = this._normalizeString(p, this._alwaysPrefixMatch), s = ((this._alwaysPrefixMatch ? r.sortedTokens : r.tokens)), t = s.length, u = ((r.isPrefixQuery ? ((t - 1)) : null)), v = {\n            }, w = {\n            }, x = {\n            }, y = [], z = false, aa = {\n            }, ba = 0;\n            for (var ca = 0; ((ca < t)); ++ca) {\n                var da = s[ca];\n                if (!aa.hasOwnProperty(da)) {\n                    ba++;\n                    aa[da] = true;\n                }\n                 else continue;\n            ;\n            ;\n                {\n                    var fin101keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin101i = (0);\n                    var ea;\n                    for (; (fin101i < fin101keys.length); (fin101i++)) {\n                        ((ea) = (fin101keys[fin101i]));\n                        {\n                            if (((((!v.hasOwnProperty(ea) && ((ea === da)))) || ((((this._alwaysPrefixMatch || ((u === ca)))) && ((ea.indexOf(da) === 0))))))) {\n                                if (((ea === da))) {\n                                    if (w.hasOwnProperty(ea)) {\n                                        z = true;\n                                    }\n                                ;\n                                ;\n                                    v[ea] = true;\n                                }\n                                 else {\n                                    if (((v.hasOwnProperty(ea) || w.hasOwnProperty(ea)))) {\n                                        z = true;\n                                    }\n                                ;\n                                ;\n                                    w[ea] = true;\n                                }\n                            ;\n                            ;\n                                {\n                                    var fin102keys = ((window.top.JSBNG_Replay.forInKeys)((q[ea]))), fin102i = (0);\n                                    var fa;\n                                    for (; (fin102i < fin102keys.length); (fin102i++)) {\n                                        ((fa) = (fin102keys[fin102i]));\n                                        {\n                                            if (((((ca === 0)) || ((x.hasOwnProperty(fa) && ((x[fa] == ((ba - 1))))))))) {\n                                                x[fa] = ba;\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n            {\n                var fin103keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin103i = (0);\n                var ga;\n                for (; (fin103i < fin103keys.length); (fin103i++)) {\n                    ((ga) = (fin103keys[fin103i]));\n                    {\n                        if (((x[ga] == ba))) {\n                            y.push(ga);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((z || ((ba < t))))) {\n                y = this.filterQueryResults(p, y);\n            }\n        ;\n        ;\n            if (((this._titleFields && ((this._titleFields.length > 0))))) {\n                y = this.filterNonTitleMatchQueryResults(p, y);\n            }\n        ;\n        ;\n            return y;\n        },\n        filterNonTitleMatchQueryResults: function(p, q) {\n            return q.filter(function(r) {\n                var s = this._normalizeString(p), t = s.tokens.length;\n                if (((t === 0))) {\n                    return true;\n                }\n            ;\n            ;\n                var u = this.getTitleTerms(this.getEntry(r)), v = s.tokens[0];\n                return ((((((t === 1)) || this._alwaysPrefixMatch)) ? i.isPrefixMatch(v, u) : i.isQueryMatch(v, u)));\n            }, this);\n        },\n        getTitleTerms: function(p) {\n            if (!p.titleToIndex) {\n                p.titleToIndex = this.getTextToIndexFromFields(p, this._titleFields);\n            }\n        ;\n        ;\n            return p.titleToIndex;\n        },\n        deduplicateByKey: function(p) {\n            if (!this._deduplicationKey) {\n                return p;\n            }\n        ;\n        ;\n            var q = l(p.map(this._getDeduplicationKey.bind(this)), p);\n            return p.filter(function(r) {\n                return ((q[this._getDeduplicationKey(r)] == r));\n            }.bind(this));\n        },\n        _getDeduplicationKey: function(p) {\n            var q = this.getEntry(p);\n            return ((q[this._deduplicationKey] || ((((\"__\" + p)) + \"__\"))));\n        },\n        getQueryCache: function() {\n            return this.queryCache;\n        },\n        setMaxResults: function(p) {\n            this._maxResults = p;\n            ((this.value && this.respond(this.value, this.buildUids(this.value))));\n        },\n        updateToken: function(p) {\n            this.token = p;\n            this.dirty();\n            return this;\n        }\n    });\n    e.exports = o;\n});\n__d(\"BanzaiNectar\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\");\n    function h(j) {\n        return {\n            log: function(k, l, m) {\n                var n = {\n                    e: l,\n                    a: m\n                };\n                g.post(((\"nectar:\" + k)), n, j);\n            }\n        };\n    };\n;\n    var i = h();\n    i.create = h;\n    e.exports = i;\n});\n__d(\"DimensionLogging\", [\"BanzaiNectar\",\"DOMDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiNectar\"), h = b(\"DOMDimensions\"), i = h.getViewportDimensions();\n    g.log(\"browser_dimension\", \"homeload\", {\n        x: i.width,\n        y: i.height,\n        sw: window.JSBNG__screen.width,\n        sh: window.JSBNG__screen.height,\n        aw: window.JSBNG__screen.availWidth,\n        ah: window.JSBNG__screen.availHeight,\n        at: window.JSBNG__screen.availTop,\n        al: window.JSBNG__screen.availLeft\n    });\n});\n__d(\"MultiBootstrapDataSource\", [\"Class\",\"DataSource\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\");\n    function i(j) {\n        this._bootstrapEndpoints = j.bootstrapEndpoints;\n        this.parent.construct(this, j);\n    };\n;\n    g.extend(i, h);\n    i.prototype.bootstrapWithoutToken = function() {\n        for (var j = 0; ((j < this._bootstrapEndpoints.length)); j++) {\n            this.fetch(this._bootstrapEndpoints[j].endpoint, ((this._bootstrapEndpoints[j].data || {\n            })), {\n                bootstrap: true\n            });\n        ;\n        };\n    ;\n    };\n    e.exports = i;\n});\n__d(\"XHPTemplate\", [\"DataStore\",\"DOM\",\"HTML\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"copyProperties\");\n    function k(m) {\n        this._model = m;\n    };\n;\n    j(k.prototype, {\n        render: function() {\n            if (i.isHTML(this._model)) {\n                this._model = h.setContent(JSBNG__document.createDocumentFragment(), this._model)[0];\n            }\n        ;\n        ;\n            return this._model.cloneNode(true);\n        },\n        build: function() {\n            return new l(this.render());\n        }\n    });\n    j(k, {\n        getNode: function(m, n) {\n            return k.getNodes(m)[n];\n        },\n        getNodes: function(m) {\n            var n = g.get(m, \"XHPTemplate:nodes\");\n            if (!n) {\n                n = {\n                };\n                var o = h.scry(m, \"[data-jsid]\");\n                o.push(m);\n                var p = o.length;\n                while (p--) {\n                    var q = o[p];\n                    n[q.getAttribute(\"data-jsid\")] = q;\n                    q.removeAttribute(\"data-jsid\");\n                };\n            ;\n                g.set(m, \"XHPTemplate:nodes\", n);\n            }\n        ;\n        ;\n            return n;\n        }\n    });\n    function l(m) {\n        this._root = m;\n        this._populateNodes();\n    };\n;\n    j(l.prototype, {\n        _populateNodes: function() {\n            this._nodes = {\n            };\n            this._leaves = {\n            };\n            var m = this._root.getElementsByTagName(\"*\");\n            for (var n = 0, o = m.length; ((n < o)); n++) {\n                var p = m[n], q = p.getAttribute(\"data-jsid\");\n                if (q) {\n                    p.removeAttribute(\"data-jsid\");\n                    this._nodes[q] = p;\n                    this._leaves[q] = !p.childNodes.length;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNode: function(m) {\n            return this._nodes[m];\n        },\n        setNodeProperty: function(m, n, o) {\n            this.getNode(m)[n] = o;\n            return this;\n        },\n        setNodeContent: function(m, n) {\n            if (!this._leaves[m]) {\n                throw new Error(((\"Can't setContent on non-leaf node: \" + m)));\n            }\n        ;\n        ;\n            h.setContent(this.getNode(m), n);\n            return this;\n        }\n    });\n    e.exports = k;\n});");
// 1063
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o14,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/25OruCXh1Wh.js",o15);
// undefined
o14 = null;
// undefined
o15 = null;
// 1067
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function e52139cb632911053c4dd3041388d6ab3f552f566(event) {\n    (window.Toggler && Toggler.hide());\n};");
// 1068
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"se8bffd2e0fd2f64e62e3c72161772c7991dbd3b5");
// 1069
geval("function e52139cb632911053c4dd3041388d6ab3f552f566(JSBNG__event) {\n    ((window.Toggler && Toggler.hide()));\n};\n;");
// 1070
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function e3f72963d1cf53e01331d66a3bc9cfaae41f8db51(event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};");
// 1071
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s03062c6a27de884aef37088d290bd2ee890c742d");
// 1072
geval("function e3f72963d1cf53e01331d66a3bc9cfaae41f8db51(JSBNG__event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};\n;");
// 1073
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function e21abdff0bdd59e6c37381e0aead4f57d25984775(event) {\n    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\n};");
// 1074
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sfc963f310e94a47d0acb9133ae994201eaa73b3d");
// 1075
geval("function e21abdff0bdd59e6c37381e0aead4f57d25984775(JSBNG__event) {\n    return ((((window.JSBNG__Event && JSBNG__Event.__inlineSubmit)) && JSBNG__Event.__inlineSubmit(this, JSBNG__event)));\n};\n;");
// 1076
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function ec258697b677429f74db17ed02d19d3d54c88877a(event) {\n    var q = $(\"q\");\n    if ((q.value == q.getAttribute(\"placeholder\"))) {\n        q.focus();\n        return false;\n    }\n;\n};");
// 1077
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sc51b9d9dc6115c07a25641408ef8887e5784d1b2");
// 1078
geval("function ec258697b677429f74db17ed02d19d3d54c88877a(JSBNG__event) {\n    var q = $(\"q\");\n    if (((q.value == q.getAttribute(\"placeholder\")))) {\n        q.JSBNG__focus();\n        return false;\n    }\n;\n;\n};\n;");
// 1079
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function e50fdbbd21fd5ba521f352cec0e1be7fbb724ba3d(event) {\n    $(\"search_first_focus\").value = ($(\"search_first_focus\").value || +new Date());\n;\n    Bootloader.loadComponents(\"SearchBootloader\", emptyFunction);\n};");
// 1080
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s3ff655a828e73492ca6bfb75716ef31389b0a422");
// 1081
geval("function e50fdbbd21fd5ba521f352cec0e1be7fbb724ba3d(JSBNG__event) {\n    $(\"search_first_focus\").value = (($(\"search_first_focus\").value || +new JSBNG__Date()));\n;\n    Bootloader.loadComponents(\"SearchBootloader\", emptyFunction);\n};\n;");
// 1082
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function ef7164e97f56b2ee2db91df3f00a38a3190171eca(event) {\n    var q = $(\"q\");\n    if ((q.value == q.getAttribute(\"placeholder\"))) {\n        q.focus();\n        return false;\n    }\n;\n};");
// 1083
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s59acc487373e71753022a1ba4f9b8f7220a4fb15");
// 1084
geval("function ef7164e97f56b2ee2db91df3f00a38a3190171eca(JSBNG__event) {\n    var q = $(\"q\");\n    if (((q.value == q.getAttribute(\"placeholder\")))) {\n        q.JSBNG__focus();\n        return false;\n    }\n;\n;\n};\n;");
// 1085
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function e74ebbac86815ea94089a5e06ad1108f657a7c324(event) {\n    Arbiter.inform(\"PagesVoiceBar/toggle\");\n};");
// 1086
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s48e4a3ada20611d1669ad7b1a7b6c39b2791f4bd");
// 1087
geval("function e74ebbac86815ea94089a5e06ad1108f657a7c324(JSBNG__event) {\n    Arbiter.inform(\"PagesVoiceBar/toggle\");\n};\n;");
// 1088
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function e417edc66566c201801cb8ca1431be5d66fc3ebd3(event) {\n    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\n};");
// 1089
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sbf8eb8c7ef907b2a4535130189faf01eb520043b");
// 1090
geval("function e417edc66566c201801cb8ca1431be5d66fc3ebd3(JSBNG__event) {\n    return ((((window.JSBNG__Event && JSBNG__Event.__inlineSubmit)) && JSBNG__Event.__inlineSubmit(this, JSBNG__event)));\n};\n;");
// 1091
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"function si_cj(m) {\n    setTimeout(function() {\n        new Image().src = ((\"http://jsbngssl.error.facebook.com/common/scribe_endpoint.php?c=si_clickjacking&t=5226\" + \"&m=\") + m);\n    }, 5000);\n};\nif (((top != self) && !false)) {\n    try {\n        if ((parent != top)) {\n            throw 1;\n        }\n    ;\n        var si_cj_d = [\"apps.facebook.com\",\"/pages/\",\"apps.beta.facebook.com\",];\n        var href = top.location.href.toLowerCase();\n        for (var i = 0; (i < si_cj_d.length); i++) {\n            if ((href.indexOf(si_cj_d[i]) >= 0)) {\n                throw 1;\n            }\n        ;\n        };\n        si_cj(\"3 \");\n    } catch (e) {\n        si_cj(\"1 \\u0009\");\n        window.document.write(\"\\u003Cstyle\\u003Ebody * {display:none !important;}\\u003C/style\\u003E\\u003Ca href=\\\"#\\\" onclick=\\\"top.location.href=window.location.href\\\" style=\\\"display:block !important;padding:10px\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_aac1e3\\\" style=\\\"display:block !important\\\"\\u003E\\u003C/i\\u003EGo to Facebook.com\\u003C/a\\u003E\");\n    };\n}\n;");
// 1092
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sfd34c5991cd60ac0b0fb84a9cb9980b1d559ec09");
// 1093
geval("function si_cj(m) {\n    JSBNG__setTimeout(function() {\n        new JSBNG__Image().src = ((((\"http://jsbngssl.error.facebook.com/common/scribe_endpoint.php?c=si_clickjacking&t=5226\" + \"&m=\")) + m));\n    }, 5000);\n};\n;\nif (((((JSBNG__top != JSBNG__self)) && !false))) {\n    try {\n        if (((parent != JSBNG__top))) {\n            throw 1;\n        }\n    ;\n    ;\n        var si_cj_d = [\"apps.facebook.com\",\"/pages/\",\"apps.beta.facebook.com\",];\n        var href = JSBNG__top.JSBNG__location.href.toLowerCase();\n        for (var i = 0; ((i < si_cj_d.length)); i++) {\n            if (((href.indexOf(si_cj_d[i]) >= 0))) {\n                throw 1;\n            }\n        ;\n        ;\n        };\n    ;\n        si_cj(\"3 \");\n    } catch (e) {\n        si_cj(\"1 \\u0009\");\n        window.JSBNG__document.write(\"\\u003Cstyle\\u003Ebody * {display:none !important;}\\u003C/style\\u003E\\u003Ca href=\\\"#\\\" onclick=\\\"top.JSBNG__location.href=window.JSBNG__location.href\\\" style=\\\"display:block !important;padding:10px\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_aac1e3\\\" style=\\\"display:block !important\\\"\\u003E\\u003C/i\\u003EGo to Facebook.com\\u003C/a\\u003E\");\n    };\n;\n}\n;\n;");
// 1094
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"Bootloader.setResourceMap({\n    yagwf: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/9oANojUgSFt.css\"\n    },\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/2OiKY3nDQvQ.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/mziGa9Rv8rV.css\"\n    },\n    \"0duP3\": {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/IvWip7NpvOi.css\"\n    },\n    ZtiRu: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/VgK6Ft5dJnU.css\"\n    },\n    aQ3gA: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/XgHKKUyeHiu.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    vFtag: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y5/r/PLl1cXAaYdQ.css\"\n    },\n    cy4a0: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/MnkdYxzuUpc.css\"\n    },\n    W3Ky6: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/eyHNmBC9R-J.css\"\n    }\n});\nBootloader.setResourceMap({\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/BeJ1_p_ZVAB.js\"\n    },\n    \"+h1d2\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/1irKUs2UFup.js\"\n    },\n    h9fqQ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/MkeN2d4l37-.js\"\n    },\n    \"63VzN\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/AgtiweS9a6U.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    pR9EP: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/fxlc3wDSY9Y.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    qu1rX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/wjDxPTNT3gj.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"xO/k5\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/ppwOo4BAmlb.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    Pc0ie: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/DoYKk3vyECC.js\"\n    },\n    hfrQl: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/6eKGrbO_7ck.js\"\n    },\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/25OruCXh1Wh.js\"\n    },\n    AsDOA: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/u8zNU2dsVui.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/sHx45baQNJv.js\"\n    },\n    \"u//Ut\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/2vpWO_t_tQV.js\"\n    },\n    bUzfU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/T5cpEiWgpks.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/t80qJDlUD7e.js\"\n    },\n    EzMPG: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/Lwtogw5v6Nb.js\"\n    },\n    \"LpC/l\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yh/r/SefZhlvAyH0.js\"\n    },\n    brbS1: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yE/r/kK2ZohtlkyG.js\"\n    },\n    \"/vuZw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yT/r/R-M_5TG55zc.js\"\n    },\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    }\n});\nBootloader.enableBootload({\n    PhotoTagger: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    AsyncDOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    HighContrastMode: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SearchBootloader: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",\"hfrQl\",\"OJTM4\",\"AsDOA\",\"0duP3\",\"63VzN\",]\n    },\n    Toggler: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    TagTokenizer: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"LpC/l\",\"h9fqQ\",\"AsDOA\",],\n        \"module\": true\n    },\n    PhotoTagApproval: {\n        resources: [\"AyUu6\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    ErrorSignal: {\n        resources: [\"AyUu6\",\"cNca2\",],\n        \"module\": true\n    },\n    DesktopNotifications: {\n        resources: [\"C3MER\",],\n        \"module\": true\n    },\n    VideoRotate: {\n        resources: [\"AyUu6\",\"H42Jh\",],\n        \"module\": true\n    },\n    PhotoSnowlift: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"+h1d2\",],\n        \"module\": true\n    },\n    FbdDialogProvider: {\n        resources: [\"/vuZw\",\"AyUu6\",\"bwsMw\",],\n        \"module\": true\n    },\n    AsyncResponse: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    trackReferrer: {\n        resources: [],\n        \"module\": true\n    },\n    Event: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    AsyncDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SpotlightShareViewer: {\n        resources: [\"AyUu6\",\"AsDOA\",\"X/Fq6\",\"zyFOp\",],\n        \"module\": true\n    },\n    ChatTabModel: {\n        resources: [\"AyUu6\",\"u//Ut\",\"OJTM4\",\"AsDOA\",\"EzMPG\",\"brbS1\",],\n        \"module\": true\n    },\n    Input: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    Music: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"63VzN\",\"qu1rX\",\"pR9EP\",\"brbS1\",\"cy4a0\",],\n        \"module\": true\n    },\n    ConfirmationDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"oE4Do\",],\n        \"module\": true\n    },\n    Dialog: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    IframeShim: {\n        resources: [\"AyUu6\",\"AsDOA\",\"MqSmz\",],\n        \"module\": true\n    },\n    PhotosButtonTooltips: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"Rs18G\",],\n        \"module\": true\n    },\n    SnowliftPicCropper: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"wxq+C\",],\n        \"module\": true\n    },\n    SpotifyJSONPRequest: {\n        resources: [\"AyUu6\",\"xO/k5\",],\n        \"module\": true\n    },\n    Live: {\n        resources: [\"AyUu6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DimensionTracking: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    PrivacyLiteNUXController: {\n        resources: [\"AyUu6\",\"AsDOA\",\"hfrQl\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    Tooltip: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n        \"module\": true\n    },\n    \"legacy:detect-broken-proxy-cache\": {\n        resources: [\"AyUu6\",]\n    },\n    PhotoInlineEditor: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"AsDOA\",\"h9fqQ\",\"AtxWD\",],\n        \"module\": true\n    },\n    LiveTimer: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    \"legacy:min-notifications-jewel\": {\n        resources: [\"AyUu6\",\"AsDOA\",\"tIw4R\",\"hofTc\",]\n    },\n    AsyncRequest: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    React: {\n        resources: [\"OJTM4\",\"AyUu6\",],\n        \"module\": true\n    },\n    PhotoTags: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"h9fqQ\",],\n        \"module\": true\n    },\n    \"fb-photos-snowlift-fullscreen-css\": {\n        resources: [\"VDymv\",]\n    },\n    PrivacyLiteFlyout: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"0duP3\",\"hfrQl\",],\n        \"module\": true\n    },\n    Form: {\n        resources: [\"AyUu6\",\"AsDOA\",],\n        \"module\": true\n    }\n});");
// 1095
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s98fb9f9da8f7cd0f10f5e0cb5320bb84e58d2be0");
// 1096
geval("Bootloader.setResourceMap({\n    yagwf: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/9oANojUgSFt.css\"\n    },\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/2OiKY3nDQvQ.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/mziGa9Rv8rV.css\"\n    },\n    \"0duP3\": {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/IvWip7NpvOi.css\"\n    },\n    ZtiRu: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/VgK6Ft5dJnU.css\"\n    },\n    aQ3gA: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/XgHKKUyeHiu.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    vFtag: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y5/r/PLl1cXAaYdQ.css\"\n    },\n    cy4a0: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/MnkdYxzuUpc.css\"\n    },\n    W3Ky6: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/eyHNmBC9R-J.css\"\n    }\n});\nBootloader.setResourceMap({\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/BeJ1_p_ZVAB.js\"\n    },\n    \"+h1d2\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/1irKUs2UFup.js\"\n    },\n    h9fqQ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/MkeN2d4l37-.js\"\n    },\n    \"63VzN\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/AgtiweS9a6U.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    pR9EP: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/fxlc3wDSY9Y.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    qu1rX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/wjDxPTNT3gj.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"xO/k5\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/ppwOo4BAmlb.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    Pc0ie: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/DoYKk3vyECC.js\"\n    },\n    hfrQl: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/6eKGrbO_7ck.js\"\n    },\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/25OruCXh1Wh.js\"\n    },\n    AsDOA: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/u8zNU2dsVui.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/sHx45baQNJv.js\"\n    },\n    \"u//Ut\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/2vpWO_t_tQV.js\"\n    },\n    bUzfU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/T5cpEiWgpks.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/t80qJDlUD7e.js\"\n    },\n    EzMPG: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/Lwtogw5v6Nb.js\"\n    },\n    \"LpC/l\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yh/r/SefZhlvAyH0.js\"\n    },\n    brbS1: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yE/r/kK2ZohtlkyG.js\"\n    },\n    \"/vuZw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yT/r/R-M_5TG55zc.js\"\n    },\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    }\n});\nBootloader.enableBootload({\n    PhotoTagger: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    AsyncDOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    HighContrastMode: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SearchBootloader: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",\"hfrQl\",\"OJTM4\",\"AsDOA\",\"0duP3\",\"63VzN\",]\n    },\n    Toggler: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    TagTokenizer: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"LpC/l\",\"h9fqQ\",\"AsDOA\",],\n        \"module\": true\n    },\n    PhotoTagApproval: {\n        resources: [\"AyUu6\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    ErrorSignal: {\n        resources: [\"AyUu6\",\"cNca2\",],\n        \"module\": true\n    },\n    DesktopNotifications: {\n        resources: [\"C3MER\",],\n        \"module\": true\n    },\n    VideoRotate: {\n        resources: [\"AyUu6\",\"H42Jh\",],\n        \"module\": true\n    },\n    PhotoSnowlift: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"+h1d2\",],\n        \"module\": true\n    },\n    FbdDialogProvider: {\n        resources: [\"/vuZw\",\"AyUu6\",\"bwsMw\",],\n        \"module\": true\n    },\n    AsyncResponse: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    trackReferrer: {\n        resources: [],\n        \"module\": true\n    },\n    JSBNG__Event: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    AsyncDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SpotlightShareViewer: {\n        resources: [\"AyUu6\",\"AsDOA\",\"X/Fq6\",\"zyFOp\",],\n        \"module\": true\n    },\n    ChatTabModel: {\n        resources: [\"AyUu6\",\"u//Ut\",\"OJTM4\",\"AsDOA\",\"EzMPG\",\"brbS1\",],\n        \"module\": true\n    },\n    Input: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    Music: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"63VzN\",\"qu1rX\",\"pR9EP\",\"brbS1\",\"cy4a0\",],\n        \"module\": true\n    },\n    ConfirmationDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"oE4Do\",],\n        \"module\": true\n    },\n    Dialog: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    IframeShim: {\n        resources: [\"AyUu6\",\"AsDOA\",\"MqSmz\",],\n        \"module\": true\n    },\n    PhotosButtonTooltips: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"Rs18G\",],\n        \"module\": true\n    },\n    SnowliftPicCropper: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"wxq+C\",],\n        \"module\": true\n    },\n    SpotifyJSONPRequest: {\n        resources: [\"AyUu6\",\"xO/k5\",],\n        \"module\": true\n    },\n    Live: {\n        resources: [\"AyUu6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DimensionTracking: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    PrivacyLiteNUXController: {\n        resources: [\"AyUu6\",\"AsDOA\",\"hfrQl\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    Tooltip: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n        \"module\": true\n    },\n    \"legacy:detect-broken-proxy-cache\": {\n        resources: [\"AyUu6\",]\n    },\n    PhotoInlineEditor: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"AsDOA\",\"h9fqQ\",\"AtxWD\",],\n        \"module\": true\n    },\n    LiveTimer: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    \"legacy:min-notifications-jewel\": {\n        resources: [\"AyUu6\",\"AsDOA\",\"tIw4R\",\"hofTc\",]\n    },\n    AsyncRequest: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    React: {\n        resources: [\"OJTM4\",\"AyUu6\",],\n        \"module\": true\n    },\n    PhotoTags: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"h9fqQ\",],\n        \"module\": true\n    },\n    \"fb-photos-snowlift-fullscreen-css\": {\n        resources: [\"VDymv\",]\n    },\n    PrivacyLiteFlyout: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"0duP3\",\"hfrQl\",],\n        \"module\": true\n    },\n    Form: {\n        resources: [\"AyUu6\",\"AsDOA\",],\n        \"module\": true\n    }\n});");
// 1097
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"require(\"InitialJSLoader\").loadOnDOMContentReady([\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]);");
// 1098
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s64e75ee044a462ca968ff449d6732ef3a2cbafdb");
// 1099
geval("require(\"InitialJSLoader\").loadOnDOMContentReady([\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]);");
// 1101
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"Bootloader.configurePage([\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"yagwf\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j13ahVukC4cjx6srZi0: function() {\n        return new RequestsJewel();\n    }\n}));\nrequire(\"InitialJSLoader\").handleServerJS({\n    require: [[\"Intl\",\"setPhonologicalRules\",[],[{\n        meta: {\n            \"/_B/\": \"([.,!?\\\\s]|^)\",\n            \"/_E/\": \"([.,!?\\\\s]|$)\"\n        },\n        patterns: {\n            \"/\\u0001(.*)('|&#039;)s\\u0001(?:'|&#039;)s(.*)/\": \"\\u0001$1$2s\\u0001$3\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/e\": \"mb_strtolower(\\\"\\u0001$1\\u0001\\\")\",\n            \"/\\\\^\\\\x01([^\\\\x01])(?=[^\\\\x01]*\\\\x01)/e\": \"mb_strtoupper(\\\"\\u0001$1\\\")\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/\": \"javascript\"\n        }\n    },],],[\"PostLoadJS\",\"loadAndRequire\",[],[\"DimensionTracking\",],],[\"PostLoadJS\",\"loadAndCall\",[],[\"HighContrastMode\",\"init\",[{\n        currentState: \"0\",\n        spacerImage: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/profile_book.php\",\"98f03730\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1065,],],[\"userAction\",\"setCustomSampleConfig\",[],[{\n        \"ua:n\": {\n            test: {\n                ua_id: {\n                    test: true\n                }\n            }\n        },\n        \"ua:i\": {\n            snowlift: {\n                action: {\n                    open: true,\n                    close: true\n                }\n            },\n            canvas: {\n                action: {\n                    mouseover: true,\n                    mouseout: true\n                }\n            }\n        }\n    },],],[\"UserActionHistory\",],[\"ScriptPath\",\"startLogging\",[],[],],[\"TimeSpentBitArrayLogger\",\"init\",[],[],],[\"PixelRatio\",\"startDetecting\",[],[1,],],[\"LiveTimer\",\"restart\",[],[1373491942,],],[\"MessagingReliabilityLogger\",],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_0\",],[{\n        __m: \"m_0_0\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"TypeaheadSearchBrowseUpsell\",\"registerForm\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\n    },],],[\"TypeaheadSearchSponsored\",\"setAuctionOptions\",[],[{\n        maxNumberAds: 3,\n        maxNumberRemovedResults: 2,\n        maxNumberResultsAndAds: 8,\n        v1: 1000000,\n        v2: 0,\n        v0: 100000,\n        v3: 1000000,\n        v4: 1000000,\n        bootstrap: false,\n        rerankingStrategy: 5\n    },],],[\"AccessibleMenu\",\"init\",[\"m_0_3\",],[{\n        __m: \"m_0_3\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_6\",],[\"Typeahead\",\"init\",[\"m_0_7\",\"m_0_6\",\"TypeaheadExcludeBootstrapFromQueryCache\",\"TypeaheadSearchBrowseUpsell\",\"TypeaheadDetectQueryLocale\",],[{\n        __m: \"m_0_7\"\n    },{\n        __m: \"m_0_6\"\n    },[{\n        __m: \"TypeaheadExcludeBootstrapFromQueryCache\"\n    },{\n        __m: \"TypeaheadSearchBrowseUpsell\"\n    },{\n        __m: \"TypeaheadDetectQueryLocale\"\n    },\"searchSponsored\",\"searchRecorderBasic\",\"regulateMemorializedUsers\",\"showLoadingIndicator\",\"initFilters\",],null,],],[\"PlaceholderListener\",],[\"PlaceholderOnsubmitFormListener\",],[\"FlipDirectionOnKeypress\",],[\"enforceMaxLength\",],[\"m_0_4\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_c\",],[{\n        __m: \"m_0_c\"\n    },],],[\"Scrollable\",],[\"m_0_e\",],[\"m_0_b\",],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_g\",],[{\n        __m: \"m_0_g\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_j\",],[\"m_0_l\",],[\"m_0_m\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_m\",],[{\n        dialog: {\n            __m: \"m_0_m\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_o\",\"m_0_p\",],[{\n        __m: \"m_0_o\"\n    },{\n        __m: \"m_0_p\"\n    },],],[\"Primer\",],[\"m_0_v\",],],\n    instances: [[\"m_0_6\",[\"Typeahead\",\"m_0_9\",\"SearchTypeaheadView\",\"SearchTypeaheadRenderer\",\"m_0_7\",\"SearchTypeaheadCore\",\"m_0_8\",],[{\n        __m: \"m_0_9\"\n    },{\n        node_id: \"u_0_0\",\n        node: null,\n        ctor: {\n            __m: \"SearchTypeaheadView\"\n        },\n        options: {\n            autoSelect: true,\n            renderer: {\n                __m: \"SearchTypeaheadRenderer\"\n            },\n            causalElement: {\n                __m: \"m_0_7\"\n            },\n            maxResults: 8,\n            minWidth: 0,\n            alignment: \"left\",\n            showBadges: 1,\n            typeObjects: {\n                app: {\n                    uid: \"app\",\n                    text: \"app\",\n                    type: \"header\",\n                    markup: \"Apps\"\n                },\n                event: {\n                    uid: \"event\",\n                    text: \"event\",\n                    type: \"header\",\n                    markup: \"Events\"\n                },\n                group: {\n                    uid: \"group\",\n                    text: \"group\",\n                    type: \"header\",\n                    markup: \"Groups\"\n                },\n                page: {\n                    uid: \"page\",\n                    text: \"page\",\n                    type: \"header\",\n                    markup: \"Pages\"\n                },\n                place: {\n                    uid: \"place\",\n                    text: \"place\",\n                    type: \"header\",\n                    markup: \"Places\"\n                },\n                shortcut: {\n                    uid: \"shortcut\",\n                    text: \"shortcut\",\n                    type: \"header\",\n                    markup: \"Facebook\"\n                },\n                user: {\n                    uid: \"user\",\n                    text: \"user\",\n                    type: \"header\",\n                    markup: \"People\"\n                },\n                song: {\n                    uid: \"song\",\n                    text: \"song\",\n                    type: \"header\",\n                    markup: \"Music\"\n                },\n                friendlist: {\n                    uid: \"friendlist\",\n                    text: \"friendlist\",\n                    type: \"header\",\n                    markup: \"Lists\"\n                },\n                hashtag_exact: {\n                    uid: \"hashtag_exact\",\n                    text: \"hashtag_exact\",\n                    type: \"header\",\n                    markup: \"Hashtag\"\n                },\n                websuggestion: {\n                    uid: \"websuggestion\",\n                    text: \"websuggestion\",\n                    type: \"header\",\n                    markup: \"Search the Web\"\n                },\n                ownsection: {\n                    uid: \"ownsection\",\n                    text: \"ownsection\",\n                    type: \"header\",\n                    markup: \"Sponsored\"\n                },\n                tophit: {\n                    uid: \"tophit\",\n                    text: \"tophit\",\n                    type: \"header\",\n                    markup: \"Top Hit\"\n                }\n            },\n            seeMoreEndpoint: \"http://jsbngssl.www.facebook.com/search/results.php?init=quick\",\n            showKeywordResultsPage: false,\n            showFilterResults: false\n        }\n    },{\n        ctor: {\n            __m: \"SearchTypeaheadCore\"\n        },\n        options: {\n            keepFocused: false,\n            resetOnSelect: true\n        }\n    },{\n        __m: \"m_0_8\"\n    },],4,],[\"m_0_4\",[\"JewelX\",\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },{\n        name: \"mercurymessages\"\n    },],2,],[\"m_0_e\",[\"ScrollableArea\",\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_b\",[\"JewelX\",\"m_0_f\",],[{\n        __m: \"m_0_f\"\n    },{\n        name: \"requests\"\n    },],2,],[\"m_0_j\",[\"JewelX\",\"m_0_i\",],[{\n        __m: \"m_0_i\"\n    },{\n        name: \"notifications\"\n    },],1,],[\"m_0_l\",[\"ScrollableArea\",\"m_0_k\",],[{\n        __m: \"m_0_k\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_m\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_n\",],[{\n        width: 300,\n        context: null,\n        contextID: null,\n        contextSelector: null,\n        position: \"left\",\n        alignment: \"left\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },]\n    },{\n        __m: \"m_0_n\"\n    },],3,],[\"m_0_v\",[\"PrivacyLiteFlyoutHelp\",\"m_0_q\",\"m_0_r\",\"m_0_s\",\"m_0_t\",\"m_0_u\",],[{\n        __m: \"m_0_q\"\n    },{\n        __m: \"m_0_r\"\n    },{\n        __m: \"m_0_s\"\n    },{\n        __m: \"m_0_t\"\n    },{\n        __m: \"m_0_u\"\n    },],1,],[\"m_0_9\",[\"SearchDataSource\",],[{\n        minWebSugg: 3,\n        minQueryLength: 2,\n        maxWebSuggToCountFetchMore: 2,\n        maxResults: 8,\n        indexedFields: [\"text\",\"tokens\",\"alias\",\"non_title_tokens\",],\n        titleFields: [\"text\",\"alias\",\"tokens\",],\n        queryData: {\n            viewer: 100006118350059,\n            rsp: \"search\",\n            context: \"search\"\n        },\n        queryEndpoint: \"/ajax/typeahead/search.php\",\n        bootstrapData: {\n            viewer: 100006118350059,\n            token: \"v7\"\n        },\n        bootstrapEndpoint: \"/ajax/typeahead/search/bootstrap.php\",\n        token: \"1372173655-7\",\n        genTime: 1373491942,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true\n    },],2,],[\"m_0_w\",[\"XHPTemplate\",\"m_0_12\",],[{\n        __m: \"m_0_12\"\n    },],2,],[\"m_0_x\",[\"XHPTemplate\",\"m_0_13\",],[{\n        __m: \"m_0_13\"\n    },],2,],[\"m_0_y\",[\"XHPTemplate\",\"m_0_14\",],[{\n        __m: \"m_0_14\"\n    },],2,],[\"m_0_z\",[\"XHPTemplate\",\"m_0_15\",],[{\n        __m: \"m_0_15\"\n    },],2,],[\"m_0_10\",[\"XHPTemplate\",\"m_0_16\",],[{\n        __m: \"m_0_16\"\n    },],2,],[\"m_0_11\",[\"XHPTemplate\",\"m_0_17\",],[{\n        __m: \"m_0_17\"\n    },],2,],],\n    define: [[\"TimeSpentConfig\",[],{\n        delay: 200000,\n        initial_timeout: 8,\n        initial_delay: 1000\n    },142,],[\"MessagingReliabilityLoggerInitialData\",[],{\n        enabled: false,\n        app: \"mercury\"\n    },44,],[\"QuicklingConfig\",[],{\n        version: \"871405;0;0;0\",\n        inactivePageRegex: \"^/(fr/u\\\\.php|ads/|advertising|ac\\\\.php|ae\\\\.php|ajax/emu/(end|f|h)\\\\.php|badges/|comments\\\\.php|connect/uiserver\\\\.php|editalbum\\\\.php.+add=1|ext/|feeds/|help([/?]|$)|identity_switch\\\\.php|intern/|login\\\\.php|logout\\\\.php|sitetour/homepage_tour\\\\.php|sorry\\\\.php|syndication\\\\.php|webmessenger|/plugins/subscribe|\\\\.pdf$|brandpermissions|gameday|pxlcld)\",\n        sessionLength: 30\n    },60,],[\"MercuryThreadlistIconTemplates\",[\"m_0_w\",\"m_0_x\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_w\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_x\"\n        }\n    },42,],[\"MercuryThreadlistConstants\",[],{\n        SEARCH_TAB: \"searchtab\",\n        JEWEL_MORE_COUNT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_COUNT: 5,\n        WEBMESSENGER_SEARCH_SNIPPET_MORE: 5,\n        RECENT_MESSAGES_LIMIT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_LIMIT: 5,\n        WEBMESSENGER_MORE_MESSAGES_COUNT: 20,\n        WEBMESSENGER_MORE_COUNT: 20,\n        JEWEL_THREAD_COUNT: 5,\n        RECENT_THREAD_OFFSET: 0,\n        MAX_CHARS_BEFORE_BREAK: 280,\n        MESSAGE_TIMESTAMP_THRESHOLD: 1209600000,\n        GROUPING_THRESHOLD: 300000,\n        MAX_UNSEEN_COUNT: 99,\n        MAX_UNREAD_COUNT: 99,\n        WEBMESSENGER_THREAD_COUNT: 20\n    },96,],[\"MessagingConfig\",[],{\n        SEND_BATCH_LIMIT: 5,\n        IDLE_CUTOFF: 30000,\n        SEND_CONNECTION_RETRIES: 2\n    },97,],[\"MercuryParticipantsConstants\",[],{\n        EMAIL_IMAGE: \"/images/messaging/threadlist/envelope.png\",\n        BIG_IMAGE_SIZE: 50,\n        IMAGE_SIZE: 32,\n        UNKNOWN_GENDER: 0\n    },109,],[\"MercuryConfig\",[],{\n        \"24h_times\": false,\n        activity_limit: 60000,\n        idle_poll_interval: 300000,\n        WebMessengerThreadSearchGK: 1,\n        ChatSaveDraftsGK: 0,\n        VideoCallingNoJavaGK: 0,\n        MessagesJewelToggleReadGK: 1,\n        SocialContextGK: 0,\n        ChatMultiTypGK: 0,\n        ChatMultiTypSendGK: 1,\n        NewVCGK: 0,\n        local_storage_crypto: null,\n        MessagesDisableForwardingGK: 1,\n        MessagesJewelOpenInChat: 0,\n        filtering_active: true,\n        idle_limit: 1800000,\n        MessagingDisplayEmojiGK: 1,\n        \"roger.seen_delay\": 15000\n    },35,],[\"DateFormatConfig\",[],{\n        weekStart: 6,\n        ordinalSuffixes: {\n            1: \"st\",\n            2: \"nd\",\n            3: \"rd\",\n            4: \"th\",\n            5: \"th\",\n            6: \"th\",\n            7: \"th\",\n            8: \"th\",\n            9: \"th\",\n            10: \"th\",\n            11: \"th\",\n            12: \"th\",\n            13: \"th\",\n            14: \"th\",\n            15: \"th\",\n            16: \"th\",\n            17: \"th\",\n            18: \"th\",\n            19: \"th\",\n            20: \"th\",\n            21: \"st\",\n            22: \"nd\",\n            23: \"rd\",\n            24: \"th\",\n            25: \"th\",\n            26: \"th\",\n            27: \"th\",\n            28: \"th\",\n            29: \"th\",\n            30: \"th\",\n            31: \"st\"\n        },\n        numericDateSeparator: \"/\",\n        numericDateOrder: [\"m\",\"d\",\"y\",],\n        shortDayNames: [\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",],\n        formats: []\n    },165,],[\"MercuryJewelTemplates\",[\"m_0_y\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_y\"\n        }\n    },39,],[\"MercuryStatusTemplates\",[\"m_0_z\",\"m_0_10\",\"m_0_11\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_z\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_10\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_11\"\n        }\n    },41,],[\"MercuryServerRequestsConfig\",[],{\n        sendMessageTimeout: 45000\n    },107,],[\"PresencePrivacyInitialData\",[],{\n        visibility: 1,\n        privacyData: {\n        },\n        onlinePolicy: 1\n    },58,],[\"HashtagSearchResultConfig\",[],{\n        boost_result: 1,\n        hashtag_cost: 10044,\n        image_url: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],],\n    elements: [[\"m_0_2\",\"u_0_1\",2,\"m_0_1\",],[\"m_0_8\",\"u_0_2\",2,],[\"m_0_7\",\"u_0_3\",4,],[\"m_0_a\",\"fbMessagesJewel\",2,],[\"m_0_c\",\"u_0_4\",2,],[\"m_0_d\",\"MercuryJewelThreadList\",2,],[\"m_0_f\",\"fbRequestsJewel\",2,],[\"m_0_g\",\"logout_form\",2,],[\"m_0_i\",\"fbNotificationsJewel\",2,],[\"m_0_k\",\"u_0_5\",2,],[\"m_0_p\",\"u_0_7\",2,],[\"m_0_u\",\"u_0_8\",2,],[\"m_0_r\",\"u_0_9\",2,],[\"m_0_t\",\"u_0_a\",2,],[\"m_0_5\",\"navSearch\",2,],[\"m_0_o\",\"u_0_6\",2,],[\"m_0_s\",\"u_0_b\",2,],[\"m_0_q\",\"u_0_c\",2,],[\"m_0_3\",\"u_0_d\",2,],[\"m_0_h\",\"logout_form\",2,],[\"m_0_0\",\"u_0_e\",2,],],\n    markup: [[\"m_0_1\",{\n        __html: \"\\u003Cform rel=\\\"async\\\" action=\\\"/ajax/marketing/optin\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"project\\\" value=\\\"320951738012113\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"product\\\" value=\\\"Graph Search\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"source\\\" value=\\\"search_taui\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"mtm mlm rfloat\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root browseSignup selected -cx-PRIVATE-uiButton__special\\\" type=\\\"submit\\\"\\u003EGet Graph Search\\u003C/button\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PUBLIC-abstractButton__disabled -cx-PRIVATE-uiButton__root browseJoined selected -cx-PRIVATE-uiButton__special\\\" disabled=\\\"1\\\" type=\\\"submit\\\"\\u003EYou&#039;re on the List!\\u003C/button\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fwb\\\"\\u003ENew! Try Graph Search\\u003C/div\\u003EFind more of what you&#039;re looking for through friends and connections. \\u003Ca href=\\\"/about/graphsearch?source=search_tau\\\"\\u003ELearn More\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n    },3,],[\"m_0_n\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide -cx-PRIVATE-fbPrivacyLiteMegaphone__dialogclose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" alt=\\\"Close\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/K4K8h0mqOQN.png\\\" width=\\\"11\\\" height=\\\"13\\\" /\\u003E\\u003C/a\\u003E\\u003Cspan class=\\\"fsl\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__introtext\\\"\\u003ETry your new Privacy Shortcuts.\\u003C/span\\u003E Visit your Activity Log to review photos you&#039;re tagged in and things you&#039;ve hidden from your timeline.\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_12\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_2gr8ms sx_22d5af\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_13\",{\n        __html: \"\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\"\n    },2,],[\"m_0_14\",{\n        __html: \"\\u003Cli\\u003E\\u003Ca class=\\\"messagesContent\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"snippetThumbnail rfloat\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-single\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-multiple\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__albumframe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"content fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"author\\\"\\u003E\\u003Cstrong data-jsid=\\\"name\\\"\\u003E\\u003C/strong\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"snippet preview fsm fwn fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"snippet\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"time\\\"\\u003E\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n    },2,],[\"m_0_15\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/O7ihJIPh_G0.gif\\\" alt=\\\"\\\" width=\\\"15\\\" height=\\\"15\\\" /\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__retrytext\\\"\\u003ESending...\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_16\",{\n        __html: \"\\u003Cdiv class=\\\"mas pam uiBoxYellow\\\"\\u003E\\u003Cstrong\\u003EThis message is no longer available\\u003C/strong\\u003E because it was identified as abusive or marked as spam.\\u003C/div\\u003E\"\n    },2,],[\"m_0_17\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/NNg0bu4GBuz.png\\\" alt=\\\"\\\" width=\\\"13\\\" height=\\\"11\\\" /\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__errortext\\\"\\u003EFailed to send\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],]\n});\nonloadRegister_DEPRECATED(function() {\n    requireLazy([\"MercuryJewel\",], function(MercuryJewel) {\n        new MercuryJewel($(\"fbMessagesFlyout\"), $(\"fbMessagesJewel\"), require(\"m_0_4\"), {\n            message_counts: [{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: 0,\n                folder: \"inbox\"\n            },{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: null,\n                folder: \"other\"\n            },],\n            payload_source: \"server_initial_data\"\n        });\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    require(\"m_0_6\").getData().onLoad(false, true);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j13ahVukC4cjx6srZi0\").init(require(\"m_0_b\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1373491942000,\n        latestNotif: null,\n        latestReadNotif: null,\n        updatePeriod: 480000,\n        cacheVersion: 2,\n        allowDesktopNotifications: false,\n        notifReceivedType: \"notification\",\n        wrapperID: \"fbNotificationsJewel\",\n        contentID: \"fbNotificationsList\",\n        shouldLogImpressions: 0,\n        useInfiniteScroll: 1,\n        persistUnreadColor: true,\n        unseenVsUnread: 0\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    Arbiter.inform(\"jewel/count-initial\", {\n        jewel: \"notifications\",\n        count: 0\n    }, Arbiter.BEHAVIOR_STATE);\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"legacy:detect-broken-proxy-cache\",], function() {\n        detect_broken_proxy_cache(\"100006118350059\", \"c_user\");\n    });\n});");
// 1102
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"saff0ba60d28624c6b11424f420dd77423a01e088");
// 1103
geval("Bootloader.configurePage([\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"yagwf\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j13ahVukC4cjx6srZi0: function() {\n        return new RequestsJewel();\n    }\n}));\nrequire(\"InitialJSLoader\").handleServerJS({\n    require: [[\"JSBNG__Intl\",\"setPhonologicalRules\",[],[{\n        meta: {\n            \"/_B/\": \"([.,!?\\\\s]|^)\",\n            \"/_E/\": \"([.,!?\\\\s]|$)\"\n        },\n        patterns: {\n            \"/\\u0001(.*)('|&#039;)s\\u0001(?:'|&#039;)s(.*)/\": \"\\u0001$1$2s\\u0001$3\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/e\": \"mb_strtolower(\\\"\\u0001$1\\u0001\\\")\",\n            \"/\\\\^\\\\x01([^\\\\x01])(?=[^\\\\x01]*\\\\x01)/e\": \"mb_strtoupper(\\\"\\u0001$1\\\")\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/\": \"javascript\"\n        }\n    },],],[\"PostLoadJS\",\"loadAndRequire\",[],[\"DimensionTracking\",],],[\"PostLoadJS\",\"loadAndCall\",[],[\"HighContrastMode\",\"init\",[{\n        currentState: \"0\",\n        spacerImage: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/profile_book.php\",\"98f03730\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1065,],],[\"userAction\",\"setCustomSampleConfig\",[],[{\n        \"ua:n\": {\n            test: {\n                ua_id: {\n                    test: true\n                }\n            }\n        },\n        \"ua:i\": {\n            snowlift: {\n                action: {\n                    open: true,\n                    close: true\n                }\n            },\n            canvas: {\n                action: {\n                    mouseover: true,\n                    mouseout: true\n                }\n            }\n        }\n    },],],[\"UserActionHistory\",],[\"ScriptPath\",\"startLogging\",[],[],],[\"TimeSpentBitArrayLogger\",\"init\",[],[],],[\"PixelRatio\",\"startDetecting\",[],[1,],],[\"LiveTimer\",\"restart\",[],[1373491942,],],[\"MessagingReliabilityLogger\",],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_0\",],[{\n        __m: \"m_0_0\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"TypeaheadSearchBrowseUpsell\",\"registerForm\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\n    },],],[\"TypeaheadSearchSponsored\",\"setAuctionOptions\",[],[{\n        maxNumberAds: 3,\n        maxNumberRemovedResults: 2,\n        maxNumberResultsAndAds: 8,\n        v1: 1000000,\n        v2: 0,\n        v0: 100000,\n        v3: 1000000,\n        v4: 1000000,\n        bootstrap: false,\n        rerankingStrategy: 5\n    },],],[\"AccessibleMenu\",\"init\",[\"m_0_3\",],[{\n        __m: \"m_0_3\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_6\",],[\"Typeahead\",\"init\",[\"m_0_7\",\"m_0_6\",\"TypeaheadExcludeBootstrapFromQueryCache\",\"TypeaheadSearchBrowseUpsell\",\"TypeaheadDetectQueryLocale\",],[{\n        __m: \"m_0_7\"\n    },{\n        __m: \"m_0_6\"\n    },[{\n        __m: \"TypeaheadExcludeBootstrapFromQueryCache\"\n    },{\n        __m: \"TypeaheadSearchBrowseUpsell\"\n    },{\n        __m: \"TypeaheadDetectQueryLocale\"\n    },\"searchSponsored\",\"searchRecorderBasic\",\"regulateMemorializedUsers\",\"showLoadingIndicator\",\"initFilters\",],null,],],[\"PlaceholderListener\",],[\"PlaceholderOnsubmitFormListener\",],[\"FlipDirectionOnKeypress\",],[\"enforceMaxLength\",],[\"m_0_4\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_c\",],[{\n        __m: \"m_0_c\"\n    },],],[\"Scrollable\",],[\"m_0_e\",],[\"m_0_b\",],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_g\",],[{\n        __m: \"m_0_g\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_j\",],[\"m_0_l\",],[\"m_0_m\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_m\",],[{\n        dialog: {\n            __m: \"m_0_m\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_o\",\"m_0_p\",],[{\n        __m: \"m_0_o\"\n    },{\n        __m: \"m_0_p\"\n    },],],[\"Primer\",],[\"m_0_v\",],],\n    instances: [[\"m_0_6\",[\"Typeahead\",\"m_0_9\",\"SearchTypeaheadView\",\"SearchTypeaheadRenderer\",\"m_0_7\",\"SearchTypeaheadCore\",\"m_0_8\",],[{\n        __m: \"m_0_9\"\n    },{\n        node_id: \"u_0_0\",\n        node: null,\n        ctor: {\n            __m: \"SearchTypeaheadView\"\n        },\n        options: {\n            autoSelect: true,\n            renderer: {\n                __m: \"SearchTypeaheadRenderer\"\n            },\n            causalElement: {\n                __m: \"m_0_7\"\n            },\n            maxResults: 8,\n            minWidth: 0,\n            alignment: \"left\",\n            showBadges: 1,\n            typeObjects: {\n                app: {\n                    uid: \"app\",\n                    text: \"app\",\n                    type: \"header\",\n                    markup: \"Apps\"\n                },\n                JSBNG__event: {\n                    uid: \"JSBNG__event\",\n                    text: \"JSBNG__event\",\n                    type: \"header\",\n                    markup: \"Events\"\n                },\n                group: {\n                    uid: \"group\",\n                    text: \"group\",\n                    type: \"header\",\n                    markup: \"Groups\"\n                },\n                page: {\n                    uid: \"page\",\n                    text: \"page\",\n                    type: \"header\",\n                    markup: \"Pages\"\n                },\n                place: {\n                    uid: \"place\",\n                    text: \"place\",\n                    type: \"header\",\n                    markup: \"Places\"\n                },\n                shortcut: {\n                    uid: \"shortcut\",\n                    text: \"shortcut\",\n                    type: \"header\",\n                    markup: \"Facebook\"\n                },\n                user: {\n                    uid: \"user\",\n                    text: \"user\",\n                    type: \"header\",\n                    markup: \"People\"\n                },\n                song: {\n                    uid: \"song\",\n                    text: \"song\",\n                    type: \"header\",\n                    markup: \"Music\"\n                },\n                friendlist: {\n                    uid: \"friendlist\",\n                    text: \"friendlist\",\n                    type: \"header\",\n                    markup: \"Lists\"\n                },\n                hashtag_exact: {\n                    uid: \"hashtag_exact\",\n                    text: \"hashtag_exact\",\n                    type: \"header\",\n                    markup: \"Hashtag\"\n                },\n                websuggestion: {\n                    uid: \"websuggestion\",\n                    text: \"websuggestion\",\n                    type: \"header\",\n                    markup: \"Search the Web\"\n                },\n                ownsection: {\n                    uid: \"ownsection\",\n                    text: \"ownsection\",\n                    type: \"header\",\n                    markup: \"Sponsored\"\n                },\n                tophit: {\n                    uid: \"tophit\",\n                    text: \"tophit\",\n                    type: \"header\",\n                    markup: \"Top Hit\"\n                }\n            },\n            seeMoreEndpoint: \"http://jsbngssl.www.facebook.com/search/results.php?init=quick\",\n            showKeywordResultsPage: false,\n            showFilterResults: false\n        }\n    },{\n        ctor: {\n            __m: \"SearchTypeaheadCore\"\n        },\n        options: {\n            keepFocused: false,\n            resetOnSelect: true\n        }\n    },{\n        __m: \"m_0_8\"\n    },],4,],[\"m_0_4\",[\"JewelX\",\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },{\n        JSBNG__name: \"mercurymessages\"\n    },],2,],[\"m_0_e\",[\"ScrollableArea\",\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_b\",[\"JewelX\",\"m_0_f\",],[{\n        __m: \"m_0_f\"\n    },{\n        JSBNG__name: \"requests\"\n    },],2,],[\"m_0_j\",[\"JewelX\",\"m_0_i\",],[{\n        __m: \"m_0_i\"\n    },{\n        JSBNG__name: \"notifications\"\n    },],1,],[\"m_0_l\",[\"ScrollableArea\",\"m_0_k\",],[{\n        __m: \"m_0_k\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_m\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_n\",],[{\n        width: 300,\n        context: null,\n        contextID: null,\n        contextSelector: null,\n        position: \"left\",\n        alignment: \"left\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },]\n    },{\n        __m: \"m_0_n\"\n    },],3,],[\"m_0_v\",[\"PrivacyLiteFlyoutHelp\",\"m_0_q\",\"m_0_r\",\"m_0_s\",\"m_0_t\",\"m_0_u\",],[{\n        __m: \"m_0_q\"\n    },{\n        __m: \"m_0_r\"\n    },{\n        __m: \"m_0_s\"\n    },{\n        __m: \"m_0_t\"\n    },{\n        __m: \"m_0_u\"\n    },],1,],[\"m_0_9\",[\"SearchDataSource\",],[{\n        minWebSugg: 3,\n        minQueryLength: 2,\n        maxWebSuggToCountFetchMore: 2,\n        maxResults: 8,\n        indexedFields: [\"text\",\"tokens\",\"alias\",\"non_title_tokens\",],\n        titleFields: [\"text\",\"alias\",\"tokens\",],\n        queryData: {\n            viewer: 100006118350059,\n            rsp: \"search\",\n            context: \"search\"\n        },\n        queryEndpoint: \"/ajax/typeahead/search.php\",\n        bootstrapData: {\n            viewer: 100006118350059,\n            token: \"v7\"\n        },\n        bootstrapEndpoint: \"/ajax/typeahead/search/bootstrap.php\",\n        token: \"1372173655-7\",\n        genTime: 1373491942,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true\n    },],2,],[\"m_0_w\",[\"XHPTemplate\",\"m_0_12\",],[{\n        __m: \"m_0_12\"\n    },],2,],[\"m_0_x\",[\"XHPTemplate\",\"m_0_13\",],[{\n        __m: \"m_0_13\"\n    },],2,],[\"m_0_y\",[\"XHPTemplate\",\"m_0_14\",],[{\n        __m: \"m_0_14\"\n    },],2,],[\"m_0_z\",[\"XHPTemplate\",\"m_0_15\",],[{\n        __m: \"m_0_15\"\n    },],2,],[\"m_0_10\",[\"XHPTemplate\",\"m_0_16\",],[{\n        __m: \"m_0_16\"\n    },],2,],[\"m_0_11\",[\"XHPTemplate\",\"m_0_17\",],[{\n        __m: \"m_0_17\"\n    },],2,],],\n    define: [[\"TimeSpentConfig\",[],{\n        delay: 200000,\n        initial_timeout: 8,\n        initial_delay: 1000\n    },142,],[\"MessagingReliabilityLoggerInitialData\",[],{\n        enabled: false,\n        app: \"mercury\"\n    },44,],[\"QuicklingConfig\",[],{\n        version: \"871405;0;0;0\",\n        inactivePageRegex: \"^/(fr/u\\\\.php|ads/|advertising|ac\\\\.php|ae\\\\.php|ajax/emu/(end|f|h)\\\\.php|badges/|comments\\\\.php|connect/uiserver\\\\.php|editalbum\\\\.php.+add=1|ext/|feeds/|help([/?]|$)|identity_switch\\\\.php|intern/|login\\\\.php|logout\\\\.php|sitetour/homepage_tour\\\\.php|sorry\\\\.php|syndication\\\\.php|webmessenger|/plugins/subscribe|\\\\.pdf$|brandpermissions|gameday|pxlcld)\",\n        sessionLength: 30\n    },60,],[\"MercuryThreadlistIconTemplates\",[\"m_0_w\",\"m_0_x\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_w\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_x\"\n        }\n    },42,],[\"MercuryThreadlistConstants\",[],{\n        SEARCH_TAB: \"searchtab\",\n        JEWEL_MORE_COUNT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_COUNT: 5,\n        WEBMESSENGER_SEARCH_SNIPPET_MORE: 5,\n        RECENT_MESSAGES_LIMIT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_LIMIT: 5,\n        WEBMESSENGER_MORE_MESSAGES_COUNT: 20,\n        WEBMESSENGER_MORE_COUNT: 20,\n        JEWEL_THREAD_COUNT: 5,\n        RECENT_THREAD_OFFSET: 0,\n        MAX_CHARS_BEFORE_BREAK: 280,\n        MESSAGE_TIMESTAMP_THRESHOLD: 1209600000,\n        GROUPING_THRESHOLD: 300000,\n        MAX_UNSEEN_COUNT: 99,\n        MAX_UNREAD_COUNT: 99,\n        WEBMESSENGER_THREAD_COUNT: 20\n    },96,],[\"MessagingConfig\",[],{\n        SEND_BATCH_LIMIT: 5,\n        IDLE_CUTOFF: 30000,\n        SEND_CONNECTION_RETRIES: 2\n    },97,],[\"MercuryParticipantsConstants\",[],{\n        EMAIL_IMAGE: \"/images/messaging/threadlist/envelope.png\",\n        BIG_IMAGE_SIZE: 50,\n        IMAGE_SIZE: 32,\n        UNKNOWN_GENDER: 0\n    },109,],[\"MercuryConfig\",[],{\n        \"24h_times\": false,\n        activity_limit: 60000,\n        idle_poll_interval: 300000,\n        WebMessengerThreadSearchGK: 1,\n        ChatSaveDraftsGK: 0,\n        VideoCallingNoJavaGK: 0,\n        MessagesJewelToggleReadGK: 1,\n        SocialContextGK: 0,\n        ChatMultiTypGK: 0,\n        ChatMultiTypSendGK: 1,\n        NewVCGK: 0,\n        local_storage_crypto: null,\n        MessagesDisableForwardingGK: 1,\n        MessagesJewelOpenInChat: 0,\n        filtering_active: true,\n        idle_limit: 1800000,\n        MessagingDisplayEmojiGK: 1,\n        \"roger.seen_delay\": 15000\n    },35,],[\"DateFormatConfig\",[],{\n        weekStart: 6,\n        ordinalSuffixes: {\n            1: \"st\",\n            2: \"nd\",\n            3: \"rd\",\n            4: \"th\",\n            5: \"th\",\n            6: \"th\",\n            7: \"th\",\n            8: \"th\",\n            9: \"th\",\n            10: \"th\",\n            11: \"th\",\n            12: \"th\",\n            13: \"th\",\n            14: \"th\",\n            15: \"th\",\n            16: \"th\",\n            17: \"th\",\n            18: \"th\",\n            19: \"th\",\n            20: \"th\",\n            21: \"st\",\n            22: \"nd\",\n            23: \"rd\",\n            24: \"th\",\n            25: \"th\",\n            26: \"th\",\n            27: \"th\",\n            28: \"th\",\n            29: \"th\",\n            30: \"th\",\n            31: \"st\"\n        },\n        numericDateSeparator: \"/\",\n        numericDateOrder: [\"m\",\"d\",\"y\",],\n        shortDayNames: [\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",],\n        formats: []\n    },165,],[\"MercuryJewelTemplates\",[\"m_0_y\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_y\"\n        }\n    },39,],[\"MercuryStatusTemplates\",[\"m_0_z\",\"m_0_10\",\"m_0_11\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_z\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_10\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_11\"\n        }\n    },41,],[\"MercuryServerRequestsConfig\",[],{\n        sendMessageTimeout: 45000\n    },107,],[\"PresencePrivacyInitialData\",[],{\n        visibility: 1,\n        privacyData: {\n        },\n        onlinePolicy: 1\n    },58,],[\"HashtagSearchResultConfig\",[],{\n        boost_result: 1,\n        hashtag_cost: 10044,\n        image_url: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],],\n    elements: [[\"m_0_2\",\"u_0_1\",2,\"m_0_1\",],[\"m_0_8\",\"u_0_2\",2,],[\"m_0_7\",\"u_0_3\",4,],[\"m_0_a\",\"fbMessagesJewel\",2,],[\"m_0_c\",\"u_0_4\",2,],[\"m_0_d\",\"MercuryJewelThreadList\",2,],[\"m_0_f\",\"fbRequestsJewel\",2,],[\"m_0_g\",\"logout_form\",2,],[\"m_0_i\",\"fbNotificationsJewel\",2,],[\"m_0_k\",\"u_0_5\",2,],[\"m_0_p\",\"u_0_7\",2,],[\"m_0_u\",\"u_0_8\",2,],[\"m_0_r\",\"u_0_9\",2,],[\"m_0_t\",\"u_0_a\",2,],[\"m_0_5\",\"navSearch\",2,],[\"m_0_o\",\"u_0_6\",2,],[\"m_0_s\",\"u_0_b\",2,],[\"m_0_q\",\"u_0_c\",2,],[\"m_0_3\",\"u_0_d\",2,],[\"m_0_h\",\"logout_form\",2,],[\"m_0_0\",\"u_0_e\",2,],],\n    markup: [[\"m_0_1\",{\n        __html: \"\\u003Cform rel=\\\"async\\\" action=\\\"/ajax/marketing/optin\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"project\\\" value=\\\"320951738012113\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"product\\\" value=\\\"Graph Search\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"source\\\" value=\\\"search_taui\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"mtm mlm rfloat\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root browseSignup selected -cx-PRIVATE-uiButton__special\\\" type=\\\"submit\\\"\\u003EGet Graph Search\\u003C/button\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PUBLIC-abstractButton__disabled -cx-PRIVATE-uiButton__root browseJoined selected -cx-PRIVATE-uiButton__special\\\" disabled=\\\"1\\\" type=\\\"submit\\\"\\u003EYou&#039;re on the List!\\u003C/button\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fwb\\\"\\u003ENew! Try Graph Search\\u003C/div\\u003EFind more of what you&#039;re looking for through friends and connections. \\u003Ca href=\\\"/about/graphsearch?source=search_tau\\\"\\u003ELearn More\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n    },3,],[\"m_0_n\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide -cx-PRIVATE-fbPrivacyLiteMegaphone__dialogclose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" alt=\\\"Close\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/K4K8h0mqOQN.png\\\" width=\\\"11\\\" height=\\\"13\\\" /\\u003E\\u003C/a\\u003E\\u003Cspan class=\\\"fsl\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__introtext\\\"\\u003ETry your new Privacy Shortcuts.\\u003C/span\\u003E Visit your Activity Log to review photos you&#039;re tagged in and things you&#039;ve hidden from your timeline.\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_12\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_2gr8ms sx_22d5af\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_13\",{\n        __html: \"\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\"\n    },2,],[\"m_0_14\",{\n        __html: \"\\u003Cli\\u003E\\u003Ca class=\\\"messagesContent\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"snippetThumbnail rfloat\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-single\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-multiple\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__albumframe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"content fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"author\\\"\\u003E\\u003Cstrong data-jsid=\\\"name\\\"\\u003E\\u003C/strong\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"snippet preview fsm fwn fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"snippet\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"time\\\"\\u003E\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n    },2,],[\"m_0_15\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/O7ihJIPh_G0.gif\\\" alt=\\\"\\\" width=\\\"15\\\" height=\\\"15\\\" /\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__retrytext\\\"\\u003ESending...\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_16\",{\n        __html: \"\\u003Cdiv class=\\\"mas pam uiBoxYellow\\\"\\u003E\\u003Cstrong\\u003EThis message is no longer available\\u003C/strong\\u003E because it was identified as abusive or marked as spam.\\u003C/div\\u003E\"\n    },2,],[\"m_0_17\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/NNg0bu4GBuz.png\\\" alt=\\\"\\\" width=\\\"13\\\" height=\\\"11\\\" /\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__errortext\\\"\\u003EFailed to send\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],]\n});\nonloadRegister_DEPRECATED(function() {\n    requireLazy([\"MercuryJewel\",], function(MercuryJewel) {\n        new MercuryJewel($(\"fbMessagesFlyout\"), $(\"fbMessagesJewel\"), require(\"m_0_4\"), {\n            message_counts: [{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: 0,\n                folder: \"inbox\"\n            },{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: null,\n                folder: \"other\"\n            },],\n            payload_source: \"server_initial_data\"\n        });\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    require(\"m_0_6\").getData().onLoad(false, true);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j13ahVukC4cjx6srZi0\").init(require(\"m_0_b\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1373491942000,\n        latestNotif: null,\n        latestReadNotif: null,\n        updatePeriod: 480000,\n        cacheVersion: 2,\n        allowDesktopNotifications: false,\n        notifReceivedType: \"notification\",\n        wrapperID: \"fbNotificationsJewel\",\n        contentID: \"fbNotificationsList\",\n        shouldLogImpressions: 0,\n        useInfiniteScroll: 1,\n        persistUnreadColor: true,\n        unseenVsUnread: 0\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    Arbiter.inform(\"jewel/count-initial\", {\n        jewel: \"notifications\",\n        count: 0\n    }, Arbiter.BEHAVIOR_STATE);\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"legacy:detect-broken-proxy-cache\",], function() {\n        detect_broken_proxy_cache(\"100006118350059\", \"c_user\");\n    });\n});");
// 1369
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1370
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"se151abf45cd37f530e5c8a27b753d912bd1be56a");
// 1371
geval("var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1377
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]\n});");
// 1378
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s68f4226686f406c7529810be6ce7052936c6c7e8");
// 1379
geval("bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]\n});");
// 1407
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_main_column: {\n            container_id: \"u_0_f\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineController\",\"init\",[],[\"1055580469\",\"timeline\",{\n            has_fixed_ads: false,\n            one_column_minimal: true\n        },],],]\n    },\n    bootloadable: {\n    },\n    resource_map: {\n        jsIYP: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/U4R9rWNhZti.js\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_timeline_main_column\",\n    phase: 1\n});");
// 1408
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sd2fa51e29bec35cb4673fc5e517c4b022bc3ec70");
// 1409
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_main_column: {\n            container_id: \"u_0_f\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineController\",\"init\",[],[\"1055580469\",\"timeline\",{\n            has_fixed_ads: false,\n            one_column_minimal: true\n        },],],]\n    },\n    bootloadable: {\n    },\n    resource_map: {\n        jsIYP: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/U4R9rWNhZti.js\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_timeline_main_column\",\n    phase: 1\n});");
// 1455
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_timeline_main_column\",],\n    content: {\n        pagelet_main_column_personal: {\n            container_id: \"u_0_m\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_18\",],[{\n            __m: \"m_0_18\"\n        },\"recent\",{\n            profile_id: 1055580469,\n            start: 0,\n            end: 1375340399,\n            query_type: 39,\n            section_pagelet_id: \"pagelet_timeline_recent\",\n            load_immediately: true\n        },true,null,0,-1,],],[\"TimelineCoverCollapse\",\"collapse\",[\"m_0_19\",],[{\n            __m: \"m_0_19\"\n        },160,],],[\"m_0_1a\",],[\"m_0_1c\",],[\"m_0_1d\",],[\"m_0_1f\",],[\"m_0_1g\",],[\"m_0_1j\",],[\"PhotoSnowlift\",\"initWithSpotlight\",[\"m_0_1j\",],[{\n            __m: \"m_0_1j\"\n        },{\n            refresh_fast: true,\n            refresh_rate: 20000,\n            hw_rendering: false,\n            pivot_hover: false,\n            pivot_end_metric: false,\n            pagers_on_keyboard_nav: false,\n            og_videos: false,\n            snowlift_profile_pic_cropper: false,\n            product_collections_visible: false,\n            snowlift_hover_shows_all_tags_and_faces: true,\n            resize_comments_for_ads: false,\n            snowlift_redesign: false,\n            min_ads: 2\n        },],],[\"PhotoSnowlift\",\"touch\",[\"m_0_1i\",],[{\n            __m: \"m_0_1i\"\n        },],],],\n        instances: [[\"m_0_1a\",[\"TimelineCover\",\"m_0_19\",],[{\n            __m: \"m_0_19\"\n        },{\n            cover_height: 315,\n            cover_width: 851\n        },],1,],[\"m_0_1c\",[\"TimelineNavLight\",\"m_0_1b\",],[{\n            __m: \"m_0_1b\"\n        },],1,],[\"m_0_1d\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_1f\",[\"PopoverAsyncMenu\",\"m_0_1g\",\"m_0_1e\",\"m_0_1d\",\"PopoverMenuShowOnHover\",],[{\n            __m: \"m_0_1g\"\n        },{\n            __m: \"m_0_1e\"\n        },{\n            __m: \"m_0_1d\"\n        },\"/ajax/timeline/collections/nav_light_dropdown_menu/?profileid=1055580469&offset=3\",[{\n            __m: \"PopoverMenuShowOnHover\"\n        },],],1,],[\"m_0_1g\",[\"Popover\",\"m_0_1h\",\"m_0_1e\",],[{\n            __m: \"m_0_1h\"\n        },{\n            __m: \"m_0_1e\"\n        },[],{\n            alignh: \"left\"\n        },],3,],[\"m_0_1j\",[\"Spotlight\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"m_0_1k\",],[{\n            addedBehaviors: [{\n                __m: \"LayerHideOnBlur\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },],\n            attributes: {\n                id: \"photos_snowlift\",\n                tabindex: \"0\",\n                role: \"region\",\n                \"aria-label\": \"Facebook Photo Theater\",\n                \"aria-busy\": \"true\"\n            },\n            classNames: [\"fbPhotoSnowlift\",\"fbxPhoto\",]\n        },{\n            __m: \"m_0_1k\"\n        },],3,],],\n        elements: [[\"m_0_18\",\"pagelet_timeline_recent\",2,],[\"m_0_19\",\"u_0_g\",4,],[\"m_0_1b\",\"u_0_h\",2,],[\"m_0_1h\",\"u_0_i\",2,],[\"m_0_1e\",\"u_0_j\",4,],[\"m_0_1l\",\"u_0_l\",2,\"m_0_1k\",],],\n        markup: [[\"m_0_1k\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-uiSpotlight__content\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftContainer uiContextualLayerParent\\\" data-ft=\\\"&#123;&quot;type&quot;:44&#125;\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftPopup\\\"\\u003E\\u003Cdiv class=\\\"stageWrapper lfloat\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftFullScreen fullScreenSwitch\\\" id=\\\"fullScreenSwitch\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Enter Fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenSwitch\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenClose\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stage\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosCornerWantButton\\\" id=\\\"fbPhotoSnowliftWantButton\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"spotlight spotlight\\\" src=\\\"/images/spacer.gif\\\" /\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxes tagContainer\\\" id=\\\"fbPhotoSnowliftTagBoxes\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotoTagApproval\\\" id=\\\"fbPhotoSnowliftTagApproval\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbPhotoCVInfo__wrapper\\\" id=\\\"fbPhotoSnowliftComputerVisionInfo\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"videoStage\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stageActions\\\" id=\\\"snowliftStageActions\\\"\\u003E\\u003Cdiv class=\\\"clearfix snowliftOverlay snowliftOverlayBar rightButtons\\\"\\u003E\\u003Cdiv class=\\\"overlayBarButtons rfloat\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle fbPhotosPhotoActions\\\" id=\\\"fbPhotoSnowliftActions\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoButtons\\\" id=\\\"fbPhotoSnowliftButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mediaTitleInfo\\\"\\u003E\\u003Cdiv class=\\\"mediaTitleBoxFlex\\\"\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftMediaTitle\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"mlm hidden_elem\\\" id=\\\"fbPhotoSnowliftPositionAndCount\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mediaTitleInfoSpacer\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxBase newTagBox hidden_elem\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"borderTagBox\\\"\\u003E\\u003Cdiv class=\\\"innerTagBox\\\"\\u003E\\u003Cdiv class=\\\"ieContentFix\\\"\\u003E\\u00a0\\u00a0\\u00a0\\u00a0\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"tag\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"tagPointer\\\"\\u003E\\u003Ci class=\\\"tagArrow img sp_9kaae3 sx_883a69\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"tagName\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"snowliftPager prev\\\" title=\\\"Previous\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Ca class=\\\"snowliftPager next\\\" title=\\\"Next\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"photoError stageError\\\" id=\\\"fbPhotoSnowliftError\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rhc photoUfiContainer\\\"\\u003E\\u003Cdiv class=\\\"rhcHeader\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftControls\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to close\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater fullscreenCommentClose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftInlineEditor\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cform rel=\\\"async\\\" class=\\\"fbPhotosSnowliftFeedbackForm rhcBody commentable_item autoexpand_mode\\\" method=\\\"post\\\" action=\\\"/ajax/ufi/modify.php\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_l\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"charset_test\\\" value=\\\"&euro;,&acute;,\\u20ac,\\u00b4,\\u6c34,\\u0414,\\u0404\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cdiv class=\\\"uiScrollableArea rhcScroller native\\\" style=\\\"width:285px;\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaWrap scrollable\\\" aria-label=\\\"Scrollable region\\\" tabindex=\\\"0\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaBody\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaContent\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSpecificAudience\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftAuthorInfo\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\" id=\\\"fbPhotoSnowliftAuthorPic\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fbPhotoContributorName\\\" id=\\\"fbPhotoSnowliftAuthorName\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mrs fsm fwn fcg\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSubscribe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftTimestamp\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mls\\\" id=\\\"fbPhotoSnowliftAudienceSelector\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosOnProfile\\\" id=\\\"fbPhotoSnowliftOnProfile\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftViewOnApp\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftUseApp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cspan class=\\\"fbPhotosPhotoCaption\\\" tabindex=\\\"0\\\" aria-live=\\\"polite\\\" data-ft=\\\"&#123;&quot;type&quot;:45&#125;\\\" id=\\\"fbPhotoSnowliftCaption\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"fbPhotoTagList\\\" id=\\\"fbPhotoSnowliftTagList\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"fbPhotoPagesTagList\\\" id=\\\"fbPhotoSnowliftPagesTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pts fbPhotoLegacyTagList\\\" id=\\\"fbPhotoSnowliftLegacyTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoOwnerButtons stat_elem\\\" id=\\\"fbPhotoSnowliftOwnerButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftFeedback\\\" id=\\\"fbPhotoSnowliftFeedback\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowboxFeedbackInput\\\" id=\\\"fbPhotoSnowliftFeedbackInput\\\"\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftProductMetadata\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-snowliftAds__root rhcFooter\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"pagelet_photo_viewer_init\\\" class=\\\"hidden_elem\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],[\"m_0_1i\",{\n            __html: \"\\u003Cdiv\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"OoPZI\",\"0duP3\",],\n    bootloadable: {\n        PhotoCropper: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"h9fqQ\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"3SGVa\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/4vE3iKZfu7u.js\"\n        },\n        OoPZI: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/samJwyK4rm2.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",\"+h1d2\",],\n    displayJS: [\"AyUu6\",],\n    id: \"pagelet_main_column_personal\",\n    phase: 1\n});");
// 1456
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s8a14950fe4de582473f22a36ffe56c1d861163e3");
// 1457
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_timeline_main_column\",],\n    JSBNG__content: {\n        pagelet_main_column_personal: {\n            container_id: \"u_0_m\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_18\",],[{\n            __m: \"m_0_18\"\n        },\"recent\",{\n            profile_id: 1055580469,\n            start: 0,\n            end: 1375340399,\n            query_type: 39,\n            section_pagelet_id: \"pagelet_timeline_recent\",\n            load_immediately: true\n        },true,null,0,-1,],],[\"TimelineCoverCollapse\",\"collapse\",[\"m_0_19\",],[{\n            __m: \"m_0_19\"\n        },160,],],[\"m_0_1a\",],[\"m_0_1c\",],[\"m_0_1d\",],[\"m_0_1f\",],[\"m_0_1g\",],[\"m_0_1j\",],[\"PhotoSnowlift\",\"initWithSpotlight\",[\"m_0_1j\",],[{\n            __m: \"m_0_1j\"\n        },{\n            refresh_fast: true,\n            refresh_rate: 20000,\n            hw_rendering: false,\n            pivot_hover: false,\n            pivot_end_metric: false,\n            pagers_on_keyboard_nav: false,\n            og_videos: false,\n            snowlift_profile_pic_cropper: false,\n            product_collections_visible: false,\n            snowlift_hover_shows_all_tags_and_faces: true,\n            resize_comments_for_ads: false,\n            snowlift_redesign: false,\n            min_ads: 2\n        },],],[\"PhotoSnowlift\",\"touch\",[\"m_0_1i\",],[{\n            __m: \"m_0_1i\"\n        },],],],\n        instances: [[\"m_0_1a\",[\"TimelineCover\",\"m_0_19\",],[{\n            __m: \"m_0_19\"\n        },{\n            cover_height: 315,\n            cover_width: 851\n        },],1,],[\"m_0_1c\",[\"TimelineNavLight\",\"m_0_1b\",],[{\n            __m: \"m_0_1b\"\n        },],1,],[\"m_0_1d\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_1f\",[\"PopoverAsyncMenu\",\"m_0_1g\",\"m_0_1e\",\"m_0_1d\",\"PopoverMenuShowOnHover\",],[{\n            __m: \"m_0_1g\"\n        },{\n            __m: \"m_0_1e\"\n        },{\n            __m: \"m_0_1d\"\n        },\"/ajax/timeline/collections/nav_light_dropdown_menu/?profileid=1055580469&offset=3\",[{\n            __m: \"PopoverMenuShowOnHover\"\n        },],],1,],[\"m_0_1g\",[\"Popover\",\"m_0_1h\",\"m_0_1e\",],[{\n            __m: \"m_0_1h\"\n        },{\n            __m: \"m_0_1e\"\n        },[],{\n            alignh: \"left\"\n        },],3,],[\"m_0_1j\",[\"Spotlight\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"m_0_1k\",],[{\n            addedBehaviors: [{\n                __m: \"LayerHideOnBlur\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },],\n            attributes: {\n                id: \"photos_snowlift\",\n                tabindex: \"0\",\n                role: \"region\",\n                \"aria-label\": \"Facebook Photo Theater\",\n                \"aria-busy\": \"true\"\n            },\n            classNames: [\"fbPhotoSnowlift\",\"fbxPhoto\",]\n        },{\n            __m: \"m_0_1k\"\n        },],3,],],\n        elements: [[\"m_0_18\",\"pagelet_timeline_recent\",2,],[\"m_0_19\",\"u_0_g\",4,],[\"m_0_1b\",\"u_0_h\",2,],[\"m_0_1h\",\"u_0_i\",2,],[\"m_0_1e\",\"u_0_j\",4,],[\"m_0_1l\",\"u_0_l\",2,\"m_0_1k\",],],\n        markup: [[\"m_0_1k\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-uiSpotlight__content\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftContainer uiContextualLayerParent\\\" data-ft=\\\"&#123;&quot;type&quot;:44&#125;\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftPopup\\\"\\u003E\\u003Cdiv class=\\\"stageWrapper lfloat\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftFullScreen fullScreenSwitch\\\" id=\\\"fullScreenSwitch\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Enter Fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenSwitch\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenClose\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stage\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosCornerWantButton\\\" id=\\\"fbPhotoSnowliftWantButton\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"spotlight spotlight\\\" src=\\\"/images/spacer.gif\\\" /\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxes tagContainer\\\" id=\\\"fbPhotoSnowliftTagBoxes\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotoTagApproval\\\" id=\\\"fbPhotoSnowliftTagApproval\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbPhotoCVInfo__wrapper\\\" id=\\\"fbPhotoSnowliftComputerVisionInfo\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"videoStage\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stageActions\\\" id=\\\"snowliftStageActions\\\"\\u003E\\u003Cdiv class=\\\"clearfix snowliftOverlay snowliftOverlayBar rightButtons\\\"\\u003E\\u003Cdiv class=\\\"overlayBarButtons rfloat\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle fbPhotosPhotoActions\\\" id=\\\"fbPhotoSnowliftActions\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoButtons\\\" id=\\\"fbPhotoSnowliftButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mediaTitleInfo\\\"\\u003E\\u003Cdiv class=\\\"mediaTitleBoxFlex\\\"\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftMediaTitle\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"mlm hidden_elem\\\" id=\\\"fbPhotoSnowliftPositionAndCount\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mediaTitleInfoSpacer\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxBase newTagBox hidden_elem\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"borderTagBox\\\"\\u003E\\u003Cdiv class=\\\"innerTagBox\\\"\\u003E\\u003Cdiv class=\\\"ieContentFix\\\"\\u003E\\u00a0\\u00a0\\u00a0\\u00a0\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"tag\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"tagPointer\\\"\\u003E\\u003Ci class=\\\"tagArrow img sp_9kaae3 sx_883a69\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"tagName\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"snowliftPager prev\\\" title=\\\"Previous\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Ca class=\\\"snowliftPager next\\\" title=\\\"Next\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"photoError stageError\\\" id=\\\"fbPhotoSnowliftError\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rhc photoUfiContainer\\\"\\u003E\\u003Cdiv class=\\\"rhcHeader\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftControls\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to close\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater fullscreenCommentClose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftInlineEditor\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cform rel=\\\"async\\\" class=\\\"fbPhotosSnowliftFeedbackForm rhcBody commentable_item autoexpand_mode\\\" method=\\\"post\\\" action=\\\"/ajax/ufi/modify.php\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_l\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"charset_test\\\" value=\\\"&euro;,&acute;,\\u20ac,\\u00b4,\\u6c34,\\u0414,\\u0404\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cdiv class=\\\"uiScrollableArea rhcScroller native\\\" style=\\\"width:285px;\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaWrap scrollable\\\" aria-label=\\\"Scrollable region\\\" tabindex=\\\"0\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaBody\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaContent\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSpecificAudience\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftAuthorInfo\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\" id=\\\"fbPhotoSnowliftAuthorPic\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fbPhotoContributorName\\\" id=\\\"fbPhotoSnowliftAuthorName\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mrs fsm fwn fcg\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSubscribe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftTimestamp\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mls\\\" id=\\\"fbPhotoSnowliftAudienceSelector\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosOnProfile\\\" id=\\\"fbPhotoSnowliftOnProfile\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftViewOnApp\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftUseApp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cspan class=\\\"fbPhotosPhotoCaption\\\" tabindex=\\\"0\\\" aria-live=\\\"polite\\\" data-ft=\\\"&#123;&quot;type&quot;:45&#125;\\\" id=\\\"fbPhotoSnowliftCaption\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"fbPhotoTagList\\\" id=\\\"fbPhotoSnowliftTagList\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"fbPhotoPagesTagList\\\" id=\\\"fbPhotoSnowliftPagesTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pts fbPhotoLegacyTagList\\\" id=\\\"fbPhotoSnowliftLegacyTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoOwnerButtons stat_elem\\\" id=\\\"fbPhotoSnowliftOwnerButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftFeedback\\\" id=\\\"fbPhotoSnowliftFeedback\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowboxFeedbackInput\\\" id=\\\"fbPhotoSnowliftFeedbackInput\\\"\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftProductMetadata\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-snowliftAds__root rhcFooter\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"pagelet_photo_viewer_init\\\" class=\\\"hidden_elem\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],[\"m_0_1i\",{\n            __html: \"\\u003Cdiv\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"OoPZI\",\"0duP3\",],\n    bootloadable: {\n        PhotoCropper: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"h9fqQ\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"3SGVa\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/4vE3iKZfu7u.js\"\n        },\n        OoPZI: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/samJwyK4rm2.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",\"+h1d2\",],\n    displayJS: [\"AyUu6\",],\n    id: \"pagelet_main_column_personal\",\n    phase: 1\n});");
// 1502
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    content: {\n        pagelet_escape_hatch: {\n            container_id: \"u_0_q\"\n        }\n    },\n    jsmods: {\n        require: [[\"AddFriendButton\",\"init\",[\"m_0_1m\",],[{\n            __m: \"m_0_1m\"\n        },1055580469,false,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",null,null,null,false,],],[\"m_0_1n\",],[\"FriendListFlyoutController\",\"init\",[\"m_0_1n\",],[{\n            __m: \"m_0_1n\"\n        },50,],],[\"AddFriendButton\",\"init\",[\"m_0_1p\",],[{\n            __m: \"m_0_1p\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1n\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1o\",],[{\n            width: 192,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1o\"\n        },],3,],],\n        elements: [[\"m_0_1p\",\"u_0_n\",2,],[\"m_0_1m\",\"u_0_p\",2,],],\n        markup: [[\"m_0_1o\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"FriendListFlyoutLoading\\\"\\u003E\\u003Cimg class=\\\"mvl center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"3SGVa\",],\n    id: \"pagelet_escape_hatch\",\n    phase: 1\n});");
// 1503
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sea2572ca0d18287985c2128ba26ce805e0daff4b");
// 1504
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    JSBNG__content: {\n        pagelet_escape_hatch: {\n            container_id: \"u_0_q\"\n        }\n    },\n    jsmods: {\n        require: [[\"AddFriendButton\",\"init\",[\"m_0_1m\",],[{\n            __m: \"m_0_1m\"\n        },1055580469,false,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",null,null,null,false,],],[\"m_0_1n\",],[\"FriendListFlyoutController\",\"init\",[\"m_0_1n\",],[{\n            __m: \"m_0_1n\"\n        },50,],],[\"AddFriendButton\",\"init\",[\"m_0_1p\",],[{\n            __m: \"m_0_1p\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1n\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1o\",],[{\n            width: 192,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1o\"\n        },],3,],],\n        elements: [[\"m_0_1p\",\"u_0_n\",2,],[\"m_0_1m\",\"u_0_p\",2,],],\n        markup: [[\"m_0_1o\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"FriendListFlyoutLoading\\\"\\u003E\\u003Cimg class=\\\"mvl center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"3SGVa\",],\n    id: \"pagelet_escape_hatch\",\n    phase: 1\n});");
// 1523
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    content: {\n        pagelet_above_header_timeline: \"\"\n    },\n    jsmods: {\n        require: [[\"m_0_1q\",],[\"m_0_1s\",],[\"TimelineCurationNUXController\",\"init\",[\"m_0_1q\",\"m_0_1s\",],[{\n            next_step: \"add_button\",\n            dialogs: {\n                add_button: {\n                    __m: \"m_0_1q\"\n                },\n                privacy: {\n                    __m: \"m_0_1s\"\n                }\n            }\n        },],],],\n        instances: [[\"m_0_1q\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_1r\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"above\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },]\n        },{\n            __m: \"m_0_1r\"\n        },],3,],[\"m_0_1s\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1t\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"right\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1t\"\n        },],3,],],\n        define: [[\"AdsCurrencyConfig\",[],{\n            currencies: {\n                ARS: [\"{symbol} {amount}\",\"$\",100,],\n                AUD: [\"{symbol}{amount}\",\"$\",100,],\n                BOB: [\"{symbol} {amount}\",\"$b\",100,],\n                BRL: [\"{symbol} {amount}\",\"R$\",100,],\n                GBP: [\"{symbol}{amount}\",\"\\u00a3\",100,],\n                CAD: [\"{symbol}{amount}\",\"$\",100,],\n                CLP: [\"{symbol} {amount}\",\"$\",1,],\n                CNY: [\"{amount} {symbol}\",\"\\uffe5\",100,],\n                COP: [\"{symbol} {amount}\",\"$\",1,],\n                CRC: [\"{symbol}{amount}\",\"\\u20a1\",1,],\n                CZK: [\"{amount} {symbol}\",\"K\\u010d\",100,],\n                DKK: [\"{symbol} {amount}\",\"DKK\",100,],\n                EUR: [\"{symbol} {amount}\",\"\\u20ac\",100,],\n                GTQ: [\"{symbol}{amount}\",\"Q\",100,],\n                HNL: [\"{symbol} {amount}\",\"L.\",100,],\n                HKD: [\"{symbol}{amount}\",\"$\",100,],\n                HUF: [\"{amount} {symbol}\",\"Ft\",1,],\n                ISK: [\"{amount} {symbol}\",\"kr.\",1,],\n                INR: [\"{symbol} {amount}\",\"\\u0930\\u0941\",100,],\n                IDR: [\"{symbol} {amount}\",\"Rp\",1,],\n                ILS: [\"{symbol} {amount}\",\"\\u20aa\",100,],\n                JPY: [\"{symbol}{amount}\",\"\\u00a5\",1,],\n                KRW: [\"{symbol}{amount}\",\"\\u20a9\",1,],\n                MOP: [\"{symbol}{amount}\",\"MOP\",100,],\n                MYR: [\"{symbol}{amount}\",\"R\",100,],\n                MXN: [\"{symbol}{amount}\",\"$\",100,],\n                NZD: [\"{amount}{symbol}\",\"$\",100,],\n                NIO: [\"{symbol} {amount}\",\"C$\",100,],\n                NOK: [\"{symbol} {amount}\",\"NOK\",100,],\n                PYG: [\"{symbol} {amount}\",\"Gs\",1,],\n                PEN: [\"{symbol} {amount}\",\"S/.\",100,],\n                PHP: [\"{symbol}{amount}\",\"Php\",100,],\n                PLN: [\"{amount} {symbol}\",\"z\\u0142\",100,],\n                QAR: [\"{amount} {symbol}\",\"\\u0631.\\u0642.\",100,],\n                RON: [\"{amount} {symbol}\",\"lei\",100,],\n                RUB: [\"{amount}{symbol}\",\"RUB\",100,],\n                SAR: [\"{amount} {symbol}\",\"\\u0631.\\u0633.\",100,],\n                SGD: [\"{symbol}{amount}\",\"$\",100,],\n                ZAR: [\"{symbol} {amount}\",\"R\",100,],\n                SEK: [\"{amount} {symbol}\",\"kr\",100,],\n                CHF: [\"{symbol} {amount}\",\"CHF\",100,],\n                TWD: [\"{symbol}{amount}\",\"NT$\",1,],\n                THB: [\"{symbol}{amount}\",\"\\u0e3f\",100,],\n                TRY: [\"{amount} {symbol}\",\"TL\",100,],\n                AED: [\"{amount} {symbol}\",\"\\u062f.\\u0625.\",100,],\n                USD: [\"{symbol}{amount}\",\"$\",100,],\n                UYU: [\"{symbol} {amount}\",\"$U\",100,],\n                VEF: [\"{symbol} {amount}\",\"Bs\",100,],\n                VND: [\"{amount} {symbol}\",\"\\u20ab\",1,]\n            }\n        },168,],[\"TimelineDynamicSectionConfig\",[\"m_0_1u\",\"m_0_1v\",\"m_0_1w\",],{\n            smallThrobber: {\n                __m: \"m_0_1u\"\n            },\n            pager: {\n                __m: \"m_0_1v\"\n            },\n            throbber: {\n                __m: \"m_0_1w\"\n            },\n            skmapping: {\n                friends_recent: \"friends\",\n                friends_all: \"friends\",\n                friends_mutual: \"friends\",\n                photos_of: \"photos\",\n                photos_all: \"photos\",\n                photos_albums: \"photos\",\n                likes_recent: null,\n                info_all: \"info\",\n                music_my_music: \"music\",\n                music_favs: \"music\",\n                music_playlists: \"music\",\n                places_all: \"map\",\n                books_read: \"books\",\n                books_favorite: \"books\",\n                books_want: \"books\",\n                places_recent: null,\n                fitness_overview: \"fitness\",\n                fitness_daily_activity: null,\n                fitness_sports_i_play: null,\n                friends_featured: null,\n                places_want: null,\n                info_basic: \"info\",\n                info_contact: null,\n                fitness_running: \"fitness\",\n                fitness_cycling: \"fitness\",\n                friends_followers: \"friends\",\n                friends_following: \"friends\",\n                music_radio: \"music\",\n                info_history: \"info\",\n                games_play: \"games\",\n                products_want: null,\n                photos_archive: \"photos\",\n                notes_my_notes: \"notes\",\n                notes_drafts: \"notes\",\n                notes_about_me: \"notes\",\n                likes_sports_teams: \"likes\",\n                likes_activities: \"likes\",\n                likes_interests: \"likes\",\n                likes_other: \"likes\",\n                video_movies_watch: \"movies\",\n                video_tv_show_watch: \"tv\",\n                music_saved: \"music\",\n                video_movies_want: \"movies\",\n                video_tv_show_want: \"tv\",\n                video_movies_favorite: \"movies\",\n                video_tv_show_favorite: \"tv\",\n                friends_high_school: \"friends\",\n                friends_college: \"friends\",\n                friends_work: \"friends\",\n                friends_suggested: \"friends\",\n                apps_like: \"games\",\n                upcoming_events: \"events\",\n                past_events: \"events\",\n                likes_people: \"likes\",\n                likes_sports: \"likes\",\n                likes_athletes: \"likes\",\n                fitness_report: null,\n                groups_member: \"groups\",\n                music_all_time: \"music\",\n                music_heavy_rotation: \"music\",\n                photos_album: \"photos\",\n                photos_untagged: \"photos\",\n                music_mutual: \"music\",\n                likes_foods: \"likes\",\n                likes_restaurants: \"likes\",\n                restaurants_visited: \"restaurants\",\n                restaurants_want: \"restaurants\",\n                likes_websites: \"likes\",\n                likes_clothing: \"likes\",\n                followers: \"friends\",\n                following: \"friends\",\n                media_set: \"photos\",\n                photos_stream: \"photos\",\n                photos_synced: \"photos\"\n            }\n        },68,],[\"AppSectionCurationState\",[],{\n            showItems: \"show_items\",\n            showApps: \"show_apps\",\n            hide: \"hide\"\n        },145,],[\"NumberFormatConfig\",[],{\n            decimalSeparator: \".\",\n            numberDelimiter: \",\"\n        },54,],],\n        markup: [[\"m_0_1r\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"close\\\"\\u003E\\u003C/a\\u003EUse the [+] button or search tool to add a story about movies, books or something else you enjoy.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"next\\\"\\u003ENext\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1t\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"done\\\"\\u003E\\u003C/a\\u003EUse the audience selector to choose who can see what you add [+].\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"done\\\"\\u003EDone\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1u\",{\n            __html: \"\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Ca class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__root\\\" href=\\\"#\\\" data-referrer=\\\"timeline_collections_overview_see_all\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__text fwb\\\"\\u003ESee All\\u003C/span\\u003E\\u003Cimg class=\\\"uiLoadingIndicatorAsync img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_1w\",{\n            __html: \"\\u003Cimg class=\\\"-cx-PRIVATE-fbTimelineMedley__throbber img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/jKEcVPZFk-2.gif\\\" alt=\\\"\\\" width=\\\"32\\\" height=\\\"32\\\" /\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",],\n    id: \"pagelet_above_header_timeline\",\n    phase: 1\n});");
// 1524
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s620b5b0f047d9f90d460a219af7d71a945281757");
// 1525
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    JSBNG__content: {\n        pagelet_above_header_timeline: \"\"\n    },\n    jsmods: {\n        require: [[\"m_0_1q\",],[\"m_0_1s\",],[\"TimelineCurationNUXController\",\"init\",[\"m_0_1q\",\"m_0_1s\",],[{\n            next_step: \"add_button\",\n            dialogs: {\n                add_button: {\n                    __m: \"m_0_1q\"\n                },\n                privacy: {\n                    __m: \"m_0_1s\"\n                }\n            }\n        },],],],\n        instances: [[\"m_0_1q\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_1r\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"above\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },]\n        },{\n            __m: \"m_0_1r\"\n        },],3,],[\"m_0_1s\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1t\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"right\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1t\"\n        },],3,],],\n        define: [[\"AdsCurrencyConfig\",[],{\n            currencies: {\n                ARS: [\"{symbol} {amount}\",\"$\",100,],\n                AUD: [\"{symbol}{amount}\",\"$\",100,],\n                BOB: [\"{symbol} {amount}\",\"$b\",100,],\n                BRL: [\"{symbol} {amount}\",\"R$\",100,],\n                GBP: [\"{symbol}{amount}\",\"\\u00a3\",100,],\n                CAD: [\"{symbol}{amount}\",\"$\",100,],\n                CLP: [\"{symbol} {amount}\",\"$\",1,],\n                CNY: [\"{amount} {symbol}\",\"\\uffe5\",100,],\n                COP: [\"{symbol} {amount}\",\"$\",1,],\n                CRC: [\"{symbol}{amount}\",\"\\u20a1\",1,],\n                CZK: [\"{amount} {symbol}\",\"K\\u010d\",100,],\n                DKK: [\"{symbol} {amount}\",\"DKK\",100,],\n                EUR: [\"{symbol} {amount}\",\"\\u20ac\",100,],\n                GTQ: [\"{symbol}{amount}\",\"Q\",100,],\n                HNL: [\"{symbol} {amount}\",\"L.\",100,],\n                HKD: [\"{symbol}{amount}\",\"$\",100,],\n                HUF: [\"{amount} {symbol}\",\"Ft\",1,],\n                ISK: [\"{amount} {symbol}\",\"kr.\",1,],\n                INR: [\"{symbol} {amount}\",\"\\u0930\\u0941\",100,],\n                IDR: [\"{symbol} {amount}\",\"Rp\",1,],\n                ILS: [\"{symbol} {amount}\",\"\\u20aa\",100,],\n                JPY: [\"{symbol}{amount}\",\"\\u00a5\",1,],\n                KRW: [\"{symbol}{amount}\",\"\\u20a9\",1,],\n                MOP: [\"{symbol}{amount}\",\"MOP\",100,],\n                MYR: [\"{symbol}{amount}\",\"R\",100,],\n                MXN: [\"{symbol}{amount}\",\"$\",100,],\n                NZD: [\"{amount}{symbol}\",\"$\",100,],\n                NIO: [\"{symbol} {amount}\",\"C$\",100,],\n                NOK: [\"{symbol} {amount}\",\"NOK\",100,],\n                PYG: [\"{symbol} {amount}\",\"Gs\",1,],\n                PEN: [\"{symbol} {amount}\",\"S/.\",100,],\n                PHP: [\"{symbol}{amount}\",\"Php\",100,],\n                PLN: [\"{amount} {symbol}\",\"z\\u0142\",100,],\n                QAR: [\"{amount} {symbol}\",\"\\u0631.\\u0642.\",100,],\n                RON: [\"{amount} {symbol}\",\"lei\",100,],\n                RUB: [\"{amount}{symbol}\",\"RUB\",100,],\n                SAR: [\"{amount} {symbol}\",\"\\u0631.\\u0633.\",100,],\n                SGD: [\"{symbol}{amount}\",\"$\",100,],\n                ZAR: [\"{symbol} {amount}\",\"R\",100,],\n                SEK: [\"{amount} {symbol}\",\"kr\",100,],\n                CHF: [\"{symbol} {amount}\",\"CHF\",100,],\n                TWD: [\"{symbol}{amount}\",\"NT$\",1,],\n                THB: [\"{symbol}{amount}\",\"\\u0e3f\",100,],\n                TRY: [\"{amount} {symbol}\",\"TL\",100,],\n                AED: [\"{amount} {symbol}\",\"\\u062f.\\u0625.\",100,],\n                USD: [\"{symbol}{amount}\",\"$\",100,],\n                UYU: [\"{symbol} {amount}\",\"$U\",100,],\n                VEF: [\"{symbol} {amount}\",\"Bs\",100,],\n                VND: [\"{amount} {symbol}\",\"\\u20ab\",1,]\n            }\n        },168,],[\"TimelineDynamicSectionConfig\",[\"m_0_1u\",\"m_0_1v\",\"m_0_1w\",],{\n            smallThrobber: {\n                __m: \"m_0_1u\"\n            },\n            pager: {\n                __m: \"m_0_1v\"\n            },\n            throbber: {\n                __m: \"m_0_1w\"\n            },\n            skmapping: {\n                friends_recent: \"friends\",\n                friends_all: \"friends\",\n                friends_mutual: \"friends\",\n                photos_of: \"photos\",\n                photos_all: \"photos\",\n                photos_albums: \"photos\",\n                likes_recent: null,\n                info_all: \"info\",\n                music_my_music: \"music\",\n                music_favs: \"music\",\n                music_playlists: \"music\",\n                places_all: \"map\",\n                books_read: \"books\",\n                books_favorite: \"books\",\n                books_want: \"books\",\n                places_recent: null,\n                fitness_overview: \"fitness\",\n                fitness_daily_activity: null,\n                fitness_sports_i_play: null,\n                friends_featured: null,\n                places_want: null,\n                info_basic: \"info\",\n                info_contact: null,\n                fitness_running: \"fitness\",\n                fitness_cycling: \"fitness\",\n                friends_followers: \"friends\",\n                friends_following: \"friends\",\n                music_radio: \"music\",\n                info_history: \"info\",\n                games_play: \"games\",\n                products_want: null,\n                photos_archive: \"photos\",\n                notes_my_notes: \"notes\",\n                notes_drafts: \"notes\",\n                notes_about_me: \"notes\",\n                likes_sports_teams: \"likes\",\n                likes_activities: \"likes\",\n                likes_interests: \"likes\",\n                likes_other: \"likes\",\n                video_movies_watch: \"movies\",\n                video_tv_show_watch: \"tv\",\n                music_saved: \"music\",\n                video_movies_want: \"movies\",\n                video_tv_show_want: \"tv\",\n                video_movies_favorite: \"movies\",\n                video_tv_show_favorite: \"tv\",\n                friends_high_school: \"friends\",\n                friends_college: \"friends\",\n                friends_work: \"friends\",\n                friends_suggested: \"friends\",\n                apps_like: \"games\",\n                upcoming_events: \"events\",\n                past_events: \"events\",\n                likes_people: \"likes\",\n                likes_sports: \"likes\",\n                likes_athletes: \"likes\",\n                fitness_report: null,\n                groups_member: \"groups\",\n                music_all_time: \"music\",\n                music_heavy_rotation: \"music\",\n                photos_album: \"photos\",\n                photos_untagged: \"photos\",\n                music_mutual: \"music\",\n                likes_foods: \"likes\",\n                likes_restaurants: \"likes\",\n                restaurants_visited: \"restaurants\",\n                restaurants_want: \"restaurants\",\n                likes_websites: \"likes\",\n                likes_clothing: \"likes\",\n                followers: \"friends\",\n                following: \"friends\",\n                media_set: \"photos\",\n                photos_stream: \"photos\",\n                photos_synced: \"photos\"\n            }\n        },68,],[\"AppSectionCurationState\",[],{\n            showItems: \"show_items\",\n            showApps: \"show_apps\",\n            hide: \"hide\"\n        },145,],[\"NumberFormatConfig\",[],{\n            decimalSeparator: \".\",\n            numberDelimiter: \",\"\n        },54,],],\n        markup: [[\"m_0_1r\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"close\\\"\\u003E\\u003C/a\\u003EUse the [+] button or search tool to add a story about movies, books or something else you enjoy.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"next\\\"\\u003ENext\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1t\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"done\\\"\\u003E\\u003C/a\\u003EUse the audience selector to choose who can see what you add [+].\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"done\\\"\\u003EDone\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1u\",{\n            __html: \"\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Ca class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__root\\\" href=\\\"#\\\" data-referrer=\\\"timeline_collections_overview_see_all\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__text fwb\\\"\\u003ESee All\\u003C/span\\u003E\\u003Cimg class=\\\"uiLoadingIndicatorAsync img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_1w\",{\n            __html: \"\\u003Cimg class=\\\"-cx-PRIVATE-fbTimelineMedley__throbber img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/jKEcVPZFk-2.gif\\\" alt=\\\"\\\" width=\\\"32\\\" height=\\\"32\\\" /\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",],\n    id: \"pagelet_above_header_timeline\",\n    phase: 1\n});");
// 1544
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    is_last: true,\n    content: {\n        pagelet_timeline_profile_actions: {\n            container_id: \"u_0_15\"\n        }\n    },\n    jsmods: {\n        require: [[\"m_0_1x\",],[\"m_0_1y\",],[\"ButtonGroupMonitor\",],[\"SelectorDeprecated\",],[\"m_0_22\",],[\"SubscribeButton\",\"init\",[\"m_0_25\",\"m_0_24\",\"m_0_26\",],[{\n            __m: \"m_0_25\"\n        },{\n            __m: \"m_0_24\"\n        },{\n            __m: \"m_0_26\"\n        },\"1055580469\",0,false,],],[\"m_0_25\",],[\"m_0_26\",],[\"m_0_2b\",],[\"m_0_2a\",],[\"AddFriendButton\",\"init\",[\"m_0_2e\",],[{\n            __m: \"m_0_2e\"\n        },1055580469,\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?sk=wall\",\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1x\",[\"ButtonGroup\",\"m_0_1z\",],[{\n            __m: \"m_0_1z\"\n        },],1,],[\"m_0_1y\",[\"ButtonGroup\",\"m_0_20\",],[{\n            __m: \"m_0_20\"\n        },],1,],[\"m_0_22\",[\"AsyncMenu\",\"m_0_23\",],[\"/ajax/lists/interests_submenu.php?profile_id=1055580469&list_location=gear_menu\",{\n            __m: \"m_0_23\"\n        },],2,],[\"m_0_25\",[\"SwapButtonDEPRECATED\",\"m_0_24\",\"m_0_27\",],[{\n            __m: \"m_0_24\"\n        },{\n            __m: \"m_0_27\"\n        },false,],3,],[\"m_0_26\",[\"HoverButton\",\"m_0_28\",\"m_0_2a\",\"m_0_29\",],[{\n            __m: \"m_0_28\"\n        },{\n            __m: \"m_0_2a\"\n        },{\n            __m: \"m_0_29\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_2b\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_2c\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_2c\"\n        },],3,],[\"m_0_2a\",[\"HoverFlyout\",\"m_0_2b\",\"m_0_2d\",],[{\n            __m: \"m_0_2b\"\n        },{\n            __m: \"m_0_2d\"\n        },150,150,],3,],],\n        elements: [[\"m_0_1z\",\"u_0_r\",2,],[\"m_0_20\",\"u_0_s\",2,],[\"m_0_21\",\"u_0_t\",2,],[\"m_0_23\",\"u_0_y\",2,],[\"m_0_24\",\"u_0_z\",4,],[\"m_0_27\",\"u_0_10\",2,],[\"m_0_29\",\"u_0_11\",2,\"m_0_2c\",],[\"m_0_28\",\"u_0_10\",2,],[\"m_0_2d\",\"u_0_10\",2,],[\"m_0_2e\",\"u_0_13\",2,],],\n        markup: [[\"m_0_2c\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_11\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    jscc_map: \"({\\\"joGvTL2VydP45TfLks0\\\":function(){return new SubMenu()}})\",\n    onload: [\"JSCC.get(\\\"joGvTL2VydP45TfLks0\\\").init($(\\\"u_0_u\\\"), $(\\\"u_0_v\\\"), $(\\\"u_0_w\\\"), $(\\\"u_0_x\\\"));\",\"JSCC.get(\\\"joGvTL2VydP45TfLks0\\\").initAsyncChildMenu(require(\\\"m_0_22\\\"));\",],\n    id: \"pagelet_timeline_profile_actions\",\n    phase: 1\n});");
// 1545
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s85b65215781d1e32d1ec33c628c09795fa07f10e");
// 1546
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    is_last: true,\n    JSBNG__content: {\n        pagelet_timeline_profile_actions: {\n            container_id: \"u_0_15\"\n        }\n    },\n    jsmods: {\n        require: [[\"m_0_1x\",],[\"m_0_1y\",],[\"ButtonGroupMonitor\",],[\"SelectorDeprecated\",],[\"m_0_22\",],[\"SubscribeButton\",\"init\",[\"m_0_25\",\"m_0_24\",\"m_0_26\",],[{\n            __m: \"m_0_25\"\n        },{\n            __m: \"m_0_24\"\n        },{\n            __m: \"m_0_26\"\n        },\"1055580469\",0,false,],],[\"m_0_25\",],[\"m_0_26\",],[\"m_0_2b\",],[\"m_0_2a\",],[\"AddFriendButton\",\"init\",[\"m_0_2e\",],[{\n            __m: \"m_0_2e\"\n        },1055580469,\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?sk=wall\",\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1x\",[\"ButtonGroup\",\"m_0_1z\",],[{\n            __m: \"m_0_1z\"\n        },],1,],[\"m_0_1y\",[\"ButtonGroup\",\"m_0_20\",],[{\n            __m: \"m_0_20\"\n        },],1,],[\"m_0_22\",[\"AsyncMenu\",\"m_0_23\",],[\"/ajax/lists/interests_submenu.php?profile_id=1055580469&list_location=gear_menu\",{\n            __m: \"m_0_23\"\n        },],2,],[\"m_0_25\",[\"SwapButtonDEPRECATED\",\"m_0_24\",\"m_0_27\",],[{\n            __m: \"m_0_24\"\n        },{\n            __m: \"m_0_27\"\n        },false,],3,],[\"m_0_26\",[\"HoverButton\",\"m_0_28\",\"m_0_2a\",\"m_0_29\",],[{\n            __m: \"m_0_28\"\n        },{\n            __m: \"m_0_2a\"\n        },{\n            __m: \"m_0_29\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_2b\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_2c\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_2c\"\n        },],3,],[\"m_0_2a\",[\"HoverFlyout\",\"m_0_2b\",\"m_0_2d\",],[{\n            __m: \"m_0_2b\"\n        },{\n            __m: \"m_0_2d\"\n        },150,150,],3,],],\n        elements: [[\"m_0_1z\",\"u_0_r\",2,],[\"m_0_20\",\"u_0_s\",2,],[\"m_0_21\",\"u_0_t\",2,],[\"m_0_23\",\"u_0_y\",2,],[\"m_0_24\",\"u_0_z\",4,],[\"m_0_27\",\"u_0_10\",2,],[\"m_0_29\",\"u_0_11\",2,\"m_0_2c\",],[\"m_0_28\",\"u_0_10\",2,],[\"m_0_2d\",\"u_0_10\",2,],[\"m_0_2e\",\"u_0_13\",2,],],\n        markup: [[\"m_0_2c\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_11\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    jscc_map: \"({\\\"joGvTL2VydP45TfLks0\\\":function(){return new SubMenu()}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"joGvTL2VydP45TfLks0\\\").init($(\\\"u_0_u\\\"), $(\\\"u_0_v\\\"), $(\\\"u_0_w\\\"), $(\\\"u_0_x\\\"));\",\"JSCC.get(\\\"joGvTL2VydP45TfLks0\\\").initAsyncChildMenu(require(\\\"m_0_22\\\"));\",],\n    id: \"pagelet_timeline_profile_actions\",\n    phase: 1\n});");
// 1565
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_recent: {\n            container_id: \"u_0_18\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"removeSection\",[],[\"month_1969_12\",],],[\"TimelineLogging\",\"init\",[],[1055580469,],],[\"TimelineContentLoader\",\"enableScrollLoadOnClick\",[],[\"u_0_17_scroll_trigger\",\"recent\",250,],],[\"TimelineController\",],[\"Arbiter\",\"inform\",[],[\"TimelineConstants/sectionLoaded\",{\n            key: \"recent\"\n        },],],[\"TimelineStickyRightColumn\",\"init\",[],[],],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent\",\n    phase: 2\n});");
// 1566
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s08369e6af4b24f4d00ef72dc18c762661d4589bb");
// 1567
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_recent: {\n            container_id: \"u_0_18\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"removeSection\",[],[\"month_1969_12\",],],[\"TimelineLogging\",\"init\",[],[1055580469,],],[\"TimelineContentLoader\",\"enableScrollLoadOnClick\",[],[\"u_0_17_scroll_trigger\",\"recent\",250,],],[\"TimelineController\",],[\"Arbiter\",\"inform\",[],[\"TimelineConstants/sectionLoaded\",{\n            key: \"recent\"\n        },],],[\"TimelineStickyRightColumn\",\"init\",[],[],],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent\",\n    phase: 2\n});");
// 1574
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_16_left\",\n    display_dependency: [\"pagelet_timeline_recent\",],\n    content: {\n        pagelet_timeline_composer: \"\"\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_timeline_composer\",\n    phase: 2\n});");
// 1575
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s7fce13de78d4d80fd7ab1f108c2ebba9cb2ca37b");
// 1576
geval("bigPipe.onPageletArrive({\n    append: \"u_0_16_left\",\n    display_dependency: [\"pagelet_timeline_recent\",],\n    JSBNG__content: {\n        pagelet_timeline_composer: \"\"\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_timeline_composer\",\n    phase: 2\n});");
// 1582
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_16_left\",\n    display_dependency: [\"pagelet_timeline_recent\",\"pagelet_timeline_composer\",],\n    is_last: true,\n    content: {\n        pagelet_timeline_recent_segment_0_0_left: {\n            container_id: \"u_0_1z\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_16\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],[\"m_0_2f\",],[\"m_0_2h\",],[\"m_0_2i\",],[\"m_0_2k\",],[\"m_0_2m\",],[\"m_0_2n\",],[\"m_0_2p\",],[\"m_0_2r\",],[\"m_0_2s\",],[\"m_0_2u\",],[\"m_0_2w\",],[\"m_0_2x\",],[\"Hovercard\",],[\"m_0_34\",],[\"Tooltip\",],[\"m_0_37\",],[\"m_0_39\",],[\"m_0_3c\",],],\n        instances: [[\"m_0_2f\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2h\",[\"PopoverAsyncMenu\",\"m_0_2i\",\"m_0_2g\",\"m_0_2f\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2i\"\n        },{\n            __m: \"m_0_2g\"\n        },{\n            __m: \"m_0_2f\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=3857418892059122853&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372262734&unit_data%5Bunit_end_time%5D=1372262734&dom_id=u_0_1a&timestamp=1372262734&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2i\",[\"Popover\",\"m_0_2j\",\"m_0_2g\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2j\"\n        },{\n            __m: \"m_0_2g\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2k\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2m\",[\"PopoverAsyncMenu\",\"m_0_2n\",\"m_0_2l\",\"m_0_2k\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2l\"\n        },{\n            __m: \"m_0_2k\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=-6185676099150237519&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372627013&unit_data%5Bunit_end_time%5D=1372627013&dom_id=u_0_1e&timestamp=1372627013&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2n\",[\"Popover\",\"m_0_2o\",\"m_0_2l\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2o\"\n        },{\n            __m: \"m_0_2l\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2p\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2r\",[\"PopoverAsyncMenu\",\"m_0_2s\",\"m_0_2q\",\"m_0_2p\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2s\"\n        },{\n            __m: \"m_0_2q\"\n        },{\n            __m: \"m_0_2p\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=4498726532280095426&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372923465&unit_data%5Bunit_end_time%5D=1372923465&dom_id=u_0_1h&timestamp=1372923465&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2s\",[\"Popover\",\"m_0_2t\",\"m_0_2q\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2t\"\n        },{\n            __m: \"m_0_2q\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2u\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2w\",[\"PopoverAsyncMenu\",\"m_0_2x\",\"m_0_2v\",\"m_0_2u\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2x\"\n        },{\n            __m: \"m_0_2v\"\n        },{\n            __m: \"m_0_2u\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=2953496614934485437&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373055341&unit_data%5Bunit_end_time%5D=1373055341&dom_id=u_0_1k&timestamp=1373055341&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2x\",[\"Popover\",\"m_0_2y\",\"m_0_2v\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2y\"\n        },{\n            __m: \"m_0_2v\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_34\",[\"UFIController\",\"m_0_33\",\"m_0_35\",],[{\n            __m: \"m_0_33\"\n        },{\n            ftentidentifier: \"10200303357400658\",\n            instanceid: \"u_0_1n\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQBjxP4ev5UbI41Cf_ownvAK5wSwcSjK7GAWYTU8KnSqn2t_Ypp37x3IDlNc_BfBV4dfFe9GoUYgha-VTRMVz3dpkGjnczfoKm9Pc6q6ltIGpCpq8Os8MurGA6X0p6eYzwbjx5UdQyoSubsx3-KC0EyYoXAi7ZVuT9S94NilBKTEVjQrE1zHUdDW3oCqnX12h-NmlSSLEK8-Zl3GeZvMl9oT6OGOtjBCcadbLFoeTRhTBDVyFlSa9CmPwLENPJCuWg-BJ8y0THv-2L-2VxhG2yOpLvF6Q_QPCS5wQ3K3VGMlxqwfMEod7ukeqHfRhh9KxZx1QW7CvIb81bQYQqnrlJ1t5uNzW6C4ITbNOkYKkspVSGIQ5m9fGIutgw4H-9BVufuWZXNN4e8lUk-hy9ugyPiP\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200303357400658\",\n                entidentifier: \"10200303357400658\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200303357400658\",\n                commentcount: 6,\n                likecount: 0,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                    },\n                    alternate: {\n                        text: \"You like this.\",\n                        ranges: [],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_35\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200303357400658_4912489\",\n                fbid: \"10200304193501560\",\n                legacyid: \"4912489\",\n                body: {\n                    text: \"which one?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275695,\n                    text: \"June 26 at 3:41pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:41pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912495\",\n                fbid: \"10200304196181627\",\n                legacyid: \"4912495\",\n                body: {\n                    text: \"oh! this is what is said... ruin all childhood memories!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275736,\n                    text: \"June 26 at 3:42pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:42pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912503\",\n                fbid: \"10200304201781767\",\n                legacyid: \"4912503\",\n                body: {\n                    text: \"It didn't work for me!!!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275825,\n                    text: \"June 26 at 3:43pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:43pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912511\",\n                fbid: \"10200304206981897\",\n                legacyid: \"4912511\",\n                body: {\n                    text: \"Anyhow, it was nice. Thanks\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 1,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275890,\n                    text: \"June 26 at 3:44pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:44pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"100006118350059\",\n                name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"100001619067228\",\n                name: \"Baharak Saberidokht\",\n                firstName: \"Baharak\",\n                vanity: \"baharak.saberidokht\",\n                thumbSrc: \"http://jsbngssl.profile-b.xx.fbcdn.net/hprofile-prn2/s32x32/260631_100001619067228_542177443_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/baharak.saberidokht\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"100002461958396\",\n                name: \"Vida Farsam\",\n                firstName: \"Vida\",\n                vanity: \"vida.farsam\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/203461_100002461958396_1397706771_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/vida.farsam\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200303357400658: {\n                        chronological: {\n                            range: {\n                                offset: 2,\n                                length: 4\n                            },\n                            values: [\"10200303357400658_4912489\",\"10200303357400658_4912495\",\"10200303357400658_4912503\",\"10200303357400658_4912511\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200303357400658_4912489\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912495\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912503\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912511\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    }\n                }\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_37\",[\"UFIController\",\"m_0_36\",\"m_0_3a\",],[{\n            __m: \"m_0_36\"\n        },{\n            ftentidentifier: \"10200350995551582\",\n            instanceid: \"u_0_1p\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQAL6BzquKdEOsowbM5EApJSTx6t3cX6HciBVTv0b5LrvxxIJCzjrIRDfSJQkmNYNpWRY9gmo4wEeKJRhKK4-l-Zoo7Qh0CHqMJoeS3abWLYVH2-tpPv_e1Dbt9VoF2V6POO7o3hDHFz3c-RSnP8jxUtjwGPFaxac69dWJ7JOEwHvXuJX7DnZtIcQ2c_SQCaqKmp4ImCjp_sSYLsZEsVwMSuvj4Vvum_4gbcfb8NyXWOoohbGwhVMcFZAIew_h7I6wjgKjs2ynj7Yv0m2S2f2gAtU3214N_hc7rKEwpq6HwD2ZXxju5LX2BYY5CMi3boX9ne0xwjcPN_ptGl5Mf9X2Jf5GC7DB11C04H8LqGRB7DoA7BI5mLlEaVU23XihhNJRr3Gr3e8CanKSIyt5LwwdCt\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200350995551582\",\n                entidentifier: \"10200350995551582\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200350995551582\",\n                commentcount: 5,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Jan Vitek likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Jan Vitek like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3a\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200350995551582_4954379\",\n                fbid: \"10200357365790834\",\n                legacyid: \"4954379\",\n                body: {\n                    text: \"You should have snatched it out of his hands, and played it/\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1710926078\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373168110,\n                    text: \"July 6 at 11:35pm\",\n                    verbose: \"Saturday, July 6, 2013 at 11:35pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955913\",\n                fbid: \"10200359402281745\",\n                legacyid: \"4955913\",\n                body: {\n                    text: \"I've found that stealing musical instruments in non-English-speaking countries hasn't brought me great luck in the past.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214256,\n                    text: \"Sunday at 12:24pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:24pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955915\",\n                fbid: \"10200359408281895\",\n                legacyid: \"4955915\",\n                body: {\n                    text: \"But in English-speaking countries it's just fine.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"10715287\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214355,\n                    text: \"Sunday at 12:25pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:25pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955918\",\n                fbid: \"10200359410801958\",\n                legacyid: \"4955918\",\n                body: {\n                    text: \"Naturally.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214375,\n                    text: \"Sunday at 12:26pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:26pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1710926078\",\n                name: \"Kathy Wertheimer Richards\",\n                firstName: \"Kathy\",\n                vanity: \"kathy.w.richards\",\n                thumbSrc: \"http://jsbngssl.profile-a.xx.fbcdn.net/hprofile-prn2/s32x32/276006_1710926078_512651488_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/kathy.w.richards\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"10715287\",\n                name: \"Michael A Goss\",\n                firstName: \"Michael\",\n                vanity: \"michael.a.goss\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/624179_10715287_1397603425_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/michael.a.goss\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200350995551582: {\n                        chronological: {\n                            range: {\n                                offset: 1,\n                                length: 4\n                            },\n                            values: [\"10200350995551582_4954379\",\"10200350995551582_4955913\",\"10200350995551582_4955915\",\"10200350995551582_4955918\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200350995551582_4954379\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955913\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955915\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955918\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    }\n                }\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_39\",[\"UFIController\",\"m_0_38\",\"m_0_35\",],[{\n            __m: \"m_0_38\"\n        },{\n            ftentidentifier: \"10200325012062011\",\n            instanceid: \"u_0_1q\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQACFgRImnzTiCidDckAnsXMzyyCTp2xlEkdxtLDdjHBxnem9BliGg5LEnDunnxvmLZ3fMMKmsD9ygBkRtmsP85o7-LYCuNIPaMahgk_-xIrgFtyL9LKNnaZOTTudzDfOens6YeAmPC3QnUyvB9IFKVci93BAZKWzKC4DehohxvbuKn4zcIyhG59kU5yOHk03PO-Ue-AKD7ZnJCSIAIhhmY4Y5d6S202CjqJdFJJaP_Y4tzOOgekKxAKONhL4W0mrsdASIKsmRQiuj-3UIAJSOvDnyAjBoy0RSsF1zLIfRPWpsBvEpJd7WDG4iCUccj0Lfglb3yuGtH1Om1AGO6fAJTHLuCvnR7BpptYndMLrEkD9JxBA2kaJHmCzYiTqHSEHHe8sKqwiBEgruorRn6UD6iKpV5vptKAUqIESRSKWUJqNQ\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200325012062011\",\n                entidentifier: \"10200325012062011\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200325012062011\",\n                commentcount: 0,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Steph Burg likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Steph Burg like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_35\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [],\n            profiles: [],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200325012062011: {\n                        chronological: {\n                            range: {\n                                offset: 0,\n                                length: 0\n                            },\n                            values: []\n                        }\n                    }\n                },\n                replies: null\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_3c\",[\"UFIController\",\"m_0_3b\",\"m_0_35\",],[{\n            __m: \"m_0_3b\"\n        },{\n            ftentidentifier: \"10200343222477260\",\n            instanceid: \"u_0_1t\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQC1ajTXRDAv2wZzRUQ-G1KuB_j2Ydk0o99-s0DfIrW3cEC8EBlrci94wT46S1ENWJhhyDAhp4bST94TloNAKLx6tdfZIWHfu8RmsxRdWGcByUX-EIwNoPoeRR-sY3mXdJ72ams13WH-zUj60bdWPnFRXyEpNMCR7ciJ4z8AMbiDbKhfut2t2Vn4Jki69lK6ZsFw-T6sYVNa6Lj-UF9TJSdnScEziwiE6YdI6DC-PoCxGCC_Ntu7LtFa7kJuLcOgBliX_FkGFVu6PR-g-ixwHMHYpI7c7FHuNsOlZFQaX2zoBMffqwMrQhRkgLzltSL3nEQjBX3KSM_AMm64tnSMj0iXWK_Zux1sXie2Ml8Z8jCPS3K6CDSBwo3MKgs2LUD_UJecJAlv7ZspNwT9YGc6MVlE\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200343222477260\",\n                entidentifier: \"10200343222477260\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200343222477260\",\n                commentcount: 11,\n                likecount: 7,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"7 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 7\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 7 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 7\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_35\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200343222477260_4946958\",\n                fbid: \"10200346777686138\",\n                legacyid: \"4946958\",\n                body: {\n                    text: \"Does it have a sense of the surreal or are you just sharing a data point? ;)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372985540,\n                    text: \"July 4 at 8:52pm\",\n                    verbose: \"Thursday, July 4, 2013 at 8:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4947623\",\n                fbid: \"10200347758230651\",\n                legacyid: \"4947623\",\n                body: {\n                    text: \"Merely minor amusement.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373002430,\n                    text: \"July 5 at 1:33am\",\n                    verbose: \"Friday, July 5, 2013 at 1:33am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950566\",\n                fbid: \"10200351838652659\",\n                legacyid: \"4950566\",\n                body: {\n                    text: \"Did you wear http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                    ranges: [{\n                        offset: 13,\n                        length: 68,\n                        entities: [{\n                            url: \"http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                            shimhash: \"dAQH_FG1i\",\n                            id: \"0746af69b9da85d793efe61531abaafe\",\n                            external: true\n                        },]\n                    },],\n                    aggregatedranges: []\n                },\n                author: \"53600996\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066508,\n                    text: \"July 5 at 7:21pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:21pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950571\",\n                fbid: \"10200351843052769\",\n                legacyid: \"4950571\",\n                body: {\n                    text: \"That's the most delightfully offensive piece of apparel I've seen in quite some time.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066594,\n                    text: \"July 5 at 7:23pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:23pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1633181753\",\n                name: \"Robert Nesius\",\n                firstName: \"Robert\",\n                vanity: \"rnesius\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/573766_1633181753_1114062672_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/rnesius\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"53600996\",\n                name: \"Harrison Metzger\",\n                firstName: \"Harrison\",\n                vanity: \"harrisonmetz\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/195694_53600996_1993816119_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/harrisonmetz\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200343222477260: {\n                        chronological: {\n                            range: {\n                                offset: 7,\n                                length: 4\n                            },\n                            values: [\"10200343222477260_4946958\",\"10200343222477260_4947623\",\"10200343222477260_4950566\",\"10200343222477260_4950571\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200343222477260_4946958\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4947623\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950566\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950571\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    }\n                }\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_35\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],6,],[\"m_0_3a\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_3d\",[\"XHPTemplate\",\"m_0_3e\",],[{\n            __m: \"m_0_3e\"\n        },],2,],],\n        define: [[\"CLogConfig\",[],{\n            gkResults: 0\n        },174,],[\"UFICommentTemplates\",[\"m_0_3d\",],{\n            \":fb:ufi:hide-dialog-template\": {\n                __m: \"m_0_3d\"\n            }\n        },70,],[\"UFISpamCountImpl\",[],{\n            \"module\": null\n        },72,],[\"UFIConfig\",[],{\n            renderEmoji: true,\n            renderEmoticons: 1\n        },71,],],\n        elements: [[\"m_0_2j\",\"u_0_1b\",2,],[\"m_0_2g\",\"u_0_1c\",4,],[\"m_0_2o\",\"u_0_1f\",2,],[\"m_0_2l\",\"u_0_1g\",4,],[\"m_0_2t\",\"u_0_1i\",2,],[\"m_0_2q\",\"u_0_1j\",4,],[\"m_0_2y\",\"u_0_1l\",2,],[\"m_0_2v\",\"u_0_1m\",4,],[\"m_0_33\",\"u_0_1o\",2,],[\"m_0_36\",\"u_0_1r\",2,],[\"m_0_38\",\"u_0_1s\",2,],[\"m_0_3b\",\"u_0_1u\",2,],[\"m_0_30\",\"u_0_1v\",2,],[\"m_0_2z\",\"u_0_1w\",2,],[\"m_0_31\",\"u_0_1x\",2,],[\"m_0_32\",\"u_0_1y\",2,],],\n        markup: [[\"m_0_3e\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"pvs phm -cx-PUBLIC-uiDialog__title\\\" data-jsid=\\\"title\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pam -cx-PRIVATE-uiDialog__body\\\" data-jsid=\\\"body\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiDialog__footer\\\"\\u003E\\u003Cdiv class=\\\"pam uiOverlayFooter uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerConfirm uiOverlayButton selected -cx-PRIVATE-uiButton__confirm -cx-PRIVATE-uiButton__large\\\" data-jsid=\\\"delete\\\" type=\\\"submit\\\"\\u003EDelete\\u003C/button\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerCancel uiOverlayButton -cx-PRIVATE-uiButton__large\\\" role=\\\"button\\\" href=\\\"#\\\"\\u003ECancel\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n        TypeaheadHoistFriends: {\n            resources: [\"bUzfU\",],\n            \"module\": true\n        },\n        \"UFIEntStreamOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"0duP3\",\"vzIoO\",\"QI+gv\",\"TOw+q\",],\n            \"module\": true\n        },\n        InputSelection: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        FileInputUploader: {\n            resources: [\"AyUu6\",\"AsDOA\",\"LpC/l\",\"FFdfj\",],\n            \"module\": true\n        },\n        DialogX: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n            \"module\": true\n        },\n        ContextualTypeaheadView: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        TypeaheadBestName: {\n            resources: [\"OJTM4\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadMetrics: {\n            resources: [\"AyUu6\",\"bUzfU\",],\n            \"module\": true\n        },\n        MentionsInput: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"OJTM4\",],\n            \"module\": true\n        },\n        TypingDetector: {\n            resources: [\"AyUu6\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadAreaCore: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"u//Ut\",\"bUzfU\",],\n            \"module\": true\n        },\n        EntstreamPubContentOverlay: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"7EHvC\",\"TOw+q\",\"0duP3\",\"63VzN\",\"40bIq\",],\n            \"module\": true\n        },\n        CompactTypeaheadRenderer: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        ScrollAwareDOM: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        \"legacy:live-js\": {\n            resources: [\"AyUu6\",\"OJTM4\",]\n        },\n        collectDataAttributes: {\n            resources: [\"AyUu6\",],\n            \"module\": true\n        },\n        UFIScrollHighlight: {\n            resources: [\"AyUu6\",\"AsDOA\",\"KPZ5T\",\"rSdpp\",],\n            \"module\": true\n        },\n        UFIComments: {\n            resources: [\"OJTM4\",\"AyUu6\",],\n            \"module\": true\n        },\n        UFIRetryActions: {\n            resources: [\"AyUu6\",\"OJTM4\",\"8ay4F\",],\n            \"module\": true\n        },\n        LegacyMenuUtils: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"utuxU\",\"NfUUN\",],\n            \"module\": true\n        },\n        HashtagLayerPageController: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"IxyKh\",\"cq4zB\",\"Lsvc0\",\"7EHvC\",\"BBKr2\",\"iFPko\",\"AMFDz\",\"qRGqD\",],\n            \"module\": true\n        },\n        \"legacy:ufi-tracking-js\": {\n            resources: [\"AyUu6\",]\n        },\n        CLoggerX: {\n            resources: [\"AyUu6\",\"OJTM4\",],\n            \"module\": true\n        },\n        \"UFICommentRemovalControls.react\": {\n            resources: [\"OJTM4\",\"AyUu6\",\"W3Ky6\",\"QE+SD\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        ScrollableArea: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        HashtagParser: {\n            resources: [\"u//Ut\",\"hfrQl\",],\n            \"module\": true\n        },\n        TextAreaControl: {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",],\n            \"module\": true\n        },\n        LegacyContextualDialog: {\n            resources: [\"AyUu6\",\"AsDOA\",\"EzMPG\",\"W3Ky6\",],\n            \"module\": true\n        },\n        Typeahead: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",],\n            \"module\": true\n        },\n        Hovercard: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        FileInput: {\n            resources: [\"AyUu6\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        \"UFIOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        AMFDz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/l0jEiYB1BY4.js\"\n        },\n        BBKr2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/2RUWo8vhW3Y.js\"\n        },\n        SZ74q: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/tx5kAeM5toK.css\"\n        },\n        \"QI+gv\": {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/SBdkAjjHF0N.css\"\n        },\n        \"8ay4F\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/VrfxLTcinh0.js\"\n        },\n        iFPko: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/WUd0A3Y3Ufl.js\"\n        },\n        vzIoO: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/4aLzYp5O_a3.js\"\n        },\n        Lsvc0: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/uScKsmssLAV.js\"\n        },\n        NfUUN: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/F-cQl2_T1TU.js\"\n        },\n        rSdpp: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yc/r/2PkTFjdVPzc.js\"\n        },\n        \"7EHvC\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/U6rPColAdZi.js\"\n        },\n        \"40bIq\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/iFMz0qojeiH.css\"\n        },\n        qRGqD: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/0zNvPsl4_Iy.js\"\n        },\n        \"QE+SD\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/PIykjmSfAPR.js\"\n        },\n        \"TOw+q\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/ZtrEG6Cgqa3.js\"\n        },\n        utuxU: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/lq5XLbLZk-t.js\"\n        },\n        FFdfj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/BCHq7tR3xKp.js\"\n        },\n        IxyKh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/7f-bDgHTzcK.js\"\n        },\n        cq4zB: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/y--u5gxmM74.css\"\n        }\n    },\n    ixData: {\n        \"/images/group_gifts/icons/gift_icon_red-13px.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/83ZMt066WCp.png\",\n            width: 13,\n            height: 13\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    displayJS: [\"AyUu6\",\"OJTM4\",],\n    onafterload: [\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:ufi-tracking-js\\\"], function(){ ufi_add_all_link_data(); });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",],\n    id: \"pagelet_timeline_recent_segment_0_0_left\",\n    phase: 2,\n    tti_phase: 2\n});");
// 1583
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sfc5e0ec9d7e9c10ff4a26fe31fe521034eefd6dc");
// 1584
geval("bigPipe.onPageletArrive({\n    append: \"u_0_16_left\",\n    display_dependency: [\"pagelet_timeline_recent\",\"pagelet_timeline_composer\",],\n    is_last: true,\n    JSBNG__content: {\n        pagelet_timeline_recent_segment_0_0_left: {\n            container_id: \"u_0_1z\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_16\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],[\"m_0_2f\",],[\"m_0_2h\",],[\"m_0_2i\",],[\"m_0_2k\",],[\"m_0_2m\",],[\"m_0_2n\",],[\"m_0_2p\",],[\"m_0_2r\",],[\"m_0_2s\",],[\"m_0_2u\",],[\"m_0_2w\",],[\"m_0_2x\",],[\"Hovercard\",],[\"m_0_34\",],[\"Tooltip\",],[\"m_0_37\",],[\"m_0_39\",],[\"m_0_3c\",],],\n        instances: [[\"m_0_2f\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2h\",[\"PopoverAsyncMenu\",\"m_0_2i\",\"m_0_2g\",\"m_0_2f\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2i\"\n        },{\n            __m: \"m_0_2g\"\n        },{\n            __m: \"m_0_2f\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=3857418892059122853&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372262734&unit_data%5Bunit_end_time%5D=1372262734&dom_id=u_0_1a&timestamp=1372262734&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2i\",[\"Popover\",\"m_0_2j\",\"m_0_2g\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2j\"\n        },{\n            __m: \"m_0_2g\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2k\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2m\",[\"PopoverAsyncMenu\",\"m_0_2n\",\"m_0_2l\",\"m_0_2k\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2l\"\n        },{\n            __m: \"m_0_2k\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=-6185676099150237519&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372627013&unit_data%5Bunit_end_time%5D=1372627013&dom_id=u_0_1e&timestamp=1372627013&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2n\",[\"Popover\",\"m_0_2o\",\"m_0_2l\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2o\"\n        },{\n            __m: \"m_0_2l\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2p\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2r\",[\"PopoverAsyncMenu\",\"m_0_2s\",\"m_0_2q\",\"m_0_2p\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2s\"\n        },{\n            __m: \"m_0_2q\"\n        },{\n            __m: \"m_0_2p\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=4498726532280095426&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372923465&unit_data%5Bunit_end_time%5D=1372923465&dom_id=u_0_1h&timestamp=1372923465&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2s\",[\"Popover\",\"m_0_2t\",\"m_0_2q\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2t\"\n        },{\n            __m: \"m_0_2q\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2u\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2w\",[\"PopoverAsyncMenu\",\"m_0_2x\",\"m_0_2v\",\"m_0_2u\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2x\"\n        },{\n            __m: \"m_0_2v\"\n        },{\n            __m: \"m_0_2u\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=2953496614934485437&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373055341&unit_data%5Bunit_end_time%5D=1373055341&dom_id=u_0_1k&timestamp=1373055341&impression_id=23c8a629&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2x\",[\"Popover\",\"m_0_2y\",\"m_0_2v\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2y\"\n        },{\n            __m: \"m_0_2v\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_34\",[\"UFIController\",\"m_0_33\",\"m_0_35\",],[{\n            __m: \"m_0_33\"\n        },{\n            ftentidentifier: \"10200303357400658\",\n            instanceid: \"u_0_1n\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQBjxP4ev5UbI41Cf_ownvAK5wSwcSjK7GAWYTU8KnSqn2t_Ypp37x3IDlNc_BfBV4dfFe9GoUYgha-VTRMVz3dpkGjnczfoKm9Pc6q6ltIGpCpq8Os8MurGA6X0p6eYzwbjx5UdQyoSubsx3-KC0EyYoXAi7ZVuT9S94NilBKTEVjQrE1zHUdDW3oCqnX12h-NmlSSLEK8-Zl3GeZvMl9oT6OGOtjBCcadbLFoeTRhTBDVyFlSa9CmPwLENPJCuWg-BJ8y0THv-2L-2VxhG2yOpLvF6Q_QPCS5wQ3K3VGMlxqwfMEod7ukeqHfRhh9KxZx1QW7CvIb81bQYQqnrlJ1t5uNzW6C4ITbNOkYKkspVSGIQ5m9fGIutgw4H-9BVufuWZXNN4e8lUk-hy9ugyPiP\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200303357400658\",\n                entidentifier: \"10200303357400658\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200303357400658\",\n                commentcount: 6,\n                likecount: 0,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                    },\n                    alternate: {\n                        text: \"You like this.\",\n                        ranges: [],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_35\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200303357400658_4912489\",\n                fbid: \"10200304193501560\",\n                legacyid: \"4912489\",\n                body: {\n                    text: \"which one?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275695,\n                    text: \"June 26 at 3:41pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:41pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912495\",\n                fbid: \"10200304196181627\",\n                legacyid: \"4912495\",\n                body: {\n                    text: \"oh! this is what is said... ruin all childhood memories!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275736,\n                    text: \"June 26 at 3:42pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:42pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912503\",\n                fbid: \"10200304201781767\",\n                legacyid: \"4912503\",\n                body: {\n                    text: \"It didn't work for me!!!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275825,\n                    text: \"June 26 at 3:43pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:43pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912511\",\n                fbid: \"10200304206981897\",\n                legacyid: \"4912511\",\n                body: {\n                    text: \"Anyhow, it was nice. Thanks\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 1,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275890,\n                    text: \"June 26 at 3:44pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:44pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"100006118350059\",\n                JSBNG__name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"100001619067228\",\n                JSBNG__name: \"Baharak Saberidokht\",\n                firstName: \"Baharak\",\n                vanity: \"baharak.saberidokht\",\n                thumbSrc: \"http://jsbngssl.profile-b.xx.fbcdn.net/hprofile-prn2/s32x32/260631_100001619067228_542177443_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/baharak.saberidokht\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"100002461958396\",\n                JSBNG__name: \"Vida Farsam\",\n                firstName: \"Vida\",\n                vanity: \"vida.farsam\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/203461_100002461958396_1397706771_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/vida.farsam\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200303357400658: {\n                        chronological: {\n                            range: {\n                                offset: 2,\n                                length: 4\n                            },\n                            values: [\"10200303357400658_4912489\",\"10200303357400658_4912495\",\"10200303357400658_4912503\",\"10200303357400658_4912511\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200303357400658_4912489\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912495\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912503\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912511\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    }\n                }\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_37\",[\"UFIController\",\"m_0_36\",\"m_0_3a\",],[{\n            __m: \"m_0_36\"\n        },{\n            ftentidentifier: \"10200350995551582\",\n            instanceid: \"u_0_1p\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQAL6BzquKdEOsowbM5EApJSTx6t3cX6HciBVTv0b5LrvxxIJCzjrIRDfSJQkmNYNpWRY9gmo4wEeKJRhKK4-l-Zoo7Qh0CHqMJoeS3abWLYVH2-tpPv_e1Dbt9VoF2V6POO7o3hDHFz3c-RSnP8jxUtjwGPFaxac69dWJ7JOEwHvXuJX7DnZtIcQ2c_SQCaqKmp4ImCjp_sSYLsZEsVwMSuvj4Vvum_4gbcfb8NyXWOoohbGwhVMcFZAIew_h7I6wjgKjs2ynj7Yv0m2S2f2gAtU3214N_hc7rKEwpq6HwD2ZXxju5LX2BYY5CMi3boX9ne0xwjcPN_ptGl5Mf9X2Jf5GC7DB11C04H8LqGRB7DoA7BI5mLlEaVU23XihhNJRr3Gr3e8CanKSIyt5LwwdCt\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200350995551582\",\n                entidentifier: \"10200350995551582\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200350995551582\",\n                commentcount: 5,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Jan Vitek likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Jan Vitek like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3a\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200350995551582_4954379\",\n                fbid: \"10200357365790834\",\n                legacyid: \"4954379\",\n                body: {\n                    text: \"You should have snatched it out of his hands, and played it/\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1710926078\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373168110,\n                    text: \"July 6 at 11:35pm\",\n                    verbose: \"Saturday, July 6, 2013 at 11:35pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955913\",\n                fbid: \"10200359402281745\",\n                legacyid: \"4955913\",\n                body: {\n                    text: \"I've found that stealing musical instruments in non-English-speaking countries hasn't brought me great luck in the past.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214256,\n                    text: \"Sunday at 12:24pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:24pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955915\",\n                fbid: \"10200359408281895\",\n                legacyid: \"4955915\",\n                body: {\n                    text: \"But in English-speaking countries it's just fine.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"10715287\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214355,\n                    text: \"Sunday at 12:25pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:25pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955918\",\n                fbid: \"10200359410801958\",\n                legacyid: \"4955918\",\n                body: {\n                    text: \"Naturally.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214375,\n                    text: \"Sunday at 12:26pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:26pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1710926078\",\n                JSBNG__name: \"Kathy Wertheimer Richards\",\n                firstName: \"Kathy\",\n                vanity: \"kathy.w.richards\",\n                thumbSrc: \"http://jsbngssl.profile-a.xx.fbcdn.net/hprofile-prn2/s32x32/276006_1710926078_512651488_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/kathy.w.richards\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                JSBNG__name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"10715287\",\n                JSBNG__name: \"Michael A Goss\",\n                firstName: \"Michael\",\n                vanity: \"michael.a.goss\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/624179_10715287_1397603425_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/michael.a.goss\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200350995551582: {\n                        chronological: {\n                            range: {\n                                offset: 1,\n                                length: 4\n                            },\n                            values: [\"10200350995551582_4954379\",\"10200350995551582_4955913\",\"10200350995551582_4955915\",\"10200350995551582_4955918\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200350995551582_4954379\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955913\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955915\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955918\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    }\n                }\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_39\",[\"UFIController\",\"m_0_38\",\"m_0_35\",],[{\n            __m: \"m_0_38\"\n        },{\n            ftentidentifier: \"10200325012062011\",\n            instanceid: \"u_0_1q\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQACFgRImnzTiCidDckAnsXMzyyCTp2xlEkdxtLDdjHBxnem9BliGg5LEnDunnxvmLZ3fMMKmsD9ygBkRtmsP85o7-LYCuNIPaMahgk_-xIrgFtyL9LKNnaZOTTudzDfOens6YeAmPC3QnUyvB9IFKVci93BAZKWzKC4DehohxvbuKn4zcIyhG59kU5yOHk03PO-Ue-AKD7ZnJCSIAIhhmY4Y5d6S202CjqJdFJJaP_Y4tzOOgekKxAKONhL4W0mrsdASIKsmRQiuj-3UIAJSOvDnyAjBoy0RSsF1zLIfRPWpsBvEpJd7WDG4iCUccj0Lfglb3yuGtH1Om1AGO6fAJTHLuCvnR7BpptYndMLrEkD9JxBA2kaJHmCzYiTqHSEHHe8sKqwiBEgruorRn6UD6iKpV5vptKAUqIESRSKWUJqNQ\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200325012062011\",\n                entidentifier: \"10200325012062011\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200325012062011\",\n                commentcount: 0,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Steph Burg likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Steph Burg like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_35\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [],\n            profiles: [],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200325012062012: {\n                        chronological: {\n                            range: {\n                                offset: 0,\n                                length: 0\n                            },\n                            values: []\n                        }\n                    }\n                },\n                replies: null\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_3c\",[\"UFIController\",\"m_0_3b\",\"m_0_35\",],[{\n            __m: \"m_0_3b\"\n        },{\n            ftentidentifier: \"10200343222477260\",\n            instanceid: \"u_0_1t\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQC1ajTXRDAv2wZzRUQ-G1KuB_j2Ydk0o99-s0DfIrW3cEC8EBlrci94wT46S1ENWJhhyDAhp4bST94TloNAKLx6tdfZIWHfu8RmsxRdWGcByUX-EIwNoPoeRR-sY3mXdJ72ams13WH-zUj60bdWPnFRXyEpNMCR7ciJ4z8AMbiDbKhfut2t2Vn4Jki69lK6ZsFw-T6sYVNa6Lj-UF9TJSdnScEziwiE6YdI6DC-PoCxGCC_Ntu7LtFa7kJuLcOgBliX_FkGFVu6PR-g-ixwHMHYpI7c7FHuNsOlZFQaX2zoBMffqwMrQhRkgLzltSL3nEQjBX3KSM_AMm64tnSMj0iXWK_Zux1sXie2Ml8Z8jCPS3K6CDSBwo3MKgs2LUD_UJecJAlv7ZspNwT9YGc6MVlE\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200343222477260\",\n                entidentifier: \"10200343222477260\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200343222477260\",\n                commentcount: 11,\n                likecount: 7,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"7 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 7\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 7 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 7\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_35\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200343222477260_4946958\",\n                fbid: \"10200346777686138\",\n                legacyid: \"4946958\",\n                body: {\n                    text: \"Does it have a sense of the surreal or are you just sharing a data point? ;)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372985540,\n                    text: \"July 4 at 8:52pm\",\n                    verbose: \"Thursday, July 4, 2013 at 8:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4947623\",\n                fbid: \"10200347758230651\",\n                legacyid: \"4947623\",\n                body: {\n                    text: \"Merely minor amusement.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373002430,\n                    text: \"July 5 at 1:33am\",\n                    verbose: \"Friday, July 5, 2013 at 1:33am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950566\",\n                fbid: \"10200351838652659\",\n                legacyid: \"4950566\",\n                body: {\n                    text: \"Did you wear http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                    ranges: [{\n                        offset: 13,\n                        length: 68,\n                        entities: [{\n                            url: \"http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                            shimhash: \"dAQH_FG1i\",\n                            id: \"0746af69b9da85d793efe61531abaafe\",\n                            JSBNG__external: true\n                        },]\n                    },],\n                    aggregatedranges: []\n                },\n                author: \"53600996\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066508,\n                    text: \"July 5 at 7:21pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:21pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950571\",\n                fbid: \"10200351843052769\",\n                legacyid: \"4950571\",\n                body: {\n                    text: \"That's the most delightfully offensive piece of apparel I've seen in quite some time.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066594,\n                    text: \"July 5 at 7:23pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:23pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1633181753\",\n                JSBNG__name: \"Robert Nesius\",\n                firstName: \"Robert\",\n                vanity: \"rnesius\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/573766_1633181753_1114062672_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/rnesius\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"53600996\",\n                JSBNG__name: \"Harrison Metzger\",\n                firstName: \"Harrison\",\n                vanity: \"harrisonmetz\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/195694_53600996_1993816119_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/harrisonmetz\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200343222477260: {\n                        chronological: {\n                            range: {\n                                offset: 7,\n                                length: 4\n                            },\n                            values: [\"10200343222477260_4946958\",\"10200343222477260_4947623\",\"10200343222477260_4950566\",\"10200343222477260_4950571\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200343222477260_4946958\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4947623\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950566\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950571\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    }\n                }\n            },\n            servertime: 1373491942\n        },],1,],[\"m_0_35\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],6,],[\"m_0_3a\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_3d\",[\"XHPTemplate\",\"m_0_3e\",],[{\n            __m: \"m_0_3e\"\n        },],2,],],\n        define: [[\"CLogConfig\",[],{\n            gkResults: 0\n        },174,],[\"UFICommentTemplates\",[\"m_0_3d\",],{\n            \":fb:ufi:hide-dialog-template\": {\n                __m: \"m_0_3d\"\n            }\n        },70,],[\"UFISpamCountImpl\",[],{\n            \"module\": null\n        },72,],[\"UFIConfig\",[],{\n            renderEmoji: true,\n            renderEmoticons: 1\n        },71,],],\n        elements: [[\"m_0_2j\",\"u_0_1b\",2,],[\"m_0_2g\",\"u_0_1c\",4,],[\"m_0_2o\",\"u_0_1f\",2,],[\"m_0_2l\",\"u_0_1g\",4,],[\"m_0_2t\",\"u_0_1i\",2,],[\"m_0_2q\",\"u_0_1j\",4,],[\"m_0_2y\",\"u_0_1l\",2,],[\"m_0_2v\",\"u_0_1m\",4,],[\"m_0_33\",\"u_0_1o\",2,],[\"m_0_36\",\"u_0_1r\",2,],[\"m_0_38\",\"u_0_1s\",2,],[\"m_0_3b\",\"u_0_1u\",2,],[\"m_0_30\",\"u_0_1v\",2,],[\"m_0_2z\",\"u_0_1w\",2,],[\"m_0_31\",\"u_0_1x\",2,],[\"m_0_32\",\"u_0_1y\",2,],],\n        markup: [[\"m_0_3e\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"pvs phm -cx-PUBLIC-uiDialog__title\\\" data-jsid=\\\"title\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pam -cx-PRIVATE-uiDialog__body\\\" data-jsid=\\\"body\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiDialog__footer\\\"\\u003E\\u003Cdiv class=\\\"pam uiOverlayFooter uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerConfirm uiOverlayButton selected -cx-PRIVATE-uiButton__confirm -cx-PRIVATE-uiButton__large\\\" data-jsid=\\\"delete\\\" type=\\\"submit\\\"\\u003EDelete\\u003C/button\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerCancel uiOverlayButton -cx-PRIVATE-uiButton__large\\\" role=\\\"button\\\" href=\\\"#\\\"\\u003ECancel\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n        TypeaheadHoistFriends: {\n            resources: [\"bUzfU\",],\n            \"module\": true\n        },\n        \"UFIEntStreamOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"0duP3\",\"vzIoO\",\"QI+gv\",\"TOw+q\",],\n            \"module\": true\n        },\n        InputSelection: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        FileInputUploader: {\n            resources: [\"AyUu6\",\"AsDOA\",\"LpC/l\",\"FFdfj\",],\n            \"module\": true\n        },\n        DialogX: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n            \"module\": true\n        },\n        ContextualTypeaheadView: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        TypeaheadBestName: {\n            resources: [\"OJTM4\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadMetrics: {\n            resources: [\"AyUu6\",\"bUzfU\",],\n            \"module\": true\n        },\n        MentionsInput: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"OJTM4\",],\n            \"module\": true\n        },\n        TypingDetector: {\n            resources: [\"AyUu6\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadAreaCore: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"u//Ut\",\"bUzfU\",],\n            \"module\": true\n        },\n        EntstreamPubContentOverlay: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"7EHvC\",\"TOw+q\",\"0duP3\",\"63VzN\",\"40bIq\",],\n            \"module\": true\n        },\n        CompactTypeaheadRenderer: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        ScrollAwareDOM: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        \"legacy:live-js\": {\n            resources: [\"AyUu6\",\"OJTM4\",]\n        },\n        collectDataAttributes: {\n            resources: [\"AyUu6\",],\n            \"module\": true\n        },\n        UFIScrollHighlight: {\n            resources: [\"AyUu6\",\"AsDOA\",\"KPZ5T\",\"rSdpp\",],\n            \"module\": true\n        },\n        UFIComments: {\n            resources: [\"OJTM4\",\"AyUu6\",],\n            \"module\": true\n        },\n        UFIRetryActions: {\n            resources: [\"AyUu6\",\"OJTM4\",\"8ay4F\",],\n            \"module\": true\n        },\n        LegacyMenuUtils: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"utuxU\",\"NfUUN\",],\n            \"module\": true\n        },\n        HashtagLayerPageController: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"IxyKh\",\"cq4zB\",\"Lsvc0\",\"7EHvC\",\"BBKr2\",\"iFPko\",\"AMFDz\",\"qRGqD\",],\n            \"module\": true\n        },\n        \"legacy:ufi-tracking-js\": {\n            resources: [\"AyUu6\",]\n        },\n        CLoggerX: {\n            resources: [\"AyUu6\",\"OJTM4\",],\n            \"module\": true\n        },\n        \"UFICommentRemovalControls.react\": {\n            resources: [\"OJTM4\",\"AyUu6\",\"W3Ky6\",\"QE+SD\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        ScrollableArea: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        HashtagParser: {\n            resources: [\"u//Ut\",\"hfrQl\",],\n            \"module\": true\n        },\n        TextAreaControl: {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",],\n            \"module\": true\n        },\n        LegacyContextualDialog: {\n            resources: [\"AyUu6\",\"AsDOA\",\"EzMPG\",\"W3Ky6\",],\n            \"module\": true\n        },\n        Typeahead: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",],\n            \"module\": true\n        },\n        Hovercard: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        FileInput: {\n            resources: [\"AyUu6\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        \"UFIOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        AMFDz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/l0jEiYB1BY4.js\"\n        },\n        BBKr2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/2RUWo8vhW3Y.js\"\n        },\n        SZ74q: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/tx5kAeM5toK.css\"\n        },\n        \"QI+gv\": {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/SBdkAjjHF0N.css\"\n        },\n        \"8ay4F\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/VrfxLTcinh0.js\"\n        },\n        iFPko: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/WUd0A3Y3Ufl.js\"\n        },\n        vzIoO: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/4aLzYp5O_a3.js\"\n        },\n        Lsvc0: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/uScKsmssLAV.js\"\n        },\n        NfUUN: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/F-cQl2_T1TU.js\"\n        },\n        rSdpp: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yc/r/2PkTFjdVPzc.js\"\n        },\n        \"7EHvC\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/U6rPColAdZi.js\"\n        },\n        \"40bIq\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/iFMz0qojeiH.css\"\n        },\n        qRGqD: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/0zNvPsl4_Iy.js\"\n        },\n        \"QE+SD\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/PIykjmSfAPR.js\"\n        },\n        \"TOw+q\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/ZtrEG6Cgqa3.js\"\n        },\n        utuxU: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/lq5XLbLZk-t.js\"\n        },\n        FFdfj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/BCHq7tR3xKp.js\"\n        },\n        IxyKh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/7f-bDgHTzcK.js\"\n        },\n        cq4zB: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/y--u5gxmM74.css\"\n        }\n    },\n    ixData: {\n        \"/images/group_gifts/icons/gift_icon_red-13px.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/83ZMt066WCp.png\",\n            width: 13,\n            height: 13\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    displayJS: [\"AyUu6\",\"OJTM4\",],\n    onafterload: [\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:ufi-tracking-js\\\"], function(){ ufi_add_all_link_data(); });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",],\n    id: \"pagelet_timeline_recent_segment_0_0_left\",\n    phase: 2,\n    tti_phase: 2\n});");
// 1590
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_2d\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_3f\",\"m_0_3g\",\"m_0_3h\",],[{\n            __m: \"m_0_3f\"\n        },{\n            __m: \"m_0_3g\"\n        },{\n            __m: \"m_0_3h\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_3i\",],[\"m_0_3k\",],[\"m_0_3h\",],[\"Typeahead\",\"init\",[\"m_0_3l\",\"m_0_3h\",],[{\n            __m: \"m_0_3l\"\n        },{\n            __m: \"m_0_3h\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_3h\",\"m_0_3n\",],[{\n            __m: \"m_0_3h\"\n        },{\n            __m: \"m_0_3n\"\n        },],],[\"m_0_3q\",],[\"m_0_3r\",],[\"Layer\",\"init\",[\"m_0_3r\",\"m_0_3s\",],[{\n            __m: \"m_0_3r\"\n        },{\n            __m: \"m_0_3s\"\n        },],],[\"m_0_3g\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_3k\",[\"ScrollableArea\",\"m_0_3j\",],[{\n            __m: \"m_0_3j\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_3h\",[\"Typeahead\",\"m_0_3o\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_3l\",\"ChatTypeaheadCore\",\"m_0_3m\",],[{\n            __m: \"m_0_3o\"\n        },{\n            node_id: \"u_0_20\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_3l\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_3m\"\n        },],7,],[\"m_0_3q\",[\"ChatSidebarDropdown\",\"m_0_3p\",],[{\n            __m: \"m_0_3p\"\n        },null,],1,],[\"m_0_3r\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_3g\",[\"ChatOrderedList\",\"m_0_3t\",\"m_0_3u\",\"m_0_3v\",\"m_0_3r\",],[true,{\n            __m: \"m_0_3t\"\n        },{\n            __m: \"m_0_3u\"\n        },{\n            __m: \"m_0_3v\"\n        },{\n            __m: \"m_0_3r\"\n        },null,],5,],[\"m_0_3i\",[\"LiveBarDark\",\"m_0_3g\",],[{\n            __m: \"m_0_3g\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_3o\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_3u\",[\"XHPTemplate\",\"m_0_3w\",],[{\n            __m: \"m_0_3w\"\n        },],2,],[\"m_0_3v\",[\"XHPTemplate\",\"m_0_3x\",],[{\n            __m: \"m_0_3x\"\n        },],2,],[\"m_0_3y\",[\"XHPTemplate\",\"m_0_42\",],[{\n            __m: \"m_0_42\"\n        },],2,],[\"m_0_3z\",[\"XHPTemplate\",\"m_0_43\",],[{\n            __m: \"m_0_43\"\n        },],2,],[\"m_0_40\",[\"XHPTemplate\",\"m_0_45\",],[{\n            __m: \"m_0_45\"\n        },],2,],[\"m_0_41\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],],\n        define: [[\"ChatOptionsInitialData\",[],{\n            sound: 1,\n            browser_notif: 0,\n            sidebar_mode: true\n        },13,],[\"ChatSidebarCalloutData\",[],{\n            isShown: false\n        },14,],[\"ChannelImplementation\",[\"ChannelConnection\",],{\n            instance: {\n                __m: \"ChannelConnection\"\n            }\n        },150,],[\"ChannelInitialData\",[],{\n            channelConfig: {\n                IFRAME_LOAD_TIMEOUT: 30000,\n                P_TIMEOUT: 30000,\n                STREAMING_TIMEOUT: 70000,\n                PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n                PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n                user_channel: \"p_100006118350059\",\n                seq: -1,\n                retry_interval: 0,\n                max_conn: 6,\n                forceIframe: false,\n                streamProbe: false,\n                tryStreaming: true,\n                bustIframe: false,\n                webrtcSupport: false\n            },\n            reason: 6,\n            state: \"reconnect!\"\n        },143,],[\"MercuryConstants\",[\"MercuryAttachmentType\",\"MercuryPayloadSource\",\"MercuryParticipantTypes\",\"MercuryAttachmentContentType\",\"MercuryThreadlistConstants\",\"MessagingConfig\",\"MercuryTimePassed\",\"MercurySourceType\",\"MessagingEvent\",\"MercuryLogMessageType\",\"MercuryThreadMode\",\"MercuryMessageSourceTags\",\"MercuryActionStatus\",\"MercuryActionTypeConstants\",\"MercuryErrorType\",\"MercuryParticipantsConstants\",\"MessagingTag\",\"MercuryGlobalActionType\",\"MercuryGenericConstants\",\"MercuryAPIArgsSource\",],{\n            MercuryAttachmentType: {\n                __m: \"MercuryAttachmentType\"\n            },\n            VideoChatConstants: {\n                START_SESSION: 1,\n                GET_SKYPE_TOKEN: 2,\n                AWAITING_CALL: 3,\n                CANCELLED_CALL: 4,\n                CONNECTED_CALL: 5,\n                HANDLED_CALL: 6,\n                GOT_START_SESSION: 7,\n                INSTALLING: 8,\n                INSTALLED: 9,\n                INSTALL_CANCELED: 10,\n                ASSOC_CONNECTED_CALL: 118224944915447,\n                ASSOC_VIEWED_CALL_PROMO: 250568041676842,\n                MAX_VC_PROMO_VIEWS: 2,\n                MINIMUM_VC_PROMO_VIEW_INTERVAL: 5184000,\n                MINIMUM_VC_LAST_CALLED_INTERVAL: 5184000\n            },\n            MercuryAttachmentAudioClip: \"fb_voice_message\",\n            MercuryAppIDs: {\n                DESKTOP_NOTIFIER: 220764691281998,\n                DESKTOP_SOCIALFOX: 276729612446445\n            },\n            MercuryPayloadSource: {\n                __m: \"MercuryPayloadSource\"\n            },\n            AttachmentMaxSize: 26214400,\n            MercuryParticipantTypes: {\n                __m: \"MercuryParticipantTypes\"\n            },\n            MercuryTypeaheadConstants: {\n                COMPOSER_FRIENDS_MAX: 4,\n                COMPOSER_NON_FRIENDS_MAX: 2,\n                COMPOSER_SHOW_MORE_LIMIT: 4,\n                COMPOSER_THREADS_INITIAL_LIMIT: 2,\n                USER_TYPE: \"user\",\n                PAGE_TYPE: \"page\",\n                THREAD_TYPE: \"thread\",\n                HEADER_TYPE: \"header\",\n                FRIEND_TYPE: \"friend\",\n                NON_FRIEND_TYPE: \"non_friend\",\n                VALID_EMAIL: \"^([A-Z0-9._%+-]+@((?!facebook\\\\.com))[A-Z0-9.-]+\\\\.[A-Z]{2,4}|(([A-Z._%+-]+[A-Z0-9._%+-]*)|([A-Z0-9._%+-]+[A-Z._%+-]+[A-Z0-9._%+-]*))@(?:facebook\\\\.com))$\"\n            },\n            MercuryAttachmentContentType: {\n                __m: \"MercuryAttachmentContentType\"\n            },\n            MercurySendMessageTimeout: 45000,\n            ChatNotificationConstants: {\n                NORMAL: 0,\n                NO_USER_MESSAGE_NOTIFICATION: 1\n            },\n            MercuryThreadlistConstants: {\n                __m: \"MercuryThreadlistConstants\"\n            },\n            MessagingConfig: {\n                __m: \"MessagingConfig\"\n            },\n            MercuryTimePassed: {\n                __m: \"MercuryTimePassed\"\n            },\n            MercurySourceType: {\n                __m: \"MercurySourceType\"\n            },\n            MessagingEventTypes: {\n                __m: \"MessagingEvent\"\n            },\n            MessagingFilteringType: {\n                LEGACY: \"legacy\",\n                MODERATE: \"moderate\",\n                STRICT: \"strict\"\n            },\n            MercurySupportedShareType: {\n                FB_PHOTO: 2,\n                FB_ALBUM: 3,\n                FB_VIDEO: 11,\n                FB_SONG: 28,\n                FB_MUSIC_ALBUM: 30,\n                FB_PLAYLIST: 31,\n                FB_MUSICIAN: 35,\n                FB_RADIO_STATION: 33,\n                EXTERNAL: 100,\n                FB_TEMPLATE: 300,\n                FB_SOCIAL_REPORT_PHOTO: 48,\n                FB_COUPON: 32,\n                FB_SHARE: 99,\n                FB_HC_QUESTION: 55,\n                FB_HC_ANSWER: 56\n            },\n            Sandbox: {\n                ORIGIN: \"http://jsbngssl.fbstatic-a.akamaihd.net\",\n                PAGE_URL: \"http://jsbngssl.fbstatic-a.akamaihd.net/fbsbx/fbsbx.php?1\"\n            },\n            MercuryLogMessageType: {\n                __m: \"MercuryLogMessageType\"\n            },\n            MercuryThreadMode: {\n                __m: \"MercuryThreadMode\"\n            },\n            MercuryMessageSourceTags: {\n                __m: \"MercuryMessageSourceTags\"\n            },\n            MercuryActionStatus: {\n                __m: \"MercuryActionStatus\"\n            },\n            MercuryActionType: {\n                __m: \"MercuryActionTypeConstants\"\n            },\n            UIPushPhase: \"V3\",\n            MercuryErrorType: {\n                __m: \"MercuryErrorType\"\n            },\n            MercuryParticipantsConstants: {\n                __m: \"MercuryParticipantsConstants\"\n            },\n            MessagingTag: {\n                __m: \"MessagingTag\"\n            },\n            MercuryGlobalActionType: {\n                __m: \"MercuryGlobalActionType\"\n            },\n            MercuryGenericConstants: {\n                __m: \"MercuryGenericConstants\"\n            },\n            MercuryAPIArgsSource: {\n                __m: \"MercuryAPIArgsSource\"\n            }\n        },36,],[\"PresenceInitialData\",[],{\n            serverTime: \"1373491943000\",\n            cookiePollInterval: 500,\n            cookieVersion: 2,\n            dictEncode: true\n        },57,],[\"InitialChatFriendsList\",[],{\n            list: []\n        },26,],[\"BlackbirdUpsellConfig\",[],{\n            EducationTimeOfflineThresdhold: 5184000,\n            UpsellImpressions: 0,\n            UpsellGK: false,\n            UpsellImpressionLimit: 3,\n            TimeOffline: 0,\n            UpsellMinFriendCount: 50,\n            FriendCount: 0,\n            EducationDismissed: 0,\n            EducationGK: 1,\n            UpsellDismissed: 0,\n            EducationImpressionLimit: 2,\n            EducationImpressions: 0\n        },8,],[\"InitialMultichatList\",[],{\n        },132,],[\"BlackbirdUpsellTemplates\",[\"m_0_3y\",\"m_0_3z\",\"m_0_40\",\"m_0_41\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_3y\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_3z\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_40\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_41\"\n            }\n        },10,],[\"ChatConfigInitialData\",[],{\n            warning_countdown_threshold_msec: 15000,\n            \"24h_times\": false,\n            livebar_fetch_defer: 1000,\n            \"video.collision_connect\": 1,\n            \"ordered_list.top_mobile\": 5,\n            mute_warning_time_msec: 25000,\n            \"blackbird.min_for_clear_button\": 10,\n            chat_multi_typ_send: 1,\n            web_messenger_suppress_tab_unread: 1,\n            \"ordered_list.top_friends\": 0,\n            chat_impression_logging_with_click: true,\n            channel_manual_reconnect_defer_msec: 2000,\n            \"sidebar.minimum_width\": 1225,\n            \"sound.notif_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yq/r/Mpd0-fRgh5n.mp3\",\n            \"roger.seen_delay\": 15000,\n            tab_max_load_age: 86400000,\n            typing_notifications: true,\n            show_sticker_nux: true,\n            chat_web_ranking_with_presence: 1,\n            chat_ranked_by_coefficient: 1,\n            \"video.skype_client_log\": 1,\n            \"periodical_impression_logging_config.interval\": 1800000,\n            chat_tab_title_link_timeline: 1,\n            max_sidebar_multichats: 3,\n            tab_auto_close_timeout: 86400000,\n            chat_impression_logging_periodical: true,\n            divebar_has_new_groups_button: true,\n            sound_enabled: true,\n            \"sound.ringtone_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/y3/r/mbcn6dBHIeX.ogg\",\n            sidebar_ticker: 1\n        },12,],[\"AvailableListInitialData\",[],{\n            chatNotif: 0,\n            pollInterval: 100000,\n            availableList: {\n            },\n            lazyPollInterval: 300000,\n            favoriteList: [],\n            mobileFriends: null,\n            lazyThreshold: 300000,\n            availableCount: 0,\n            lastActiveTimes: null,\n            updateTime: 1373491943000\n        },166,],],\n        elements: [[\"m_0_3f\",\"u_0_21\",2,],[\"m_0_3j\",\"u_0_22\",2,],[\"m_0_3m\",\"u_0_23\",2,],[\"m_0_3n\",\"u_0_24\",2,],[\"m_0_3l\",\"u_0_25\",4,],[\"m_0_3p\",\"u_0_26\",2,],[\"m_0_3t\",\"u_0_28\",2,],[\"m_0_44\",\"u_0_2a\",2,\"m_0_43\",],[\"m_0_46\",\"u_0_2b\",2,\"m_0_45\",],[\"m_0_48\",\"u_0_2c\",2,\"m_0_47\",],],\n        markup: [[\"m_0_3s\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_27\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_3w\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_3x\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_42\",{\n            __html: \"\\u003Cdiv class=\\\"pam -cx-PRIVATE-blackbirdUpsell__dialogframe\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_29\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_29\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"prs\\\" data-jsid=\\\"dialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_43\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=offline&amp;promo_source=educate\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2a\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E You can turn on chat for just a few friends. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003Cdiv class=\\\"-cx-PRIVATE-blackbirdUpsell__buttoncontainer\\\"\\u003E\\u003Ca class=\\\"mvm -cx-PRIVATE-blackbirdUpsell__chatsettingsbutton uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" ajaxify=\\\"/ajax/chat/privacy/settings_dialog.php\\\" rel=\\\"dialog\\\" data-jsid=\\\"chatSettingsButton\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EEdit Chat Settings\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n        },3,],[\"m_0_45\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2b\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E While you have chat turned off for some friends, their messages go to your inbox. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_47\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2c\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E When chat is off, messages from friends go to your inbox for you to read later. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"cy4a0\",\"0duP3\",],\n    bootloadable: {\n        SortableGroup: {\n            resources: [\"AyUu6\",\"6tAwh\",\"AsDOA\",],\n            \"module\": true\n        },\n        LitestandSidebarBookmarksDisplay: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"b7cJk\",],\n            \"module\": true\n        },\n        LitestandSidebar: {\n            resources: [\"AyUu6\",\"fvNhh\",\"u//Ut\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/Oe0OO6kzRjj.js\"\n        },\n        \"H+v1W\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/LUiDH5-xN0p.js\"\n        },\n        fvNhh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/5jg9lcQx50S.js\"\n        },\n        b7cJk: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/S1VZtHRb9th.js\"\n        }\n    },\n    ixData: {\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"OJTM4\",\"u//Ut\",\"EzMPG\",\"brbS1\",\"H+v1W\",],\n    id: \"pagelet_sidebar\",\n    phase: 3\n});");
// 1591
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sc7cc992884179f829ae3f7660a5a62008572df6b");
// 1592
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_2d\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_3f\",\"m_0_3g\",\"m_0_3h\",],[{\n            __m: \"m_0_3f\"\n        },{\n            __m: \"m_0_3g\"\n        },{\n            __m: \"m_0_3h\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_3i\",],[\"m_0_3k\",],[\"m_0_3h\",],[\"Typeahead\",\"init\",[\"m_0_3l\",\"m_0_3h\",],[{\n            __m: \"m_0_3l\"\n        },{\n            __m: \"m_0_3h\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_3h\",\"m_0_3n\",],[{\n            __m: \"m_0_3h\"\n        },{\n            __m: \"m_0_3n\"\n        },],],[\"m_0_3q\",],[\"m_0_3r\",],[\"Layer\",\"init\",[\"m_0_3r\",\"m_0_3s\",],[{\n            __m: \"m_0_3r\"\n        },{\n            __m: \"m_0_3s\"\n        },],],[\"m_0_3g\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_3k\",[\"ScrollableArea\",\"m_0_3j\",],[{\n            __m: \"m_0_3j\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_3h\",[\"Typeahead\",\"m_0_3o\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_3l\",\"ChatTypeaheadCore\",\"m_0_3m\",],[{\n            __m: \"m_0_3o\"\n        },{\n            node_id: \"u_0_20\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_3l\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_3m\"\n        },],7,],[\"m_0_3q\",[\"ChatSidebarDropdown\",\"m_0_3p\",],[{\n            __m: \"m_0_3p\"\n        },null,],1,],[\"m_0_3r\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_3g\",[\"ChatOrderedList\",\"m_0_3t\",\"m_0_3u\",\"m_0_3v\",\"m_0_3r\",],[true,{\n            __m: \"m_0_3t\"\n        },{\n            __m: \"m_0_3u\"\n        },{\n            __m: \"m_0_3v\"\n        },{\n            __m: \"m_0_3r\"\n        },null,],5,],[\"m_0_3i\",[\"LiveBarDark\",\"m_0_3g\",],[{\n            __m: \"m_0_3g\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_3o\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_3u\",[\"XHPTemplate\",\"m_0_3w\",],[{\n            __m: \"m_0_3w\"\n        },],2,],[\"m_0_3v\",[\"XHPTemplate\",\"m_0_3x\",],[{\n            __m: \"m_0_3x\"\n        },],2,],[\"m_0_3y\",[\"XHPTemplate\",\"m_0_42\",],[{\n            __m: \"m_0_42\"\n        },],2,],[\"m_0_3z\",[\"XHPTemplate\",\"m_0_43\",],[{\n            __m: \"m_0_43\"\n        },],2,],[\"m_0_40\",[\"XHPTemplate\",\"m_0_45\",],[{\n            __m: \"m_0_45\"\n        },],2,],[\"m_0_41\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],],\n        define: [[\"ChatOptionsInitialData\",[],{\n            sound: 1,\n            browser_notif: 0,\n            sidebar_mode: true\n        },13,],[\"ChatSidebarCalloutData\",[],{\n            isShown: false\n        },14,],[\"ChannelImplementation\",[\"ChannelConnection\",],{\n            instance: {\n                __m: \"ChannelConnection\"\n            }\n        },150,],[\"ChannelInitialData\",[],{\n            channelConfig: {\n                IFRAME_LOAD_TIMEOUT: 30000,\n                P_TIMEOUT: 30000,\n                STREAMING_TIMEOUT: 70000,\n                PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n                PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n                user_channel: \"p_100006118350059\",\n                seq: -1,\n                retry_interval: 0,\n                max_conn: 6,\n                forceIframe: false,\n                streamProbe: false,\n                tryStreaming: true,\n                bustIframe: false,\n                webrtcSupport: false\n            },\n            reason: 6,\n            state: \"reconnect!\"\n        },143,],[\"MercuryConstants\",[\"MercuryAttachmentType\",\"MercuryPayloadSource\",\"MercuryParticipantTypes\",\"MercuryAttachmentContentType\",\"MercuryThreadlistConstants\",\"MessagingConfig\",\"MercuryTimePassed\",\"MercurySourceType\",\"MessagingEvent\",\"MercuryLogMessageType\",\"MercuryThreadMode\",\"MercuryMessageSourceTags\",\"MercuryActionStatus\",\"MercuryActionTypeConstants\",\"MercuryErrorType\",\"MercuryParticipantsConstants\",\"MessagingTag\",\"MercuryGlobalActionType\",\"MercuryGenericConstants\",\"MercuryAPIArgsSource\",],{\n            MercuryAttachmentType: {\n                __m: \"MercuryAttachmentType\"\n            },\n            VideoChatConstants: {\n                START_SESSION: 1,\n                GET_SKYPE_TOKEN: 2,\n                AWAITING_CALL: 3,\n                CANCELLED_CALL: 4,\n                CONNECTED_CALL: 5,\n                HANDLED_CALL: 6,\n                GOT_START_SESSION: 7,\n                INSTALLING: 8,\n                INSTALLED: 9,\n                INSTALL_CANCELED: 10,\n                ASSOC_CONNECTED_CALL: 118224944915447,\n                ASSOC_VIEWED_CALL_PROMO: 250568041676842,\n                MAX_VC_PROMO_VIEWS: 2,\n                MINIMUM_VC_PROMO_VIEW_INTERVAL: 5184000,\n                MINIMUM_VC_LAST_CALLED_INTERVAL: 5184000\n            },\n            MercuryAttachmentAudioClip: \"fb_voice_message\",\n            MercuryAppIDs: {\n                DESKTOP_NOTIFIER: 220764691281998,\n                DESKTOP_SOCIALFOX: 276729612446445\n            },\n            MercuryPayloadSource: {\n                __m: \"MercuryPayloadSource\"\n            },\n            AttachmentMaxSize: 26214400,\n            MercuryParticipantTypes: {\n                __m: \"MercuryParticipantTypes\"\n            },\n            MercuryTypeaheadConstants: {\n                COMPOSER_FRIENDS_MAX: 4,\n                COMPOSER_NON_FRIENDS_MAX: 2,\n                COMPOSER_SHOW_MORE_LIMIT: 4,\n                COMPOSER_THREADS_INITIAL_LIMIT: 2,\n                USER_TYPE: \"user\",\n                PAGE_TYPE: \"page\",\n                THREAD_TYPE: \"thread\",\n                HEADER_TYPE: \"header\",\n                FRIEND_TYPE: \"friend\",\n                NON_FRIEND_TYPE: \"non_friend\",\n                VALID_EMAIL: \"^([A-Z0-9._%+-]+@((?!facebook\\\\.com))[A-Z0-9.-]+\\\\.[A-Z]{2,4}|(([A-Z._%+-]+[A-Z0-9._%+-]*)|([A-Z0-9._%+-]+[A-Z._%+-]+[A-Z0-9._%+-]*))@(?:facebook\\\\.com))$\"\n            },\n            MercuryAttachmentContentType: {\n                __m: \"MercuryAttachmentContentType\"\n            },\n            MercurySendMessageTimeout: 45000,\n            ChatNotificationConstants: {\n                NORMAL: 0,\n                NO_USER_MESSAGE_NOTIFICATION: 1\n            },\n            MercuryThreadlistConstants: {\n                __m: \"MercuryThreadlistConstants\"\n            },\n            MessagingConfig: {\n                __m: \"MessagingConfig\"\n            },\n            MercuryTimePassed: {\n                __m: \"MercuryTimePassed\"\n            },\n            MercurySourceType: {\n                __m: \"MercurySourceType\"\n            },\n            MessagingEventTypes: {\n                __m: \"MessagingEvent\"\n            },\n            MessagingFilteringType: {\n                LEGACY: \"legacy\",\n                MODERATE: \"moderate\",\n                STRICT: \"strict\"\n            },\n            MercurySupportedShareType: {\n                FB_PHOTO: 2,\n                FB_ALBUM: 3,\n                FB_VIDEO: 11,\n                FB_SONG: 28,\n                FB_MUSIC_ALBUM: 30,\n                FB_PLAYLIST: 31,\n                FB_MUSICIAN: 35,\n                FB_RADIO_STATION: 33,\n                EXTERNAL: 100,\n                FB_TEMPLATE: 300,\n                FB_SOCIAL_REPORT_PHOTO: 48,\n                FB_COUPON: 32,\n                FB_SHARE: 99,\n                FB_HC_QUESTION: 55,\n                FB_HC_ANSWER: 56\n            },\n            Sandbox: {\n                ORIGIN: \"http://jsbngssl.fbstatic-a.akamaihd.net\",\n                PAGE_URL: \"http://jsbngssl.fbstatic-a.akamaihd.net/fbsbx/fbsbx.php?1\"\n            },\n            MercuryLogMessageType: {\n                __m: \"MercuryLogMessageType\"\n            },\n            MercuryThreadMode: {\n                __m: \"MercuryThreadMode\"\n            },\n            MercuryMessageSourceTags: {\n                __m: \"MercuryMessageSourceTags\"\n            },\n            MercuryActionStatus: {\n                __m: \"MercuryActionStatus\"\n            },\n            MercuryActionType: {\n                __m: \"MercuryActionTypeConstants\"\n            },\n            UIPushPhase: \"V3\",\n            MercuryErrorType: {\n                __m: \"MercuryErrorType\"\n            },\n            MercuryParticipantsConstants: {\n                __m: \"MercuryParticipantsConstants\"\n            },\n            MessagingTag: {\n                __m: \"MessagingTag\"\n            },\n            MercuryGlobalActionType: {\n                __m: \"MercuryGlobalActionType\"\n            },\n            MercuryGenericConstants: {\n                __m: \"MercuryGenericConstants\"\n            },\n            MercuryAPIArgsSource: {\n                __m: \"MercuryAPIArgsSource\"\n            }\n        },36,],[\"PresenceInitialData\",[],{\n            serverTime: \"1373491943000\",\n            cookiePollInterval: 500,\n            cookieVersion: 2,\n            dictEncode: true\n        },57,],[\"InitialChatFriendsList\",[],{\n            list: []\n        },26,],[\"BlackbirdUpsellConfig\",[],{\n            EducationTimeOfflineThresdhold: 5184000,\n            UpsellImpressions: 0,\n            UpsellGK: false,\n            UpsellImpressionLimit: 3,\n            TimeOffline: 0,\n            UpsellMinFriendCount: 50,\n            FriendCount: 0,\n            EducationDismissed: 0,\n            EducationGK: 1,\n            UpsellDismissed: 0,\n            EducationImpressionLimit: 2,\n            EducationImpressions: 0\n        },8,],[\"InitialMultichatList\",[],{\n        },132,],[\"BlackbirdUpsellTemplates\",[\"m_0_3y\",\"m_0_3z\",\"m_0_40\",\"m_0_41\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_3y\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_3z\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_40\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_41\"\n            }\n        },10,],[\"ChatConfigInitialData\",[],{\n            warning_countdown_threshold_msec: 15000,\n            \"24h_times\": false,\n            livebar_fetch_defer: 1000,\n            \"video.collision_connect\": 1,\n            \"ordered_list.top_mobile\": 5,\n            mute_warning_time_msec: 25000,\n            \"blackbird.min_for_clear_button\": 10,\n            chat_multi_typ_send: 1,\n            web_messenger_suppress_tab_unread: 1,\n            \"ordered_list.top_friends\": 0,\n            chat_impression_logging_with_click: true,\n            channel_manual_reconnect_defer_msec: 2000,\n            \"sidebar.minimum_width\": 1225,\n            \"sound.notif_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yq/r/Mpd0-fRgh5n.mp3\",\n            \"roger.seen_delay\": 15000,\n            tab_max_load_age: 86400000,\n            typing_notifications: true,\n            show_sticker_nux: true,\n            chat_web_ranking_with_presence: 1,\n            chat_ranked_by_coefficient: 1,\n            \"video.skype_client_log\": 1,\n            \"periodical_impression_logging_config.interval\": 1800000,\n            chat_tab_title_link_timeline: 1,\n            max_sidebar_multichats: 3,\n            tab_auto_close_timeout: 86400000,\n            chat_impression_logging_periodical: true,\n            divebar_has_new_groups_button: true,\n            sound_enabled: true,\n            \"sound.ringtone_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/y3/r/mbcn6dBHIeX.ogg\",\n            sidebar_ticker: 1\n        },12,],[\"AvailableListInitialData\",[],{\n            chatNotif: 0,\n            pollInterval: 100000,\n            availableList: {\n            },\n            lazyPollInterval: 300000,\n            favoriteList: [],\n            mobileFriends: null,\n            lazyThreshold: 300000,\n            availableCount: 0,\n            lastActiveTimes: null,\n            updateTime: 1373491943000\n        },166,],],\n        elements: [[\"m_0_3f\",\"u_0_21\",2,],[\"m_0_3j\",\"u_0_22\",2,],[\"m_0_3m\",\"u_0_23\",2,],[\"m_0_3n\",\"u_0_24\",2,],[\"m_0_3l\",\"u_0_25\",4,],[\"m_0_3p\",\"u_0_26\",2,],[\"m_0_3t\",\"u_0_28\",2,],[\"m_0_44\",\"u_0_2a\",2,\"m_0_43\",],[\"m_0_46\",\"u_0_2b\",2,\"m_0_45\",],[\"m_0_48\",\"u_0_2c\",2,\"m_0_47\",],],\n        markup: [[\"m_0_3s\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_27\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_3w\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_3x\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_42\",{\n            __html: \"\\u003Cdiv class=\\\"pam -cx-PRIVATE-blackbirdUpsell__dialogframe\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_29\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_29\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"prs\\\" data-jsid=\\\"dialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_43\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=offline&amp;promo_source=educate\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2a\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E You can turn on chat for just a few friends. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003Cdiv class=\\\"-cx-PRIVATE-blackbirdUpsell__buttoncontainer\\\"\\u003E\\u003Ca class=\\\"mvm -cx-PRIVATE-blackbirdUpsell__chatsettingsbutton uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" ajaxify=\\\"/ajax/chat/privacy/settings_dialog.php\\\" rel=\\\"dialog\\\" data-jsid=\\\"chatSettingsButton\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EEdit Chat Settings\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n        },3,],[\"m_0_45\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2b\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E While you have chat turned off for some friends, their messages go to your inbox. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_47\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2c\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E When chat is off, messages from friends go to your inbox for you to read later. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"cy4a0\",\"0duP3\",],\n    bootloadable: {\n        SortableGroup: {\n            resources: [\"AyUu6\",\"6tAwh\",\"AsDOA\",],\n            \"module\": true\n        },\n        LitestandSidebarBookmarksDisplay: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"b7cJk\",],\n            \"module\": true\n        },\n        LitestandSidebar: {\n            resources: [\"AyUu6\",\"fvNhh\",\"u//Ut\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/Oe0OO6kzRjj.js\"\n        },\n        \"H+v1W\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/LUiDH5-xN0p.js\"\n        },\n        fvNhh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/5jg9lcQx50S.js\"\n        },\n        b7cJk: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/S1VZtHRb9th.js\"\n        }\n    },\n    ixData: {\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"OJTM4\",\"u//Ut\",\"EzMPG\",\"brbS1\",\"H+v1W\",],\n    id: \"pagelet_sidebar\",\n    phase: 3\n});");
// 1599
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_16_right\",\n    is_last: true,\n    is_second_to_last_phase: true,\n    content: {\n        pagelet_timeline_recent_segment_0_0_right: {\n            container_id: \"u_0_2o\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"markSectionAsLoaded\",[],[\"u_0_17\",\"recent\",\"0\",],],[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_16\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"RaYA1\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n        RaYA1: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/goB7ZlK-k18.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent_segment_0_0_right\",\n    phase: 3\n});");
// 1600
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sfbbc0c552bee23a4ea73f61fbcd70bf043607ba2");
// 1601
geval("bigPipe.onPageletArrive({\n    append: \"u_0_16_right\",\n    is_last: true,\n    is_second_to_last_phase: true,\n    JSBNG__content: {\n        pagelet_timeline_recent_segment_0_0_right: {\n            container_id: \"u_0_2o\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"markSectionAsLoaded\",[],[\"u_0_17\",\"recent\",\"0\",],],[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_16\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"RaYA1\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n        RaYA1: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/goB7ZlK-k18.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent_segment_0_0_right\",\n    phase: 3\n});");
// 1608
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_side_ads: {\n            container_id: \"u_0_2q\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineSideAds\",\"init\",[\"m_0_49\",],[{\n            __m: \"m_0_49\"\n        },1055580469,{\n            refresh_delay: 5000,\n            refresh_threshold: 30000,\n            mouse_move: 1,\n            max_ads: 5\n        },],],],\n        elements: [[\"m_0_49\",\"u_0_2p\",2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_side_ads\",\n    phase: 4\n});");
// 1609
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s17fb036b8ab6ee660914ea3ec7d66f80ef844863");
// 1610
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_side_ads: {\n            container_id: \"u_0_2q\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineSideAds\",\"init\",[\"m_0_49\",],[{\n            __m: \"m_0_49\"\n        },1055580469,{\n            refresh_delay: 5000,\n            refresh_threshold: 30000,\n            mouse_move: 1,\n            max_ads: 5\n        },],],],\n        elements: [[\"m_0_49\",\"u_0_2p\",2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_side_ads\",\n    phase: 4\n});");
// 1617
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_dock: {\n            container_id: \"u_0_3f\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_4a\",],[{\n            __m: \"m_0_4a\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_4b\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_4b\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_4c\",\"m_0_4d\",],[{\n            __m: \"m_0_4c\"\n        },{\n            __m: \"m_0_4d\"\n        },{\n            payload_source: \"server_initial_data\"\n        },],],[\"ChatOptions\",],[\"ShortProfiles\",\"setMulti\",[],[{\n            100006118350059: {\n                id: \"100006118350059\",\n                name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null,\n                showVideoPromo: false,\n                searchTokens: [\"Cript\",\"Javasee\",]\n            }\n        },],],[\"m_0_4f\",],[\"m_0_4h\",],[\"Typeahead\",\"init\",[\"m_0_4i\",\"m_0_4h\",],[{\n            __m: \"m_0_4i\"\n        },{\n            __m: \"m_0_4h\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_4h\",\"m_0_4k\",],[{\n            __m: \"m_0_4h\"\n        },{\n            __m: \"m_0_4k\"\n        },],],[\"m_0_4n\",],[\"m_0_4o\",],[\"Layer\",\"init\",[\"m_0_4o\",\"m_0_4p\",],[{\n            __m: \"m_0_4o\"\n        },{\n            __m: \"m_0_4p\"\n        },],],[\"m_0_4g\",],[\"m_0_6v\",],[\"Typeahead\",\"init\",[\"m_0_6t\",\"m_0_6v\",],[{\n            __m: \"m_0_6t\"\n        },{\n            __m: \"m_0_6v\"\n        },[],null,],],],\n        instances: [[\"m_0_4f\",[\"BuddyListNub\",\"m_0_4e\",\"m_0_4g\",\"m_0_4h\",],[{\n            __m: \"m_0_4e\"\n        },{\n            __m: \"m_0_4g\"\n        },{\n            __m: \"m_0_4h\"\n        },],1,],[\"m_0_4h\",[\"Typeahead\",\"m_0_4l\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_4i\",\"ChatTypeaheadCore\",\"m_0_4j\",],[{\n            __m: \"m_0_4l\"\n        },{\n            node_id: \"u_0_2u\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_4i\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_4j\"\n        },],7,],[\"m_0_4n\",[\"ChatSidebarDropdown\",\"m_0_4m\",],[{\n            __m: \"m_0_4m\"\n        },null,],1,],[\"m_0_4o\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_4g\",[\"ChatOrderedList\",\"m_0_4q\",\"m_0_4r\",\"m_0_4s\",\"m_0_4o\",],[false,{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4r\"\n        },{\n            __m: \"m_0_4s\"\n        },{\n            __m: \"m_0_4o\"\n        },null,],3,],[\"m_0_4l\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_4r\",[\"XHPTemplate\",\"m_0_4t\",],[{\n            __m: \"m_0_4t\"\n        },],2,],[\"m_0_4s\",[\"XHPTemplate\",\"m_0_4u\",],[{\n            __m: \"m_0_4u\"\n        },],2,],[\"m_0_4v\",[\"XHPTemplate\",\"m_0_60\",],[{\n            __m: \"m_0_60\"\n        },],2,],[\"m_0_4w\",[\"XHPTemplate\",\"m_0_61\",],[{\n            __m: \"m_0_61\"\n        },],2,],[\"m_0_4x\",[\"XHPTemplate\",\"m_0_62\",],[{\n            __m: \"m_0_62\"\n        },],2,],[\"m_0_4y\",[\"XHPTemplate\",\"m_0_63\",],[{\n            __m: \"m_0_63\"\n        },],2,],[\"m_0_4z\",[\"XHPTemplate\",\"m_0_64\",],[{\n            __m: \"m_0_64\"\n        },],2,],[\"m_0_50\",[\"XHPTemplate\",\"m_0_65\",],[{\n            __m: \"m_0_65\"\n        },],2,],[\"m_0_51\",[\"XHPTemplate\",\"m_0_66\",],[{\n            __m: \"m_0_66\"\n        },],2,],[\"m_0_52\",[\"XHPTemplate\",\"m_0_67\",],[{\n            __m: \"m_0_67\"\n        },],2,],[\"m_0_53\",[\"XHPTemplate\",\"m_0_68\",],[{\n            __m: \"m_0_68\"\n        },],2,],[\"m_0_54\",[\"XHPTemplate\",\"m_0_69\",],[{\n            __m: \"m_0_69\"\n        },],2,],[\"m_0_55\",[\"XHPTemplate\",\"m_0_6a\",],[{\n            __m: \"m_0_6a\"\n        },],2,],[\"m_0_56\",[\"DataSource\",],[{\n            maxResults: 5,\n            queryData: [],\n            bootstrapData: {\n                viewer: 100006118350059,\n                token: \"1372173655-7\",\n                filter: [\"user\",],\n                options: [\"friends_only\",]\n            },\n            bootstrapEndpoint: \"/ajax/typeahead/first_degree.php\"\n        },],2,],[\"m_0_57\",[\"XHPTemplate\",\"m_0_6b\",],[{\n            __m: \"m_0_6b\"\n        },],2,],[\"m_0_58\",[\"XHPTemplate\",\"m_0_6c\",],[{\n            __m: \"m_0_6c\"\n        },],2,],[\"m_0_59\",[\"XHPTemplate\",\"m_0_6d\",],[{\n            __m: \"m_0_6d\"\n        },],2,],[\"m_0_5a\",[\"XHPTemplate\",\"m_0_6e\",],[{\n            __m: \"m_0_6e\"\n        },],2,],[\"m_0_5b\",[\"XHPTemplate\",\"m_0_6f\",],[{\n            __m: \"m_0_6f\"\n        },],2,],[\"m_0_5c\",[\"XHPTemplate\",\"m_0_6g\",],[{\n            __m: \"m_0_6g\"\n        },],2,],[\"m_0_5d\",[\"XHPTemplate\",\"m_0_6h\",],[{\n            __m: \"m_0_6h\"\n        },],2,],[\"m_0_5e\",[\"XHPTemplate\",\"m_0_6i\",],[{\n            __m: \"m_0_6i\"\n        },],2,],[\"m_0_5f\",[\"XHPTemplate\",\"m_0_6j\",],[{\n            __m: \"m_0_6j\"\n        },],2,],[\"m_0_5g\",[\"XHPTemplate\",\"m_0_6k\",],[{\n            __m: \"m_0_6k\"\n        },],2,],[\"m_0_5h\",[\"XHPTemplate\",\"m_0_6l\",],[{\n            __m: \"m_0_6l\"\n        },],2,],[\"m_0_5i\",[\"XHPTemplate\",\"m_0_6m\",],[{\n            __m: \"m_0_6m\"\n        },],2,],[\"m_0_5j\",[\"XHPTemplate\",\"m_0_6n\",],[{\n            __m: \"m_0_6n\"\n        },],2,],[\"m_0_5k\",[\"XHPTemplate\",\"m_0_6o\",],[{\n            __m: \"m_0_6o\"\n        },],2,],[\"m_0_5l\",[\"XHPTemplate\",\"m_0_6p\",],[{\n            __m: \"m_0_6p\"\n        },],2,],[\"m_0_6v\",[\"Typeahead\",\"m_0_6w\",\"ContextualTypeaheadView\",\"m_0_6t\",\"TypeaheadCore\",\"m_0_6u\",],[{\n            __m: \"m_0_6w\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_6t\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"TypeaheadCore\"\n            },\n            options: []\n        },{\n            __m: \"m_0_6u\"\n        },],3,],[\"m_0_5m\",[\"XHPTemplate\",\"m_0_6s\",],[{\n            __m: \"m_0_6s\"\n        },],2,],[\"m_0_5n\",[\"XHPTemplate\",\"m_0_6x\",],[{\n            __m: \"m_0_6x\"\n        },],2,],[\"m_0_5o\",[\"XHPTemplate\",\"m_0_6y\",],[{\n            __m: \"m_0_6y\"\n        },],2,],[\"m_0_5p\",[\"XHPTemplate\",\"m_0_6z\",],[{\n            __m: \"m_0_6z\"\n        },],2,],[\"m_0_5q\",[\"XHPTemplate\",\"m_0_70\",],[{\n            __m: \"m_0_70\"\n        },],2,],[\"m_0_5r\",[\"XHPTemplate\",\"m_0_71\",],[{\n            __m: \"m_0_71\"\n        },],2,],[\"m_0_5s\",[\"XHPTemplate\",\"m_0_72\",],[{\n            __m: \"m_0_72\"\n        },],2,],[\"m_0_5t\",[\"XHPTemplate\",\"m_0_73\",],[{\n            __m: \"m_0_73\"\n        },],2,],[\"m_0_5u\",[\"XHPTemplate\",\"m_0_74\",],[{\n            __m: \"m_0_74\"\n        },],2,],[\"m_0_5v\",[\"XHPTemplate\",\"m_0_77\",],[{\n            __m: \"m_0_77\"\n        },],2,],[\"m_0_5w\",[\"XHPTemplate\",\"m_0_78\",],[{\n            __m: \"m_0_78\"\n        },],2,],[\"m_0_5x\",[\"XHPTemplate\",\"m_0_79\",],[{\n            __m: \"m_0_79\"\n        },],2,],[\"m_0_5y\",[\"XHPTemplate\",\"m_0_7a\",],[{\n            __m: \"m_0_7a\"\n        },],2,],[\"m_0_5z\",[\"XHPTemplate\",\"m_0_7b\",],[{\n            __m: \"m_0_7b\"\n        },],2,],[\"m_0_6w\",[\"DataSource\",],[[],],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: true,\n            render_verification_rate: 1000\n        },27,],[\"MercurySheetTemplates\",[\"m_0_4v\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_4v\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_4w\",\"m_0_4x\",\"m_0_4y\",\"m_0_4z\",\"m_0_50\",\"m_0_51\",\"m_0_52\",\"m_0_53\",\"m_0_54\",\"m_0_55\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_4w\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_4x\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_4y\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_4z\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_50\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_51\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_52\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_53\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_54\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_55\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_56\",],{\n            source: {\n                __m: \"m_0_56\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                name: \"Meep\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                name: \"Pusheen\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                name: \"Emoticons\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],[\"ChatTabTemplates\",[\"m_0_57\",\"m_0_58\",\"m_0_59\",\"m_0_5a\",\"m_0_5b\",\"m_0_5c\",\"m_0_5d\",\"m_0_5e\",\"m_0_5f\",\"m_0_5g\",\"m_0_5h\",\"m_0_5i\",\"m_0_5j\",\"m_0_5k\",\"m_0_5l\",\"m_0_5m\",\"m_0_5n\",\"m_0_5o\",\"m_0_5p\",\"m_0_5q\",\"m_0_5r\",\"m_0_5s\",\"m_0_5t\",\"m_0_5u\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_57\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_58\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_59\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_5a\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_5b\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_5c\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_5d\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_5e\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_5f\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_5g\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_5h\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_5i\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_5j\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_5k\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_5l\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_5m\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_5n\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_5o\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_5p\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_5q\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_5r\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_5s\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_5t\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_5u\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_5v\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_5v\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_5w\",\"m_0_5x\",\"m_0_5y\",\"m_0_5z\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_5w\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_5x\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_5y\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_5z\"\n            }\n        },43,],],\n        elements: [[\"m_0_4a\",\"u_0_2r\",2,],[\"m_0_4c\",\"u_0_2s\",2,],[\"m_0_4d\",\"u_0_2t\",2,],[\"m_0_4e\",\"fbDockChatBuddylistNub\",2,],[\"m_0_4j\",\"u_0_2v\",2,],[\"m_0_4k\",\"u_0_2w\",2,],[\"m_0_4i\",\"u_0_2x\",4,],[\"m_0_4m\",\"u_0_2y\",2,],[\"m_0_4q\",\"u_0_30\",2,],[\"m_0_4b\",\"u_0_31\",2,],[\"m_0_6r\",\"u_0_36\",2,\"m_0_6p\",],[\"m_0_6q\",\"u_0_37\",2,\"m_0_6p\",],[\"m_0_6u\",\"u_0_38\",2,\"m_0_6s\",],[\"m_0_6t\",\"u_0_39\",4,\"m_0_6s\",],[\"m_0_76\",\"u_0_3d\",2,\"m_0_74\",],[\"m_0_75\",\"u_0_3e\",2,\"m_0_74\",],],\n        markup: [[\"m_0_4p\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_2z\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4t\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_4u\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_60\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem -cx-PRIVATE-fbMercuryTabSheet__loading img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_61\",{\n            __html: \"\\u003Cdiv class=\\\"mtm pam -cx-PRIVATE-mercuryAttachments__errorbox attachment uiBoxGray\\\"\\u003E\\u003Cspan class=\\\"uiIconText MercuryThreadlistIconError\\\" data-jsid=\\\"error\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_25310e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_62\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" /\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_63\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_64\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Cdiv class=\\\"clearfix MercuryExternalLink\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem lfloat\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"MercuryLinkRight rfloat\\\"\\u003E\\u003Cdiv class=\\\"MercuryLinkTitle\\\"\\u003E\\u003Ca class=\\\"linkTitle\\\" target=\\\"_blank\\\" href=\\\"#\\\" data-jsid=\\\"name\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\" data-jsid=\\\"shortLink\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_65\",{\n            __html: \"\\u003Cdiv class=\\\"musicAttachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\" data-jsid=\\\"icon_link\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_66\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_67\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_68\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca data-jsid=\\\"link\\\" target=\\\"_blank\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cspan data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_69\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__composersupplemental -cx-PRIVATE-mercuryComposer__uploadfilerow uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryComposer__uploadingindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"-cx-PRIVATE-mercuryComposer__closefileupload uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_32\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_32\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__uploadfiletext\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" data-jsid=\\\"iconText\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6a\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__filelinks\\\"\\u003E\\u003Cdiv data-jsid=\\\"openLinkContainer\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__openlinkcontainer hidden_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__openfilelink\\\" href=\\\"#\\\" data-jsid=\\\"openFile\\\" role=\\\"button\\\"\\u003Eopen\\u003C/a\\u003E \\u00b7 \\u003C/div\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__downloadfilelink\\\" href=\\\"#\\\" data-jsid=\\\"downloadFile\\\" role=\\\"button\\\"\\u003Edownload\\u003C/a\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\" data-jsid=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6b\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PUBLIC-fbChatEventMsg__root clearfix\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__iconwrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChatEventMsg__eventicon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"icon\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__messagewrapper\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatEventMsg__message fsm fcg\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"mls -cx-PRIVATE-fbChatEventMsg__timestamp fss fcg\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatEventMsg__logmessageattachment\\\" data-jsid=\\\"attachment\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6c\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PRIVATE-fbChatMessageGroup__root clearfix small\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__piccontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__profilename\\\" data-jsid=\\\"profileName\\\"\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"profileLink\\\" href=\\\"#\\\" data-jsid=\\\"profileLink\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"profilePhoto\\\" src=\\\"/images/spacer.gif\\\" data-jsid=\\\"profilePhoto\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"messages\\\" data-jsid=\\\"messages\\\"\\u003E\\u003Cdiv class=\\\"metaInfoContainer fss fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"reportLinkWithDot\\\" class=\\\"hidden_elem\\\"\\u003E\\u003Ca href=\\\"#\\\" rel=\\\"dialog\\\" data-jsid=\\\"reportLink\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003EReport\\u003C/span\\u003E\\u003C/a\\u003E \\u00b7 \\u003C/span\\u003E\\u003Cspan class=\\\"timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6d\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__undertext fwb fcg\\\" data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6e\",{\n            __html: \"\\u003Cli class=\\\"uiMenuItem -cx-PRIVATE-fbChatTabSelector__item\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_33\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_33\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatTabSelector__itemcontent\\\"\\u003E\\u003Cspan class=\\\"unreadCount\\\" data-jsid=\\\"unreadCount\\\"\\u003E\\u003C/span\\u003E\\u003Cspan data-jsid=\\\"content\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6f\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-fbChatMessage__forwardicon\\\" href=\\\"#\\\" style=\\\"padding-left: 12px;\\\" data-jsid=\\\"forwardLink\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_8448dd\\\" style=\\\"top: 3px;\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"forwardText\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6g\",{\n            __html: \"\\u003Cdiv class=\\\"uiToggle -cx-PRIVATE-fbNub__root fbNub -cx-PRIVATE-fbChatTabSelector__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"messagesIcon img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"numTabs\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatTabSelector__nummessages\\\" data-jsid=\\\"numMessages\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout uiToggleFlyout noTitlebar\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu\\\" data-jsid=\\\"menu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Dummy\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E Dummy \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6h\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix mvs\\\"\\u003E\\u003Ci class=\\\"rfloat img sp_9kaae3 sx_1dc182\\\" data-jsid=\\\"icon\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6i\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatConvDateBreak__root mhs mbs fbChatConvItem\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatConvDateBreak__date fss fwb fcg\\\" data-jsid=\\\"date\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6j\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETalk face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EOkay\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6k\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6l\",{\n            __html: \"\\u003Ca href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_6m\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-chatTabSheet__sheetimg img sp_4p6kmz sx_c2c2e3\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent\\\"\\u003E\\u003Cspan class=\\\"fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv\\u003E\\u003Ca href=\\\"#\\\" data-jsid=\\\"actionLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6n\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6o\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriendsEmptyTab__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__to\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003ETo:\\u003C/span\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__typeahead\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6p\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatThreadTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_34\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_36\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Edit Conversation Name\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"nameConversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EEdit Conversation Name\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Leave Conversation...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unsubscribeLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ELeave Conversation...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_34\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_35\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_35\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_37\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg -cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_6s\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatNameConversation__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatNameConversation__inputcontainer\\\"\\u003E\\u003Cdiv class=\\\"uiTypeahead\\\" id=\\\"u_0_38\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput DOMControl_placeholder\\\" data-jsid=\\\"nameInput\\\" placeholder=\\\"Name this group\\\" autocomplete=\\\"off\\\" aria-autocomplete=\\\"list\\\" aria-expanded=\\\"false\\\" aria-owns=\\\"typeahead_list_u_0_38\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this group\\\" aria-label=\\\"Name this group\\\" id=\\\"u_0_39\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root selected -cx-PRIVATE-uiButton__confirm\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\"\\u003EDone\\u003C/button\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_6x\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__root fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6y\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETry talking face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EClose\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6z\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriends__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriends__typeaheadcontainer\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Clabel class=\\\"doneButton uiButton uiButtonConfirm\\\" for=\\\"u_0_3a\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_3a\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_70\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__errorstatus clearfix\\\"\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_71\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent -cx-PRIVATE-chatTabSheet__link fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Ca class=\\\"pas\\\" data-jsid=\\\"unmuteButton\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003EUnmute\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_72\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typingcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typing\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_73\",{\n            __html: \"\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\"\n        },2,],[\"m_0_74\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatUserTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_3b\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Start a video call\\\" class=\\\"videoicon button\\\" href=\\\"#\\\" data-jsid=\\\"videoCallLink\\\" data-gt=\\\"&#123;&quot;videochat&quot;:&quot;call_clicked_chat_tab&quot;&#125;\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" tabindex=\\\"0\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3d\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"privacyLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Clear Window\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"clearWindowLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EClear Window\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Report as Spam or Abuse...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"reportSpamLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EReport as Spam or Abuse...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_3b\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_3c\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_3c\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3e\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg -cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_77\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cimg class=\\\"mrm -cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__iconimage -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" alt=\\\"\\\" data-jsid=\\\"profilePhoto\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiImageBlockDeprecated__iconcontent -cx-PRIVATE-uiImageBlockDeprecated__content\\\"\\u003E\\u003Cdiv class=\\\"mbs fsl fwb fcb\\\" data-jsid=\\\"mainText\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"aux-message fcg\\\" data-jsid=\\\"auxMessage\\\"\\u003EVideo will start as soon as you answer.\\u003C/div\\u003E\\u003Cdiv class=\\\"mts hidden_elem fcg\\\" data-jsid=\\\"slowMessage\\\"\\u003E\\u003Cspan class=\\\"fwb fcb\\\"\\u003EHaving trouble?\\u003C/span\\u003E Your connection may be \\u003Ca href=\\\"/help/214265948627885\\\" target=\\\"_blank\\\"\\u003Etoo slow\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_78\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix uiTokenizer uiInlineTokenizer\\\"\\u003E\\u003Cdiv class=\\\"tokenarea hidden_elem\\\" data-jsid=\\\"tokenarea\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_79\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__header\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryTypeahead__loadingspinner img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingSpinner\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryTypeahead__link\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_7a\",{\n            __html: \"\\u003Cdiv class=\\\"uiTypeahead\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput\\\" data-jsid=\\\"textfield\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7b\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__row\\\"\\u003E\\u003Cdiv class=\\\"clearfix pvs\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage mrm -cx-PRIVATE-mercuryTypeahead__image lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__rightcontent\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryTypeahead__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__snippet fsm fwn fcg\\\" data-jsid=\\\"snippet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"cy4a0\",],\n    bootloadable: {\n        \"legacy:control-textarea\": {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",\"c1+nc\",]\n        },\n        VideoCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"OJTM4\",\"u//Ut\",\"brbS1\",\"EzMPG\",\"gMfWI\",\"bUzfU\",\"KPLqg\",],\n            \"module\": true\n        },\n        ErrorDialog: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        },\n        FBRTCCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"brbS1\",\"u//Ut\",\"OJTM4\",\"EzMPG\",\"gMfWI\",\"a3inZ\",\"KPLqg\",\"bUzfU\",\"LTaK/\",\"21lHn\",\"+h1d2\",\"9aS3c\",\"MfG6c\",\"LsRx/\",\"3h2ll\",\"Mzbs2\",\"wGXi/\",\"d6Evh\",\"6WF8S\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"9aS3c\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yn/r/-a3R_-jnsnr.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"4qhP/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/sgOGIt3qmqS.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"c1+nc\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/EQeZaXWiup5.js\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/895-sItSveZ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/QylH5JvJ2tZ.js\"\n        }\n    },\n    ixData: {\n        \"/images/messaging/stickers/selector/leftarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/lM_ryP3lE-X.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/messaging/stickers/selector/rightarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/jopyzHwsKtN.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        },\n        \"/images/messaging/stickers/selector/store.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/WG0aM70e5Iq.png\",\n            width: 20,\n            height: 20\n        }\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"H+v1W\",\"LpC/l\",\"brbS1\",\"u//Ut\",\"EzMPG\",],\n    id: \"pagelet_dock\",\n    phase: 4\n});");
// 1618
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s17993ba4dcd505b7fa47738c6474e2ea6745cd86");
// 1619
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_dock: {\n            container_id: \"u_0_3f\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_4a\",],[{\n            __m: \"m_0_4a\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_4b\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_4b\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_4c\",\"m_0_4d\",],[{\n            __m: \"m_0_4c\"\n        },{\n            __m: \"m_0_4d\"\n        },{\n            payload_source: \"server_initial_data\"\n        },],],[\"ChatOptions\",],[\"ShortProfiles\",\"setMulti\",[],[{\n            100006118350059: {\n                id: \"100006118350059\",\n                JSBNG__name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null,\n                showVideoPromo: false,\n                searchTokens: [\"Cript\",\"Javasee\",]\n            }\n        },],],[\"m_0_4f\",],[\"m_0_4h\",],[\"Typeahead\",\"init\",[\"m_0_4i\",\"m_0_4h\",],[{\n            __m: \"m_0_4i\"\n        },{\n            __m: \"m_0_4h\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_4h\",\"m_0_4k\",],[{\n            __m: \"m_0_4h\"\n        },{\n            __m: \"m_0_4k\"\n        },],],[\"m_0_4n\",],[\"m_0_4o\",],[\"Layer\",\"init\",[\"m_0_4o\",\"m_0_4p\",],[{\n            __m: \"m_0_4o\"\n        },{\n            __m: \"m_0_4p\"\n        },],],[\"m_0_4g\",],[\"m_0_6v\",],[\"Typeahead\",\"init\",[\"m_0_6t\",\"m_0_6v\",],[{\n            __m: \"m_0_6t\"\n        },{\n            __m: \"m_0_6v\"\n        },[],null,],],],\n        instances: [[\"m_0_4f\",[\"BuddyListNub\",\"m_0_4e\",\"m_0_4g\",\"m_0_4h\",],[{\n            __m: \"m_0_4e\"\n        },{\n            __m: \"m_0_4g\"\n        },{\n            __m: \"m_0_4h\"\n        },],1,],[\"m_0_4h\",[\"Typeahead\",\"m_0_4l\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_4i\",\"ChatTypeaheadCore\",\"m_0_4j\",],[{\n            __m: \"m_0_4l\"\n        },{\n            node_id: \"u_0_2u\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_4i\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_4j\"\n        },],7,],[\"m_0_4n\",[\"ChatSidebarDropdown\",\"m_0_4m\",],[{\n            __m: \"m_0_4m\"\n        },null,],1,],[\"m_0_4o\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_4g\",[\"ChatOrderedList\",\"m_0_4q\",\"m_0_4r\",\"m_0_4s\",\"m_0_4o\",],[false,{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4r\"\n        },{\n            __m: \"m_0_4s\"\n        },{\n            __m: \"m_0_4o\"\n        },null,],3,],[\"m_0_4l\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_4r\",[\"XHPTemplate\",\"m_0_4t\",],[{\n            __m: \"m_0_4t\"\n        },],2,],[\"m_0_4s\",[\"XHPTemplate\",\"m_0_4u\",],[{\n            __m: \"m_0_4u\"\n        },],2,],[\"m_0_4v\",[\"XHPTemplate\",\"m_0_60\",],[{\n            __m: \"m_0_60\"\n        },],2,],[\"m_0_4w\",[\"XHPTemplate\",\"m_0_61\",],[{\n            __m: \"m_0_61\"\n        },],2,],[\"m_0_4x\",[\"XHPTemplate\",\"m_0_62\",],[{\n            __m: \"m_0_62\"\n        },],2,],[\"m_0_4y\",[\"XHPTemplate\",\"m_0_63\",],[{\n            __m: \"m_0_63\"\n        },],2,],[\"m_0_4z\",[\"XHPTemplate\",\"m_0_64\",],[{\n            __m: \"m_0_64\"\n        },],2,],[\"m_0_50\",[\"XHPTemplate\",\"m_0_65\",],[{\n            __m: \"m_0_65\"\n        },],2,],[\"m_0_51\",[\"XHPTemplate\",\"m_0_66\",],[{\n            __m: \"m_0_66\"\n        },],2,],[\"m_0_52\",[\"XHPTemplate\",\"m_0_67\",],[{\n            __m: \"m_0_67\"\n        },],2,],[\"m_0_53\",[\"XHPTemplate\",\"m_0_68\",],[{\n            __m: \"m_0_68\"\n        },],2,],[\"m_0_54\",[\"XHPTemplate\",\"m_0_69\",],[{\n            __m: \"m_0_69\"\n        },],2,],[\"m_0_55\",[\"XHPTemplate\",\"m_0_6a\",],[{\n            __m: \"m_0_6a\"\n        },],2,],[\"m_0_56\",[\"DataSource\",],[{\n            maxResults: 5,\n            queryData: [],\n            bootstrapData: {\n                viewer: 100006118350059,\n                token: \"1372173655-7\",\n                filter: [\"user\",],\n                options: [\"friends_only\",]\n            },\n            bootstrapEndpoint: \"/ajax/typeahead/first_degree.php\"\n        },],2,],[\"m_0_57\",[\"XHPTemplate\",\"m_0_6b\",],[{\n            __m: \"m_0_6b\"\n        },],2,],[\"m_0_58\",[\"XHPTemplate\",\"m_0_6c\",],[{\n            __m: \"m_0_6c\"\n        },],2,],[\"m_0_59\",[\"XHPTemplate\",\"m_0_6d\",],[{\n            __m: \"m_0_6d\"\n        },],2,],[\"m_0_5a\",[\"XHPTemplate\",\"m_0_6e\",],[{\n            __m: \"m_0_6e\"\n        },],2,],[\"m_0_5b\",[\"XHPTemplate\",\"m_0_6f\",],[{\n            __m: \"m_0_6f\"\n        },],2,],[\"m_0_5c\",[\"XHPTemplate\",\"m_0_6g\",],[{\n            __m: \"m_0_6g\"\n        },],2,],[\"m_0_5d\",[\"XHPTemplate\",\"m_0_6h\",],[{\n            __m: \"m_0_6h\"\n        },],2,],[\"m_0_5e\",[\"XHPTemplate\",\"m_0_6i\",],[{\n            __m: \"m_0_6i\"\n        },],2,],[\"m_0_5f\",[\"XHPTemplate\",\"m_0_6j\",],[{\n            __m: \"m_0_6j\"\n        },],2,],[\"m_0_5g\",[\"XHPTemplate\",\"m_0_6k\",],[{\n            __m: \"m_0_6k\"\n        },],2,],[\"m_0_5h\",[\"XHPTemplate\",\"m_0_6l\",],[{\n            __m: \"m_0_6l\"\n        },],2,],[\"m_0_5i\",[\"XHPTemplate\",\"m_0_6m\",],[{\n            __m: \"m_0_6m\"\n        },],2,],[\"m_0_5j\",[\"XHPTemplate\",\"m_0_6n\",],[{\n            __m: \"m_0_6n\"\n        },],2,],[\"m_0_5k\",[\"XHPTemplate\",\"m_0_6o\",],[{\n            __m: \"m_0_6o\"\n        },],2,],[\"m_0_5l\",[\"XHPTemplate\",\"m_0_6p\",],[{\n            __m: \"m_0_6p\"\n        },],2,],[\"m_0_6v\",[\"Typeahead\",\"m_0_6w\",\"ContextualTypeaheadView\",\"m_0_6t\",\"TypeaheadCore\",\"m_0_6u\",],[{\n            __m: \"m_0_6w\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_6t\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"TypeaheadCore\"\n            },\n            options: []\n        },{\n            __m: \"m_0_6u\"\n        },],3,],[\"m_0_5m\",[\"XHPTemplate\",\"m_0_6s\",],[{\n            __m: \"m_0_6s\"\n        },],2,],[\"m_0_5n\",[\"XHPTemplate\",\"m_0_6x\",],[{\n            __m: \"m_0_6x\"\n        },],2,],[\"m_0_5o\",[\"XHPTemplate\",\"m_0_6y\",],[{\n            __m: \"m_0_6y\"\n        },],2,],[\"m_0_5p\",[\"XHPTemplate\",\"m_0_6z\",],[{\n            __m: \"m_0_6z\"\n        },],2,],[\"m_0_5q\",[\"XHPTemplate\",\"m_0_70\",],[{\n            __m: \"m_0_70\"\n        },],2,],[\"m_0_5r\",[\"XHPTemplate\",\"m_0_71\",],[{\n            __m: \"m_0_71\"\n        },],2,],[\"m_0_5s\",[\"XHPTemplate\",\"m_0_72\",],[{\n            __m: \"m_0_72\"\n        },],2,],[\"m_0_5t\",[\"XHPTemplate\",\"m_0_73\",],[{\n            __m: \"m_0_73\"\n        },],2,],[\"m_0_5u\",[\"XHPTemplate\",\"m_0_74\",],[{\n            __m: \"m_0_74\"\n        },],2,],[\"m_0_5v\",[\"XHPTemplate\",\"m_0_77\",],[{\n            __m: \"m_0_77\"\n        },],2,],[\"m_0_5w\",[\"XHPTemplate\",\"m_0_78\",],[{\n            __m: \"m_0_78\"\n        },],2,],[\"m_0_5x\",[\"XHPTemplate\",\"m_0_79\",],[{\n            __m: \"m_0_79\"\n        },],2,],[\"m_0_5y\",[\"XHPTemplate\",\"m_0_7a\",],[{\n            __m: \"m_0_7a\"\n        },],2,],[\"m_0_5z\",[\"XHPTemplate\",\"m_0_7b\",],[{\n            __m: \"m_0_7b\"\n        },],2,],[\"m_0_6w\",[\"DataSource\",],[[],],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: true,\n            render_verification_rate: 1000\n        },27,],[\"MercurySheetTemplates\",[\"m_0_4v\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_4v\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_4w\",\"m_0_4x\",\"m_0_4y\",\"m_0_4z\",\"m_0_50\",\"m_0_51\",\"m_0_52\",\"m_0_53\",\"m_0_54\",\"m_0_55\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_4w\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_4x\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_4y\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_4z\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_50\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_51\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_52\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_53\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_54\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_55\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_56\",],{\n            source: {\n                __m: \"m_0_56\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                JSBNG__name: \"Meep\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                JSBNG__name: \"Pusheen\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                JSBNG__name: \"Emoticons\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],[\"ChatTabTemplates\",[\"m_0_57\",\"m_0_58\",\"m_0_59\",\"m_0_5a\",\"m_0_5b\",\"m_0_5c\",\"m_0_5d\",\"m_0_5e\",\"m_0_5f\",\"m_0_5g\",\"m_0_5h\",\"m_0_5i\",\"m_0_5j\",\"m_0_5k\",\"m_0_5l\",\"m_0_5m\",\"m_0_5n\",\"m_0_5o\",\"m_0_5p\",\"m_0_5q\",\"m_0_5r\",\"m_0_5s\",\"m_0_5t\",\"m_0_5u\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_57\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_58\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_59\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_5a\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_5b\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_5c\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_5d\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_5e\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_5f\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_5g\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_5h\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_5i\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_5j\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_5k\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_5l\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_5m\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_5n\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_5o\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_5p\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_5q\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_5r\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_5s\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_5t\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_5u\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_5v\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_5v\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_5w\",\"m_0_5x\",\"m_0_5y\",\"m_0_5z\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_5w\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_5x\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_5y\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_5z\"\n            }\n        },43,],],\n        elements: [[\"m_0_4a\",\"u_0_2r\",2,],[\"m_0_4c\",\"u_0_2s\",2,],[\"m_0_4d\",\"u_0_2t\",2,],[\"m_0_4e\",\"fbDockChatBuddylistNub\",2,],[\"m_0_4j\",\"u_0_2v\",2,],[\"m_0_4k\",\"u_0_2w\",2,],[\"m_0_4i\",\"u_0_2x\",4,],[\"m_0_4m\",\"u_0_2y\",2,],[\"m_0_4q\",\"u_0_30\",2,],[\"m_0_4b\",\"u_0_31\",2,],[\"m_0_6r\",\"u_0_36\",2,\"m_0_6p\",],[\"m_0_6q\",\"u_0_37\",2,\"m_0_6p\",],[\"m_0_6u\",\"u_0_38\",2,\"m_0_6s\",],[\"m_0_6t\",\"u_0_39\",4,\"m_0_6s\",],[\"m_0_76\",\"u_0_3d\",2,\"m_0_74\",],[\"m_0_75\",\"u_0_3e\",2,\"m_0_74\",],],\n        markup: [[\"m_0_4p\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_2z\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4t\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_4u\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_60\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem -cx-PRIVATE-fbMercuryTabSheet__loading img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_61\",{\n            __html: \"\\u003Cdiv class=\\\"mtm pam -cx-PRIVATE-mercuryAttachments__errorbox attachment uiBoxGray\\\"\\u003E\\u003Cspan class=\\\"uiIconText MercuryThreadlistIconError\\\" data-jsid=\\\"error\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_25310e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_62\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" /\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_63\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_64\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Cdiv class=\\\"clearfix MercuryExternalLink\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem lfloat\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"MercuryLinkRight rfloat\\\"\\u003E\\u003Cdiv class=\\\"MercuryLinkTitle\\\"\\u003E\\u003Ca class=\\\"linkTitle\\\" target=\\\"_blank\\\" href=\\\"#\\\" data-jsid=\\\"name\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\" data-jsid=\\\"shortLink\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_65\",{\n            __html: \"\\u003Cdiv class=\\\"musicAttachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\" data-jsid=\\\"icon_link\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_66\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_67\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_68\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca data-jsid=\\\"link\\\" target=\\\"_blank\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cspan data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_69\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__composersupplemental -cx-PRIVATE-mercuryComposer__uploadfilerow uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryComposer__uploadingindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"-cx-PRIVATE-mercuryComposer__closefileupload uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_32\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_32\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__uploadfiletext\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" data-jsid=\\\"iconText\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6a\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__filelinks\\\"\\u003E\\u003Cdiv data-jsid=\\\"openLinkContainer\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__openlinkcontainer hidden_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__openfilelink\\\" href=\\\"#\\\" data-jsid=\\\"openFile\\\" role=\\\"button\\\"\\u003Eopen\\u003C/a\\u003E \\u00b7 \\u003C/div\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__downloadfilelink\\\" href=\\\"#\\\" data-jsid=\\\"downloadFile\\\" role=\\\"button\\\"\\u003Edownload\\u003C/a\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\" data-jsid=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6b\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PUBLIC-fbChatEventMsg__root clearfix\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__iconwrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChatEventMsg__eventicon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"icon\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__messagewrapper\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatEventMsg__message fsm fcg\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"mls -cx-PRIVATE-fbChatEventMsg__timestamp fss fcg\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatEventMsg__logmessageattachment\\\" data-jsid=\\\"attachment\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6c\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PRIVATE-fbChatMessageGroup__root clearfix small\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__piccontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__profilename\\\" data-jsid=\\\"profileName\\\"\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"profileLink\\\" href=\\\"#\\\" data-jsid=\\\"profileLink\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"profilePhoto\\\" src=\\\"/images/spacer.gif\\\" data-jsid=\\\"profilePhoto\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"messages\\\" data-jsid=\\\"messages\\\"\\u003E\\u003Cdiv class=\\\"metaInfoContainer fss fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"reportLinkWithDot\\\" class=\\\"hidden_elem\\\"\\u003E\\u003Ca href=\\\"#\\\" rel=\\\"dialog\\\" data-jsid=\\\"reportLink\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003EReport\\u003C/span\\u003E\\u003C/a\\u003E \\u00b7 \\u003C/span\\u003E\\u003Cspan class=\\\"timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6d\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__undertext fwb fcg\\\" data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6e\",{\n            __html: \"\\u003Cli class=\\\"uiMenuItem -cx-PRIVATE-fbChatTabSelector__item\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_33\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_33\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatTabSelector__itemcontent\\\"\\u003E\\u003Cspan class=\\\"unreadCount\\\" data-jsid=\\\"unreadCount\\\"\\u003E\\u003C/span\\u003E\\u003Cspan data-jsid=\\\"content\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6f\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-fbChatMessage__forwardicon\\\" href=\\\"#\\\" style=\\\"padding-left: 12px;\\\" data-jsid=\\\"forwardLink\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_8448dd\\\" style=\\\"top: 3px;\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"forwardText\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6g\",{\n            __html: \"\\u003Cdiv class=\\\"uiToggle -cx-PRIVATE-fbNub__root fbNub -cx-PRIVATE-fbChatTabSelector__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"messagesIcon img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"numTabs\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatTabSelector__nummessages\\\" data-jsid=\\\"numMessages\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout uiToggleFlyout noTitlebar\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu\\\" data-jsid=\\\"menu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Dummy\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E Dummy \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6h\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix mvs\\\"\\u003E\\u003Ci class=\\\"rfloat img sp_9kaae3 sx_1dc182\\\" data-jsid=\\\"icon\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6i\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatConvDateBreak__root mhs mbs fbChatConvItem\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatConvDateBreak__date fss fwb fcg\\\" data-jsid=\\\"date\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6j\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETalk face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EOkay\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6k\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6l\",{\n            __html: \"\\u003Ca href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_6m\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-chatTabSheet__sheetimg img sp_4p6kmz sx_c2c2e3\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent\\\"\\u003E\\u003Cspan class=\\\"fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv\\u003E\\u003Ca href=\\\"#\\\" data-jsid=\\\"actionLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6n\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6o\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriendsEmptyTab__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__to\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003ETo:\\u003C/span\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__typeahead\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6p\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatThreadTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_34\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_36\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Edit Conversation Name\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"nameConversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EEdit Conversation Name\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Leave Conversation...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unsubscribeLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ELeave Conversation...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_34\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_35\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_35\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_37\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg -cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_6s\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatNameConversation__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatNameConversation__inputcontainer\\\"\\u003E\\u003Cdiv class=\\\"uiTypeahead\\\" id=\\\"u_0_38\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput DOMControl_placeholder\\\" data-jsid=\\\"nameInput\\\" placeholder=\\\"Name this group\\\" autocomplete=\\\"off\\\" aria-autocomplete=\\\"list\\\" aria-expanded=\\\"false\\\" aria-owns=\\\"typeahead_list_u_0_38\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this group\\\" aria-label=\\\"Name this group\\\" id=\\\"u_0_39\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root selected -cx-PRIVATE-uiButton__confirm\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\"\\u003EDone\\u003C/button\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_6x\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__root fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6y\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETry talking face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EClose\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6z\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriends__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriends__typeaheadcontainer\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Clabel class=\\\"doneButton uiButton uiButtonConfirm\\\" for=\\\"u_0_3a\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_3a\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_70\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__errorstatus clearfix\\\"\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_71\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent -cx-PRIVATE-chatTabSheet__link fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Ca class=\\\"pas\\\" data-jsid=\\\"unmuteButton\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003EUnmute\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_72\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typingcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typing\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_73\",{\n            __html: \"\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\"\n        },2,],[\"m_0_74\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatUserTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_3b\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Start a video call\\\" class=\\\"videoicon button\\\" href=\\\"#\\\" data-jsid=\\\"videoCallLink\\\" data-gt=\\\"&#123;&quot;videochat&quot;:&quot;call_clicked_chat_tab&quot;&#125;\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" tabindex=\\\"0\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3d\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"privacyLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Clear Window\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"clearWindowLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EClear Window\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Report as Spam or Abuse...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"reportSpamLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EReport as Spam or Abuse...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_3b\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_3c\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_3c\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3e\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg -cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_77\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cimg class=\\\"mrm -cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__iconimage -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" alt=\\\"\\\" data-jsid=\\\"profilePhoto\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiImageBlockDeprecated__iconcontent -cx-PRIVATE-uiImageBlockDeprecated__content\\\"\\u003E\\u003Cdiv class=\\\"mbs fsl fwb fcb\\\" data-jsid=\\\"mainText\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"aux-message fcg\\\" data-jsid=\\\"auxMessage\\\"\\u003EVideo will start as soon as you answer.\\u003C/div\\u003E\\u003Cdiv class=\\\"mts hidden_elem fcg\\\" data-jsid=\\\"slowMessage\\\"\\u003E\\u003Cspan class=\\\"fwb fcb\\\"\\u003EHaving trouble?\\u003C/span\\u003E Your connection may be \\u003Ca href=\\\"/help/214265948627885\\\" target=\\\"_blank\\\"\\u003Etoo slow\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_78\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix uiTokenizer uiInlineTokenizer\\\"\\u003E\\u003Cdiv class=\\\"tokenarea hidden_elem\\\" data-jsid=\\\"tokenarea\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_79\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__header\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryTypeahead__loadingspinner img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingSpinner\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryTypeahead__link\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_7a\",{\n            __html: \"\\u003Cdiv class=\\\"uiTypeahead\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput\\\" data-jsid=\\\"textfield\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7b\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__row\\\"\\u003E\\u003Cdiv class=\\\"clearfix pvs\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage mrm -cx-PRIVATE-mercuryTypeahead__image lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__rightcontent\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryTypeahead__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__snippet fsm fwn fcg\\\" data-jsid=\\\"snippet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"cy4a0\",],\n    bootloadable: {\n        \"legacy:control-textarea\": {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",\"c1+nc\",]\n        },\n        VideoCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"OJTM4\",\"u//Ut\",\"brbS1\",\"EzMPG\",\"gMfWI\",\"bUzfU\",\"KPLqg\",],\n            \"module\": true\n        },\n        ErrorDialog: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        },\n        FBRTCCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"brbS1\",\"u//Ut\",\"OJTM4\",\"EzMPG\",\"gMfWI\",\"a3inZ\",\"KPLqg\",\"bUzfU\",\"LTaK/\",\"21lHn\",\"+h1d2\",\"9aS3c\",\"MfG6c\",\"LsRx/\",\"3h2ll\",\"Mzbs2\",\"wGXi/\",\"d6Evh\",\"6WF8S\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"9aS3c\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yn/r/-a3R_-jnsnr.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"4qhP/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/sgOGIt3qmqS.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"c1+nc\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/EQeZaXWiup5.js\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/895-sItSveZ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/QylH5JvJ2tZ.js\"\n        }\n    },\n    ixData: {\n        \"/images/messaging/stickers/selector/leftarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/lM_ryP3lE-X.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/messaging/stickers/selector/rightarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/jopyzHwsKtN.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        },\n        \"/images/messaging/stickers/selector/store.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/WG0aM70e5Iq.png\",\n            width: 20,\n            height: 20\n        }\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"H+v1W\",\"LpC/l\",\"brbS1\",\"u//Ut\",\"EzMPG\",],\n    id: \"pagelet_dock\",\n    phase: 4\n});");
// 1626
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        fbRequestsList: {\n            container_id: \"u_0_3g\"\n        }\n    },\n    css: [\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 4\n});");
// 1627
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s7e9bd1a828e2c83e1edb41302ac84585d6a121ae");
// 1628
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        fbRequestsList: {\n            container_id: \"u_0_3g\"\n        }\n    },\n    css: [\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 4\n});");
// 1635
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        timeline_sticky_header: {\n            container_id: \"u_0_3q\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineStickyHeader\",\"init\",[\"m_0_7c\",],[{\n            __m: \"m_0_7c\"\n        },],],[\"SubscribeButton\",\"init\",[\"m_0_7f\",\"m_0_7e\",\"m_0_7g\",],[{\n            __m: \"m_0_7f\"\n        },{\n            __m: \"m_0_7e\"\n        },{\n            __m: \"m_0_7g\"\n        },\"1055580469\",0,false,],],[\"m_0_7f\",],[\"m_0_7g\",],[\"m_0_7l\",],[\"m_0_7k\",],[\"AddFriendButton\",\"init\",[\"m_0_7o\",],[{\n            __m: \"m_0_7o\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],[\"TimelineStickyHeaderNav\",\"init\",[\"m_0_7p\",],[{\n            __m: \"m_0_7p\"\n        },{\n            custom_subsection_menu: false\n        },],],],\n        instances: [[\"m_0_7f\",[\"SwapButtonDEPRECATED\",\"m_0_7e\",\"m_0_7h\",],[{\n            __m: \"m_0_7e\"\n        },{\n            __m: \"m_0_7h\"\n        },false,],3,],[\"m_0_7g\",[\"HoverButton\",\"m_0_7i\",\"m_0_7k\",\"m_0_7j\",],[{\n            __m: \"m_0_7i\"\n        },{\n            __m: \"m_0_7k\"\n        },{\n            __m: \"m_0_7j\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_7l\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_7m\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_7m\"\n        },],3,],[\"m_0_7k\",[\"HoverFlyout\",\"m_0_7l\",\"m_0_7n\",],[{\n            __m: \"m_0_7l\"\n        },{\n            __m: \"m_0_7n\"\n        },150,150,],3,],],\n        elements: [[\"m_0_7d\",\"u_0_3h\",2,],[\"m_0_7e\",\"u_0_3i\",4,],[\"m_0_7h\",\"u_0_3j\",2,],[\"m_0_7j\",\"u_0_3k\",2,\"m_0_7m\",],[\"m_0_7i\",\"u_0_3j\",2,],[\"m_0_7n\",\"u_0_3j\",2,],[\"m_0_7o\",\"u_0_3m\",2,],[\"m_0_7p\",\"u_0_3o\",4,],[\"m_0_7c\",\"u_0_3p\",2,],],\n        markup: [[\"m_0_7m\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_3k\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n        StickyController: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"jsIYP\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    id: \"timeline_sticky_header\",\n    phase: 4\n});");
// 1636
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s4ed7243b5ff25d098813e04bd26e285b6b7f73f5");
// 1637
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        timeline_sticky_header: {\n            container_id: \"u_0_3q\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineStickyHeader\",\"init\",[\"m_0_7c\",],[{\n            __m: \"m_0_7c\"\n        },],],[\"SubscribeButton\",\"init\",[\"m_0_7f\",\"m_0_7e\",\"m_0_7g\",],[{\n            __m: \"m_0_7f\"\n        },{\n            __m: \"m_0_7e\"\n        },{\n            __m: \"m_0_7g\"\n        },\"1055580469\",0,false,],],[\"m_0_7f\",],[\"m_0_7g\",],[\"m_0_7l\",],[\"m_0_7k\",],[\"AddFriendButton\",\"init\",[\"m_0_7o\",],[{\n            __m: \"m_0_7o\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],[\"TimelineStickyHeaderNav\",\"init\",[\"m_0_7p\",],[{\n            __m: \"m_0_7p\"\n        },{\n            custom_subsection_menu: false\n        },],],],\n        instances: [[\"m_0_7f\",[\"SwapButtonDEPRECATED\",\"m_0_7e\",\"m_0_7h\",],[{\n            __m: \"m_0_7e\"\n        },{\n            __m: \"m_0_7h\"\n        },false,],3,],[\"m_0_7g\",[\"HoverButton\",\"m_0_7i\",\"m_0_7k\",\"m_0_7j\",],[{\n            __m: \"m_0_7i\"\n        },{\n            __m: \"m_0_7k\"\n        },{\n            __m: \"m_0_7j\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_7l\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_7m\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_7m\"\n        },],3,],[\"m_0_7k\",[\"HoverFlyout\",\"m_0_7l\",\"m_0_7n\",],[{\n            __m: \"m_0_7l\"\n        },{\n            __m: \"m_0_7n\"\n        },150,150,],3,],],\n        elements: [[\"m_0_7d\",\"u_0_3h\",2,],[\"m_0_7e\",\"u_0_3i\",4,],[\"m_0_7h\",\"u_0_3j\",2,],[\"m_0_7j\",\"u_0_3k\",2,\"m_0_7m\",],[\"m_0_7i\",\"u_0_3j\",2,],[\"m_0_7n\",\"u_0_3j\",2,],[\"m_0_7o\",\"u_0_3m\",2,],[\"m_0_7p\",\"u_0_3o\",4,],[\"m_0_7c\",\"u_0_3p\",2,],],\n        markup: [[\"m_0_7m\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_3k\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n        StickyController: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"jsIYP\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    id: \"timeline_sticky_header\",\n    phase: 4\n});");
// 1644
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"timeline_tab_content_extra\",\n    content: {\n        timeline_section_placeholders: {\n            container_id: \"u_0_3y\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7q\",],[{\n            __m: \"m_0_7q\"\n        },\"year_2013\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7r\",],[{\n            __m: \"m_0_7r\"\n        },\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 8,\n            filter_after_timestamp: 1359228986,\n            section_pagelet_id: \"pagelet_timeline_year_current\",\n            load_immediately: false\n        },false,null,1,\"1.75\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7s\",],[{\n            __m: \"m_0_7s\"\n        },\"year_2012\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7t\",],[{\n            __m: \"m_0_7t\"\n        },\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_last\",\n            load_immediately: false\n        },false,null,2,\"24.648440122605\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7u\",],[{\n            __m: \"m_0_7u\"\n        },\"year_2011\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7v\",],[{\n            __m: \"m_0_7v\"\n        },\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2011\",\n            load_immediately: false\n        },false,null,3,\"6.5829925537109\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7w\",],[{\n            __m: \"m_0_7w\"\n        },\"year_2008\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7x\",],[{\n            __m: \"m_0_7x\"\n        },\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2008\",\n            load_immediately: false\n        },false,null,6,\"13.875\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7y\",],[{\n            __m: \"m_0_7y\"\n        },\"way_back\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7z\",],[{\n            __m: \"m_0_7z\"\n        },\"way_back\",{\n            profile_id: 1055580469,\n            start: 1167638400,\n            end: 1199174399,\n            query_type: 11,\n            section_pagelet_id: \"pagelet_timeline_wayback\",\n            load_immediately: false\n        },false,null,7,-1,],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_80\",],[{\n            __m: \"m_0_80\"\n        },\"year_2009\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_81\",],[{\n            __m: \"m_0_81\"\n        },\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2009\",\n            load_immediately: false\n        },false,null,5,\"14.0224609375\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_82\",],[{\n            __m: \"m_0_82\"\n        },\"year_2010\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_83\",],[{\n            __m: \"m_0_83\"\n        },\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2010\",\n            load_immediately: false\n        },false,null,4,\"9.1259155273438\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 9\n        },],],],\n        elements: [[\"m_0_7q\",\"u_0_3r\",2,],[\"m_0_7s\",\"u_0_3s\",2,],[\"m_0_7u\",\"u_0_3t\",2,],[\"m_0_7w\",\"u_0_3u\",2,],[\"m_0_7y\",\"u_0_3v\",2,],[\"m_0_80\",\"u_0_3w\",2,],[\"m_0_82\",\"u_0_3x\",2,],[\"m_0_7r\",\"pagelet_timeline_year_current\",2,],[\"m_0_7t\",\"pagelet_timeline_year_last\",2,],[\"m_0_7v\",\"pagelet_timeline_year_2011\",2,],[\"m_0_83\",\"pagelet_timeline_year_2010\",2,],[\"m_0_81\",\"pagelet_timeline_year_2009\",2,],[\"m_0_7x\",\"pagelet_timeline_year_2008\",2,],[\"m_0_7z\",\"pagelet_timeline_wayback\",2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"timeline_section_placeholders\",\n    phase: 4\n});");
// 1645
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s7b21021a78fc6aa285889bd10fa275e9e04ebd0f");
// 1646
geval("bigPipe.onPageletArrive({\n    append: \"timeline_tab_content_extra\",\n    JSBNG__content: {\n        timeline_section_placeholders: {\n            container_id: \"u_0_3y\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7q\",],[{\n            __m: \"m_0_7q\"\n        },\"year_2013\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7r\",],[{\n            __m: \"m_0_7r\"\n        },\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 8,\n            filter_after_timestamp: 1359228986,\n            section_pagelet_id: \"pagelet_timeline_year_current\",\n            load_immediately: false\n        },false,null,1,\"1.75\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7s\",],[{\n            __m: \"m_0_7s\"\n        },\"year_2012\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7t\",],[{\n            __m: \"m_0_7t\"\n        },\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_last\",\n            load_immediately: false\n        },false,null,2,\"24.648440122605\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7u\",],[{\n            __m: \"m_0_7u\"\n        },\"year_2011\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7v\",],[{\n            __m: \"m_0_7v\"\n        },\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2011\",\n            load_immediately: false\n        },false,null,3,\"6.5829925537109\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7w\",],[{\n            __m: \"m_0_7w\"\n        },\"year_2008\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7x\",],[{\n            __m: \"m_0_7x\"\n        },\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2008\",\n            load_immediately: false\n        },false,null,6,\"13.875\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7y\",],[{\n            __m: \"m_0_7y\"\n        },\"way_back\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7z\",],[{\n            __m: \"m_0_7z\"\n        },\"way_back\",{\n            profile_id: 1055580469,\n            start: 1167638400,\n            end: 1199174399,\n            query_type: 11,\n            section_pagelet_id: \"pagelet_timeline_wayback\",\n            load_immediately: false\n        },false,null,7,-1,],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_80\",],[{\n            __m: \"m_0_80\"\n        },\"year_2009\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_81\",],[{\n            __m: \"m_0_81\"\n        },\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2009\",\n            load_immediately: false\n        },false,null,5,\"14.0224609375\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_82\",],[{\n            __m: \"m_0_82\"\n        },\"year_2010\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_83\",],[{\n            __m: \"m_0_83\"\n        },\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2010\",\n            load_immediately: false\n        },false,null,4,\"9.1259155273438\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 9\n        },],],],\n        elements: [[\"m_0_7q\",\"u_0_3r\",2,],[\"m_0_7s\",\"u_0_3s\",2,],[\"m_0_7u\",\"u_0_3t\",2,],[\"m_0_7w\",\"u_0_3u\",2,],[\"m_0_7y\",\"u_0_3v\",2,],[\"m_0_80\",\"u_0_3w\",2,],[\"m_0_82\",\"u_0_3x\",2,],[\"m_0_7r\",\"pagelet_timeline_year_current\",2,],[\"m_0_7t\",\"pagelet_timeline_year_last\",2,],[\"m_0_7v\",\"pagelet_timeline_year_2011\",2,],[\"m_0_83\",\"pagelet_timeline_year_2010\",2,],[\"m_0_81\",\"pagelet_timeline_year_2009\",2,],[\"m_0_7x\",\"pagelet_timeline_year_2008\",2,],[\"m_0_7z\",\"pagelet_timeline_wayback\",2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"timeline_section_placeholders\",\n    phase: 4\n});");
// 1653
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_recent_more_pager: {\n            container_id: \"u_0_40\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"updatePagerAfterLoad\",[\"m_0_84\",],[{\n            __m: \"m_0_84\"\n        },\"u_0_17\",\"recent\",\"0\",true,],],],\n        elements: [[\"m_0_84\",\"pagelet_timeline_recent_pager_1\",2,],]\n    },\n    css: [\"ZtiRu\",\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    jscc_map: \"({\\\"jo1oWy2UhFj8B4qShTN0\\\":function(){return new ScrollingPager(\\\"u_0_3z\\\", \\\"ProfileTimelineSectionPagelet\\\", {\\\"profile_id\\\":1055580469,\\\"start\\\":0,\\\"end\\\":1375340399,\\\"query_type\\\":39,\\\"page_index\\\":1,\\\"section_container_id\\\":\\\"u_0_17\\\",\\\"section_pagelet_id\\\":\\\"pagelet_timeline_recent\\\",\\\"unit_container_id\\\":\\\"u_0_16\\\",\\\"current_scrubber_key\\\":\\\"recent\\\",\\\"time_cutoff\\\":null,\\\"buffer\\\":50,\\\"require_click\\\":false,\\\"showing_esc\\\":false,\\\"adjust_buffer\\\":true,\\\"tipld\\\":{\\\"sc\\\":4,\\\"rc\\\":13},\\\"num_visible_units\\\":7,\\\"remove_dupes\\\":true}, {\\\"usePipe\\\":true,\\\"jsNonblock\\\":true,\\\"buffer\\\":50,\\\"constHeight\\\":true,\\\"target_id\\\":\\\"u_0_16\\\"});}})\",\n    onload: [\"JSCC.get(\\\"jo1oWy2UhFj8B4qShTN0\\\").register();\",],\n    id: \"pagelet_timeline_recent_more_pager\",\n    phase: 4\n});");
// 1654
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sf16bfc723171dd6851a6c3059777cd1806005e8c");
// 1655
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_recent_more_pager: {\n            container_id: \"u_0_40\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"updatePagerAfterLoad\",[\"m_0_84\",],[{\n            __m: \"m_0_84\"\n        },\"u_0_17\",\"recent\",\"0\",true,],],],\n        elements: [[\"m_0_84\",\"pagelet_timeline_recent_pager_1\",2,],]\n    },\n    css: [\"ZtiRu\",\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    jscc_map: \"({\\\"jo1oWy2UhFj8B4qShTN0\\\":function(){return new ScrollingPager(\\\"u_0_3z\\\", \\\"ProfileTimelineSectionPagelet\\\", {\\\"profile_id\\\":1055580469,\\\"start\\\":0,\\\"end\\\":1375340399,\\\"query_type\\\":39,\\\"page_index\\\":1,\\\"section_container_id\\\":\\\"u_0_17\\\",\\\"section_pagelet_id\\\":\\\"pagelet_timeline_recent\\\",\\\"unit_container_id\\\":\\\"u_0_16\\\",\\\"current_scrubber_key\\\":\\\"recent\\\",\\\"time_cutoff\\\":null,\\\"buffer\\\":50,\\\"require_click\\\":false,\\\"showing_esc\\\":false,\\\"adjust_buffer\\\":true,\\\"tipld\\\":{\\\"sc\\\":4,\\\"rc\\\":13},\\\"num_visible_units\\\":7,\\\"remove_dupes\\\":true}, {\\\"usePipe\\\":true,\\\"jsNonblock\\\":true,\\\"buffer\\\":50,\\\"constHeight\\\":true,\\\"target_id\\\":\\\"u_0_16\\\"});}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jo1oWy2UhFj8B4qShTN0\\\").register();\",],\n    id: \"pagelet_timeline_recent_more_pager\",\n    phase: 4\n});");
// 1662
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"rightColContent\",\n    content: {\n        pagelet_timeline_scrubber: {\n            container_id: \"u_0_42\"\n        }\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"jsIYP\",\"AsDOA\",],\n    jscc_map: \"({\\\"jp18gHJUAWT51PJX9t30\\\":function(){return new TimelineMainScrubber($(\\\"u_0_41\\\"));}})\",\n    onload: [\"JSCC.get(\\\"jp18gHJUAWT51PJX9t30\\\")\",],\n    id: \"pagelet_timeline_scrubber\",\n    phase: 4\n});");
// 1663
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s4349d483d5cc5ff588490aec1b83f5213644c176");
// 1664
geval("bigPipe.onPageletArrive({\n    append: \"rightColContent\",\n    JSBNG__content: {\n        pagelet_timeline_scrubber: {\n            container_id: \"u_0_42\"\n        }\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"jsIYP\",\"AsDOA\",],\n    jscc_map: \"({\\\"jp18gHJUAWT51PJX9t30\\\":function(){return new TimelineMainScrubber($(\\\"u_0_41\\\"));}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jp18gHJUAWT51PJX9t30\\\")\",],\n    id: \"pagelet_timeline_scrubber\",\n    phase: 4\n});");
// 1671
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_side_ads\",],\n    content: {\n        u_0_2p: {\n            container_id: \"u_0_45\"\n        }\n    },\n    jsmods: {\n        require: [[\"Arbiter\",\"inform\",[],[\"netego_loaded\",null,],],[\"NetEgo\",\"setup\",[],[6008291652839,],],[\"NetEgo\",\"setup\",[],[6008916062718,],],[\"NetEgo\",\"setup\",[],[6008172951099,],],[\"NetEgo\",\"setup\",[],[6006539945625,],],[\"NetEgo\",\"setup\",[],[6006155772461,],],[\"AdblockDetectorLogging\",\"assertUnblocked\",[\"m_0_85\",],[{\n            __m: \"m_0_85\"\n        },],],[\"TimelineController\",\"setAdsTracking\",[],[{\n            6008291652839: \"AQIan4N04oY0je21NihiAu-HG6wgxs6UDu262TFMibKV3mS_rrevFGbszSX3ObJalBWYKO9T4xbjAfgSShiM0juAoDgtluidVLubUEvyXEns6WtmPQiUMmx8Zxu5gEfgOJe2IiwHsR1363vNGQAVoy8zftUpsj5QXhGoO-GgYUkrdXO94DvT24a1DCj9rZUhEnx6lkP9BTU0yXm6ANbbhkTkidMisE0xEle2MRDJWRuYd76auVsPICsy4FCLn53h9Mn9iiMPcMFmN98WK1mJ6hRDKV3UGBgSru74RxTdRhQRE4ea5zS2E3QCW__wfMMZ8CVr6ZApTg9g8r3ydY4AnNA2Z1QEISgYnjty0Dtp8fJA6xkvDhA0yB3Y9XT3sfvrs2Sma1YDwWzqZxzAOizo_iVB3HCcd-hspdeTOfL_Bu3v6ZC88ofisOYXhVk_jQ2QJG9FUs5HIUwk0ipyJoow1NGZf2sP_WkIESI_A5D1s32kfRdWLL9cgm1IVPRHP0bvg8Qk6wpleHgOp0HDVFjkqTYQ3tcIt1p5OyzJVdV76paAmCshw-kYPr0qAy9rChm5SVy3otcxH4kkD8IKH_74AufmD3OB0w_NZLbkAog6OwR-nKDSda4HQxqhW6InNMcdjSE1Kt0wSGCiFolbn8xwH1XmHiQLBPk5zdC2JFccYDbbVQ6xK8hMRP5rruNkYwWzdCZCqjsH_yXYLYid5l7dfgyD3Z-RjJoxF1kogQbDE1Y9D38yUywxX3RrDhPLW0bU2m1qW1jffSWk7zidtKg7Y7ed8rSMBDCRT9BNS3bq7bUA_24G54f0MEvdoWZUqBX7Wky4IAbXttorO01Zo_st7LlgNi45PPNQp5kKjpvuimJZyVLQocq9mddm58CsMMYwl4pyTLP5LeYUjsFumqfA_544\",\n            6008916062718: \"AQKpHUwm4Ft8uSLWe38z9iT-73Y7tkduN5vDtA4-GXoJo5m5NbR6TTPIyruBlw0NuHshj_8TFBwmCjv9d9OwNK0nAOC5gjIOmAsrZRFANsCqtelI1rMYUIO0HzK91C7k2dnRDw5d1TZm42ZfTw6ylPwRCIw0ja9DreBG8JopErTRGC4MCkV1iTAN_i12TjgkeT3c85jQupUwqT6IA4LsZjoMG_UxhyIyu9UFjxWt_RVWmlO0_bqtV2Q1bG5-ZxZAoyDvOl4TJHE5SMDlULVnQwXzgNFicGSAlo0IDyO9ONkUYefpmzpp0z4vfqL_zhcK47DMSX8q1RQllZsXPdrFYC1VQj44d5iaOwaYp82ifDKfHX6pDrRb5DQ2zVZ42D3deDOR2RwHECQsDV3jMF-V0fU903sO14BKhW3SSBA8n70484UKdtyu38QS8pLOVjTU98_kX7nklT9TkOBHW3KrmsiEntibb5y6adsu30d2NK_0Gmb3st7QGz1TCUwp4nirWph0jkW1XVHhShGZxcaEjpfMe215LyjCNPmAn1akPcvNqRiR-0BNtrrEhVlr3eEQwuqZ4D4UEHKpcIWkW5sImgSkg3OJVbivSWK8gQRED9IeUsNc3TutgCqJCnnHkaVwvJW3LmYhwjtY1KCwTW4Iv_5Af3s2HQN6-u-c-Bha02oZMJcpEOOi_5FUVJoOg_sinWo3x-sJIllJx0W6j0wm-OMv7FWaZFQirK3h5O8gUuHnbRqAXYHi1tc8erjRnBsQr3Ww_OpYt8GWH8eq0i2_oxEOT4sj_x5-yxhnxd2m721qWyEOG-BiiVI55-v0nM2hcKCQ2lpc5tuzuXvqFSytHvuyY6PmWeegQ9pTgE_cCyB1cidGJSvwQkB6B1iuxkuCSAfWdzaQUcO2uSMzSV08XBFCWu7H3PM7cNi7larPUaGj2e2c6KgrK631IQ6EYuKC058\",\n            6008172951099: \"AQLW9OmcNq-v4OnMGri9T-CJGlR5IEDPXJIjwUlnYY3NSi9O-sQ8wIzK9-sjVikzNbh4yKp4EtST7jnwbAzYzWEe6Gdywf0Hs11y8u1-fBVk1D_oisMrbGQ-RnSSBUf6OfZEVZ_E0Aaf8TDj9_FVRgqTcWpf5iCuVpuyMT6aiIQS-ZJ3ILbG3ulepSuzMucy7wDaU5TIRIp4kR8_YY-N6r3k1qigenCF2uw7TxVBJIvxWfSgVxwToZxuLHD5Ag1kZgduTTTpKb0Jz8kqkk9mibZMqs_g1b3XvgpOQoy58L1uHFNYPV40_ppfoXqR2zUtXheQ6QfeH-JYyN92VKdAye6yCblu6jxpJnQ_zsbnJD360_mThFT2Y7c2ketIpKNoeILKuPbIFjQrCVn32vjePsknhjc9mmJWePkSNt368z1maQ5_XvHcIRYbGYf8OIQCIm5m0sX0X9zdyn1B36rypkKiSIRwVdxMZsqPz0PI8blUg_E4L0aiU9kC3dk1exAkDLKhmcClp3juhWCAOakCjpERprKMrbCeNINEQglvuYdAjVtjQkGLUc5My4XgC81ufkfqgGxJNz2F1SoMxukcMusWJZfieSAfADSEdBynpdihOxrCgpG66IOuFpXHoyhVhNqYFjuvNRLs_xeVrcBqxnnrLLbfvIb2iuzWmZxDT3WD7iAZvNTXMgUOijXrShzQPeXMeRwxw_Z5RLT0retX8cbc539UGudYiGhTHK7t6K9dl1xtnTIX5knPsgnyJxDDxlsBy-clPum3iyCmtC_z61znZu_xkoUmMJgtxLMJk_Xa0XBISLKMpc0n0BFCJr162fx8PqtSsFEMDDfsN435uN-hvoP9DzZAjm50nOx7n0q7nT14YXkcN32LniVcOBc_qZcvx74EGWOLr4bhsZLF40ZbBu4Zkokz-_9K-2zixii63w\",\n            6006539945625: \"AQLuFXCHsrdsOR9utSENs1WVLrRp1tEeXm-L2rcJ0gAIG2Npcvgada1fMlP_ozk07YL67FSs2MMmMhSIVtk4xd4oZHwDN4uM9JixR_0flEuAtV0c-muYBfnGTe5PnA3CNZioBH4ZgJ8HKaPf0Tghc4xFyxncp6xSU7amiYSqYOyS5CVSnZtwtwtFzq2hM8Du9FbeVwxC_rSs8UxQ7uxSenAWlP7ZtcmJ_ujfhQVV3dv-tgTKFLHi5fBAecJic-SsXbrmS2vmd1f9xtYaviLiMC1uN83Va86_XV7uwBPu8e77QHeqT0uh5Ws-e4_I5IqwILToQi64uVmJT4X2y0drHQkpY-jS5jBMjkwWLjJsalHzBXpXDvbHVtLcmc8zPy0s4Bl54zqMzALrJqRYDXeOYv3Dy9YcVZVuTLyYcC94zG_gR1jQ3K-PEK1mSkuucTJSlVMstFp1FoENHb5qNn-zIRP2_1uL7Xk_lxusHMPu7tbqfCbLKooVwU_GoLzlxOUPv1eFKvUUENTbK1Id_C9Y8XPcdCTAi9vJc31mosw3u8chpcB9rkt3wLjS4Jx9HrvJ1xM1nY4lrI7qrtkjlbHj_gm1iVsQmN4AY5YiWeWkzYiTdqVYEvY0Yv2-tYSdk6QKCcmc7u0IaHx1xwm0k541uwoVbV0sfaRjvX01nFPlahDjtKm2FeWvzSA-34ow-5rAT7aaSu-cVKUjEMLty6qqDVNxZkqtJT1MHHlxVgPVBOw2erEucGKlyq_vArHfp7G330n1jcwRAne1-ncVyb7NS4otoLv0qdjbN-h35HGgpFBMG5ZJGvkGekBhvlmtxaQoFpl3zRmUXzUxcsGX7DQ693azGcdlYHnYQE1nE8u2klfKodVeFLByQ8QAbr337AAkKsI8nRdfTehXuXqGpfH3RdyiwNIMNGJWhmP56fIusY5a4AKmtNPaC9OpwKgvRkx6t30\",\n            6006155772461: \"AQIH3sKqJBNycDdSepcn7oFIMz3jpX3Xem3zrjGldH4fv_dkiOc4P1QDqi9XpjtRRrnK1zvJ3VD5pfu8RlyTgsgPEjeWMbT8D_9ja3UfxahfBHhye19vo7DIX3yUeVZngj8sSi0Jjwer0lvH8Ln9U8K0zV9aDXo4-FGorIFnzf8VAr6Qg3j-DsOIXeY2aHXTOx_XrcCQKvFpEgm_nJwfh8Y1YeaN3xSRmjo3twKUNXOI16Gu5a7VzbLydVH4DnnvHxhtZRYItwUObbqvxD97xjfwxr5CaDPi_RWe3-wtSjmdldoDPUuo3PpgFwoxTKvS0u5fgy_0Btb-alrefQ7cTzxxzIkiAWeoq8rC-ano4goZ7Zw3aS5JQfojR68FA-sytrws1tavaGS9GaagYSu7Q3FSfWUBHjXvnP0o3-wKlWjY1hRj8Ct9L7gWnq0nXVZXD47vdBWRlBAug6L-nz-Iwds-lJeuG0L-GKvpSzZXWMXnJynZWalQp1SKp1RJnbX20v3neWcT12WnT6ecv_yvmo5OJMLnXxVFq4XvlGeFnaJYl5CFd-5VMEQNHnGcG7unX_XVw-INOSPw9qjqWhWVOqo51gz-6L-qGMnnvnueYy1Qc1oxjzJDrBX-I7FgLCByG9fcpe68N5TPLaonTst-jC12Qpo3KcWKoMZYK6B5ZP9W9vVxBELMQ7-eFANDksWu8h74sVpS_mIh_8jOHCYhQjjwl8LBcdyVjWJ54jzlE_5Vyk8BCc1VBywTr1Jf3FTObFRxtpyHMti55hJXNVs4hUlVM0F0eARF8KIdxhti9t9rd6WMbwoI2yosI6YRaY9PSxluyrKxmKh9etyadHjiygIHc1sPlPEMvTxu1O-bOkESiQw2ilnQ9P7QO1Td5gRNSNZQFP3j-rFfEouW9qdMPMD-LygRQLg_LZt-gM39zUCEaQ\"\n        },],],],\n        elements: [[\"m_0_85\",\"u_0_43\",2,],]\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    onload: [\"new EmuController(\\\"6008291652839-id_51ddd2e771eda6d54118611\\\", \\\"AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y--El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA\\\")\",\"new EmuController(\\\"6008916062718-id_51ddd2e771fc95836769755\\\", \\\"AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4\\\")\",\"new EmuController(\\\"6008172951099-id_51ddd2e77201f0726775246\\\", \\\"AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ\\\")\",\"new EmuController(\\\"6006539945625-id_51ddd2e7720713614103777\\\", \\\"AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL\\\")\",\"new EmuController(\\\"6006155772461-id_51ddd2e7720bd7886061668\\\", \\\"AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM\\\")\",\"new AsyncSignal(\\\"\\\\/ajax\\\\/ego_height.php\\\", {\\u000a           sid : \\\"ads\\\",\\u000a           fbid : \\\"6008916062718\\\",\\u000a           height: $(\\\"u_0_44\\\").offsetHeight\\u000a         }).send();\",],\n    id: \"u_0_2p\",\n    phase: 4\n});");
// 1672
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s7d9b3f2001ee97d53358d901d65f1bfaf3bc795f");
// 1673
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_side_ads\",],\n    JSBNG__content: {\n        u_0_2p: {\n            container_id: \"u_0_45\"\n        }\n    },\n    jsmods: {\n        require: [[\"Arbiter\",\"inform\",[],[\"netego_loaded\",null,],],[\"NetEgo\",\"setup\",[],[6008291652839,],],[\"NetEgo\",\"setup\",[],[6008916062718,],],[\"NetEgo\",\"setup\",[],[6008172951099,],],[\"NetEgo\",\"setup\",[],[6006539945625,],],[\"NetEgo\",\"setup\",[],[6006155772461,],],[\"AdblockDetectorLogging\",\"assertUnblocked\",[\"m_0_85\",],[{\n            __m: \"m_0_85\"\n        },],],[\"TimelineController\",\"setAdsTracking\",[],[{\n            6008291652839: \"AQIan4N04oY0je21NihiAu-HG6wgxs6UDu262TFMibKV3mS_rrevFGbszSX3ObJalBWYKO9T4xbjAfgSShiM0juAoDgtluidVLubUEvyXEns6WtmPQiUMmx8Zxu5gEfgOJe2IiwHsR1363vNGQAVoy8zftUpsj5QXhGoO-GgYUkrdXO94DvT24a1DCj9rZUhEnx6lkP9BTU0yXm6ANbbhkTkidMisE0xEle2MRDJWRuYd76auVsPICsy4FCLn53h9Mn9iiMPcMFmN98WK1mJ6hRDKV3UGBgSru74RxTdRhQRE4ea5zS2E3QCW__wfMMZ8CVr6ZApTg9g8r3ydY4AnNA2Z1QEISgYnjty0Dtp8fJA6xkvDhA0yB3Y9XT3sfvrs2Sma1YDwWzqZxzAOizo_iVB3HCcd-hspdeTOfL_Bu3v6ZC88ofisOYXhVk_jQ2QJG9FUs5HIUwk0ipyJoow1NGZf2sP_WkIESI_A5D1s32kfRdWLL9cgm1IVPRHP0bvg8Qk6wpleHgOp0HDVFjkqTYQ3tcIt1p5OyzJVdV76paAmCshw-kYPr0qAy9rChm5SVy3otcxH4kkD8IKH_74AufmD3OB0w_NZLbkAog6OwR-nKDSda4HQxqhW6InNMcdjSE1Kt0wSGCiFolbn8xwH1XmHiQLBPk5zdC2JFccYDbbVQ6xK8hMRP5rruNkYwWzdCZCqjsH_yXYLYid5l7dfgyD3Z-RjJoxF1kogQbDE1Y9D38yUywxX3RrDhPLW0bU2m1qW1jffSWk7zidtKg7Y7ed8rSMBDCRT9BNS3bq7bUA_24G54f0MEvdoWZUqBX7Wky4IAbXttorO01Zo_st7LlgNi45PPNQp5kKjpvuimJZyVLQocq9mddm58CsMMYwl4pyTLP5LeYUjsFumqfA_544\",\n            6008916062718: \"AQKpHUwm4Ft8uSLWe38z9iT-73Y7tkduN5vDtA4-GXoJo5m5NbR6TTPIyruBlw0NuHshj_8TFBwmCjv9d9OwNK0nAOC5gjIOmAsrZRFANsCqtelI1rMYUIO0HzK91C7k2dnRDw5d1TZm42ZfTw6ylPwRCIw0ja9DreBG8JopErTRGC4MCkV1iTAN_i12TjgkeT3c85jQupUwqT6IA4LsZjoMG_UxhyIyu9UFjxWt_RVWmlO0_bqtV2Q1bG5-ZxZAoyDvOl4TJHE5SMDlULVnQwXzgNFicGSAlo0IDyO9ONkUYefpmzpp0z4vfqL_zhcK47DMSX8q1RQllZsXPdrFYC1VQj44d5iaOwaYp82ifDKfHX6pDrRb5DQ2zVZ42D3deDOR2RwHECQsDV3jMF-V0fU903sO14BKhW3SSBA8n70484UKdtyu38QS8pLOVjTU98_kX7nklT9TkOBHW3KrmsiEntibb5y6adsu30d2NK_0Gmb3st7QGz1TCUwp4nirWph0jkW1XVHhShGZxcaEjpfMe215LyjCNPmAn1akPcvNqRiR-0BNtrrEhVlr3eEQwuqZ4D4UEHKpcIWkW5sImgSkg3OJVbivSWK8gQRED9IeUsNc3TutgCqJCnnHkaVwvJW3LmYhwjtY1KCwTW4Iv_5Af3s2HQN6-u-c-Bha02oZMJcpEOOi_5FUVJoOg_sinWo3x-sJIllJx0W6j0wm-OMv7FWaZFQirK3h5O8gUuHnbRqAXYHi1tc8erjRnBsQr3Ww_OpYt8GWH8eq0i2_oxEOT4sj_x5-yxhnxd2m721qWyEOG-BiiVI55-v0nM2hcKCQ2lpc5tuzuXvqFSytHvuyY6PmWeegQ9pTgE_cCyB1cidGJSvwQkB6B1iuxkuCSAfWdzaQUcO2uSMzSV08XBFCWu7H3PM7cNi7larPUaGj2e2c6KgrK631IQ6EYuKC058\",\n            6008172951099: \"AQLW9OmcNq-v4OnMGri9T-CJGlR5IEDPXJIjwUlnYY3NSi9O-sQ8wIzK9-sjVikzNbh4yKp4EtST7jnwbAzYzWEe6Gdywf0Hs11y8u1-fBVk1D_oisMrbGQ-RnSSBUf6OfZEVZ_E0Aaf8TDj9_FVRgqTcWpf5iCuVpuyMT6aiIQS-ZJ3ILbG3ulepSuzMucy7wDaU5TIRIp4kR8_YY-N6r3k1qigenCF2uw7TxVBJIvxWfSgVxwToZxuLHD5Ag1kZgduTTTpKb0Jz8kqkk9mibZMqs_g1b3XvgpOQoy58L1uHFNYPV40_ppfoXqR2zUtXheQ6QfeH-JYyN92VKdAye6yCblu6jxpJnQ_zsbnJD360_mThFT2Y7c2ketIpKNoeILKuPbIFjQrCVn32vjePsknhjc9mmJWePkSNt368z1maQ5_XvHcIRYbGYf8OIQCIm5m0sX0X9zdyn1B36rypkKiSIRwVdxMZsqPz0PI8blUg_E4L0aiU9kC3dk1exAkDLKhmcClp3juhWCAOakCjpERprKMrbCeNINEQglvuYdAjVtjQkGLUc5My4XgC81ufkfqgGxJNz2F1SoMxukcMusWJZfieSAfADSEdBynpdihOxrCgpG66IOuFpXHoyhVhNqYFjuvNRLs_xeVrcBqxnnrLLbfvIb2iuzWmZxDT3WD7iAZvNTXMgUOijXrShzQPeXMeRwxw_Z5RLT0retX8cbc539UGudYiGhTHK7t6K9dl1xtnTIX5knPsgnyJxDDxlsBy-clPum3iyCmtC_z61znZu_xkoUmMJgtxLMJk_Xa0XBISLKMpc0n0BFCJr162fx8PqtSsFEMDDfsN435uN-hvoP9DzZAjm50nOx7n0q7nT14YXkcN32LniVcOBc_qZcvx74EGWOLr4bhsZLF40ZbBu4Zkokz-_9K-2zixii63w\",\n            6006539945625: \"AQLuFXCHsrdsOR9utSENs1WVLrRp1tEeXm-L2rcJ0gAIG2Npcvgada1fMlP_ozk07YL67FSs2MMmMhSIVtk4xd4oZHwDN4uM9JixR_0flEuAtV0c-muYBfnGTe5PnA3CNZioBH4ZgJ8HKaPf0Tghc4xFyxncp6xSU7amiYSqYOyS5CVSnZtwtwtFzq2hM8Du9FbeVwxC_rSs8UxQ7uxSenAWlP7ZtcmJ_ujfhQVV3dv-tgTKFLHi5fBAecJic-SsXbrmS2vmd1f9xtYaviLiMC1uN83Va86_XV7uwBPu8e77QHeqT0uh5Ws-e4_I5IqwILToQi64uVmJT4X2y0drHQkpY-jS5jBMjkwWLjJsalHzBXpXDvbHVtLcmc8zPy0s4Bl54zqMzALrJqRYDXeOYv3Dy9YcVZVuTLyYcC94zG_gR1jQ3K-PEK1mSkuucTJSlVMstFp1FoENHb5qNn-zIRP2_1uL7Xk_lxusHMPu7tbqfCbLKooVwU_GoLzlxOUPv1eFKvUUENTbK1Id_C9Y8XPcdCTAi9vJc31mosw3u8chpcB9rkt3wLjS4Jx9HrvJ1xM1nY4lrI7qrtkjlbHj_gm1iVsQmN4AY5YiWeWkzYiTdqVYEvY0Yv2-tYSdk6QKCcmc7u0IaHx1xwm0k541uwoVbV0sfaRjvX01nFPlahDjtKm2FeWvzSA-34ow-5rAT7aaSu-cVKUjEMLty6qqDVNxZkqtJT1MHHlxVgPVBOw2erEucGKlyq_vArHfp7G330n1jcwRAne1-ncVyb7NS4otoLv0qdjbN-h35HGgpFBMG5ZJGvkGekBhvlmtxaQoFpl3zRmUXzUxcsGX7DQ693azGcdlYHnYQE1nE8u2klfKodVeFLByQ8QAbr337AAkKsI8nRdfTehXuXqGpfH3RdyiwNIMNGJWhmP56fIusY5a4AKmtNPaC9OpwKgvRkx6t30\",\n            6006155772461: \"AQIH3sKqJBNycDdSepcn7oFIMz3jpX3Xem3zrjGldH4fv_dkiOc4P1QDqi9XpjtRRrnK1zvJ3VD5pfu8RlyTgsgPEjeWMbT8D_9ja3UfxahfBHhye19vo7DIX3yUeVZngj8sSi0Jjwer0lvH8Ln9U8K0zV9aDXo4-FGorIFnzf8VAr6Qg3j-DsOIXeY2aHXTOx_XrcCQKvFpEgm_nJwfh8Y1YeaN3xSRmjo3twKUNXOI16Gu5a7VzbLydVH4DnnvHxhtZRYItwUObbqvxD97xjfwxr5CaDPi_RWe3-wtSjmdldoDPUuo3PpgFwoxTKvS0u5fgy_0Btb-alrefQ7cTzxxzIkiAWeoq8rC-ano4goZ7Zw3aS5JQfojR68FA-sytrws1tavaGS9GaagYSu7Q3FSfWUBHjXvnP0o3-wKlWjY1hRj8Ct9L7gWnq0nXVZXD47vdBWRlBAug6L-nz-Iwds-lJeuG0L-GKvpSzZXWMXnJynZWalQp1SKp1RJnbX20v3neWcT12WnT6ecv_yvmo5OJMLnXxVFq4XvlGeFnaJYl5CFd-5VMEQNHnGcG7unX_XVw-INOSPw9qjqWhWVOqo51gz-6L-qGMnnvnueYy1Qc1oxjzJDrBX-I7FgLCByG9fcpe68N5TPLaonTst-jC12Qpo3KcWKoMZYK6B5ZP9W9vVxBELMQ7-eFANDksWu8h74sVpS_mIh_8jOHCYhQjjwl8LBcdyVjWJ54jzlE_5Vyk8BCc1VBywTr1Jf3FTObFRxtpyHMti55hJXNVs4hUlVM0F0eARF8KIdxhti9t9rd6WMbwoI2yosI6YRaY9PSxluyrKxmKh9etyadHjiygIHc1sPlPEMvTxu1O-bOkESiQw2ilnQ9P7QO1Td5gRNSNZQFP3j-rFfEouW9qdMPMD-LygRQLg_LZt-gM39zUCEaQ\"\n        },],],],\n        elements: [[\"m_0_85\",\"u_0_43\",2,],]\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    JSBNG__onload: [\"new EmuController(\\\"6008291652839-id_51ddd2e771eda6d54118611\\\", \\\"AQIqlJPiSbxuPsWI0Vltm29_tC2w9RHCTxA94e6GlCS8YpVb9C53WwkzOGkE1CHJlszzQTmZhoM1Pt5ahw8ayKhXU-IJXJCb2jy_RHOfzfvOLOqdzaLl0b-I2LhhYpndzl24H8aw7-1f5Lx3cZyKfU1E88k2C37TmtMPBNAnlAwB-zBZj8TSa6Dt81FKAul_m4KDapIKcPH4GCOFthvG_V4mLq61Ca5dt71wbQzs3yBLvmJjrzjAGW23tYYBrpRqhdpUlohXTjv4WGPADu7k4DgWNET3n5vSDII32yihOB_EMXkd9mHNGB3NlL3dwbrAtqoM3L8NznKgBLUWWUP0DiolNHsVULv7uinUucyK1prMAH0jMg6OeVuW-30v6YyA1yWFWOrMBkxhkLNNs6_yBnOzCl4rlnGRD1XxVt5_y2MIaadWKEqNiBxYVJft-ZPO3eYivEREFjiUaej_Fr6mEl_3-EmPptKSbvVWVFG1NWVyjjdvJWsLTibcEZMflj3IOnmKjnMscW1Z7ZGRFCfRKeHMiNO-2YaxvtgRYRnCbmlYr_MsrjXTsUu-FYpMwz9TOWk6hGGaqAEVOPzp2Ayftr9FlnjkNJIfncbt5d39aegf-9zJWj9LD5qenp6UiCF4C4OgtZs_Ylr1hYDhC4SCmuqlnzwNq-4vFdyw325jfFmTFwdcxGQQP_HPr0foKZu4Anhq9Y--El8i_s2aa7QFH9SQhk1N7vM40AEYJfZMw4VmxhYc2ert4O0haGeoGLmvU9NULN84JCa_GCBCW5vJoZAVxuvKOo06Pi3vDSjJszk4iZEzuQzhG9DOcTkUtZE5zY1oU9VbereZY-gIdCu-bhY73r7nUbMRsgiPmX2Q0IXAZuHZwPJcx6rC62xyZwa43JL1LMwydH-k2KH4Em4MaYq1nDpEuVrgp2n3ujT_obWakIsLVkYClSCNsRJVISkBK8_buxugZnyyQ9Bzk4K_Ru5AUCPpiP-mbvieHwevquLqCUFMdabpe3C7aGlibrKjC_31LUzBjVsbLP-kF5uhUUjO846V1m7yO7vVSOJipAGhNkoh2LOZR-xT0dag90PM3X7q8n9lCzXwTiyw1vVbpYfEYVC1TQl0QcNFpBCSwM_Lbcb9MeoNk0fQzNxSgrGTFrXBNmad1W6ercUG3jHsVyEA\\\")\",\"new EmuController(\\\"6008916062718-id_51ddd2e771fc95836769755\\\", \\\"AQJjIGQgmArAja8bC0QZNJZ1XjYRrd4j3HkS6YgboZ2Irhg0Q9aMjOJ84dXPr3g7qUW5I4MXXNn-EwfMBRGHOai2gdLu1fjv2MJ1UOxR0UjIPvn9QLy1Cao5a0B8wLAFRtgng6qiUO8lOTN-1o6YR_LQyfYSC-zangxYet5wkCRVcQe1-XuH9B3KcSWZATy89L-npGrX9yWCTgGm-AERsg7cY4otMN0ubFV0INRvkcIy7_mVvUz_aLSw2L4U9bznieSJL6An1ddvoqUHvCDCykGPrV-HS-WTDoEfnbvOMatoQF2NNa-1dNND88cZSQTu0WfW7lcF5lE2yiPimn75WoAplH_Tqr9j8efuDmNO7qxwSl3Vmk2tZHBbJI2cTn65FySfHIm-hyr7B1teTd5HqS2v3inSCr1CzSYEU-_Y14pe6DkdNhdJ5cID-Mw4d2lo7d_ZLMQlzGcNtB83LuyidFqcZIOpWuv-Z5ML54oQY7bL8nStkyIehr_bjyzumewLZuEQehAMP8PMy8xLYq1zeNDtGe_dUredYor2Y1DYIIAwMF6QSE0t44YOBYsLYbcsfhNoSL_dPI-lh-v6n_ciUSkmEXMrPhmJoeyuR92O-2AxIpNEvETbjG84jdjBvYZ297LN90nZtdPkfheWs84Yw3QtiK_jeu-7GS3YjN_dJO8uB3bDfH_audWIZflZBtVf78dsRfnuwmRnnrcZQ6UEZjATkJG_a8UvSG7Zx6ORex19epa896VN88764Aidi0JwdzMztD22H72tDMltNEVm47QAyhrWEoklOwrA2qI4sqwjVIQAvv8ZSZiMneFbuneBLZ5rYDdCiVJP4NA5wL92nGld7yEjFGfHNIaL7XoS3F89NQlR1oyCsLLCaZMC8sTUPtPi56WTElg-naLd-mfL1CwJXxUHJplt6v576gh2-rBlKgWMlfks2v25mkS__anfGsWog8mjuDxAzGQHA2eOcxeHn8BHFzTHluD3asqUuh9vjrgXgYzQ2xtSfJqf6ugRVOPoC-KcDh6UONio612Z-HgYrXEHXPCpi7DrRB2Nsm6gIWnlofg2XqSwRfdhE9JZR3aH4lTxkfruWlG86UiLvhZBRloPomA_Q8yhxMGWg4J5jKvAgar_6mNfxBdFEuk0RwlVfwtc1PBFcCn5d2K35osrSzjEQd0dDvW3L_4qlFqtQR5n5GTw1iTXILGp_-nSw7DGfUtXm98Rljk3rv8PLO4iLbjLwsJrDmvRdFMhz2exZbpT79EkPicyL3cRenD5fZ4\\\")\",\"new EmuController(\\\"6008172951099-id_51ddd2e77201f0726775246\\\", \\\"AQIcymrSMoyHyHBPcUJDaF7J515FM7sJDm0HBx343SXR8DFsM-E5WQxeRd7W1qCorXCHH2DCPzleN6P9mq2cadoKrnExBOX7J9adaQGzHXVl85Ca99Ls5ZslkhDBVKMEq0ibIL7H5VgPfKM2IeG9fP2NTNVk6k-Qd6rg4l3I44K_tJKg30jgGTskjNC4n2wtJ0i6M8ixBWfTzyiykxMKWp_GVXr4SraU0g14vR4nWDIwjyI4sD8_cRdYP6T8zwP13KM8jMXEP_S3lji7feBhDFE5PoAx-qnK-12NpQ8FJKLyj_XdYNLai0Lsz6uOh0vYBs7LeNkT_6uPpYUZmGxVU5W5EY0p8pO4vW7SBenJPsMrNRdho-5V03bBlFgMl5LligiqmGlQMyeYp9pe0PfNdmeLuuBxA6eDVUdZ4dbuOxjIHLBvn2RILAbJFPY0s8Bo1_NL_OIOjbY8-EL6hOCxYC09tnLaz8YEPy7KRno8925Ei1pqfCs-OP5BlpOtxDaD0y5JqX44qqisksvaWDefWYLY7CNwyhCSuaVoQgf7rWJsfJgBmVk1fFdaDiWfTK_YRhnMHX5kI8fj6iRoCYcxJQTGcGxiQw4qeevo79Qx12rcCy2EsNJDoN7bNb1yRgkbETbLnSc6Dwm6juZqcYbapsQ0u_6BYFDYZyp8T9Us_2LJp3GDslwe9TIxumBhPO_OUTh9hEZwxRPGHrwCdlqTHvd_ia5SnAyH3Wy_1uKrIXM0Qt98Nl6uAhHxNFMfKo1vvldfu5qv2yQO5QMucnEy9WAENFfwZkAIFqSNZIRv_DoVFbfpoiFUOuawFclL9pT4C_mDpS46h5x8OYNksnC5SHfGcrL26cz5isGp35hCgttZZxqA2ckq2gkwTBC6dfQJwxR3kMleqf4kDSsthVVHQ-0L_ej9lKRxbIWbDyHTcQLMD-1bM24dwFRzzbAx9ddq_kfgiRsHwZ3HaTnhdOQ4sybspcxeOavnOegB12UCSOLtVIHfCA_y6g9GSoCDWGlWTAFecVriPkcWlEFr_11TRO8pkC2ctewzO1yTTJGVvZDTxnSfNI-jDwy7xBzNg4gwX7xFcNRliwTsc6u_AQ6bQxqbbsVkLByZ4O7i4YlyjiRE1-v7AtiVnCvxhzRAvP9Wd_SaZkumoA24_igQTqp6MRJ4jJqbM6MfxWq2W9USw-xF2UdTUM6mjFvo7OKrd3tF6RlVO_XmyLlBEdiDG5rTXnYhioFrZhAIy9AhGVm8J5WjjQ\\\")\",\"new EmuController(\\\"6006539945625-id_51ddd2e7720713614103777\\\", \\\"AQKeWu86HAgozbw8ON2zBCv8yYvKbJwrV5_P-ime1Oizxd5RVvyrZD6lerLKI94KqqsMGIFRspY3xchuWADKKuuXH-nNFCRz977ODsA3HOrwfNHdeqJrGfrrruy_3n0443m5mKrJV_aLdXxsEm5veoTk7DZX3oK1J_Tgj0w9V_M8lAyk_W3Pur47xFBH4TBRhELLnsc0dGI9zg7KiZMcOBMG3NlfIRX9Ht4gUQfdlex-r3cNZsedNj5Oy66Lw7DfCD3Tef-NkT2hxi_xqp18_11u82bshopddLgaQDFIBfq7K7ta-F_Q7a5ZVWf1kOozvlarkct9ik9v_CMWF7KumxZf5dbZO5LOu4I8DxmJ6Om1fIa_SOlMbzr5bvhwLlUlTrfUi8rUd6zNiI9NA8r5udTk5JAnWWW4KxMFHD1K9N4Ni3nha12Q-OqqC0BkwSVfIvPzeWE-x8z9hufJPARB4VvifqhzRzdpqvfSwqsTr2JQyzyYWv-z1WZX5H7-P9zNDUVELvwGW8evuKmk_-UJKQv3rZfEPXMPlTHJap55BMLGlrJJrIbGyzifmGtrw6u4yOxDwaSQW_ZmLoPj18Oqk5MydHINz5pLVE3ZcXqUMf9gZFi6a1mGFgzqBfNUsKgs71COwP2xka_CZRIx3-4NIIOeKus1CBZ_mlbQdyog6R0BZvrNa-s7uSD6ntFx1csAW7xepLecpLQHMk5nX6j0IPuEQdeqelGgptQYlS_6j7pqCClu4VVa1-gjG0O8smZjQEpGSQqgCe9jxD6PbAKfmO3_mITTm1uRV8F70PWIOX5g0doH8oVCZGwKOJus5CikHa2JBLBSzRj1ROhjv8v-f120tFwpTZ-Xc0EedCVsk37xufK0YWD0BlfROtSDBE3zh22GDRz5zjrWQW16R-W_2PN13YETpomUEVf8NDpKsr9ZcSRZju8l-mMq9uHTNr_Rd9SlNPiH8btls7c842uX5R_xb0zTCFw7cYjJhcQ2Xb3oqcgn67pvAIqcNMZU0Vf4RESuqIWjNyBT-BaAQ7F4WMoYMDcvTbpWnbAZ4WxrniAGO0-q3k-urc9SQEyEsIRkC5gUs2a-HhXgUbnk0SSjly_-4j9DZJQpS8YmWc3YLm60aD53aP1e6bRWBKzt6b5xLvGp7YyK9B-490PTDw81Uc0rk7b_LivsHNNSXyWsM-e34kn1dLdjjecey-BhhTCidfIbOt_spZd45_3UkPaPd_7bkgmOD-95jS18-ejReRbDjyZBFNXDMp5Ib1LgFyuK4NNQyO4P4zDu__n_mabtzshL\\\")\",\"new EmuController(\\\"6006155772461-id_51ddd2e7720bd7886061668\\\", \\\"AQIGQF264oeWSU8boWiU3E2AZIZCKo2FCS7rjluok6mRHc94mtvTeGPFzYD1Z4u4qlTd9wDUPAivpSc2jT3TDOgACyAfM_CQkEE7kQggevfwBFfOzujpv-TIqMyGBi4PGmwN7cyIv3cwT_bRafoHYM_8PYntJ1C_31Mf_E85y3ZMpTcoZcnsh0fWcdW9muzUr6KVj51JHSKxMLgGKn9chW1R36IB3Va9FWzYCKMV8WqLEDt5dsgju58hGG_-6VWIZmYg4BBE0RDQ8EKR4X7fRMWETSMPJTvcP6fni-2T0Aj7jS7ZYTYFghTkqaC56LmdOl6eU08Dd9udSHYkOlCJ0qhKTJV7e7hFjAOt_jABk7nCsuQX-2Va6049j1lh0P9zNA4sfwHBkL22-42jc1IetTvwmpOisuBnVi2iN-9y62jSEWTRjQSbZkepbf6t1Xe1v5ZrjlEms4YZnIDzyQkEGno1yX7zDCB1388QJ-ZHcn7MWG9wRwHdHzqNGvf_2hbxZzLSNJVWL2Nqt_D3mIGDDGEv2RsYgu4G_z5mucCN5v9OFBhCYHOYJgrY68fImGHwwKzoCehbOg_177h2GSFwfKY4glnCuiSel6vEb-NRS3d_wStb02f67d3JGVT-oVFbfjl_UD_3LCN7G9Vd14nqrG8XAXHnKLc8aYsu0WEwkLJhW_fsXfH-PKoN7i5w86u_bg4N-VIggAHS5rFT0aUG1MalndR0O7FN9UeUkXc5qXsh5-IAZ_QdLQiHVULroLf7cwxsTtDuhv_OAHQta2sokI_SuDOjl5HdYVpbxQwL4YFDQZrvC5p0VANPgRj0mtCe24D2VScHfDLRWhDsADO7DV5zWKyZITEGRyYpeHUxBT9B70eYvu8Ite2zFaK81-M2a3pMfqON8bOtMRncxb2Oz1rdPaU4vcQTLjB-cHfgkLc6fsYvbYShSCbq7cj28V-siNr-vSxz0XQWRRsePWzkxlMRF0HSqA8dZLvz09HTs7oneoCUaxipr7m3lg02XDMwdzjmH7kpz340tN5KxXqBCOGL70S-MKafUeJPVy4lSw9S7MxpafVnPIwOTxCCiFb7vi3QARS8xHxwmy0Cbmov2e0elwcg8IViHwJ1JmBA9zpQfHNj4fGU6pzcSuOfr9HHFsc57KCcNvjUbv-PEqd7EuadS01Arql35m4SWZZctCsJawLLNP3i3Ft4Ar6osocPiul3Fw6RgUmvvlTI0syUy0MhfTOp2ueqx-mC4EgmC734s6XfGaS_IjE1p7P0yQAE-aM\\\")\",\"new AsyncSignal(\\\"\\\\/ajax\\\\/ego_height.php\\\", {\\u000a           sid : \\\"ads\\\",\\u000a           fbid : \\\"6008916062718\\\",\\u000a           height: $(\\\"u_0_44\\\").offsetHeight\\u000a         }).send();\",],\n    id: \"u_0_2p\",\n    phase: 4\n});");
// 1679
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 4,\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"setParallelLoadConfig\",[],[{\n            required_units: 5,\n            max_parallelism: 3\n        },],],]\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",\"jsIYP\",],\n    the_end: true\n});");
// 1680
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s51e78b9db69417203505d89989b57c606343bc1d");
// 1681
geval("bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 4,\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"setParallelLoadConfig\",[],[{\n            required_units: 5,\n            max_parallelism: 3\n        },],],]\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",\"jsIYP\",],\n    the_end: true\n});");
// 1689
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_222[0], o0,o18);
// undefined
o0 = null;
// undefined
o18 = null;
// 1691
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_166[0], o21,o19);
// undefined
o21 = null;
// undefined
o19 = null;
// 1696
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_225[0](o22);
// undefined
o22 = null;
// 1698
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_169[0](false);
// 4763
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"AsDOA\",]);\n}\n;\n__d(\"AdblockDetector\", [], function(a, b, c, d, e, f) {\n    var g = \"data-adblock-hash\", h = {\n    }, i = 0;\n    function j(k, l) {\n        var m = k.getAttribute(g);\n        if (!m) {\n            m = ++i;\n            k.setAttribute(g, m);\n        }\n         else if (h[m]) {\n            clearTimeout(h[m]);\n            h[m] = null;\n        }\n        \n    ;\n        h[m] = setTimeout(function() {\n            h[m] = null;\n            if (!k.offsetHeight) {\n                var n = k, o = document.getElementsByTagName(\"body\")[0];\n                while ((n && (n !== o))) {\n                    if ((((((n.style.display === \"none\") || (n.style.height === \"0px\")) || (n.style.height === 0)) || (n.style.height === \"0\")) || (n.childNodes.length === 0))) {\n                        return\n                    };\n                    n = n.parentNode;\n                };\n                if ((n === o)) {\n                    (l && l(k));\n                };\n            }\n        ;\n        }, 3000);\n    };\n    f.assertUnblocked = j;\n});\n__d(\"EagleEye\", [\"Arbiter\",\"Env\",\"OnloadEvent\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"OnloadEvent\"), j = b(\"isInIframe\"), k = (h.eagleEyeConfig || {\n    }), l = \"_e_\", m = ((window.name || \"\")).toString();\n    if (((m.length == 7) && (m.substr(0, 3) == l))) {\n        m = m.substr(3);\n    }\n     else {\n        m = k.seed;\n        if (!j()) {\n            window.name = (l + m);\n        };\n    }\n;\n    var n = ((((window.location.protocol == \"https:\") && document.cookie.match(/\\bcsm=1/))) ? \"; secure\" : \"\"), o = ((l + m) + \"_\"), p = new Date((Date.now() + 604800000)).toGMTString(), q = window.location.hostname.replace(/^.*(facebook\\..*)$/i, \"$1\"), r = ((((\"; expires=\" + p) + \";path=/; domain=\") + q) + n), s = 0, t, u = (k.sessionStorage && a.sessionStorage), v = document.cookie.length, w = false, x = Date.now();\n    function y(ca) {\n        return ((((o + (s++)) + \"=\") + encodeURIComponent(ca)) + r);\n    };\n    function z() {\n        var ca = [], da = false, ea = 0, fa = 0;\n        this.isEmpty = function() {\n            return !ca.length;\n        };\n        this.enqueue = function(ga, ha) {\n            if (ha) {\n                ca.unshift(ga);\n            }\n             else ca.push(ga);\n        ;\n        };\n        this.dequeue = function() {\n            ca.shift();\n        };\n        this.peek = function() {\n            return ca[0];\n        };\n        this.clear = function(ga) {\n            v = Math.min(v, document.cookie.length);\n            if ((!w && (((new Date() - x) > 60000)))) {\n                w = true;\n            };\n            var ha = (!ga && ((document.cookie.search(l) >= 0))), ia = !!h.cookie_header_limit, ja = (h.cookie_count_limit || 19), ka = (h.cookie_header_limit || 3950), la = (ja - 5), ma = (ka - 1000);\n            while (!this.isEmpty()) {\n                var na = y(this.peek());\n                if ((ia && (((na.length > ka) || ((w && ((na.length + v) > ka))))))) {\n                    this.dequeue();\n                    continue;\n                }\n            ;\n                if ((((ha || ia)) && (((((document.cookie.length + na.length) > ka)) || ((document.cookie.split(\";\").length > ja)))))) {\n                    break;\n                };\n                document.cookie = na;\n                ha = true;\n                this.dequeue();\n            };\n            var oa = Date.now();\n            if ((ga || ((((!da && ha) && ((((fa > 0)) && (((Math.min((10 * Math.pow(2, (fa - 1))), 60000) + ea) < oa))))) && g.query(i.ONLOAD)) && (((!this.isEmpty() || ((document.cookie.length > ma))) || ((document.cookie.split(\";\").length > la))))))) {\n                var pa = new Image(), qa = this, ra = (h.tracking_domain || \"\");\n                da = true;\n                pa.onload = function ua() {\n                    da = false;\n                    fa = 0;\n                    qa.clear();\n                };\n                pa.onerror = pa.onabort = function ua() {\n                    da = false;\n                    ea = Date.now();\n                    fa++;\n                };\n                var sa = (h.fb_isb ? (\"&fb_isb=\" + h.fb_isb) : \"\"), ta = (\"&__user=\" + h.user);\n                pa.src = (((((((ra + \"/ajax/nectar.php?asyncSignal=\") + ((Math.floor((Math.random() * 10000)) + 1))) + sa) + ta) + \"&\") + ((!ga ? \"\" : \"s=\"))) + oa);\n            }\n        ;\n        };\n    };\n    t = new z();\n    if (u) {\n        var aa = function() {\n            var ca = 0, da = ca;\n            function ea() {\n                var ha = sessionStorage.getItem(\"_e_ids\");\n                if (ha) {\n                    var ia = ((ha + \"\")).split(\";\");\n                    if ((ia.length == 2)) {\n                        ca = parseInt(ia[0], 10);\n                        da = parseInt(ia[1], 10);\n                    }\n                ;\n                }\n            ;\n            };\n            function fa() {\n                var ha = ((ca + \";\") + da);\n                sessionStorage.setItem(\"_e_ids\", ha);\n            };\n            function ga(ha) {\n                return (\"_e_\" + ((((ha !== undefined)) ? ha : ca++)));\n            };\n            this.isEmpty = function() {\n                return (da === ca);\n            };\n            this.enqueue = function(ha, ia) {\n                var ja = (ia ? ga(--da) : ga());\n                sessionStorage.setItem(ja, ha);\n                fa();\n            };\n            this.dequeue = function() {\n                this.isEmpty();\n                sessionStorage.removeItem(ga(da));\n                da++;\n                fa();\n            };\n            this.peek = function() {\n                var ha = sessionStorage.getItem(ga(da));\n                return (ha ? ((ha + \"\")) : ha);\n            };\n            this.clear = t.clear;\n            ea();\n        };\n        t = new aa();\n    }\n;\n    var ba = {\n        log: function(ca, da, ea) {\n            if (h.no_cookies) {\n                return\n            };\n            var fa = [m,Date.now(),ca,].concat(da);\n            fa.push(fa.length);\n            function ga() {\n                var ha = JSON.stringify(fa);\n                try {\n                    t.enqueue(ha, !!ea);\n                    t.clear(!!ea);\n                } catch (ia) {\n                    if ((u && ((ia.code === 1000)))) {\n                        t = new z();\n                        u = false;\n                        ga();\n                    }\n                ;\n                };\n            };\n            ga();\n        },\n        getSessionID: function() {\n            return m;\n        }\n    };\n    e.exports = ba;\n    a.EagleEye = ba;\n}, 3);\n__d(\"AdblockDetectorLogging\", [\"AdblockDetector\",\"EagleEye\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdblockDetector\"), h = b(\"EagleEye\");\n    function i(j) {\n        g.assertUnblocked(j, h.log.bind(h, \"ads\", {\n            event: \"ads_blocked\"\n        }));\n    };\n    f.assertUnblocked = i;\n});\n__d(\"EgoAdsObjectSet\", [\"copyProperties\",\"csx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"csx\"), i = b(\"DOM\");\n    function j() {\n        this._allEgoUnits = [];\n        this._egoUnits = [];\n    };\n    g(j.prototype, {\n        init: function(l) {\n            this._allEgoUnits = l;\n            this._egoUnits = [];\n            this._allEgoUnits.forEach(function(m) {\n                var n = k(m);\n                if ((!n || !n.holdout)) {\n                    this._egoUnits.push(m);\n                };\n            }, this);\n        },\n        getCount: function() {\n            return this._egoUnits.length;\n        },\n        forEach: function(l, m) {\n            this._egoUnits.forEach(l, m);\n        },\n        getUnit: function(l) {\n            return this._egoUnits[l];\n        },\n        getHoldoutAdIDsForSpace: function(l, m) {\n            if ((!l || !m)) {\n                return []\n            };\n            var n = [];\n            for (var o = 0; ((l > 0) && (o < this._allEgoUnits.length)); o++) {\n                var p = this._allEgoUnits[o], q = m(p), r = k(p);\n                if ((((l >= q) && r) && r.holdout)) {\n                    n.push(r.adid);\n                };\n                l -= q;\n            };\n            return n;\n        },\n        getHoldoutAdIDsForNumAds: function(l) {\n            l = Math.min(l, this._allEgoUnits.length);\n            var m = [];\n            for (var n = 0; (n < l); n++) {\n                var o = this._allEgoUnits[n], p = k(o);\n                if ((p && p.holdout)) {\n                    m.push(p.adid);\n                };\n            };\n            return m;\n        }\n    });\n    function k(l) {\n        var m = i.scry(l, \"div.-cx-PUBLIC-fbAdUnit__root\")[0], n = (m && m.getAttribute(\"data-ad\"));\n        return ((n && JSON.parse(n)) || undefined);\n    };\n    e.exports = j;\n});\n__d(\"EmuController\", [\"AsyncRequest\",\"DataStore\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"URI\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"ge\"), m = b(\"goURI\");\n    function n(o, p) {\n        var q = l(o);\n        if (!q) {\n            return null\n        };\n        this.impression = p;\n        this.containerId = o;\n        h.set(q, \"emuController\", this);\n        return this;\n    };\n    j(n, {\n        fromContainer: function(o) {\n            var p = l(o);\n            if (!p) {\n                return null\n            };\n            return h.get(p, \"emuController\");\n        },\n        getEventClass: function(o) {\n            return (\"emuEvent\" + String(o).trim());\n        }\n    });\n    j(n.prototype, {\n        EVENT_HANDLER_PATH: \"/ajax/emu/end.php\",\n        CLICK: 1,\n        FAN: \"fad_fan\",\n        event: function(o, p, q, r) {\n            var s = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: o,\n                a: 1\n            };\n            if (p) {\n                s.ed = JSON.stringify(p);\n            };\n            if (!r) {\n                r = k;\n            };\n            var t = new g().setURI(this.EVENT_HANDLER_PATH).setData(s).setErrorHandler(r);\n            if (q) {\n                t.setHandler(q);\n            };\n            t.send();\n        },\n        redirect: function() {\n            var o = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: this.CLICK,\n                a: 0,\n                sig: (Math.floor((Math.random() * 65535)) + 65536)\n            }, p = new i(this.EVENT_HANDLER_PATH);\n            p.setQueryData(o);\n            m(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ad-units-base-js\", [\"EmuController\",], function(a, b, c, d) {\n    a.EmuController = b(\"EmuController\");\n}, 3);\n__d(\"ChatConfig\", [\"ChatConfigInitialData\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfigInitialData\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        get: function(k, l) {\n            return ((k in i) ? i[k] : l);\n        },\n        set: function(k) {\n            if ((arguments.length > 1)) {\n                var l = {\n                };\n                l[k] = arguments[1];\n                k = l;\n            }\n        ;\n            h(i, k);\n        },\n        getDebugInfo: function() {\n            return i;\n        }\n    };\n    j.set(g);\n    e.exports = j;\n});\n__d(\"cancelAnimationFrame\", [], function(a, b, c, d, e, f) {\n    var g = (((((a.cancelAnimationFrame || a.webkitCancelAnimationFrame) || a.mozCancelAnimationFrame) || a.oCancelAnimationFrame) || a.msCancelAnimationFrame) || a.clearTimeout);\n    e.exports = g;\n});\n__d(\"XUISpinner.react\", [\"BrowserSupport\",\"ReactProps\",\"React\",\"cancelAnimationFrame\",\"cx\",\"joinClasses\",\"requestAnimationFrame\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"ReactProps\"), i = b(\"React\"), j = b(\"cancelAnimationFrame\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = b(\"requestAnimationFrame\"), n = b(\"tx\"), o = g.hasCSSAnimations(), p = {\n        SMALL: 16,\n        LARGE: 32\n    }, q = {\n        SMALL: 2,\n        LARGE: 4\n    }, r = 5, s = 8, t = (r * s), u = 1200, v = (u / t), w = i.createClass({\n        displayName: \"XUISpinner\",\n        props: {\n            size: h.oneOf([\"small\",\"large\",]),\n            background: h.oneOf([\"light\",\"dark\",])\n        },\n        getDefaultProps: function() {\n            return {\n                size: \"small\",\n                background: \"light\"\n            };\n        },\n        getInitialState: function() {\n            if (!o) {\n                return {\n                    frame: 0,\n                    timer: Date.now()\n                }\n            };\n        },\n        componentDidMount: function() {\n            if (!o) {\n                this._step();\n            };\n        },\n        componentWillUnmount: function() {\n            (this._requestID && j(this._requestID));\n        },\n        _step: function() {\n            this._requestID = m(this._step);\n            var x = Date.now();\n            if (((x - v) > this.state.timer)) {\n                this.setState({\n                    frame: (((this.state.frame + 1)) % t),\n                    timer: x\n                });\n            };\n        },\n        _renderWithCSSAnimation: function(x) {\n            return this.transferPropsTo(i.DOM.span({\n                className: x\n            }, \"Loading...\"));\n        },\n        _renderWithJavaScriptAnimation: function(x) {\n            var y = Math.floor((this.state.frame / s)), z = (this.state.frame % s), aa = ((this.props.size == \"small\") ? p.SMALL : p.LARGE), ba = ((this.props.size == \"small\") ? q.SMALL : q.LARGE), ca = {\n                backgroundPosition: (((((\"-\" + ((((z * aa)) + ba))) + \"px \") + \"-\") + ((((y * aa)) + ba))) + \"px\")\n            }, da = l((\"-cx-PRIVATE-xuiSpinner__jsanimation\"), x);\n            return this.transferPropsTo(i.DOM.span({\n                className: da,\n                style: ca\n            }, \"Loading...\"));\n        },\n        render: function() {\n            var x = ((((((\"-cx-PRIVATE-xuiSpinner__root\") + (((this.props.size == \"small\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__small\") : \"\"))) + (((this.props.size == \"large\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__large\") : \"\"))) + (((this.props.background == \"light\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__light\") : \"\"))) + (((this.props.background == \"dark\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__dark\") : \"\"))));\n            return (o ? this._renderWithCSSAnimation(x) : this._renderWithJavaScriptAnimation(x));\n        }\n    });\n    e.exports = w;\n});\n__d(\"ViewportBounds\", [\"Style\",\"Vector\",\"emptyFunction\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"Vector\"), i = b(\"emptyFunction\"), j = b(\"ge\"), k = b(\"removeFromArray\"), l = {\n        top: [],\n        right: [],\n        bottom: [],\n        left: []\n    };\n    function m(q) {\n        return function() {\n            var r = 0;\n            l[q].forEach(function(s) {\n                r = Math.max(r, s.getSize());\n            });\n            return r;\n        };\n    };\n    function n(q) {\n        return function(r) {\n            return new o(q, r);\n        };\n    };\n    function o(q, r) {\n        this.getSide = i.thatReturns(q);\n        this.getSize = function() {\n            return ((typeof r === \"function\") ? r() : r);\n        };\n        l[q].push(this);\n    };\n    o.prototype.remove = function() {\n        k(l[this.getSide()], this);\n    };\n    var p = {\n        getTop: m(\"top\"),\n        getRight: m(\"right\"),\n        getBottom: m(\"bottom\"),\n        getLeft: m(\"left\"),\n        getElementPosition: function(q) {\n            var r = h.getElementPosition(q);\n            r.y -= p.getTop();\n            return r;\n        },\n        addTop: n(\"top\"),\n        addRight: n(\"right\"),\n        addBottom: n(\"bottom\"),\n        addLeft: n(\"left\")\n    };\n    p.addTop(function() {\n        var q = j(\"blueBar\");\n        if ((q && g.isFixed(q))) {\n            return j(\"blueBarHolder\").offsetHeight\n        };\n        return 0;\n    });\n    e.exports = p;\n});\n__d(\"isAsyncScrollQuery\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = null;\n    function i() {\n        if ((h === null)) {\n            h = (((g.osx() >= 10.8) && (g.webkit() >= 536.25)) && !g.chrome());\n        };\n        return h;\n    };\n    e.exports = i;\n});\n__d(\"ScrollAwareDOM\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMDimensions\",\"DOMPosition\",\"DOMQuery\",\"HTML\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"DOMPosition\"), l = b(\"DOMQuery\"), m = b(\"HTML\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"isAsyncScrollQuery\");\n    function r(w, x) {\n        return function() {\n            v.monitor(arguments[w], x.curry.apply(x, arguments));\n        };\n    };\n    function s(w) {\n        if (!((w instanceof Array))) {\n            w = [w,];\n        };\n        for (var x = 0; (x < w.length); x++) {\n            var y = m.replaceJSONWrapper(w[x]);\n            if ((y instanceof m)) {\n                return y.getRootNode();\n            }\n             else if (i.isNode(y)) {\n                return y\n            }\n        ;\n        };\n        return null;\n    };\n    function t(w) {\n        return (k.getElementPosition(w).y > o.getTop());\n    };\n    function u(w) {\n        var x = (k.getElementPosition(w).y + j.getElementDimensions(w).height), y = (j.getViewportDimensions().height - o.getBottom());\n        return (x >= y);\n    };\n    var v = p({\n        monitor: function(w, x) {\n            if (q()) {\n                return x()\n            };\n            var y = s(w);\n            if (y) {\n                var z = !!y.offsetParent;\n                if ((z && ((t(y) || u(y))))) {\n                    return x()\n                };\n                var aa = n.getDocumentDimensions(), ba = x();\n                if ((z || ((y.offsetParent && !t(y))))) {\n                    var ca = n.getDocumentDimensions().sub(aa), da = {\n                        delta: ca,\n                        target: y\n                    };\n                    if ((v.inform(\"scroll\", da) !== false)) {\n                        ca.scrollElementBy(l.getDocumentScrollElement());\n                    };\n                }\n            ;\n                return ba;\n            }\n             else return x()\n        ;\n        },\n        replace: function(w, x) {\n            var y = s(x);\n            if ((!y || h.hasClass(y, \"hidden_elem\"))) {\n                y = w;\n            };\n            return v.monitor(y, function() {\n                i.replace(w, x);\n            });\n        },\n        prependContent: r(1, i.prependContent),\n        insertAfter: r(1, i.insertAfter),\n        insertBefore: r(1, i.insertBefore),\n        setContent: r(0, i.setContent),\n        appendContent: r(1, i.appendContent),\n        remove: r(0, i.remove),\n        empty: r(0, i.empty)\n    }, g);\n    e.exports = v;\n});\n__d(\"legacy:ScrollAwareDOM\", [\"ScrollAwareDOM\",], function(a, b, c, d) {\n    a.ScrollAwareDOM = b(\"ScrollAwareDOM\");\n}, 3);\n__d(\"Base64\", [], function(a, b, c, d, e, f) {\n    var g = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function h(l) {\n        l = ((((l.charCodeAt(0) << 16)) | ((l.charCodeAt(1) << 8))) | l.charCodeAt(2));\n        return String.fromCharCode(g.charCodeAt((l >>> 18)), g.charCodeAt((((l >>> 12)) & 63)), g.charCodeAt((((l >>> 6)) & 63)), g.charCodeAt((l & 63)));\n    };\n    var i = ((\"\\u003E___?456789:;\\u003C=_______\" + \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\u0009\\u000a\\u000b\\u000c\\u000d\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\") + \"______\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123\");\n    function j(l) {\n        l = (((((i.charCodeAt((l.charCodeAt(0) - 43)) << 18)) | ((i.charCodeAt((l.charCodeAt(1) - 43)) << 12))) | ((i.charCodeAt((l.charCodeAt(2) - 43)) << 6))) | i.charCodeAt((l.charCodeAt(3) - 43)));\n        return String.fromCharCode((l >>> 16), (((l >>> 8)) & 255), (l & 255));\n    };\n    var k = {\n        encode: function(l) {\n            l = unescape(encodeURI(l));\n            var m = (((l.length + 2)) % 3);\n            l = ((l + \"\\u0000\\u0000\".slice(m))).replace(/[\\s\\S]{3}/g, h);\n            return (l.slice(0, ((l.length + m) - 2)) + \"==\".slice(m));\n        },\n        decode: function(l) {\n            l = l.replace(/[^A-Za-z0-9+\\/]/g, \"\");\n            var m = (((l.length + 3)) & 3);\n            l = ((l + \"AAA\".slice(m))).replace(/..../g, j);\n            l = l.slice(0, ((l.length + m) - 3));\n            try {\n                return decodeURIComponent(escape(l));\n            } catch (n) {\n                throw new Error(\"Not valid UTF-8\");\n            };\n        },\n        encodeObject: function(l) {\n            return k.encode(JSON.stringify(l));\n        },\n        decodeObject: function(l) {\n            return JSON.parse(k.decode(l));\n        },\n        encodeNums: function(l) {\n            return String.fromCharCode.apply(String, l.map(function(m) {\n                return g.charCodeAt(((((m | -((m > 63)))) & -((m > 0))) & 63));\n            }));\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:base64\", [\"Base64\",], function(a, b, c, d) {\n    a.Base64 = b(\"Base64\");\n}, 3);\n__d(\"legacy:css\", [\"CSS\",], function(a, b, c, d) {\n    a.CSS = b(\"CSS\");\n}, 3);\n__d(\"legacy:dom\", [\"DOM\",], function(a, b, c, d) {\n    a.DOM = b(\"DOM\");\n}, 3);\n__d(\"FBDesktopDetect\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = \"facebook.desktopplugin\", i = {\n        mimeType: \"application/x-facebook-desktop-1\",\n        isPluginInstalled: function() {\n            if (g.osx()) {\n                return false\n            };\n            var j = null;\n            if (a.ActiveXObject) {\n                try {\n                    j = new a.ActiveXObject(h);\n                    if (j) {\n                        return true\n                    };\n                } catch (k) {\n                \n                };\n            }\n             else if ((a.navigator && a.navigator.plugins)) {\n                a.navigator.plugins.refresh(false);\n                for (var l = 0, m = a.navigator.plugins.length; (l < m); l++) {\n                    j = a.navigator.plugins[l];\n                    if ((j.length && (j[0].type === this.mimeType))) {\n                        return true\n                    };\n                };\n            }\n            \n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"NavigationMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        NAVIGATION_BEGIN: \"NavigationMessage/navigationBegin\",\n        NAVIGATION_SELECT: \"NavigationMessage/navigationSelect\",\n        NAVIGATION_FIRST_RESPONSE: \"NavigationMessage/navigationFirstResponse\",\n        NAVIGATION_COMPLETED: \"NavigationMessage/navigationCompleted\",\n        NAVIGATION_FAILED: \"NavigationMessage/navigationFailed\",\n        NAVIGATION_COUNT_UPDATE: \"NavigationMessage/navigationCount\",\n        NAVIGATION_FAVORITE_UPDATE: \"NavigationMessage/navigationFavoriteUpdate\",\n        NAVIGATION_ITEM_REMOVED: \"NavigationMessage/navigationItemRemoved\",\n        NAVIGATION_ITEM_HIDDEN: \"NavigationMessage/navigationItemHidden\",\n        INTERNAL_LOADING_BEGIN: \"NavigationMessage/internalLoadingBegin\",\n        INTERNAL_LOADING_COMPLETED: \"NavigationMessage/internalLoadingCompleted\"\n    };\n    e.exports = g;\n});\n__d(\"SimpleDrag\", [\"Event\",\"ArbiterMixin\",\"UserAgent\",\"Vector\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"UserAgent\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this.minDragDistance = 0;\n        g.listen(n, \"mousedown\", this._start.bind(this));\n    };\n    k(m.prototype, h, {\n        setMinDragDistance: function(n) {\n            this.minDragDistance = n;\n        },\n        _start: function(event) {\n            var n = false, o = true, p = null;\n            if (this.inform(\"mousedown\", event)) {\n                o = false;\n            };\n            if (this.minDragDistance) {\n                p = j.getEventPosition(event);\n            }\n             else {\n                n = true;\n                var q = this.inform(\"start\", event);\n                if ((q === true)) {\n                    o = false;\n                }\n                 else if ((q === false)) {\n                    n = false;\n                    return;\n                }\n                \n            ;\n            }\n        ;\n            var r = ((i.ie() < 9) ? document.documentElement : window), s = g.listen(r, {\n                selectstart: (o ? g.prevent : l),\n                mousemove: function(event) {\n                    if (!n) {\n                        var t = j.getEventPosition(event);\n                        if ((p.distanceTo(t) < this.minDragDistance)) {\n                            return\n                        };\n                        n = true;\n                        if ((this.inform(\"start\", event) === false)) {\n                            n = false;\n                            return;\n                        }\n                    ;\n                    }\n                ;\n                    this.inform(\"update\", event);\n                }.bind(this),\n                mouseup: function(event) {\n                    for (var t in s) {\n                        s[t].remove();;\n                    };\n                    if (n) {\n                        this.inform(\"end\", event);\n                    }\n                     else this.inform(\"click\", event);\n                ;\n                }.bind(this)\n            });\n            (o && event.prevent());\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:async-signal\", [\"AsyncSignal\",], function(a, b, c, d) {\n    a.AsyncSignal = b(\"AsyncSignal\");\n}, 3);\n__d(\"FlipDirectionOnKeypress\", [\"Event\",\"DOM\",\"Input\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Input\"), j = b(\"Style\");\n    function k(event) {\n        var l = event.getTarget(), m = (h.isNodeOfType(l, \"input\") && ((l.type == \"text\"))), n = h.isNodeOfType(l, \"textarea\");\n        if ((!((m || n)) || l.getAttribute(\"data-prevent-auto-flip\"))) {\n            return\n        };\n        var o = i.getValue(l), p = ((l.style && l.style.direction));\n        if (!p) {\n            var q = 0, r = true;\n            for (var s = 0; (s < o.length); s++) {\n                var t = o.charCodeAt(s);\n                if ((t >= 48)) {\n                    if (r) {\n                        r = false;\n                        q++;\n                    }\n                ;\n                    if (((t >= 1470) && (t <= 1920))) {\n                        j.set(l, \"direction\", \"rtl\");\n                        return;\n                    }\n                ;\n                    if ((q == 5)) {\n                        j.set(l, \"direction\", \"ltr\");\n                        return;\n                    }\n                ;\n                }\n                 else r = true;\n            ;\n            };\n        }\n         else if ((o.length === 0)) {\n            j.set(l, \"direction\", \"\");\n        }\n    ;\n    };\n    g.listen(document.documentElement, {\n        keyup: k,\n        input: k\n    });\n});\n__d(\"PlaceholderOnsubmitFormListener\", [\"Event\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Input\");\n    g.listen(document.documentElement, \"submit\", function(i) {\n        var j = i.getTarget().getElementsByTagName(\"*\");\n        for (var k = 0; (k < j.length); k++) {\n            if ((j[k].getAttribute(\"placeholder\") && h.isEmpty(j[k]))) {\n                h.setValue(j[k], \"\");\n            };\n        };\n    });\n});\n__d(\"ARIA\", [\"DOM\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"emptyFunction\"), i = b(\"ge\"), j, k, l = function() {\n        j = i(\"ariaAssertiveAlert\");\n        if (!j) {\n            j = g.create(\"div\", {\n                id: \"ariaAssertiveAlert\",\n                className: \"accessible_elem\",\n                \"aria-live\": \"assertive\"\n            });\n            g.appendContent(document.body, j);\n        }\n    ;\n        k = i(\"ariaPoliteAlert\");\n        if (!k) {\n            k = j.cloneNode(false);\n            k.setAttribute(\"id\", \"ariaPoliteAlert\");\n            k.setAttribute(\"aria-live\", \"polite\");\n            g.appendContent(document.body, k);\n        }\n    ;\n        l = h;\n    };\n    function m(o, p) {\n        l();\n        var q = (p ? j : k);\n        g.setContent(q, o);\n    };\n    var n = {\n        owns: function(o, p) {\n            o.setAttribute(\"aria-owns\", g.getID(p));\n        },\n        setPopup: function(o, p) {\n            var q = g.getID(p);\n            o.setAttribute(\"aria-owns\", q);\n            o.setAttribute(\"aria-haspopup\", \"true\");\n            if ((o.tabIndex == -1)) {\n                o.tabIndex = 0;\n            };\n        },\n        announce: function(o) {\n            m(o, true);\n        },\n        notify: function(o) {\n            m(o);\n        }\n    };\n    e.exports = n;\n});\n__d(\"ScriptPathState\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h, i, j, k, l = 100, m = {\n        setIsUIPageletRequest: function(n) {\n            j = n;\n        },\n        setUserURISampleRate: function(n) {\n            k = n;\n        },\n        reset: function() {\n            h = null;\n            i = false;\n            j = false;\n        },\n        _shouldUpdateScriptPath: function() {\n            return ((i && !j));\n        },\n        _shouldSendURI: function() {\n            return ((Math.random() < k));\n        },\n        getParams: function() {\n            var n = {\n            };\n            if (m._shouldUpdateScriptPath()) {\n                if ((m._shouldSendURI() && (h !== null))) {\n                    n.user_uri = h.substring(0, l);\n                };\n            }\n             else n.no_script_path = 1;\n        ;\n            return n;\n        }\n    };\n    g.subscribe(\"pre_page_transition\", function(n, o) {\n        i = true;\n        h = o.to.getUnqualifiedURI().toString();\n    });\n    e.exports = a.ScriptPathState = m;\n});\n__d(\"goOrReplace\", [\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"UserAgent\");\n    function i(j, k, l) {\n        var m = new g(k), n = a.Quickling;\n        if ((((((j.pathname == \"/\") && (m.getPath() != \"/\")) && n) && n.isActive()) && n.isPageActive(m))) {\n            var o = (j.search ? {\n            } : {\n                q: \"\"\n            });\n            m = new g().setPath(\"/\").setQueryData(o).setFragment(m.getUnqualifiedURI().toString());\n            k = m.toString();\n        }\n    ;\n        if ((l && !((h.ie() < 8)))) {\n            j.replace(k);\n        }\n         else if ((j.href == k)) {\n            j.reload();\n        }\n         else j.href = k;\n        \n    ;\n    };\n    e.exports = i;\n});\n__d(\"AjaxPipeRequest\", [\"Arbiter\",\"AsyncRequest\",\"BigPipe\",\"CSS\",\"DOM\",\"Env\",\"PageletSet\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"goOrReplace\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BigPipe\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"PageletSet\"), n = b(\"ScriptPathState\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"goOrReplace\"), r = b(\"ge\"), s;\n    function t(w, x) {\n        var y = r(w);\n        if (!y) {\n            return\n        };\n        if (!x) {\n            y.style.minHeight = \"600px\";\n        };\n        var z = m.getPageletIDs();\n        for (var aa = 0; (aa < z.length); aa++) {\n            var ba = z[aa];\n            if (k.contains(y, ba)) {\n                m.removePagelet(ba);\n            };\n        };\n        k.empty(y);\n    };\n    function u(w, x) {\n        var y = r(w);\n        if ((y && !x)) {\n            y.style.minHeight = \"100px\";\n        };\n    };\n    function v(w, x) {\n        this._uri = w;\n        this._query_data = x;\n        this._request = new h();\n        this._canvas_id = null;\n        this._allow_cross_page_transition = true;\n    };\n    p(v.prototype, {\n        setCanvasId: function(w) {\n            this._canvas_id = w;\n            return this;\n        },\n        setURI: function(w) {\n            this._uri = w;\n            return this;\n        },\n        setData: function(w) {\n            this._query_data = w;\n            return this;\n        },\n        getData: function(w) {\n            return this._query_data;\n        },\n        setAllowCrossPageTransition: function(w) {\n            this._allow_cross_page_transition = w;\n            return this;\n        },\n        setAppend: function(w) {\n            this._append = w;\n            return this;\n        },\n        send: function() {\n            var w = {\n                ajaxpipe: 1,\n                ajaxpipe_token: l.ajaxpipe_token\n            };\n            p(w, n.getParams());\n            n.reset();\n            this._request.setOption(\"useIframeTransport\", true).setURI(this._uri).setData(p(w, this._query_data)).setPreBootloadHandler(this._preBootloadHandler.bind(this)).setInitialHandler(this._onInitialResponse.bind(this)).setHandler(this._onResponse.bind(this)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._allow_cross_page_transition);\n            if (this._automatic) {\n                this._relevantRequest = s;\n            }\n             else s = this._request;\n        ;\n            this._request.send();\n            return this;\n        },\n        _preBootloadFirstResponse: function(w) {\n            return false;\n        },\n        _fireDomContentCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/domcontent_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _fireOnloadCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/onload_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _isRelevant: function(w) {\n            return (((this._request == s) || ((this._automatic && (this._relevantRequest == s)))) || this._jsNonBlock);\n        },\n        _preBootloadHandler: function(w) {\n            var x = w.getPayload();\n            if (((!x || x.redirect) || !this._isRelevant(w))) {\n                return false\n            };\n            var y = false;\n            if (w.is_first) {\n                ((!this._append && !this._displayCallback) && t(this._canvas_id, this._constHeight));\n                this._arbiter = new g();\n                y = this._preBootloadFirstResponse(w);\n                this.pipe = new i({\n                    arbiter: this._arbiter,\n                    rootNodeID: this._canvas_id,\n                    lid: this._request.lid,\n                    isAjax: true,\n                    domContentCallback: this._fireDomContentCallback.bind(this),\n                    onloadCallback: this._fireOnloadCallback.bind(this),\n                    domContentEvt: \"ajaxpipe/domcontent_callback\",\n                    onloadEvt: \"ajaxpipe/onload_callback\",\n                    jsNonBlock: this._jsNonBlock,\n                    automatic: this._automatic,\n                    displayCallback: this._displayCallback\n                });\n            }\n        ;\n            return y;\n        },\n        _redirect: function(w) {\n            if (w.redirect) {\n                if ((w.force || !this.isPageActive(w.redirect))) {\n                    var x = [\"ajaxpipe\",\"ajaxpipe_token\",].concat(this.getSanitizedParameters());\n                    q(window.location, o(w.redirect).removeQueryData(x), true);\n                }\n                 else {\n                    var y = a.PageTransitions;\n                    y.go(w.redirect, true);\n                }\n            ;\n                return true;\n            }\n             else return false\n        ;\n        },\n        isPageActive: function(w) {\n            return true;\n        },\n        getSanitizedParameters: function() {\n            return [];\n        },\n        _versionCheck: function(w) {\n            return true;\n        },\n        _onInitialResponse: function(w) {\n            var x = w.getPayload();\n            if (!this._isRelevant(w)) {\n                return false\n            };\n            if (!x) {\n                return true\n            };\n            if ((this._redirect(x) || !this._versionCheck(x))) {\n                return false\n            };\n            return true;\n        },\n        _processFirstResponse: function(w) {\n            var x = w.getPayload();\n            if ((r(this._canvas_id) && (x.canvas_class != null))) {\n                j.setClass(this._canvas_id, x.canvas_class);\n            };\n        },\n        setFirstResponseCallback: function(w) {\n            this._firstResponseCallback = w;\n            return this;\n        },\n        setFirstResponseHandler: function(w) {\n            this._processFirstResponse = w;\n            return this;\n        },\n        _onResponse: function(w) {\n            var x = w.payload;\n            if (!this._isRelevant(w)) {\n                return h.suppressOnloadToken\n            };\n            if (w.is_first) {\n                this._processFirstResponse(w);\n                (this._firstResponseCallback && this._firstResponseCallback());\n                x.provides = (x.provides || []);\n                x.provides.push(\"uipage_onload\");\n                if (this._append) {\n                    x.append = this._canvas_id;\n                };\n            }\n        ;\n            if (x) {\n                if ((((\"content\" in x.content) && (this._canvas_id !== null)) && (this._canvas_id != \"content\"))) {\n                    x.content[this._canvas_id] = x.content.content;\n                    delete x.content.content;\n                }\n            ;\n                this.pipe.onPageletArrive(x);\n            }\n        ;\n            if (w.is_last) {\n                u(this._canvas_id, this._constHeight);\n            };\n            return h.suppressOnloadToken;\n        },\n        setNectarModuleDataSafe: function(w) {\n            this._request.setNectarModuleDataSafe(w);\n            return this;\n        },\n        setFinallyHandler: function(w) {\n            this._request.setFinallyHandler(w);\n            return this;\n        },\n        setErrorHandler: function(w) {\n            this._request.setErrorHandler(w);\n            return this;\n        },\n        abort: function() {\n            this._request.abort();\n            if ((s == this._request)) {\n                s = null;\n            };\n            this._request = null;\n            return this;\n        },\n        setJSNonBlock: function(w) {\n            this._jsNonBlock = w;\n            return this;\n        },\n        setAutomatic: function(w) {\n            this._automatic = w;\n            return this;\n        },\n        setDisplayCallback: function(w) {\n            this._displayCallback = w;\n            return this;\n        },\n        setConstHeight: function(w) {\n            this._constHeight = w;\n            return this;\n        },\n        getAsyncRequest: function() {\n            return this._request;\n        }\n    });\n    p(v, {\n        getCurrentRequest: function() {\n            return s;\n        },\n        setCurrentRequest: function(w) {\n            s = w;\n        }\n    });\n    e.exports = v;\n});\n__d(\"AsyncRequestNectarLogging\", [\"AsyncRequest\",\"Nectar\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Nectar\"), i = b(\"copyProperties\");\n    i(g.prototype, {\n        setNectarModuleData: function(j) {\n            if ((this.method == \"POST\")) {\n                h.addModuleData(this.data, j);\n            };\n        },\n        setNectarImpressionId: function() {\n            if ((this.method == \"POST\")) {\n                h.addImpressionID(this.data);\n            };\n        }\n    });\n});\n__d(\"CSSClassTransition\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = [];\n    function i() {\n    \n    };\n    g(i, {\n        go: function(j, k, l, m) {\n            var n;\n            for (var o = 0; (o < h.length); o++) {\n                if ((h[o](j, k, l, m) === true)) {\n                    n = true;\n                };\n            };\n            if (!n) {\n                j.className = k;\n            };\n        },\n        registerHandler: function(j) {\n            h.push(j);\n            return {\n                remove: function() {\n                    var k = h.indexOf(j);\n                    if ((k >= 0)) {\n                        h.splice(k, 1);\n                    };\n                }\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"DOMScroll\", [\"Animation\",\"Arbiter\",\"DOM\",\"DOMQuery\",\"Vector\",\"ViewportBounds\",\"ge\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Vector\"), l = b(\"ViewportBounds\"), m = b(\"ge\"), n = b(\"isAsyncScrollQuery\"), o = {\n        SCROLL: \"dom-scroll\",\n        getScrollState: function() {\n            var p = k.getViewportDimensions(), q = k.getDocumentDimensions(), r = ((q.x > p.x)), s = ((q.y > p.y));\n            r += 0;\n            s += 0;\n            return new k(r, s);\n        },\n        _scrollbarSize: null,\n        _initScrollbarSize: function() {\n            var p = i.create(\"p\");\n            p.style.width = \"100%\";\n            p.style.height = \"200px\";\n            var q = i.create(\"div\");\n            q.style.position = \"absolute\";\n            q.style.top = \"0px\";\n            q.style.left = \"0px\";\n            q.style.visibility = \"hidden\";\n            q.style.width = \"200px\";\n            q.style.height = \"150px\";\n            q.style.overflow = \"hidden\";\n            q.appendChild(p);\n            document.body.appendChild(q);\n            var r = p.offsetWidth;\n            q.style.overflow = \"scroll\";\n            var s = p.offsetWidth;\n            if ((r == s)) {\n                s = q.clientWidth;\n            };\n            document.body.removeChild(q);\n            o._scrollbarSize = (r - s);\n        },\n        getScrollbarSize: function() {\n            if ((o._scrollbarSize === null)) {\n                o._initScrollbarSize();\n            };\n            return o._scrollbarSize;\n        },\n        scrollTo: function(p, q, r, s, t) {\n            if (((typeof q == \"undefined\") || (q === true))) {\n                q = 750;\n            };\n            if (n()) {\n                q = false;\n            };\n            if (!((p instanceof k))) {\n                var u = k.getScrollPosition().x, v = k.getElementPosition(m(p)).y;\n                p = new k(u, v, \"document\");\n                if (!s) {\n                    p.y -= (l.getTop() / ((r ? 2 : 1)));\n                };\n            }\n        ;\n            if (r) {\n                p.y -= (k.getViewportDimensions().y / 2);\n            }\n             else if (s) {\n                p.y -= k.getViewportDimensions().y;\n                p.y += s;\n            }\n            \n        ;\n            p = p.convertTo(\"document\");\n            if (q) {\n                return new g(document.body).to(\"scrollTop\", p.y).to(\"scrollLeft\", p.x).ease(g.ease.end).duration(q).ondone(t).go();\n            }\n             else if (window.scrollTo) {\n                window.scrollTo(p.x, p.y);\n                (t && t());\n            }\n            \n        ;\n            h.inform(o.SCROLL);\n        },\n        ensureVisible: function(p, q, r, s, t) {\n            if ((r === undefined)) {\n                r = 10;\n            };\n            p = m(p);\n            if (q) {\n                p = j.find(p, q);\n            };\n            var u = k.getScrollPosition().x, v = k.getScrollPosition().y, w = (v + k.getViewportDimensions().y), x = k.getElementPosition(p).y, y = (x + k.getElementDimensions(p).y);\n            x -= l.getTop();\n            x -= r;\n            y += r;\n            if ((x < v)) {\n                o.scrollTo(new k(u, x, \"document\"), s, false, false, t);\n            }\n             else if ((y > w)) {\n                if (((x - ((y - w))) < v)) {\n                    o.scrollTo(new k(u, x, \"document\"), s, false, false, t);\n                }\n                 else o.scrollTo(new k(u, y, \"document\"), s, false, true, t);\n            \n            }\n        ;\n        },\n        scrollToTop: function(p) {\n            var q = k.getScrollPosition();\n            o.scrollTo(new k(q.x, 0, \"document\"), (p !== false));\n        }\n    };\n    e.exports = o;\n});\n__d(\"Button\", [\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Parent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"Parent\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = \"uiButtonDisabled\", o = \"uiButtonDepressed\", p = \"-cx-PUBLIC-abstractButton__disabled\", q = \"-cx-PUBLIC-abstractButton__depressed\", r = \"button:blocker\", s = \"href\", t = \"ajaxify\";\n    function u(aa, ba) {\n        var ca = h.get(aa, r);\n        if (ba) {\n            if (ca) {\n                ca.remove();\n                h.remove(aa, r);\n            }\n        ;\n        }\n         else if (!ca) {\n            h.set(aa, r, j.listen(aa, \"click\", m.thatReturnsFalse, j.Priority.URGENT));\n        }\n    ;\n    };\n    function v(aa) {\n        var ba = (k.byClass(aa, \"uiButton\") || k.byClass(aa, \"-cx-PRIVATE-abstractButton__root\"));\n        if (!ba) {\n            throw new Error(\"invalid use case\")\n        };\n        return ba;\n    };\n    function w(aa) {\n        return i.isNodeOfType(aa, \"a\");\n    };\n    function x(aa) {\n        return i.isNodeOfType(aa, \"button\");\n    };\n    function y(aa) {\n        return g.hasClass(aa, \"-cx-PRIVATE-abstractButton__root\");\n    };\n    var z = {\n        getInputElement: function(aa) {\n            aa = v(aa);\n            if (w(aa)) {\n                throw new Error(\"invalid use case\")\n            };\n            return (x(aa) ? aa : i.find(aa, \"input\"));\n        },\n        isEnabled: function(aa) {\n            return !((g.hasClass(v(aa), n) || g.hasClass(v(aa), p)));\n        },\n        setEnabled: function(aa, ba) {\n            aa = v(aa);\n            var ca = (y(aa) ? p : n);\n            g.conditionClass(aa, ca, !ba);\n            if (w(aa)) {\n                var da = aa.getAttribute(\"href\"), ea = aa.getAttribute(\"ajaxify\"), fa = h.get(aa, s, \"#\"), ga = h.get(aa, t);\n                if (ba) {\n                    if (!da) {\n                        aa.setAttribute(\"href\", fa);\n                    };\n                    if ((!ea && ga)) {\n                        aa.setAttribute(\"ajaxify\", ga);\n                    };\n                    aa.removeAttribute(\"tabIndex\");\n                }\n                 else {\n                    if ((da && (da !== fa))) {\n                        h.set(aa, s, da);\n                    };\n                    if ((ea && (ea !== ga))) {\n                        h.set(aa, t, ea);\n                    };\n                    aa.removeAttribute(\"href\");\n                    aa.removeAttribute(\"ajaxify\");\n                    aa.setAttribute(\"tabIndex\", \"-1\");\n                }\n            ;\n                u(aa, ba);\n            }\n             else {\n                var ha = z.getInputElement(aa);\n                ha.disabled = !ba;\n                u(ha, ba);\n            }\n        ;\n        },\n        setDepressed: function(aa, ba) {\n            aa = v(aa);\n            var ca = (y(aa) ? q : o);\n            g.conditionClass(aa, ca, ba);\n        },\n        isDepressed: function(aa) {\n            aa = v(aa);\n            var ba = (y(aa) ? q : o);\n            return g.hasClass(aa, ba);\n        },\n        setLabel: function(aa, ba) {\n            aa = v(aa);\n            if (y(aa)) {\n                var ca = [];\n                if (ba) {\n                    ca.push(ba);\n                };\n                var da = i.scry(aa, \".img\")[0];\n                if (da) {\n                    if ((aa.firstChild == da)) {\n                        ca.unshift(da);\n                    }\n                     else ca.push(da);\n                \n                };\n                i.setContent(aa, ca);\n            }\n             else if (w(aa)) {\n                var ea = i.find(aa, \"span.uiButtonText\");\n                i.setContent(ea, ba);\n            }\n             else z.getInputElement(aa).value = ba;\n            \n        ;\n            var fa = (y(aa) ? \"-cx-PUBLIC-abstractButton__notext\" : \"uiButtonNoText\");\n            g.conditionClass(aa, fa, !ba);\n        },\n        setIcon: function(aa, ba) {\n            if ((ba && !i.isNode(ba))) {\n                return\n            };\n            aa = v(aa);\n            var ca = i.scry(aa, \".img\")[0];\n            if (!ba) {\n                (ca && i.remove(ca));\n                return;\n            }\n        ;\n            g.addClass(ba, \"customimg\");\n            if ((ca != ba)) {\n                if (ca) {\n                    i.replace(ca, ba);\n                }\n                 else i.prependContent(aa, ba);\n            \n            };\n        }\n    };\n    e.exports = z;\n});\n__d(\"Form\", [\"Event\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"DataStore\",\"Env\",\"Input\",\"Parent\",\"URI\",\"createArrayFrom\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMPosition\"), m = b(\"DOMQuery\"), n = b(\"DataStore\"), o = b(\"Env\"), p = b(\"Input\"), q = b(\"Parent\"), r = b(\"URI\"), s = b(\"createArrayFrom\"), t = b(\"trackReferrer\"), u = (\"FileList\" in window), v = (\"FormData\" in window);\n    function w(y) {\n        var z = {\n        };\n        r.implodeQuery(y).split(\"&\").forEach(function(aa) {\n            if (aa) {\n                var ba = /^([^=]*)(?:=(.*))?$/.exec(aa), ca = r.decodeComponent(ba[1]), da = (ba[2] ? r.decodeComponent(ba[2]) : null);\n                z[ca] = da;\n            }\n        ;\n        });\n        return z;\n    };\n    var x = {\n        getInputs: function(y) {\n            y = (y || document);\n            return [].concat(s(m.scry(y, \"input\")), s(m.scry(y, \"select\")), s(m.scry(y, \"textarea\")), s(m.scry(y, \"button\")));\n        },\n        getInputsByName: function(y) {\n            var z = {\n            };\n            x.getInputs(y).forEach(function(aa) {\n                var ba = z[aa.name];\n                z[aa.name] = ((typeof ba === \"undefined\") ? aa : [aa,].concat(ba));\n            });\n            return z;\n        },\n        getSelectValue: function(y) {\n            return y.options[y.selectedIndex].value;\n        },\n        setSelectValue: function(y, z) {\n            for (var aa = 0; (aa < y.options.length); ++aa) {\n                if ((y.options[aa].value == z)) {\n                    y.selectedIndex = aa;\n                    break;\n                }\n            ;\n            };\n        },\n        getRadioValue: function(y) {\n            for (var z = 0; (z < y.length); z++) {\n                if (y[z].checked) {\n                    return y[z].value\n                };\n            };\n            return null;\n        },\n        getElements: function(y) {\n            return s(((y.tagName == \"FORM\") ? y.elements : x.getInputs(y)));\n        },\n        getAttribute: function(y, z) {\n            return (((y.getAttributeNode(z) || {\n            })).value || null);\n        },\n        setDisabled: function(y, z) {\n            x.getElements(y).forEach(function(aa) {\n                if ((aa.disabled !== undefined)) {\n                    var ba = n.get(aa, \"origDisabledState\");\n                    if (z) {\n                        if ((ba === undefined)) {\n                            n.set(aa, \"origDisabledState\", aa.disabled);\n                        };\n                        aa.disabled = z;\n                    }\n                     else if ((ba !== true)) {\n                        aa.disabled = false;\n                    }\n                ;\n                }\n            ;\n            });\n        },\n        bootstrap: function(y, z) {\n            var aa = ((x.getAttribute(y, \"method\") || \"GET\")).toUpperCase();\n            z = (q.byTag(z, \"button\") || z);\n            var ba = (q.byClass(z, \"stat_elem\") || y);\n            if (j.hasClass(ba, \"async_saving\")) {\n                return\n            };\n            if ((z && ((((z.form !== y) || (((z.nodeName != \"INPUT\") && (z.nodeName != \"BUTTON\")))) || (z.type != \"submit\"))))) {\n                var ca = m.scry(y, \".enter_submit_target\")[0];\n                (ca && (z = ca));\n            }\n        ;\n            var da = x.serialize(y, z);\n            x.setDisabled(y, true);\n            var ea = (x.getAttribute(y, \"ajaxify\") || x.getAttribute(y, \"action\"));\n            t(y, ea);\n            var fa = new h(ea);\n            fa.setData(da).setNectarModuleDataSafe(y).setReadOnly((aa == \"GET\")).setMethod(aa).setRelativeTo(y).setStatusElement(ba).setInitialHandler(x.setDisabled.curry(y, false)).setHandler(function(ga) {\n                g.fire(y, \"success\", {\n                    response: ga\n                });\n            }).setErrorHandler(function(ga) {\n                if ((g.fire(y, \"error\", {\n                    response: ga\n                }) !== false)) {\n                    i.defaultErrorHandler(ga);\n                };\n            }).setFinallyHandler(x.setDisabled.curry(y, false)).send();\n        },\n        forEachValue: function(y, z, aa) {\n            x.getElements(y).forEach(function(ba) {\n                if (((ba.name && !ba.disabled) && (ba.type !== \"submit\"))) {\n                    if ((((((!ba.type || (((((ba.type === \"radio\") || (ba.type === \"checkbox\"))) && ba.checked))) || (ba.type === \"text\")) || (ba.type === \"password\")) || (ba.type === \"hidden\")) || (ba.nodeName === \"TEXTAREA\"))) {\n                        aa(ba.type, ba.name, p.getValue(ba));\n                    }\n                     else if ((ba.nodeName === \"SELECT\")) {\n                        for (var ca = 0, da = ba.options.length; (ca < da); ca++) {\n                            var ea = ba.options[ca];\n                            if (ea.selected) {\n                                aa(\"select\", ba.name, ea.value);\n                            };\n                        };\n                    }\n                     else if ((u && (ba.type === \"file\"))) {\n                        var fa = ba.files;\n                        for (var ga = 0; (ga < fa.length); ga++) {\n                            aa(\"file\", ba.name, fa.item(ga));;\n                        };\n                    }\n                    \n                    \n                \n                };\n            });\n            if (((((z && z.name) && (z.type === \"submit\")) && m.contains(y, z)) && m.isNodeOfType(z, [\"input\",\"button\",]))) {\n                aa(\"submit\", z.name, z.value);\n            };\n        },\n        createFormData: function(y, z) {\n            if (!v) {\n                return null\n            };\n            var aa = new FormData();\n            if (y) {\n                if (m.isNode(y)) {\n                    x.forEachValue(y, z, function(da, ea, fa) {\n                        aa.append(ea, fa);\n                    });\n                }\n                 else {\n                    var ba = w(y);\n                    for (var ca in ba) {\n                        aa.append(ca, ba[ca]);;\n                    };\n                }\n            \n            };\n            return aa;\n        },\n        serialize: function(y, z) {\n            var aa = {\n            };\n            x.forEachValue(y, z, function(ba, ca, da) {\n                if ((ba === \"file\")) {\n                    return\n                };\n                x._serializeHelper(aa, ca, da);\n            });\n            return x._serializeFix(aa);\n        },\n        _serializeHelper: function(y, z, aa) {\n            var ba = Object.prototype.hasOwnProperty, ca = /([^\\]]+)\\[([^\\]]*)\\](.*)/.exec(z);\n            if (ca) {\n                if ((!y[ca[1]] || !ba.call(y, ca[1]))) {\n                    var da;\n                    y[ca[1]] = da = {\n                    };\n                    if ((y[ca[1]] !== da)) {\n                        return\n                    };\n                }\n            ;\n                var ea = 0;\n                if ((ca[2] === \"\")) {\n                    while ((y[ca[1]][ea] !== undefined)) {\n                        ea++;;\n                    };\n                }\n                 else ea = ca[2];\n            ;\n                if ((ca[3] === \"\")) {\n                    y[ca[1]][ea] = aa;\n                }\n                 else x._serializeHelper(y[ca[1]], ea.concat(ca[3]), aa);\n            ;\n            }\n             else y[z] = aa;\n        ;\n        },\n        _serializeFix: function(y) {\n            for (var z in y) {\n                if ((y[z] instanceof Object)) {\n                    y[z] = x._serializeFix(y[z]);\n                };\n            };\n            var aa = Object.keys(y);\n            if (((aa.length === 0) || aa.some(isNaN))) {\n                return y\n            };\n            aa.sort(function(da, ea) {\n                return (da - ea);\n            });\n            var ba = 0, ca = aa.every(function(da) {\n                return (+da === ba++);\n            });\n            if (ca) {\n                return aa.map(function(da) {\n                    return y[da];\n                })\n            };\n            return y;\n        },\n        post: function(y, z, aa) {\n            var ba = document.createElement(\"form\");\n            ba.action = y.toString();\n            ba.method = \"POST\";\n            ba.style.display = \"none\";\n            if (aa) {\n                ba.target = aa;\n            };\n            z.fb_dtsg = o.fb_dtsg;\n            x.createHiddenInputs(z, ba);\n            m.getRootElement().appendChild(ba);\n            ba.submit();\n            return false;\n        },\n        createHiddenInputs: function(y, z, aa, ba) {\n            aa = (aa || {\n            });\n            var ca = w(y);\n            for (var da in ca) {\n                if ((ca[da] === null)) {\n                    continue;\n                };\n                if ((aa[da] && ba)) {\n                    aa[da].value = ca[da];\n                }\n                 else {\n                    var ea = k.create(\"input\", {\n                        type: \"hidden\",\n                        name: da,\n                        value: ca[da]\n                    });\n                    aa[da] = ea;\n                    z.appendChild(ea);\n                }\n            ;\n            };\n            return aa;\n        },\n        getFirstElement: function(y, z) {\n            z = (z || [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",\"input[type=\\\"button\\\"]\",\"input[type=\\\"submit\\\"]\",]);\n            var aa = [];\n            for (var ba = 0; (ba < z.length); ba++) {\n                aa = m.scry(y, z[ba]);\n                for (var ca = 0; (ca < aa.length); ca++) {\n                    var da = aa[ca];\n                    try {\n                        var fa = l.getElementPosition(da);\n                        if (((fa.y > 0) && (fa.x > 0))) {\n                            return da\n                        };\n                    } catch (ea) {\n                    \n                    };\n                };\n            };\n            return null;\n        },\n        focusFirst: function(y) {\n            var z = x.getFirstElement(y);\n            if (z) {\n                z.focus();\n                return true;\n            }\n        ;\n            return false;\n        }\n    };\n    e.exports = x;\n});\n__d(\"Locale\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h, i = {\n        isRTL: function() {\n            if ((h === undefined)) {\n                h = ((\"rtl\" === g.get(document.body, \"direction\")));\n            };\n            return h;\n        }\n    };\n    e.exports = i;\n});\n__d(\"getOverlayZIndex\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\");\n    function h(i, j) {\n        j = (j || document.body);\n        var k = [];\n        while ((i && (i !== j))) {\n            k.push(i);\n            i = i.parentNode;\n        };\n        if ((i !== j)) {\n            return 0\n        };\n        for (var l = (k.length - 1); (l >= 0); l--) {\n            var m = k[l];\n            if ((g.get(m, \"position\") != \"static\")) {\n                var n = parseInt(g.get(m, \"z-index\"), 10);\n                if (!isNaN(n)) {\n                    return n\n                };\n            }\n        ;\n        };\n        return 0;\n    };\n    e.exports = h;\n});\n__d(\"Dialog\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Button\",\"ContextualThing\",\"CSS\",\"DOM\",\"Event\",\"Focus\",\"Form\",\"HTML\",\"Keys\",\"Locale\",\"Parent\",\"Run\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"bind\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"getObjectValues\",\"getOverlayZIndex\",\"removeFromArray\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Button\"), l = b(\"ContextualThing\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Event\"), p = b(\"Focus\"), q = b(\"Form\"), r = b(\"HTML\"), s = b(\"Keys\"), t = b(\"Locale\"), u = b(\"Parent\"), v = b(\"Run\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"UserAgent\"), z = b(\"Vector\"), aa = b(\"bind\"), ba = b(\"copyProperties\"), ca = b(\"createArrayFrom\"), da = b(\"emptyFunction\"), ea = b(\"getObjectValues\"), fa = b(\"getOverlayZIndex\"), ga = b(\"removeFromArray\"), ha = b(\"shield\"), ia = b(\"tx\"), ja = function() {\n        var la = document.body, ma = document.createElement(\"div\"), na = document.createElement(\"div\");\n        la.insertBefore(ma, la.firstChild);\n        la.insertBefore(na, la.firstChild);\n        ma.style.position = \"fixed\";\n        ma.style.top = \"20px\";\n        var oa = (ma.offsetTop !== na.offsetTop);\n        la.removeChild(ma);\n        la.removeChild(na);\n        ja = da.thatReturns(oa);\n        return oa;\n    };\n    function ka(la) {\n        this._show_loading = true;\n        this._auto_focus = true;\n        this._submit_on_enter = false;\n        this._fade_enabled = true;\n        this._onload_handlers = [];\n        this._top = 125;\n        this._uniqueID = (\"dialog_\" + ka._globalCount++);\n        this._content = null;\n        this._obj = null;\n        this._popup = null;\n        this._overlay = null;\n        this._shim = null;\n        this._causal_elem = null;\n        this._previous_focus = null;\n        this._buttons = [];\n        this._buildDialog();\n        if (la) {\n            this._setFromModel(la);\n        };\n        ka._init();\n    };\n    ba(ka, {\n        OK: {\n            name: \"ok\",\n            label: \"Okay\"\n        },\n        CANCEL: {\n            name: \"cancel\",\n            label: \"Cancel\",\n            className: \"inputaux\"\n        },\n        CLOSE: {\n            name: \"close\",\n            label: \"Close\"\n        },\n        NEXT: {\n            name: \"next\",\n            label: \"Next\"\n        },\n        SAVE: {\n            name: \"save\",\n            label: \"Save\"\n        },\n        SUBMIT: {\n            name: \"submit\",\n            label: \"Submit\"\n        },\n        CONFIRM: {\n            name: \"confirm\",\n            label: \"Confirm\"\n        },\n        DELETE: {\n            name: \"delete\",\n            label: \"Delete\"\n        },\n        _globalCount: 0,\n        _bottoms: [0,],\n        max_bottom: 0,\n        _updateMaxBottom: function() {\n            ka.max_bottom = Math.max.apply(Math, ka._bottoms);\n        }\n    });\n    ba(ka, {\n        OK_AND_CANCEL: [ka.OK,ka.CANCEL,],\n        _STANDARD_BUTTONS: [ka.OK,ka.CANCEL,ka.CLOSE,ka.SAVE,ka.SUBMIT,ka.CONFIRM,ka.DELETE,],\n        SIZE: {\n            WIDE: 555,\n            STANDARD: 445\n        },\n        _HALO_WIDTH: 10,\n        _BORDER_WIDTH: 1,\n        _PADDING_WIDTH: 10,\n        _PAGE_MARGIN: 40,\n        _stack: [],\n        _isUsingCSSBorders: function() {\n            return (y.ie() < 7);\n        },\n        newButton: function(la, ma, na, oa) {\n            var pa = {\n                name: la,\n                label: ma\n            };\n            if (na) {\n                pa.className = na;\n            };\n            if (oa) {\n                pa.handler = oa;\n            };\n            return pa;\n        },\n        getCurrent: function() {\n            var la = ka._stack;\n            return (la.length ? la[(la.length - 1)] : null);\n        },\n        hideCurrent: function() {\n            var la = ka.getCurrent();\n            (la && la.hide());\n        },\n        bootstrap: function(la, ma, na, oa, pa, qa) {\n            ma = (ma || {\n            });\n            ba(ma, new x(la).getQueryData());\n            oa = (oa || ((na ? \"GET\" : \"POST\")));\n            var ra = (u.byClass(qa, \"stat_elem\") || qa);\n            if ((ra && m.hasClass(ra, \"async_saving\"))) {\n                return false\n            };\n            var sa = new i().setReadOnly(!!na).setMethod(oa).setRelativeTo(qa).setStatusElement(ra).setURI(la).setNectarModuleDataSafe(qa).setData(ma), ta = new ka(pa).setCausalElement(qa).setAsync(sa);\n            ta.show();\n            return false;\n        },\n        showFromModel: function(la, ma) {\n            var na = new ka(la).setCausalElement(ma).show();\n            if (la.hiding) {\n                na.hide();\n            };\n        },\n        _init: function() {\n            this._init = da;\n            v.onLeave(ha(ka._tearDown, null, false));\n            h.subscribe(\"page_transition\", ha(ka._tearDown, null, true));\n            o.listen(document.documentElement, \"keydown\", function(event) {\n                if (((o.getKeyCode(event) == s.ESC) && !event.getModifiers().any)) {\n                    if (ka._escape()) {\n                        event.kill();\n                    };\n                }\n                 else if (((o.getKeyCode(event) == s.RETURN) && !event.getModifiers().any)) {\n                    if (ka._enter()) {\n                        event.kill();\n                    }\n                }\n            ;\n            });\n            o.listen(window, \"resize\", function(event) {\n                var la = ka.getCurrent();\n                (la && la._resetDialogObj());\n            });\n        },\n        _findButton: function(la, ma) {\n            if (la) {\n                for (var na = 0; (na < la.length); ++na) {\n                    if ((la[na].name == ma)) {\n                        return la[na]\n                    };\n                }\n            };\n            return null;\n        },\n        _tearDown: function(la) {\n            var ma = ka._stack.slice();\n            for (var na = (ma.length - 1); (na >= 0); na--) {\n                if ((((la && !ma[na]._cross_transition)) || ((!la && !ma[na]._cross_quickling)))) {\n                    ma[na].hide();\n                };\n            };\n        },\n        _escape: function() {\n            var la = ka.getCurrent();\n            if (!la) {\n                return false\n            };\n            var ma = la._semi_modal, na = la._buttons;\n            if ((!na.length && !ma)) {\n                return false\n            };\n            if ((ma && !na.length)) {\n                la.hide();\n                return true;\n            }\n        ;\n            var oa, pa = ka._findButton(na, \"cancel\");\n            if (la._cancelHandler) {\n                la.cancel();\n                return true;\n            }\n             else if (pa) {\n                oa = pa;\n            }\n             else if ((na.length == 1)) {\n                oa = na[0];\n            }\n             else return false\n            \n            \n        ;\n            la._handleButton(oa);\n            return true;\n        },\n        _enter: function() {\n            var la = ka.getCurrent();\n            if ((!la || !la._submit_on_enter)) {\n                return false\n            };\n            if ((document.activeElement != la._frame)) {\n                return false\n            };\n            var ma = la._buttons;\n            if (!ma) {\n                return false\n            };\n            la._handleButton(ma[0]);\n            return true;\n        },\n        call_or_eval: function(la, ma, na) {\n            if (!ma) {\n                return undefined\n            };\n            na = (na || {\n            });\n            if ((typeof ma == \"string\")) {\n                var oa = Object.keys(na).join(\", \");\n                ma = (eval)(((((\"({f: function(\" + oa) + \") { \") + ma) + \"}})\")).f;\n            }\n        ;\n            return ma.apply(la, ea(na));\n        }\n    });\n    ba(ka.prototype, {\n        _cross_quickling: false,\n        _cross_transition: false,\n        _loading: false,\n        _showing: false,\n        show: function() {\n            this._showing = true;\n            if (this._async_request) {\n                if (this._show_loading) {\n                    this.showLoading();\n                };\n            }\n             else this._update();\n        ;\n            return this;\n        },\n        showLoading: function() {\n            this._loading = true;\n            m.addClass(this._frame, \"dialog_loading_shown\");\n            this._renderDialog();\n            return this;\n        },\n        hide: function() {\n            if ((!this._showing && !this._loading)) {\n                return this\n            };\n            this._showing = false;\n            if (this._autohide_timeout) {\n                clearTimeout(this._autohide_timeout);\n                this._autohide_timeout = null;\n            }\n        ;\n            if ((this._fade_enabled && (ka._stack.length <= 1))) {\n                this._fadeOut();\n            }\n             else this._hide();\n        ;\n            return this;\n        },\n        cancel: function() {\n            if ((!this._cancelHandler || (this._cancelHandler() !== false))) {\n                this.hide();\n            };\n        },\n        getRoot: function() {\n            return this._obj;\n        },\n        getBody: function() {\n            return n.scry(this._obj, \"div.dialog_body\")[0];\n        },\n        getButtonElement: function(la) {\n            if ((typeof la == \"string\")) {\n                la = ka._findButton(this._buttons, la);\n            };\n            if ((!la || !la.name)) {\n                return null\n            };\n            var ma = n.scry(this._popup, \"input\"), na = function(oa) {\n                return (oa.name == la.name);\n            };\n            return (ma.filter(na)[0] || null);\n        },\n        getContentNode: function() {\n            return n.find(this._content, \"div.dialog_content\");\n        },\n        getFormData: function() {\n            return q.serialize(this.getContentNode());\n        },\n        setAllowCrossPageTransition: function(la) {\n            this._cross_transition = la;\n            return this;\n        },\n        setAllowCrossQuicklingNavigation: function(la) {\n            this._cross_quickling = la;\n            return this;\n        },\n        setShowing: function() {\n            this.show();\n            return this;\n        },\n        setHiding: function() {\n            this.hide();\n            return this;\n        },\n        setTitle: function(la) {\n            var ma = this._nodes.title, na = this._nodes.title_inner, oa = this._nodes.content;\n            n.setContent(na, this._format((la || \"\")));\n            m.conditionShow(ma, !!la);\n            m.conditionClass(oa, \"dialog_content_titleless\", !la);\n            return this;\n        },\n        setBody: function(la) {\n            n.setContent(this._nodes.body, this._format(la));\n            return this;\n        },\n        setExtraData: function(la) {\n            this._extra_data = la;\n            return this;\n        },\n        setReturnData: function(la) {\n            this._return_data = la;\n            return this;\n        },\n        setShowLoading: function(la) {\n            this._show_loading = la;\n            return this;\n        },\n        setCustomLoading: function(la) {\n            var ma = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, la);\n            n.setContent(this._frame, [this._nodes.title,this._nodes.content,ma,]);\n            return this;\n        },\n        setFullBleed: function(la) {\n            this._full_bleed = la;\n            this._updateWidth();\n            m.conditionClass(this._obj, \"full_bleed\", la);\n            return this;\n        },\n        setCausalElement: function(la) {\n            this._causal_elem = la;\n            return this;\n        },\n        setUserData: function(la) {\n            this._user_data = la;\n            return this;\n        },\n        getUserData: function() {\n            return this._user_data;\n        },\n        setAutohide: function(la) {\n            if (la) {\n                if (this._showing) {\n                    this._autohide_timeout = setTimeout(ha(this.hide, this), la);\n                }\n                 else this._autohide = la;\n            ;\n            }\n             else {\n                this._autohide = null;\n                if (this._autohide_timeout) {\n                    clearTimeout(this._autohide_timeout);\n                    this._autohide_timeout = null;\n                }\n            ;\n            }\n        ;\n            return this;\n        },\n        setSummary: function(la) {\n            var ma = this._nodes.summary;\n            n.setContent(ma, this._format((la || \"\")));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setButtons: function(la) {\n            var ma, na;\n            if (!((la instanceof Array))) {\n                ma = ca(arguments);\n            }\n             else ma = la;\n        ;\n            for (var oa = 0; (oa < ma.length); ++oa) {\n                if ((typeof ma[oa] == \"string\")) {\n                    na = ka._findButton(ka._STANDARD_BUTTONS, ma[oa]);\n                    ma[oa] = na;\n                }\n            ;\n            };\n            this._buttons = ma;\n            var pa = [];\n            if ((ma && (ma.length > 0))) {\n                for (var qa = 0; (qa < ma.length); qa++) {\n                    na = ma[qa];\n                    var ra = n.create(\"input\", {\n                        type: \"button\",\n                        name: (na.name || \"\"),\n                        value: na.label\n                    }), sa = n.create(\"label\", {\n                        className: \"uiButton uiButtonLarge uiButtonConfirm\"\n                    }, ra);\n                    if (na.className) {\n                        na.className.split(/\\s+/).forEach(function(ua) {\n                            m.addClass(sa, ua);\n                        });\n                        if (m.hasClass(sa, \"inputaux\")) {\n                            m.removeClass(sa, \"inputaux\");\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                        if (m.hasClass(sa, \"uiButtonSpecial\")) {\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        };\n                    }\n                ;\n                    if (na.icon) {\n                        n.prependContent(sa, n.create(\"img\", {\n                            src: na.icon,\n                            className: \"img mrs\"\n                        }));\n                    };\n                    if (na.disabled) {\n                        k.setEnabled(sa, false);\n                    };\n                    o.listen(ra, \"click\", this._handleButton.bind(this, na.name));\n                    for (var ta in na) {\n                        if (((ta.indexOf(\"data-\") === 0) && (ta.length > 5))) {\n                            ra.setAttribute(ta, na[ta]);\n                        };\n                    };\n                    pa.push(sa);\n                }\n            };\n            n.setContent(this._nodes.buttons, pa);\n            this._updateButtonVisibility();\n            return this;\n        },\n        setButtonsMessage: function(la) {\n            n.setContent(this._nodes.button_message, this._format((la || \"\")));\n            this._has_button_message = !!la;\n            this._updateButtonVisibility();\n            return this;\n        },\n        _updateButtonVisibility: function() {\n            var la = ((this._buttons.length > 0) || this._has_button_message);\n            m.conditionShow(this._nodes.button_wrapper, la);\n            m.conditionClass(this._obj, \"omitDialogFooter\", !la);\n        },\n        setClickButtonOnEnter: function(la, ma) {\n            this._clickOnEnterTarget = la;\n            if (!this._clickOnEnterListener) {\n                this._clickOnEnterListener = o.listen(this._nodes.body, \"keypress\", function(event) {\n                    var na = event.getTarget();\n                    if ((na && (na.id === this._clickOnEnterTarget))) {\n                        if ((o.getKeyCode(event) == s.RETURN)) {\n                            this._handleButton(ma);\n                            event.kill();\n                        }\n                    \n                    };\n                    return true;\n                }.bind(this));\n            };\n            return this;\n        },\n        setStackable: function(la, ma) {\n            this._is_stackable = la;\n            this._shown_while_stacked = (la && ma);\n            return this;\n        },\n        setHandler: function(la) {\n            this._handler = la;\n            return this;\n        },\n        setCancelHandler: function(la) {\n            this._cancelHandler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        setCloseHandler: function(la) {\n            this._close_handler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        clearHandler: function() {\n            return this.setHandler(null);\n        },\n        setPostURI: function(la, ma) {\n            if ((ma === undefined)) {\n                ma = true;\n            };\n            if (ma) {\n                this.setHandler(this._submitForm.bind(this, \"POST\", la));\n            }\n             else this.setHandler(function() {\n                q.post(la, this.getFormData());\n                this.hide();\n            }.bind(this));\n        ;\n            return this;\n        },\n        setGetURI: function(la) {\n            this.setHandler(this._submitForm.bind(this, \"GET\", la));\n            return this;\n        },\n        setModal: function(la) {\n            this._modal = la;\n            m.conditionClass(this._obj, \"generic_dialog_modal\", la);\n            return this;\n        },\n        setSemiModal: function(la) {\n            if (la) {\n                this.setModal(true);\n                this._semiModalListener = o.listen(this._obj, \"click\", function(ma) {\n                    if (!n.contains(this._popup, ma.getTarget())) {\n                        this.hide();\n                    };\n                }.bind(this));\n            }\n             else (this._semiModalListener && this._semiModalListener.remove());\n        ;\n            this._semi_modal = la;\n            return this;\n        },\n        setWideDialog: function(la) {\n            this._wide_dialog = la;\n            this._updateWidth();\n            return this;\n        },\n        setContentWidth: function(la) {\n            this._content_width = la;\n            this._updateWidth();\n            return this;\n        },\n        setTitleLoading: function(la) {\n            if ((la === undefined)) {\n                la = true;\n            };\n            var ma = n.find(this._popup, \"h2.dialog_title\");\n            if (ma) {\n                m.conditionClass(ma, \"loading\", la);\n            };\n            return this;\n        },\n        setSecure: function(la) {\n            m.conditionClass(this._nodes.title, \"secure\", la);\n            return this;\n        },\n        setClassName: function(la) {\n            la.split(/\\s+/).forEach(m.addClass.bind(m, this._obj));\n            return this;\n        },\n        setFadeEnabled: function(la) {\n            this._fade_enabled = la;\n            return this;\n        },\n        setFooter: function(la) {\n            var ma = this._nodes.footer;\n            n.setContent(ma, this._format((la || \"\")));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setAutoFocus: function(la) {\n            this._auto_focus = la;\n            return this;\n        },\n        setTop: function(la) {\n            this._top = la;\n            this._resetDialogObj();\n            return this;\n        },\n        onloadRegister: function(la) {\n            ca(la).forEach(function(ma) {\n                if ((typeof ma == \"string\")) {\n                    ma = new Function(ma);\n                };\n                this._onload_handlers.push(ma.bind(this));\n            }.bind(this));\n            return this;\n        },\n        setAsyncURL: function(la) {\n            return this.setAsync(new i(la));\n        },\n        setAsync: function(la) {\n            var ma = function(ua) {\n                if ((this._async_request != la)) {\n                    return\n                };\n                this._async_request = null;\n                var va = ua.getPayload(), wa = va;\n                if (this._loading) {\n                    this._showing = true;\n                };\n                if ((typeof wa == \"string\")) {\n                    this.setBody(wa);\n                }\n                 else this._setFromModel(wa);\n            ;\n                this._update();\n            }.bind(this), na = la.getData();\n            na.__d = 1;\n            la.setData(na);\n            var oa = (la.getHandler() || da);\n            la.setHandler(function(ua) {\n                oa(ua);\n                ma(ua);\n            });\n            var pa = la, qa = (pa.getErrorHandler() || da), ra = (pa.getTransportErrorHandler() || da), sa = function() {\n                this._async_request = null;\n                this._loading = false;\n                if ((this._showing && this._shown_while_stacked)) {\n                    this._update();\n                }\n                 else this._hide(this._is_stackable);\n            ;\n            }.bind(this), ta = (pa.getServerDialogCancelHandler() || sa);\n            pa.setAllowCrossPageTransition(this._cross_transition).setErrorHandler(function(ua) {\n                sa();\n                qa(ua);\n            }).setTransportErrorHandler(function(ua) {\n                sa();\n                ra(ua);\n            }).setServerDialogCancelHandler(ta);\n            la.send();\n            this._async_request = la;\n            if (this._showing) {\n                this.show();\n            };\n            return this;\n        },\n        _format: function(la) {\n            if ((typeof la == \"string\")) {\n                la = r(la);\n            }\n             else la = r.replaceJSONWrapper(la);\n        ;\n            if ((la instanceof r)) {\n                la.setDeferred(true);\n            };\n            return la;\n        },\n        _update: function() {\n            if (!this._showing) {\n                return\n            };\n            if (((this._autohide && !this._async_request) && !this._autohide_timeout)) {\n                this._autohide_timeout = setTimeout(aa(this, \"hide\"), this._autohide);\n            };\n            m.removeClass(this._frame, \"dialog_loading_shown\");\n            this._loading = false;\n            this._renderDialog();\n            this._runOnloads();\n            this._previous_focus = document.activeElement;\n            p.set(this._frame);\n        },\n        _runOnloads: function() {\n            for (var la = 0; (la < this._onload_handlers.length); ++la) {\n                try {\n                    this._onload_handlers[la]();\n                } catch (ma) {\n                \n                };\n            };\n            this._onload_handlers = [];\n        },\n        _updateWidth: function() {\n            var la = (2 * ka._BORDER_WIDTH);\n            if (ka._isUsingCSSBorders()) {\n                la += (2 * ka._HALO_WIDTH);\n            };\n            if (this._content_width) {\n                la += this._content_width;\n                if (!this._full_bleed) {\n                    la += (2 * ka._PADDING_WIDTH);\n                };\n            }\n             else if (this._wide_dialog) {\n                la += ka.SIZE.WIDE;\n            }\n             else la += ka.SIZE.STANDARD;\n            \n        ;\n            this._popup.style.width = (la + \"px\");\n        },\n        _updateZIndex: function() {\n            if ((!this._hasSetZIndex && this._causal_elem)) {\n                var la = fa(this._causal_elem), ma = this._causal_elem;\n                while ((!la && (ma = l.getContext(ma)))) {\n                    la = fa(ma);;\n                };\n                this._hasSetZIndex = (la > ((this._modal ? 400 : 200)));\n                w.set(this._obj, \"z-index\", (this._hasSetZIndex ? la : \"\"));\n            }\n        ;\n        },\n        _renderDialog: function() {\n            this._updateZIndex();\n            this._pushOntoStack();\n            this._obj.style.height = (((this._modal && (y.ie() < 7))) ? (z.getDocumentDimensions().y + \"px\") : null);\n            if ((this._obj && this._obj.style.display)) {\n                this._obj.style.visibility = \"hidden\";\n                this._obj.style.display = \"\";\n                this.resetDialogPosition();\n                this._obj.style.visibility = \"\";\n                this._obj.dialog = this;\n            }\n             else this.resetDialogPosition();\n        ;\n            clearInterval(this.active_hiding);\n            this.active_hiding = setInterval(this._activeResize.bind(this), 500);\n            this._submit_on_enter = false;\n            if (this._auto_focus) {\n                var la = q.getFirstElement(this._content, [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",]);\n                if (la) {\n                    q.focusFirst.bind(this, this._content).defer();\n                }\n                 else this._submit_on_enter = true;\n            ;\n            }\n        ;\n            var ma = (z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y);\n            ka._bottoms.push(ma);\n            this._bottom = ma;\n            ka._updateMaxBottom();\n            return this;\n        },\n        _buildDialog: function() {\n            this._obj = n.create(\"div\", {\n                className: \"generic_dialog\",\n                id: this._uniqueID\n            });\n            this._obj.style.display = \"none\";\n            n.appendContent(document.body, this._obj);\n            if (!this._popup) {\n                this._popup = n.create(\"div\", {\n                    className: \"generic_dialog_popup\"\n                });\n            };\n            this._obj.appendChild(this._popup);\n            if (((y.ie() < 7) && !this._shim)) {\n                j.loadModules([\"IframeShim\",], function(xa) {\n                    this._shim = new xa(this._popup);\n                });\n            };\n            m.addClass(this._obj, \"pop_dialog\");\n            if (t.isRTL()) {\n                m.addClass(this._obj, \"pop_dialog_rtl\");\n            };\n            var la;\n            if (ka._isUsingCSSBorders()) {\n                la = ((\"\\u003Cdiv class=\\\"pop_container_advanced\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_content\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003C/div\\u003E\");\n            }\n             else la = ((((((((\"\\u003Cdiv class=\\\"pop_container\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_verticalslab\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_horizontalslab\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_topleft\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_topright\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_bottomright\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_bottomleft\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_content pop_content_old\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003C/div\\u003E\");\n        ;\n            n.setContent(this._popup, r(la));\n            var ma = n.find(this._popup, \"div.pop_content\");\n            ma.setAttribute(\"tabIndex\", \"0\");\n            ma.setAttribute(\"role\", \"alertdialog\");\n            this._frame = this._content = ma;\n            var na = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, \"Loading...\"), oa = n.create(\"span\"), pa = n.create(\"h2\", {\n                className: \"dialog_title hidden_elem\",\n                id: (\"title_\" + this._uniqueID)\n            }, oa), qa = n.create(\"div\", {\n                className: \"dialog_summary hidden_elem\"\n            }), ra = n.create(\"div\", {\n                className: \"dialog_body\"\n            }), sa = n.create(\"div\", {\n                className: \"rfloat mlm\"\n            }), ta = n.create(\"div\", {\n                className: \"dialog_buttons_msg\"\n            }), ua = n.create(\"div\", {\n                className: \"dialog_buttons clearfix hidden_elem\"\n            }, [sa,ta,]), va = n.create(\"div\", {\n                className: \"dialog_footer hidden_elem\"\n            }), wa = n.create(\"div\", {\n                className: \"dialog_content\"\n            }, [qa,ra,ua,va,]);\n            this._nodes = {\n                summary: qa,\n                body: ra,\n                buttons: sa,\n                button_message: ta,\n                button_wrapper: ua,\n                footer: va,\n                content: wa,\n                title: pa,\n                title_inner: oa\n            };\n            n.setContent(this._frame, [pa,wa,na,]);\n        },\n        _updateShim: function() {\n            return (this._shim && this._shim.show());\n        },\n        _activeResize: function() {\n            if ((this.last_offset_height != this._content.offsetHeight)) {\n                this.last_offset_height = this._content.offsetHeight;\n                this.resetDialogPosition();\n            }\n        ;\n        },\n        resetDialogPosition: function() {\n            if (!this._popup) {\n                return\n            };\n            this._resetDialogObj();\n            this._updateShim();\n        },\n        _resetDialogObj: function() {\n            var la = (2 * ka._PAGE_MARGIN), ma = z.getViewportDimensions(), na = (ma.x - la), oa = (ma.y - la), pa = (2 * ka._HALO_WIDTH), qa = z.getElementDimensions(this._content), ra = (qa.x + pa), sa = (qa.y + pa), ta = this._top, ua = (na - ra), va = (oa - sa);\n            if ((va < 0)) {\n                ta = ka._PAGE_MARGIN;\n            }\n             else if ((ta > va)) {\n                ta = (ka._PAGE_MARGIN + ((Math.max(va, 0) / 2)));\n            }\n        ;\n            var wa = ja();\n            if (!wa) {\n                ta += z.getScrollPosition().y;\n            };\n            w.set(this._popup, \"marginTop\", (ta + \"px\"));\n            var xa = (wa && (((ua < 0) || (va < 0))));\n            m.conditionClass(this._obj, \"generic_dialog_fixed_overflow\", xa);\n            m.conditionClass(document.documentElement, \"generic_dialog_overflow_mode\", xa);\n        },\n        _fadeOut: function(la) {\n            if (!this._popup) {\n                return\n            };\n            try {\n                new g(this._obj).duration(0).checkpoint().to(\"opacity\", 0).hide().duration(250).ondone(this._hide.bind(this, la)).go();\n            } catch (ma) {\n                this._hide(la);\n            };\n        },\n        _hide: function(la) {\n            if (this._obj) {\n                this._obj.style.display = \"none\";\n            };\n            m.removeClass(document.documentElement, \"generic_dialog_overflow_mode\");\n            this._updateShim();\n            clearInterval(this.active_hiding);\n            if (this._bottom) {\n                var ma = ka._bottoms;\n                ma.splice(ma.indexOf(this._bottom), 1);\n                ka._updateMaxBottom();\n            }\n        ;\n            if (((this._previous_focus && document.activeElement) && n.contains(this._obj, document.activeElement))) {\n                p.set(this._previous_focus);\n            };\n            if (la) {\n                return\n            };\n            this.destroy();\n        },\n        destroy: function() {\n            this._popFromStack();\n            clearInterval(this.active_hiding);\n            if (this._obj) {\n                n.remove(this._obj);\n                this._obj = null;\n                (this._shim && this._shim.hide());\n                this._shim = null;\n            }\n        ;\n            (this._clickOnEnterListener && this._clickOnEnterListener.remove());\n            if (this._close_handler) {\n                this._close_handler({\n                    return_data: this._return_data\n                });\n            };\n        },\n        _handleButton: function(la) {\n            if ((typeof la == \"string\")) {\n                la = ka._findButton(this._buttons, la);\n            };\n            var ma = ka.call_or_eval(la, la.handler);\n            if ((ma === false)) {\n                return\n            };\n            if ((la.name == \"cancel\")) {\n                this.cancel();\n            }\n             else if ((ka.call_or_eval(this, this._handler, {\n                button: la\n            }) !== false)) {\n                this.hide();\n            }\n        ;\n        },\n        _submitForm: function(la, ma, na) {\n            var oa = this.getFormData();\n            if (na) {\n                oa[na.name] = na.label;\n            };\n            if (this._extra_data) {\n                ba(oa, this._extra_data);\n            };\n            var pa = new i().setURI(ma).setData(oa).setMethod(la).setNectarModuleDataSafe(this._causal_elem).setReadOnly((la == \"GET\"));\n            this.setAsync(pa);\n            return false;\n        },\n        _setFromModel: function(la) {\n            var ma = {\n            };\n            ba(ma, la);\n            for (var na in ma) {\n                if ((na == \"onloadRegister\")) {\n                    this.onloadRegister(ma[na]);\n                    continue;\n                }\n            ;\n                var oa = this[((\"set\" + na.substr(0, 1).toUpperCase()) + na.substr(1))];\n                oa.apply(this, ca(ma[na]));\n            };\n        },\n        _updateBottom: function() {\n            var la = (z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y);\n            ka._bottoms[(ka._bottoms.length - 1)] = la;\n            ka._updateMaxBottom();\n        },\n        _pushOntoStack: function() {\n            var la = ka._stack;\n            if (!la.length) {\n                h.inform(\"layer_shown\", {\n                    type: \"Dialog\"\n                });\n            };\n            ga(la, this);\n            la.push(this);\n            for (var ma = (la.length - 2); (ma >= 0); ma--) {\n                var na = la[ma];\n                if ((!na._is_stackable && !na._async_request)) {\n                    na._hide();\n                }\n                 else if (!na._shown_while_stacked) {\n                    na._hide(true);\n                }\n            ;\n            };\n        },\n        _popFromStack: function() {\n            var la = ka._stack, ma = ((la[(la.length - 1)] === this));\n            ga(la, this);\n            if (la.length) {\n                if (ma) {\n                    la[(la.length - 1)].show();\n                };\n            }\n             else h.inform(\"layer_hidden\", {\n                type: \"Dialog\"\n            });\n        ;\n        }\n    });\n    e.exports = ka;\n    a.Dialog = ka;\n});\n__d(\"DialogHideOnSuccess\", [\"copyProperties\",\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"CSS\"), i = b(\"cx\");\n    function j(k) {\n        this._layer = k;\n    };\n    g(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, event) {\n            if (h.hasClass(event.getTarget(), \"-cx-PRIVATE-uiDialog__form\")) {\n                this._layer.hide();\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"DocumentTitle\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = document.title, i = null, j = 1500, k = [], l = 0, m = null, n = false;\n    function o() {\n        if ((k.length > 0)) {\n            if (!n) {\n                p(k[l].title);\n                l = (++l % k.length);\n            }\n             else q();\n        ;\n        }\n         else {\n            clearInterval(m);\n            m = null;\n            q();\n        }\n    ;\n    };\n    function p(s) {\n        document.title = s;\n        n = true;\n    };\n    function q() {\n        r.set((i || h), true);\n        n = false;\n    };\n    var r = {\n        get: function() {\n            return h;\n        },\n        set: function(s, t) {\n            document.title = s;\n            if (!t) {\n                h = s;\n                i = null;\n                g.inform(\"update_title\", s);\n            }\n             else i = s;\n        ;\n        },\n        blink: function(s) {\n            var t = {\n                title: s\n            };\n            k.push(t);\n            if ((m === null)) {\n                m = setInterval(o, j);\n            };\n            return {\n                stop: function() {\n                    var u = k.indexOf(t);\n                    if ((u >= 0)) {\n                        k.splice(u, 1);\n                        if ((l > u)) {\n                            l--;\n                        }\n                         else if (((l == u) && (l == k.length))) {\n                            l = 0;\n                        }\n                    ;\n                    }\n                ;\n                }\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"DoublyLinkedListMap\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h() {\n        this._head = null;\n        this._tail = null;\n        this._nodes = {\n        };\n        this._nodeCount = 0;\n    };\n    g(h.prototype, {\n        get: function(i) {\n            return (this._nodes[i] ? this._nodes[i].data : null);\n        },\n        getIndex: function(i) {\n            for (var j = this._head, k = 0; j; j = j.next, k++) {\n                if ((j.key === i)) {\n                    return k\n                };\n            };\n            return null;\n        },\n        _insert: function(i, j, k, l) {\n            ((k && !this._nodes[k]) && (k = null));\n            var m = (((k && this._nodes[k])) || ((l ? this._head : this._tail))), n = {\n                data: j,\n                key: i,\n                next: null,\n                prev: null\n            };\n            if (m) {\n                this.remove(i);\n                if (l) {\n                    n.prev = m.prev;\n                    (m.prev && (m.prev.next = n));\n                    m.prev = n;\n                    n.next = m;\n                }\n                 else {\n                    n.next = m.next;\n                    (m.next && (m.next.prev = n));\n                    m.next = n;\n                    n.prev = m;\n                }\n            ;\n            }\n        ;\n            ((n.prev === null) && (this._head = n));\n            ((n.next === null) && (this._tail = n));\n            this._nodes[i] = n;\n            this._nodeCount++;\n            return this;\n        },\n        insertBefore: function(i, j, k) {\n            return this._insert(i, j, k, true);\n        },\n        insertAfter: function(i, j, k) {\n            return this._insert(i, j, k, false);\n        },\n        prepend: function(i, j) {\n            return this.insertBefore(i, j, (this._head && this._head.key));\n        },\n        append: function(i, j) {\n            return this.insertAfter(i, j, (this._tail && this._tail.key));\n        },\n        remove: function(i) {\n            var j = this._nodes[i];\n            if (j) {\n                var k = j.next, l = j.prev;\n                (k && (k.prev = l));\n                (l && (l.next = k));\n                ((this._head === j) && (this._head = k));\n                ((this._tail === j) && (this._tail = l));\n                delete this._nodes[i];\n                this._nodeCount--;\n            }\n        ;\n            return this;\n        },\n        find: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                if (i(j.data)) {\n                    return j.key\n                };\n            };\n            return null;\n        },\n        reduce: function(i, j) {\n            for (var k = this._head; k; k = k.next) {\n                j = i(k.data, j);;\n            };\n            return j;\n        },\n        exists: function(i) {\n            return !!this._nodes[i];\n        },\n        isEmpty: function() {\n            return !this._head;\n        },\n        reset: function() {\n            this._head = null;\n            this._tail = null;\n            this._nodes = {\n            };\n            this._nodeCount = 0;\n        },\n        map: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                i(j.data);;\n            };\n        },\n        getCount: function() {\n            return this._nodeCount;\n        },\n        getHead: function() {\n            return (this._head && this._head.data);\n        },\n        getTail: function() {\n            return (this._tail && this._tail.data);\n        },\n        getNext: function(i) {\n            var j = this._nodes[i];\n            if ((j && j.next)) {\n                return j.next.data\n            };\n            return null;\n        },\n        getPrev: function(i) {\n            var j = this._nodes[i];\n            if ((j && j.prev)) {\n                return j.prev.data\n            };\n            return null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"throttle\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j, k, l) {\n        return i(j, k, l, false, false);\n    };\n    g(h, {\n        acrossTransitions: function(j, k, l) {\n            return i(j, k, l, true, false);\n        },\n        withBlocking: function(j, k, l) {\n            return i(j, k, l, false, true);\n        }\n    });\n    function i(j, k, l, m, n) {\n        if ((k == null)) {\n            k = 100;\n        };\n        var o, p, q;\n        function r() {\n            p = Date.now();\n            if (o) {\n                j.apply(l, o);\n                o = null;\n                q = setTimeout(r, k, !m);\n            }\n             else q = false;\n        ;\n        };\n        return function s() {\n            o = arguments;\n            if ((!q || (((Date.now() - p) > k)))) {\n                if (n) {\n                    r();\n                }\n                 else q = setTimeout(r, 0, !m);\n            \n            };\n        };\n    };\n    e.exports = h;\n});\n__d(\"FullScreen\", [\"Event\",\"Arbiter\",\"CSS\",\"UserAgent\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = b(\"throttle\"), m = {\n    }, n = k(new h(), {\n        listenForEvent: function(p) {\n            var q = l(this.onChange, 0, this);\n            if (!m[p.id]) {\n                m[p.id] = true;\n                g.listen(p, {\n                    webkitfullscreenchange: q,\n                    mozfullscreenchange: q,\n                    fullscreenchange: q\n                });\n            }\n        ;\n        },\n        enableFullScreen: function(p) {\n            this.listenForEvent(p);\n            if (p.webkitRequestFullScreen) {\n                if (j.chrome()) {\n                    p.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n                }\n                 else p.webkitRequestFullScreen();\n            ;\n            }\n             else if (p.mozRequestFullScreen) {\n                p.mozRequestFullScreen();\n            }\n             else if (p.requestFullScreen) {\n                p.requestFullScreen();\n            }\n             else return false\n            \n            \n        ;\n            return true;\n        },\n        disableFullScreen: function() {\n            if (document.webkitCancelFullScreen) {\n                document.webkitCancelFullScreen();\n            }\n             else if (document.mozCancelFullScreen) {\n                document.mozCancelFullScreen();\n            }\n             else if (document.cancelFullScreen) {\n                document.cancelFullScreen();\n            }\n             else if (document.exitFullScreen) {\n                document.exitFullScreen();\n            }\n             else return false\n            \n            \n            \n        ;\n            return true;\n        },\n        isFullScreen: function() {\n            return (((document.webkitIsFullScreen || document.fullScreen) || document.mozFullScreen));\n        },\n        toggleFullScreen: function(p) {\n            if (this.isFullScreen()) {\n                this.disableFullScreen();\n                return false;\n            }\n             else return this.enableFullScreen(p)\n        ;\n            return false;\n        },\n        onChange: function() {\n            var p = this.isFullScreen();\n            i.conditionClass(document.body, \"fullScreen\", p);\n            this.inform(\"changed\");\n        },\n        isSupported: function() {\n            return (((((document.webkitCancelFullScreen && j.chrome())) || document.mozCancelFullScreen) || document.cancelFullScreen) || document.exitFullScreen);\n        }\n    }), o = l(n.onChange, 0, n);\n    g.listen(document, {\n        webkitfullscreenchange: o,\n        mozfullscreenchange: o,\n        fullscreenchange: o\n    });\n    e.exports = n;\n});\n__d(\"HistoryManager\", [\"Event\",\"function-extensions\",\"Cookie\",\"Env\",\"URI\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"goOrReplace\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Cookie\"), i = b(\"Env\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = b(\"copyProperties\"), m = b(\"emptyFunction\"), n = b(\"goOrReplace\"), o = {\n        _IFRAME_BASE_URI: \"http://static.ak.facebook.com/common/history_manager.php\",\n        history: null,\n        current: 0,\n        fragment: null,\n        _setIframeSrcFragment: function(p) {\n            p = p.toString();\n            var q = (o.history.length - 1);\n            o.iframe.src = ((((o._IFRAME_BASE_URI + \"?|index=\") + q) + \"#\") + encodeURIComponent(p));\n            return o;\n        },\n        getIframeSrcFragment: function() {\n            return decodeURIComponent(j(o.iframe.contentWindow.document.location.href).getFragment());\n        },\n        nextframe: function(p, q) {\n            if (q) {\n                o._setIframeSrcFragment(p);\n                return;\n            }\n        ;\n            if ((p !== undefined)) {\n                o.iframeQueue.push(p);\n            }\n             else {\n                o.iframeQueue.splice(0, 1);\n                o.iframeTimeout = null;\n                o.checkURI();\n            }\n        ;\n            if ((o.iframeQueue.length && !o.iframeTimeout)) {\n                var r = o.iframeQueue[0];\n                o.iframeTimeout = setTimeout(function() {\n                    o._setIframeSrcFragment(r);\n                }, 100, false);\n            }\n        ;\n        },\n        isInitialized: function() {\n            return !!o._initialized;\n        },\n        init: function() {\n            if ((!i.ALLOW_TRANSITION_IN_IFRAME && (window != window.top))) {\n                return\n            };\n            if (o._initialized) {\n                return o\n            };\n            var p = j(), q = (p.getFragment() || \"\");\n            if ((q.charAt(0) === \"!\")) {\n                q = q.substr(1);\n                p.setFragment(q);\n            }\n        ;\n            if ((j.getRequestURI(false).getProtocol().toLowerCase() == \"https\")) {\n                o._IFRAME_BASE_URI = \"https://s-static.ak.facebook.com/common/history_manager.php\";\n            };\n            l(o, {\n                _initialized: true,\n                fragment: q,\n                orig_fragment: q,\n                history: [p,],\n                callbacks: [],\n                lastChanged: Date.now(),\n                canonical: j(\"#\"),\n                fragmentTimeout: null,\n                user: 0,\n                iframeTimeout: null,\n                iframeQueue: [],\n                enabled: true,\n                debug: m\n            });\n            if ((window.history && history.pushState)) {\n                this.lastURI = document.URL;\n                window.history.replaceState(this.lastURI, null);\n                g.listen(window, \"popstate\", function(r) {\n                    if (((r && r.state) && (o.lastURI != r.state))) {\n                        o.lastURI = r.state;\n                        o.lastChanged = Date.now();\n                        o.notify(j(r.state).getUnqualifiedURI().toString());\n                    }\n                ;\n                }.bind(o));\n                if (((k.webkit() < 534) || (k.chrome() <= 13))) {\n                    setInterval(o.checkURI, 42, false);\n                    o._updateRefererURI(this.lastURI);\n                }\n            ;\n                return o;\n            }\n        ;\n            o._updateRefererURI(j.getRequestURI(false));\n            if (((k.webkit() < 500) || (k.firefox() < 2))) {\n                o.enabled = false;\n                return o;\n            }\n        ;\n            if ((k.ie() < 8)) {\n                o.iframe = document.createElement(\"iframe\");\n                l(o.iframe.style, {\n                    width: \"0\",\n                    height: \"0\",\n                    frameborder: \"0\",\n                    left: \"0\",\n                    top: \"0\",\n                    position: \"absolute\"\n                });\n                o._setIframeSrcFragment(q);\n                document.body.insertBefore(o.iframe, document.body.firstChild);\n            }\n             else if ((\"onhashchange\" in window)) {\n                g.listen(window, \"hashchange\", function() {\n                    o.checkURI.bind(o).defer();\n                });\n            }\n             else setInterval(o.checkURI, 42, false);\n            \n        ;\n            return o;\n        },\n        registerURIHandler: function(p) {\n            o.callbacks.push(p);\n            return o;\n        },\n        setCanonicalLocation: function(p) {\n            o.canonical = j(p);\n            return o;\n        },\n        notify: function(p) {\n            if ((p == o.orig_fragment)) {\n                p = o.canonical.getFragment();\n            };\n            for (var q = 0; (q < o.callbacks.length); q++) {\n                try {\n                    if (o.callbacks[q](p)) {\n                        return true\n                    };\n                } catch (r) {\n                \n                };\n            };\n            return false;\n        },\n        checkURI: function() {\n            if (((Date.now() - o.lastChanged) < 400)) {\n                return\n            };\n            if ((window.history && history.pushState)) {\n                var p = j(document.URL).removeQueryData(\"ref\").toString(), q = j(o.lastURI).removeQueryData(\"ref\").toString();\n                if ((p != q)) {\n                    o.lastChanged = Date.now();\n                    o.lastURI = p;\n                    if ((k.webkit() < 534)) {\n                        o._updateRefererURI(p);\n                    };\n                    o.notify(j(p).getUnqualifiedURI().toString());\n                }\n            ;\n                return;\n            }\n        ;\n            if (((k.ie() < 8) && o.iframeQueue.length)) {\n                return\n            };\n            if ((k.webkit() && (window.history.length == 200))) {\n                if (!o.warned) {\n                    o.warned = true;\n                };\n                return;\n            }\n        ;\n            var r = j().getFragment();\n            if ((r.charAt(0) == \"!\")) {\n                r = r.substr(1);\n            };\n            if ((k.ie() < 8)) {\n                r = o.getIframeSrcFragment();\n            };\n            r = r.replace(/%23/g, \"#\");\n            if ((r != o.fragment.replace(/%23/g, \"#\"))) {\n                o.debug([r,\" vs \",o.fragment,\"whl: \",window.history.length,\"QHL: \",o.history.length,].join(\" \"));\n                for (var s = (o.history.length - 1); (s >= 0); --s) {\n                    if ((o.history[s].getFragment().replace(/%23/g, \"#\") == r)) {\n                        break;\n                    };\n                };\n                ++o.user;\n                if ((s >= 0)) {\n                    o.go((s - o.current));\n                }\n                 else o.go((\"#\" + r));\n            ;\n                --o.user;\n            }\n        ;\n        },\n        _updateRefererURI: function(p) {\n            p = p.toString();\n            if (((p.charAt(0) != \"/\") && (p.indexOf(\"//\") == -1))) {\n                return\n            };\n            var q = new j(window.location);\n            if (q.isFacebookURI()) {\n                var r = (q.getPath() + window.location.search);\n            }\n             else var r = \"\"\n        ;\n            var s = j(p).getQualifiedURI().setFragment(r).toString(), t = 2048;\n            if ((s.length > t)) {\n                s = (s.substring(0, t) + \"...\");\n            };\n            h.set(\"x-referer\", s);\n        },\n        go: function(p, q, r) {\n            if ((window.history && history.pushState)) {\n                (q || (typeof (p) == \"number\"));\n                var s = j(p).removeQueryData(\"ref\").toString();\n                o.lastChanged = Date.now();\n                this.lastURI = s;\n                if (r) {\n                    window.history.replaceState(p, null, s);\n                }\n                 else window.history.pushState(p, null, s);\n            ;\n                if ((k.webkit() < 534)) {\n                    o._updateRefererURI(p);\n                };\n                return false;\n            }\n        ;\n            o.debug((\"go: \" + p));\n            if ((q === undefined)) {\n                q = true;\n            };\n            if (!o.enabled) {\n                if (!q) {\n                    return false\n                }\n            };\n            if ((typeof (p) == \"number\")) {\n                if (!p) {\n                    return false\n                };\n                var t = (p + o.current), u = Math.max(0, Math.min((o.history.length - 1), t));\n                o.current = u;\n                t = (o.history[u].getFragment() || o.orig_fragment);\n                t = j(t).removeQueryData(\"ref\").getUnqualifiedURI().toString();\n                o.fragment = t;\n                o.lastChanged = Date.now();\n                if ((k.ie() < 8)) {\n                    if (o.fragmentTimeout) {\n                        clearTimeout(o.fragmentTimeout);\n                    };\n                    o._temporary_fragment = t;\n                    o.fragmentTimeout = setTimeout(function() {\n                        window.location.hash = (\"#!\" + t);\n                        delete o._temporary_fragment;\n                    }, 750, false);\n                    if (!o.user) {\n                        o.nextframe(t, r);\n                    };\n                }\n                 else if (!o.user) {\n                    n(window.location, ((window.location.href.split(\"#\")[0] + \"#!\") + t), r);\n                }\n            ;\n                if (q) {\n                    o.notify(t);\n                };\n                o._updateRefererURI(t);\n                return false;\n            }\n        ;\n            p = j(p);\n            if ((p.getDomain() == j().getDomain())) {\n                p = j((\"#\" + p.getUnqualifiedURI()));\n            };\n            var v = o.history[o.current].getFragment(), w = p.getFragment();\n            if (((w == v) || (((v == o.orig_fragment) && (w == o.canonical.getFragment()))))) {\n                if (q) {\n                    o.notify(w);\n                };\n                o._updateRefererURI(w);\n                return false;\n            }\n        ;\n            if (r) {\n                o.current--;\n            };\n            var x = (((o.history.length - o.current)) - 1);\n            o.history.splice((o.current + 1), x);\n            o.history.push(j(p));\n            return o.go(1, q, r);\n        },\n        getCurrentFragment: function() {\n            var p = ((o._temporary_fragment !== undefined) ? o._temporary_fragment : j.getRequestURI(false).getFragment());\n            return ((p == o.orig_fragment) ? o.canonical.getFragment() : p);\n        }\n    };\n    e.exports = o;\n});\n__d(\"InputSelection\", [\"DOM\",\"Focus\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Focus\"), i = {\n        get: function(j) {\n            if (!document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                }\n            };\n            var k = document.selection.createRange();\n            if ((k.parentElement() !== j)) {\n                return {\n                    start: 0,\n                    end: 0\n                }\n            };\n            var l = j.value.length;\n            if (g.isNodeOfType(j, \"input\")) {\n                return {\n                    start: -k.moveStart(\"character\", -l),\n                    end: -k.moveEnd(\"character\", -l)\n                };\n            }\n             else {\n                var m = k.duplicate();\n                m.moveToElementText(j);\n                m.setEndPoint(\"StartToEnd\", k);\n                var n = (l - m.text.length);\n                m.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: (l - m.text.length),\n                    end: n\n                };\n            }\n        ;\n        },\n        set: function(j, k, l) {\n            if ((typeof l == \"undefined\")) {\n                l = k;\n            };\n            if (document.selection) {\n                if ((j.tagName == \"TEXTAREA\")) {\n                    var m = ((j.value.slice(0, k).match(/\\r/g) || [])).length, n = ((j.value.slice(k, l).match(/\\r/g) || [])).length;\n                    k -= m;\n                    l -= (m + n);\n                }\n            ;\n                var o = j.createTextRange();\n                o.collapse(true);\n                o.moveStart(\"character\", k);\n                o.moveEnd(\"character\", (l - k));\n                o.select();\n            }\n             else {\n                j.selectionStart = k;\n                j.selectionEnd = Math.min(l, j.value.length);\n                h.set(j);\n            }\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSONPTransport\", [\"ArbiterMixin\",\"DOM\",\"HTML\",\"URI\",\"asyncCallback\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"URI\"), k = b(\"asyncCallback\"), l = b(\"copyProperties\"), m = {\n    }, n = 2, o = \"jsonp\", p = \"iframe\";\n    function q(s) {\n        delete m[s];\n    };\n    function r(s, t) {\n        this._type = s;\n        this._uri = t;\n        m[this.getID()] = this;\n    };\n    l(r, {\n        respond: function(s, t, u) {\n            var v = m[s];\n            if (v) {\n                if (!u) {\n                    q(s);\n                };\n                if ((v._type == p)) {\n                    t = JSON.parse(JSON.stringify(t));\n                };\n                k(v.handleResponse.bind(v), \"json\")(t);\n            }\n             else {\n                var w = a.ErrorSignal;\n                if ((w && !u)) {\n                    w.logJSError(\"ajax\", {\n                        error: \"UnexpectedJsonResponse\",\n                        extra: {\n                            id: s,\n                            uri: (((t.payload && t.payload.uri)) || \"\")\n                        }\n                    });\n                };\n            }\n        ;\n        }\n    });\n    l(r.prototype, g, {\n        getID: function() {\n            return (this._id || (this._id = n++));\n        },\n        hasFinished: function() {\n            return !((this.getID() in m));\n        },\n        getRequestURI: function() {\n            return j(this._uri).addQueryData({\n                __a: 1,\n                __adt: this.getID(),\n                __req: (\"jsonp_\" + this.getID())\n            });\n        },\n        getTransportFrame: function() {\n            if (this._iframe) {\n                return this._iframe\n            };\n            var s = (\"transport_frame_\" + this.getID()), t = i(((\"\\u003Ciframe class=\\\"hidden_elem\\\" name=\\\"\" + s) + \"\\\" src=\\\"javascript:void(0)\\\" /\\u003E\"));\n            return this._iframe = h.appendContent(document.body, t)[0];\n        },\n        send: function() {\n            if ((this._type === o)) {\n                (function() {\n                    h.appendContent(document.body, h.create(\"script\", {\n                        src: this.getRequestURI().toString(),\n                        type: \"text/javascript\"\n                    }));\n                }).bind(this).defer();\n            }\n             else this.getTransportFrame().src = this.getRequestURI().toString();\n        ;\n        },\n        handleResponse: function(s) {\n            this.inform(\"response\", s);\n            if (this.hasFinished()) {\n                this._cleanup.bind(this).defer();\n            };\n        },\n        abort: function() {\n            if (this._aborted) {\n                return\n            };\n            this._aborted = true;\n            this._cleanup();\n            q(this.getID());\n            this.inform(\"abort\");\n        },\n        _cleanup: function() {\n            if (this._iframe) {\n                h.remove(this._iframe);\n                this._iframe = null;\n            }\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"JSXDOM\", [\"DOM\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"flattenArray\"), i = [\"a\",\"br\",\"button\",\"canvas\",\"checkbox\",\"dd\",\"div\",\"dl\",\"dt\",\"em\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"hr\",\"i\",\"iframe\",\"img\",\"input\",\"label\",\"li\",\"option\",\"p\",\"pre\",\"select\",\"span\",\"strong\",\"table\",\"tbody\",\"thead\",\"td\",\"textarea\",\"th\",\"tr\",\"ul\",\"video\",], j = {\n    };\n    i.forEach(function(k) {\n        var l = function(m, n) {\n            if ((arguments.length > 2)) {\n                n = Array.prototype.slice.call(arguments, 1);\n            };\n            if ((!n && m)) {\n                n = m.children;\n                delete m.children;\n            }\n        ;\n            if (n) {\n                n = (Array.isArray(n) ? h(n) : h([n,]));\n            };\n            return g.create(k, m, n);\n        };\n        j[k] = l;\n    });\n    e.exports = j;\n});\n__d(\"LinkController\", [\"Event\",\"DataStore\",\"Parent\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DataStore\"), i = b(\"Parent\"), j = b(\"trackReferrer\"), k = \"LinkControllerHandler\", l = [], m = [];\n    function n(event) {\n        var r = i.byTag(event.getTarget(), \"a\"), s = (r && r.getAttribute(\"href\", 2));\n        if ((((!s || r.rel) || !p(s)) || h.get(r, k))) {\n            return\n        };\n        var t = g.listen(r, \"click\", function(u) {\n            if ((s.charAt((s.length - 1)) == \"#\")) {\n                u.prevent();\n                return;\n            }\n        ;\n            j(r, s);\n            o(r, u);\n        });\n        h.set(r, k, t);\n    };\n    function o(r, event) {\n        if ((((r.target || r.rel) || event.getModifiers().any) || ((event.which && (event.which != 1))))) {\n            return\n        };\n        var s = l.concat(m);\n        for (var t = 0, u = s.length; (t < u); t++) {\n            if ((s[t](r, event) === false)) {\n                return event.prevent()\n            };\n        };\n    };\n    function p(r) {\n        var s = r.match(/^(\\w+):/);\n        return (!s || s[1].match(/^http/i));\n    };\n    var q = {\n        registerHandler: function(r) {\n            l.push(r);\n        },\n        registerFallbackHandler: function(r) {\n            m.push(r);\n        }\n    };\n    g.listen(document.documentElement, \"mousedown\", n);\n    g.listen(document.documentElement, \"keydown\", n);\n    e.exports = q;\n});\n__d(\"MenuDeprecated\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"Keys\",\"Parent\",\"Style\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"Parent\"), o = b(\"Style\"), p = b(\"UserAgent\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\"), s = \"menu:mouseover\", t = null;\n    function u(ea) {\n        if (i.hasClass(ea, \"uiMenuContainer\")) {\n            return ea\n        };\n        return n.byClass(ea, \"uiMenu\");\n    };\n    function v(ea) {\n        return n.byClass(ea, \"uiMenuItem\");\n    };\n    function w(ea) {\n        if (document.activeElement) {\n            var fa = v(document.activeElement);\n            return ea.indexOf(fa);\n        }\n    ;\n        return -1;\n    };\n    function x(ea) {\n        return k.find(ea, \"a.itemAnchor\");\n    };\n    function y(ea) {\n        return i.hasClass(ea, \"checked\");\n    };\n    function z(ea) {\n        return (!i.hasClass(ea, \"disabled\") && (o.get(ea, \"display\") !== \"none\"));\n    };\n    function aa(event) {\n        var ea = document.activeElement;\n        if (((!ea || !n.byClass(ea, \"uiMenu\")) || !k.isInputNode(ea))) {\n            var fa = v(event.getTarget());\n            (fa && da.focusItem(fa));\n        }\n    ;\n    };\n    function ba(ea) {\n        (p.firefox() && x(ea).blur());\n        da.inform(\"select\", {\n            menu: u(ea),\n            item: ea\n        });\n    };\n    var ca = function() {\n        ca = r;\n        var ea = {\n        };\n        ea.click = function(event) {\n            var fa = v(event.getTarget());\n            if ((fa && z(fa))) {\n                ba(fa);\n                var ga = x(fa), ha = ga.href, ia = ga.getAttribute(\"rel\");\n                return (((ia && (ia !== \"ignore\"))) || ((ha && (ha.charAt((ha.length - 1)) !== \"#\"))));\n            }\n        ;\n        };\n        ea.keydown = function(event) {\n            var fa = event.getTarget();\n            if (event.getModifiers().any) {\n                return\n            };\n            if ((!t || k.isInputNode(fa))) {\n                return\n            };\n            var ga = g.getKeyCode(event), ha;\n            switch (ga) {\n              case m.UP:\n            \n              case m.DOWN:\n                var ia = da.getEnabledItems(t);\n                ha = w(ia);\n                da.focusItem(ia[(ha + (((ga === m.UP) ? -1 : 1)))]);\n                return false;\n              case m.SPACE:\n                var ja = v(fa);\n                if (ja) {\n                    ba(ja);\n                    event.prevent();\n                }\n            ;\n                break;\n              default:\n                var ka = String.fromCharCode(ga).toLowerCase(), la = da.getEnabledItems(t);\n                ha = w(la);\n                var ma = ha, na = la.length;\n                while ((((~ha && ((ma = (++ma % na)) !== ha))) || ((!~ha && (++ma < na))))) {\n                    var oa = da.getItemLabel(la[ma]);\n                    if ((oa && (oa.charAt(0).toLowerCase() === ka))) {\n                        da.focusItem(la[ma]);\n                        return false;\n                    }\n                ;\n                };\n            };\n        };\n        g.listen(document.body, ea);\n    }, da = q(new h(), {\n        focusItem: function(ea) {\n            if ((ea && z(ea))) {\n                this._removeSelected(u(ea));\n                i.addClass(ea, \"selected\");\n                x(ea).focus();\n            }\n        ;\n        },\n        getEnabledItems: function(ea) {\n            return da.getItems(ea).filter(z);\n        },\n        getCheckedItems: function(ea) {\n            return da.getItems(ea).filter(y);\n        },\n        getItems: function(ea) {\n            return k.scry(ea, \"li.uiMenuItem\");\n        },\n        getItemLabel: function(ea) {\n            return (ea.getAttribute(\"data-label\", 2) || \"\");\n        },\n        isItemChecked: function(ea) {\n            return i.hasClass(ea, \"checked\");\n        },\n        autoregister: function(ea, fa, ga) {\n            ea.subscribe(\"show\", function() {\n                da.register(fa, ga);\n            });\n            ea.subscribe(\"hide\", function() {\n                da.unregister(fa);\n            });\n        },\n        register: function(ea, fa) {\n            ea = u(ea);\n            ca();\n            if (!j.get(ea, s)) {\n                j.set(ea, s, g.listen(ea, \"mouseover\", aa));\n            };\n            if ((fa !== false)) {\n                t = ea;\n            };\n        },\n        setItemEnabled: function(ea, fa) {\n            if ((!fa && !k.scry(ea, \"span.disabledAnchor\")[0])) {\n                k.appendContent(ea, k.create(\"span\", {\n                    className: (k.find(ea, \"a\").className + \" disabledAnchor\")\n                }, l(x(ea).innerHTML)));\n            };\n            i.conditionClass(ea, \"disabled\", !fa);\n        },\n        toggleItem: function(ea) {\n            var fa = !da.isItemChecked(ea);\n            da.setItemChecked(ea, fa);\n        },\n        setItemChecked: function(ea, fa) {\n            i.conditionClass(ea, \"checked\", fa);\n            x(ea).setAttribute(\"aria-checked\", fa);\n        },\n        unregister: function(ea) {\n            ea = u(ea);\n            var fa = j.remove(ea, s);\n            (fa && fa.remove());\n            t = null;\n            this._removeSelected(ea);\n        },\n        _removeSelected: function(ea) {\n            da.getItems(ea).filter(function(fa) {\n                return i.hasClass(fa, \"selected\");\n            }).forEach(function(fa) {\n                i.removeClass(fa, \"selected\");\n            });\n        }\n    });\n    e.exports = da;\n});\n__d(\"coalesce\", [], function(a, b, c, d, e, f) {\n    function g() {\n        for (var h = 0; (h < arguments.length); ++h) {\n            if ((arguments[h] != null)) {\n                return arguments[h]\n            };\n        };\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"OnVisible\", [\"Arbiter\",\"DOM\",\"Event\",\"Parent\",\"Run\",\"Vector\",\"ViewportBounds\",\"coalesce\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"Parent\"), k = b(\"Run\"), l = b(\"Vector\"), m = b(\"ViewportBounds\"), n = b(\"coalesce\"), o = b(\"copyProperties\"), p = b(\"queryThenMutateDOM\"), q = [], r, s = 0, t = [], u, v, w, x, y;\n    function z() {\n        q.forEach(function(fa) {\n            fa.remove();\n        });\n        if (v) {\n            v.remove();\n            u.remove();\n            r.unsubscribe();\n            v = u = r = null;\n        }\n    ;\n        s = 0;\n        q.length = 0;\n    };\n    function aa() {\n        if (!q.length) {\n            z();\n            return;\n        }\n    ;\n        t.length = 0;\n        w = l.getScrollPosition().y;\n        x = l.getViewportDimensions().y;\n        y = m.getTop();\n        for (var fa = 0; (fa < q.length); ++fa) {\n            var ga = q[fa];\n            if (isNaN(ga.elementHeight)) {\n                t.push(fa);\n            };\n            ga.elementHeight = l.getElementDimensions(ga.element).y;\n            ga.elementPos = l.getElementPosition(ga.element);\n            ga.hidden = j.byClass(ga.element, \"hidden_elem\");\n            if (ga.scrollArea) {\n                ga.scrollAreaHeight = l.getElementDimensions(ga.scrollArea).y;\n                ga.scrollAreaY = l.getElementPosition(ga.scrollArea).y;\n            }\n        ;\n        };\n        s = fa;\n    };\n    function ba() {\n        for (var fa = (Math.min(q.length, s) - 1); (fa >= 0); --fa) {\n            var ga = q[fa];\n            if (((!ga.elementPos || ga.removed) || ga.hidden)) {\n                q.splice(fa, 1);\n                continue;\n            }\n        ;\n            var ha = ((w + x) + ga.buffer), ia = false;\n            if ((ha > ga.elementPos.y)) {\n                var ja = (!ga.strict || ((((w + y) - ga.buffer) < ((ga.elementPos.y + ga.elementHeight)))));\n                ia = ja;\n                if ((ia && ga.scrollArea)) {\n                    var ka = ((ga.scrollAreaY + ga.scrollAreaHeight) + ga.buffer);\n                    ia = (((ga.elementPos.y > (ga.scrollAreaY - ga.buffer))) && ((ga.elementPos.y < ka)));\n                }\n            ;\n            }\n        ;\n            if ((ga.inverse ? !ia : ia)) {\n                ga.remove();\n                ga.handler((t.indexOf(fa) !== -1));\n            }\n        ;\n        };\n    };\n    function ca() {\n        da();\n        if (q.length) {\n            return\n        };\n        v = i.listen(window, \"scroll\", da);\n        u = i.listen(window, \"resize\", da);\n        r = g.subscribe(\"dom-scroll\", da);\n    };\n    function da() {\n        p(aa, ba, \"OnVisible/positionCheck\");\n    };\n    function ea(fa, ga, ha, ia, ja, ka) {\n        this.element = fa;\n        this.handler = ga;\n        this.strict = ha;\n        this.buffer = n(ia, 300);\n        this.inverse = n(ja, false);\n        this.scrollArea = (ka || null);\n        if (this.scrollArea) {\n            this.scrollAreaListener = i.listen(h.find(ka, \".uiScrollableAreaWrap\"), \"scroll\", this.checkBuffer);\n        };\n        if ((q.length === 0)) {\n            k.onLeave(z);\n        };\n        ca();\n        q.push(this);\n    };\n    o(ea, {\n        checkBuffer: da\n    });\n    o(ea.prototype, {\n        remove: function() {\n            this.removed = true;\n            if (this.scrollAreaListener) {\n                this.scrollAreaListener.remove();\n            };\n        },\n        reset: function() {\n            this.elementHeight = null;\n            this.removed = false;\n            ((q.indexOf(this) === -1) && q.push(this));\n            ca();\n        },\n        setBuffer: function(fa) {\n            this.buffer = fa;\n            da();\n        },\n        checkBuffer: function() {\n            da();\n        }\n    });\n    e.exports = ea;\n});\n__d(\"OnloadHooks\", [\"Arbiter\",\"ErrorUtils\",\"InitialJSLoader\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"InitialJSLoader\"), j = b(\"OnloadEvent\");\n    function k() {\n        var r = a.CavalryLogger;\n        if ((!window.loaded && r)) {\n            r.getInstance().setTimeStamp(\"t_prehooks\");\n        };\n        n(\"onloadhooks\");\n        if ((!window.loaded && r)) {\n            r.getInstance().setTimeStamp(\"t_hooks\");\n        };\n        window.loaded = true;\n        g.inform(\"uipage_onload\", true, g.BEHAVIOR_STATE);\n    };\n    function l() {\n        n(\"onafterloadhooks\");\n        window.afterloaded = true;\n    };\n    function m(r, s) {\n        return h.applyWithGuard(r, null, null, function(t) {\n            t.event_type = s;\n            t.category = \"runhook\";\n        });\n    };\n    function n(r) {\n        var s = (((r == \"onbeforeleavehooks\")) || ((r == \"onbeforeunloadhooks\")));\n        do {\n            var t = window[r];\n            if (!t) {\n                break;\n            };\n            if (!s) {\n                window[r] = null;\n            };\n            for (var u = 0; (u < t.length); u++) {\n                var v = m(t[u], r);\n                if ((s && v)) {\n                    return v\n                };\n            };\n        } while ((!s && window[r]));\n    };\n    function o() {\n        if (!window.loaded) {\n            window.loaded = true;\n            n(\"onloadhooks\");\n        }\n    ;\n        if (!window.afterloaded) {\n            window.afterloaded = true;\n            n(\"onafterloadhooks\");\n        }\n    ;\n    };\n    function p() {\n        g.registerCallback(k, [j.ONLOAD_DOMCONTENT_CALLBACK,i.INITIAL_JS_READY,]);\n        g.registerCallback(l, [j.ONLOAD_DOMCONTENT_CALLBACK,j.ONLOAD_CALLBACK,i.INITIAL_JS_READY,]);\n        g.subscribe(j.ONBEFOREUNLOAD, function(r, s) {\n            s.warn = (n(\"onbeforeleavehooks\") || n(\"onbeforeunloadhooks\"));\n            if (!s.warn) {\n                window.loaded = false;\n                window.afterloaded = false;\n            }\n        ;\n        }, g.SUBSCRIBE_NEW);\n        g.subscribe(j.ONUNLOAD, function(r, s) {\n            n(\"onunloadhooks\");\n            n(\"onafterunloadhooks\");\n        }, g.SUBSCRIBE_NEW);\n    };\n    var q = {\n        _onloadHook: k,\n        _onafterloadHook: l,\n        runHook: m,\n        runHooks: n,\n        keepWindowSetAsLoaded: o\n    };\n    p();\n    a.OnloadHooks = e.exports = q;\n});\n__d(\"areEqual\", [], function(a, b, c, d, e, f) {\n    var g = function(k, l, m, n) {\n        if ((k === l)) {\n            return ((k !== 0) || ((1 / k) == (1 / l)))\n        };\n        if (((k == null) || (l == null))) {\n            return false\n        };\n        if (((typeof k != \"object\") || (typeof l != \"object\"))) {\n            return false\n        };\n        var o = Object.prototype.toString, p = o.call(k);\n        if ((p != o.call(l))) {\n            return false\n        };\n        switch (p) {\n          case \"[object String]\":\n            return (k == String(l));\n          case \"[object Number]\":\n            return ((isNaN(k) || isNaN(l)) ? false : (k == Number(l)));\n          case \"[object Date]\":\n        \n          case \"[object Boolean]\":\n            return (+k == +l);\n          case \"[object RegExp]\":\n            return ((((k.source == l.source) && (k.global == l.global)) && (k.multiline == l.multiline)) && (k.ignoreCase == l.ignoreCase));\n        };\n        var q = m.length;\n        while (q--) {\n            if ((m[q] == k)) {\n                return (n[q] == l)\n            };\n        };\n        m.push(k);\n        n.push(l);\n        var r = 0;\n        if ((p === \"[object Array]\")) {\n            r = k.length;\n            if ((r !== l.length)) {\n                return false\n            };\n            while (r--) {\n                if (!g(k[r], l[r], m, n)) {\n                    return false\n                };\n            };\n        }\n         else {\n            if ((k.constructor !== l.constructor)) {\n                return false\n            };\n            if ((k.hasOwnProperty(\"valueOf\") && l.hasOwnProperty(\"valueOf\"))) {\n                return (k.valueOf() == l.valueOf())\n            };\n            var s = Object.keys(k);\n            if ((s.length != Object.keys(l).length)) {\n                return false\n            };\n            for (var t = 0; (t < s.length); t++) {\n                if (!g(k[s[t]], l[s[t]], m, n)) {\n                    return false\n                };\n            };\n        }\n    ;\n        m.pop();\n        n.pop();\n        return true;\n    }, h = [], i = [], j = function(k, l) {\n        var m = (h.length ? h.pop() : []), n = (i.length ? i.pop() : []), o = g(k, l, m, n);\n        m.length = 0;\n        n.length = 0;\n        h.push(m);\n        i.push(n);\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"computeRelativeURI\", [\"URI\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"isEmpty\");\n    function i(k, l) {\n        if (!l) {\n            return k\n        };\n        if ((l.charAt(0) == \"/\")) {\n            return l\n        };\n        var m = k.split(\"/\").slice(0, -1);\n        (m[0] !== \"\");\n        l.split(\"/\").forEach(function(n) {\n            if (!((n == \".\"))) {\n                if ((n == \"..\")) {\n                    if ((m.length > 1)) {\n                        m = m.slice(0, -1);\n                    };\n                }\n                 else m.push(n);\n            \n            };\n        });\n        return m.join(\"/\");\n    };\n    function j(k, l) {\n        var m = new g(), n = l;\n        k = new g(k);\n        l = new g(l);\n        if ((l.getDomain() && !l.isFacebookURI())) {\n            return n\n        };\n        var o = k, p = [\"Protocol\",\"Domain\",\"Port\",\"Path\",\"QueryData\",\"Fragment\",];\n        p.forEach(function(q) {\n            var r = ((q == \"Path\") && (o === k));\n            if (r) {\n                m.setPath(i(k.getPath(), l.getPath()));\n            };\n            if (!h(l[(\"get\" + q)]())) {\n                o = l;\n            };\n            if (!r) {\n                m[(\"set\" + q)](o[(\"get\" + q)]());\n            };\n        });\n        return m;\n    };\n    e.exports = j;\n});\n__d(\"escapeJSQuotes\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if ((((typeof h == \"undefined\") || (h == null)) || !h.valueOf())) {\n            return \"\"\n        };\n        return h.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, \"\\\\x22\").replace(/'/g, \"\\\\'\").replace(/</g, \"\\\\x3c\").replace(/>/g, \"\\\\x3e\").replace(/&/g, \"\\\\x26\");\n    };\n    e.exports = g;\n});\n__d(\"PageTransitions\", [\"Arbiter\",\"Dialog\",\"DOMQuery\",\"DOMScroll\",\"Env\",\"Event\",\"Form\",\"HistoryManager\",\"JSLogger\",\"LinkController\",\"OnloadHooks\",\"Parent\",\"URI\",\"UserAgent\",\"Vector\",\"areEqual\",\"clickRefAction\",\"computeRelativeURI\",\"copyProperties\",\"escapeJSQuotes\",\"ge\",\"goOrReplace\",\"htmlize\",\"setTimeoutAcrossTransitions\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Dialog\"), i = b(\"DOMQuery\"), j = b(\"DOMScroll\"), k = b(\"Env\"), l = b(\"Event\"), m = b(\"Form\"), n = b(\"HistoryManager\"), o = b(\"JSLogger\"), p = b(\"LinkController\"), q = b(\"OnloadHooks\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"areEqual\"), w = b(\"clickRefAction\"), x = b(\"computeRelativeURI\"), y = b(\"copyProperties\"), z = b(\"escapeJSQuotes\"), aa = b(\"ge\"), ba = b(\"goOrReplace\"), ca = b(\"htmlize\"), da = b(\"setTimeoutAcrossTransitions\"), ea = b(\"startsWith\"), fa = b(\"tx\"), ga = b(\"userAction\"), ha = {\n    };\n    function ia(ta, ua) {\n        ha[ta.getUnqualifiedURI()] = ua;\n    };\n    function ja(ta) {\n        return ha[ta.getUnqualifiedURI()];\n    };\n    function ka(ta) {\n        delete ha[ta.getUnqualifiedURI()];\n    };\n    var la = null, ma = null;\n    function na(ta) {\n        ma = ta;\n        da(function() {\n            ma = null;\n        }, 0);\n    };\n    function oa(event) {\n        if (ma) {\n            if (!event.isDefaultPrevented()) {\n                pa(ma);\n                sa.lookBusy(ma);\n                ra.go(ma.getAttribute(\"href\"));\n            }\n        ;\n            event.prevent();\n        }\n         else {\n            la = event.getTarget();\n            da(function() {\n                la = null;\n            }, 0);\n        }\n    ;\n    };\n    function pa(ta) {\n        var ua = ta.getAttribute(\"href\"), va = x(ra._most_recent_uri.getQualifiedURI(), ua).toString();\n        if ((ua != va)) {\n            ta.setAttribute(\"href\", va);\n        };\n    };\n    function qa(event) {\n        var ta = event.getTarget();\n        if ((m.getAttribute(ta, \"rel\") || m.getAttribute(ta, \"target\"))) {\n            return\n        };\n        w(\"form\", ta, event).set_namespace(\"page_transition\");\n        var ua = ga(\"page_transitions\", ta, event, {\n            mode: \"DEDUP\"\n        }).uai_fallback(null, \"form\"), va = a.ArbiterMonitor;\n        if (va) {\n            va.initUA(ua, [ta,]);\n        };\n        var wa = new s((m.getAttribute(ta, \"action\") || \"\")), xa = x(ra._most_recent_uri, wa);\n        ta.setAttribute(\"action\", xa.toString());\n        if ((((m.getAttribute(ta, \"method\") || \"GET\")).toUpperCase() === \"GET\")) {\n            var ya = m.serialize(ta), za = la;\n            if (((za && (((i.isNodeOfType(za, \"input\") && (za.type === \"submit\")) || (za = r.byTag(za, \"button\"))))) && za.name)) {\n                ya[za.name] = za.value;\n            };\n            ra.go(xa.addQueryData(ya));\n            event.kill();\n        }\n    ;\n    };\n    var ra = {\n        _transition_handlers: [],\n        _scroll_locked: false,\n        isInitialized: function() {\n            return !!ra._initialized;\n        },\n        _init: function() {\n            if (k.DISABLE_PAGE_TRANSITIONS) {\n                return\n            };\n            if ((!k.ALLOW_TRANSITION_IN_IFRAME && (window != window.top))) {\n                return\n            };\n            if (ra._initialized) {\n                return ra\n            };\n            ra._initialized = true;\n            var ta = s.getRequestURI(false), ua = ta.getUnqualifiedURI(), va = s(ua).setFragment(null), wa = ua.getFragment();\n            if (((wa.charAt(0) === \"!\") && (va.toString() === wa.substr(1)))) {\n                ua = va;\n            };\n            y(ra, {\n                _current_uri: ua,\n                _most_recent_uri: ua,\n                _next_uri: ua\n            });\n            var xa;\n            if (ea(ta.getFragment(), \"/\")) {\n                xa = ta.getFragment();\n            }\n             else xa = ua;\n        ;\n            n.init().setCanonicalLocation((\"#\" + xa)).registerURIHandler(ra._historyManagerHandler);\n            p.registerFallbackHandler(na);\n            l.listen(document, \"click\", oa, l.Priority._BUBBLE);\n            l.listen(document, \"submit\", qa, l.Priority._BUBBLE);\n            l.listen(window, \"scroll\", function() {\n                if (!ra._scroll_locked) {\n                    ia(ra._current_uri, u.getScrollPosition());\n                };\n            });\n            return ra;\n        },\n        registerHandler: function(ta, ua) {\n            ra._init();\n            ua = (ua || 5);\n            if (!ra._transition_handlers[ua]) {\n                ra._transition_handlers[ua] = [];\n            };\n            ra._transition_handlers[ua].push(ta);\n        },\n        getCurrentURI: function(ta) {\n            if ((!ra._current_uri && !ta)) {\n                return new s(ra._most_recent_uri)\n            };\n            return new s(ra._current_uri);\n        },\n        getMostRecentURI: function() {\n            return new s(ra._most_recent_uri);\n        },\n        getNextURI: function() {\n            return new s(ra._next_uri);\n        },\n        go: function(ta, ua) {\n            var va = new s(ta).removeQueryData(\"quickling\").getQualifiedURI();\n            o.create(\"pagetransition\").debug(\"go\", {\n                uri: va.toString()\n            });\n            ka(va);\n            (!ua && w(\"uri\", {\n                href: va.toString()\n            }, null, \"INDIRECT\"));\n            sa.lookBusy();\n            ra._loadPage(va, function(wa) {\n                if (wa) {\n                    n.go(va.toString(), false, ua);\n                }\n                 else ba(window.location, va, ua);\n            ;\n            });\n        },\n        _historyManagerHandler: function(ta) {\n            if ((ta.charAt(0) != \"/\")) {\n                return false\n            };\n            w(\"h\", {\n                href: ta\n            });\n            ga(\"page_transitions\").uai(null, \"history_manager\");\n            ra._loadPage(new s(ta), function(ua) {\n                if (!ua) {\n                    ba(window.location, ta, true);\n                };\n            });\n            return true;\n        },\n        _loadPage: function(ta, ua) {\n            if ((s(ta).getFragment() && v(s(ta).setFragment(null).getQualifiedURI(), s(ra._current_uri).setFragment(null).getQualifiedURI()))) {\n                if (ra.restoreScrollPosition(ta)) {\n                    ra._current_uri = ra._most_recent_uri = ta;\n                    sa.stopLookingBusy();\n                    return;\n                }\n            \n            };\n            var va;\n            if (ra._current_uri) {\n                va = ja(ra._current_uri);\n            };\n            ra._current_uri = null;\n            ra._next_uri = ta;\n            if (va) {\n                j.scrollTo(va, false);\n            };\n            var wa = function() {\n                ra._scroll_locked = true;\n                var ya = ra._handleTransition(ta);\n                (ua && ua(ya));\n            }, xa = q.runHooks(\"onbeforeleavehooks\");\n            if (xa) {\n                sa.stopLookingBusy();\n                ra._warnBeforeLeaving(xa, wa);\n            }\n             else wa();\n        ;\n        },\n        _handleTransition: function(ta) {\n            window.onbeforeleavehooks = undefined;\n            sa.lookBusy();\n            if (!ta.isSameOrigin()) {\n                return false\n            };\n            var ua = (window.AsyncRequest && window.AsyncRequest.getLastID());\n            g.inform(\"pre_page_transition\", {\n                from: ra.getMostRecentURI(),\n                to: ta\n            });\n            for (var va = (ra._transition_handlers.length - 1); (va >= 0); --va) {\n                var wa = ra._transition_handlers[va];\n                if (!wa) {\n                    continue;\n                };\n                for (var xa = (wa.length - 1); (xa >= 0); --xa) {\n                    if ((wa[xa](ta) === true)) {\n                        var ya = {\n                            sender: this,\n                            uri: ta,\n                            id: ua\n                        };\n                        try {\n                            g.inform(\"page_transition\", ya);\n                        } catch (za) {\n                        \n                        };\n                        return true;\n                    }\n                     else wa.splice(xa, 1);\n                ;\n                };\n            };\n            return false;\n        },\n        unifyURI: function() {\n            ra._current_uri = ra._most_recent_uri = ra._next_uri;\n        },\n        transitionComplete: function(ta) {\n            ra._executeCompletionCallback();\n            sa.stopLookingBusy();\n            ra.unifyURI();\n            if (!ta) {\n                ra.restoreScrollPosition(ra._current_uri);\n            };\n            try {\n                if ((document.activeElement && (document.activeElement.nodeName === \"A\"))) {\n                    document.activeElement.blur();\n                };\n            } catch (ua) {\n            \n            };\n        },\n        _executeCompletionCallback: function() {\n            if (ra._completionCallback) {\n                ra._completionCallback();\n            };\n            ra._completionCallback = null;\n        },\n        setCompletionCallback: function(ta) {\n            ra._completionCallback = ta;\n        },\n        rewriteCurrentURI: function(ta, ua) {\n            ra.registerHandler(function() {\n                if ((ta == ra.getMostRecentURI().getUnqualifiedURI().toString())) {\n                    ra.transitionComplete();\n                    return true;\n                }\n            ;\n            });\n            ra.go(ua, true);\n        },\n        _warnBeforeLeaving: function(ta, ua) {\n            new h().setTitle(\"Are you sure you want to leave this page?\").setBody(ca(ta)).setButtons([{\n                name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: ua\n            },{\n                name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        restoreScrollPosition: function(ta) {\n            ra._scroll_locked = false;\n            var ua = ja(ta);\n            if (ua) {\n                j.scrollTo(ua, false);\n                return true;\n            }\n        ;\n            function va(ya) {\n                if (!ya) {\n                    return null\n                };\n                var za = ((\"a[name='\" + z(ya)) + \"']\");\n                return (i.scry(document.body, za)[0] || aa(ya));\n            };\n            var wa = va(s(ta).getFragment());\n            if (wa) {\n                var xa = u.getElementPosition(wa);\n                xa.x = 0;\n                j.scrollTo(xa);\n                return true;\n            }\n        ;\n            return false;\n        }\n    }, sa = (window._BusyUIManager || {\n        _looking_busy: false,\n        _original_cursors: [],\n        lookBusy: function(ta) {\n            if (ta) {\n                sa._giveProgressCursor(ta);\n            };\n            if (sa._looking_busy) {\n                return\n            };\n            sa._looking_busy = true;\n            sa._giveProgressCursor(document.documentElement);\n        },\n        stopLookingBusy: function() {\n            if (!sa._looking_busy) {\n                return\n            };\n            sa._looking_busy = false;\n            while (sa._original_cursors.length) {\n                var ta = sa._original_cursors.pop(), ua = ta[0], va = ta[1];\n                if (ua.style) {\n                    ua.style.cursor = (va || \"\");\n                };\n            };\n        },\n        _giveProgressCursor: function(ta) {\n            if (!t.webkit()) {\n                sa._original_cursors.push([ta,ta.style.cursor,]);\n                ta.style.cursor = \"progress\";\n            }\n        ;\n        }\n    });\n    e.exports = ra;\n    a.PageTransitions = ra;\n});\n__d(\"PixelRatio\", [\"Arbiter\",\"Cookie\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Cookie\"), i = b(\"Run\"), j = \"dpr\", k, l;\n    function m() {\n        return (window.devicePixelRatio || 1);\n    };\n    function n() {\n        h.set(j, m());\n    };\n    function o() {\n        h.clear(j);\n    };\n    function p() {\n        var r = m();\n        if ((r !== k)) {\n            n();\n        }\n         else o();\n    ;\n    };\n    var q = {\n        startDetecting: function(r) {\n            k = (r || 1);\n            o();\n            if (l) {\n                return\n            };\n            l = [g.subscribe(\"pre_page_transition\", p),];\n            i.onBeforeUnload(p);\n        }\n    };\n    e.exports = q;\n});\n__d(\"LayerHideOnTransition\", [\"function-extensions\",\"PageTransitions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PageTransitions\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _enabled: false,\n        _subscribed: false,\n        enable: function() {\n            this._enabled = true;\n            if (!this._subscribed) {\n                this._subscribe.bind(this).defer();\n                this._subscribed = true;\n            }\n        ;\n        },\n        disable: function() {\n            this._enabled = false;\n        },\n        _subscribe: function() {\n            g.registerHandler(function() {\n                if (this._enabled) {\n                    this._layer.hide();\n                };\n                this._subscribed = false;\n            }.bind(this));\n        }\n    });\n    e.exports = i;\n});\n__d(\"Rect\", [\"Vector\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k, l, m, n, o) {\n        if ((arguments.length === 1)) {\n            if ((k instanceof j)) {\n                return k\n            };\n            if ((k instanceof g)) {\n                return new j(k.y, k.x, k.y, k.x, k.domain)\n            };\n            return j.getElementBounds(h(k));\n        }\n    ;\n        i(this, {\n            t: k,\n            r: l,\n            b: m,\n            l: n,\n            domain: (o || \"pure\")\n        });\n    };\n    i(j.prototype, {\n        w: function() {\n            return (this.r - this.l);\n        },\n        h: function() {\n            return (this.b - this.t);\n        },\n        toString: function() {\n            return ((((((((\"((\" + this.l) + \", \") + this.t) + \"), (\") + this.r) + \", \") + this.b) + \"))\");\n        },\n        contains: function(k) {\n            k = new j(k).convertTo(this.domain);\n            var l = this;\n            return (((((l.l <= k.l) && (l.r >= k.r)) && (l.t <= k.t)) && (l.b >= k.b)));\n        },\n        add: function(k, l) {\n            if ((arguments.length == 1)) {\n                if ((k.domain != \"pure\")) {\n                    k = k.convertTo(this.domain);\n                };\n                return this.add(k.x, k.y);\n            }\n        ;\n            var m = parseFloat(k), n = parseFloat(l);\n            return new j((this.t + n), (this.r + m), (this.b + n), (this.l + m), this.domain);\n        },\n        sub: function(k, l) {\n            if ((arguments.length == 1)) {\n                return this.add(k.mul(-1));\n            }\n             else return this.add(-k, -l)\n        ;\n        },\n        rotateAroundOrigin: function(k) {\n            var l = this.getCenter().rotate(((k * Math.PI) / 2)), m, n;\n            if ((k % 2)) {\n                m = this.h();\n                n = this.w();\n            }\n             else {\n                m = this.w();\n                n = this.h();\n            }\n        ;\n            var o = (l.y - (n / 2)), p = (l.x - (m / 2)), q = (o + n), r = (p + m);\n            return new j(o, r, q, p);\n        },\n        boundWithin: function(k) {\n            var l = 0, m = 0;\n            if ((this.l < k.l)) {\n                l = (k.l - this.l);\n            }\n             else if ((this.r > k.r)) {\n                l = (k.r - this.r);\n            }\n        ;\n            if ((this.t < k.t)) {\n                m = (k.t - this.t);\n            }\n             else if ((this.b > k.b)) {\n                m = (k.b - this.b);\n            }\n        ;\n            return this.add(l, m);\n        },\n        getCenter: function() {\n            return new g((this.l + (this.w() / 2)), (this.t + (this.h() / 2)), this.domain);\n        },\n        getPositionVector: function() {\n            return new g(this.l, this.t, this.domain);\n        },\n        getDimensionVector: function() {\n            return new g(this.w(), this.h(), \"pure\");\n        },\n        convertTo: function(k) {\n            if ((this.domain == k)) {\n                return this\n            };\n            if ((k == \"pure\")) {\n                return new j(this.t, this.r, this.b, this.l, \"pure\")\n            };\n            if ((this.domain == \"pure\")) {\n                return new j(0, 0, 0, 0)\n            };\n            var l = new g(this.l, this.t, this.domain).convertTo(k);\n            return new j(l.y, (l.x + this.w()), (l.y + this.h()), l.x, k);\n        }\n    });\n    i(j, {\n        deserialize: function(k) {\n            var l = k.split(\":\");\n            return new j(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]), parseFloat(l[0]));\n        },\n        newFromVectors: function(k, l) {\n            return new j(k.y, (k.x + l.x), (k.y + l.y), k.x, k.domain);\n        },\n        getElementBounds: function(k) {\n            return j.newFromVectors(g.getElementPosition(k), g.getElementDimensions(k));\n        },\n        getViewportBounds: function() {\n            return j.newFromVectors(g.getScrollPosition(), g.getViewportDimensions());\n        },\n        minimumBoundingBox: function(k) {\n            var l = new j(Math.min(), Math.max(), Math.max(), Math.min()), m;\n            for (var n = 0; (n < k.length); n++) {\n                m = k[n];\n                l.t = Math.min(l.t, m.t);\n                l.r = Math.max(l.r, m.r);\n                l.b = Math.max(l.b, m.b);\n                l.l = Math.min(l.l, m.l);\n            };\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"SVGChecker\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        isSVG: function(g) {\n            return (!!g.ownerSVGElement || (g.tagName.toLowerCase() === \"svg\"));\n        },\n        isDisplayed: function(g) {\n            try {\n                var i = g.getBBox();\n                if ((i && (((i.height === 0) || (i.width === 0))))) {\n                    return false\n                };\n            } catch (h) {\n                return false;\n            };\n            return true;\n        }\n    };\n});\n__d(\"arrayContains\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return (h.indexOf(i) != -1);\n    };\n    e.exports = g;\n});\n__d(\"ContextualLayer\", [\"Event\",\"Arbiter\",\"ARIA\",\"Class\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerHideOnTransition\",\"Locale\",\"Parent\",\"Rect\",\"Style\",\"Vector\",\"SVGChecker\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",\"getOverlayZIndex\",\"removeFromArray\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"Class\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Layer\"), p = b(\"LayerHideOnTransition\"), q = b(\"Locale\"), r = b(\"Parent\"), s = b(\"Rect\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"SVGChecker\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"getOverlayZIndex\"), aa = b(\"removeFromArray\"), ba = b(\"throttle\");\n    function ca(ja) {\n        return ((ja.getPosition() === \"left\") || ((ja.isVertical() && (ja.getAlignment() === \"right\"))));\n    };\n    function da(ja) {\n        var ka = ja.parentNode;\n        if (ka) {\n            var la = t.get(ka, \"position\");\n            if ((la === \"static\")) {\n                if ((ka === document.body)) {\n                    ka = document.documentElement;\n                }\n                 else ka = da(ka);\n            ;\n            }\n             else return ka\n        ;\n        }\n         else ka = document.documentElement;\n    ;\n        return ka;\n    };\n    function ea(ja, ka) {\n        this.parent.construct(this, ja, ka);\n    };\n    var fa = [];\n    h.subscribe(\"reflow\", function() {\n        fa.forEach(function(ja) {\n            if ((ja.updatePosition() === false)) {\n                ja.hide();\n            };\n        });\n    });\n    j.extend(ea, o);\n    x(ea.prototype, {\n        _contentWrapper: null,\n        _content: null,\n        _contextNode: null,\n        _contextBounds: null,\n        _contextSelector: null,\n        _parentLayer: null,\n        _parentSubscription: null,\n        _orientation: null,\n        _orientationClass: null,\n        _shouldSetARIAProperties: true,\n        _configure: function(ja, ka) {\n            this.parent._configure(ja, ka);\n            if (ja.context) {\n                this.setContext(ja.context);\n            }\n             else if (ja.contextID) {\n                this._setContextID(ja.contextID);\n            }\n             else if (ja.contextSelector) {\n                this._setContextSelector(ja.contextSelector);\n            }\n            \n        ;\n            this.setPosition(ja.position);\n            this.setAlignment(ja.alignment);\n            this.setOffsetX(ja.offsetX);\n            this.setOffsetY(ja.offsetY);\n            this._content = ka;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([p,]);\n        },\n        _buildWrapper: function(ja, ka) {\n            this._contentWrapper = n.create(\"div\", {\n                className: \"uiContextualLayer\"\n            }, ka);\n            return n.create(\"div\", {\n                className: \"uiContextualLayerPositioner\"\n            }, this._contentWrapper);\n        },\n        getInsertParent: function() {\n            var ja = this._insertParent;\n            if (!ja) {\n                var ka = this.getContext();\n                if (ka) {\n                    ja = r.byClass(ka, \"uiContextualLayerParent\");\n                };\n            }\n        ;\n            return (ja || this.parent.getInsertParent());\n        },\n        setContent: function(ja) {\n            this._content = ja;\n            n.setContent(this._contentWrapper, this._content);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setContext: function(ja) {\n            return this.setContextWithBounds(ja, null);\n        },\n        setContextWithBounds: function(ja, ka) {\n            this._contextNode = ja;\n            this._contextBounds = (ka || null);\n            this._contextSelector = this._contextScrollParent = null;\n            if (this._shown) {\n                k.register(this.getRoot(), this._contextNode);\n                this.updatePosition();\n            }\n        ;\n            this._setParentSubscription();\n            this.setARIAProperties();\n            return this;\n        },\n        shouldSetARIAProperties: function(ja) {\n            this._shouldSetARIAProperties = ja;\n            return this;\n        },\n        setARIAProperties: function() {\n            if (this._shouldSetARIAProperties) {\n                i.setPopup(this.getCausalElement(), this.getRoot());\n            };\n            return this;\n        },\n        _setContextID: function(ja) {\n            this._contextSelector = (\"#\" + ja);\n            this._contextNode = null;\n        },\n        _setContextSelector: function(ja) {\n            this._contextSelector = ja;\n            this._contextNode = null;\n        },\n        getCausalElement: function() {\n            return (this.parent.getCausalElement() || this.getContext());\n        },\n        _setParentSubscription: function() {\n            var ja = this.getContext(), ka = null;\n            while ((ja !== null)) {\n                ka = m.get(ja, \"layer\");\n                if (ka) {\n                    break;\n                };\n                ja = ja.parentNode;\n            };\n            if ((ka === this._parentLayer)) {\n                return\n            };\n            if ((this._parentLayer && this._parentSubscription)) {\n                this._parentLayer.unsubscribe(this._parentSubscription);\n                this._parentSubscription = null;\n            }\n        ;\n            if (ka) {\n                this._parentSubscription = ka.subscribe(\"hide\", this.hide.bind(this));\n            };\n            this._parentLayer = ka;\n        },\n        setPosition: function(ja) {\n            if (this._getOrientation().setDefaultPosition(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setAlignment: function(ja) {\n            if (this._getOrientation().setDefaultAlignment(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setOffsetX: function(ja) {\n            if (this._getOrientation().setDefaultOffsetX(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setOffsetY: function(ja) {\n            if (this._getOrientation().setDefaultOffsetY(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        _getOrientation: function() {\n            if (!this._orientation) {\n                this._orientation = new ia();\n            };\n            return this._orientation;\n        },\n        getContentRoot: function() {\n            return this._contentWrapper;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            if (!this._contextNode) {\n                this._contextNode = n.find(document, this._contextSelector);\n            };\n            return this._contextNode;\n        },\n        getContextBounds: function(ja) {\n            if (this._contextBounds) {\n                return this._contextBounds.convertTo(ja)\n            };\n            var ka = this.getContext();\n            return s.newFromVectors(u.getElementPosition(ka, ja), u.getElementDimensions(ka));\n        },\n        getContextScrollParent: function() {\n            if (!this._contextScrollParent) {\n                this._contextScrollParent = t.getScrollParent(this.getContext());\n            };\n            return this._contextScrollParent;\n        },\n        setInsertParent: function(ja) {\n            this._insertScrollParent = null;\n            return this.parent.setInsertParent(ja);\n        },\n        getInsertScrollParent: function() {\n            if (!this._insertScrollParent) {\n                this._insertScrollParent = t.getScrollParent(this.getInsertParent());\n            };\n            return this._insertScrollParent;\n        },\n        show: function() {\n            if (this._shown) {\n                return this\n            };\n            this.parent.show();\n            if (this._shown) {\n                k.register(this.getRoot(), this.getContext());\n                fa.push(this);\n                this._resizeListener = (this._resizeListener || g.listen(window, \"resize\", ba(this.updatePosition.bind(this))));\n            }\n        ;\n            return this;\n        },\n        finishHide: function() {\n            aa(fa, this);\n            (this._resizeListener && this._resizeListener.remove());\n            this._resizeListener = null;\n            return this.parent.finishHide();\n        },\n        isFixed: function() {\n            return ((t.isFixed(this.getContext()) && !t.isFixed(this.getInsertParent())));\n        },\n        updatePosition: function() {\n            var ja = this.getContext();\n            if (!ja) {\n                return false\n            };\n            var ka = this.isFixed();\n            if ((!ka && !((ja.offsetParent || ((v.isSVG(ja) && v.isDisplayed(ja))))))) {\n                return false\n            };\n            var la = this.getRoot();\n            t.set(la, \"width\", (u.getViewportDimensions().x + \"px\"));\n            var ma = this._getOrientation();\n            this.inform(\"adjust\", ma.reset());\n            if (!ma.isValid()) {\n                return false\n            };\n            this._updateWrapperPosition(ma);\n            this._updateWrapperClass(ma);\n            l.conditionClass(la, \"uiContextualLayerPositionerFixed\", ka);\n            var na, oa, pa = (ka ? \"viewport\" : \"document\"), qa = (ka ? document.documentElement : da(la));\n            if ((qa === document.documentElement)) {\n                na = new u(0, 0);\n                oa = document.documentElement.clientWidth;\n            }\n             else if (!la.offsetParent) {\n                return false;\n            }\n             else {\n                na = u.getElementPosition(qa, pa);\n                oa = qa.offsetWidth;\n                if ((qa !== document.body)) {\n                    na = na.sub(new u(qa.scrollLeft, qa.scrollTop));\n                };\n            }\n            \n        ;\n            var ra = this.getContextBounds(pa), sa = (ra.l - na.x), ta = (ra.t - na.y), ua = ra.h(), va = ra.w(), wa = q.isRTL();\n            if ((ma.getPosition() === \"below\")) {\n                ta += ua;\n            };\n            if (((((ma.getPosition() === \"right\") || ((ma.isVertical() && (ma.getAlignment() === \"right\"))))) != wa)) {\n                sa += va;\n            };\n            var xa = ma.getOffsetX();\n            if ((ma.isVertical() && (ma.getAlignment() === \"center\"))) {\n                xa += (((va - this.getContentRoot().offsetWidth)) / 2);\n            };\n            if (wa) {\n                xa *= -1;\n            };\n            var ya = \"left\", za = Math.floor((sa + xa));\n            if ((ca(ma) !== wa)) {\n                ya = \"right\";\n                za = (oa - za);\n            }\n        ;\n            t.set(la, ya, (za + \"px\"));\n            t.set(la, ((ya === \"left\") ? \"right\" : \"left\"), \"\");\n            var ab = this.getInsertScrollParent(), bb;\n            if ((ab !== window)) {\n                bb = ab.clientWidth;\n            }\n             else bb = document.documentElement.clientWidth;\n        ;\n            var cb = u.getElementPosition(la).x;\n            if ((ya === \"left\")) {\n                if (((bb - cb) > 0)) {\n                    t.set(la, \"width\", (((bb - cb)) + \"px\"));\n                }\n                 else t.set(la, \"width\", \"\");\n            ;\n            }\n             else t.set(la, \"width\", ((cb + la.offsetWidth) + \"px\"));\n        ;\n            t.set(la, \"top\", (((ta + ma.getOffsetY())) + \"px\"));\n            var db = z(ja, this.getInsertParent());\n            t.set(la, \"z-index\", ((db > 200) ? db : \"\"));\n            this.inform(\"reposition\", ma);\n            return true;\n        },\n        _updateWrapperPosition: function(ja) {\n            var ka = (ja.getPosition() === \"above\");\n            t.set(this._contentWrapper, \"bottom\", (ka ? \"0\" : null));\n            var la = (q.isRTL() ? \"left\" : \"right\"), ma = ca(ja);\n            t.set(this._contentWrapper, la, (ma ? \"0\" : null));\n        },\n        _updateWrapperClass: function(ja) {\n            var ka = ja.getClassName();\n            if ((ka === this._orientationClass)) {\n                return\n            };\n            if (this._orientationClass) {\n                l.removeClass(this._contentWrapper, this._orientationClass);\n            };\n            this._orientationClass = ka;\n            l.addClass(this._contentWrapper, ka);\n        },\n        simulateOrientation: function(ja, ka) {\n            var la = ja.getClassName();\n            if ((la === this._orientationClass)) {\n                return ka();\n            }\n             else {\n                if (this._orientationClass) {\n                    l.removeClass(this._contentWrapper, this._orientationClass);\n                };\n                l.addClass(this._contentWrapper, la);\n                var ma = ka();\n                l.removeClass(this._contentWrapper, la);\n                if (this._orientationClass) {\n                    l.addClass(this._contentWrapper, this._orientationClass);\n                };\n                return ma;\n            }\n        ;\n        },\n        destroy: function() {\n            this.parent.destroy();\n            this._contentWrapper = null;\n            this._content = null;\n            return this;\n        }\n    });\n    var ga = y.thatReturnsArgument, ha = y.thatReturnsArgument;\n    function ia() {\n        this._default = {\n            _position: \"above\",\n            _alignment: \"left\",\n            _offsetX: 0,\n            _offsetY: 0,\n            _valid: true\n        };\n        this.reset();\n    };\n    ia.OPPOSITE = {\n        above: \"below\",\n        below: \"above\",\n        left: \"right\",\n        right: \"left\"\n    };\n    x(ia.prototype, {\n        setPosition: function(ja) {\n            this._position = ga(ja);\n            return this;\n        },\n        setAlignment: function(ja) {\n            this._alignment = ha(ja);\n            return this;\n        },\n        getOppositePosition: function() {\n            return ia.OPPOSITE[this.getPosition()];\n        },\n        invalidate: function() {\n            this._valid = false;\n            return this;\n        },\n        getPosition: function() {\n            return (this._position || \"above\");\n        },\n        getAlignment: function() {\n            return (this._alignment || \"left\");\n        },\n        getOffsetX: function() {\n            var ja = (this._offsetX || 0);\n            if (!this.isVertical()) {\n                if ((this._default._position !== this._position)) {\n                    ja *= -1;\n                };\n            }\n             else if ((this._default._alignment !== this._alignment)) {\n                ja *= -1;\n            }\n        ;\n            return ja;\n        },\n        getOffsetY: function() {\n            var ja = (this._offsetY || 0);\n            if ((this.isVertical() && (this._default._position !== this._position))) {\n                ja *= -1;\n            };\n            return ja;\n        },\n        getClassName: function() {\n            var ja = this.getAlignment(), ka = this.getPosition();\n            if ((ka === \"below\")) {\n                if ((ja === \"left\")) {\n                    return \"uiContextualLayerBelowLeft\";\n                }\n                 else if ((ja === \"right\")) {\n                    return \"uiContextualLayerBelowRight\";\n                }\n                 else return \"uiContextualLayerBelowCenter\"\n                \n            ;\n            }\n             else if ((ka === \"above\")) {\n                if ((ja === \"left\")) {\n                    return \"uiContextualLayerAboveLeft\";\n                }\n                 else if ((ja === \"right\")) {\n                    return \"uiContextualLayerAboveRight\";\n                }\n                 else return \"uiContextualLayerAboveCenter\"\n                \n            ;\n            }\n             else if ((ka === \"left\")) {\n                return \"uiContextualLayerLeft\";\n            }\n             else return \"uiContextualLayerRight\"\n            \n            \n        ;\n        },\n        isValid: function() {\n            return this._valid;\n        },\n        isVertical: function() {\n            return ((this.getPosition() === \"above\") || (this.getPosition() === \"below\"));\n        },\n        reset: function(ja, ka) {\n            x(this, this._default);\n            return this;\n        },\n        setDefaultPosition: function(ja) {\n            var ka = this._default._position;\n            this._default._position = ga(ja);\n            return (ka !== ja);\n        },\n        setDefaultAlignment: function(ja) {\n            var ka = this._default._alignment;\n            this._default._alignment = ha(ja);\n            return (ka !== ja);\n        },\n        setDefaultOffsetX: function(ja) {\n            var ka = this._default._offsetX;\n            this._default._offsetX = ja;\n            return (ka !== ja);\n        },\n        setDefaultOffsetY: function(ja) {\n            var ka = this._default._offsetY;\n            this._default._offsetY = ja;\n            return (ka !== ja);\n        }\n    });\n    e.exports = ea;\n});\n__d(\"ContextualLayerHideOnScroll\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"contextchange\", this._handleContextChange.bind(this)),this._layer.subscribe(\"show\", this.attach.bind(this)),this._layer.subscribe(\"hide\", this.detach.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this.detach();\n        },\n        attach: function() {\n            if (this._listener) {\n                return\n            };\n            var j = this._layer.getContextScrollParent();\n            if ((j === window)) {\n                return\n            };\n            this._listener = g.listen(j, \"scroll\", this._layer.hide.bind(this._layer));\n        },\n        detach: function() {\n            (this._listener && this._listener.remove());\n            this._listener = null;\n        },\n        _handleContextChange: function() {\n            this.detach();\n            if (this._layer.isShown()) {\n                this.attach();\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnEscape\", [\"Event\",\"copyProperties\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"Keys\");\n    function j(k) {\n        this._layer = k;\n    };\n    h(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"key\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, event) {\n            if ((g.getKeyCode(event) === i.ESC)) {\n                this._layer.hide();\n                return false;\n            }\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"TabbableElements\", [\"Style\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"createArrayFrom\");\n    function i(l) {\n        if ((l.tabIndex >= 0)) {\n            return true\n        };\n        switch (l.tagName) {\n          case \"A\":\n            return (l.href && (l.rel != \"ignore\"));\n          case \"INPUT\":\n            return (((l.type != \"hidden\") && (l.type != \"file\")) && !l.disabled);\n          case \"BUTTON\":\n        \n          case \"SELECT\":\n        \n          case \"TEXTAREA\":\n            return !l.disabled;\n        };\n        return false;\n    };\n    function j(l) {\n        if (((l.offsetHeight === 0) && (l.offsetWidth === 0))) {\n            return false\n        };\n        while (((l !== document) && (g.get(l, \"visibility\") != \"hidden\"))) {\n            l = l.parentNode;;\n        };\n        return (l === document);\n    };\n    var k = {\n        find: function(l) {\n            var m = h(l.getElementsByTagName(\"*\"));\n            return m.filter(k.isTabbable);\n        },\n        isTabbable: function(l) {\n            return (i(l) && j(l));\n        }\n    };\n    e.exports = k;\n});\n__d(\"Toggler\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualThing\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"TabbableElements\",\"arrayContains\",\"cx\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"ge\",\"getContextualParent\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualThing\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"Dialog\"), n = b(\"DOM\"), o = b(\"DOMQuery\"), p = b(\"Focus\"), q = b(\"Parent\"), r = b(\"TabbableElements\"), s = b(\"arrayContains\"), t = b(\"cx\"), u = b(\"copyProperties\"), v = b(\"createArrayFrom\"), w = b(\"emptyFunction\"), x = b(\"ge\"), y = b(\"getContextualParent\"), z = b(\"getObjectValues\"), aa = [], ba;\n    function ca() {\n        ca = w;\n        g.listen(document.documentElement, \"click\", function(event) {\n            var ga = event.getTarget();\n            aa.forEach(function(ha) {\n                ha.clickedTarget = ga;\n                ((((((ha.active && !ha.sticky) && !j.containsIncludingLayers(ha.getActive(), ga)) && !ha.inTargetFlyout(ga)) && ha.inActiveDialog()) && !ha.isIgnoredByModalLayer(ga)) && ha.hide());\n            });\n        }, g.Priority.URGENT);\n    };\n    var da = function() {\n        this.active = null;\n        this.togglers = {\n        };\n        this.setSticky(false);\n        aa.push(this);\n        this.subscribe([\"show\",\"hide\",], da.inform.bind(da));\n        return ca();\n    };\n    u(da.prototype, i, {\n        show: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if ((ga !== ia)) {\n                (ia && ha.hide());\n                ha.active = ga;\n                k.addClass(ga, \"openToggler\");\n                var ja = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n                if (((ja.length > 0) && ja[0].getAttribute(\"data-target\"))) {\n                    k.removeClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                };\n                var ka = o.scry(ga, \".uiToggleFlyout\")[0];\n                if (ka) {\n                    var la = (r.find(ka)[0] || ka);\n                    if ((la.tabIndex == -1)) {\n                        la.tabIndex = 0;\n                    };\n                    p.setWithoutOutline(la);\n                }\n            ;\n                n.appendContent(ga, ha.getToggler(\"next\"));\n                n.prependContent(ga, ha.getToggler(\"prev\"));\n                ha.inform(\"show\", ha);\n            }\n        ;\n        },\n        hide: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if ((ia && ((!ga || (ga === ia))))) {\n                k.removeClass(ia, \"openToggler\");\n                var ja = n.scry(ia, \"a[rel=\\\"toggle\\\"]\");\n                if (((ja.length > 0) && ja[0].getAttribute(\"data-target\"))) {\n                    k.addClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                };\n                z(ha.togglers).forEach(n.remove);\n                ha.inform(\"hide\", ha);\n                ha.active = null;\n            }\n        ;\n        },\n        toggle: function(ga) {\n            var ha = ea(this, ga);\n            if ((ha.active === ga)) {\n                ha.hide();\n            }\n             else ha.show(ga);\n        ;\n        },\n        getActive: function() {\n            return ea(this).active;\n        },\n        isShown: function() {\n            return (ea(this).active && k.hasClass(ea(this).active, \"openToggler\"));\n        },\n        inTargetFlyout: function(ga) {\n            var ha = fa(this.getActive());\n            return (ha && j.containsIncludingLayers(ha, ga));\n        },\n        inActiveDialog: function() {\n            var ga = m.getCurrent();\n            return (!ga || n.contains(ga.getRoot(), this.getActive()));\n        },\n        isIgnoredByModalLayer: function(ga) {\n            return (q.byClass(ga, \"-cx-PRIVATE-ModalLayer__root\") && !q.byClass(this.getActive(), \"-cx-PRIVATE-ModalLayer__root\"));\n        },\n        getToggler: function(ga) {\n            var ha = ea(this);\n            if (!ha.togglers[ga]) {\n                ha.togglers[ga] = n.create(\"button\", {\n                    className: \"hideToggler\",\n                    onfocus: function() {\n                        var ia = n.scry(ha.active, \"a[rel=\\\"toggle\\\"]\")[0];\n                        (ia && ia.focus());\n                        ha.hide();\n                    }\n                });\n                ha.togglers[ga].setAttribute(\"type\", \"button\");\n            }\n        ;\n            return this.togglers[ga];\n        },\n        setSticky: function(ga) {\n            var ha = ea(this);\n            ga = (ga !== false);\n            if ((ga !== ha.sticky)) {\n                ha.sticky = ga;\n                if (ga) {\n                    (ha._pt && ha._pt.unsubscribe());\n                }\n                 else ha._pt = h.subscribe(\"pre_page_transition\", ha.hide.bind(ha, null));\n            ;\n            }\n        ;\n            return ha;\n        }\n    });\n    u(da, da.prototype);\n    u(da, {\n        bootstrap: function(ga) {\n            var ha = ga.parentNode;\n            da.getInstance(ha).toggle(ha);\n        },\n        createInstance: function(ga) {\n            var ha = new da().setSticky(true);\n            l.set(ga, \"toggler\", ha);\n            return ha;\n        },\n        destroyInstance: function(ga) {\n            l.remove(ga, \"toggler\");\n        },\n        getInstance: function(ga) {\n            while (ga) {\n                var ha = l.get(ga, \"toggler\");\n                if (ha) {\n                    return ha\n                };\n                if (k.hasClass(ga, \"uiToggleContext\")) {\n                    return da.createInstance(ga)\n                };\n                ga = y(ga);\n            };\n            return (ba = (ba || new da()));\n        },\n        listen: function(ga, ha, ia) {\n            return da.subscribe(v(ga), function(ja, ka) {\n                if ((ka.getActive() === ha)) {\n                    return ia(ja, ka)\n                };\n            });\n        },\n        subscribe: (function(ga) {\n            return function(ha, ia) {\n                ha = v(ha);\n                if (s(ha, \"show\")) {\n                    aa.forEach(function(ja) {\n                        if (ja.getActive()) {\n                            ia.curry(\"show\", ja).defer();\n                        };\n                    });\n                };\n                return ga(ha, ia);\n            };\n        })(da.subscribe.bind(da))\n    });\n    function ea(ga, ha) {\n        if ((ga instanceof da)) {\n            return ga\n        };\n        return da.getInstance(ha);\n    };\n    function fa(ga) {\n        var ha = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n        if (((ha.length > 0) && ha[0].getAttribute(\"data-target\"))) {\n            return x(ha[0].getAttribute(\"data-target\"))\n        };\n    };\n    e.exports = da;\n});\n__d(\"curry\", [\"bind\",], function(a, b, c, d, e, f) {\n    var g = b(\"bind\"), h = g(null, g, null);\n    e.exports = h;\n});\n__d(\"Popover\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualLayer\",\"ContextualLayerHideOnScroll\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"Keys\",\"KeyStatus\",\"LayerHideOnEscape\",\"Toggler\",\"copyProperties\",\"curry\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerHideOnScroll\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Focus\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"LayerHideOnEscape\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"curry\");\n    s.subscribe([\"show\",\"hide\",], function(w, x) {\n        var y = m.get(x.getActive(), \"Popover\");\n        if (y) {\n            if ((w === \"show\")) {\n                y.showLayer();\n            }\n             else y.hideLayer();\n        \n        };\n    });\n    function v(w, x, y, z) {\n        this._root = w;\n        this._triggerElem = x;\n        this._behaviors = y;\n        this._config = (z || {\n        });\n        this._disabled = !!this._config.disabled;\n        this._listeners = [];\n        if ((!this._disabled && (((x.nodeName !== \"A\") || (x.rel !== \"toggle\"))))) {\n            this._setupClickListener();\n        };\n        this._setupKeyListener();\n        x.setAttribute(\"role\", \"button\");\n        m.set(w, \"Popover\", this);\n    };\n    t(v.prototype, i, {\n        _layer: null,\n        ensureInit: function() {\n            if (!this._layer) {\n                this._init();\n            };\n        },\n        showLayer: function() {\n            this.ensureInit();\n            this._layer.show();\n            s.show(this._root);\n            l.addClass(this._root, \"selected\");\n            this.inform(\"show\");\n            this._triggerElem.setAttribute(\"aria-expanded\", \"true\");\n        },\n        getLayer: function() {\n            return this._layer;\n        },\n        hideLayer: function() {\n            this._layer.hide();\n            this._triggerElem.setAttribute(\"aria-expanded\", \"false\");\n        },\n        isShown: function() {\n            return (this._layer && this._layer.isShown());\n        },\n        setLayerContent: function(w) {\n            this.ensureInit();\n            this._layer.setContent(w);\n        },\n        _init: function() {\n            var w = new j({\n                context: this._triggerElem,\n                position: \"below\"\n            }, n.create(\"div\"));\n            w.enableBehaviors([k,r,]);\n            s.createInstance(w.getRoot()).setSticky(false);\n            w.subscribe(\"hide\", this._onLayerHide.bind(this));\n            (this._behaviors && w.enableBehaviors(this._behaviors));\n            this._layer = w;\n            if (this._config.alignh) {\n                this._layer.setAlignment(this._config.alignh);\n            };\n            if (this._config.layer_content) {\n                this._layer.setContent(this._config.layer_content);\n            };\n            this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        _onLayerHide: function() {\n            s.hide(this._root);\n            l.removeClass(this._root, \"selected\");\n            this.inform(\"hide\");\n            if ((q.getKeyDownCode() === p.ESC)) {\n                o.set(this._triggerElem);\n            };\n        },\n        enable: function() {\n            if (!this._disabled) {\n                return\n            };\n            this._setupClickListener();\n            this._setupKeyListener();\n            this._disabled = false;\n        },\n        disable: function() {\n            if (this._disabled) {\n                return\n            };\n            if (this.isShown()) {\n                this.hideLayer();\n            };\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            if ((this._triggerElem.getAttribute(\"rel\") === \"toggle\")) {\n                this._triggerElem.removeAttribute(\"rel\");\n            };\n            this._disabled = true;\n        },\n        _setupClickListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"click\", u(s.bootstrap, this._triggerElem)));\n        },\n        _setupKeyListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"keydown\", this._handleKeyEvent.bind(this)));\n        },\n        _handleKeyEvent: function(event) {\n            if (event.getModifiers().any) {\n                return\n            };\n            switch (g.getKeyCode(event)) {\n              case p.DOWN:\n            \n              case p.UP:\n                s.bootstrap(this._triggerElem);\n                break;\n              default:\n                return;\n            };\n            event.prevent();\n        }\n    });\n    e.exports = v;\n});\n__d(\"PopoverMenu\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"BehaviorsMixin\",\"Focus\",\"Keys\",\"KeyStatus\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ARIA\"), k = b(\"BehaviorsMixin\"), l = b(\"Focus\"), m = b(\"Keys\"), n = b(\"KeyStatus\"), o = b(\"copyProperties\");\n    function p(q, r, s, t) {\n        this._popover = q;\n        this._triggerElem = r;\n        this._initialMenu = s;\n        q.subscribe(\"init\", this._onLayerInit.bind(this));\n        q.subscribe(\"show\", this._onPopoverShow.bind(this));\n        q.subscribe(\"hide\", this._onPopoverHide.bind(this));\n        g.listen(this._triggerElem, \"keydown\", this._handleKeyEventOnTrigger.bind(this));\n        (t && this.enableBehaviors(t));\n    };\n    o(p.prototype, i, k);\n    o(p.prototype, {\n        _popoverShown: false,\n        setMenu: function(q) {\n            this._menu = q;\n            var r = q.getRoot();\n            this._popover.setLayerContent(r);\n            q.subscribe(\"done\", this._onMenuDone.bind(this));\n            if (this._popoverShown) {\n                this._menu.onShow();\n            };\n            j.owns(this._triggerElem, r);\n            this.inform(\"setMenu\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        getPopover: function() {\n            return this._popover;\n        },\n        getTriggerElem: function() {\n            return this._triggerElem;\n        },\n        getMenu: function() {\n            return this._menu;\n        },\n        _onLayerInit: function() {\n            this.setMenu(this._initialMenu);\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _onPopoverShow: function() {\n            if (this._menu) {\n                this._menu.onShow();\n            };\n            this._popoverShown = true;\n        },\n        _onPopoverHide: function() {\n            if (this._menu) {\n                this._menu.onHide();\n            };\n            this._popoverShown = false;\n        },\n        _handleKeyEvent: function(q, r) {\n            var s = g.getKeyCode(r);\n            if ((s === m.TAB)) {\n                this._popover.hideLayer();\n                l.set(this._triggerElem);\n                return;\n            }\n        ;\n            if (r.getModifiers().any) {\n                return\n            };\n            switch (s) {\n              case m.RETURN:\n                return;\n              case m.UP:\n            \n              case m.DOWN:\n                this._menu.handleKeydown(s, r);\n                break;\n              default:\n                if ((this._menu.handleKeydown(s, r) === false)) {\n                    this._menu.blur();\n                    this._menu.handleKeydown(s, r);\n                }\n            ;\n                break;\n            };\n            r.prevent();\n        },\n        _handleKeyEventOnTrigger: function(q) {\n            var r = g.getKeyCode(q);\n            switch (r) {\n              case m.DOWN:\n            \n              case m.UP:\n                break;\n              default:\n                var s = String.fromCharCode(r).toLowerCase();\n                if (!/^\\s?$/.test(s)) {\n                    this._popover.showLayer();\n                    this._menu.blur();\n                    if ((this._menu.handleKeydown(r, q) === false)) {\n                        this._popover.hideLayer();\n                        l.set(this._triggerElem);\n                    }\n                ;\n                }\n            ;\n            };\n        },\n        _onMenuDone: function(q) {\n            this._popover.hideLayer.bind(this._popover).defer();\n            if (n.isKeyDown()) {\n                l.set(this._triggerElem);\n            };\n        },\n        enable: function() {\n            this._popover.enable();\n        },\n        disable: function() {\n            this._popover.disable();\n        }\n    });\n    e.exports = p;\n});\n__d(\"PopoverAsyncMenu\", [\"Event\",\"AsyncRequest\",\"Class\",\"PopoverMenu\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"Class\"), j = b(\"PopoverMenu\"), k = b(\"copyProperties\"), l = {\n    }, m = 0;\n    function n(o, p, q, r, s) {\n        this._endpoint = r;\n        this._loadingMenu = q;\n        this._instanceId = m++;\n        l[this._instanceId] = this;\n        this._mouseoverListener = g.listen(p, \"mouseover\", this._fetchMenu.bind(this));\n        this.parent.construct(this, o, p, null, s);\n    };\n    n.setMenu = function(o, p) {\n        l[o].setMenu(p);\n    };\n    n.getInstance = function(o) {\n        return l[o];\n    };\n    i.extend(n, j);\n    k(n.prototype, {\n        _fetched: false,\n        _mouseoverListener: null,\n        _onLayerInit: function() {\n            if (!this._menu) {\n                this.setMenu(this._loadingMenu);\n            };\n            this._fetchMenu();\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _fetchMenu: function() {\n            if (this._fetched) {\n                return\n            };\n            new h().setURI(this._endpoint).setData({\n                pmid: this._instanceId\n            }).send();\n            this._fetched = true;\n            if (this._mouseoverListener) {\n                this._mouseoverListener.remove();\n                this._mouseoverListener = null;\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"PopoverMenuInterface\", [\"ArbiterMixin\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n    h(j.prototype, g, {\n        getRoot: i,\n        onShow: i,\n        onHide: i,\n        focusAnItem: i.thatReturnsFalse,\n        blur: i,\n        handleKeydown: i.thatReturnsFalse,\n        done: function() {\n            this.inform(\"done\");\n        }\n    });\n    e.exports = j;\n});\n__d(\"PopoverMenuOverlappingBorder\", [\"CSS\",\"DOM\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"shield\");\n    function m(n) {\n        this._popoverMenu = n;\n        this._popover = n.getPopover();\n        this._triggerElem = n.getTriggerElem();\n    };\n    j(m.prototype, {\n        _shortBorder: null,\n        _setMenuSubscription: null,\n        _showSubscription: null,\n        _menuSubscription: null,\n        enable: function() {\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", l(this._onSetMenu, this));\n        },\n        disable: function() {\n            this._popoverMenu.unsubscribe(this._setMenuSubscription);\n            this._setMenuSubscription = null;\n            this._removeBorderSubscriptions();\n            this._removeShortBorder();\n        },\n        _onSetMenu: function() {\n            this._removeBorderSubscriptions();\n            this._menu = this._popoverMenu.getMenu();\n            this._renderShortBorder(this._menu.getRoot());\n            this._showSubscription = this._popover.subscribe(\"show\", l(this._updateBorder, this));\n            this._menuSubscription = this._menu.subscribe([\"change\",\"resize\",], l(Function.prototype.defer, l(this._updateBorder, this)));\n            this._updateBorder();\n        },\n        _updateBorder: function() {\n            var n = this._menu.getRoot(), o = this._triggerElem.offsetWidth, p = Math.max((n.offsetWidth - o), 0);\n            i.set(this._shortBorder, \"width\", (p + \"px\"));\n        },\n        _renderShortBorder: function(n) {\n            this._shortBorder = h.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__shortborder\"\n            });\n            h.appendContent(n, this._shortBorder);\n            g.addClass(n, \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n        },\n        _removeShortBorder: function() {\n            if (this._shortBorder) {\n                h.remove(this._shortBorder);\n                this._shortBorder = null;\n                g.removeClass(this._popoverMenu.getMenu().getRoot(), \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n            }\n        ;\n        },\n        _removeBorderSubscriptions: function() {\n            if (this._showSubscription) {\n                this._popover.unsubscribe(this._showSubscription);\n                this._showSubscription = null;\n            }\n        ;\n            if (this._menuSubscription) {\n                this._menu.unsubscribe(this._menuSubscription);\n                this._menuSubscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"PostLoadJS\", [\"Bootloader\",\"Run\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\"), i = b(\"emptyFunction\");\n    function j(l, m) {\n        h.onAfterLoad(function() {\n            g.loadModules.call(g, [l,], m);\n        });\n    };\n    var k = {\n        loadAndRequire: function(l) {\n            j(l, i);\n        },\n        loadAndCall: function(l, m, n) {\n            j(l, function(o) {\n                o[m].apply(o, n);\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualLayerDimensions\", [\"DOM\",\"Locale\",\"Rect\",\"Vector\",\"ViewportBounds\",\"ge\",\"getOverlayZIndex\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Locale\"), i = b(\"Rect\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"getOverlayZIndex\"), n = {\n        getViewportRect: function(o) {\n            var p = l(\"globalContainer\"), q = o.getContext(), r = (((p && g.contains(p, q))) || (m(q) < 300)), s = i.getViewportBounds();\n            if (r) {\n                s.t += k.getTop();\n                if (h.isRTL()) {\n                    s.r -= k.getLeft();\n                    s.l += k.getRight();\n                }\n                 else {\n                    s.r -= k.getRight();\n                    s.l += k.getLeft();\n                }\n            ;\n            }\n        ;\n            return s;\n        },\n        getLayerRect: function(o, p) {\n            var q = o.getContextBounds(\"viewport\"), r = o.simulateOrientation(p, function() {\n                return j.getElementDimensions(o.getContent());\n            }), s = (q.t + p.getOffsetY());\n            if ((p.getPosition() === \"above\")) {\n                s -= r.y;\n            }\n             else if ((p.getPosition() === \"below\")) {\n                s += (q.b - q.t);\n            }\n        ;\n            var t = (q.l + p.getOffsetX()), u = (q.r - q.l);\n            if (p.isVertical()) {\n                var v = p.getAlignment();\n                if ((v === \"center\")) {\n                    t += (((u - r.x)) / 2);\n                }\n                 else if ((((v === \"right\")) !== h.isRTL())) {\n                    t += (u - r.x);\n                }\n            ;\n            }\n             else if ((((p.getPosition() === \"right\")) !== h.isRTL())) {\n                t += u;\n            }\n             else t -= r.x;\n            \n        ;\n            return new i(s, (t + r.x), (s + r.y), t, \"viewport\");\n        }\n    };\n    e.exports = n;\n});\n__d(\"ContextualLayerAutoFlip\", [\"ContextualLayerDimensions\",\"DOM\",\"Vector\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualLayerDimensions\"), h = b(\"DOM\"), i = b(\"Vector\"), j = b(\"arrayContains\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"adjust\", this._adjustOrientation.bind(this));\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            };\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            };\n        },\n        _adjustOrientation: function(m, n) {\n            var o = this._getValidPositions(n);\n            if (!o.length) {\n                n.invalidate();\n                return;\n            }\n        ;\n            var p = g.getViewportRect(this._layer), q = this._getValidAlignments(n), r, s, t;\n            for (r = 0; (r < q.length); r++) {\n                n.setAlignment(q[r]);\n                for (s = 0; (s < o.length); s++) {\n                    n.setPosition(o[s]);\n                    t = g.getLayerRect(this._layer, n);\n                    if (p.contains(t)) {\n                        return\n                    };\n                };\n            };\n            n.setPosition((j(o, \"below\") ? \"below\" : o[0]));\n            for (r = 0; (r < q.length); r++) {\n                n.setAlignment(q[r]);\n                t = g.getLayerRect(this._layer, n);\n                if (((t.l >= p.l) && (t.r <= p.r))) {\n                    return\n                };\n            };\n            n.setAlignment(q[0]);\n        },\n        _getValidPositions: function(m) {\n            var n = [m.getPosition(),m.getOppositePosition(),], o = this._layer.getContextScrollParent();\n            if (((o === window) || (o === h.getDocumentScrollElement()))) {\n                return n\n            };\n            var p = this._layer.getContext(), q = i.getElementPosition(o, \"viewport\").y, r = i.getElementPosition(p, \"viewport\").y;\n            if (m.isVertical()) {\n                return n.filter(function(t) {\n                    if ((t === \"above\")) {\n                        return (r >= q);\n                    }\n                     else {\n                        var u = (q + o.offsetHeight), v = (r + p.offsetHeight);\n                        return (v <= u);\n                    }\n                ;\n                });\n            }\n             else {\n                var s = (q + o.offsetHeight);\n                if (((r >= q) && ((r + p.offsetHeight) <= s))) {\n                    return n;\n                }\n                 else return []\n            ;\n            }\n        ;\n        },\n        _getValidAlignments: function(m) {\n            var n = [\"left\",\"right\",\"center\",], o = m.getAlignment(), p = n.indexOf(o);\n            if ((p > 0)) {\n                n.splice(p, 1);\n                n.unshift(o);\n            }\n        ;\n            return n;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Tooltip\", [\"Event\",\"AsyncRequest\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"URI\",\"copyProperties\",\"emptyFunction\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"ContextualLayer\"), j = b(\"ContextualLayerAutoFlip\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Style\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"cx\"), s = b(\"tx\"), t = null, u = null, v = null, w = [], x;\n    function y() {\n        if (!u) {\n            v = m.create(\"div\", {\n                className: \"tooltipContent\"\n            });\n            var fa = m.create(\"i\", {\n                className: \"arrow\"\n            }), ga = m.create(\"div\", {\n                className: \"uiTooltipX\"\n            }, [v,fa,]);\n            u = new i({\n            }, ga);\n            u.shouldSetARIAProperties(false);\n            u.enableBehavior(j);\n        }\n    ;\n    };\n    function z(fa) {\n        return p({\n            content: fa.getAttribute(\"aria-label\"),\n            position: (fa.getAttribute(\"data-tooltip-position\") || \"above\"),\n            alignH: (fa.getAttribute(\"data-tooltip-alignh\") || \"left\")\n        }, l.get(fa, \"tooltip\"));\n    };\n    function aa(fa, ga) {\n        var ha = z(fa);\n        l.set(fa, \"tooltip\", {\n            content: (ga.content || ha.content),\n            position: (ga.position || ha.position),\n            alignH: (ga.alignH || ha.alignH),\n            suspend: (ga.suspend || ha.suspend)\n        });\n        fa.setAttribute(\"data-hover\", \"tooltip\");\n    };\n    function ba(fa, ga) {\n        ea.set(fa, \"Loading...\");\n        new h(ga).setHandler(function(ha) {\n            ea.set(fa, ha.getPayload());\n        }).setErrorHandler(q).send();\n    };\n    var ca = /(\\r\\n|[\\r\\n])/;\n    function da(fa) {\n        return fa.split(ca).map(function(ga) {\n            return (ca.test(ga) ? m.create(\"br\") : ga);\n        });\n    };\n    var ea = {\n        process: function(fa, ga) {\n            if (!m.contains(fa, ga)) {\n                return\n            };\n            if (((fa !== t) && !fa.getAttribute(\"data-tooltip-suspend\"))) {\n                var ha = fa.getAttribute(\"data-tooltip-uri\");\n                if (ha) {\n                    fa.removeAttribute(\"data-tooltip-uri\");\n                    ba(fa, ha);\n                }\n            ;\n                ea.show(fa);\n            }\n        ;\n        },\n        remove: function(fa) {\n            l.remove(fa, \"tooltip\");\n            fa.removeAttribute(\"data-hover\");\n            fa.removeAttribute(\"data-tooltip-position\");\n            fa.removeAttribute(\"data-tooltip-alignh\");\n            ((fa === t) && ea.hide());\n        },\n        suspend: function(fa) {\n            fa.setAttribute(\"data-tooltip-suspend\", true);\n            ((fa === t) && ea.hide());\n        },\n        unsuspend: function(fa) {\n            fa.removeAttribute(\"data-tooltip-suspend\");\n        },\n        hide: function() {\n            if (t) {\n                u.hide();\n                t = null;\n                while (w.length) {\n                    w.pop().remove();;\n                };\n            }\n        ;\n        },\n        set: function(fa, ga, ha, ia) {\n            if ((ha || ia)) {\n                aa(fa, {\n                    position: ha,\n                    alignH: ia\n                });\n            };\n            if ((ga instanceof o)) {\n                if ((fa === t)) {\n                    ba(fa, ga);\n                }\n                 else fa.setAttribute(\"data-tooltip-uri\", ga);\n            ;\n            }\n             else {\n                if ((typeof ga !== \"string\")) {\n                    ga = m.create(\"div\", {\n                    }, ga);\n                    fa.setAttribute(\"aria-label\", m.getText(ga));\n                }\n                 else fa.setAttribute(\"aria-label\", ga);\n            ;\n                aa(fa, {\n                    content: ga\n                });\n                ((fa === t) && ea.show(fa));\n            }\n        ;\n        },\n        show: function(fa) {\n            y();\n            ea.hide();\n            var ga = z(fa);\n            if (!ga.content) {\n                return\n            };\n            var ha = 0, ia = 0;\n            if (((ga.position === \"left\") || (ga.position === \"right\"))) {\n                x = (x || k.hasClass(document.body, \"-cx-PUBLIC-hasLitestand__body\"));\n                var ja = (x ? 28 : 20);\n                ia = (((fa.offsetHeight - ja)) / 2);\n            }\n             else if ((ga.alignH !== \"center\")) {\n                var ka = fa.offsetWidth;\n                if ((ka < 18)) {\n                    ha = ((((ka - 18)) / 2) * (((ga.alignH === \"right\") ? -1 : 1)));\n                };\n            }\n            \n        ;\n            u.setContext(fa).setOffsetX(ha).setOffsetY(ia).setPosition(ga.position).setAlignment(ga.alignH);\n            if ((typeof ga.content === \"string\")) {\n                k.addClass(u.getRoot(), \"invisible_elem\");\n                var la = m.create(\"span\", {\n                }, da(ga.content)), ma = m.create(\"div\", {\n                    className: \"tooltipText\"\n                }, la);\n                m.setContent(v, ma);\n                u.show();\n                var na;\n                if (ma.getClientRects) {\n                    var oa = ma.getClientRects()[0];\n                    if (oa) {\n                        na = Math.round((oa.right - oa.left));\n                    };\n                }\n            ;\n                if (!na) {\n                    na = ma.offsetWidth;\n                };\n                if ((na < la.offsetWidth)) {\n                    k.addClass(ma, \"tooltipWrap\");\n                    u.updatePosition();\n                }\n            ;\n                k.removeClass(u.getRoot(), \"invisible_elem\");\n            }\n             else {\n                m.setContent(v, ga.content);\n                u.show();\n            }\n        ;\n            var pa = function(ra) {\n                if (!m.contains(t, ra.getTarget())) {\n                    ea.hide();\n                };\n            };\n            w.push(g.listen(document.documentElement, \"mouseover\", pa), g.listen(document.documentElement, \"focusin\", pa));\n            var qa = n.getScrollParent(fa);\n            if ((qa !== window)) {\n                w.push(g.listen(qa, \"scroll\", ea.hide));\n            };\n            w.push(g.listen(fa, \"click\", ea.hide));\n            t = fa;\n        }\n    };\n    g.listen(window, \"scroll\", ea.hide);\n    e.exports = ea;\n});\n__d(\"SelectorDeprecated\", [\"Event\",\"Arbiter\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"HTML\",\"Keys\",\"KeyStatus\",\"MenuDeprecated\",\"Parent\",\"Style\",\"Toggler\",\"Tooltip\",\"Vector\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Button\"), j = b(\"ContextualLayer\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Focus\"), o = b(\"HTML\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"MenuDeprecated\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"Toggler\"), v = b(\"Tooltip\"), w = b(\"Vector\"), x = b(\"arrayContains\"), y = b(\"copyProperties\"), z = b(\"emptyFunction\"), aa, ba, ca = [], da;\n    function ea(pa) {\n        return s.byClass(pa, \"uiSelector\");\n    };\n    function fa(pa) {\n        return s.byClass(pa, \"uiSelectorButton\");\n    };\n    function ga() {\n        if (!ba) {\n            ba = new j({\n                position: \"below\"\n            }, m.create(\"div\"));\n            k.addClass(ba.getRoot(), \"uiSelectorContextualLayer\");\n        }\n    ;\n        return ba;\n    };\n    function ha(pa) {\n        return m.scry(pa, \"select\")[0];\n    };\n    function ia(pa) {\n        return m.find(pa, \"div.uiSelectorMenuWrapper\");\n    };\n    function ja() {\n        ja = z;\n        r.subscribe(\"select\", function(pa, qa) {\n            if (((!aa || !qa) || (qa.menu !== oa.getSelectorMenu(aa)))) {\n                return\n            };\n            var ra = ka(aa), sa = la(qa.item);\n            if (sa) {\n                var ta = aa, ua = oa.isOptionSelected(qa.item), va = oa.inform(\"select\", {\n                    selector: ta,\n                    option: qa.item,\n                    clone: da\n                });\n                if ((va === false)) {\n                    return\n                };\n                if ((ra || !ua)) {\n                    oa.setSelected(ta, oa.getOptionValue(qa.item), !ua);\n                    oa.inform(\"toggle\", {\n                        selector: ta,\n                        option: qa.item\n                    });\n                    oa.inform(\"change\", {\n                        selector: ta\n                    });\n                    h.inform(\"Form/change\", {\n                        node: ta\n                    });\n                    if (ma(ta)) {\n                        l.set(ta, \"dirty\", true);\n                    };\n                }\n            ;\n            }\n        ;\n            if ((!ra || !sa)) {\n                (aa && oa.toggle(aa));\n            };\n        });\n    };\n    function ka(pa) {\n        return !!pa.getAttribute(\"data-multiple\");\n    };\n    function la(pa) {\n        return k.hasClass(pa, \"uiSelectorOption\");\n    };\n    function ma(pa) {\n        return !!pa.getAttribute(\"data-autosubmit\");\n    };\n    var na = function() {\n        na = z;\n        var pa = {\n            keydown: function(event) {\n                var qa = event.getTarget();\n                if (m.isInputNode(qa)) {\n                    return\n                };\n                switch (g.getKeyCode(event)) {\n                  case p.DOWN:\n                \n                  case p.SPACE:\n                \n                  case p.UP:\n                    if (fa(qa)) {\n                        var ra = ea(qa);\n                        oa.toggle(ra);\n                        return false;\n                    }\n                ;\n                    break;\n                  case p.ESC:\n                    if (aa) {\n                        var sa = oa.getSelectorButton(aa);\n                        oa.toggle(aa);\n                        (sa && n.set(sa));\n                        return false;\n                    }\n                ;\n                    break;\n                };\n            },\n            mouseover: function(event) {\n                var qa = s.byAttribute(event.getTarget(), \"ajaxify\");\n                if ((qa && k.hasClass(qa, \"uiSelectorButton\"))) {\n                    oa.loadMenu(ea(qa));\n                };\n            }\n        };\n        g.listen(document.body, pa);\n    };\n    u.subscribe([\"show\",\"hide\",], function(pa, qa) {\n        var ra = ea(qa.getActive());\n        if (ra) {\n            na();\n            ja();\n            var sa = oa.getSelectorButton(ra), ta = oa.getSelectorMenu(ra), ua = (pa === \"show\");\n            sa.setAttribute(\"aria-expanded\", (ua ? \"true\" : \"false\"));\n            if (ua) {\n                aa = ra;\n                if (k.hasClass(sa, \"uiButtonDisabled\")) {\n                    oa.setEnabled(ra, false);\n                    return false;\n                }\n            ;\n                ta = (ta || oa.loadMenu(ra));\n                var va = t.getScrollParent(ra), wa = ((va !== window) && (va !== m.getDocumentScrollElement()));\n                if ((wa || k.hasClass(ra, \"uiSelectorUseLayer\"))) {\n                    if (wa) {\n                        ca.push(g.listen(va, \"scroll\", function() {\n                            qa.hide();\n                        }));\n                    };\n                    da = m.create(\"div\", {\n                        className: ra.className\n                    });\n                    k.addClass(da, \"invisible_elem\");\n                    w.getElementDimensions(ra).setElementDimensions(da);\n                    m.replace(ra, da);\n                    var xa = k.hasClass(ra, \"uiSelectorRight\"), ya = k.hasClass(ra, \"uiSelectorBottomUp\");\n                    ga().setContext(da).setContent(ra).setPosition((ya ? \"above\" : \"below\")).setAlignment((xa ? \"right\" : \"left\")).show();\n                }\n            ;\n                r.register(ta);\n                if (q.isKeyDown()) {\n                    var za = r.getCheckedItems(ta);\n                    if (!za.length) {\n                        za = r.getEnabledItems(ta);\n                    };\n                    r.focusItem(za[0]);\n                }\n            ;\n            }\n             else {\n                aa = null;\n                if (da) {\n                    while (ca.length) {\n                        ca.pop().remove();;\n                    };\n                    m.replace(da, ra);\n                    ga().hide();\n                    da = null;\n                }\n            ;\n                (ta && r.unregister(ta));\n                if ((ma(ra) && l.get(ra, \"dirty\"))) {\n                    var ab = m.scry(ra, \"input.submitButton\")[0];\n                    (ab && ab.click());\n                    l.remove(ra, \"dirty\");\n                }\n            ;\n            }\n        ;\n            k.conditionClass(oa.getSelectorButton(ra), \"selected\", ua);\n            oa.inform((ua ? \"open\" : \"close\"), {\n                selector: ra,\n                clone: da\n            });\n        }\n    ;\n    });\n    var oa = y(new h(), {\n        attachMenu: function(pa, qa, ra) {\n            pa = ea(pa);\n            if (pa) {\n                (aa && r.unregister(oa.getSelectorMenu(aa)));\n                m.setContent(ia(pa), qa);\n                (aa && r.register(oa.getSelectorMenu(pa)));\n                (da && ga().updatePosition());\n                if (ra) {\n                    var sa = pa.getAttribute(\"data-name\");\n                    (sa && ra.setAttribute(\"name\", sa));\n                    if (!ka(pa)) {\n                        ra.setAttribute(\"multiple\", false);\n                    };\n                    var ta = ha(pa);\n                    if (ta) {\n                        m.replace(ta, ra);\n                    }\n                     else m.insertAfter(pa.firstChild, ra);\n                ;\n                }\n            ;\n                return true;\n            }\n        ;\n        },\n        getOption: function(pa, qa) {\n            var ra = oa.getOptions(pa), sa = ra.length;\n            while (sa--) {\n                if ((qa === oa.getOptionValue(ra[sa]))) {\n                    return ra[sa]\n                };\n            };\n            return null;\n        },\n        getOptions: function(pa) {\n            var qa = r.getItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getEnabledOptions: function(pa) {\n            var qa = r.getEnabledItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getSelectedOptions: function(pa) {\n            return r.getCheckedItems(oa.getSelectorMenu(pa));\n        },\n        getOptionText: function(pa) {\n            return r.getItemLabel(pa);\n        },\n        getOptionValue: function(pa) {\n            var qa = ea(pa), ra = ha(qa), sa = oa.getOptions(qa).indexOf(pa);\n            return ((sa >= 0) ? ra.options[(sa + 1)].value : \"\");\n        },\n        getSelectorButton: function(pa) {\n            return m.find(pa, \"a.uiSelectorButton\");\n        },\n        getSelectorMenu: function(pa) {\n            return m.scry(pa, \"div.uiSelectorMenu\")[0];\n        },\n        getValue: function(pa) {\n            var qa = ha(pa);\n            if (!qa) {\n                return null\n            };\n            if (!ka(pa)) {\n                return qa.value\n            };\n            var ra = [], sa = qa.options;\n            for (var ta = 1, ua = sa.length; (ta < ua); ta++) {\n                if (sa[ta].selected) {\n                    ra.push(sa[ta].value);\n                };\n            };\n            return ra;\n        },\n        isOptionSelected: function(pa) {\n            return r.isItemChecked(pa);\n        },\n        listen: function(pa, qa, ra) {\n            return this.subscribe(qa, function(sa, ta) {\n                if ((ta.selector === pa)) {\n                    return ra(ta, sa)\n                };\n            });\n        },\n        loadMenu: function(pa) {\n            var qa = oa.getSelectorMenu(pa);\n            if (!qa) {\n                var ra = oa.getSelectorButton(pa), sa = ra.getAttribute(\"ajaxify\");\n                if (sa) {\n                    d([\"AsyncRequest\",], function(ua) {\n                        ua.bootstrap(sa, ra);\n                    });\n                    var ta = o(((((((\"\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\" + \"\\u003Cdiv class=\\\"uiMenu uiSelectorMenu loading\\\"\\u003E\") + \"\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\") + \"\\u003Cli\\u003E\\u003Cspan\\u003E\\u003C/span\\u003E\\u003C/li\\u003E\") + \"\\u003C/ul\\u003E\") + \"\\u003C/div\\u003E\") + \"\\u003C/div\\u003E\"));\n                    m.appendContent(ra.parentNode, ta);\n                    qa = oa.getSelectorMenu(pa);\n                    ra.removeAttribute(\"onmouseover\");\n                }\n            ;\n            }\n        ;\n            return qa;\n        },\n        setButtonLabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = parseInt(ra.getAttribute(\"data-length\"), 10);\n            qa = ((qa || ra.getAttribute(\"data-label\")) || \"\");\n            i.setLabel(ra, qa);\n            if ((typeof qa === \"string\")) {\n                k.conditionClass(ra, \"uiSelectorBigButtonLabel\", (qa.length > sa));\n                if ((sa && (qa.length > sa))) {\n                    ra.setAttribute(\"title\", qa);\n                }\n                 else ra.removeAttribute(\"title\");\n            ;\n            }\n        ;\n        },\n        setButtonTooltip: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            (sa && v.set(sa, ((qa || ra.getAttribute(\"data-tooltip\")) || \"\")));\n        },\n        updateButtonARIALabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            if (sa) {\n                var ta = ra.getAttribute(\"data-ariaprefix\");\n                if (ta) {\n                    ra.setAttribute(\"aria-label\", ((ta + \": \") + qa));\n                };\n            }\n        ;\n        },\n        setEnabled: function(pa, qa) {\n            if (((!qa && aa) && (ea(pa) === aa))) {\n                oa.toggle(pa);\n            };\n            i.setEnabled(oa.getSelectorButton(pa), qa);\n        },\n        setOptionEnabled: function(pa, qa) {\n            r.setItemEnabled(pa, qa);\n        },\n        setSelected: function(pa, qa, ra) {\n            ra = (ra !== false);\n            var sa = oa.getOption(pa, qa);\n            if (!sa) {\n                return\n            };\n            var ta = oa.isOptionSelected(sa);\n            if ((ra !== ta)) {\n                if ((!ka(pa) && !ta)) {\n                    var ua = oa.getSelectedOptions(pa)[0];\n                    (ua && r.toggleItem(ua));\n                }\n            ;\n                r.toggleItem(sa);\n            }\n        ;\n            oa.updateSelector(pa);\n        },\n        toggle: function(pa) {\n            u.toggle(m.scry(ea(pa), \"div.wrap\")[0]);\n        },\n        updateSelector: function(pa) {\n            var qa = oa.getOptions(pa), ra = oa.getSelectedOptions(pa), sa = ha(pa).options, ta = [], ua = [];\n            for (var va = 0, wa = qa.length; (va < wa); va++) {\n                var xa = x(ra, qa[va]);\n                sa[(va + 1)].selected = xa;\n                if (xa) {\n                    var ya = oa.getOptionText(qa[va]);\n                    ta.push(ya);\n                    ua.push((qa[va].getAttribute(\"data-tooltip\") || ya));\n                }\n            ;\n            };\n            sa[0].selected = !ra.length;\n            var za = k.hasClass(pa, \"uiSelectorDynamicLabel\"), ab = k.hasClass(pa, \"uiSelectorDynamicTooltip\");\n            if ((za || ab)) {\n                var bb = \"\";\n                if (ka(pa)) {\n                    var cb = oa.getSelectorButton(pa);\n                    bb = (cb.getAttribute(\"data-delimiter\") || \", \");\n                }\n            ;\n                ta = ta.join(bb);\n                ua = ua.join(bb);\n                if (za) {\n                    oa.setButtonLabel(pa, ta);\n                    oa.updateButtonARIALabel(pa, ta);\n                }\n            ;\n                (ab && oa.setButtonTooltip(pa, ua));\n            }\n        ;\n        }\n    });\n    e.exports = oa;\n});\n__d(\"SubscriptionsHandler\", [\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"copyProperties\"), i = g.create(\"subscriptions_handler\");\n    function j(k) {\n        this._name = (k || \"unnamed\");\n        this._subscriptions = [];\n    };\n    h(j.prototype, {\n        addSubscriptions: function() {\n            if (this._subscriptions) {\n                Array.prototype.push.apply(this._subscriptions, arguments);\n            }\n             else {\n                i.warn((this._name + \".subscribe_while_released\"));\n                for (var k = 0, l = arguments.length; (k < l); k++) {\n                    this._unsubscribe(arguments[k]);;\n                };\n            }\n        ;\n        },\n        engage: function() {\n            this._subscriptions = (this._subscriptions || []);\n        },\n        release: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(this._unsubscribe.bind(this));\n            };\n            this._subscriptions = null;\n        },\n        _unsubscribe: function(k) {\n            if (k.remove) {\n                k.remove();\n            }\n             else if (k.reset) {\n                k.reset();\n            }\n             else if (k.unsubscribe) {\n                k.unsubscribe();\n            }\n             else i.error((this._name + \".invalid\"), k);\n            \n            \n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"UserActivity\", [\"Arbiter\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = 5000, j = 500, k = -5, l = Date.now(), m = l, n = {\n        subscribeOnce: function(p) {\n            var q = n.subscribe(function() {\n                n.unsubscribe(q);\n                p();\n            });\n        },\n        subscribe: function(p) {\n            return g.subscribe(\"useractivity/activity\", p);\n        },\n        unsubscribe: function(p) {\n            p.unsubscribe();\n        },\n        isActive: function(p) {\n            return (((new Date() - l) < ((p || i))));\n        },\n        getLastInformTime: function() {\n            return m;\n        }\n    };\n    function o(event) {\n        l = Date.now();\n        var p = (l - m);\n        if ((p > j)) {\n            m = l;\n            g.inform(\"useractivity/activity\", {\n                event: event,\n                idleness: p,\n                last_inform: m\n            });\n        }\n         else if ((p < k)) {\n            m = l;\n        }\n    ;\n    };\n    h.listen(window, \"scroll\", o);\n    h.listen(window, \"focus\", o);\n    h.listen(document.documentElement, {\n        DOMMouseScroll: o,\n        mousewheel: o,\n        keydown: o,\n        mouseover: o,\n        mousemove: o,\n        click: o\n    });\n    g.subscribe(\"Event/stop\", function(p, q) {\n        o(q.event);\n    });\n    e.exports = n;\n});\n__d(\"enforceMaxLength\", [\"Event\",\"function-extensions\",\"DOM\",\"Input\",\"InputSelection\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"DOM\"), i = b(\"Input\"), j = b(\"InputSelection\"), k = function(n, o) {\n        var p = i.getValue(n), q = p.length, r = (q - o);\n        if ((r > 0)) {\n            var s, t;\n            try {\n                s = j.get(n);\n                t = s.end;\n            } catch (u) {\n                s = null;\n                t = 0;\n            };\n            if ((t >= r)) {\n                q = t;\n            };\n            var v = (q - r);\n            if ((v && (((p.charCodeAt((v - 1)) & 64512)) === 55296))) {\n                v--;\n            };\n            t = Math.min(t, v);\n            i.setValue(n, (p.slice(0, v) + p.slice(q)));\n            if (s) {\n                j.set(n, Math.min(s.start, t), t);\n            };\n        }\n    ;\n    }, l = function(event) {\n        var n = event.getTarget(), o = (n.getAttribute && parseInt(n.getAttribute(\"maxlength\"), 10));\n        if (((o > 0) && h.isNodeOfType(n, [\"input\",\"textarea\",]))) {\n            k.bind(null, n, o).defer();\n        };\n    }, m = ((\"maxLength\" in h.create(\"input\")) && (\"maxLength\" in h.create(\"textarea\")));\n    if (!m) {\n        g.listen(document.documentElement, {\n            keydown: l,\n            paste: l\n        });\n    };\n    e.exports = k;\n});\n__d(\"guid\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return (\"f\" + ((Math.random() * ((1 << 30)))).toString(16).replace(\".\", \"\"));\n    };\n    e.exports = g;\n});\n__d(\"reportData\", [\"EagleEye\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"EagleEye\"), h = b(\"userAction\");\n    function i(j, k) {\n        k = (k || {\n        });\n        var l = {\n            ft: ((k.ft || {\n            })),\n            gt: ((k.gt || {\n            }))\n        }, m = \"-\", n = a.ArbiterMonitor, o = ((!!n) ? n.getActFields() : []), p = ((!n) ? \"r\" : \"a\"), q = [Date.now(),h.getCurrentUECount(),m,j,m,m,p,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),l,0,0,0,0,].concat(o);\n        g.log(\"act\", q);\n    };\n    e.exports = i;\n});\n__d(\"NetEgo\", [\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"ge\",\"Animation\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"ge\"), l = b(\"Animation\"), m = {\n        setup: function(n) {\n            g.subscribe([\"page/liked\",\"FriendRequest/sending\",], function(o, p) {\n                if (((n == p.id) || (n == p.uid))) {\n                    var q = k(document.body, \".ego_unit_container\");\n                    if (q) {\n                        var r = i.scry(q, \".ego_unit\"), s = r.length;\n                        for (var t = 0; (t < s); t++) {\n                            var u = r[t].getAttribute(\"data-ego-fbid\");\n                            if (((u == p.id) || (u == p.uid))) {\n                                var v = i.find(r[t], \".ego_action a\");\n                                if (v) {\n                                    v.click();\n                                };\n                                break;\n                            }\n                        ;\n                        };\n                    }\n                ;\n                }\n            ;\n            });\n        },\n        updateXids: function(n, o) {\n            if (((n.length == 0) && (o.length == 0))) {\n                return\n            };\n            var p = function(z) {\n                return function(aa) {\n                    var ba = aa.getAttribute(z);\n                    if (!ba) {\n                        return false\n                    };\n                    var ca = new j(ba).getQueryData();\n                    return !!ca.xids;\n                };\n            }, q = i.scry(document.body, \".ego_unit a\");\n            q = q.filter(p(\"ajaxify\"));\n            if ((q.length == 0)) {\n                return\n            };\n            var r = new j(q[0].getAttribute(\"ajaxify\")), s = r.getQueryData();\n            if (!s.xids) {\n                return\n            };\n            try {\n                var u = JSON.parse(s.xids);\n            } catch (t) {\n                return;\n            };\n            for (var v = 0; (v < n.length); ++v) {\n                delete u[n[v]];;\n            };\n            for (v = 0; (v < o.length); ++v) {\n                u[o[v]] = 1;;\n            };\n            var w = JSON.stringify(u), x = function(z, aa) {\n                r = new j(z.getAttribute(aa));\n                s = r.getQueryData();\n                s.xids = w;\n                r.setQueryData(s);\n                z.setAttribute(aa, r.toString());\n            };\n            for (v = 0; (v < q.length); ++v) {\n                x(q[v], \"ajaxify\");;\n            };\n            var y = i.scry(document.body, \".ego_unit form\");\n            y = y.filter(p(\"action\"));\n            for (v = 0; (v < y.length); ++v) {\n                x(y[v], \"action\");;\n            };\n        },\n        replaceUnit: function(n, o, p, q) {\n            var r = i.insertAfter(n, o);\n            r.forEach(h.hide);\n            if (((q !== undefined) && (q !== null))) {\n                (function() {\n                    m._replaceUnitFadeout(n, r, p);\n                }).defer(q);\n            }\n             else m._replaceUnitFadeout(n, r, p);\n        ;\n        },\n        _replaceUnitFadeout: function(n, o, p) {\n            if (p) {\n                new l(n).from(\"opacity\", 1).to(\"opacity\", 0).duration(p).checkpoint(1, function() {\n                    m._replaceUnitElement(n, o);\n                }).go();\n            }\n             else m._replaceUnitElement(n, o);\n        ;\n        },\n        _replaceUnitElement: function(n, o) {\n            i.remove(n);\n            o.forEach(h.show);\n            g.inform(\"netego_replacedUnit\");\n            m.clearHeader();\n        },\n        clearHeader: function() {\n            var n = i.scry(document.body, \".ego_column\"), o = [];\n            for (var p = 0; (p < n.length); ++p) {\n                o = o.concat(i.scry(n[p], \".uiHeader\"));;\n            };\n            for (p = 0; (p < o.length); ++p) {\n                var q = o[p].nextSibling;\n                if ((!q || (q.childNodes.length === 0))) {\n                    i.remove(o[p]);\n                }\n                 else if ((q.childNodes.length === 1)) {\n                    var r = q.childNodes[0];\n                    if ((h.hasClass(r, \"ego_appended_units\") && (r.childNodes.length === 0))) {\n                        i.remove(o[p]);\n                    };\n                }\n                \n            ;\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ControlledReferer\", [\"Event\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"URI\"), i = b(\"UserAgent\"), j = {\n        useFacebookReferer: function(k, l, m) {\n            var n = false;\n            function o() {\n                if (n) {\n                    return\n                };\n                var q = k.contentWindow.location.pathname;\n                if (((q !== \"/intern/common/referer_frame.php\") && (q !== \"/common/referer_frame.php\"))) {\n                    return\n                };\n                n = true;\n                k.contentWindow.document.body.style.margin = 0;\n                l();\n            };\n            var p;\n            if ((document.domain !== \"facebook.com\")) {\n                p = \"/intern/common/referer_frame.php\";\n            }\n             else if (i.opera()) {\n                p = \"/common/referer_frame.php\";\n            }\n             else if (h().isSecure()) {\n                p = \"https://s-static.ak.facebook.com/common/referer_frame.php\";\n            }\n             else p = \"http://static.ak.facebook.com/common/referer_frame.php\";\n            \n            \n        ;\n            if (m) {\n                p += (\"?fb_source=\" + m);\n            };\n            g.listen(k, \"load\", o);\n            k.src = p;\n        },\n        useFacebookRefererHtml: function(k, l, m) {\n            j.useFacebookReferer(k, function() {\n                k.contentWindow.document.body.innerHTML = l;\n            }, m);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UIIntentionalStreamMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        SET_AUTO_INSERT: \"UIIntentionalStream/setAutoInsert\",\n        UPDATE_STREAM: \"UIIntentionalStreamRefresh/updateStream\",\n        REFRESH_STREAM: \"UIIntentionalStreamRefresh/refreshStream\",\n        UPDATE_AUTOREFRESH_CONFIG: \"UIIntentionalStream/updateAutoRefreshConfig\",\n        UPDATE_HTML_CONTENT: \"UIIntentionalStream/updateHtmlContent\",\n        UPDATE_LAST_REFRESH_TIME: \"UIIntentionalStream/updateLastRefreshTime\",\n        INSERT_STORIES: \"UIIntentionalStream/updateLastRefreshTime\",\n        UNLOAD: \"UIIntentionalStream/unload\"\n    };\n    e.exports = g;\n});\n__d(\"UIPagelet\", [\"AjaxPipeRequest\",\"AsyncRequest\",\"DOM\",\"HTML\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"ScriptPathState\"), l = b(\"URI\"), m = b(\"copyProperties\"), n = b(\"emptyFunction\"), o = b(\"ge\");\n    function p(q, r, s) {\n        var t = ((q && i.isElementNode(q)) ? q.id : q);\n        this._id = (t || null);\n        this._element = o((q || i.create(\"div\")));\n        this._src = (r || null);\n        this._context_data = (s || {\n        });\n        this._data = {\n        };\n        this._handler = n;\n        this._request = null;\n        this._use_ajaxpipe = false;\n        this._is_bundle = true;\n        this._allow_cross_page_transition = false;\n        this._append = false;\n    };\n    p.loadFromEndpoint = function(q, r, s, t) {\n        t = (t || {\n        });\n        var u = (\"/ajax/pagelet/generic.php/\" + q);\n        if (t.intern) {\n            u = (\"/intern\" + u);\n        };\n        var v = new l(u.replace(/\\/+/g, \"/\"));\n        if (t.subdomain) {\n            v.setSubdomain(t.subdomain);\n        };\n        var w = new p(r, v, s).setUseAjaxPipe(t.usePipe).setBundleOption((t.bundle !== false)).setAppend(t.append).setJSNonBlock(t.jsNonblock).setAutomatic(t.automatic).setDisplayCallback(t.displayCallback).setConstHeight(t.constHeight).setAllowCrossPageTransition(t.crossPage).setFinallyHandler((t.finallyHandler || n)).setTransportErrorHandler(t.transportErrorHandler);\n        (t.handler && w.setHandler(t.handler));\n        w.go();\n        return w;\n    };\n    m(p.prototype, {\n        getElement: function() {\n            return this._element;\n        },\n        setHandler: function(q) {\n            this._handler = q;\n            return this;\n        },\n        go: function(q, r) {\n            if (((arguments.length >= 2) || (typeof q == \"string\"))) {\n                this._src = q;\n                this._data = (r || {\n                });\n            }\n             else if ((arguments.length == 1)) {\n                this._data = q;\n            }\n        ;\n            this.refresh();\n            return this;\n        },\n        setAllowCrossPageTransition: function(q) {\n            this._allow_cross_page_transition = q;\n            return this;\n        },\n        setBundleOption: function(q) {\n            this._is_bundle = q;\n            return this;\n        },\n        setTransportErrorHandler: function(q) {\n            this.transportErrorHandler = q;\n            return this;\n        },\n        refresh: function() {\n            if (this._use_ajaxpipe) {\n                k.setIsUIPageletRequest(true);\n                this._request = new g();\n                this._request.setCanvasId(this._id).setAppend(this._append).setConstHeight(this._constHeight).setJSNonBlock(this._jsNonblock).setAutomatic(this._automatic).setDisplayCallback(this._displayCallback).setFinallyHandler(this._finallyHandler);\n            }\n             else {\n                var q = function(t) {\n                    this._request = null;\n                    var u = j(t.getPayload());\n                    if (this._append) {\n                        i.appendContent(this._element, u);\n                    }\n                     else i.setContent(this._element, u);\n                ;\n                    this._handler();\n                }.bind(this), r = this._displayCallback;\n                this._request = new h().setMethod(\"GET\").setReadOnly(true).setOption(\"bundle\", this._is_bundle).setHandler(function(t) {\n                    if (r) {\n                        r(q.curry(t));\n                    }\n                     else q(t);\n                ;\n                    if (this._finallyHandler) {\n                        this._finallyHandler();\n                    };\n                });\n                if (this.transportErrorHandler) {\n                    this._request.setTransportErrorHandler(this.transportErrorHandler);\n                };\n            }\n        ;\n            var s = {\n            };\n            m(s, this._context_data);\n            m(s, this._data);\n            this._request.setURI(this._src).setAllowCrossPageTransition(this._allow_cross_page_transition).setData({\n                data: JSON.stringify(s)\n            }).send();\n            return this;\n        },\n        cancel: function() {\n            if (this._request) {\n                this._request.abort();\n            };\n        },\n        setUseAjaxPipe: function(q) {\n            this._use_ajaxpipe = !!q;\n            return this;\n        },\n        setAppend: function(q) {\n            this._append = !!q;\n            return this;\n        },\n        setJSNonBlock: function(q) {\n            this._jsNonblock = !!q;\n            return this;\n        },\n        setAutomatic: function(q) {\n            this._automatic = !!q;\n            return this;\n        },\n        setDisplayCallback: function(q) {\n            this._displayCallback = q;\n            return this;\n        },\n        setConstHeight: function(q) {\n            this._constHeight = !!q;\n            return this;\n        },\n        setFinallyHandler: function(q) {\n            this._finallyHandler = q;\n            return this;\n        }\n    });\n    e.exports = p;\n});\n__d(\"ScrollableArea\", [\"Animation\",\"ArbiterMixin\",\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Parent\",\"Run\",\"SimpleDrag\",\"Style\",\"UserAgent\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"Parent\"), o = b(\"Run\"), p = b(\"SimpleDrag\"), q = b(\"Style\"), r = b(\"UserAgent\"), s = b(\"Vector\"), t = b(\"copyProperties\"), u = b(\"throttle\"), v = 12;\n    function w(x, y) {\n        if (!x) {\n            return\n        };\n        y = (y || {\n        });\n        this._elem = x;\n        this._wrap = l.find(x, \"div.uiScrollableAreaWrap\");\n        this._body = l.find(this._wrap, \"div.uiScrollableAreaBody\");\n        this._content = l.find(this._body, \"div.uiScrollableAreaContent\");\n        this._track = l.find(x, \"div.uiScrollableAreaTrack\");\n        this._gripper = l.find(this._track, \"div.uiScrollableAreaGripper\");\n        this._options = y;\n        this._throttledComputeHeights = u.withBlocking(this._computeHeights, 250, this);\n        this.throttledAdjustGripper = u.withBlocking(this.adjustGripper, 250, this);\n        this._throttledShowGripperAndShadows = u.withBlocking(this._showGripperAndShadows, 250, this);\n        this._throttledRespondMouseMove = u(this._respondMouseMove, 250, this);\n        this.adjustGripper.bind(this).defer();\n        this._listeners = [m.listen(this._wrap, \"scroll\", this._handleScroll.bind(this)),m.listen(x, \"mousemove\", this._handleMouseMove.bind(this)),m.listen(this._track, \"click\", this._handleClickOnTrack.bind(this)),];\n        if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"click\", this._handleClickOnTrack.bind(this)));\n        };\n        if ((y.fade !== false)) {\n            this._listeners.push(m.listen(x, \"mouseenter\", this._handleMouseEnter.bind(this)), m.listen(x, \"mouseleave\", this._handleMouseLeave.bind(this)), m.listen(x, \"focusin\", this.showScrollbar.bind(this, false)), m.listen(x, \"focusout\", this.hideScrollbar.bind(this)));\n        }\n         else if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"mouseleave\", j.removeClass.curry(x, \"uiScrollableAreaTrackOver\")));\n        }\n    ;\n        if ((r.webkit() || r.chrome())) {\n            this._listeners.push(m.listen(x, \"mousedown\", function() {\n                var z = m.listen(window, \"mouseup\", function() {\n                    if (x.scrollLeft) {\n                        x.scrollLeft = 0;\n                    };\n                    z.remove();\n                });\n            }));\n        }\n         else if (r.firefox()) {\n            this._wrap.addEventListener(\"DOMMouseScroll\", function(event) {\n                ((event.axis === event.HORIZONTAL_AXIS) && event.preventDefault());\n            }, false);\n        }\n    ;\n        this.initDrag();\n        k.set(this._elem, \"ScrollableArea\", this);\n        if (!y.persistent) {\n            o.onLeave(this.destroy.bind(this));\n        };\n        if ((y.shadow !== false)) {\n            j.addClass(this._elem, \"uiScrollableAreaWithShadow\");\n        };\n    };\n    t(w, {\n        renderDOM: function() {\n            var x = l.create(\"div\", {\n                className: \"uiScrollableAreaContent\"\n            }), y = l.create(\"div\", {\n                className: \"uiScrollableAreaBody\"\n            }, x), z = l.create(\"div\", {\n                className: \"uiScrollableAreaWrap\"\n            }, y), aa = l.create(\"div\", {\n                className: \"uiScrollableArea native\"\n            }, z);\n            return {\n                root: aa,\n                wrap: z,\n                body: y,\n                content: x\n            };\n        },\n        fromNative: function(x, y) {\n            if ((!j.hasClass(x, \"uiScrollableArea\") || !j.hasClass(x, \"native\"))) {\n                return\n            };\n            y = (y || {\n            });\n            j.removeClass(x, \"native\");\n            var z = l.create(\"div\", {\n                className: \"uiScrollableAreaTrack\"\n            }, l.create(\"div\", {\n                className: \"uiScrollableAreaGripper\"\n            }));\n            if ((y.fade !== false)) {\n                j.addClass(x, \"fade\");\n                j.addClass(z, \"invisible_elem\");\n            }\n             else j.addClass(x, \"nofade\");\n        ;\n            l.appendContent(x, z);\n            var aa = new w(x, y);\n            aa.resize();\n            return aa;\n        },\n        getInstance: function(x) {\n            var y = n.byClass(x, \"uiScrollableArea\");\n            return (y ? k.get(y, \"ScrollableArea\") : null);\n        },\n        poke: function(x) {\n            var y = w.getInstance(x);\n            (y && y.poke());\n        }\n    });\n    t(w.prototype, h, {\n        initDrag: function() {\n            var x = i.hasPointerEvents(), y = new p((x ? this._elem : this._gripper));\n            y.subscribe(\"start\", function(z, event) {\n                if (!((((event.which && (event.which === 1))) || ((event.button && (event.button === 1)))))) {\n                    return\n                };\n                var aa = s.getEventPosition(event, \"viewport\");\n                if (x) {\n                    var ba = this._gripper.getBoundingClientRect();\n                    if (((((aa.x < ba.left) || (aa.x > ba.right)) || (aa.y < ba.top)) || (aa.y > ba.bottom))) {\n                        return false\n                    };\n                }\n            ;\n                this.inform(\"grip_start\");\n                var ca = aa.y, da = this._gripper.offsetTop;\n                j.addClass(this._elem, \"uiScrollableAreaDragging\");\n                var ea = y.subscribe(\"update\", function(ga, event) {\n                    var ha = (s.getEventPosition(event, \"viewport\").y - ca);\n                    this._throttledComputeHeights();\n                    var ia = (this._contentHeight - this._containerHeight), ja = (da + ha), ka = (this._trackHeight - this._gripperHeight);\n                    ja = Math.max(Math.min(ja, ka), 0);\n                    var la = ((ja / ka) * ia);\n                    this._wrap.scrollTop = la;\n                }.bind(this)), fa = y.subscribe(\"end\", function() {\n                    y.unsubscribe(ea);\n                    y.unsubscribe(fa);\n                    j.removeClass(this._elem, \"uiScrollableAreaDragging\");\n                    this.inform(\"grip_end\");\n                }.bind(this));\n            }.bind(this));\n        },\n        adjustGripper: function() {\n            if (this._needsGripper()) {\n                q.set(this._gripper, \"height\", (this._gripperHeight + \"px\"));\n                this._slideGripper();\n            }\n        ;\n            this._throttledShowGripperAndShadows();\n            return this;\n        },\n        _computeHeights: function() {\n            this._containerHeight = this._elem.clientHeight;\n            this._contentHeight = this._content.offsetHeight;\n            this._trackHeight = this._track.offsetHeight;\n            this._gripperHeight = Math.max(((this._containerHeight / this._contentHeight) * this._trackHeight), v);\n        },\n        _needsGripper: function() {\n            this._throttledComputeHeights();\n            return (this._gripperHeight < this._trackHeight);\n        },\n        _slideGripper: function() {\n            var x = ((this._wrap.scrollTop / ((this._contentHeight - this._containerHeight))) * ((this._trackHeight - this._gripperHeight)));\n            q.set(this._gripper, \"top\", (x + \"px\"));\n        },\n        _showGripperAndShadows: function() {\n            j.conditionShow(this._gripper, this._needsGripper());\n            j.conditionClass(this._elem, \"contentBefore\", (this._wrap.scrollTop > 0));\n            j.conditionClass(this._elem, \"contentAfter\", !this.isScrolledToBottom());\n        },\n        destroy: function() {\n            this._listeners.forEach(function(x) {\n                x.remove();\n            });\n            this._listeners.length = 0;\n        },\n        _handleClickOnTrack: function(event) {\n            var x = s.getEventPosition(event, \"viewport\"), y = this._gripper.getBoundingClientRect();\n            if (((x.x < y.right) && (x.x > y.left))) {\n                if ((x.y < y.top)) {\n                    this.setScrollTop((this.getScrollTop() - this._elem.clientHeight));\n                }\n                 else if ((x.y > y.bottom)) {\n                    this.setScrollTop((this.getScrollTop() + this._elem.clientHeight));\n                }\n            ;\n                event.prevent();\n            }\n        ;\n        },\n        _handleMouseMove: function(event) {\n            var x = (this._options.fade !== false);\n            if ((i.hasPointerEvents() || x)) {\n                this._mousePos = s.getEventPosition(event);\n                this._throttledRespondMouseMove();\n            }\n        ;\n        },\n        _respondMouseMove: function() {\n            if (!this._mouseOver) {\n                return\n            };\n            var x = (this._options.fade !== false), y = this._mousePos, z = s.getElementPosition(this._track).x, aa = s.getElementDimensions(this._track).x, ba = Math.abs(((z + (aa / 2)) - y.x));\n            j.conditionClass(this._elem, \"uiScrollableAreaTrackOver\", (i.hasPointerEvents() && (ba <= 10)));\n            if (x) {\n                if ((ba < 25)) {\n                    this.showScrollbar(false);\n                }\n                 else if (!this._options.no_fade_on_hover) {\n                    this.hideScrollbar();\n                }\n            \n            };\n        },\n        _handleScroll: function(event) {\n            if (this._needsGripper()) {\n                this._slideGripper();\n            };\n            this.throttledAdjustGripper();\n            if ((this._options.fade !== false)) {\n                this.showScrollbar();\n            };\n            this.inform(\"scroll\");\n        },\n        _handleMouseLeave: function() {\n            this._mouseOver = false;\n            this.hideScrollbar();\n        },\n        _handleMouseEnter: function() {\n            this._mouseOver = true;\n            this.showScrollbar();\n        },\n        hideScrollbar: function(x) {\n            if (!this._scrollbarVisible) {\n                return this\n            };\n            this._scrollbarVisible = false;\n            if (this._hideTimeout) {\n                clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n            if (x) {\n                q.set(this._track, \"opacity\", 0);\n                j.addClass.curry(this._track, \"invisible_elem\");\n            }\n             else this._hideTimeout = function() {\n                if (this._hideAnimation) {\n                    this._hideAnimation.stop();\n                    this._hideAnimation = null;\n                }\n            ;\n                this._hideAnimation = (new g(this._track)).from(\"opacity\", 1).to(\"opacity\", 0).duration(250).ondone(j.addClass.curry(this._track, \"invisible_elem\")).go();\n            }.bind(this).defer(750);\n        ;\n            return this;\n        },\n        resize: function() {\n            var x = s.getElementDimensions(this._elem).x;\n            if ((this._options.fade === false)) {\n                x -= 10;\n            };\n            x = Math.max(0, x);\n            q.set(this._body, \"width\", (x + \"px\"));\n            return this;\n        },\n        showScrollbar: function(x) {\n            this.throttledAdjustGripper();\n            if (this._scrollbarVisible) {\n                return this\n            };\n            this._scrollbarVisible = true;\n            if (this._hideTimeout) {\n                clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n            if (this._hideAnimation) {\n                this._hideAnimation.stop();\n                this._hideAnimation = null;\n            }\n        ;\n            q.set(this._track, \"opacity\", 1);\n            j.removeClass(this._track, \"invisible_elem\");\n            if ((((x !== false)) && !this._options.no_fade_on_hover)) {\n                this.hideScrollbar();\n            };\n            return this;\n        },\n        isScrolledToBottom: function() {\n            return (this._wrap.scrollTop >= (this._contentHeight - this._containerHeight));\n        },\n        isScrolledToTop: function() {\n            return (this._wrap.scrollTop === 0);\n        },\n        scrollToBottom: function(x) {\n            this.setScrollTop(this._wrap.scrollHeight, x);\n        },\n        scrollToTop: function(x) {\n            this.setScrollTop(0, x);\n        },\n        scrollIntoView: function(x, y) {\n            var z = this._wrap.clientHeight, aa = x.offsetHeight, ba = this._wrap.scrollTop, ca = (ba + z), da = x.offsetTop, ea = (da + aa);\n            if (((da < ba) || (z < aa))) {\n                this.setScrollTop(da, y);\n            }\n             else if ((ea > ca)) {\n                this.setScrollTop((ba + ((ea - ca))), y);\n            }\n        ;\n        },\n        poke: function() {\n            var x = this._wrap.scrollTop;\n            this._wrap.scrollTop += 1;\n            this._wrap.scrollTop -= 1;\n            this._wrap.scrollTop = x;\n            return this.showScrollbar(false);\n        },\n        getScrollTop: function() {\n            return this._wrap.scrollTop;\n        },\n        getScrollHeight: function() {\n            return this._wrap.scrollHeight;\n        },\n        setScrollTop: function(x, y, z) {\n            if ((y !== false)) {\n                if (this._scrollTopAnimation) {\n                    this._scrollTopAnimation.stop();\n                };\n                z = (z || {\n                });\n                var aa = (z.duration || 250), ba = (z.ease || g.ease.end);\n                this._scrollTopAnimation = (new g(this._wrap)).to(\"scrollTop\", x).ease(ba).duration(aa).go();\n            }\n             else this._wrap.scrollTop = x;\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Menu\", [\"CSS\",\"Class\",\"DataStore\",\"DOM\",\"Event\",\"Keys\",\"Parent\",\"PopoverMenuInterface\",\"ScrollableArea\",\"Style\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Class\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"PopoverMenuInterface\"), o = b(\"ScrollableArea\"), p = b(\"Style\"), q = b(\"copyProperties\"), r = b(\"cx\");\n    function s(t, u) {\n        this.parent.construct(this);\n        this._items = [];\n        for (var v = 0; (v < t.length); v++) {\n            this._items[v] = new t[v].ctor(t[v]);;\n        };\n        this._config = (u || {\n        });\n        this._theme = (u.theme || {\n        });\n    };\n    h.extend(s, n);\n    q(s.prototype, {\n        _focused: null,\n        _root: null,\n        addItem: function(t) {\n            this._addItem(t);\n        },\n        addItemBefore: function(t, u) {\n            this._addItem(t, u, false);\n        },\n        addItemAfter: function(t, u) {\n            this._addItem(t, u, true);\n        },\n        _addItem: function(t, u, v) {\n            var w = this._items.indexOf(t);\n            if ((w >= 0)) {\n                var x = (v ? -1 : 1);\n                if ((this._items[(w + x)] == u)) {\n                    return\n                };\n                this._items.splice(w, 1);\n            }\n        ;\n            if (u) {\n                w = this._items.indexOf(u);\n                if ((w < 0)) {\n                    throw new Error(\"reference item must already be in the menu\")\n                };\n                if (v) {\n                    w++;\n                };\n                this._items.splice(w, 0, t);\n            }\n             else this._items.push(t);\n        ;\n            if (this._root) {\n                this._insertItem(t, u, v);\n            };\n        },\n        removeItem: function(t) {\n            var u = this._items.indexOf(t);\n            if ((u < 0)) {\n                return\n            };\n            this._items.splice(u, 1);\n            (this._root && j.remove(t.getRoot()));\n        },\n        forEachItem: function(t) {\n            this._items.forEach(t);\n        },\n        getItemAt: function(t) {\n            return (this._items[t] || null);\n        },\n        getRoot: function() {\n            if (!this._root) {\n                this._render();\n            };\n            return this._root;\n        },\n        onShow: function() {\n            if (this._config.maxheight) {\n                if (!this._scrollableArea) {\n                    this._scrollableArea = o.fromNative(this._scrollableElems.root, {\n                        fade: true\n                    });\n                }\n                 else this._scrollableArea.resize();\n            \n            };\n            this.focusAnItem();\n        },\n        onHide: function() {\n            this.blur();\n        },\n        focusAnItem: function() {\n            return this._attemptFocus(0, 1);\n        },\n        blur: function() {\n            if (this._focused) {\n                this._focused.blur();\n                this._focused = null;\n                this.inform(\"blur\");\n            }\n        ;\n        },\n        handleKeydown: function(t, u) {\n            var v = this._items.indexOf(this._focused);\n            switch (t) {\n              case l.UP:\n            \n              case l.DOWN:\n                var w = ((t === l.UP) ? -1 : 1);\n                if ((v !== -1)) {\n                    return this._attemptFocus((v + w), w);\n                }\n                 else if ((t === l.UP)) {\n                    return this._attemptFocus((this._items.length - 1), -1);\n                }\n                 else return this._attemptFocus(0, 1)\n                \n            ;\n                break;\n              case l.SPACE:\n                if ((this._items.indexOf(this._focused) !== -1)) {\n                    this._handleItemClick(this._focused, u);\n                    return true;\n                }\n            ;\n                return false;\n              default:\n                var x = String.fromCharCode(t).toLowerCase(), y;\n                for (var z = (v + 1); (z < this._items.length); z++) {\n                    y = this._items[z].getAccessKey();\n                    if ((y && (y.charAt(0).toLowerCase() === x))) {\n                        if (this._focusItem(this._items[z])) {\n                            return true\n                        }\n                    };\n                };\n                return false;\n            };\n        },\n        _render: function() {\n            this._ul = j.create(\"ul\", {\n                className: \"-cx-PUBLIC-abstractMenu__menu\"\n            });\n            this._ul.setAttribute(\"role\", \"menu\");\n            this._items.forEach(function(v) {\n                this._insertItem(v, null);\n            }.bind(this));\n            k.listen(this._ul, \"click\", this._handleClick.bind(this));\n            k.listen(this._ul, \"mouseover\", this._handleMouseOver.bind(this));\n            k.listen(this._ul, \"mouseout\", this._handleMouseOut.bind(this));\n            var t = this._ul;\n            if (this._config.maxheight) {\n                this._scrollableElems = o.renderDOM();\n                j.setContent(this._scrollableElems.content, this._ul);\n                t = this._scrollableElems.root;\n                p.set(this._scrollableElems.wrap, \"max-height\", (this._config.maxheight + \"px\"));\n            }\n        ;\n            var u = ((\"-cx-PUBLIC-abstractMenu__wrapper\" + ((this._config.className ? (\" \" + this._config.className) : \"\"))) + ((this._theme.className ? (\" \" + this._theme.className) : \"\")));\n            this._root = j.create(\"div\", {\n                className: u\n            }, j.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__border\"\n            }, t));\n            (this._config.id && this._root.setAttribute(\"id\", this._config.id));\n            this.inform(\"rendered\", this._root);\n        },\n        _needsDefaultBehavior: function(t) {\n            if ((t.isDefaultRequested && t.isDefaultRequested())) {\n                var u = m.byTag(t.getTarget(), \"a\"), v = (u && u.getAttribute(\"href\"));\n                return (v && (v[0] !== \"#\"));\n            }\n        ;\n            return false;\n        },\n        _handleClick: function(t) {\n            if (!this._needsDefaultBehavior(t)) {\n                var u = this._getItemInstance(t.getTarget());\n                if (u) {\n                    return this._handleItemClick(u, t)\n                };\n            }\n        ;\n        },\n        _handleItemClick: function(t, u) {\n            this.inform(\"itemclick\", {\n                item: t,\n                event: u\n            });\n            if (t.hasAction()) {\n                this.done();\n            };\n            return t.handleClick();\n        },\n        _handleMouseOver: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            (u && this._focusItem(u, true));\n        },\n        _handleMouseOut: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            if ((u && (this._focused === u))) {\n                this.blur();\n            };\n        },\n        _insertItem: function(t, u, v) {\n            var w = t.getRoot();\n            g.addClass(w, \"__MenuItem\");\n            i.set(w, \"MenuItem\", t);\n            if (u) {\n                var x = (v ? j.insertAfter : j.insertBefore);\n                x(u.getRoot(), w);\n            }\n             else j.appendContent(this._ul, w);\n        ;\n        },\n        _attemptFocus: function(t, u) {\n            var v = this.getItemAt(t);\n            if (v) {\n                if (this._focusItem(v)) {\n                    return true;\n                }\n                 else return this._attemptFocus((t + u), u)\n            \n            };\n            return false;\n        },\n        _focusItem: function(t, u) {\n            if ((t.focus(u) !== false)) {\n                if ((this._focused !== t)) {\n                    this.blur();\n                    this._focused = t;\n                    this.inform(\"focus\");\n                }\n            ;\n                return true;\n            }\n        ;\n            return false;\n        },\n        _getItemInstance: function(t) {\n            var u = m.byClass(t, \"__MenuItem\");\n            return (u ? i.get(u, \"MenuItem\") : null);\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuItemInterface\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i() {\n    \n    };\n    g(i.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = this.render();\n            };\n            return this._root;\n        },\n        render: h,\n        getAccessKey: h,\n        hasAction: h.thatReturnsFalse,\n        focus: h.thatReturnsFalse,\n        blur: h.thatReturnsFalse,\n        handleClick: h.thatReturnsFalse\n    });\n    e.exports = i;\n});\n__d(\"MenuItemBase\", [\"Class\",\"DOM\",\"HTML\",\"MenuItemInterface\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"MenuItemInterface\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n) {\n        this.parent.construct(this);\n        this._data = n;\n    };\n    g.extend(m, j);\n    k(m.prototype, {\n        render: function() {\n            var n = \"-cx-PUBLIC-abstractMenuItem__root\";\n            if (this._data.className) {\n                n += (\" \" + this._data.className);\n            };\n            var o = {\n                className: n,\n                \"aria-selected\": \"false\"\n            };\n            for (var p in this._data) {\n                if ((p.indexOf(\"data-\") === 0)) {\n                    o[p] = this._data[p];\n                };\n            };\n            return h.create(\"li\", o, this._renderItemContent());\n        },\n        _renderItemContent: function() {\n            return i(this._data.markup).getNodes();\n        }\n    });\n    e.exports = m;\n});\n__d(\"MenuItem\", [\"Class\",\"CSS\",\"DOM\",\"MenuItemBase\",\"React\",\"copyProperties\",\"cx\",\"emptyFunction\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MenuItemBase\"), k = b(\"React\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = b(\"emptyFunction\"), o = b(\"startsWith\");\n    function p(q) {\n        this.parent.construct(this, q);\n        this._disabled = !!this._data.disabled;\n    };\n    g.extend(p, j);\n    l(p.prototype, {\n        getValue: function() {\n            return this._data.value;\n        },\n        getAccessKey: function() {\n            return (this._data.label && this._data.label.charAt(0));\n        },\n        hasAction: n.thatReturnsTrue,\n        focus: function(q) {\n            if ((this.isDisabled() || !this._root.offsetParent)) {\n                return false\n            };\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.addClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"true\");\n            (q || this._anchor.focus());\n        },\n        blur: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.removeClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"false\");\n        },\n        handleClick: function() {\n            if (this.isDisabled()) {\n                return false\n            };\n            if ((typeof this._onclickHandler === \"function\")) {\n                return this._onclickHandler()\n            };\n            return !!((((this._data.rel && (this._data.rel !== \"ignore\"))) || this._data.href));\n        },\n        setOnClickHandler: function(q) {\n            this._onclickHandler = q;\n        },\n        _renderItemContent: function() {\n            this._anchor = i.create(\"a\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__anchor\"\n            });\n            if (this._data.reactChildren) {\n                k.renderComponent(k.DOM.span({\n                    className: \"-cx-PUBLIC-abstractMenuItem__label\"\n                }, this._data.reactChildren), this._anchor);\n                this._data.label = (this._anchor.innerText || this._anchor.textContent);\n            }\n             else i.setContent(this._anchor, i.create(\"span\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__label\"\n            }, (this._data.markup || this._data.label)));\n        ;\n            if (this._data.icon) {\n                i.prependContent(this._anchor, this._data.icon);\n                h.addClass(this._anchor, \"-cx-PUBLIC-abstractMenuItem__hasicon\");\n            }\n        ;\n            if (!this.isDisabled()) {\n                this._anchor.setAttribute(\"href\", (this._data.href || \"#\"));\n            };\n            if (this._data.rel) {\n                this._anchor.setAttribute(\"rel\", this._data.rel);\n            }\n             else if (!this._data.href) {\n                this._anchor.setAttribute(\"rel\", \"ignore\");\n            }\n        ;\n            if (this._data.ajaxify) {\n                this._anchor.setAttribute(\"ajaxify\", this._data.ajaxify);\n            };\n            if (this._data.target) {\n                this._anchor.setAttribute(\"target\", this._data.target);\n            };\n            for (var q in this._data) {\n                if (((typeof q === \"string\") && o(q, \"data-\"))) {\n                    this._anchor.setAttribute(q, this._data[q]);\n                };\n            };\n            this._anchor.setAttribute(\"role\", \"menuitem\");\n            this._anchor.setAttribute(\"title\", this._data.title);\n            return this._anchor;\n        },\n        isDisabled: function() {\n            return this._disabled;\n        },\n        enable: function() {\n            this._anchor.setAttribute(\"href\", (this._data.href || \"#\"));\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = false;\n        },\n        disable: function() {\n            this._anchor.removeAttribute(\"href\");\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = true;\n        },\n        render: function() {\n            var q = this.parent.render();\n            if (this._data.disabled) {\n                h.addClass(q, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            };\n            return q;\n        }\n    });\n    e.exports = p;\n});\n__d(\"MenuSelectableItem\", [\"Class\",\"CSS\",\"MenuItem\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"MenuItem\"), j = b(\"copyProperties\"), k = b(\"cx\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this._selected = !!this._data.selected;\n    };\n    g.extend(l, i);\n    j(l.prototype, {\n        _selected: false,\n        getLabel: function() {\n            return this._data.label;\n        },\n        getIcon: function() {\n            return this._data.icon;\n        },\n        isSelected: function() {\n            return this._selected;\n        },\n        select: function() {\n            if (this.isDisabled()) {\n                return false\n            };\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = true;\n        },\n        deselect: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = false;\n        },\n        render: function() {\n            var m = this.parent.render();\n            if (this._data.selected) {\n                h.addClass(m, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            };\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"SelectableMenu\", [\"Class\",\"Menu\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"Menu\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\");\n    function l(o, p) {\n        this.parent.construct(this, o, p);\n    };\n    function m(o) {\n        return ((o.select && o.deselect) && o.isSelected);\n    };\n    function n(o) {\n        return (m(o) && o.isSelected());\n    };\n    g.extend(l, h);\n    j(l.prototype, {\n        focusAnItem: function() {\n            for (var o = 0; (o < this._items.length); o++) {\n                if (n(this._items[o])) {\n                    if ((this._focusItem(this._items[o]) !== false)) {\n                        return true\n                    }\n                };\n            };\n            return this.parent.focusAnItem();\n        },\n        setValue: function(o) {\n            if (!this._root) {\n                this._render();\n            };\n            var p = k(o);\n            this._items.forEach(function(q) {\n                if (m(q)) {\n                    if (i(p, q.getValue())) {\n                        q.select();\n                    }\n                     else if (n(q)) {\n                        q.deselect();\n                    }\n                \n                };\n            });\n            this.inform(\"change\", this._getSelection());\n        },\n        _handleItemClick: function(o, p) {\n            if (!m(o)) {\n                return this.parent._handleItemClick(o, p)\n            };\n            this.inform(\"itemclick\", {\n                item: o,\n                event: p\n            });\n            if (this._config.multiple) {\n                var q = (n(o) ? o.deselect() : o.select());\n                if ((q !== false)) {\n                    this.inform(\"change\", this._getSelection());\n                };\n            }\n             else {\n                if (!n(o)) {\n                    if ((o.select() !== false)) {\n                        this._items.forEach(function(r) {\n                            if ((n(r) && (r !== o))) {\n                                r.deselect();\n                            };\n                        });\n                        this.inform(\"change\", this._getSelection());\n                    }\n                \n                };\n                this.done();\n            }\n        ;\n            return o.handleClick();\n        },\n        _getSelection: function() {\n            var o = [];\n            this._items.forEach(function(p) {\n                if (n(p)) {\n                    o.push({\n                        label: p.getLabel(),\n                        value: p.getValue(),\n                        item: p\n                    });\n                };\n            });\n            if (!this._config.multiple) {\n                o = o[0];\n            };\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"PopoverLoadingMenu\", [\"Class\",\"DOM\",\"PopoverMenuInterface\",\"copyProperties\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"PopoverMenuInterface\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"joinClasses\");\n    function m(n) {\n        this.parent.construct(this);\n        this._config = (n || {\n        });\n        this._theme = (n.theme || {\n        });\n    };\n    g.extend(m, i);\n    j(m.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = h.create(\"div\", {\n                    className: l(\"-cx-PUBLIC-abstractMenu__wrapper\", this._config.className, this._theme.className)\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__border\"\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__menu -cx-PUBLIC-abstractLoadingMenu__root\"\n                }, h.create(\"span\", {\n                    className: \"-cx-PUBLIC-abstractLoadingMenu__spinner\"\n                }))));\n            };\n            return this._root;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TabIsolation\", [\"Event\",\"DOMQuery\",\"Focus\",\"Keys\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOMQuery\"), i = b(\"Focus\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"copyProperties\"), m = [], n = 0;\n    function o(p) {\n        this._root = p;\n        this._eventHandler = null;\n        this._identifier = n++;\n    };\n    l(o.prototype, {\n        enable: function() {\n            m.unshift(this._identifier);\n            this._eventHandler = g.listen(window, \"keydown\", function(p) {\n                if ((m[0] === this._identifier)) {\n                    this._tabHandler(p);\n                };\n            }.bind(this), g.Priority.URGENT);\n        },\n        disable: function() {\n            var p;\n            if (this._eventHandler) {\n                p = m.indexOf(this._identifier);\n                if ((p > -1)) {\n                    m.splice(p, 1);\n                };\n                this._eventHandler.remove();\n                this._eventHandler = null;\n            }\n        ;\n        },\n        _tabHandler: function(p) {\n            if ((g.getKeyCode(p) !== j.TAB)) {\n                return\n            };\n            var q = p.getTarget();\n            if (!q) {\n                return\n            };\n            var r = k.find(this._root), s = r[0], t = r[(r.length - 1)], u = p.getModifiers().shift;\n            if ((u && (q === s))) {\n                p.preventDefault();\n                i.set(t);\n            }\n             else if ((((!u && (q === t))) || !h.contains(this._root, q))) {\n                p.preventDefault();\n                i.set(s);\n            }\n            \n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"AccessibleLayer\", [\"Event\",\"DOM\",\"Focus\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Focus\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m) {\n        this._layer = m;\n    };\n    j(l.prototype, {\n        enable: function() {\n            this._afterShowSubscription = this._layer.subscribe(\"aftershow\", this._onAfterShow.bind(this));\n        },\n        disable: function() {\n            (this._listener && this._listener.remove());\n            this._afterShowSubscription.unsubscribe();\n            this._listener = this._afterShowSubscription = null;\n        },\n        _closeListener: function(event) {\n            var m = this._layer.getCausalElement();\n            if (m) {\n                if ((m.tabIndex == -1)) {\n                    m.tabIndex = 0;\n                    i.setWithoutOutline(m);\n                }\n                 else i.set(m);\n            \n            };\n            this._layer.hide();\n        },\n        _onAfterShow: function() {\n            var m = this._layer.getContentRoot();\n            if (h.scry(m, \".layer_close_elem\")[0]) {\n                return\n            };\n            var n = h.create(\"a\", {\n                className: \"accessible_elem layer_close_elem\",\n                href: \"#\"\n            }, [\"Close popup and return\",]);\n            h.appendContent(m, n);\n            this._listener = g.listen(n, \"click\", this._closeListener.bind(this));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualLayerAsyncRelative\", [\"Event\",\"copyProperties\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"Parent\");\n    function j(k) {\n        this._layer = k;\n    };\n    h(j.prototype, {\n        _layerSubscription: null,\n        _listener: null,\n        enable: function() {\n            this._layerSubscription = this._layer.subscribe(\"show\", this._attachListener.bind(this));\n            if (this._layer.isShown()) {\n                this._attachListener();\n            };\n        },\n        disable: function() {\n            this._layerSubscription.unsubscribe();\n            this._layerSubscription = null;\n            if (this._listener) {\n                this._listener.remove();\n                this._listener = null;\n            }\n        ;\n        },\n        _attachListener: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._onclick.bind(this));\n        },\n        _onclick: function(k) {\n            var l = i.byTag(k.getTarget(), \"A\");\n            if (!l) {\n                return\n            };\n            var m = l.getAttribute(\"ajaxify\"), n = l.href, o = (m || n);\n            if (((l.rel === \"async\") || (l.rel === \"async-post\"))) {\n                d([\"AsyncRequest\",], function(p) {\n                    p.bootstrap(o, this._layer.getContext(), (l.rel === \"async-post\"));\n                }.bind(this));\n                return false;\n            }\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ContextualLayerUpdateOnScroll\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attachScrollListener.bind(this)),this._layer.subscribe(\"hide\", this._removeScrollListener.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this.detach();\n        },\n        _attachScrollListener: function() {\n            if (this._listener) {\n                return\n            };\n            var j = this._layer.getContextScrollParent();\n            this._listener = g.listen(j, \"scroll\", this._layer.updatePosition.bind(this._layer));\n        },\n        _removeScrollListener: function() {\n            (this._listener && this._listener.remove());\n            this._listener = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerAutoFocus\", [\"function-extensions\",\"DOMQuery\",\"Focus\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Focus\"), i = b(\"TabbableElements\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n    j(k.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"aftershow\", this._focus.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _focus: function() {\n            var l = this._layer.getRoot(), m = g.scry(l, \".autofocus\")[0], n = true;\n            if (!m) {\n                var o = document.activeElement;\n                if (g.isNodeOfType(o, [\"input\",\"textarea\",])) {\n                    return\n                };\n                var p = i.find(l);\n                for (var q = 0; (q < p.length); q++) {\n                    if ((p[q].tagName != \"A\")) {\n                        m = p[q];\n                        n = false;\n                        break;\n                    }\n                ;\n                };\n            }\n             else if ((m.tabIndex !== 0)) {\n                n = false;\n            }\n        ;\n            if (m) {\n                (n ? h.set(m) : h.setWithoutOutline(m));\n            }\n             else {\n                l.tabIndex = 0;\n                h.setWithoutOutline(l);\n            }\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerButtons\", [\"Event\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Parent\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._layer = k;\n    };\n    i(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _handle: function(k) {\n            var l = k.getTarget(), m = h.byClass(l, \"layerConfirm\");\n            if (m) {\n                if ((this._layer.inform(\"confirm\", m) === false)) {\n                    k.prevent();\n                };\n                return;\n            }\n        ;\n            var n = h.byClass(l, \"layerCancel\");\n            if (n) {\n                if ((this._layer.inform(\"cancel\", n) !== false)) {\n                    this._layer.hide();\n                };\n                k.prevent();\n                return;\n            }\n        ;\n            var o = h.byClass(l, \"layerButton\");\n            if (o) {\n                if ((this._layer.inform(\"button\", o) === false)) {\n                    k.prevent();\n                }\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerDestroyOnHide\", [\"function-extensions\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"shield\");\n    function i(j) {\n        this._layer = j;\n    };\n    g(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", h(Function.prototype.defer, this._layer.destroy.bind(this._layer)));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerFadeOnHide\", [\"Animation\",\"Layer\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Layer\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            if ((j.ie() < 9)) {\n                return\n            };\n            this._subscription = this._layer.subscribe(\"starthide\", this._handleStartHide.bind(this));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        },\n        _handleStartHide: function() {\n            var m = true, n = h.subscribe(\"show\", function() {\n                n.unsubscribe();\n                m = false;\n            });\n            (function() {\n                n.unsubscribe();\n                n = null;\n                if (m) {\n                    this._animate();\n                }\n                 else this._layer.finishHide();\n            ;\n            }).bind(this).defer();\n            return false;\n        },\n        _animate: function() {\n            new g(this._layer.getRoot()).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(this._finish.bind(this)).go();\n        },\n        _finish: function() {\n            i.set(this._layer.getRoot(), \"opacity\", \"\");\n            this._layer.finishHide();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerFadeOnShow\", [\"Animation\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\"), i = b(\"UserAgent\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n    j(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            if ((i.ie() < 9)) {\n                return\n            };\n            this._subscriptions = [this._layer.subscribe(\"beforeshow\", function() {\n                h.set(this._layer.getRoot(), \"opacity\", 0);\n            }.bind(this)),this._layer.subscribe(\"show\", this._animate.bind(this)),];\n        },\n        disable: function() {\n            if (this._subscriptions) {\n                while (this._subscriptions.length) {\n                    this._subscriptions.pop().unsubscribe();;\n                };\n                this._subscriptions = null;\n            }\n        ;\n        },\n        _getDuration: function() {\n            return 100;\n        },\n        _animate: function() {\n            var l = this._layer.getRoot();\n            new g(l).from(\"opacity\", 0).to(\"opacity\", 1).duration(this._getDuration()).ondone(h.set.curry(l, \"opacity\", \"\")).go();\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerFormHooks\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var j = this._layer.getRoot();\n            this._subscriptions = [g.listen(j, \"submit\", this._onSubmit.bind(this)),g.listen(j, \"success\", this._onSuccess.bind(this)),g.listen(j, \"error\", this._onError.bind(this)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(j) {\n                j.remove();\n            });\n            this._subscriptions = null;\n        },\n        _onSubmit: function(event) {\n            if ((this._layer.inform(\"submit\", event) === false)) {\n                event.kill();\n            };\n        },\n        _onSuccess: function(event) {\n            if ((this._layer.inform(\"success\", event) === false)) {\n                event.kill();\n            };\n        },\n        _onError: function(event) {\n            var j = event.getData();\n            if ((this._layer.inform(\"error\", {\n                response: j.response\n            }) === false)) {\n                event.kill();\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnBlur\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n    g(h.prototype, {\n        _subscriptions: null,\n        _onBlur: null,\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attach.bind(this)),this._layer.subscribe(\"hide\", this._detach.bind(this)),];\n            if (this._layer.isShown()) {\n                this._attach();\n            };\n        },\n        disable: function() {\n            this._detach();\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this._subscriptions = null;\n        },\n        _detach: function() {\n            (this._onBlur && this._onBlur.unsubscribe());\n            this._onBlur = null;\n        },\n        _attach: function() {\n            this._onBlur = this._layer.subscribe(\"blur\", function() {\n                this._layer.hide();\n                return false;\n            }.bind(this));\n        }\n    });\n    e.exports = h;\n});\n__d(\"LayerMouseHooks\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ContextualThing\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ContextualThing\"), j = b(\"Layer\"), k = b(\"copyProperties\"), l = new h();\n    function m(n) {\n        this._layer = n;\n        this._subscriptions = [];\n        this._currentlyActive = false;\n    };\n    k(m.prototype, {\n        enable: function() {\n            this._subscriptions = [l.subscribe(\"mouseenter\", this._handleActive.bind(this)),l.subscribe(\"mouseleave\", this._handleInactive.bind(this)),this._layer.subscribe(\"hide\", function() {\n                this._currentlyActive = false;\n            }.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this._subscriptions = [];\n            this._currentlyActive = false;\n        },\n        _handleActive: function(n, o) {\n            if ((!this._currentlyActive && this._isNodeWithinStack(o))) {\n                this._layer.inform(\"mouseenter\");\n                this._currentlyActive = true;\n            }\n        ;\n        },\n        _handleInactive: function(n, o) {\n            if (this._currentlyActive) {\n                if ((!o || !this._isNodeWithinStack(o))) {\n                    this._layer.inform(\"mouseleave\");\n                    this._currentlyActive = false;\n                }\n            \n            };\n        },\n        _isNodeWithinStack: function(n) {\n            return i.containsIncludingLayers(this._layer.getContentRoot(), n);\n        }\n    });\n    j.subscribe(\"show\", function(n, o) {\n        var p = o.getContentRoot(), q = [g.listen(p, \"mouseenter\", function() {\n            l.inform(\"mouseenter\", p);\n        }),g.listen(p, \"mouseleave\", function(s) {\n            l.inform(\"mouseleave\", s.getRelatedTarget());\n        }),], r = o.subscribe(\"hide\", function() {\n            while (q.length) {\n                q.pop().remove();;\n            };\n            r.unsubscribe();\n            q = r = null;\n        });\n    });\n    e.exports = m;\n});\n__d(\"LayerRefocusOnHide\", [\"copyProperties\",\"Focus\",\"ContextualThing\",\"DOM\",\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Focus\"), i = b(\"ContextualThing\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"Parent\");\n    function m(n) {\n        this._layer = n;\n    };\n    g(m.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(n, event) {\n            if (((document.activeElement === document.body) || k.contains(this._layer.getRoot(), document.activeElement))) {\n                var o = this._layer.getCausalElement();\n                while ((o && (!o.offsetWidth))) {\n                    var p = l.byClass(o, \"uiToggle\");\n                    if ((p && p.offsetWidth)) {\n                        o = j.scry(p, \"[rel=\\\"toggle\\\"]\")[0];\n                    }\n                     else {\n                        var q = i.getContext(o);\n                        if (q) {\n                            o = q;\n                        }\n                         else o = o.parentNode;\n                    ;\n                    }\n                ;\n                };\n                if ((o && ((o.tabIndex != -1)))) {\n                    h.setWithoutOutline(o);\n                };\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"LayerTabIsolation\", [\"TabIsolation\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TabIsolation\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n        this._tabIsolation = null;\n    };\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._tabIsolation = new g(this._layer.getRoot());\n            this._subscriptions = [this._layer.subscribe(\"show\", this._tabIsolation.enable.bind(this._tabIsolation)),this._layer.subscribe(\"hide\", this._tabIsolation.disable.bind(this._tabIsolation)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this._tabIsolation.disable();\n            this._tabIsolation = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ModalLayer\", [\"Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMDimensions\",\"DOMQuery\",\"ScrollAwareDOM\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"isAsyncScrollQuery\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"DOMQuery\"), n = b(\"ScrollAwareDOM\"), o = b(\"Style\"), p = b(\"URI\"), q = b(\"UserAgent\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"debounceAcrossTransitions\"), w = b(\"isAsyncScrollQuery\"), x = b(\"removeFromArray\"), y = [], z = null, aa = null, ba = null;\n    function ca() {\n        if (!ba) {\n            ba = m.scry(document.body, \".-cx-PRIVATE-fbLayout__root\")[0];\n        };\n        return ba;\n    };\n    function da(la) {\n        var ma = {\n            position: r.getScrollPosition()\n        }, na = (la.offsetTop - ma.position.y);\n        i.addClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n        o.set(la, \"top\", (na + \"px\"));\n        h.inform(\"reflow\");\n        ma.listener = n.subscribe(\"scroll\", function(oa, pa) {\n            if (m.contains(la, pa.target)) {\n                var qa = (la.offsetTop - pa.delta.y);\n                o.set(la, \"top\", (qa + \"px\"));\n                ma.position = ma.position.add(pa.delta);\n                return false;\n            }\n        ;\n        });\n        j.set(la, \"ModalLayerData\", ma);\n        if ((q.firefox() < 13)) {\n            ea.curry(la).defer();\n        };\n    };\n    function ea(la) {\n        m.scry(la, \"div.swfObject\").forEach(function(ma) {\n            var na = ma.getAttribute(\"data-swfid\");\n            if ((na && window[na])) {\n                var oa = window[na];\n                oa.addParam(\"autostart\", \"false\");\n                oa.addParam(\"autoplay\", \"false\");\n                oa.addParam(\"play\", \"false\");\n                oa.addVariable(\"video_autoplay\", \"0\");\n                oa.addVariable(\"autoplay\", \"0\");\n                oa.addVariable(\"play\", \"0\");\n                var pa = p(oa.getAttribute(\"swf\"));\n                pa.addQueryData({\n                    autoplay: \"0\"\n                });\n                pa.setPath(pa.getPath().replace(\"autoplay=1\", \"autoplay=0\"));\n                oa.setAttribute(\"swf\", pa.toString());\n                oa.write(ma);\n            }\n        ;\n        });\n    };\n    function fa(la, ma) {\n        var na = j.get(la, \"ModalLayerData\");\n        if (na) {\n            var oa = function() {\n                i.removeClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n                o.set(la, \"top\", \"\");\n                if (ma) {\n                    var ra = m.getDocumentScrollElement();\n                    ra.scrollTop = na.position.y;\n                }\n            ;\n                h.inform(\"reflow\");\n                na.listener.unsubscribe();\n                na.listener = null;\n                j.remove(la, \"ModalLayerData\");\n            };\n            if ((ma && w())) {\n                var pa = k.create(\"div\", {\n                    className: \"-cx-PRIVATE-ModalLayer__support\"\n                });\n                o.set(pa, \"height\", (la.offsetHeight + \"px\"));\n                k.appendContent(document.body, pa);\n                var qa = m.getDocumentScrollElement();\n                qa.scrollTop = na.position.y;\n                ma = false;\n                !function() {\n                    oa();\n                    k.remove(pa);\n                }.defer();\n            }\n             else oa();\n        ;\n        }\n    ;\n        if ((q.ie() < 7)) {\n            o.set(la, \"height\", \"\");\n        };\n    };\n    function ga() {\n        var la = ca();\n        if (!i.hasClass(la, \"-cx-PRIVATE-ModalLayer__fixed\")) {\n            da(la);\n        };\n    };\n    function ha() {\n        if (!y.length) {\n            fa(ca(), true);\n        };\n    };\n    function ia() {\n        var la;\n        if ((q.ie() < 7)) {\n            var ma = y[(y.length - 1)].getLayerRoot(), na = Math.max(ma.offsetHeight, ma.scrollHeight);\n            la = function(ta) {\n                o.set(ta, \"height\", (((-ta.offsetTop + na)) + \"px\"));\n            };\n        }\n    ;\n        var oa = y.length;\n        while (oa--) {\n            var pa = y[oa], qa = pa.getLayerRoot();\n            ja(qa, \"\");\n            var ra = pa.getLayerContentRoot(), sa = (ra.offsetWidth + l.measureElementBox(ra, \"width\", 0, 0, 1));\n            ja(qa, sa);\n            if ((la && (oa < (y.length - 1)))) {\n                la(qa);\n            };\n        };\n        (la && la(ca()));\n    };\n    function ja(la, ma) {\n        var na = (q.ie() < 7);\n        if (((na && ma) && (ma <= document.body.clientWidth))) {\n            ma = \"\";\n        };\n        o.set(la, (na ? \"width\" : \"min-width\"), (ma + ((ma ? \"px\" : \"\"))));\n    };\n    function ka(la) {\n        this._layer = la;\n    };\n    s(ka.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (!ca()) {\n                return\n            };\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(la) {\n                ((la == \"show\") ? this._addModal() : this._removeModal());\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._addModal();\n            };\n        },\n        disable: function() {\n            if (!ca()) {\n                return\n            };\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._removeModal();\n            };\n        },\n        _addModal: function() {\n            i.addClass(this.getLayerRoot(), \"-cx-PRIVATE-ModalLayer__root\");\n            var la = y[(y.length - 1)];\n            if (la) {\n                da(la.getLayerRoot());\n            }\n             else ga();\n        ;\n            var ma = m.getDocumentScrollElement();\n            ma.scrollTop = 0;\n            if (!y.length) {\n                if ((q.ie() < 7)) {\n                    i.addClass(document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                };\n                var na = v(ia, 100);\n                z = g.listen(window, \"resize\", na);\n                aa = h.subscribe(\"reflow\", na);\n            }\n        ;\n            y.push(this);\n            ia.defer();\n        },\n        _removeModal: function() {\n            var la = this.getLayerRoot();\n            i.removeClass(la, \"-cx-PRIVATE-ModalLayer__root\");\n            ja(la, \"\");\n            var ma = (this === y[(y.length - 1)]);\n            x(y, this);\n            var na = y[(y.length - 1)];\n            if (!na) {\n                z.remove();\n                z = null;\n                aa.unsubscribe();\n                aa = null;\n            }\n        ;\n            !function() {\n                if (na) {\n                    fa(na.getLayerRoot(), ma);\n                }\n                 else ha();\n            ;\n                if (y.length) {\n                    ia.defer();\n                }\n                 else if ((q.ie() < 7)) {\n                    i.removeClass(document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                }\n            ;\n            }.defer(400, false);\n        },\n        getLayerRoot: function() {\n            return this._layer.getRoot();\n        },\n        getLayerContentRoot: function() {\n            return this._layer.getContentRoot();\n        }\n    });\n    e.exports = ka;\n});\n__d(\"ContextualDialogArrow\", [\"JSXDOM\",\"CSS\",\"DOM\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Locale\"), k = b(\"Style\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        bottom: \"-cx-PUBLIC-abstractContextualDialog__arrowbottom\",\n        top: \"-cx-PUBLIC-abstractContextualDialog__arrowtop\",\n        right: \"-cx-PUBLIC-abstractContextualDialog__arrowright\",\n        left: \"-cx-PUBLIC-abstractContextualDialog__arrowleft\"\n    }, p = {\n        above: \"bottom\",\n        below: \"top\",\n        left: \"right\",\n        right: \"left\"\n    };\n    function q(r) {\n        this._layer = r;\n    };\n    m(q.prototype, {\n        _subscription: null,\n        _arrow: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"adjust\",\"reposition\",], this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(r, s) {\n            if ((r === \"adjust\")) {\n                this._repositionArrow(s);\n            }\n             else this._repositionRoot(s);\n        ;\n        },\n        _repositionRoot: function(r) {\n            var s = r.getAlignment();\n            if ((s == \"center\")) {\n                return\n            };\n            var t = this._layer.getRoot(), u = this._layer.getContext(), v = r.isVertical(), w = this._layer.getArrowDimensions(), x = w.offset, y = w.length, z = l.getElementDimensions(u), aa = (v ? z.x : z.y);\n            if ((aa >= (y + ((x * 2))))) {\n                return\n            };\n            var ba = (((y / 2)) + x), ca = (aa / 2), da = parseInt((ba - ca), 10);\n            if (v) {\n                if ((s == \"left\")) {\n                    var ea = parseInt(k.get(t, \"left\"), 10);\n                    k.set(t, \"left\", (((ea - da)) + \"px\"));\n                }\n                 else {\n                    var fa = parseInt(k.get(t, \"right\"), 10);\n                    k.set(t, \"right\", (((fa - da)) + \"px\"));\n                }\n            ;\n            }\n             else {\n                var ga = parseInt(k.get(t, \"top\"), 10);\n                k.set(t, \"top\", (((ga - da)) + \"px\"));\n            }\n        ;\n        },\n        _repositionArrow: function(r) {\n            var s = this._layer._contentWrapper, t = r.getPosition(), u = p[t];\n            for (var v in o) {\n                h.conditionClass(s, o[v], (u === v));;\n            };\n            if ((t == \"none\")) {\n                return\n            };\n            if (!this._arrow) {\n                this._arrow = g.i({\n                    className: \"-cx-PUBLIC-abstractContextualDialog__arrow\"\n                });\n                i.appendContent(s, this._arrow);\n            }\n        ;\n            h.conditionClass(s, \"-cx-PRIVATE-uiContextualDialog__withfooter\", this._layer.getFooter());\n            k.set(this._arrow, \"top\", \"\");\n            k.set(this._arrow, \"left\", \"\");\n            k.set(this._arrow, \"right\", \"\");\n            k.set(this._arrow, \"margin\", \"\");\n            var w = q.getOffsetPercent(r), x = q.getOffset(r, w, this._layer), y = q.getOffsetSide(r);\n            k.set(this._arrow, y, (w + \"%\"));\n            k.set(this._arrow, (\"margin-\" + y), (x + \"px\"));\n        }\n    });\n    m(q, {\n        getOffsetPercent: function(r) {\n            var s = r.getAlignment(), t = r.getPosition();\n            if (((t == \"above\") || (t == \"below\"))) {\n                if ((s == \"center\")) {\n                    return 50;\n                }\n                 else if ((s == \"right\")) {\n                    return 100\n                }\n            \n            };\n            return 0;\n        },\n        getOffsetSide: function(r) {\n            var s = r.isVertical();\n            return (s ? ((j.isRTL() ? \"right\" : \"left\")) : \"top\");\n        },\n        getOffset: function(r, s, t) {\n            var u = t.getArrowDimensions(), v = u.offset, w = u.length, x = r.getAlignment(), y = (((x == \"center\")) ? 0 : v);\n            y += ((w * s) / 100);\n            if ((x != \"left\")) {\n                y *= -1;\n            };\n            return y;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ContextualDialogFitInViewport\", [\"Event\",\"ContextualLayerDimensions\",\"Style\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ContextualLayerDimensions\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"throttle\");\n    function m(n) {\n        this._layer = n;\n        this._listeners = [];\n    };\n    k(m.prototype, {\n        _subscription: null,\n        _minimumTop: null,\n        enable: function() {\n            var n = this._layer.getArrowDimensions();\n            this._arrowOffset = n.offset;\n            var o = n.length;\n            this._arrowBuffer = (this._arrowOffset + o);\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",\"reposition\",], function(p, q) {\n                if ((p == \"reposition\")) {\n                    this._calculateMinimumTop(q);\n                }\n                 else if ((p == \"show\")) {\n                    this._attachScroll();\n                    this._adjustForScroll();\n                }\n                 else this._detachScroll();\n                \n            ;\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._attachScroll();\n            };\n        },\n        disable: function() {\n            if (this._layer.isShown()) {\n                this._detachScroll();\n            };\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _attachScroll: function() {\n            var n = l(this._adjustForScroll.bind(this)), o = (this._layer.getContextScrollParent() || window);\n            this._listeners = [g.listen(o, \"scroll\", n),g.listen(window, \"resize\", n),];\n        },\n        _detachScroll: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            this._listeners = [];\n        },\n        _getContentHeight: function() {\n            return j.getElementDimensions(this._layer._contentWrapper).y;\n        },\n        _getContextY: function() {\n            return j.getElementPosition(this._layer.getContext()).y;\n        },\n        _calculateMinimumTop: function(n) {\n            if (n.isVertical()) {\n                return\n            };\n            this._minimumTop = (((this._getContextY() - ((this._getContentHeight() - this._arrowBuffer))) + n.getOffsetY()));\n        },\n        _adjustForScroll: function() {\n            if (this._layer.isFixed()) {\n                return\n            };\n            var n = this._layer._getOrientation();\n            if (n.isVertical()) {\n                return\n            };\n            var o = h.getViewportRect(this._layer), p = (o.b - this._minimumTop);\n            if ((p < 0)) {\n                return\n            };\n            var q = this._getContentHeight(), r = (q - ((this._arrowBuffer + this._arrowOffset))), s = Math.max(0, Math.min(r, (r - ((p - q)))));\n            i.set(this._layer.getContent(), \"top\", (-s + \"px\"));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogDefaultTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = {\n        wrapperClassName: \"-cx-PRIVATE-uiContextualDialog__root\",\n        arrowDimensions: {\n            offset: 15,\n            length: 16\n        }\n    };\n    e.exports = h;\n});\n__d(\"ContextualDialog\", [\"AccessibleLayer\",\"Class\",\"ContextualDialogArrow\",\"ContextualDialogFitInViewport\",\"ContextualLayer\",\"ContextualDialogDefaultTheme\",\"CSS\",\"DOM\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerHideOnTransition\",\"LayerFormHooks\",\"LayerMouseHooks\",\"Style\",\"copyProperties\",\"csx\",\"cx\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"AccessibleLayer\"), h = b(\"Class\"), i = b(\"ContextualDialogArrow\"), j = b(\"ContextualDialogFitInViewport\"), k = b(\"ContextualLayer\"), l = b(\"ContextualDialogDefaultTheme\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"LayerAutoFocus\"), p = b(\"LayerButtons\"), q = b(\"LayerHideOnTransition\"), r = b(\"LayerFormHooks\"), s = b(\"LayerMouseHooks\"), t = b(\"Style\"), u = b(\"copyProperties\"), v = b(\"csx\"), w = b(\"cx\"), x = b(\"removeFromArray\");\n    function y(z, aa) {\n        this.parent.construct(this, z, aa);\n    };\n    h.extend(y, k);\n    u(y.prototype, {\n        _footer: null,\n        _configure: function(z, aa) {\n            u(z, (z.theme || l));\n            var ba = (z.arrowBehavior || i);\n            z.addedBehaviors = (z.addedBehaviors || []);\n            z.addedBehaviors.push(ba);\n            this._footer = n.scry(aa, \"div.-cx-PUBLIC-abstractContextualDialog__footer\")[0];\n            this.parent._configure(z, aa);\n        },\n        _getDefaultBehaviors: function() {\n            var z = this.parent._getDefaultBehaviors();\n            x(z, q);\n            return z.concat([g,o,j,p,r,s,]);\n        },\n        _buildWrapper: function(z, aa) {\n            m.addClass(aa, \"-cx-PUBLIC-abstractContextualDialog__content\");\n            var ba = this.parent._buildWrapper(z, aa);\n            m.addClass(ba, z.wrapperClassName);\n            if (z.width) {\n                this.setWidth(z.width);\n            };\n            return ba;\n        },\n        setWidth: function(z) {\n            this._width = Math.floor(z);\n            t.set(this._contentWrapper, \"width\", (z + \"px\"));\n            return this;\n        },\n        getFooter: function() {\n            return this._footer;\n        },\n        getArrowDimensions: function() {\n            return this._config.arrowDimensions;\n        }\n    });\n    u(y, {\n        setContext: function(z, aa) {\n            z.setContext(aa);\n        }\n    });\n    e.exports = y;\n});\n__d(\"DialogPosition\", [\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = 40, i, j = {\n        calculateTopMargin: function(k, l) {\n            if (i) {\n                return i\n            };\n            var m = g.getViewportDimensions(), n = Math.floor(((((m.x + k)) * ((m.y - l))) / ((4 * m.x))));\n            return Math.max(n, h);\n        },\n        setFixedTopMargin: function(k) {\n            i = k;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DialogX\", [\"function-extensions\",\"JSXDOM\",\"Arbiter\",\"Class\",\"CSS\",\"DialogPosition\",\"Event\",\"Layer\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerFormHooks\",\"LayerRefocusOnHide\",\"LayerTabIsolation\",\"ModalLayer\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",\"debounce\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DialogPosition\"), l = b(\"Event\"), m = b(\"Layer\"), n = b(\"LayerAutoFocus\"), o = b(\"LayerButtons\"), p = b(\"LayerFormHooks\"), q = b(\"LayerRefocusOnHide\"), r = b(\"LayerTabIsolation\"), s = b(\"ModalLayer\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"copyProperties\"), w = b(\"cx\"), x = b(\"debounce\"), y = b(\"shield\");\n    function z(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n    i.extend(z, m);\n    v(z.prototype, {\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            j.addClass(this.getRoot(), \"-cx-PRIVATE-ModalLayer__xui\");\n            if (ba.autohide) {\n                var da = this.subscribe(\"show\", function() {\n                    da.unsubscribe();\n                    y(this.hide, this).defer(ba.autohide);\n                }.bind(this))\n            };\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([aa,s,n,o,p,r,q,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = (ba.xui ? \"-cx-PRIVATE-xuiDialog__content\" : \"-cx-PRIVATE-uiDialog__content\"), ea = (ba.xui ? \"-cx-PUBLIC-xuiDialog__wrapper\" : \"-cx-PUBLIC-uiDialog__wrapper\");\n            this._innerContent = g.div(null, ca);\n            this._wrapper = g.div({\n                className: ea,\n                role: \"dialog\",\n                \"aria-labelledby\": (ba.titleID || null)\n            }, g.div({\n                className: da\n            }, this._innerContent));\n            this.setWidth(ba.width);\n            return (g.div({\n                className: \"-cx-PRIVATE-uiDialog__positioner\",\n                role: \"dialog\"\n            }, this._wrapper));\n        },\n        getContentRoot: function() {\n            return this._wrapper;\n        },\n        getInnerContent: function() {\n            return this._innerContent;\n        },\n        updatePosition: function() {\n            var ba = u.getElementDimensions(this._wrapper), ca = k.calculateTopMargin(ba.x, ba.y);\n            t.set(this._wrapper, \"margin-top\", (ca + \"px\"));\n            this.inform(\"update_position\", {\n                type: \"DialogX\",\n                top: ca\n            });\n        },\n        setWidth: function(ba) {\n            ba = Math.floor(ba);\n            if ((ba === this._width)) {\n                return\n            };\n            this._width = ba;\n            t.set(this._wrapper, \"width\", (ba + \"px\"));\n        },\n        getWidth: function() {\n            return this._width;\n        }\n    });\n    function aa(ba) {\n        this._layer = ba;\n    };\n    v(aa.prototype, {\n        _subscription: null,\n        _resize: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(ba) {\n                if ((ba === \"show\")) {\n                    this._attach();\n                    h.inform(\"layer_shown\", {\n                        type: \"DialogX\"\n                    });\n                }\n                 else {\n                    this._detach();\n                    h.inform(\"layer_hidden\", {\n                        type: \"DialogX\"\n                    });\n                }\n            ;\n            }.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            (this._resize && this._detach());\n        },\n        _attach: function() {\n            this._layer.updatePosition();\n            this._resize = l.listen(window, \"resize\", x(this._layer.updatePosition.bind(this._layer)));\n        },\n        _detach: function() {\n            this._resize.remove();\n            this._resize = null;\n        }\n    });\n    e.exports = z;\n});\n__d(\"eachKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if ((!h || !i)) {\n            return\n        };\n        var k = Object.keys(h), l;\n        for (l = 0; (l < k.length); l++) {\n            i.call(j, k[l], h[k[l]], h, l);;\n        };\n    };\n    e.exports = g;\n});\n__d(\"LoadingDialogDimensions\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HEIGHT: 96,\n        WIDTH: 300\n    };\n    e.exports = g;\n});\n__d(\"AsyncDialog\", [\"AsyncRequest\",\"Bootloader\",\"CSS\",\"DialogX\",\"DOM\",\"Env\",\"Keys\",\"LayerFadeOnShow\",\"Parent\",\"React\",\"URI\",\"XUISpinner.react\",\"copyProperties\",\"cx\",\"eachKeyVal\",\"emptyFunction\",\"LoadingDialogDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DialogX\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"Keys\"), n = b(\"LayerFadeOnShow\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"URI\"), r = b(\"XUISpinner.react\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"eachKeyVal\"), v = b(\"emptyFunction\"), w = b(\"LoadingDialogDimensions\").WIDTH, x;\n    function y() {\n        if (!x) {\n            var ga = k.create(\"div\", {\n                className: \"-cx-PRIVATE-loadingDialog__spinnercontainer\"\n            });\n            x = new j({\n                width: w,\n                addedBehaviors: [n,],\n                xui: true\n            }, k.create(\"div\", null, ga));\n            p.renderComponent(r({\n                size: \"large\"\n            }), ga);\n            x.subscribe([\"key\",\"blur\",], function(ha, ia) {\n                if (((ha == \"blur\") || (((ha == \"key\") && (ia.keyCode == m.ESC))))) {\n                    ca();\n                    return false;\n                }\n            ;\n            });\n        }\n    ;\n        return x;\n    };\n    var z = {\n    }, aa = 1, ba = [];\n    function ca() {\n        u(z, function(ga, ha) {\n            ha.abandon();\n            da(ga);\n        });\n    };\n    function da(ga) {\n        delete z[ga];\n        if (!Object.keys(z).length) {\n            y().hide();\n        };\n    };\n    function ea(ga, ha) {\n        var ia = aa++;\n        ba[ia] = ha;\n        z[ia] = ga;\n        var ja = da.curry((\"\" + ia));\n        s(ga.getData(), {\n            __asyncDialog: ia\n        });\n        y().setCausalElement(ga.getRelativeTo()).show();\n        var ka = ga.finallyHandler;\n        ga.setFinallyHandler(function(la) {\n            var ma = la.getPayload();\n            if ((ma && ma.asyncURL)) {\n                fa.send(new g(ma.asyncURL));\n            };\n            ja();\n            (ka && ka(la));\n        });\n        ga.setInterceptHandler(ja).setAbortHandler(ja);\n        ga.send();\n    };\n    var fa = {\n        send: function(ga, ha) {\n            ea(ga, (ha || v));\n        },\n        bootstrap: function(ga, ha, ia) {\n            if (!ga) {\n                return\n            };\n            var ja = (o.byClass(ha, \"stat_elem\") || ha);\n            if ((ja && i.hasClass(ja, \"async_saving\"))) {\n                return false\n            };\n            var ka = new q(ga).getQueryData(), la = (ia === \"dialog\"), ma = new g().setURI(ga).setData(ka).setMethod((la ? \"GET\" : \"POST\")).setReadOnly(la).setRelativeTo(ha).setStatusElement(ja).setNectarModuleDataSafe(ha);\n            if (l.is_desktop) {\n                h.loadModules([\"FbdDialogProvider\",], function(na) {\n                    na.sendDialog(ma, fa.send);\n                });\n                return;\n            }\n        ;\n            fa.send(ma);\n        },\n        respond: function(ga, ha) {\n            var ia = ba[ga];\n            if (ia) {\n                ia(ha);\n                delete ba[ga];\n            }\n        ;\n        },\n        getLoadingDialog: function() {\n            return y();\n        }\n    };\n    e.exports = fa;\n});\n__d(\"Hovercard\", [\"JSXDOM\",\"Event\",\"function-extensions\",\"AccessibleLayer\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ContextualDialog\",\"ContextualThing\",\"DOM\",\"LayerAutoFocus\",\"Parent\",\"Rect\",\"Style\",\"UserAgent\",\"Vector\",\"clickRefAction\",\"cx\",\"emptyFunction\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Event\");\n    b(\"function-extensions\");\n    var i = b(\"AccessibleLayer\"), j = b(\"Arbiter\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"ContextualDialog\"), n = b(\"ContextualThing\"), o = b(\"DOM\"), p = b(\"LayerAutoFocus\"), q = b(\"Parent\"), r = b(\"Rect\"), s = b(\"Style\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"clickRefAction\"), w = b(\"cx\"), x = b(\"emptyFunction\"), y = b(\"tx\"), z = b(\"userAction\"), aa = {\n    }, ba = {\n    }, ca = null, da = null, ea = null, fa = 150, ga = 700, ha = 1000, ia = 250, ja = null, ka = null, la = null, ma = null;\n    function na(event) {\n        var cb = q.byTag(event.getTarget(), \"a\");\n        (bb.processNode(cb) && event.stop());\n    };\n    function oa(cb) {\n        da = cb;\n        if (!pa(cb)) {\n            var db;\n            if ((!cb || !(db = qa(cb)))) {\n                (ba.moveToken && ba.moveToken.remove());\n                ba = {\n                };\n                return false;\n            }\n        ;\n            if ((ba.node != cb)) {\n                (ba.moveToken && ba.moveToken.remove());\n                ba = {\n                    node: cb,\n                    endpoint: db,\n                    pos: null\n                };\n            }\n        ;\n        }\n    ;\n        return true;\n    };\n    function pa(cb) {\n        return ((cb && ca) && (ba.node == cb));\n    };\n    function qa(cb) {\n        return cb.getAttribute(\"data-hovercard\");\n    };\n    function ra(cb) {\n        var db = h.listen(cb, \"mouseout\", function() {\n            clearTimeout(ja);\n            clearTimeout(ka);\n            db.remove();\n            da = null;\n            if (!bb.contains(cb)) {\n                bb.hide();\n            };\n        });\n        if (!ba.moveToken) {\n            ba.moveToken = h.listen(cb, \"mousemove\", function(event) {\n                ba.pos = u.getEventPosition(event);\n            });\n        };\n        clearTimeout(ja);\n        clearTimeout(ka);\n        clearTimeout(ma);\n        var eb = fa, fb = (ca ? ia : ga);\n        if (cb.getAttribute(\"data-hovercard-instant\")) {\n            eb = fb = 50;\n        };\n        ja = setTimeout(wa.curry(cb), eb);\n        ka = setTimeout(sa.curry(cb), fb);\n    };\n    function sa(cb, db) {\n        if ((ba.node != cb)) {\n            return\n        };\n        var eb = aa[qa(cb)];\n        if (eb) {\n            ua(eb);\n        }\n         else if (db) {\n            ua(ya());\n        }\n         else {\n            var fb = (ca ? ia : ga);\n            la = setTimeout(sa.curry(cb, true), (ha - fb));\n        }\n        \n    ;\n    };\n    function ta() {\n        bb.hide(true);\n        clearTimeout(ka);\n    };\n    function ua(cb) {\n        var db = ba.node, eb = ca, fb = (eb != db);\n        if (ea) {\n            var gb = ea.getContentRoot();\n            if (!n.containsIncludingLayers(gb, db)) {\n                ea.hide();\n            };\n        }\n    ;\n        if (!o.contains(document.body, db)) {\n            bb.hide(true);\n            return;\n        }\n    ;\n        ca = db;\n        ea = cb;\n        cb.setContextWithBounds(db, va(db)).show();\n        if (fb) {\n            (function() {\n                new l(\"/ajax/hovercard/shown.php\").send();\n                v(\"himp\", ca, null, \"FORCE\", {\n                    ft: {\n                        evt: 39\n                    }\n                });\n                z(\"hovercard\", ca).uai(\"show\");\n            }).defer();\n        };\n    };\n    function va(cb) {\n        var db = ba.pos, eb = cb.getClientRects();\n        if ((!db || (eb.length === 0))) {\n            return r.getElementBounds(cb)\n        };\n        var fb, gb = false;\n        for (var hb = 0; (hb < eb.length); hb++) {\n            var ib = new r(Math.round(eb[hb].top), Math.round(eb[hb].right), Math.round(eb[hb].bottom), Math.round(eb[hb].left), \"viewport\").convertTo(\"document\"), jb = ib.getPositionVector(), kb = jb.add(ib.getDimensionVector());\n            if ((!fb || (((jb.x <= fb.l) && (jb.y > fb.t))))) {\n                if (gb) {\n                    break;\n                };\n                fb = new r(jb.y, kb.x, kb.y, jb.x, \"document\");\n            }\n             else {\n                fb.t = Math.min(fb.t, jb.y);\n                fb.b = Math.max(fb.b, kb.y);\n                fb.r = kb.x;\n            }\n        ;\n            if (ib.contains(db)) {\n                gb = true;\n            };\n        };\n        return fb;\n    };\n    function wa(cb) {\n        if ((cb.id && (aa[cb.id] != null))) {\n            return\n        };\n        var db = qa(cb);\n        if ((aa[db] != null)) {\n            return\n        };\n        xa(db);\n        var eb = function() {\n            bb.dirty(db);\n            ta();\n        };\n        new k(db).setData({\n            endpoint: db\n        }).setMethod(\"GET\").setReadOnly(true).setErrorHandler(eb).setTransportErrorHandler(eb).send();\n    };\n    function xa(cb) {\n        aa[cb] = false;\n    };\n    var ya = function() {\n        var cb = new m({\n            width: 275\n        }, g.div({\n            className: \"-cx-PRIVATE-hovercard__loading\"\n        }, \"Loading...\"));\n        cb.disableBehavior(i).disableBehavior(p);\n        za(cb);\n        ya = x.thatReturns(cb);\n        return cb;\n    };\n    function za(cb) {\n        var db = [cb.subscribe(\"mouseenter\", function() {\n            clearTimeout(ma);\n            da = ba.node;\n        }),cb.subscribe(\"mouseleave\", function() {\n            cb.hide();\n            da = null;\n        }),cb.subscribe(\"destroy\", function() {\n            while (db.length) {\n                db.pop().unsubscribe();;\n            };\n            db = null;\n        }),];\n    };\n    var ab = true, bb = {\n        hide: function(cb) {\n            if (!ca) {\n                return\n            };\n            if (cb) {\n                if (ea) {\n                    ea.hide();\n                };\n                da = null;\n                ca = null;\n                ea = null;\n            }\n             else ma = setTimeout(bb.hide.curry(true), ia);\n        ;\n        },\n        setDialog: function(cb, db) {\n            db.disableBehavior(i).disableBehavior(p);\n            aa[cb] = db;\n            za(db);\n            if (((ba.endpoint == cb) && (da == ba.node))) {\n                ya().hide();\n                var eb = ba.node.getAttribute(\"data-hovercard-position\");\n                (eb && db.setPosition(eb));\n                var fb = ba.node.getAttribute(\"data-hovercard-offset-x\");\n                (fb && db.setOffsetX(parseInt(fb, 10)));\n                var gb = ba.node.getAttribute(\"data-hovercard-offset-y\");\n                (gb && db.setOffsetY(parseInt(gb, 10)));\n                ua(db);\n            }\n        ;\n        },\n        getDialog: function(cb) {\n            return aa[cb];\n        },\n        contains: function(cb) {\n            if (ea) {\n                return n.containsIncludingLayers(ea.getContentRoot(), cb)\n            };\n            return false;\n        },\n        dirty: function(cb) {\n            var db = aa[cb];\n            if (db) {\n                db.destroy();\n                delete aa[cb];\n            }\n        ;\n        },\n        dirtyAll: function() {\n            for (var cb in aa) {\n                var db = aa[cb];\n                (db && bb.dirty(cb));\n            };\n            j.inform(\"Hovercard/dirty\");\n        },\n        processNode: function(cb) {\n            if ((cb && oa(cb))) {\n                ra(cb);\n                return true;\n            }\n        ;\n            return false;\n        },\n        setDirtyAllOnPageTransition: function(cb) {\n            ab = cb;\n        }\n    };\n    (function() {\n        if ((t.ie() < 8)) {\n            return\n        };\n        h.listen(document.documentElement, \"mouseover\", na);\n        h.listen(window, \"scroll\", function() {\n            if ((ca && s.isFixed(ca))) {\n                bb.hide(true);\n            };\n        });\n        j.subscribe(\"page_transition\", function() {\n            ta();\n            (ab && bb.dirtyAll());\n        }, j.SUBSCRIBE_NEW);\n    })();\n    e.exports = bb;\n});\n__d(\"StickyPlaceholderInput\", [\"Event\",\"CSS\",\"DOM\",\"Input\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Input\"), k = b(\"Parent\"), l = b(\"emptyFunction\");\n    function m(q) {\n        return k.byClass(q, \"uiStickyPlaceholderInput\");\n    };\n    function n(q) {\n        return i.scry(q, \".placeholder\")[0];\n    };\n    function o(q) {\n        q = (q || window.event);\n        var r = (q.target || q.srcElement);\n        if (i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            var s = m(r);\n            if (s) {\n                (function() {\n                    h.conditionClass(s, \"uiStickyPlaceholderEmptyInput\", !r.value.length);\n                }).defer();\n            };\n        }\n    ;\n    };\n    var p = {\n        init: function() {\n            p.init = l;\n            g.listen(document.documentElement, {\n                keydown: o,\n                paste: o,\n                focusout: o\n            });\n        },\n        registerInput: function(q) {\n            p.init();\n            var r = (q.getAttribute(\"placeholder\") || \"\");\n            if (r.length) {\n                if ((document.activeElement === q)) {\n                    var s = g.listen(q, \"blur\", function() {\n                        p.manipulateInput(q, r);\n                        s.remove();\n                    });\n                }\n                 else p.manipulateInput(q, r);\n            \n            };\n        },\n        manipulateInput: function(q, r) {\n            var s = i.create(\"div\", {\n                className: \"placeholder\",\n                \"aria-hidden\": \"true\"\n            }, r), t = i.create(\"div\", {\n                className: \"uiStickyPlaceholderInput\"\n            }, s);\n            if (i.isNodeOfType(q, \"textarea\")) {\n                h.addClass(t, \"uiStickyPlaceholderTextarea\");\n            };\n            g.listen(s, \"click\", function() {\n                q.focus();\n            });\n            if ((q.value === r)) {\n                q.value = \"\";\n            };\n            h.removeClass(q, \"DOMControl_placeholder\");\n            q.setAttribute(\"placeholder\", \"\");\n            i.replace(q, t);\n            i.appendContent(t, q);\n            h.conditionClass(t, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n        },\n        setPlaceholderText: function(q, r) {\n            var s = m(q);\n            if (!s) {\n                j.setPlaceholder(q, r);\n            }\n             else {\n                var t = n(s);\n                (t && i.setContent(t, r));\n            }\n        ;\n        },\n        getPlaceholderText: function(q) {\n            var r = m(q), s = n(r);\n            return (s && i.getText(s));\n        },\n        update: function(q) {\n            var r = m(q);\n            if (r) {\n                h.conditionClass(r, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n            };\n        },\n        getVisibleText: function(q) {\n            var r = m(q);\n            if (h.hasClass(r, \"uiStickyPlaceholderEmptyInput\")) {\n                var s = n(r);\n                return (s && i.getText(s));\n            }\n             else return q.value\n        ;\n        }\n    };\n    e.exports = p;\n});\n__d(\"UIForm\", [\"Event\",\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"Form\",\"Run\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"DOM\"), k = b(\"Form\"), l = b(\"Run\"), m = b(\"areObjectsEqual\"), n = b(\"copyProperties\");\n    function o(p, q, r, s, t) {\n        this._root = p;\n        this.controller = p;\n        this._message = q;\n        if (s) {\n            this._confirm_dialog = s;\n            s.subscribe(\"confirm\", this._handleDialogConfirm.bind(this));\n            j.prependContent(this._root, j.create(\"input\", {\n                type: \"hidden\",\n                name: \"confirmed\",\n                value: \"true\"\n            }));\n        }\n    ;\n        l.onAfterLoad(function() {\n            this._originalState = k.serialize(this._root);\n        }.bind(this));\n        this._forceDirty = r;\n        this._confirmed = false;\n        this._submitted = false;\n        g.listen(this._root, \"submit\", this._handleSubmit.bind(this));\n        if ((t && t.length)) {\n            this.enableBehaviors(t);\n        };\n        var u = true;\n        l.onBeforeUnload(this.checkUnsaved.bind(this), u);\n    };\n    n(o.prototype, h, i, {\n        getRoot: function() {\n            return this._root;\n        },\n        _handleSubmit: function() {\n            if ((this._confirm_dialog && !this._confirmed)) {\n                this._confirm_dialog.show();\n                return false;\n            }\n        ;\n            if ((this.inform(\"submit\") === false)) {\n                return false\n            };\n            this._submitted = true;\n            return true;\n        },\n        _handleDialogConfirm: function() {\n            this._confirmed = true;\n            this._confirm_dialog.hide();\n            if (this._root.getAttribute(\"ajaxify\")) {\n                g.fire(this._root, \"submit\");\n            }\n             else if (this._handleSubmit()) {\n                this._root.submit();\n            }\n        ;\n        },\n        reset: function() {\n            this.inform(\"reset\");\n            this._submitted = false;\n            this._confirmed = false;\n        },\n        isDirty: function() {\n            if ((this._submitted || !j.contains(document.body, this._root))) {\n                return false\n            };\n            if (this._forceDirty) {\n                return true\n            };\n            var p = k.serialize(this._root);\n            return !m(p, this._originalState);\n        },\n        checkUnsaved: function() {\n            if (this.isDirty()) {\n                return this._message\n            };\n            return null;\n        }\n    });\n    e.exports = (a.UIForm || o);\n});\n__d(\"MenuTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        className: \"-cx-PRIVATE-uiMenu__root\"\n    };\n});\n__d(\"legacy:Tooltip\", [\"Tooltip\",], function(a, b, c, d) {\n    a.Tooltip = b(\"Tooltip\");\n}, 3);\n__d(\"BanzaiODS\", [\"Banzai\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"invariant\");\n    function i() {\n        var k = {\n        };\n        function l(m, n, o, p) {\n            var q = (k[m] || (k[m] = {\n            })), r = (q[n] || (q[n] = [0,]));\n            if ((o === undefined)) {\n                o = 1;\n            };\n            if ((p === undefined)) {\n                p = 1;\n            };\n            o = Number(o);\n            p = Number(p);\n            if ((!isFinite(o) || !isFinite(p))) {\n                return\n            };\n            r[0] += o;\n            if ((arguments.length >= 4)) {\n                if (!r[1]) {\n                    r[1] = 0;\n                };\n                r[1] += p;\n            }\n        ;\n        };\n        return {\n            bumpEntityKey: function(m, n, o) {\n                l(m, n, o);\n            },\n            bumpFraction: function(m, n, o, p) {\n                l(m, n, o, p);\n            },\n            flush: function(m) {\n                for (var n in k) {\n                    g.post((\"ods:\" + n), k[n], m);;\n                };\n                k = {\n                };\n            }\n        };\n    };\n    var j = i();\n    j.create = i;\n    g.subscribe(g.SEND, j.flush.bind(j, null));\n    e.exports = j;\n});\n__d(\"endsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return (h.indexOf(i, (h.length - i.length)) > -1);\n    };\n    e.exports = g;\n});\n__d(\"extendArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Array.prototype.push.apply(h, i);\n        return h;\n    };\n    e.exports = g;\n});");
// 4764
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sbf5a653251628e13e041c7dc1bee5c6e52b9508d");
// 4765
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"AsDOA\",]);\n}\n;\n;\n__d(\"AdblockDetector\", [], function(a, b, c, d, e, f) {\n    var g = \"data-adblock-hash\", h = {\n    }, i = 0;\n    function j(k, l) {\n        var m = k.getAttribute(g);\n        if (!m) {\n            m = ++i;\n            k.setAttribute(g, m);\n        }\n         else if (h[m]) {\n            JSBNG__clearTimeout(h[m]);\n            h[m] = null;\n        }\n        \n    ;\n    ;\n        h[m] = JSBNG__setTimeout(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_2), function() {\n            h[m] = null;\n            if (!k.offsetHeight) {\n                var n = k, o = JSBNG__document.getElementsByTagName(\"body\")[0];\n                while (((n && ((n !== o))))) {\n                    if (((((((((((n.style.display === \"none\")) || ((n.style.height === \"0px\")))) || ((n.style.height === 0)))) || ((n.style.height === \"0\")))) || ((n.childNodes.length === 0))))) {\n                        return;\n                    }\n                ;\n                ;\n                    n = n.parentNode;\n                };\n            ;\n                if (((n === o))) {\n                    ((l && l(k)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        })), 3000);\n    };\n;\n    f.assertUnblocked = j;\n});\n__d(\"EagleEye\", [\"Arbiter\",\"Env\",\"OnloadEvent\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"OnloadEvent\"), j = b(\"isInIframe\"), k = ((h.eagleEyeConfig || {\n    })), l = \"_e_\", m = ((window.JSBNG__name || \"\")).toString();\n    if (((((m.length == 7)) && ((m.substr(0, 3) == l))))) {\n        m = m.substr(3);\n    }\n     else {\n        m = k.seed;\n        if (!j()) {\n            window.JSBNG__name = ((l + m));\n        }\n    ;\n    ;\n    }\n;\n;\n    var n = ((((((window.JSBNG__location.protocol == \"https:\")) && JSBNG__document.cookie.match(/\\bcsm=1/))) ? \"; secure\" : \"\")), o = ((((l + m)) + \"_\")), p = new JSBNG__Date(((JSBNG__Date.now() + 604800000))).toGMTString(), q = window.JSBNG__location.hostname.replace(/^.*(facebook\\..*)$/i, \"$1\"), r = ((((((((\"; expires=\" + p)) + \";path=/; domain=\")) + q)) + n)), s = 0, t, u = ((k.JSBNG__sessionStorage && a.JSBNG__sessionStorage)), v = JSBNG__document.cookie.length, w = false, x = JSBNG__Date.now();\n    function y(ca) {\n        return ((((((((o + (s++))) + \"=\")) + encodeURIComponent(ca))) + r));\n    };\n;\n    function z() {\n        var ca = [], da = false, ea = 0, fa = 0;\n        this.isEmpty = function() {\n            return !ca.length;\n        };\n        this.enqueue = function(ga, ha) {\n            if (ha) {\n                ca.unshift(ga);\n            }\n             else ca.push(ga);\n        ;\n        ;\n        };\n        this.dequeue = function() {\n            ca.shift();\n        };\n        this.peek = function() {\n            return ca[0];\n        };\n        this.clear = function(ga) {\n            v = Math.min(v, JSBNG__document.cookie.length);\n            if (((!w && ((((new JSBNG__Date() - x)) > 60000))))) {\n                w = true;\n            }\n        ;\n        ;\n            var ha = ((!ga && ((JSBNG__document.cookie.search(l) >= 0)))), ia = !!h.cookie_header_limit, ja = ((h.cookie_count_limit || 19)), ka = ((h.cookie_header_limit || 3950)), la = ((ja - 5)), ma = ((ka - 1000));\n            while (!this.isEmpty()) {\n                var na = y(this.peek());\n                if (((ia && ((((na.length > ka)) || ((w && ((((na.length + v)) > ka))))))))) {\n                    this.dequeue();\n                    continue;\n                }\n            ;\n            ;\n                if (((((ha || ia)) && ((((((JSBNG__document.cookie.length + na.length)) > ka)) || ((JSBNG__document.cookie.split(\";\").length > ja))))))) {\n                    break;\n                }\n            ;\n            ;\n                JSBNG__document.cookie = na;\n                ha = true;\n                this.dequeue();\n            };\n        ;\n            var oa = JSBNG__Date.now();\n            if (((ga || ((((((((!da && ha)) && ((((fa > 0)) && ((((Math.min(((10 * Math.pow(2, ((fa - 1))))), 60000) + ea)) < oa)))))) && g.query(i.ONLOAD))) && ((((!this.isEmpty() || ((JSBNG__document.cookie.length > ma)))) || ((JSBNG__document.cookie.split(\";\").length > la))))))))) {\n                var pa = new JSBNG__Image(), qa = this, ra = ((h.tracking_domain || \"\"));\n                da = true;\n                pa.JSBNG__onload = function ua() {\n                    da = false;\n                    fa = 0;\n                    qa.clear();\n                };\n                pa.JSBNG__onerror = pa.JSBNG__onabort = function ua() {\n                    da = false;\n                    ea = JSBNG__Date.now();\n                    fa++;\n                };\n                var sa = ((h.fb_isb ? ((\"&fb_isb=\" + h.fb_isb)) : \"\")), ta = ((\"&__user=\" + h.user));\n                pa.src = ((((((((((((((ra + \"/ajax/nectar.php?asyncSignal=\")) + ((Math.floor(((Math.JSBNG__random() * 10000))) + 1)))) + sa)) + ta)) + \"&\")) + ((!ga ? \"\" : \"s=\")))) + oa));\n            }\n        ;\n        ;\n        };\n    };\n;\n    t = new z();\n    if (u) {\n        var aa = function() {\n            var ca = 0, da = ca;\n            function ea() {\n                var ha = JSBNG__sessionStorage.getItem(\"_e_ids\");\n                if (ha) {\n                    var ia = ((ha + \"\")).split(\";\");\n                    if (((ia.length == 2))) {\n                        ca = parseInt(ia[0], 10);\n                        da = parseInt(ia[1], 10);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            function fa() {\n                var ha = ((((ca + \";\")) + da));\n                JSBNG__sessionStorage.setItem(\"_e_ids\", ha);\n            };\n        ;\n            function ga(ha) {\n                return ((\"_e_\" + ((((ha !== undefined)) ? ha : ca++))));\n            };\n        ;\n            this.isEmpty = function() {\n                return ((da === ca));\n            };\n            this.enqueue = function(ha, ia) {\n                var ja = ((ia ? ga(--da) : ga()));\n                JSBNG__sessionStorage.setItem(ja, ha);\n                fa();\n            };\n            this.dequeue = function() {\n                this.isEmpty();\n                JSBNG__sessionStorage.removeItem(ga(da));\n                da++;\n                fa();\n            };\n            this.peek = function() {\n                var ha = JSBNG__sessionStorage.getItem(ga(da));\n                return ((ha ? ((ha + \"\")) : ha));\n            };\n            this.clear = t.clear;\n            ea();\n        };\n        t = new aa();\n    }\n;\n;\n    var ba = {\n        log: function(ca, da, ea) {\n            if (h.no_cookies) {\n                return;\n            }\n        ;\n        ;\n            var fa = [m,JSBNG__Date.now(),ca,].concat(da);\n            fa.push(fa.length);\n            function ga() {\n                var ha = JSON.stringify(fa);\n                try {\n                    t.enqueue(ha, !!ea);\n                    t.clear(!!ea);\n                } catch (ia) {\n                    if (((u && ((ia.code === 1000))))) {\n                        t = new z();\n                        u = false;\n                        ga();\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            ga();\n        },\n        getSessionID: function() {\n            return m;\n        }\n    };\n    e.exports = ba;\n    a.EagleEye = ba;\n}, 3);\n__d(\"AdblockDetectorLogging\", [\"AdblockDetector\",\"EagleEye\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdblockDetector\"), h = b(\"EagleEye\");\n    function i(j) {\n        g.assertUnblocked(j, h.log.bind(h, \"ads\", {\n            JSBNG__event: \"ads_blocked\"\n        }));\n    };\n;\n    f.assertUnblocked = i;\n});\n__d(\"EgoAdsObjectSet\", [\"copyProperties\",\"csx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"csx\"), i = b(\"DOM\");\n    function j() {\n        this._allEgoUnits = [];\n        this._egoUnits = [];\n    };\n;\n    g(j.prototype, {\n        init: function(l) {\n            this._allEgoUnits = l;\n            this._egoUnits = [];\n            this._allEgoUnits.forEach(function(m) {\n                var n = k(m);\n                if (((!n || !n.holdout))) {\n                    this._egoUnits.push(m);\n                }\n            ;\n            ;\n            }, this);\n        },\n        getCount: function() {\n            return this._egoUnits.length;\n        },\n        forEach: function(l, m) {\n            this._egoUnits.forEach(l, m);\n        },\n        getUnit: function(l) {\n            return this._egoUnits[l];\n        },\n        getHoldoutAdIDsForSpace: function(l, m) {\n            if (((!l || !m))) {\n                return [];\n            }\n        ;\n        ;\n            var n = [];\n            for (var o = 0; ((((l > 0)) && ((o < this._allEgoUnits.length)))); o++) {\n                var p = this._allEgoUnits[o], q = m(p), r = k(p);\n                if (((((((l >= q)) && r)) && r.holdout))) {\n                    n.push(r.adid);\n                }\n            ;\n            ;\n                l -= q;\n            };\n        ;\n            return n;\n        },\n        getHoldoutAdIDsForNumAds: function(l) {\n            l = Math.min(l, this._allEgoUnits.length);\n            var m = [];\n            for (var n = 0; ((n < l)); n++) {\n                var o = this._allEgoUnits[n], p = k(o);\n                if (((p && p.holdout))) {\n                    m.push(p.adid);\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        }\n    });\n    function k(l) {\n        var m = i.scry(l, \"div.-cx-PUBLIC-fbAdUnit__root\")[0], n = ((m && m.getAttribute(\"data-ad\")));\n        return ((((n && JSON.parse(n))) || undefined));\n    };\n;\n    e.exports = j;\n});\n__d(\"EmuController\", [\"AsyncRequest\",\"DataStore\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"URI\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"ge\"), m = b(\"goURI\");\n    function n(o, p) {\n        var q = l(o);\n        if (!q) {\n            return null;\n        }\n    ;\n    ;\n        this.impression = p;\n        this.containerId = o;\n        h.set(q, \"emuController\", this);\n        return this;\n    };\n;\n    j(n, {\n        fromContainer: function(o) {\n            var p = l(o);\n            if (!p) {\n                return null;\n            }\n        ;\n        ;\n            return h.get(p, \"emuController\");\n        },\n        getEventClass: function(o) {\n            return ((\"emuEvent\" + String(o).trim()));\n        }\n    });\n    j(n.prototype, {\n        EVENT_HANDLER_PATH: \"/ajax/emu/end.php\",\n        CLICK: 1,\n        FAN: \"fad_fan\",\n        JSBNG__event: function(o, p, q, r) {\n            var s = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: o,\n                a: 1\n            };\n            if (p) {\n                s.ed = JSON.stringify(p);\n            }\n        ;\n        ;\n            if (!r) {\n                r = k;\n            }\n        ;\n        ;\n            var t = new g().setURI(this.EVENT_HANDLER_PATH).setData(s).setErrorHandler(r);\n            if (q) {\n                t.setHandler(q);\n            }\n        ;\n        ;\n            t.send();\n        },\n        redirect: function() {\n            var o = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: this.CLICK,\n                a: 0,\n                sig: ((Math.floor(((Math.JSBNG__random() * 65535))) + 65536))\n            }, p = new i(this.EVENT_HANDLER_PATH);\n            p.setQueryData(o);\n            m(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ad-units-base-js\", [\"EmuController\",], function(a, b, c, d) {\n    a.EmuController = b(\"EmuController\");\n}, 3);\n__d(\"ChatConfig\", [\"ChatConfigInitialData\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfigInitialData\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        get: function(k, l) {\n            return ((((k in i)) ? i[k] : l));\n        },\n        set: function(k) {\n            if (((arguments.length > 1))) {\n                var l = {\n                };\n                l[k] = arguments[1];\n                k = l;\n            }\n        ;\n        ;\n            h(i, k);\n        },\n        getDebugInfo: function() {\n            return i;\n        }\n    };\n    j.set(g);\n    e.exports = j;\n});\n__d(\"JSBNG__cancelAnimationFrame\", [], function(a, b, c, d, e, f) {\n    var g = ((((((((((a.JSBNG__cancelAnimationFrame || a.JSBNG__webkitCancelAnimationFrame)) || a.JSBNG__mozCancelAnimationFrame)) || a.oCancelAnimationFrame)) || a.msCancelAnimationFrame)) || a.JSBNG__clearTimeout));\n    e.exports = g;\n});\n__d(\"XUISpinner.react\", [\"BrowserSupport\",\"ReactProps\",\"React\",\"JSBNG__cancelAnimationFrame\",\"cx\",\"joinClasses\",\"JSBNG__requestAnimationFrame\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"ReactProps\"), i = b(\"React\"), j = b(\"JSBNG__cancelAnimationFrame\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = b(\"JSBNG__requestAnimationFrame\"), n = b(\"tx\"), o = g.hasCSSAnimations(), p = {\n        SMALL: 16,\n        LARGE: 32\n    }, q = {\n        SMALL: 2,\n        LARGE: 4\n    }, r = 5, s = 8, t = ((r * s)), u = 1200, v = ((u / t)), w = i.createClass({\n        displayName: \"XUISpinner\",\n        props: {\n            size: h.oneOf([\"small\",\"large\",]),\n            background: h.oneOf([\"light\",\"dark\",])\n        },\n        getDefaultProps: function() {\n            return {\n                size: \"small\",\n                background: \"light\"\n            };\n        },\n        getInitialState: function() {\n            if (!o) {\n                return {\n                    frame: 0,\n                    timer: JSBNG__Date.now()\n                };\n            }\n        ;\n        ;\n        },\n        componentDidMount: function() {\n            if (!o) {\n                this._step();\n            }\n        ;\n        ;\n        },\n        componentWillUnmount: function() {\n            ((this._requestID && j(this._requestID)));\n        },\n        _step: function() {\n            this._requestID = m(this._step);\n            var x = JSBNG__Date.now();\n            if (((((x - v)) > this.state.timer))) {\n                this.setState({\n                    frame: ((((this.state.frame + 1)) % t)),\n                    timer: x\n                });\n            }\n        ;\n        ;\n        },\n        _renderWithCSSAnimation: function(x) {\n            return this.transferPropsTo(i.DOM.span({\n                className: x\n            }, \"Loading...\"));\n        },\n        _renderWithJavaScriptAnimation: function(x) {\n            var y = Math.floor(((this.state.frame / s))), z = ((this.state.frame % s)), aa = ((((this.props.size == \"small\")) ? p.SMALL : p.LARGE)), ba = ((((this.props.size == \"small\")) ? q.SMALL : q.LARGE)), ca = {\n                backgroundPosition: ((((((((((\"-\" + ((((z * aa)) + ba)))) + \"px \")) + \"-\")) + ((((y * aa)) + ba)))) + \"px\"))\n            }, da = l((\"-cx-PRIVATE-xuiSpinner__jsanimation\"), x);\n            return this.transferPropsTo(i.DOM.span({\n                className: da,\n                style: ca\n            }, \"Loading...\"));\n        },\n        render: function() {\n            var x = (((((((((\"-cx-PRIVATE-xuiSpinner__root\") + ((((this.props.size == \"small\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__small\")) : \"\")))) + ((((this.props.size == \"large\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__large\")) : \"\")))) + ((((this.props.background == \"light\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__light\")) : \"\")))) + ((((this.props.background == \"dark\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__dark\")) : \"\"))));\n            return ((o ? this._renderWithCSSAnimation(x) : this._renderWithJavaScriptAnimation(x)));\n        }\n    });\n    e.exports = w;\n});\n__d(\"ViewportBounds\", [\"Style\",\"Vector\",\"emptyFunction\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"Vector\"), i = b(\"emptyFunction\"), j = b(\"ge\"), k = b(\"removeFromArray\"), l = {\n        JSBNG__top: [],\n        right: [],\n        bottom: [],\n        left: []\n    };\n    function m(q) {\n        return function() {\n            var r = 0;\n            l[q].forEach(function(s) {\n                r = Math.max(r, s.getSize());\n            });\n            return r;\n        };\n    };\n;\n    function n(q) {\n        return function(r) {\n            return new o(q, r);\n        };\n    };\n;\n    function o(q, r) {\n        this.getSide = i.thatReturns(q);\n        this.getSize = function() {\n            return ((((typeof r === \"function\")) ? r() : r));\n        };\n        l[q].push(this);\n    };\n;\n    o.prototype.remove = function() {\n        k(l[this.getSide()], this);\n    };\n    var p = {\n        getTop: m(\"JSBNG__top\"),\n        getRight: m(\"right\"),\n        getBottom: m(\"bottom\"),\n        getLeft: m(\"left\"),\n        getElementPosition: function(q) {\n            var r = h.getElementPosition(q);\n            r.y -= p.getTop();\n            return r;\n        },\n        addTop: n(\"JSBNG__top\"),\n        addRight: n(\"right\"),\n        addBottom: n(\"bottom\"),\n        addLeft: n(\"left\")\n    };\n    p.addTop(function() {\n        var q = j(\"blueBar\");\n        if (((q && g.isFixed(q)))) {\n            return j(\"blueBarHolder\").offsetHeight;\n        }\n    ;\n    ;\n        return 0;\n    });\n    e.exports = p;\n});\n__d(\"isAsyncScrollQuery\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = null;\n    function i() {\n        if (((h === null))) {\n            h = ((((((g.osx() >= 10.8)) && ((g.webkit() >= 536.25)))) && !g.chrome()));\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = i;\n});\n__d(\"ScrollAwareDOM\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMDimensions\",\"DOMPosition\",\"DOMQuery\",\"HTML\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"DOMPosition\"), l = b(\"DOMQuery\"), m = b(\"HTML\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"isAsyncScrollQuery\");\n    function r(w, x) {\n        return function() {\n            v.monitor(arguments[w], x.curry.apply(x, arguments));\n        };\n    };\n;\n    function s(w) {\n        if (!((w instanceof Array))) {\n            w = [w,];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); x++) {\n            var y = m.replaceJSONWrapper(w[x]);\n            if (((y instanceof m))) {\n                return y.getRootNode();\n            }\n             else if (i.isNode(y)) {\n                return y;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function t(w) {\n        return ((k.getElementPosition(w).y > o.getTop()));\n    };\n;\n    function u(w) {\n        var x = ((k.getElementPosition(w).y + j.getElementDimensions(w).height)), y = ((j.getViewportDimensions().height - o.getBottom()));\n        return ((x >= y));\n    };\n;\n    var v = p({\n        monitor: function(w, x) {\n            if (q()) {\n                return x();\n            }\n        ;\n        ;\n            var y = s(w);\n            if (y) {\n                var z = !!y.offsetParent;\n                if (((z && ((t(y) || u(y)))))) {\n                    return x();\n                }\n            ;\n            ;\n                var aa = n.getDocumentDimensions(), ba = x();\n                if (((z || ((y.offsetParent && !t(y)))))) {\n                    var ca = n.getDocumentDimensions().sub(aa), da = {\n                        delta: ca,\n                        target: y\n                    };\n                    if (((v.inform(\"JSBNG__scroll\", da) !== false))) {\n                        ca.scrollElementBy(l.getDocumentScrollElement());\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                return ba;\n            }\n             else return x()\n        ;\n        },\n        replace: function(w, x) {\n            var y = s(x);\n            if (((!y || h.hasClass(y, \"hidden_elem\")))) {\n                y = w;\n            }\n        ;\n        ;\n            return v.monitor(y, function() {\n                i.replace(w, x);\n            });\n        },\n        prependContent: r(1, i.prependContent),\n        insertAfter: r(1, i.insertAfter),\n        insertBefore: r(1, i.insertBefore),\n        setContent: r(0, i.setContent),\n        appendContent: r(1, i.appendContent),\n        remove: r(0, i.remove),\n        empty: r(0, i.empty)\n    }, g);\n    e.exports = v;\n});\n__d(\"legacy:ScrollAwareDOM\", [\"ScrollAwareDOM\",], function(a, b, c, d) {\n    a.ScrollAwareDOM = b(\"ScrollAwareDOM\");\n}, 3);\n__d(\"Base64\", [], function(a, b, c, d, e, f) {\n    var g = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function h(l) {\n        l = ((((((l.charCodeAt(0) << 16)) | ((l.charCodeAt(1) << 8)))) | l.charCodeAt(2)));\n        return String.fromCharCode(g.charCodeAt(((l >>> 18))), g.charCodeAt(((((l >>> 12)) & 63))), g.charCodeAt(((((l >>> 6)) & 63))), g.charCodeAt(((l & 63))));\n    };\n;\n    var i = ((((\"\\u003E___?456789:;\\u003C=_______\" + \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\u0009\\u000a\\u000b\\u000c\\u000d\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\")) + \"______\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123\"));\n    function j(l) {\n        l = ((((((((i.charCodeAt(((l.charCodeAt(0) - 43))) << 18)) | ((i.charCodeAt(((l.charCodeAt(1) - 43))) << 12)))) | ((i.charCodeAt(((l.charCodeAt(2) - 43))) << 6)))) | i.charCodeAt(((l.charCodeAt(3) - 43)))));\n        return String.fromCharCode(((l >>> 16)), ((((l >>> 8)) & 255)), ((l & 255)));\n    };\n;\n    var k = {\n        encode: function(l) {\n            l = unescape(encodeURI(l));\n            var m = ((((l.length + 2)) % 3));\n            l = ((l + \"\\u0000\\u0000\".slice(m))).replace(/[\\s\\S]{3}/g, h);\n            return ((l.slice(0, ((((l.length + m)) - 2))) + \"==\".slice(m)));\n        },\n        decode: function(l) {\n            l = l.replace(/[^A-Za-z0-9+\\/]/g, \"\");\n            var m = ((((l.length + 3)) & 3));\n            l = ((l + \"AAA\".slice(m))).replace(/..../g, j);\n            l = l.slice(0, ((((l.length + m)) - 3)));\n            try {\n                return decodeURIComponent(escape(l));\n            } catch (n) {\n                throw new Error(\"Not valid UTF-8\");\n            };\n        ;\n        },\n        encodeObject: function(l) {\n            return k.encode(JSON.stringify(l));\n        },\n        decodeObject: function(l) {\n            return JSON.parse(k.decode(l));\n        },\n        encodeNums: function(l) {\n            return String.fromCharCode.apply(String, l.map(function(m) {\n                return g.charCodeAt(((((((m | -((m > 63)))) & -((m > 0)))) & 63)));\n            }));\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:base64\", [\"Base64\",], function(a, b, c, d) {\n    a.Base64 = b(\"Base64\");\n}, 3);\n__d(\"legacy:css\", [\"CSS\",], function(a, b, c, d) {\n    a.CSS = b(\"CSS\");\n}, 3);\n__d(\"legacy:dom\", [\"DOM\",], function(a, b, c, d) {\n    a.DOM = b(\"DOM\");\n}, 3);\n__d(\"FBDesktopDetect\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = \"facebook.desktopplugin\", i = {\n        mimeType: \"application/x-facebook-desktop-1\",\n        isPluginInstalled: function() {\n            if (g.osx()) {\n                return false;\n            }\n        ;\n        ;\n            var j = null;\n            if (a.ActiveXObject) {\n                try {\n                    j = new a.ActiveXObject(h);\n                    if (j) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (k) {\n                \n                };\n            ;\n            }\n             else if (((a.JSBNG__navigator && a.JSBNG__navigator.plugins))) {\n                a.JSBNG__navigator.plugins.refresh(false);\n                for (var l = 0, m = a.JSBNG__navigator.plugins.length; ((l < m)); l++) {\n                    j = a.JSBNG__navigator.plugins[l];\n                    if (((j.length && ((j[0].type === this.mimeType))))) {\n                        return true;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n            \n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"NavigationMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        NAVIGATION_BEGIN: \"NavigationMessage/navigationBegin\",\n        NAVIGATION_SELECT: \"NavigationMessage/navigationSelect\",\n        NAVIGATION_FIRST_RESPONSE: \"NavigationMessage/navigationFirstResponse\",\n        NAVIGATION_COMPLETED: \"NavigationMessage/navigationCompleted\",\n        NAVIGATION_FAILED: \"NavigationMessage/navigationFailed\",\n        NAVIGATION_COUNT_UPDATE: \"NavigationMessage/navigationCount\",\n        NAVIGATION_FAVORITE_UPDATE: \"NavigationMessage/navigationFavoriteUpdate\",\n        NAVIGATION_ITEM_REMOVED: \"NavigationMessage/navigationItemRemoved\",\n        NAVIGATION_ITEM_HIDDEN: \"NavigationMessage/navigationItemHidden\",\n        INTERNAL_LOADING_BEGIN: \"NavigationMessage/internalLoadingBegin\",\n        INTERNAL_LOADING_COMPLETED: \"NavigationMessage/internalLoadingCompleted\"\n    };\n    e.exports = g;\n});\n__d(\"SimpleDrag\", [\"JSBNG__Event\",\"ArbiterMixin\",\"UserAgent\",\"Vector\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"UserAgent\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this.minDragDistance = 0;\n        g.listen(n, \"mousedown\", this._start.bind(this));\n    };\n;\n    k(m.prototype, h, {\n        setMinDragDistance: function(n) {\n            this.minDragDistance = n;\n        },\n        _start: function(JSBNG__event) {\n            var n = false, o = true, p = null;\n            if (this.inform(\"mousedown\", JSBNG__event)) {\n                o = false;\n            }\n        ;\n        ;\n            if (this.minDragDistance) {\n                p = j.getEventPosition(JSBNG__event);\n            }\n             else {\n                n = true;\n                var q = this.inform(\"start\", JSBNG__event);\n                if (((q === true))) {\n                    o = false;\n                }\n                 else if (((q === false))) {\n                    n = false;\n                    return;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            var r = ((((i.ie() < 9)) ? JSBNG__document.documentElement : window)), s = g.listen(r, {\n                selectstart: ((o ? g.prevent : l)),\n                mousemove: function(JSBNG__event) {\n                    if (!n) {\n                        var t = j.getEventPosition(JSBNG__event);\n                        if (((p.distanceTo(t) < this.minDragDistance))) {\n                            return;\n                        }\n                    ;\n                    ;\n                        n = true;\n                        if (((this.inform(\"start\", JSBNG__event) === false))) {\n                            n = false;\n                            return;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    this.inform(\"update\", JSBNG__event);\n                }.bind(this),\n                mouseup: function(JSBNG__event) {\n                    {\n                        var fin104keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin104i = (0);\n                        var t;\n                        for (; (fin104i < fin104keys.length); (fin104i++)) {\n                            ((t) = (fin104keys[fin104i]));\n                            {\n                                s[t].remove();\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (n) {\n                        this.inform(\"end\", JSBNG__event);\n                    }\n                     else this.inform(\"click\", JSBNG__event);\n                ;\n                ;\n                }.bind(this)\n            });\n            ((o && JSBNG__event.prevent()));\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:async-signal\", [\"AsyncSignal\",], function(a, b, c, d) {\n    a.AsyncSignal = b(\"AsyncSignal\");\n}, 3);\n__d(\"FlipDirectionOnKeypress\", [\"JSBNG__Event\",\"DOM\",\"Input\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Input\"), j = b(\"Style\");\n    function k(JSBNG__event) {\n        var l = JSBNG__event.getTarget(), m = ((h.isNodeOfType(l, \"input\") && ((l.type == \"text\")))), n = h.isNodeOfType(l, \"textarea\");\n        if (((!((m || n)) || l.getAttribute(\"data-prevent-auto-flip\")))) {\n            return;\n        }\n    ;\n    ;\n        var o = i.getValue(l), p = ((l.style && l.style.direction));\n        if (!p) {\n            var q = 0, r = true;\n            for (var s = 0; ((s < o.length)); s++) {\n                var t = o.charCodeAt(s);\n                if (((t >= 48))) {\n                    if (r) {\n                        r = false;\n                        q++;\n                    }\n                ;\n                ;\n                    if (((((t >= 1470)) && ((t <= 1920))))) {\n                        j.set(l, \"direction\", \"rtl\");\n                        return;\n                    }\n                ;\n                ;\n                    if (((q == 5))) {\n                        j.set(l, \"direction\", \"ltr\");\n                        return;\n                    }\n                ;\n                ;\n                }\n                 else r = true;\n            ;\n            ;\n            };\n        ;\n        }\n         else if (((o.length === 0))) {\n            j.set(l, \"direction\", \"\");\n        }\n        \n    ;\n    ;\n    };\n;\n    g.listen(JSBNG__document.documentElement, {\n        keyup: k,\n        input: k\n    });\n});\n__d(\"PlaceholderOnsubmitFormListener\", [\"JSBNG__Event\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Input\");\n    g.listen(JSBNG__document.documentElement, \"submit\", function(i) {\n        var j = i.getTarget().getElementsByTagName(\"*\");\n        for (var k = 0; ((k < j.length)); k++) {\n            if (((j[k].getAttribute(\"placeholder\") && h.isEmpty(j[k])))) {\n                h.setValue(j[k], \"\");\n            }\n        ;\n        ;\n        };\n    ;\n    });\n});\n__d(\"ARIA\", [\"DOM\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"emptyFunction\"), i = b(\"ge\"), j, k, l = function() {\n        j = i(\"ariaAssertiveAlert\");\n        if (!j) {\n            j = g.create(\"div\", {\n                id: \"ariaAssertiveAlert\",\n                className: \"accessible_elem\",\n                \"aria-live\": \"assertive\"\n            });\n            g.appendContent(JSBNG__document.body, j);\n        }\n    ;\n    ;\n        k = i(\"ariaPoliteAlert\");\n        if (!k) {\n            k = j.cloneNode(false);\n            k.setAttribute(\"id\", \"ariaPoliteAlert\");\n            k.setAttribute(\"aria-live\", \"polite\");\n            g.appendContent(JSBNG__document.body, k);\n        }\n    ;\n    ;\n        l = h;\n    };\n    function m(o, p) {\n        l();\n        var q = ((p ? j : k));\n        g.setContent(q, o);\n    };\n;\n    var n = {\n        owns: function(o, p) {\n            o.setAttribute(\"aria-owns\", g.getID(p));\n        },\n        setPopup: function(o, p) {\n            var q = g.getID(p);\n            o.setAttribute(\"aria-owns\", q);\n            o.setAttribute(\"aria-haspopup\", \"true\");\n            if (((o.tabIndex == -1))) {\n                o.tabIndex = 0;\n            }\n        ;\n        ;\n        },\n        announce: function(o) {\n            m(o, true);\n        },\n        notify: function(o) {\n            m(o);\n        }\n    };\n    e.exports = n;\n});\n__d(\"ScriptPathState\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h, i, j, k, l = 100, m = {\n        setIsUIPageletRequest: function(n) {\n            j = n;\n        },\n        setUserURISampleRate: function(n) {\n            k = n;\n        },\n        reset: function() {\n            h = null;\n            i = false;\n            j = false;\n        },\n        _shouldUpdateScriptPath: function() {\n            return ((i && !j));\n        },\n        _shouldSendURI: function() {\n            return ((Math.JSBNG__random() < k));\n        },\n        getParams: function() {\n            var n = {\n            };\n            if (m._shouldUpdateScriptPath()) {\n                if (((m._shouldSendURI() && ((h !== null))))) {\n                    n.user_uri = h.substring(0, l);\n                }\n            ;\n            ;\n            }\n             else n.no_script_path = 1;\n        ;\n        ;\n            return n;\n        }\n    };\n    g.subscribe(\"pre_page_transition\", function(n, o) {\n        i = true;\n        h = o.to.getUnqualifiedURI().toString();\n    });\n    e.exports = a.ScriptPathState = m;\n});\n__d(\"goOrReplace\", [\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"UserAgent\");\n    function i(j, k, l) {\n        var m = new g(k), n = a.Quickling;\n        if (((((((((((j.pathname == \"/\")) && ((m.getPath() != \"/\")))) && n)) && n.isActive())) && n.isPageActive(m)))) {\n            var o = ((j.search ? {\n            } : {\n                q: \"\"\n            }));\n            m = new g().setPath(\"/\").setQueryData(o).setFragment(m.getUnqualifiedURI().toString());\n            k = m.toString();\n        }\n    ;\n    ;\n        if (((l && !((h.ie() < 8))))) {\n            j.replace(k);\n        }\n         else if (((j.href == k))) {\n            j.reload();\n        }\n         else j.href = k;\n        \n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"AjaxPipeRequest\", [\"Arbiter\",\"AsyncRequest\",\"BigPipe\",\"CSS\",\"DOM\",\"Env\",\"PageletSet\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"goOrReplace\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BigPipe\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"PageletSet\"), n = b(\"ScriptPathState\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"goOrReplace\"), r = b(\"ge\"), s;\n    function t(w, x) {\n        var y = r(w);\n        if (!y) {\n            return;\n        }\n    ;\n    ;\n        if (!x) {\n            y.style.minHeight = \"600px\";\n        }\n    ;\n    ;\n        var z = m.getPageletIDs();\n        for (var aa = 0; ((aa < z.length)); aa++) {\n            var ba = z[aa];\n            if (k.contains(y, ba)) {\n                m.removePagelet(ba);\n            }\n        ;\n        ;\n        };\n    ;\n        k.empty(y);\n    };\n;\n    function u(w, x) {\n        var y = r(w);\n        if (((y && !x))) {\n            y.style.minHeight = \"100px\";\n        }\n    ;\n    ;\n    };\n;\n    function v(w, x) {\n        this._uri = w;\n        this._query_data = x;\n        this._request = new h();\n        this._canvas_id = null;\n        this._allow_cross_page_transition = true;\n    };\n;\n    p(v.prototype, {\n        setCanvasId: function(w) {\n            this._canvas_id = w;\n            return this;\n        },\n        setURI: function(w) {\n            this._uri = w;\n            return this;\n        },\n        setData: function(w) {\n            this._query_data = w;\n            return this;\n        },\n        getData: function(w) {\n            return this._query_data;\n        },\n        setAllowCrossPageTransition: function(w) {\n            this._allow_cross_page_transition = w;\n            return this;\n        },\n        setAppend: function(w) {\n            this._append = w;\n            return this;\n        },\n        send: function() {\n            var w = {\n                ajaxpipe: 1,\n                ajaxpipe_token: l.ajaxpipe_token\n            };\n            p(w, n.getParams());\n            n.reset();\n            this._request.setOption(\"useIframeTransport\", true).setURI(this._uri).setData(p(w, this._query_data)).setPreBootloadHandler(this._preBootloadHandler.bind(this)).setInitialHandler(this._onInitialResponse.bind(this)).setHandler(this._onResponse.bind(this)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._allow_cross_page_transition);\n            if (this._automatic) {\n                this._relevantRequest = s;\n            }\n             else s = this._request;\n        ;\n        ;\n            this._request.send();\n            return this;\n        },\n        _preBootloadFirstResponse: function(w) {\n            return false;\n        },\n        _fireDomContentCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/domcontent_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _fireOnloadCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/onload_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _isRelevant: function(w) {\n            return ((((((this._request == s)) || ((this._automatic && ((this._relevantRequest == s)))))) || this._jsNonBlock));\n        },\n        _preBootloadHandler: function(w) {\n            var x = w.getPayload();\n            if (((((!x || x.redirect)) || !this._isRelevant(w)))) {\n                return false;\n            }\n        ;\n        ;\n            var y = false;\n            if (w.is_first) {\n                ((((!this._append && !this._displayCallback)) && t(this._canvas_id, this._constHeight)));\n                this._arbiter = new g();\n                y = this._preBootloadFirstResponse(w);\n                this.pipe = new i({\n                    arbiter: this._arbiter,\n                    rootNodeID: this._canvas_id,\n                    lid: this._request.lid,\n                    isAjax: true,\n                    domContentCallback: this._fireDomContentCallback.bind(this),\n                    onloadCallback: this._fireOnloadCallback.bind(this),\n                    domContentEvt: \"ajaxpipe/domcontent_callback\",\n                    onloadEvt: \"ajaxpipe/onload_callback\",\n                    jsNonBlock: this._jsNonBlock,\n                    automatic: this._automatic,\n                    displayCallback: this._displayCallback\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        _redirect: function(w) {\n            if (w.redirect) {\n                if (((w.force || !this.isPageActive(w.redirect)))) {\n                    var x = [\"ajaxpipe\",\"ajaxpipe_token\",].concat(this.getSanitizedParameters());\n                    q(window.JSBNG__location, o(w.redirect).removeQueryData(x), true);\n                }\n                 else {\n                    var y = a.PageTransitions;\n                    y.go(w.redirect, true);\n                }\n            ;\n            ;\n                return true;\n            }\n             else return false\n        ;\n        },\n        isPageActive: function(w) {\n            return true;\n        },\n        getSanitizedParameters: function() {\n            return [];\n        },\n        _versionCheck: function(w) {\n            return true;\n        },\n        _onInitialResponse: function(w) {\n            var x = w.getPayload();\n            if (!this._isRelevant(w)) {\n                return false;\n            }\n        ;\n        ;\n            if (!x) {\n                return true;\n            }\n        ;\n        ;\n            if (((this._redirect(x) || !this._versionCheck(x)))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        _processFirstResponse: function(w) {\n            var x = w.getPayload();\n            if (((r(this._canvas_id) && ((x.canvas_class != null))))) {\n                j.setClass(this._canvas_id, x.canvas_class);\n            }\n        ;\n        ;\n        },\n        setFirstResponseCallback: function(w) {\n            this._firstResponseCallback = w;\n            return this;\n        },\n        setFirstResponseHandler: function(w) {\n            this._processFirstResponse = w;\n            return this;\n        },\n        _onResponse: function(w) {\n            var x = w.payload;\n            if (!this._isRelevant(w)) {\n                return h.suppressOnloadToken;\n            }\n        ;\n        ;\n            if (w.is_first) {\n                this._processFirstResponse(w);\n                ((this._firstResponseCallback && this._firstResponseCallback()));\n                x.provides = ((x.provides || []));\n                x.provides.push(\"uipage_onload\");\n                if (this._append) {\n                    x.append = this._canvas_id;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (x) {\n                if (((((((\"JSBNG__content\" in x.JSBNG__content)) && ((this._canvas_id !== null)))) && ((this._canvas_id != \"JSBNG__content\"))))) {\n                    x.JSBNG__content[this._canvas_id] = x.JSBNG__content.JSBNG__content;\n                    delete x.JSBNG__content.JSBNG__content;\n                }\n            ;\n            ;\n                this.pipe.onPageletArrive(x);\n            }\n        ;\n        ;\n            if (w.is_last) {\n                u(this._canvas_id, this._constHeight);\n            }\n        ;\n        ;\n            return h.suppressOnloadToken;\n        },\n        setNectarModuleDataSafe: function(w) {\n            this._request.setNectarModuleDataSafe(w);\n            return this;\n        },\n        setFinallyHandler: function(w) {\n            this._request.setFinallyHandler(w);\n            return this;\n        },\n        setErrorHandler: function(w) {\n            this._request.setErrorHandler(w);\n            return this;\n        },\n        abort: function() {\n            this._request.abort();\n            if (((s == this._request))) {\n                s = null;\n            }\n        ;\n        ;\n            this._request = null;\n            return this;\n        },\n        setJSNonBlock: function(w) {\n            this._jsNonBlock = w;\n            return this;\n        },\n        setAutomatic: function(w) {\n            this._automatic = w;\n            return this;\n        },\n        setDisplayCallback: function(w) {\n            this._displayCallback = w;\n            return this;\n        },\n        setConstHeight: function(w) {\n            this._constHeight = w;\n            return this;\n        },\n        getAsyncRequest: function() {\n            return this._request;\n        }\n    });\n    p(v, {\n        getCurrentRequest: function() {\n            return s;\n        },\n        setCurrentRequest: function(w) {\n            s = w;\n        }\n    });\n    e.exports = v;\n});\n__d(\"AsyncRequestNectarLogging\", [\"AsyncRequest\",\"Nectar\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Nectar\"), i = b(\"copyProperties\");\n    i(g.prototype, {\n        setNectarModuleData: function(j) {\n            if (((this.method == \"POST\"))) {\n                h.addModuleData(this.data, j);\n            }\n        ;\n        ;\n        },\n        setNectarImpressionId: function() {\n            if (((this.method == \"POST\"))) {\n                h.addImpressionID(this.data);\n            }\n        ;\n        ;\n        }\n    });\n});\n__d(\"CSSClassTransition\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = [];\n    function i() {\n    \n    };\n;\n    g(i, {\n        go: function(j, k, l, m) {\n            var n;\n            for (var o = 0; ((o < h.length)); o++) {\n                if (((h[o](j, k, l, m) === true))) {\n                    n = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!n) {\n                j.className = k;\n            }\n        ;\n        ;\n        },\n        registerHandler: function(j) {\n            h.push(j);\n            return {\n                remove: function() {\n                    var k = h.indexOf(j);\n                    if (((k >= 0))) {\n                        h.splice(k, 1);\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"DOMScroll\", [\"Animation\",\"Arbiter\",\"DOM\",\"DOMQuery\",\"Vector\",\"ViewportBounds\",\"ge\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Vector\"), l = b(\"ViewportBounds\"), m = b(\"ge\"), n = b(\"isAsyncScrollQuery\"), o = {\n        SCROLL: \"dom-scroll\",\n        getScrollState: function() {\n            var p = k.getViewportDimensions(), q = k.getDocumentDimensions(), r = ((q.x > p.x)), s = ((q.y > p.y));\n            r += 0;\n            s += 0;\n            return new k(r, s);\n        },\n        _scrollbarSize: null,\n        _initScrollbarSize: function() {\n            var p = i.create(\"p\");\n            p.style.width = \"100%\";\n            p.style.height = \"200px\";\n            var q = i.create(\"div\");\n            q.style.position = \"absolute\";\n            q.style.JSBNG__top = \"0px\";\n            q.style.left = \"0px\";\n            q.style.visibility = \"hidden\";\n            q.style.width = \"200px\";\n            q.style.height = \"150px\";\n            q.style.overflow = \"hidden\";\n            q.appendChild(p);\n            JSBNG__document.body.appendChild(q);\n            var r = p.offsetWidth;\n            q.style.overflow = \"JSBNG__scroll\";\n            var s = p.offsetWidth;\n            if (((r == s))) {\n                s = q.clientWidth;\n            }\n        ;\n        ;\n            JSBNG__document.body.removeChild(q);\n            o._scrollbarSize = ((r - s));\n        },\n        getScrollbarSize: function() {\n            if (((o._scrollbarSize === null))) {\n                o._initScrollbarSize();\n            }\n        ;\n        ;\n            return o._scrollbarSize;\n        },\n        JSBNG__scrollTo: function(p, q, r, s, t) {\n            if (((((typeof q == \"undefined\")) || ((q === true))))) {\n                q = 750;\n            }\n        ;\n        ;\n            if (n()) {\n                q = false;\n            }\n        ;\n        ;\n            if (!((p instanceof k))) {\n                var u = k.getScrollPosition().x, v = k.getElementPosition(m(p)).y;\n                p = new k(u, v, \"JSBNG__document\");\n                if (!s) {\n                    p.y -= ((l.getTop() / ((r ? 2 : 1))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (r) {\n                p.y -= ((k.getViewportDimensions().y / 2));\n            }\n             else if (s) {\n                p.y -= k.getViewportDimensions().y;\n                p.y += s;\n            }\n            \n        ;\n        ;\n            p = p.convertTo(\"JSBNG__document\");\n            if (q) {\n                return new g(JSBNG__document.body).to(\"scrollTop\", p.y).to(\"scrollLeft\", p.x).ease(g.ease.end).duration(q).ondone(t).go();\n            }\n             else if (window.JSBNG__scrollTo) {\n                window.JSBNG__scrollTo(p.x, p.y);\n                ((t && t()));\n            }\n            \n        ;\n        ;\n            h.inform(o.SCROLL);\n        },\n        ensureVisible: function(p, q, r, s, t) {\n            if (((r === undefined))) {\n                r = 10;\n            }\n        ;\n        ;\n            p = m(p);\n            if (q) {\n                p = j.JSBNG__find(p, q);\n            }\n        ;\n        ;\n            var u = k.getScrollPosition().x, v = k.getScrollPosition().y, w = ((v + k.getViewportDimensions().y)), x = k.getElementPosition(p).y, y = ((x + k.getElementDimensions(p).y));\n            x -= l.getTop();\n            x -= r;\n            y += r;\n            if (((x < v))) {\n                o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n            }\n             else if (((y > w))) {\n                if (((((x - ((y - w)))) < v))) {\n                    o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n                }\n                 else o.JSBNG__scrollTo(new k(u, y, \"JSBNG__document\"), s, false, true, t);\n            ;\n            }\n            \n        ;\n        ;\n        },\n        scrollToTop: function(p) {\n            var q = k.getScrollPosition();\n            o.JSBNG__scrollTo(new k(q.x, 0, \"JSBNG__document\"), ((p !== false)));\n        }\n    };\n    e.exports = o;\n});\n__d(\"Button\", [\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Parent\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = \"uiButtonDisabled\", o = \"uiButtonDepressed\", p = \"-cx-PUBLIC-abstractButton__disabled\", q = \"-cx-PUBLIC-abstractButton__depressed\", r = \"button:blocker\", s = \"href\", t = \"ajaxify\";\n    function u(aa, ba) {\n        var ca = h.get(aa, r);\n        if (ba) {\n            if (ca) {\n                ca.remove();\n                h.remove(aa, r);\n            }\n        ;\n        ;\n        }\n         else if (!ca) {\n            h.set(aa, r, j.listen(aa, \"click\", m.thatReturnsFalse, j.Priority.URGENT));\n        }\n        \n    ;\n    ;\n    };\n;\n    function v(aa) {\n        var ba = ((k.byClass(aa, \"uiButton\") || k.byClass(aa, \"-cx-PRIVATE-abstractButton__root\")));\n        if (!ba) {\n            throw new Error(\"invalid use case\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function w(aa) {\n        return i.isNodeOfType(aa, \"a\");\n    };\n;\n    function x(aa) {\n        return i.isNodeOfType(aa, \"button\");\n    };\n;\n    function y(aa) {\n        return g.hasClass(aa, \"-cx-PRIVATE-abstractButton__root\");\n    };\n;\n    var z = {\n        getInputElement: function(aa) {\n            aa = v(aa);\n            if (w(aa)) {\n                throw new Error(\"invalid use case\");\n            }\n        ;\n        ;\n            return ((x(aa) ? aa : i.JSBNG__find(aa, \"input\")));\n        },\n        isEnabled: function(aa) {\n            return !((g.hasClass(v(aa), n) || g.hasClass(v(aa), p)));\n        },\n        setEnabled: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? p : n));\n            g.conditionClass(aa, ca, !ba);\n            if (w(aa)) {\n                var da = aa.getAttribute(\"href\"), ea = aa.getAttribute(\"ajaxify\"), fa = h.get(aa, s, \"#\"), ga = h.get(aa, t);\n                if (ba) {\n                    if (!da) {\n                        aa.setAttribute(\"href\", fa);\n                    }\n                ;\n                ;\n                    if (((!ea && ga))) {\n                        aa.setAttribute(\"ajaxify\", ga);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"tabIndex\");\n                }\n                 else {\n                    if (((da && ((da !== fa))))) {\n                        h.set(aa, s, da);\n                    }\n                ;\n                ;\n                    if (((ea && ((ea !== ga))))) {\n                        h.set(aa, t, ea);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"href\");\n                    aa.removeAttribute(\"ajaxify\");\n                    aa.setAttribute(\"tabIndex\", \"-1\");\n                }\n            ;\n            ;\n                u(aa, ba);\n            }\n             else {\n                var ha = z.getInputElement(aa);\n                ha.disabled = !ba;\n                u(ha, ba);\n            }\n        ;\n        ;\n        },\n        setDepressed: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? q : o));\n            g.conditionClass(aa, ca, ba);\n        },\n        isDepressed: function(aa) {\n            aa = v(aa);\n            var ba = ((y(aa) ? q : o));\n            return g.hasClass(aa, ba);\n        },\n        setLabel: function(aa, ba) {\n            aa = v(aa);\n            if (y(aa)) {\n                var ca = [];\n                if (ba) {\n                    ca.push(ba);\n                }\n            ;\n            ;\n                var da = i.scry(aa, \".img\")[0];\n                if (da) {\n                    if (((aa.firstChild == da))) {\n                        ca.unshift(da);\n                    }\n                     else ca.push(da);\n                ;\n                }\n            ;\n            ;\n                i.setContent(aa, ca);\n            }\n             else if (w(aa)) {\n                var ea = i.JSBNG__find(aa, \"span.uiButtonText\");\n                i.setContent(ea, ba);\n            }\n             else z.getInputElement(aa).value = ba;\n            \n        ;\n        ;\n            var fa = ((y(aa) ? \"-cx-PUBLIC-abstractButton__notext\" : \"uiButtonNoText\"));\n            g.conditionClass(aa, fa, !ba);\n        },\n        setIcon: function(aa, ba) {\n            if (((ba && !i.isNode(ba)))) {\n                return;\n            }\n        ;\n        ;\n            aa = v(aa);\n            var ca = i.scry(aa, \".img\")[0];\n            if (!ba) {\n                ((ca && i.remove(ca)));\n                return;\n            }\n        ;\n        ;\n            g.addClass(ba, \"customimg\");\n            if (((ca != ba))) {\n                if (ca) {\n                    i.replace(ca, ba);\n                }\n                 else i.prependContent(aa, ba);\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = z;\n});\n__d(\"Form\", [\"JSBNG__Event\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"DataStore\",\"Env\",\"Input\",\"Parent\",\"URI\",\"createArrayFrom\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMPosition\"), m = b(\"DOMQuery\"), n = b(\"DataStore\"), o = b(\"Env\"), p = b(\"Input\"), q = b(\"Parent\"), r = b(\"URI\"), s = b(\"createArrayFrom\"), t = b(\"trackReferrer\"), u = ((\"JSBNG__FileList\" in window)), v = ((\"JSBNG__FormData\" in window));\n    function w(y) {\n        var z = {\n        };\n        r.implodeQuery(y).split(\"&\").forEach(function(aa) {\n            if (aa) {\n                var ba = /^([^=]*)(?:=(.*))?$/.exec(aa), ca = r.decodeComponent(ba[1]), da = ((ba[2] ? r.decodeComponent(ba[2]) : null));\n                z[ca] = da;\n            }\n        ;\n        ;\n        });\n        return z;\n    };\n;\n    var x = {\n        getInputs: function(y) {\n            y = ((y || JSBNG__document));\n            return [].concat(s(m.scry(y, \"input\")), s(m.scry(y, \"select\")), s(m.scry(y, \"textarea\")), s(m.scry(y, \"button\")));\n        },\n        getInputsByName: function(y) {\n            var z = {\n            };\n            x.getInputs(y).forEach(function(aa) {\n                var ba = z[aa.JSBNG__name];\n                z[aa.JSBNG__name] = ((((typeof ba === \"undefined\")) ? aa : [aa,].concat(ba)));\n            });\n            return z;\n        },\n        getSelectValue: function(y) {\n            return y.options[y.selectedIndex].value;\n        },\n        setSelectValue: function(y, z) {\n            for (var aa = 0; ((aa < y.options.length)); ++aa) {\n                if (((y.options[aa].value == z))) {\n                    y.selectedIndex = aa;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        getRadioValue: function(y) {\n            for (var z = 0; ((z < y.length)); z++) {\n                if (y[z].checked) {\n                    return y[z].value;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getElements: function(y) {\n            return s(((((y.tagName == \"FORM\")) ? y.elements : x.getInputs(y))));\n        },\n        getAttribute: function(y, z) {\n            return ((((y.getAttributeNode(z) || {\n            })).value || null));\n        },\n        setDisabled: function(y, z) {\n            x.getElements(y).forEach(function(aa) {\n                if (((aa.disabled !== undefined))) {\n                    var ba = n.get(aa, \"origDisabledState\");\n                    if (z) {\n                        if (((ba === undefined))) {\n                            n.set(aa, \"origDisabledState\", aa.disabled);\n                        }\n                    ;\n                    ;\n                        aa.disabled = z;\n                    }\n                     else if (((ba !== true))) {\n                        aa.disabled = false;\n                    }\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        bootstrap: function(y, z) {\n            var aa = ((x.getAttribute(y, \"method\") || \"GET\")).toUpperCase();\n            z = ((q.byTag(z, \"button\") || z));\n            var ba = ((q.byClass(z, \"stat_elem\") || y));\n            if (j.hasClass(ba, \"async_saving\")) {\n                return;\n            }\n        ;\n        ;\n            if (((z && ((((((z.form !== y)) || ((((z.nodeName != \"INPUT\")) && ((z.nodeName != \"BUTTON\")))))) || ((z.type != \"submit\"))))))) {\n                var ca = m.scry(y, \".enter_submit_target\")[0];\n                ((ca && (z = ca)));\n            }\n        ;\n        ;\n            var da = x.serialize(y, z);\n            x.setDisabled(y, true);\n            var ea = ((x.getAttribute(y, \"ajaxify\") || x.getAttribute(y, \"action\")));\n            t(y, ea);\n            var fa = new h(ea);\n            fa.setData(da).setNectarModuleDataSafe(y).setReadOnly(((aa == \"GET\"))).setMethod(aa).setRelativeTo(y).setStatusElement(ba).setInitialHandler(x.setDisabled.curry(y, false)).setHandler(function(ga) {\n                g.fire(y, \"success\", {\n                    response: ga\n                });\n            }).setErrorHandler(function(ga) {\n                if (((g.fire(y, \"error\", {\n                    response: ga\n                }) !== false))) {\n                    i.defaultErrorHandler(ga);\n                }\n            ;\n            ;\n            }).setFinallyHandler(x.setDisabled.curry(y, false)).send();\n        },\n        forEachValue: function(y, z, aa) {\n            x.getElements(y).forEach(function(ba) {\n                if (((((ba.JSBNG__name && !ba.disabled)) && ((ba.type !== \"submit\"))))) {\n                    if (((((((((((!ba.type || ((((((ba.type === \"radio\")) || ((ba.type === \"checkbox\")))) && ba.checked)))) || ((ba.type === \"text\")))) || ((ba.type === \"password\")))) || ((ba.type === \"hidden\")))) || ((ba.nodeName === \"TEXTAREA\"))))) {\n                        aa(ba.type, ba.JSBNG__name, p.getValue(ba));\n                    }\n                     else if (((ba.nodeName === \"SELECT\"))) {\n                        for (var ca = 0, da = ba.options.length; ((ca < da)); ca++) {\n                            var ea = ba.options[ca];\n                            if (ea.selected) {\n                                aa(\"select\", ba.JSBNG__name, ea.value);\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else if (((u && ((ba.type === \"file\"))))) {\n                        var fa = ba.files;\n                        for (var ga = 0; ((ga < fa.length)); ga++) {\n                            aa(\"file\", ba.JSBNG__name, fa.item(ga));\n                        ;\n                        };\n                    ;\n                    }\n                    \n                    \n                ;\n                }\n            ;\n            ;\n            });\n            if (((((((((z && z.JSBNG__name)) && ((z.type === \"submit\")))) && m.contains(y, z))) && m.isNodeOfType(z, [\"input\",\"button\",])))) {\n                aa(\"submit\", z.JSBNG__name, z.value);\n            }\n        ;\n        ;\n        },\n        createFormData: function(y, z) {\n            if (!v) {\n                return null;\n            }\n        ;\n        ;\n            var aa = new JSBNG__FormData();\n            if (y) {\n                if (m.isNode(y)) {\n                    x.forEachValue(y, z, function(da, ea, fa) {\n                        aa.append(ea, fa);\n                    });\n                }\n                 else {\n                    var ba = w(y);\n                    {\n                        var fin105keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin105i = (0);\n                        var ca;\n                        for (; (fin105i < fin105keys.length); (fin105i++)) {\n                            ((ca) = (fin105keys[fin105i]));\n                            {\n                                aa.append(ca, ba[ca]);\n                            ;\n                            };\n                        };\n                    };\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return aa;\n        },\n        serialize: function(y, z) {\n            var aa = {\n            };\n            x.forEachValue(y, z, function(ba, ca, da) {\n                if (((ba === \"file\"))) {\n                    return;\n                }\n            ;\n            ;\n                x._serializeHelper(aa, ca, da);\n            });\n            return x._serializeFix(aa);\n        },\n        _serializeHelper: function(y, z, aa) {\n            var ba = Object.prototype.hasOwnProperty, ca = /([^\\]]+)\\[([^\\]]*)\\](.*)/.exec(z);\n            if (ca) {\n                if (((!y[ca[1]] || !ba.call(y, ca[1])))) {\n                    var da;\n                    y[ca[1]] = da = {\n                    };\n                    if (((y[ca[1]] !== da))) {\n                        return;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var ea = 0;\n                if (((ca[2] === \"\"))) {\n                    while (((y[ca[1]][ea] !== undefined))) {\n                        ea++;\n                    ;\n                    };\n                ;\n                }\n                 else ea = ca[2];\n            ;\n            ;\n                if (((ca[3] === \"\"))) {\n                    y[ca[1]][ea] = aa;\n                }\n                 else x._serializeHelper(y[ca[1]], ea.concat(ca[3]), aa);\n            ;\n            ;\n            }\n             else y[z] = aa;\n        ;\n        ;\n        },\n        _serializeFix: function(y) {\n            {\n                var fin106keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin106i = (0);\n                var z;\n                for (; (fin106i < fin106keys.length); (fin106i++)) {\n                    ((z) = (fin106keys[fin106i]));\n                    {\n                        if (((y[z] instanceof Object))) {\n                            y[z] = x._serializeFix(y[z]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var aa = Object.keys(y);\n            if (((((aa.length === 0)) || aa.some(isNaN)))) {\n                return y;\n            }\n        ;\n        ;\n            aa.sort(function(da, ea) {\n                return ((da - ea));\n            });\n            var ba = 0, ca = aa.every(function(da) {\n                return ((+da === ba++));\n            });\n            if (ca) {\n                return aa.map(function(da) {\n                    return y[da];\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        post: function(y, z, aa) {\n            var ba = JSBNG__document.createElement(\"form\");\n            ba.action = y.toString();\n            ba.method = \"POST\";\n            ba.style.display = \"none\";\n            if (aa) {\n                ba.target = aa;\n            }\n        ;\n        ;\n            z.fb_dtsg = o.fb_dtsg;\n            x.createHiddenInputs(z, ba);\n            m.getRootElement().appendChild(ba);\n            ba.submit();\n            return false;\n        },\n        createHiddenInputs: function(y, z, aa, ba) {\n            aa = ((aa || {\n            }));\n            var ca = w(y);\n            {\n                var fin107keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin107i = (0);\n                var da;\n                for (; (fin107i < fin107keys.length); (fin107i++)) {\n                    ((da) = (fin107keys[fin107i]));\n                    {\n                        if (((ca[da] === null))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((aa[da] && ba))) {\n                            aa[da].value = ca[da];\n                        }\n                         else {\n                            var ea = k.create(\"input\", {\n                                type: \"hidden\",\n                                JSBNG__name: da,\n                                value: ca[da]\n                            });\n                            aa[da] = ea;\n                            z.appendChild(ea);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return aa;\n        },\n        getFirstElement: function(y, z) {\n            z = ((z || [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",\"input[type=\\\"button\\\"]\",\"input[type=\\\"submit\\\"]\",]));\n            var aa = [];\n            for (var ba = 0; ((ba < z.length)); ba++) {\n                aa = m.scry(y, z[ba]);\n                for (var ca = 0; ((ca < aa.length)); ca++) {\n                    var da = aa[ca];\n                    try {\n                        var fa = l.getElementPosition(da);\n                        if (((((fa.y > 0)) && ((fa.x > 0))))) {\n                            return da;\n                        }\n                    ;\n                    ;\n                    } catch (ea) {\n                    \n                    };\n                ;\n                };\n            ;\n            };\n        ;\n            return null;\n        },\n        focusFirst: function(y) {\n            var z = x.getFirstElement(y);\n            if (z) {\n                z.JSBNG__focus();\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = x;\n});\n__d(\"Locale\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h, i = {\n        isRTL: function() {\n            if (((h === undefined))) {\n                h = ((\"rtl\" === g.get(JSBNG__document.body, \"direction\")));\n            }\n        ;\n        ;\n            return h;\n        }\n    };\n    e.exports = i;\n});\n__d(\"getOverlayZIndex\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\");\n    function h(i, j) {\n        j = ((j || JSBNG__document.body));\n        var k = [];\n        while (((i && ((i !== j))))) {\n            k.push(i);\n            i = i.parentNode;\n        };\n    ;\n        if (((i !== j))) {\n            return 0;\n        }\n    ;\n    ;\n        for (var l = ((k.length - 1)); ((l >= 0)); l--) {\n            var m = k[l];\n            if (((g.get(m, \"position\") != \"static\"))) {\n                var n = parseInt(g.get(m, \"z-index\"), 10);\n                if (!isNaN(n)) {\n                    return n;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return 0;\n    };\n;\n    e.exports = h;\n});\n__d(\"Dialog\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Button\",\"ContextualThing\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"Focus\",\"Form\",\"HTML\",\"Keys\",\"Locale\",\"Parent\",\"Run\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"bind\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"getObjectValues\",\"getOverlayZIndex\",\"removeFromArray\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Button\"), l = b(\"ContextualThing\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"JSBNG__Event\"), p = b(\"Focus\"), q = b(\"Form\"), r = b(\"HTML\"), s = b(\"Keys\"), t = b(\"Locale\"), u = b(\"Parent\"), v = b(\"Run\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"UserAgent\"), z = b(\"Vector\"), aa = b(\"bind\"), ba = b(\"copyProperties\"), ca = b(\"createArrayFrom\"), da = b(\"emptyFunction\"), ea = b(\"getObjectValues\"), fa = b(\"getOverlayZIndex\"), ga = b(\"removeFromArray\"), ha = b(\"shield\"), ia = b(\"tx\"), ja = function() {\n        var la = JSBNG__document.body, ma = JSBNG__document.createElement(\"div\"), na = JSBNG__document.createElement(\"div\");\n        la.insertBefore(ma, la.firstChild);\n        la.insertBefore(na, la.firstChild);\n        ma.style.position = \"fixed\";\n        ma.style.JSBNG__top = \"20px\";\n        var oa = ((ma.offsetTop !== na.offsetTop));\n        la.removeChild(ma);\n        la.removeChild(na);\n        ja = da.thatReturns(oa);\n        return oa;\n    };\n    function ka(la) {\n        this._show_loading = true;\n        this._auto_focus = true;\n        this._submit_on_enter = false;\n        this._fade_enabled = true;\n        this._onload_handlers = [];\n        this._top = 125;\n        this._uniqueID = ((\"dialog_\" + ka._globalCount++));\n        this._content = null;\n        this._obj = null;\n        this._popup = null;\n        this._overlay = null;\n        this._shim = null;\n        this._causal_elem = null;\n        this._previous_focus = null;\n        this._buttons = [];\n        this._buildDialog();\n        if (la) {\n            this._setFromModel(la);\n        }\n    ;\n    ;\n        ka._init();\n    };\n;\n    ba(ka, {\n        OK: {\n            JSBNG__name: \"ok\",\n            label: \"Okay\"\n        },\n        CANCEL: {\n            JSBNG__name: \"cancel\",\n            label: \"Cancel\",\n            className: \"inputaux\"\n        },\n        CLOSE: {\n            JSBNG__name: \"close\",\n            label: \"Close\"\n        },\n        NEXT: {\n            JSBNG__name: \"next\",\n            label: \"Next\"\n        },\n        SAVE: {\n            JSBNG__name: \"save\",\n            label: \"Save\"\n        },\n        SUBMIT: {\n            JSBNG__name: \"submit\",\n            label: \"Submit\"\n        },\n        CONFIRM: {\n            JSBNG__name: \"JSBNG__confirm\",\n            label: \"Confirm\"\n        },\n        DELETE: {\n            JSBNG__name: \"delete\",\n            label: \"Delete\"\n        },\n        _globalCount: 0,\n        _bottoms: [0,],\n        max_bottom: 0,\n        _updateMaxBottom: function() {\n            ka.max_bottom = Math.max.apply(Math, ka._bottoms);\n        }\n    });\n    ba(ka, {\n        OK_AND_CANCEL: [ka.OK,ka.CANCEL,],\n        _STANDARD_BUTTONS: [ka.OK,ka.CANCEL,ka.CLOSE,ka.SAVE,ka.SUBMIT,ka.CONFIRM,ka.DELETE,],\n        SIZE: {\n            WIDE: 555,\n            STANDARD: 445\n        },\n        _HALO_WIDTH: 10,\n        _BORDER_WIDTH: 1,\n        _PADDING_WIDTH: 10,\n        _PAGE_MARGIN: 40,\n        _stack: [],\n        _isUsingCSSBorders: function() {\n            return ((y.ie() < 7));\n        },\n        newButton: function(la, ma, na, oa) {\n            var pa = {\n                JSBNG__name: la,\n                label: ma\n            };\n            if (na) {\n                pa.className = na;\n            }\n        ;\n        ;\n            if (oa) {\n                pa.handler = oa;\n            }\n        ;\n        ;\n            return pa;\n        },\n        getCurrent: function() {\n            var la = ka._stack;\n            return ((la.length ? la[((la.length - 1))] : null));\n        },\n        hideCurrent: function() {\n            var la = ka.getCurrent();\n            ((la && la.hide()));\n        },\n        bootstrap: function(la, ma, na, oa, pa, qa) {\n            ma = ((ma || {\n            }));\n            ba(ma, new x(la).getQueryData());\n            oa = ((oa || ((na ? \"GET\" : \"POST\"))));\n            var ra = ((u.byClass(qa, \"stat_elem\") || qa));\n            if (((ra && m.hasClass(ra, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = new i().setReadOnly(!!na).setMethod(oa).setRelativeTo(qa).setStatusElement(ra).setURI(la).setNectarModuleDataSafe(qa).setData(ma), ta = new ka(pa).setCausalElement(qa).setAsync(sa);\n            ta.show();\n            return false;\n        },\n        showFromModel: function(la, ma) {\n            var na = new ka(la).setCausalElement(ma).show();\n            if (la.hiding) {\n                na.hide();\n            }\n        ;\n        ;\n        },\n        _init: function() {\n            this._init = da;\n            v.onLeave(ha(ka._tearDown, null, false));\n            h.subscribe(\"page_transition\", ha(ka._tearDown, null, true));\n            o.listen(JSBNG__document.documentElement, \"keydown\", function(JSBNG__event) {\n                if (((((o.getKeyCode(JSBNG__event) == s.ESC)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._escape()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                ;\n                }\n                 else if (((((o.getKeyCode(JSBNG__event) == s.RETURN)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._enter()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            });\n            o.listen(window, \"resize\", function(JSBNG__event) {\n                var la = ka.getCurrent();\n                ((la && la._resetDialogObj()));\n            });\n        },\n        _findButton: function(la, ma) {\n            if (la) {\n                for (var na = 0; ((na < la.length)); ++na) {\n                    if (((la[na].JSBNG__name == ma))) {\n                        return la[na];\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            return null;\n        },\n        _tearDown: function(la) {\n            var ma = ka._stack.slice();\n            for (var na = ((ma.length - 1)); ((na >= 0)); na--) {\n                if (((((la && !ma[na]._cross_transition)) || ((!la && !ma[na]._cross_quickling))))) {\n                    ma[na].hide();\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _escape: function() {\n            var la = ka.getCurrent();\n            if (!la) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._semi_modal, na = la._buttons;\n            if (((!na.length && !ma))) {\n                return false;\n            }\n        ;\n        ;\n            if (((ma && !na.length))) {\n                la.hide();\n                return true;\n            }\n        ;\n        ;\n            var oa, pa = ka._findButton(na, \"cancel\");\n            if (la._cancelHandler) {\n                la.cancel();\n                return true;\n            }\n             else if (pa) {\n                oa = pa;\n            }\n             else if (((na.length == 1))) {\n                oa = na[0];\n            }\n             else return false\n            \n            \n        ;\n            la._handleButton(oa);\n            return true;\n        },\n        _enter: function() {\n            var la = ka.getCurrent();\n            if (((!la || !la._submit_on_enter))) {\n                return false;\n            }\n        ;\n        ;\n            if (((JSBNG__document.activeElement != la._frame))) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._buttons;\n            if (!ma) {\n                return false;\n            }\n        ;\n        ;\n            la._handleButton(ma[0]);\n            return true;\n        },\n        call_or_eval: function(la, ma, na) {\n            if (!ma) {\n                return undefined;\n            }\n        ;\n        ;\n            na = ((na || {\n            }));\n            if (((typeof ma == \"string\"))) {\n                var oa = Object.keys(na).join(\", \");\n                ma = (eval)(((((((((\"({f: function(\" + oa)) + \") { \")) + ma)) + \"}})\"))).f;\n            }\n        ;\n        ;\n            return ma.apply(la, ea(na));\n        }\n    });\n    ba(ka.prototype, {\n        _cross_quickling: false,\n        _cross_transition: false,\n        _loading: false,\n        _showing: false,\n        show: function() {\n            this._showing = true;\n            if (this._async_request) {\n                if (this._show_loading) {\n                    this.showLoading();\n                }\n            ;\n            ;\n            }\n             else this._update();\n        ;\n        ;\n            return this;\n        },\n        showLoading: function() {\n            this._loading = true;\n            m.addClass(this._frame, \"dialog_loading_shown\");\n            this._renderDialog();\n            return this;\n        },\n        hide: function() {\n            if (((!this._showing && !this._loading))) {\n                return this;\n            }\n        ;\n        ;\n            this._showing = false;\n            if (this._autohide_timeout) {\n                JSBNG__clearTimeout(this._autohide_timeout);\n                this._autohide_timeout = null;\n            }\n        ;\n        ;\n            if (((this._fade_enabled && ((ka._stack.length <= 1))))) {\n                this._fadeOut();\n            }\n             else this._hide();\n        ;\n        ;\n            return this;\n        },\n        cancel: function() {\n            if (((!this._cancelHandler || ((this._cancelHandler() !== false))))) {\n                this.hide();\n            }\n        ;\n        ;\n        },\n        getRoot: function() {\n            return this._obj;\n        },\n        getBody: function() {\n            return n.scry(this._obj, \"div.dialog_body\")[0];\n        },\n        getButtonElement: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            if (((!la || !la.JSBNG__name))) {\n                return null;\n            }\n        ;\n        ;\n            var ma = n.scry(this._popup, \"input\"), na = function(oa) {\n                return ((oa.JSBNG__name == la.JSBNG__name));\n            };\n            return ((ma.filter(na)[0] || null));\n        },\n        getContentNode: function() {\n            return n.JSBNG__find(this._content, \"div.dialog_content\");\n        },\n        getFormData: function() {\n            return q.serialize(this.getContentNode());\n        },\n        setAllowCrossPageTransition: function(la) {\n            this._cross_transition = la;\n            return this;\n        },\n        setAllowCrossQuicklingNavigation: function(la) {\n            this._cross_quickling = la;\n            return this;\n        },\n        setShowing: function() {\n            this.show();\n            return this;\n        },\n        setHiding: function() {\n            this.hide();\n            return this;\n        },\n        setTitle: function(la) {\n            var ma = this._nodes.title, na = this._nodes.title_inner, oa = this._nodes.JSBNG__content;\n            n.setContent(na, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            m.conditionClass(oa, \"dialog_content_titleless\", !la);\n            return this;\n        },\n        setBody: function(la) {\n            n.setContent(this._nodes.body, this._format(la));\n            return this;\n        },\n        setExtraData: function(la) {\n            this._extra_data = la;\n            return this;\n        },\n        setReturnData: function(la) {\n            this._return_data = la;\n            return this;\n        },\n        setShowLoading: function(la) {\n            this._show_loading = la;\n            return this;\n        },\n        setCustomLoading: function(la) {\n            var ma = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, la);\n            n.setContent(this._frame, [this._nodes.title,this._nodes.JSBNG__content,ma,]);\n            return this;\n        },\n        setFullBleed: function(la) {\n            this._full_bleed = la;\n            this._updateWidth();\n            m.conditionClass(this._obj, \"full_bleed\", la);\n            return this;\n        },\n        setCausalElement: function(la) {\n            this._causal_elem = la;\n            return this;\n        },\n        setUserData: function(la) {\n            this._user_data = la;\n            return this;\n        },\n        getUserData: function() {\n            return this._user_data;\n        },\n        setAutohide: function(la) {\n            if (la) {\n                if (this._showing) {\n                    this._autohide_timeout = JSBNG__setTimeout(ha(this.hide, this), la);\n                }\n                 else this._autohide = la;\n            ;\n            ;\n            }\n             else {\n                this._autohide = null;\n                if (this._autohide_timeout) {\n                    JSBNG__clearTimeout(this._autohide_timeout);\n                    this._autohide_timeout = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        setSummary: function(la) {\n            var ma = this._nodes.summary;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setButtons: function(la) {\n            var ma, na;\n            if (!((la instanceof Array))) {\n                ma = ca(arguments);\n            }\n             else ma = la;\n        ;\n        ;\n            for (var oa = 0; ((oa < ma.length)); ++oa) {\n                if (((typeof ma[oa] == \"string\"))) {\n                    na = ka._findButton(ka._STANDARD_BUTTONS, ma[oa]);\n                    ma[oa] = na;\n                }\n            ;\n            ;\n            };\n        ;\n            this._buttons = ma;\n            var pa = [];\n            if (((ma && ((ma.length > 0))))) {\n                for (var qa = 0; ((qa < ma.length)); qa++) {\n                    na = ma[qa];\n                    var ra = n.create(\"input\", {\n                        type: \"button\",\n                        JSBNG__name: ((na.JSBNG__name || \"\")),\n                        value: na.label\n                    }), sa = n.create(\"label\", {\n                        className: \"uiButton uiButtonLarge uiButtonConfirm\"\n                    }, ra);\n                    if (na.className) {\n                        na.className.split(/\\s+/).forEach(function(ua) {\n                            m.addClass(sa, ua);\n                        });\n                        if (m.hasClass(sa, \"inputaux\")) {\n                            m.removeClass(sa, \"inputaux\");\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                        if (m.hasClass(sa, \"uiButtonSpecial\")) {\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    if (na.icon) {\n                        n.prependContent(sa, n.create(\"img\", {\n                            src: na.icon,\n                            className: \"img mrs\"\n                        }));\n                    }\n                ;\n                ;\n                    if (na.disabled) {\n                        k.setEnabled(sa, false);\n                    }\n                ;\n                ;\n                    o.listen(ra, \"click\", this._handleButton.bind(this, na.JSBNG__name));\n                    {\n                        var fin108keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin108i = (0);\n                        var ta;\n                        for (; (fin108i < fin108keys.length); (fin108i++)) {\n                            ((ta) = (fin108keys[fin108i]));\n                            {\n                                if (((((ta.indexOf(\"data-\") === 0)) && ((ta.length > 5))))) {\n                                    ra.setAttribute(ta, na[ta]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    pa.push(sa);\n                };\n            }\n        ;\n        ;\n            n.setContent(this._nodes.buttons, pa);\n            this._updateButtonVisibility();\n            return this;\n        },\n        setButtonsMessage: function(la) {\n            n.setContent(this._nodes.button_message, this._format(((la || \"\"))));\n            this._has_button_message = !!la;\n            this._updateButtonVisibility();\n            return this;\n        },\n        _updateButtonVisibility: function() {\n            var la = ((((this._buttons.length > 0)) || this._has_button_message));\n            m.conditionShow(this._nodes.button_wrapper, la);\n            m.conditionClass(this._obj, \"omitDialogFooter\", !la);\n        },\n        setClickButtonOnEnter: function(la, ma) {\n            this._clickOnEnterTarget = la;\n            if (!this._clickOnEnterListener) {\n                this._clickOnEnterListener = o.listen(this._nodes.body, \"keypress\", function(JSBNG__event) {\n                    var na = JSBNG__event.getTarget();\n                    if (((na && ((na.id === this._clickOnEnterTarget))))) {\n                        if (((o.getKeyCode(JSBNG__event) == s.RETURN))) {\n                            this._handleButton(ma);\n                            JSBNG__event.kill();\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    return true;\n                }.bind(this));\n            }\n        ;\n        ;\n            return this;\n        },\n        setStackable: function(la, ma) {\n            this._is_stackable = la;\n            this._shown_while_stacked = ((la && ma));\n            return this;\n        },\n        setHandler: function(la) {\n            this._handler = la;\n            return this;\n        },\n        setCancelHandler: function(la) {\n            this._cancelHandler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        setCloseHandler: function(la) {\n            this._close_handler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        clearHandler: function() {\n            return this.setHandler(null);\n        },\n        setPostURI: function(la, ma) {\n            if (((ma === undefined))) {\n                ma = true;\n            }\n        ;\n        ;\n            if (ma) {\n                this.setHandler(this._submitForm.bind(this, \"POST\", la));\n            }\n             else this.setHandler(function() {\n                q.post(la, this.getFormData());\n                this.hide();\n            }.bind(this));\n        ;\n        ;\n            return this;\n        },\n        setGetURI: function(la) {\n            this.setHandler(this._submitForm.bind(this, \"GET\", la));\n            return this;\n        },\n        setModal: function(la) {\n            this._modal = la;\n            m.conditionClass(this._obj, \"generic_dialog_modal\", la);\n            return this;\n        },\n        setSemiModal: function(la) {\n            if (la) {\n                this.setModal(true);\n                this._semiModalListener = o.listen(this._obj, \"click\", function(ma) {\n                    if (!n.contains(this._popup, ma.getTarget())) {\n                        this.hide();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else ((this._semiModalListener && this._semiModalListener.remove()));\n        ;\n        ;\n            this._semi_modal = la;\n            return this;\n        },\n        setWideDialog: function(la) {\n            this._wide_dialog = la;\n            this._updateWidth();\n            return this;\n        },\n        setContentWidth: function(la) {\n            this._content_width = la;\n            this._updateWidth();\n            return this;\n        },\n        setTitleLoading: function(la) {\n            if (((la === undefined))) {\n                la = true;\n            }\n        ;\n        ;\n            var ma = n.JSBNG__find(this._popup, \"h2.dialog_title\");\n            if (ma) {\n                m.conditionClass(ma, \"loading\", la);\n            }\n        ;\n        ;\n            return this;\n        },\n        setSecure: function(la) {\n            m.conditionClass(this._nodes.title, \"secure\", la);\n            return this;\n        },\n        setClassName: function(la) {\n            la.split(/\\s+/).forEach(m.addClass.bind(m, this._obj));\n            return this;\n        },\n        setFadeEnabled: function(la) {\n            this._fade_enabled = la;\n            return this;\n        },\n        setFooter: function(la) {\n            var ma = this._nodes.footer;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setAutoFocus: function(la) {\n            this._auto_focus = la;\n            return this;\n        },\n        setTop: function(la) {\n            this._top = la;\n            this._resetDialogObj();\n            return this;\n        },\n        onloadRegister: function(la) {\n            ca(la).forEach(function(ma) {\n                if (((typeof ma == \"string\"))) {\n                    ma = new Function(ma);\n                }\n            ;\n            ;\n                this._onload_handlers.push(ma.bind(this));\n            }.bind(this));\n            return this;\n        },\n        setAsyncURL: function(la) {\n            return this.setAsync(new i(la));\n        },\n        setAsync: function(la) {\n            var ma = function(ua) {\n                if (((this._async_request != la))) {\n                    return;\n                }\n            ;\n            ;\n                this._async_request = null;\n                var va = ua.getPayload(), wa = va;\n                if (this._loading) {\n                    this._showing = true;\n                }\n            ;\n            ;\n                if (((typeof wa == \"string\"))) {\n                    this.setBody(wa);\n                }\n                 else this._setFromModel(wa);\n            ;\n            ;\n                this._update();\n            }.bind(this), na = la.getData();\n            na.__d = 1;\n            la.setData(na);\n            var oa = ((la.getHandler() || da));\n            la.setHandler(function(ua) {\n                oa(ua);\n                ma(ua);\n            });\n            var pa = la, qa = ((pa.getErrorHandler() || da)), ra = ((pa.getTransportErrorHandler() || da)), sa = function() {\n                this._async_request = null;\n                this._loading = false;\n                if (((this._showing && this._shown_while_stacked))) {\n                    this._update();\n                }\n                 else this._hide(this._is_stackable);\n            ;\n            ;\n            }.bind(this), ta = ((pa.getServerDialogCancelHandler() || sa));\n            pa.setAllowCrossPageTransition(this._cross_transition).setErrorHandler(function(ua) {\n                sa();\n                qa(ua);\n            }).setTransportErrorHandler(function(ua) {\n                sa();\n                ra(ua);\n            }).setServerDialogCancelHandler(ta);\n            la.send();\n            this._async_request = la;\n            if (this._showing) {\n                this.show();\n            }\n        ;\n        ;\n            return this;\n        },\n        _format: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = r(la);\n            }\n             else la = r.replaceJSONWrapper(la);\n        ;\n        ;\n            if (((la instanceof r))) {\n                la.setDeferred(true);\n            }\n        ;\n        ;\n            return la;\n        },\n        _update: function() {\n            if (!this._showing) {\n                return;\n            }\n        ;\n        ;\n            if (((((this._autohide && !this._async_request)) && !this._autohide_timeout))) {\n                this._autohide_timeout = JSBNG__setTimeout(aa(this, \"hide\"), this._autohide);\n            }\n        ;\n        ;\n            m.removeClass(this._frame, \"dialog_loading_shown\");\n            this._loading = false;\n            this._renderDialog();\n            this._runOnloads();\n            this._previous_focus = JSBNG__document.activeElement;\n            p.set(this._frame);\n        },\n        _runOnloads: function() {\n            for (var la = 0; ((la < this._onload_handlers.length)); ++la) {\n                try {\n                    this._onload_handlers[la]();\n                } catch (ma) {\n                \n                };\n            ;\n            };\n        ;\n            this._onload_handlers = [];\n        },\n        _updateWidth: function() {\n            var la = ((2 * ka._BORDER_WIDTH));\n            if (ka._isUsingCSSBorders()) {\n                la += ((2 * ka._HALO_WIDTH));\n            }\n        ;\n        ;\n            if (this._content_width) {\n                la += this._content_width;\n                if (!this._full_bleed) {\n                    la += ((2 * ka._PADDING_WIDTH));\n                }\n            ;\n            ;\n            }\n             else if (this._wide_dialog) {\n                la += ka.SIZE.WIDE;\n            }\n             else la += ka.SIZE.STANDARD;\n            \n        ;\n        ;\n            this._popup.style.width = ((la + \"px\"));\n        },\n        _updateZIndex: function() {\n            if (((!this._hasSetZIndex && this._causal_elem))) {\n                var la = fa(this._causal_elem), ma = this._causal_elem;\n                while (((!la && (ma = l.getContext(ma))))) {\n                    la = fa(ma);\n                ;\n                };\n            ;\n                this._hasSetZIndex = ((la > ((this._modal ? 400 : 200))));\n                w.set(this._obj, \"z-index\", ((this._hasSetZIndex ? la : \"\")));\n            }\n        ;\n        ;\n        },\n        _renderDialog: function() {\n            this._updateZIndex();\n            this._pushOntoStack();\n            this._obj.style.height = ((((this._modal && ((y.ie() < 7)))) ? ((z.getDocumentDimensions().y + \"px\")) : null));\n            if (((this._obj && this._obj.style.display))) {\n                this._obj.style.visibility = \"hidden\";\n                this._obj.style.display = \"\";\n                this.resetDialogPosition();\n                this._obj.style.visibility = \"\";\n                this._obj.dialog = this;\n            }\n             else this.resetDialogPosition();\n        ;\n        ;\n            JSBNG__clearInterval(this.active_hiding);\n            this.active_hiding = JSBNG__setInterval(this._activeResize.bind(this), 500);\n            this._submit_on_enter = false;\n            if (this._auto_focus) {\n                var la = q.getFirstElement(this._content, [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",]);\n                if (la) {\n                    q.focusFirst.bind(this, this._content).defer();\n                }\n                 else this._submit_on_enter = true;\n            ;\n            ;\n            }\n        ;\n        ;\n            var ma = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms.push(ma);\n            this._bottom = ma;\n            ka._updateMaxBottom();\n            return this;\n        },\n        _buildDialog: function() {\n            this._obj = n.create(\"div\", {\n                className: \"generic_dialog\",\n                id: this._uniqueID\n            });\n            this._obj.style.display = \"none\";\n            n.appendContent(JSBNG__document.body, this._obj);\n            if (!this._popup) {\n                this._popup = n.create(\"div\", {\n                    className: \"generic_dialog_popup\"\n                });\n            }\n        ;\n        ;\n            this._obj.appendChild(this._popup);\n            if (((((y.ie() < 7)) && !this._shim))) {\n                j.loadModules([\"IframeShim\",], function(xa) {\n                    this._shim = new xa(this._popup);\n                });\n            }\n        ;\n        ;\n            m.addClass(this._obj, \"pop_dialog\");\n            if (t.isRTL()) {\n                m.addClass(this._obj, \"pop_dialog_rtl\");\n            }\n        ;\n        ;\n            var la;\n            if (ka._isUsingCSSBorders()) {\n                la = ((((\"\\u003Cdiv class=\\\"pop_container_advanced\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_content\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n            }\n             else la = ((((((((((((((((\"\\u003Cdiv class=\\\"pop_container\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_verticalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_horizontalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_content pop_content_old\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n        ;\n        ;\n            n.setContent(this._popup, r(la));\n            var ma = n.JSBNG__find(this._popup, \"div.pop_content\");\n            ma.setAttribute(\"tabIndex\", \"0\");\n            ma.setAttribute(\"role\", \"alertdialog\");\n            this._frame = this._content = ma;\n            var na = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, \"Loading...\"), oa = n.create(\"span\"), pa = n.create(\"h2\", {\n                className: \"dialog_title hidden_elem\",\n                id: ((\"title_\" + this._uniqueID))\n            }, oa), qa = n.create(\"div\", {\n                className: \"dialog_summary hidden_elem\"\n            }), ra = n.create(\"div\", {\n                className: \"dialog_body\"\n            }), sa = n.create(\"div\", {\n                className: \"rfloat mlm\"\n            }), ta = n.create(\"div\", {\n                className: \"dialog_buttons_msg\"\n            }), ua = n.create(\"div\", {\n                className: \"dialog_buttons clearfix hidden_elem\"\n            }, [sa,ta,]), va = n.create(\"div\", {\n                className: \"dialog_footer hidden_elem\"\n            }), wa = n.create(\"div\", {\n                className: \"dialog_content\"\n            }, [qa,ra,ua,va,]);\n            this._nodes = {\n                summary: qa,\n                body: ra,\n                buttons: sa,\n                button_message: ta,\n                button_wrapper: ua,\n                footer: va,\n                JSBNG__content: wa,\n                title: pa,\n                title_inner: oa\n            };\n            n.setContent(this._frame, [pa,wa,na,]);\n        },\n        _updateShim: function() {\n            return ((this._shim && this._shim.show()));\n        },\n        _activeResize: function() {\n            if (((this.last_offset_height != this._content.offsetHeight))) {\n                this.last_offset_height = this._content.offsetHeight;\n                this.resetDialogPosition();\n            }\n        ;\n        ;\n        },\n        resetDialogPosition: function() {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            this._resetDialogObj();\n            this._updateShim();\n        },\n        _resetDialogObj: function() {\n            var la = ((2 * ka._PAGE_MARGIN)), ma = z.getViewportDimensions(), na = ((ma.x - la)), oa = ((ma.y - la)), pa = ((2 * ka._HALO_WIDTH)), qa = z.getElementDimensions(this._content), ra = ((qa.x + pa)), sa = ((qa.y + pa)), ta = this._top, ua = ((na - ra)), va = ((oa - sa));\n            if (((va < 0))) {\n                ta = ka._PAGE_MARGIN;\n            }\n             else if (((ta > va))) {\n                ta = ((ka._PAGE_MARGIN + ((Math.max(va, 0) / 2))));\n            }\n            \n        ;\n        ;\n            var wa = ja();\n            if (!wa) {\n                ta += z.getScrollPosition().y;\n            }\n        ;\n        ;\n            w.set(this._popup, \"marginTop\", ((ta + \"px\")));\n            var xa = ((wa && ((((ua < 0)) || ((va < 0))))));\n            m.conditionClass(this._obj, \"generic_dialog_fixed_overflow\", xa);\n            m.conditionClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\", xa);\n        },\n        _fadeOut: function(la) {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            try {\n                new g(this._obj).duration(0).checkpoint().to(\"opacity\", 0).hide().duration(250).ondone(this._hide.bind(this, la)).go();\n            } catch (ma) {\n                this._hide(la);\n            };\n        ;\n        },\n        _hide: function(la) {\n            if (this._obj) {\n                this._obj.style.display = \"none\";\n            }\n        ;\n        ;\n            m.removeClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\");\n            this._updateShim();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._bottom) {\n                var ma = ka._bottoms;\n                ma.splice(ma.indexOf(this._bottom), 1);\n                ka._updateMaxBottom();\n            }\n        ;\n        ;\n            if (((((this._previous_focus && JSBNG__document.activeElement)) && n.contains(this._obj, JSBNG__document.activeElement)))) {\n                p.set(this._previous_focus);\n            }\n        ;\n        ;\n            if (la) {\n                return;\n            }\n        ;\n        ;\n            this.destroy();\n        },\n        destroy: function() {\n            this._popFromStack();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._obj) {\n                n.remove(this._obj);\n                this._obj = null;\n                ((this._shim && this._shim.hide()));\n                this._shim = null;\n            }\n        ;\n        ;\n            ((this._clickOnEnterListener && this._clickOnEnterListener.remove()));\n            if (this._close_handler) {\n                this._close_handler({\n                    return_data: this._return_data\n                });\n            }\n        ;\n        ;\n        },\n        _handleButton: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            var ma = ka.call_or_eval(la, la.handler);\n            if (((ma === false))) {\n                return;\n            }\n        ;\n        ;\n            if (((la.JSBNG__name == \"cancel\"))) {\n                this.cancel();\n            }\n             else if (((ka.call_or_eval(this, this._handler, {\n                button: la\n            }) !== false))) {\n                this.hide();\n            }\n            \n        ;\n        ;\n        },\n        _submitForm: function(la, ma, na) {\n            var oa = this.getFormData();\n            if (na) {\n                oa[na.JSBNG__name] = na.label;\n            }\n        ;\n        ;\n            if (this._extra_data) {\n                ba(oa, this._extra_data);\n            }\n        ;\n        ;\n            var pa = new i().setURI(ma).setData(oa).setMethod(la).setNectarModuleDataSafe(this._causal_elem).setReadOnly(((la == \"GET\")));\n            this.setAsync(pa);\n            return false;\n        },\n        _setFromModel: function(la) {\n            var ma = {\n            };\n            ba(ma, la);\n            {\n                var fin109keys = ((window.top.JSBNG_Replay.forInKeys)((ma))), fin109i = (0);\n                var na;\n                for (; (fin109i < fin109keys.length); (fin109i++)) {\n                    ((na) = (fin109keys[fin109i]));\n                    {\n                        if (((na == \"onloadRegister\"))) {\n                            this.onloadRegister(ma[na]);\n                            continue;\n                        }\n                    ;\n                    ;\n                        var oa = this[((((\"set\" + na.substr(0, 1).toUpperCase())) + na.substr(1)))];\n                        oa.apply(this, ca(ma[na]));\n                    };\n                };\n            };\n        ;\n        },\n        _updateBottom: function() {\n            var la = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms[((ka._bottoms.length - 1))] = la;\n            ka._updateMaxBottom();\n        },\n        _pushOntoStack: function() {\n            var la = ka._stack;\n            if (!la.length) {\n                h.inform(\"layer_shown\", {\n                    type: \"Dialog\"\n                });\n            }\n        ;\n        ;\n            ga(la, this);\n            la.push(this);\n            for (var ma = ((la.length - 2)); ((ma >= 0)); ma--) {\n                var na = la[ma];\n                if (((!na._is_stackable && !na._async_request))) {\n                    na._hide();\n                }\n                 else if (!na._shown_while_stacked) {\n                    na._hide(true);\n                }\n                \n            ;\n            ;\n            };\n        ;\n        },\n        _popFromStack: function() {\n            var la = ka._stack, ma = ((la[((la.length - 1))] === this));\n            ga(la, this);\n            if (la.length) {\n                if (ma) {\n                    la[((la.length - 1))].show();\n                }\n            ;\n            ;\n            }\n             else h.inform(\"layer_hidden\", {\n                type: \"Dialog\"\n            });\n        ;\n        ;\n        }\n    });\n    e.exports = ka;\n    a.Dialog = ka;\n});\n__d(\"DialogHideOnSuccess\", [\"copyProperties\",\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"CSS\"), i = b(\"cx\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    g(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (h.hasClass(JSBNG__event.getTarget(), \"-cx-PRIVATE-uiDialog__form\")) {\n                this._layer.hide();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"DocumentTitle\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = JSBNG__document.title, i = null, j = 1500, k = [], l = 0, m = null, n = false;\n    function o() {\n        if (((k.length > 0))) {\n            if (!n) {\n                p(k[l].title);\n                l = ((++l % k.length));\n            }\n             else q();\n        ;\n        ;\n        }\n         else {\n            JSBNG__clearInterval(m);\n            m = null;\n            q();\n        }\n    ;\n    ;\n    };\n;\n    function p(s) {\n        JSBNG__document.title = s;\n        n = true;\n    };\n;\n    function q() {\n        r.set(((i || h)), true);\n        n = false;\n    };\n;\n    var r = {\n        get: function() {\n            return h;\n        },\n        set: function(s, t) {\n            JSBNG__document.title = s;\n            if (!t) {\n                h = s;\n                i = null;\n                g.inform(\"update_title\", s);\n            }\n             else i = s;\n        ;\n        ;\n        },\n        blink: function(s) {\n            var t = {\n                title: s\n            };\n            k.push(t);\n            if (((m === null))) {\n                m = JSBNG__setInterval(o, j);\n            }\n        ;\n        ;\n            return {\n                JSBNG__stop: function() {\n                    var u = k.indexOf(t);\n                    if (((u >= 0))) {\n                        k.splice(u, 1);\n                        if (((l > u))) {\n                            l--;\n                        }\n                         else if (((((l == u)) && ((l == k.length))))) {\n                            l = 0;\n                        }\n                        \n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"DoublyLinkedListMap\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h() {\n        this._head = null;\n        this._tail = null;\n        this._nodes = {\n        };\n        this._nodeCount = 0;\n    };\n;\n    g(h.prototype, {\n        get: function(i) {\n            return ((this._nodes[i] ? this._nodes[i].data : null));\n        },\n        getIndex: function(i) {\n            for (var j = this._head, k = 0; j; j = j.next, k++) {\n                if (((j.key === i))) {\n                    return k;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        _insert: function(i, j, k, l) {\n            ((((k && !this._nodes[k])) && (k = null)));\n            var m = ((((k && this._nodes[k])) || ((l ? this._head : this._tail)))), n = {\n                data: j,\n                key: i,\n                next: null,\n                prev: null\n            };\n            if (m) {\n                this.remove(i);\n                if (l) {\n                    n.prev = m.prev;\n                    ((m.prev && (m.prev.next = n)));\n                    m.prev = n;\n                    n.next = m;\n                }\n                 else {\n                    n.next = m.next;\n                    ((m.next && (m.next.prev = n)));\n                    m.next = n;\n                    n.prev = m;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((((n.prev === null)) && (this._head = n)));\n            ((((n.next === null)) && (this._tail = n)));\n            this._nodes[i] = n;\n            this._nodeCount++;\n            return this;\n        },\n        insertBefore: function(i, j, k) {\n            return this._insert(i, j, k, true);\n        },\n        insertAfter: function(i, j, k) {\n            return this._insert(i, j, k, false);\n        },\n        prepend: function(i, j) {\n            return this.insertBefore(i, j, ((this._head && this._head.key)));\n        },\n        append: function(i, j) {\n            return this.insertAfter(i, j, ((this._tail && this._tail.key)));\n        },\n        remove: function(i) {\n            var j = this._nodes[i];\n            if (j) {\n                var k = j.next, l = j.prev;\n                ((k && (k.prev = l)));\n                ((l && (l.next = k)));\n                ((((this._head === j)) && (this._head = k)));\n                ((((this._tail === j)) && (this._tail = l)));\n                delete this._nodes[i];\n                this._nodeCount--;\n            }\n        ;\n        ;\n            return this;\n        },\n        JSBNG__find: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                if (i(j.data)) {\n                    return j.key;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        reduce: function(i, j) {\n            for (var k = this._head; k; k = k.next) {\n                j = i(k.data, j);\n            ;\n            };\n        ;\n            return j;\n        },\n        exists: function(i) {\n            return !!this._nodes[i];\n        },\n        isEmpty: function() {\n            return !this._head;\n        },\n        reset: function() {\n            this._head = null;\n            this._tail = null;\n            this._nodes = {\n            };\n            this._nodeCount = 0;\n        },\n        map: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                i(j.data);\n            ;\n            };\n        ;\n        },\n        getCount: function() {\n            return this._nodeCount;\n        },\n        getHead: function() {\n            return ((this._head && this._head.data));\n        },\n        getTail: function() {\n            return ((this._tail && this._tail.data));\n        },\n        getNext: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.next))) {\n                return j.next.data;\n            }\n        ;\n        ;\n            return null;\n        },\n        getPrev: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.prev))) {\n                return j.prev.data;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"throttle\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j, k, l) {\n        return i(j, k, l, false, false);\n    };\n;\n    g(h, {\n        acrossTransitions: function(j, k, l) {\n            return i(j, k, l, true, false);\n        },\n        withBlocking: function(j, k, l) {\n            return i(j, k, l, false, true);\n        }\n    });\n    function i(j, k, l, m, n) {\n        if (((k == null))) {\n            k = 100;\n        }\n    ;\n    ;\n        var o, p, q;\n        {\n            function r() {\n                p = JSBNG__Date.now();\n                if (o) {\n                    j.apply(l, o);\n                    o = null;\n                    q = JSBNG__setTimeout(r, k, !m);\n                }\n                 else q = false;\n            ;\n            ;\n            };\n            ((window.top.JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361.push)((r)));\n        };\n    ;\n        return function s() {\n            o = arguments;\n            if (((!q || ((((JSBNG__Date.now() - p)) > k))))) {\n                if (n) {\n                    r();\n                }\n                 else q = JSBNG__setTimeout(r, 0, !m);\n            ;\n            }\n        ;\n        ;\n        };\n    };\n;\n    e.exports = h;\n});\n__d(\"FullScreen\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"UserAgent\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = b(\"throttle\"), m = {\n    }, n = k(new h(), {\n        listenForEvent: function(p) {\n            var q = l(this.onChange, 0, this);\n            if (!m[p.id]) {\n                m[p.id] = true;\n                g.listen(p, {\n                    webkitfullscreenchange: q,\n                    mozfullscreenchange: q,\n                    fullscreenchange: q\n                });\n            }\n        ;\n        ;\n        },\n        enableFullScreen: function(p) {\n            this.listenForEvent(p);\n            if (p.webkitRequestFullScreen) {\n                if (j.chrome()) {\n                    p.webkitRequestFullScreen(JSBNG__Element.ALLOW_KEYBOARD_INPUT);\n                }\n                 else p.webkitRequestFullScreen();\n            ;\n            ;\n            }\n             else if (p.mozRequestFullScreen) {\n                p.mozRequestFullScreen();\n            }\n             else if (p.requestFullScreen) {\n                p.requestFullScreen();\n            }\n             else return false\n            \n            \n        ;\n            return true;\n        },\n        disableFullScreen: function() {\n            if (JSBNG__document.webkitCancelFullScreen) {\n                JSBNG__document.webkitCancelFullScreen();\n            }\n             else if (JSBNG__document.mozCancelFullScreen) {\n                JSBNG__document.mozCancelFullScreen();\n            }\n             else if (JSBNG__document.cancelFullScreen) {\n                JSBNG__document.cancelFullScreen();\n            }\n             else if (JSBNG__document.exitFullScreen) {\n                JSBNG__document.exitFullScreen();\n            }\n             else return false\n            \n            \n            \n        ;\n            return true;\n        },\n        isFullScreen: function() {\n            return ((((JSBNG__document.webkitIsFullScreen || JSBNG__document.JSBNG__fullScreen)) || JSBNG__document.mozFullScreen));\n        },\n        toggleFullScreen: function(p) {\n            if (this.isFullScreen()) {\n                this.disableFullScreen();\n                return false;\n            }\n             else return this.enableFullScreen(p)\n        ;\n            return false;\n        },\n        onChange: function() {\n            var p = this.isFullScreen();\n            i.conditionClass(JSBNG__document.body, \"JSBNG__fullScreen\", p);\n            this.inform(\"changed\");\n        },\n        isSupported: function() {\n            return ((((((((JSBNG__document.webkitCancelFullScreen && j.chrome())) || JSBNG__document.mozCancelFullScreen)) || JSBNG__document.cancelFullScreen)) || JSBNG__document.exitFullScreen));\n        }\n    }), o = l(n.onChange, 0, n);\n    g.listen(JSBNG__document, {\n        webkitfullscreenchange: o,\n        mozfullscreenchange: o,\n        fullscreenchange: o\n    });\n    e.exports = n;\n});\n__d(\"HistoryManager\", [\"JSBNG__Event\",\"function-extensions\",\"Cookie\",\"Env\",\"URI\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"goOrReplace\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Cookie\"), i = b(\"Env\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = b(\"copyProperties\"), m = b(\"emptyFunction\"), n = b(\"goOrReplace\"), o = {\n        _IFRAME_BASE_URI: \"http://static.ak.facebook.com/common/history_manager.php\",\n        JSBNG__history: null,\n        current: 0,\n        fragment: null,\n        _setIframeSrcFragment: function(p) {\n            p = p.toString();\n            var q = ((o.JSBNG__history.length - 1));\n            o.iframe.src = ((((((((o._IFRAME_BASE_URI + \"?|index=\")) + q)) + \"#\")) + encodeURIComponent(p)));\n            return o;\n        },\n        getIframeSrcFragment: function() {\n            return decodeURIComponent(j(o.iframe.contentWindow.JSBNG__document.JSBNG__location.href).getFragment());\n        },\n        nextframe: function(p, q) {\n            if (q) {\n                o._setIframeSrcFragment(p);\n                return;\n            }\n        ;\n        ;\n            if (((p !== undefined))) {\n                o.iframeQueue.push(p);\n            }\n             else {\n                o.iframeQueue.splice(0, 1);\n                o.iframeTimeout = null;\n                o.checkURI();\n            }\n        ;\n        ;\n            if (((o.iframeQueue.length && !o.iframeTimeout))) {\n                var r = o.iframeQueue[0];\n                o.iframeTimeout = JSBNG__setTimeout(function() {\n                    o._setIframeSrcFragment(r);\n                }, 100, false);\n            }\n        ;\n        ;\n        },\n        isInitialized: function() {\n            return !!o._initialized;\n        },\n        init: function() {\n            if (((!i.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (o._initialized) {\n                return o;\n            }\n        ;\n        ;\n            var p = j(), q = ((p.getFragment() || \"\"));\n            if (((q.charAt(0) === \"!\"))) {\n                q = q.substr(1);\n                p.setFragment(q);\n            }\n        ;\n        ;\n            if (((j.getRequestURI(false).getProtocol().toLowerCase() == \"https\"))) {\n                o._IFRAME_BASE_URI = \"https://s-static.ak.facebook.com/common/history_manager.php\";\n            }\n        ;\n        ;\n            l(o, {\n                _initialized: true,\n                fragment: q,\n                orig_fragment: q,\n                JSBNG__history: [p,],\n                callbacks: [],\n                lastChanged: JSBNG__Date.now(),\n                canonical: j(\"#\"),\n                fragmentTimeout: null,\n                user: 0,\n                iframeTimeout: null,\n                iframeQueue: [],\n                enabled: true,\n                debug: m\n            });\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                this.lastURI = JSBNG__document.JSBNG__URL;\n                window.JSBNG__history.replaceState(this.lastURI, null);\n                g.listen(window, \"popstate\", function(r) {\n                    if (((((r && r.state)) && ((o.lastURI != r.state))))) {\n                        o.lastURI = r.state;\n                        o.lastChanged = JSBNG__Date.now();\n                        o.notify(j(r.state).getUnqualifiedURI().toString());\n                    }\n                ;\n                ;\n                }.bind(o));\n                if (((((k.webkit() < 534)) || ((k.chrome() <= 13))))) {\n                    JSBNG__setInterval(o.checkURI, 42, false);\n                    o._updateRefererURI(this.lastURI);\n                }\n            ;\n            ;\n                return o;\n            }\n        ;\n        ;\n            o._updateRefererURI(j.getRequestURI(false));\n            if (((((k.webkit() < 500)) || ((k.firefox() < 2))))) {\n                o.enabled = false;\n                return o;\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                o.iframe = JSBNG__document.createElement(\"div\");\n                l(o.iframe.style, {\n                    width: \"0\",\n                    height: \"0\",\n                    frameborder: \"0\",\n                    left: \"0\",\n                    JSBNG__top: \"0\",\n                    position: \"absolute\"\n                });\n                o._setIframeSrcFragment(q);\n                JSBNG__document.body.insertBefore(o.iframe, JSBNG__document.body.firstChild);\n            }\n             else if (((\"JSBNG__onhashchange\" in window))) {\n                g.listen(window, \"hashchange\", function() {\n                    o.checkURI.bind(o).defer();\n                });\n            }\n             else JSBNG__setInterval(o.checkURI, 42, false);\n            \n        ;\n        ;\n            return o;\n        },\n        registerURIHandler: function(p) {\n            o.callbacks.push(p);\n            return o;\n        },\n        setCanonicalLocation: function(p) {\n            o.canonical = j(p);\n            return o;\n        },\n        notify: function(p) {\n            if (((p == o.orig_fragment))) {\n                p = o.canonical.getFragment();\n            }\n        ;\n        ;\n            for (var q = 0; ((q < o.callbacks.length)); q++) {\n                try {\n                    if (o.callbacks[q](p)) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (r) {\n                \n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        checkURI: function() {\n            if (((((JSBNG__Date.now() - o.lastChanged)) < 400))) {\n                return;\n            }\n        ;\n        ;\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                var p = j(JSBNG__document.JSBNG__URL).removeQueryData(\"ref\").toString(), q = j(o.lastURI).removeQueryData(\"ref\").toString();\n                if (((p != q))) {\n                    o.lastChanged = JSBNG__Date.now();\n                    o.lastURI = p;\n                    if (((k.webkit() < 534))) {\n                        o._updateRefererURI(p);\n                    }\n                ;\n                ;\n                    o.notify(j(p).getUnqualifiedURI().toString());\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            if (((((k.ie() < 8)) && o.iframeQueue.length))) {\n                return;\n            }\n        ;\n        ;\n            if (((k.webkit() && ((window.JSBNG__history.length == 200))))) {\n                if (!o.warned) {\n                    o.warned = true;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var r = j().getFragment();\n            if (((r.charAt(0) == \"!\"))) {\n                r = r.substr(1);\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                r = o.getIframeSrcFragment();\n            }\n        ;\n        ;\n            r = r.replace(/%23/g, \"#\");\n            if (((r != o.fragment.replace(/%23/g, \"#\")))) {\n                o.debug([r,\" vs \",o.fragment,\"whl: \",window.JSBNG__history.length,\"QHL: \",o.JSBNG__history.length,].join(\" \"));\n                for (var s = ((o.JSBNG__history.length - 1)); ((s >= 0)); --s) {\n                    if (((o.JSBNG__history[s].getFragment().replace(/%23/g, \"#\") == r))) {\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                ++o.user;\n                if (((s >= 0))) {\n                    o.go(((s - o.current)));\n                }\n                 else o.go(((\"#\" + r)));\n            ;\n            ;\n                --o.user;\n            }\n        ;\n        ;\n        },\n        _updateRefererURI: function(p) {\n            p = p.toString();\n            if (((((p.charAt(0) != \"/\")) && ((p.indexOf(\"//\") == -1))))) {\n                return;\n            }\n        ;\n        ;\n            var q = new j(window.JSBNG__location);\n            if (q.isFacebookURI()) {\n                var r = ((q.getPath() + window.JSBNG__location.search));\n            }\n             else var r = \"\"\n        ;\n            var s = j(p).getQualifiedURI().setFragment(r).toString(), t = 2048;\n            if (((s.length > t))) {\n                s = ((s.substring(0, t) + \"...\"));\n            }\n        ;\n        ;\n            h.set(\"x-referer\", s);\n        },\n        go: function(p, q, r) {\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                ((q || ((typeof (p) == \"number\"))));\n                var s = j(p).removeQueryData(\"ref\").toString();\n                o.lastChanged = JSBNG__Date.now();\n                this.lastURI = s;\n                if (r) {\n                    window.JSBNG__history.replaceState(p, null, s);\n                }\n                 else window.JSBNG__history.pushState(p, null, s);\n            ;\n            ;\n                if (((k.webkit() < 534))) {\n                    o._updateRefererURI(p);\n                }\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n            o.debug(((\"go: \" + p)));\n            if (((q === undefined))) {\n                q = true;\n            }\n        ;\n        ;\n            if (!o.enabled) {\n                if (!q) {\n                    return false;\n                }\n            ;\n            }\n        ;\n        ;\n            if (((typeof (p) == \"number\"))) {\n                if (!p) {\n                    return false;\n                }\n            ;\n            ;\n                var t = ((p + o.current)), u = Math.max(0, Math.min(((o.JSBNG__history.length - 1)), t));\n                o.current = u;\n                t = ((o.JSBNG__history[u].getFragment() || o.orig_fragment));\n                t = j(t).removeQueryData(\"ref\").getUnqualifiedURI().toString();\n                o.fragment = t;\n                o.lastChanged = JSBNG__Date.now();\n                if (((k.ie() < 8))) {\n                    if (o.fragmentTimeout) {\n                        JSBNG__clearTimeout(o.fragmentTimeout);\n                    }\n                ;\n                ;\n                    o._temporary_fragment = t;\n                    o.fragmentTimeout = JSBNG__setTimeout(function() {\n                        window.JSBNG__location.hash = ((\"#!\" + t));\n                        delete o._temporary_fragment;\n                    }, 750, false);\n                    if (!o.user) {\n                        o.nextframe(t, r);\n                    }\n                ;\n                ;\n                }\n                 else if (!o.user) {\n                    n(window.JSBNG__location, ((((window.JSBNG__location.href.split(\"#\")[0] + \"#!\")) + t)), r);\n                }\n                \n            ;\n            ;\n                if (q) {\n                    o.notify(t);\n                }\n            ;\n            ;\n                o._updateRefererURI(t);\n                return false;\n            }\n        ;\n        ;\n            p = j(p);\n            if (((p.getDomain() == j().getDomain()))) {\n                p = j(((\"#\" + p.getUnqualifiedURI())));\n            }\n        ;\n        ;\n            var v = o.JSBNG__history[o.current].getFragment(), w = p.getFragment();\n            if (((((w == v)) || ((((v == o.orig_fragment)) && ((w == o.canonical.getFragment()))))))) {\n                if (q) {\n                    o.notify(w);\n                }\n            ;\n            ;\n                o._updateRefererURI(w);\n                return false;\n            }\n        ;\n        ;\n            if (r) {\n                o.current--;\n            }\n        ;\n        ;\n            var x = ((((o.JSBNG__history.length - o.current)) - 1));\n            o.JSBNG__history.splice(((o.current + 1)), x);\n            o.JSBNG__history.push(j(p));\n            return o.go(1, q, r);\n        },\n        getCurrentFragment: function() {\n            var p = ((((o._temporary_fragment !== undefined)) ? o._temporary_fragment : j.getRequestURI(false).getFragment()));\n            return ((((p == o.orig_fragment)) ? o.canonical.getFragment() : p));\n        }\n    };\n    e.exports = o;\n});\n__d(\"InputSelection\", [\"DOM\",\"Focus\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Focus\"), i = {\n        get: function(j) {\n            if (!JSBNG__document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                };\n            }\n        ;\n        ;\n            var k = JSBNG__document.selection.createRange();\n            if (((k.parentElement() !== j))) {\n                return {\n                    start: 0,\n                    end: 0\n                };\n            }\n        ;\n        ;\n            var l = j.value.length;\n            if (g.isNodeOfType(j, \"input\")) {\n                return {\n                    start: -k.moveStart(\"character\", -l),\n                    end: -k.moveEnd(\"character\", -l)\n                };\n            }\n             else {\n                var m = k.duplicate();\n                m.moveToElementText(j);\n                m.setEndPoint(\"StartToEnd\", k);\n                var n = ((l - m.text.length));\n                m.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: ((l - m.text.length)),\n                    end: n\n                };\n            }\n        ;\n        ;\n        },\n        set: function(j, k, l) {\n            if (((typeof l == \"undefined\"))) {\n                l = k;\n            }\n        ;\n        ;\n            if (JSBNG__document.selection) {\n                if (((j.tagName == \"TEXTAREA\"))) {\n                    var m = ((j.value.slice(0, k).match(/\\r/g) || [])).length, n = ((j.value.slice(k, l).match(/\\r/g) || [])).length;\n                    k -= m;\n                    l -= ((m + n));\n                }\n            ;\n            ;\n                var o = j.createTextRange();\n                o.collapse(true);\n                o.moveStart(\"character\", k);\n                o.moveEnd(\"character\", ((l - k)));\n                o.select();\n            }\n             else {\n                j.selectionStart = k;\n                j.selectionEnd = Math.min(l, j.value.length);\n                h.set(j);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSONPTransport\", [\"ArbiterMixin\",\"DOM\",\"HTML\",\"URI\",\"asyncCallback\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"URI\"), k = b(\"asyncCallback\"), l = b(\"copyProperties\"), m = {\n    }, n = 2, o = \"jsonp\", p = \"div\";\n    function q(s) {\n        delete m[s];\n    };\n;\n    function r(s, t) {\n        this._type = s;\n        this._uri = t;\n        m[this.getID()] = this;\n    };\n;\n    l(r, {\n        respond: function(s, t, u) {\n            var v = m[s];\n            if (v) {\n                if (!u) {\n                    q(s);\n                }\n            ;\n            ;\n                if (((v._type == p))) {\n                    t = JSON.parse(JSON.stringify(t));\n                }\n            ;\n            ;\n                k(v.handleResponse.bind(v), \"json\")(t);\n            }\n             else {\n                var w = a.ErrorSignal;\n                if (((w && !u))) {\n                    w.logJSError(\"ajax\", {\n                        error: \"UnexpectedJsonResponse\",\n                        extra: {\n                            id: s,\n                            uri: ((((t.payload && t.payload.uri)) || \"\"))\n                        }\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    l(r.prototype, g, {\n        getID: function() {\n            return ((this._id || (this._id = n++)));\n        },\n        hasFinished: function() {\n            return !((this.getID() in m));\n        },\n        getRequestURI: function() {\n            return j(this._uri).addQueryData({\n                __a: 1,\n                __adt: this.getID(),\n                __req: ((\"jsonp_\" + this.getID()))\n            });\n        },\n        getTransportFrame: function() {\n            if (this._iframe) {\n                return this._iframe;\n            }\n        ;\n        ;\n            var s = ((\"transport_frame_\" + this.getID())), t = i(((((\"\\u003Ciframe class=\\\"hidden_elem\\\" name=\\\"\" + s)) + \"\\\" src=\\\"javascript:void(0)\\\" /\\u003E\")));\n            return this._iframe = h.appendContent(JSBNG__document.body, t)[0];\n        },\n        send: function() {\n            if (((this._type === o))) {\n                (function() {\n                    h.appendContent(JSBNG__document.body, h.create(\"script\", {\n                        src: this.getRequestURI().toString(),\n                        type: \"text/javascript\"\n                    }));\n                }).bind(this).defer();\n            }\n             else this.getTransportFrame().src = this.getRequestURI().toString();\n        ;\n        ;\n        },\n        handleResponse: function(s) {\n            this.inform(\"response\", s);\n            if (this.hasFinished()) {\n                this._cleanup.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        abort: function() {\n            if (this._aborted) {\n                return;\n            }\n        ;\n        ;\n            this._aborted = true;\n            this._cleanup();\n            q(this.getID());\n            this.inform(\"abort\");\n        },\n        _cleanup: function() {\n            if (this._iframe) {\n                h.remove(this._iframe);\n                this._iframe = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"JSXDOM\", [\"DOM\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"flattenArray\"), i = [\"a\",\"br\",\"button\",\"canvas\",\"checkbox\",\"dd\",\"div\",\"dl\",\"dt\",\"em\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"hr\",\"i\",\"div\",\"img\",\"input\",\"label\",\"li\",\"option\",\"p\",\"pre\",\"select\",\"span\",\"strong\",\"table\",\"tbody\",\"thead\",\"td\",\"textarea\",\"th\",\"tr\",\"ul\",\"video\",], j = {\n    };\n    i.forEach(function(k) {\n        var l = function(m, n) {\n            if (((arguments.length > 2))) {\n                n = Array.prototype.slice.call(arguments, 1);\n            }\n        ;\n        ;\n            if (((!n && m))) {\n                n = m.children;\n                delete m.children;\n            }\n        ;\n        ;\n            if (n) {\n                n = ((Array.isArray(n) ? h(n) : h([n,])));\n            }\n        ;\n        ;\n            return g.create(k, m, n);\n        };\n        j[k] = l;\n    });\n    e.exports = j;\n});\n__d(\"LinkController\", [\"JSBNG__Event\",\"DataStore\",\"Parent\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DataStore\"), i = b(\"Parent\"), j = b(\"trackReferrer\"), k = \"LinkControllerHandler\", l = [], m = [];\n    function n(JSBNG__event) {\n        var r = i.byTag(JSBNG__event.getTarget(), \"a\"), s = ((r && r.getAttribute(\"href\", 2)));\n        if (((((((!s || r.rel)) || !p(s))) || h.get(r, k)))) {\n            return;\n        }\n    ;\n    ;\n        var t = g.listen(r, \"click\", function(u) {\n            if (((s.charAt(((s.length - 1))) == \"#\"))) {\n                u.prevent();\n                return;\n            }\n        ;\n        ;\n            j(r, s);\n            o(r, u);\n        });\n        h.set(r, k, t);\n    };\n;\n    function o(r, JSBNG__event) {\n        if (((((((r.target || r.rel)) || JSBNG__event.getModifiers().any)) || ((JSBNG__event.which && ((JSBNG__event.which != 1))))))) {\n            return;\n        }\n    ;\n    ;\n        var s = l.concat(m);\n        for (var t = 0, u = s.length; ((t < u)); t++) {\n            if (((s[t](r, JSBNG__event) === false))) {\n                return JSBNG__event.prevent();\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function p(r) {\n        var s = r.match(/^(\\w+):/);\n        return ((!s || s[1].match(/^http/i)));\n    };\n;\n    var q = {\n        registerHandler: function(r) {\n            l.push(r);\n        },\n        registerFallbackHandler: function(r) {\n            m.push(r);\n        }\n    };\n    g.listen(JSBNG__document.documentElement, \"mousedown\", n);\n    g.listen(JSBNG__document.documentElement, \"keydown\", n);\n    e.exports = q;\n});\n__d(\"MenuDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"Keys\",\"Parent\",\"Style\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"Parent\"), o = b(\"Style\"), p = b(\"UserAgent\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\"), s = \"menu:mouseover\", t = null;\n    function u(ea) {\n        if (i.hasClass(ea, \"uiMenuContainer\")) {\n            return ea;\n        }\n    ;\n    ;\n        return n.byClass(ea, \"uiMenu\");\n    };\n;\n    function v(ea) {\n        return n.byClass(ea, \"uiMenuItem\");\n    };\n;\n    function w(ea) {\n        if (JSBNG__document.activeElement) {\n            var fa = v(JSBNG__document.activeElement);\n            return ea.indexOf(fa);\n        }\n    ;\n    ;\n        return -1;\n    };\n;\n    function x(ea) {\n        return k.JSBNG__find(ea, \"a.itemAnchor\");\n    };\n;\n    function y(ea) {\n        return i.hasClass(ea, \"checked\");\n    };\n;\n    function z(ea) {\n        return ((!i.hasClass(ea, \"disabled\") && ((o.get(ea, \"display\") !== \"none\"))));\n    };\n;\n    function aa(JSBNG__event) {\n        var ea = JSBNG__document.activeElement;\n        if (((((!ea || !n.byClass(ea, \"uiMenu\"))) || !k.isInputNode(ea)))) {\n            var fa = v(JSBNG__event.getTarget());\n            ((fa && da.focusItem(fa)));\n        }\n    ;\n    ;\n    };\n;\n    function ba(ea) {\n        ((p.firefox() && x(ea).JSBNG__blur()));\n        da.inform(\"select\", {\n            menu: u(ea),\n            item: ea\n        });\n    };\n;\n    var ca = function() {\n        ca = r;\n        var ea = {\n        };\n        ea.click = function(JSBNG__event) {\n            var fa = v(JSBNG__event.getTarget());\n            if (((fa && z(fa)))) {\n                ba(fa);\n                var ga = x(fa), ha = ga.href, ia = ga.getAttribute(\"rel\");\n                return ((((ia && ((ia !== \"ignore\")))) || ((ha && ((ha.charAt(((ha.length - 1))) !== \"#\"))))));\n            }\n        ;\n        ;\n        };\n        ea.keydown = function(JSBNG__event) {\n            var fa = JSBNG__event.getTarget();\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            if (((!t || k.isInputNode(fa)))) {\n                return;\n            }\n        ;\n        ;\n            var ga = g.getKeyCode(JSBNG__event), ha;\n            switch (ga) {\n              case m.UP:\n            \n              case m.DOWN:\n                var ia = da.getEnabledItems(t);\n                ha = w(ia);\n                da.focusItem(ia[((ha + ((((ga === m.UP)) ? -1 : 1))))]);\n                return false;\n              case m.SPACE:\n                var ja = v(fa);\n                if (ja) {\n                    ba(ja);\n                    JSBNG__event.prevent();\n                }\n            ;\n            ;\n                break;\n              default:\n                var ka = String.fromCharCode(ga).toLowerCase(), la = da.getEnabledItems(t);\n                ha = w(la);\n                var ma = ha, na = la.length;\n                while (((((~ha && (((ma = ((++ma % na))) !== ha)))) || ((!~ha && ((++ma < na))))))) {\n                    var oa = da.getItemLabel(la[ma]);\n                    if (((oa && ((oa.charAt(0).toLowerCase() === ka))))) {\n                        da.focusItem(la[ma]);\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n        };\n        g.listen(JSBNG__document.body, ea);\n    }, da = q(new h(), {\n        focusItem: function(ea) {\n            if (((ea && z(ea)))) {\n                this._removeSelected(u(ea));\n                i.addClass(ea, \"selected\");\n                x(ea).JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        getEnabledItems: function(ea) {\n            return da.getItems(ea).filter(z);\n        },\n        getCheckedItems: function(ea) {\n            return da.getItems(ea).filter(y);\n        },\n        getItems: function(ea) {\n            return k.scry(ea, \"li.uiMenuItem\");\n        },\n        getItemLabel: function(ea) {\n            return ((ea.getAttribute(\"data-label\", 2) || \"\"));\n        },\n        isItemChecked: function(ea) {\n            return i.hasClass(ea, \"checked\");\n        },\n        autoregister: function(ea, fa, ga) {\n            ea.subscribe(\"show\", function() {\n                da.register(fa, ga);\n            });\n            ea.subscribe(\"hide\", function() {\n                da.unregister(fa);\n            });\n        },\n        register: function(ea, fa) {\n            ea = u(ea);\n            ca();\n            if (!j.get(ea, s)) {\n                j.set(ea, s, g.listen(ea, \"mouseover\", aa));\n            }\n        ;\n        ;\n            if (((fa !== false))) {\n                t = ea;\n            }\n        ;\n        ;\n        },\n        setItemEnabled: function(ea, fa) {\n            if (((!fa && !k.scry(ea, \"span.disabledAnchor\")[0]))) {\n                k.appendContent(ea, k.create(\"span\", {\n                    className: ((k.JSBNG__find(ea, \"a\").className + \" disabledAnchor\"))\n                }, l(x(ea).innerHTML)));\n            }\n        ;\n        ;\n            i.conditionClass(ea, \"disabled\", !fa);\n        },\n        toggleItem: function(ea) {\n            var fa = !da.isItemChecked(ea);\n            da.setItemChecked(ea, fa);\n        },\n        setItemChecked: function(ea, fa) {\n            i.conditionClass(ea, \"checked\", fa);\n            x(ea).setAttribute(\"aria-checked\", fa);\n        },\n        unregister: function(ea) {\n            ea = u(ea);\n            var fa = j.remove(ea, s);\n            ((fa && fa.remove()));\n            t = null;\n            this._removeSelected(ea);\n        },\n        _removeSelected: function(ea) {\n            da.getItems(ea).filter(function(fa) {\n                return i.hasClass(fa, \"selected\");\n            }).forEach(function(fa) {\n                i.removeClass(fa, \"selected\");\n            });\n        }\n    });\n    e.exports = da;\n});\n__d(\"coalesce\", [], function(a, b, c, d, e, f) {\n    function g() {\n        for (var h = 0; ((h < arguments.length)); ++h) {\n            if (((arguments[h] != null))) {\n                return arguments[h];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    e.exports = g;\n});\n__d(\"OnVisible\", [\"Arbiter\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"Vector\",\"ViewportBounds\",\"coalesce\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"Parent\"), k = b(\"Run\"), l = b(\"Vector\"), m = b(\"ViewportBounds\"), n = b(\"coalesce\"), o = b(\"copyProperties\"), p = b(\"queryThenMutateDOM\"), q = [], r, s = 0, t = [], u, v, w, x, y;\n    function z() {\n        q.forEach(function(fa) {\n            fa.remove();\n        });\n        if (v) {\n            v.remove();\n            u.remove();\n            r.unsubscribe();\n            v = u = r = null;\n        }\n    ;\n    ;\n        s = 0;\n        q.length = 0;\n    };\n;\n    function aa() {\n        if (!q.length) {\n            z();\n            return;\n        }\n    ;\n    ;\n        t.length = 0;\n        w = l.getScrollPosition().y;\n        x = l.getViewportDimensions().y;\n        y = m.getTop();\n        for (var fa = 0; ((fa < q.length)); ++fa) {\n            var ga = q[fa];\n            if (isNaN(ga.elementHeight)) {\n                t.push(fa);\n            }\n        ;\n        ;\n            ga.elementHeight = l.getElementDimensions(ga.element).y;\n            ga.elementPos = l.getElementPosition(ga.element);\n            ga.hidden = j.byClass(ga.element, \"hidden_elem\");\n            if (ga.scrollArea) {\n                ga.scrollAreaHeight = l.getElementDimensions(ga.scrollArea).y;\n                ga.scrollAreaY = l.getElementPosition(ga.scrollArea).y;\n            }\n        ;\n        ;\n        };\n    ;\n        s = fa;\n    };\n;\n    function ba() {\n        for (var fa = ((Math.min(q.length, s) - 1)); ((fa >= 0)); --fa) {\n            var ga = q[fa];\n            if (((((!ga.elementPos || ga.removed)) || ga.hidden))) {\n                q.splice(fa, 1);\n                continue;\n            }\n        ;\n        ;\n            var ha = ((((w + x)) + ga.buffer)), ia = false;\n            if (((ha > ga.elementPos.y))) {\n                var ja = ((!ga.strict || ((((((w + y)) - ga.buffer)) < ((ga.elementPos.y + ga.elementHeight))))));\n                ia = ja;\n                if (((ia && ga.scrollArea))) {\n                    var ka = ((((ga.scrollAreaY + ga.scrollAreaHeight)) + ga.buffer));\n                    ia = ((((ga.elementPos.y > ((ga.scrollAreaY - ga.buffer)))) && ((ga.elementPos.y < ka))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((ga.inverse ? !ia : ia))) {\n                ga.remove();\n                ga.handler(((t.indexOf(fa) !== -1)));\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function ca() {\n        da();\n        if (q.length) {\n            return;\n        }\n    ;\n    ;\n        v = i.listen(window, \"JSBNG__scroll\", da);\n        u = i.listen(window, \"resize\", da);\n        r = g.subscribe(\"dom-scroll\", da);\n    };\n;\n    function da() {\n        p(aa, ba, \"OnVisible/positionCheck\");\n    };\n;\n    function ea(fa, ga, ha, ia, ja, ka) {\n        this.element = fa;\n        this.handler = ga;\n        this.strict = ha;\n        this.buffer = n(ia, 300);\n        this.inverse = n(ja, false);\n        this.scrollArea = ((ka || null));\n        if (this.scrollArea) {\n            this.scrollAreaListener = i.listen(h.JSBNG__find(ka, \".uiScrollableAreaWrap\"), \"JSBNG__scroll\", this.checkBuffer);\n        }\n    ;\n    ;\n        if (((q.length === 0))) {\n            k.onLeave(z);\n        }\n    ;\n    ;\n        ca();\n        q.push(this);\n    };\n;\n    o(ea, {\n        checkBuffer: da\n    });\n    o(ea.prototype, {\n        remove: function() {\n            this.removed = true;\n            if (this.scrollAreaListener) {\n                this.scrollAreaListener.remove();\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this.elementHeight = null;\n            this.removed = false;\n            ((((q.indexOf(this) === -1)) && q.push(this)));\n            ca();\n        },\n        setBuffer: function(fa) {\n            this.buffer = fa;\n            da();\n        },\n        checkBuffer: function() {\n            da();\n        }\n    });\n    e.exports = ea;\n});\n__d(\"OnloadHooks\", [\"Arbiter\",\"ErrorUtils\",\"InitialJSLoader\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"InitialJSLoader\"), j = b(\"OnloadEvent\");\n    function k() {\n        var r = a.CavalryLogger;\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_prehooks\");\n        }\n    ;\n    ;\n        n(\"onloadhooks\");\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_hooks\");\n        }\n    ;\n    ;\n        window.loaded = true;\n        g.inform(\"uipage_onload\", true, g.BEHAVIOR_STATE);\n    };\n;\n    function l() {\n        n(\"onafterloadhooks\");\n        window.afterloaded = true;\n    };\n;\n    function m(r, s) {\n        return h.applyWithGuard(r, null, null, function(t) {\n            t.event_type = s;\n            t.category = \"runhook\";\n        });\n    };\n;\n    function n(r) {\n        var s = ((((r == \"onbeforeleavehooks\")) || ((r == \"onbeforeunloadhooks\"))));\n        do {\n            var t = window[r];\n            if (!t) {\n                break;\n            }\n        ;\n        ;\n            if (!s) {\n                window[r] = null;\n            }\n        ;\n        ;\n            for (var u = 0; ((u < t.length)); u++) {\n                var v = m(t[u], r);\n                if (((s && v))) {\n                    return v;\n                }\n            ;\n            ;\n            };\n        ;\n        } while (((!s && window[r])));\n    };\n;\n    function o() {\n        if (!window.loaded) {\n            window.loaded = true;\n            n(\"onloadhooks\");\n        }\n    ;\n    ;\n        if (!window.afterloaded) {\n            window.afterloaded = true;\n            n(\"onafterloadhooks\");\n        }\n    ;\n    ;\n    };\n;\n    function p() {\n        g.registerCallback(k, [j.ONLOAD_DOMCONTENT_CALLBACK,i.INITIAL_JS_READY,]);\n        g.registerCallback(l, [j.ONLOAD_DOMCONTENT_CALLBACK,j.ONLOAD_CALLBACK,i.INITIAL_JS_READY,]);\n        g.subscribe(j.ONBEFOREUNLOAD, function(r, s) {\n            s.warn = ((n(\"onbeforeleavehooks\") || n(\"onbeforeunloadhooks\")));\n            if (!s.warn) {\n                window.loaded = false;\n                window.afterloaded = false;\n            }\n        ;\n        ;\n        }, g.SUBSCRIBE_NEW);\n        g.subscribe(j.ONUNLOAD, function(r, s) {\n            n(\"onunloadhooks\");\n            n(\"onafterunloadhooks\");\n        }, g.SUBSCRIBE_NEW);\n    };\n;\n    var q = {\n        _onloadHook: k,\n        _onafterloadHook: l,\n        runHook: m,\n        runHooks: n,\n        keepWindowSetAsLoaded: o\n    };\n    p();\n    a.OnloadHooks = e.exports = q;\n});\n__d(\"areEqual\", [], function(a, b, c, d, e, f) {\n    var g = function(k, l, m, n) {\n        if (((k === l))) {\n            return ((((k !== 0)) || ((((1 / k)) == ((1 / l))))));\n        }\n    ;\n    ;\n        if (((((k == null)) || ((l == null))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((((typeof k != \"object\")) || ((typeof l != \"object\"))))) {\n            return false;\n        }\n    ;\n    ;\n        var o = Object.prototype.toString, p = o.call(k);\n        if (((p != o.call(l)))) {\n            return false;\n        }\n    ;\n    ;\n        switch (p) {\n          case \"[object String]\":\n            return ((k == String(l)));\n          case \"[object Number]\":\n            return ((((isNaN(k) || isNaN(l))) ? false : ((k == Number(l)))));\n          case \"[object Date]\":\n        \n          case \"[object Boolean]\":\n            return ((+k == +l));\n          case \"[object RegExp]\":\n            return ((((((((k.source == l.source)) && ((k.global == l.global)))) && ((k.multiline == l.multiline)))) && ((k.ignoreCase == l.ignoreCase))));\n        };\n    ;\n        var q = m.length;\n        while (q--) {\n            if (((m[q] == k))) {\n                return ((n[q] == l));\n            }\n        ;\n        ;\n        };\n    ;\n        m.push(k);\n        n.push(l);\n        var r = 0;\n        if (((p === \"[object Array]\"))) {\n            r = k.length;\n            if (((r !== l.length))) {\n                return false;\n            }\n        ;\n        ;\n            while (r--) {\n                if (!g(k[r], l[r], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else {\n            if (((k.constructor !== l.constructor))) {\n                return false;\n            }\n        ;\n        ;\n            if (((k.hasOwnProperty(\"valueOf\") && l.hasOwnProperty(\"valueOf\")))) {\n                return ((k.valueOf() == l.valueOf()));\n            }\n        ;\n        ;\n            var s = Object.keys(k);\n            if (((s.length != Object.keys(l).length))) {\n                return false;\n            }\n        ;\n        ;\n            for (var t = 0; ((t < s.length)); t++) {\n                if (!g(k[s[t]], l[s[t]], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        m.pop();\n        n.pop();\n        return true;\n    }, h = [], i = [], j = function(k, l) {\n        var m = ((h.length ? h.pop() : [])), n = ((i.length ? i.pop() : [])), o = g(k, l, m, n);\n        m.length = 0;\n        n.length = 0;\n        h.push(m);\n        i.push(n);\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"computeRelativeURI\", [\"URI\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"isEmpty\");\n    function i(k, l) {\n        if (!l) {\n            return k;\n        }\n    ;\n    ;\n        if (((l.charAt(0) == \"/\"))) {\n            return l;\n        }\n    ;\n    ;\n        var m = k.split(\"/\").slice(0, -1);\n        ((m[0] !== \"\"));\n        l.split(\"/\").forEach(function(n) {\n            if (!((n == \".\"))) {\n                if (((n == \"..\"))) {\n                    if (((m.length > 1))) {\n                        m = m.slice(0, -1);\n                    }\n                ;\n                ;\n                }\n                 else m.push(n);\n            ;\n            }\n        ;\n        ;\n        });\n        return m.join(\"/\");\n    };\n;\n    function j(k, l) {\n        var m = new g(), n = l;\n        k = new g(k);\n        l = new g(l);\n        if (((l.getDomain() && !l.isFacebookURI()))) {\n            return n;\n        }\n    ;\n    ;\n        var o = k, p = [\"Protocol\",\"Domain\",\"Port\",\"Path\",\"QueryData\",\"Fragment\",];\n        p.forEach(function(q) {\n            var r = ((((q == \"Path\")) && ((o === k))));\n            if (r) {\n                m.setPath(i(k.getPath(), l.getPath()));\n            }\n        ;\n        ;\n            if (!h(l[((\"get\" + q))]())) {\n                o = l;\n            }\n        ;\n        ;\n            if (!r) {\n                m[((\"set\" + q))](o[((\"get\" + q))]());\n            }\n        ;\n        ;\n        });\n        return m;\n    };\n;\n    e.exports = j;\n});\n__d(\"escapeJSQuotes\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (((((((typeof h == \"undefined\")) || ((h == null)))) || !h.valueOf()))) {\n            return \"\";\n        }\n    ;\n    ;\n        return h.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, \"\\\\x22\").replace(/'/g, \"\\\\'\").replace(/</g, \"\\\\x3c\").replace(/>/g, \"\\\\x3e\").replace(/&/g, \"\\\\x26\");\n    };\n;\n    e.exports = g;\n});\n__d(\"PageTransitions\", [\"Arbiter\",\"Dialog\",\"DOMQuery\",\"DOMScroll\",\"Env\",\"JSBNG__Event\",\"Form\",\"HistoryManager\",\"JSLogger\",\"LinkController\",\"OnloadHooks\",\"Parent\",\"URI\",\"UserAgent\",\"Vector\",\"areEqual\",\"clickRefAction\",\"computeRelativeURI\",\"copyProperties\",\"escapeJSQuotes\",\"ge\",\"goOrReplace\",\"htmlize\",\"setTimeoutAcrossTransitions\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Dialog\"), i = b(\"DOMQuery\"), j = b(\"DOMScroll\"), k = b(\"Env\"), l = b(\"JSBNG__Event\"), m = b(\"Form\"), n = b(\"HistoryManager\"), o = b(\"JSLogger\"), p = b(\"LinkController\"), q = b(\"OnloadHooks\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"areEqual\"), w = b(\"clickRefAction\"), x = b(\"computeRelativeURI\"), y = b(\"copyProperties\"), z = b(\"escapeJSQuotes\"), aa = b(\"ge\"), ba = b(\"goOrReplace\"), ca = b(\"htmlize\"), da = b(\"setTimeoutAcrossTransitions\"), ea = b(\"startsWith\"), fa = b(\"tx\"), ga = b(\"userAction\"), ha = {\n    };\n    function ia(ta, ua) {\n        ha[ta.getUnqualifiedURI()] = ua;\n    };\n;\n    function ja(ta) {\n        return ha[ta.getUnqualifiedURI()];\n    };\n;\n    function ka(ta) {\n        delete ha[ta.getUnqualifiedURI()];\n    };\n;\n    var la = null, ma = null;\n    function na(ta) {\n        ma = ta;\n        da(function() {\n            ma = null;\n        }, 0);\n    };\n;\n    function oa(JSBNG__event) {\n        if (ma) {\n            if (!JSBNG__event.isDefaultPrevented()) {\n                pa(ma);\n                sa.lookBusy(ma);\n                ra.go(ma.getAttribute(\"href\"));\n            }\n        ;\n        ;\n            JSBNG__event.prevent();\n        }\n         else {\n            la = JSBNG__event.getTarget();\n            da(function() {\n                la = null;\n            }, 0);\n        }\n    ;\n    ;\n    };\n;\n    function pa(ta) {\n        var ua = ta.getAttribute(\"href\"), va = x(ra._most_recent_uri.getQualifiedURI(), ua).toString();\n        if (((ua != va))) {\n            ta.setAttribute(\"href\", va);\n        }\n    ;\n    ;\n    };\n;\n    function qa(JSBNG__event) {\n        var ta = JSBNG__event.getTarget();\n        if (((m.getAttribute(ta, \"rel\") || m.getAttribute(ta, \"target\")))) {\n            return;\n        }\n    ;\n    ;\n        w(\"form\", ta, JSBNG__event).set_namespace(\"page_transition\");\n        var ua = ga(\"page_transitions\", ta, JSBNG__event, {\n            mode: \"DEDUP\"\n        }).uai_fallback(null, \"form\"), va = a.ArbiterMonitor;\n        if (va) {\n            va.initUA(ua, [ta,]);\n        }\n    ;\n    ;\n        var wa = new s(((m.getAttribute(ta, \"action\") || \"\"))), xa = x(ra._most_recent_uri, wa);\n        ta.setAttribute(\"action\", xa.toString());\n        if (((((m.getAttribute(ta, \"method\") || \"GET\")).toUpperCase() === \"GET\"))) {\n            var ya = m.serialize(ta), za = la;\n            if (((((za && ((((i.isNodeOfType(za, \"input\") && ((za.type === \"submit\")))) || (za = r.byTag(za, \"button\")))))) && za.JSBNG__name))) {\n                ya[za.JSBNG__name] = za.value;\n            }\n        ;\n        ;\n            ra.go(xa.addQueryData(ya));\n            JSBNG__event.kill();\n        }\n    ;\n    ;\n    };\n;\n    var ra = {\n        _transition_handlers: [],\n        _scroll_locked: false,\n        isInitialized: function() {\n            return !!ra._initialized;\n        },\n        _init: function() {\n            if (k.DISABLE_PAGE_TRANSITIONS) {\n                return;\n            }\n        ;\n        ;\n            if (((!k.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (ra._initialized) {\n                return ra;\n            }\n        ;\n        ;\n            ra._initialized = true;\n            var ta = s.getRequestURI(false), ua = ta.getUnqualifiedURI(), va = s(ua).setFragment(null), wa = ua.getFragment();\n            if (((((wa.charAt(0) === \"!\")) && ((va.toString() === wa.substr(1)))))) {\n                ua = va;\n            }\n        ;\n        ;\n            y(ra, {\n                _current_uri: ua,\n                _most_recent_uri: ua,\n                _next_uri: ua\n            });\n            var xa;\n            if (ea(ta.getFragment(), \"/\")) {\n                xa = ta.getFragment();\n            }\n             else xa = ua;\n        ;\n        ;\n            n.init().setCanonicalLocation(((\"#\" + xa))).registerURIHandler(ra._historyManagerHandler);\n            p.registerFallbackHandler(na);\n            l.listen(JSBNG__document, \"click\", oa, l.Priority._BUBBLE);\n            l.listen(JSBNG__document, \"submit\", qa, l.Priority._BUBBLE);\n            l.listen(window, \"JSBNG__scroll\", function() {\n                if (!ra._scroll_locked) {\n                    ia(ra._current_uri, u.getScrollPosition());\n                }\n            ;\n            ;\n            });\n            return ra;\n        },\n        registerHandler: function(ta, ua) {\n            ra._init();\n            ua = ((ua || 5));\n            if (!ra._transition_handlers[ua]) {\n                ra._transition_handlers[ua] = [];\n            }\n        ;\n        ;\n            ra._transition_handlers[ua].push(ta);\n        },\n        getCurrentURI: function(ta) {\n            if (((!ra._current_uri && !ta))) {\n                return new s(ra._most_recent_uri);\n            }\n        ;\n        ;\n            return new s(ra._current_uri);\n        },\n        getMostRecentURI: function() {\n            return new s(ra._most_recent_uri);\n        },\n        getNextURI: function() {\n            return new s(ra._next_uri);\n        },\n        go: function(ta, ua) {\n            var va = new s(ta).removeQueryData(\"quickling\").getQualifiedURI();\n            o.create(\"pagetransition\").debug(\"go\", {\n                uri: va.toString()\n            });\n            ka(va);\n            ((!ua && w(\"uri\", {\n                href: va.toString()\n            }, null, \"INDIRECT\")));\n            sa.lookBusy();\n            ra._loadPage(va, function(wa) {\n                if (wa) {\n                    n.go(va.toString(), false, ua);\n                }\n                 else ba(window.JSBNG__location, va, ua);\n            ;\n            ;\n            });\n        },\n        _historyManagerHandler: function(ta) {\n            if (((ta.charAt(0) != \"/\"))) {\n                return false;\n            }\n        ;\n        ;\n            w(\"h\", {\n                href: ta\n            });\n            ga(\"page_transitions\").uai(null, \"history_manager\");\n            ra._loadPage(new s(ta), function(ua) {\n                if (!ua) {\n                    ba(window.JSBNG__location, ta, true);\n                }\n            ;\n            ;\n            });\n            return true;\n        },\n        _loadPage: function(ta, ua) {\n            if (((s(ta).getFragment() && v(s(ta).setFragment(null).getQualifiedURI(), s(ra._current_uri).setFragment(null).getQualifiedURI())))) {\n                if (ra.restoreScrollPosition(ta)) {\n                    ra._current_uri = ra._most_recent_uri = ta;\n                    sa.stopLookingBusy();\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            var va;\n            if (ra._current_uri) {\n                va = ja(ra._current_uri);\n            }\n        ;\n        ;\n            ra._current_uri = null;\n            ra._next_uri = ta;\n            if (va) {\n                j.JSBNG__scrollTo(va, false);\n            }\n        ;\n        ;\n            var wa = function() {\n                ra._scroll_locked = true;\n                var ya = ra._handleTransition(ta);\n                ((ua && ua(ya)));\n            }, xa = q.runHooks(\"onbeforeleavehooks\");\n            if (xa) {\n                sa.stopLookingBusy();\n                ra._warnBeforeLeaving(xa, wa);\n            }\n             else wa();\n        ;\n        ;\n        },\n        _handleTransition: function(ta) {\n            window.onbeforeleavehooks = undefined;\n            sa.lookBusy();\n            if (!ta.isSameOrigin()) {\n                return false;\n            }\n        ;\n        ;\n            var ua = ((window.AsyncRequest && window.AsyncRequest.getLastID()));\n            g.inform(\"pre_page_transition\", {\n                from: ra.getMostRecentURI(),\n                to: ta\n            });\n            for (var va = ((ra._transition_handlers.length - 1)); ((va >= 0)); --va) {\n                var wa = ra._transition_handlers[va];\n                if (!wa) {\n                    continue;\n                }\n            ;\n            ;\n                for (var xa = ((wa.length - 1)); ((xa >= 0)); --xa) {\n                    if (((wa[xa](ta) === true))) {\n                        var ya = {\n                            sender: this,\n                            uri: ta,\n                            id: ua\n                        };\n                        try {\n                            g.inform(\"page_transition\", ya);\n                        } catch (za) {\n                        \n                        };\n                    ;\n                        return true;\n                    }\n                     else wa.splice(xa, 1);\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        unifyURI: function() {\n            ra._current_uri = ra._most_recent_uri = ra._next_uri;\n        },\n        transitionComplete: function(ta) {\n            ra._executeCompletionCallback();\n            sa.stopLookingBusy();\n            ra.unifyURI();\n            if (!ta) {\n                ra.restoreScrollPosition(ra._current_uri);\n            }\n        ;\n        ;\n            try {\n                if (((JSBNG__document.activeElement && ((JSBNG__document.activeElement.nodeName === \"A\"))))) {\n                    JSBNG__document.activeElement.JSBNG__blur();\n                }\n            ;\n            ;\n            } catch (ua) {\n            \n            };\n        ;\n        },\n        _executeCompletionCallback: function() {\n            if (ra._completionCallback) {\n                ra._completionCallback();\n            }\n        ;\n        ;\n            ra._completionCallback = null;\n        },\n        setCompletionCallback: function(ta) {\n            ra._completionCallback = ta;\n        },\n        rewriteCurrentURI: function(ta, ua) {\n            ra.registerHandler(function() {\n                if (((ta == ra.getMostRecentURI().getUnqualifiedURI().toString()))) {\n                    ra.transitionComplete();\n                    return true;\n                }\n            ;\n            ;\n            });\n            ra.go(ua, true);\n        },\n        _warnBeforeLeaving: function(ta, ua) {\n            new h().setTitle(\"Are you sure you want to leave this page?\").setBody(ca(ta)).setButtons([{\n                JSBNG__name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: ua\n            },{\n                JSBNG__name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        restoreScrollPosition: function(ta) {\n            ra._scroll_locked = false;\n            var ua = ja(ta);\n            if (ua) {\n                j.JSBNG__scrollTo(ua, false);\n                return true;\n            }\n        ;\n        ;\n            function va(ya) {\n                if (!ya) {\n                    return null;\n                }\n            ;\n            ;\n                var za = ((((\"a[name='\" + z(ya))) + \"']\"));\n                return ((i.scry(JSBNG__document.body, za)[0] || aa(ya)));\n            };\n        ;\n            var wa = va(s(ta).getFragment());\n            if (wa) {\n                var xa = u.getElementPosition(wa);\n                xa.x = 0;\n                j.JSBNG__scrollTo(xa);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    }, sa = ((window._BusyUIManager || {\n        _looking_busy: false,\n        _original_cursors: [],\n        lookBusy: function(ta) {\n            if (ta) {\n                sa._giveProgressCursor(ta);\n            }\n        ;\n        ;\n            if (sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = true;\n            sa._giveProgressCursor(JSBNG__document.documentElement);\n        },\n        stopLookingBusy: function() {\n            if (!sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = false;\n            while (sa._original_cursors.length) {\n                var ta = sa._original_cursors.pop(), ua = ta[0], va = ta[1];\n                if (ua.style) {\n                    ua.style.cursor = ((va || \"\"));\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _giveProgressCursor: function(ta) {\n            if (!t.webkit()) {\n                sa._original_cursors.push([ta,ta.style.cursor,]);\n                ta.style.cursor = \"progress\";\n            }\n        ;\n        ;\n        }\n    }));\n    e.exports = ra;\n    a.PageTransitions = ra;\n});\n__d(\"PixelRatio\", [\"Arbiter\",\"Cookie\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Cookie\"), i = b(\"Run\"), j = \"dpr\", k, l;\n    function m() {\n        return ((window.JSBNG__devicePixelRatio || 1));\n    };\n;\n    function n() {\n        h.set(j, m());\n    };\n;\n    function o() {\n        h.clear(j);\n    };\n;\n    function p() {\n        var r = m();\n        if (((r !== k))) {\n            n();\n        }\n         else o();\n    ;\n    ;\n    };\n;\n    var q = {\n        startDetecting: function(r) {\n            k = ((r || 1));\n            o();\n            if (l) {\n                return;\n            }\n        ;\n        ;\n            l = [g.subscribe(\"pre_page_transition\", p),];\n            i.onBeforeUnload(p);\n        }\n    };\n    e.exports = q;\n});\n__d(\"LayerHideOnTransition\", [\"function-extensions\",\"PageTransitions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PageTransitions\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _enabled: false,\n        _subscribed: false,\n        enable: function() {\n            this._enabled = true;\n            if (!this._subscribed) {\n                this._subscribe.bind(this).defer();\n                this._subscribed = true;\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._enabled = false;\n        },\n        _subscribe: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_523), function() {\n            g.registerHandler(function() {\n                if (this._enabled) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                this._subscribed = false;\n            }.bind(this));\n        }))\n    });\n    e.exports = i;\n});\n__d(\"JSBNG__Rect\", [\"Vector\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k, l, m, n, o) {\n        if (((arguments.length === 1))) {\n            if (((k instanceof j))) {\n                return k;\n            }\n        ;\n        ;\n            if (((k instanceof g))) {\n                return new j(k.y, k.x, k.y, k.x, k.domain);\n            }\n        ;\n        ;\n            return j.getElementBounds(h(k));\n        }\n    ;\n    ;\n        i(this, {\n            t: k,\n            r: l,\n            b: m,\n            l: n,\n            domain: ((o || \"pure\"))\n        });\n    };\n;\n    i(j.prototype, {\n        w: function() {\n            return ((this.r - this.l));\n        },\n        h: function() {\n            return ((this.b - this.t));\n        },\n        toString: function() {\n            return ((((((((((((((((\"((\" + this.l)) + \", \")) + this.t)) + \"), (\")) + this.r)) + \", \")) + this.b)) + \"))\"));\n        },\n        contains: function(k) {\n            k = new j(k).convertTo(this.domain);\n            var l = this;\n            return ((((((((l.l <= k.l)) && ((l.r >= k.r)))) && ((l.t <= k.t)))) && ((l.b >= k.b))));\n        },\n        add: function(k, l) {\n            if (((arguments.length == 1))) {\n                if (((k.domain != \"pure\"))) {\n                    k = k.convertTo(this.domain);\n                }\n            ;\n            ;\n                return this.add(k.x, k.y);\n            }\n        ;\n        ;\n            var m = parseFloat(k), n = parseFloat(l);\n            return new j(((this.t + n)), ((this.r + m)), ((this.b + n)), ((this.l + m)), this.domain);\n        },\n        sub: function(k, l) {\n            if (((arguments.length == 1))) {\n                return this.add(k.mul(-1));\n            }\n             else return this.add(-k, -l)\n        ;\n        },\n        rotateAroundOrigin: function(k) {\n            var l = this.getCenter().rotate(((((k * Math.PI)) / 2))), m, n;\n            if (((k % 2))) {\n                m = this.h();\n                n = this.w();\n            }\n             else {\n                m = this.w();\n                n = this.h();\n            }\n        ;\n        ;\n            var o = ((l.y - ((n / 2)))), p = ((l.x - ((m / 2)))), q = ((o + n)), r = ((p + m));\n            return new j(o, r, q, p);\n        },\n        boundWithin: function(k) {\n            var l = 0, m = 0;\n            if (((this.l < k.l))) {\n                l = ((k.l - this.l));\n            }\n             else if (((this.r > k.r))) {\n                l = ((k.r - this.r));\n            }\n            \n        ;\n        ;\n            if (((this.t < k.t))) {\n                m = ((k.t - this.t));\n            }\n             else if (((this.b > k.b))) {\n                m = ((k.b - this.b));\n            }\n            \n        ;\n        ;\n            return this.add(l, m);\n        },\n        getCenter: function() {\n            return new g(((this.l + ((this.w() / 2)))), ((this.t + ((this.h() / 2)))), this.domain);\n        },\n        getPositionVector: function() {\n            return new g(this.l, this.t, this.domain);\n        },\n        getDimensionVector: function() {\n            return new g(this.w(), this.h(), \"pure\");\n        },\n        convertTo: function(k) {\n            if (((this.domain == k))) {\n                return this;\n            }\n        ;\n        ;\n            if (((k == \"pure\"))) {\n                return new j(this.t, this.r, this.b, this.l, \"pure\");\n            }\n        ;\n        ;\n            if (((this.domain == \"pure\"))) {\n                return new j(0, 0, 0, 0);\n            }\n        ;\n        ;\n            var l = new g(this.l, this.t, this.domain).convertTo(k);\n            return new j(l.y, ((l.x + this.w())), ((l.y + this.h())), l.x, k);\n        }\n    });\n    i(j, {\n        deserialize: function(k) {\n            var l = k.split(\":\");\n            return new j(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]), parseFloat(l[0]));\n        },\n        newFromVectors: function(k, l) {\n            return new j(k.y, ((k.x + l.x)), ((k.y + l.y)), k.x, k.domain);\n        },\n        getElementBounds: function(k) {\n            return j.newFromVectors(g.getElementPosition(k), g.getElementDimensions(k));\n        },\n        getViewportBounds: function() {\n            return j.newFromVectors(g.getScrollPosition(), g.getViewportDimensions());\n        },\n        minimumBoundingBox: function(k) {\n            var l = new j(Math.min(), Math.max(), Math.max(), Math.min()), m;\n            for (var n = 0; ((n < k.length)); n++) {\n                m = k[n];\n                l.t = Math.min(l.t, m.t);\n                l.r = Math.max(l.r, m.r);\n                l.b = Math.max(l.b, m.b);\n                l.l = Math.min(l.l, m.l);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"SVGChecker\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        isSVG: function(g) {\n            return ((!!g.ownerSVGElement || ((g.tagName.toLowerCase() === \"svg\"))));\n        },\n        isDisplayed: function(g) {\n            try {\n                var i = g.getBBox();\n                if (((i && ((((i.height === 0)) || ((i.width === 0))))))) {\n                    return false;\n                }\n            ;\n            ;\n            } catch (h) {\n                return false;\n            };\n        ;\n            return true;\n        }\n    };\n});\n__d(\"arrayContains\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i) != -1));\n    };\n;\n    e.exports = g;\n});\n__d(\"ContextualLayer\", [\"JSBNG__Event\",\"Arbiter\",\"ARIA\",\"Class\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerHideOnTransition\",\"Locale\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"Vector\",\"SVGChecker\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",\"getOverlayZIndex\",\"removeFromArray\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"Class\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Layer\"), p = b(\"LayerHideOnTransition\"), q = b(\"Locale\"), r = b(\"Parent\"), s = b(\"JSBNG__Rect\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"SVGChecker\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"getOverlayZIndex\"), aa = b(\"removeFromArray\"), ba = b(\"throttle\");\n    function ca(ja) {\n        return ((((ja.getPosition() === \"left\")) || ((ja.isVertical() && ((ja.getAlignment() === \"right\"))))));\n    };\n;\n    function da(ja) {\n        var ka = ja.parentNode;\n        if (ka) {\n            var la = t.get(ka, \"position\");\n            if (((la === \"static\"))) {\n                if (((ka === JSBNG__document.body))) {\n                    ka = JSBNG__document.documentElement;\n                }\n                 else ka = da(ka);\n            ;\n            ;\n            }\n             else return ka\n        ;\n        }\n         else ka = JSBNG__document.documentElement;\n    ;\n    ;\n        return ka;\n    };\n;\n    function ea(ja, ka) {\n        this.parent.construct(this, ja, ka);\n    };\n;\n    var fa = [];\n    h.subscribe(\"reflow\", function() {\n        fa.forEach(function(ja) {\n            if (((ja.updatePosition() === false))) {\n                ja.hide();\n            }\n        ;\n        ;\n        });\n    });\n    j.extend(ea, o);\n    x(ea.prototype, {\n        _contentWrapper: null,\n        _content: null,\n        _contextNode: null,\n        _contextBounds: null,\n        _contextSelector: null,\n        _parentLayer: null,\n        _parentSubscription: null,\n        _orientation: null,\n        _orientationClass: null,\n        _shouldSetARIAProperties: true,\n        _configure: function(ja, ka) {\n            this.parent._configure(ja, ka);\n            if (ja.context) {\n                this.setContext(ja.context);\n            }\n             else if (ja.contextID) {\n                this._setContextID(ja.contextID);\n            }\n             else if (ja.contextSelector) {\n                this._setContextSelector(ja.contextSelector);\n            }\n            \n            \n        ;\n        ;\n            this.setPosition(ja.position);\n            this.setAlignment(ja.alignment);\n            this.setOffsetX(ja.offsetX);\n            this.setOffsetY(ja.offsetY);\n            this._content = ka;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([p,]);\n        },\n        _buildWrapper: function(ja, ka) {\n            this._contentWrapper = n.create(\"div\", {\n                className: \"uiContextualLayer\"\n            }, ka);\n            return n.create(\"div\", {\n                className: \"uiContextualLayerPositioner\"\n            }, this._contentWrapper);\n        },\n        getInsertParent: function() {\n            var ja = this._insertParent;\n            if (!ja) {\n                var ka = this.getContext();\n                if (ka) {\n                    ja = r.byClass(ka, \"uiContextualLayerParent\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ((ja || this.parent.getInsertParent()));\n        },\n        setContent: function(ja) {\n            this._content = ja;\n            n.setContent(this._contentWrapper, this._content);\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setContext: function(ja) {\n            return this.setContextWithBounds(ja, null);\n        },\n        setContextWithBounds: function(ja, ka) {\n            this._contextNode = ja;\n            this._contextBounds = ((ka || null));\n            this._contextSelector = this._contextScrollParent = null;\n            if (this._shown) {\n                k.register(this.getRoot(), this._contextNode);\n                this.updatePosition();\n            }\n        ;\n        ;\n            this._setParentSubscription();\n            this.setARIAProperties();\n            return this;\n        },\n        shouldSetARIAProperties: function(ja) {\n            this._shouldSetARIAProperties = ja;\n            return this;\n        },\n        setARIAProperties: function() {\n            if (this._shouldSetARIAProperties) {\n                i.setPopup(this.getCausalElement(), this.getRoot());\n            }\n        ;\n        ;\n            return this;\n        },\n        _setContextID: function(ja) {\n            this._contextSelector = ((\"#\" + ja));\n            this._contextNode = null;\n        },\n        _setContextSelector: function(ja) {\n            this._contextSelector = ja;\n            this._contextNode = null;\n        },\n        getCausalElement: function() {\n            return ((this.parent.getCausalElement() || this.getContext()));\n        },\n        _setParentSubscription: function() {\n            var ja = this.getContext(), ka = null;\n            while (((ja !== null))) {\n                ka = m.get(ja, \"layer\");\n                if (ka) {\n                    break;\n                }\n            ;\n            ;\n                ja = ja.parentNode;\n            };\n        ;\n            if (((ka === this._parentLayer))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._parentLayer && this._parentSubscription))) {\n                this._parentLayer.unsubscribe(this._parentSubscription);\n                this._parentSubscription = null;\n            }\n        ;\n        ;\n            if (ka) {\n                this._parentSubscription = ka.subscribe(\"hide\", this.hide.bind(this));\n            }\n        ;\n        ;\n            this._parentLayer = ka;\n        },\n        setPosition: function(ja) {\n            if (this._getOrientation().setDefaultPosition(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setAlignment: function(ja) {\n            if (this._getOrientation().setDefaultAlignment(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetX: function(ja) {\n            if (this._getOrientation().setDefaultOffsetX(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetY: function(ja) {\n            if (this._getOrientation().setDefaultOffsetY(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        _getOrientation: function() {\n            if (!this._orientation) {\n                this._orientation = new ia();\n            }\n        ;\n        ;\n            return this._orientation;\n        },\n        getContentRoot: function() {\n            return this._contentWrapper;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            if (!this._contextNode) {\n                this._contextNode = n.JSBNG__find(JSBNG__document, this._contextSelector);\n            }\n        ;\n        ;\n            return this._contextNode;\n        },\n        getContextBounds: function(ja) {\n            if (this._contextBounds) {\n                return this._contextBounds.convertTo(ja);\n            }\n        ;\n        ;\n            var ka = this.getContext();\n            return s.newFromVectors(u.getElementPosition(ka, ja), u.getElementDimensions(ka));\n        },\n        getContextScrollParent: function() {\n            if (!this._contextScrollParent) {\n                this._contextScrollParent = t.getScrollParent(this.getContext());\n            }\n        ;\n        ;\n            return this._contextScrollParent;\n        },\n        setInsertParent: function(ja) {\n            this._insertScrollParent = null;\n            return this.parent.setInsertParent(ja);\n        },\n        getInsertScrollParent: function() {\n            if (!this._insertScrollParent) {\n                this._insertScrollParent = t.getScrollParent(this.getInsertParent());\n            }\n        ;\n        ;\n            return this._insertScrollParent;\n        },\n        show: function() {\n            if (this._shown) {\n                return this;\n            }\n        ;\n        ;\n            this.parent.show();\n            if (this._shown) {\n                k.register(this.getRoot(), this.getContext());\n                fa.push(this);\n                this._resizeListener = ((this._resizeListener || g.listen(window, \"resize\", ba(this.updatePosition.bind(this)))));\n            }\n        ;\n        ;\n            return this;\n        },\n        finishHide: function() {\n            aa(fa, this);\n            ((this._resizeListener && this._resizeListener.remove()));\n            this._resizeListener = null;\n            return this.parent.finishHide();\n        },\n        isFixed: function() {\n            return ((t.isFixed(this.getContext()) && !t.isFixed(this.getInsertParent())));\n        },\n        updatePosition: function() {\n            var ja = this.getContext();\n            if (!ja) {\n                return false;\n            }\n        ;\n        ;\n            var ka = this.isFixed();\n            if (((!ka && !((ja.offsetParent || ((v.isSVG(ja) && v.isDisplayed(ja)))))))) {\n                return false;\n            }\n        ;\n        ;\n            var la = this.getRoot();\n            t.set(la, \"width\", ((u.getViewportDimensions().x + \"px\")));\n            var ma = this._getOrientation();\n            this.inform(\"adjust\", ma.reset());\n            if (!ma.isValid()) {\n                return false;\n            }\n        ;\n        ;\n            this._updateWrapperPosition(ma);\n            this._updateWrapperClass(ma);\n            l.conditionClass(la, \"uiContextualLayerPositionerFixed\", ka);\n            var na, oa, pa = ((ka ? \"viewport\" : \"JSBNG__document\")), qa = ((ka ? JSBNG__document.documentElement : da(la)));\n            if (((qa === JSBNG__document.documentElement))) {\n                na = new u(0, 0);\n                oa = JSBNG__document.documentElement.clientWidth;\n            }\n             else if (!la.offsetParent) {\n                return false;\n            }\n             else {\n                na = u.getElementPosition(qa, pa);\n                oa = qa.offsetWidth;\n                if (((qa !== JSBNG__document.body))) {\n                    na = na.sub(new u(qa.scrollLeft, qa.scrollTop));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ra = this.getContextBounds(pa), sa = ((ra.l - na.x)), ta = ((ra.t - na.y)), ua = ra.h(), va = ra.w(), wa = q.isRTL();\n            if (((ma.getPosition() === \"below\"))) {\n                ta += ua;\n            }\n        ;\n        ;\n            if (((((((ma.getPosition() === \"right\")) || ((ma.isVertical() && ((ma.getAlignment() === \"right\")))))) != wa))) {\n                sa += va;\n            }\n        ;\n        ;\n            var xa = ma.getOffsetX();\n            if (((ma.isVertical() && ((ma.getAlignment() === \"center\"))))) {\n                xa += ((((va - this.getContentRoot().offsetWidth)) / 2));\n            }\n        ;\n        ;\n            if (wa) {\n                xa *= -1;\n            }\n        ;\n        ;\n            var ya = \"left\", za = Math.floor(((sa + xa)));\n            if (((ca(ma) !== wa))) {\n                ya = \"right\";\n                za = ((oa - za));\n            }\n        ;\n        ;\n            t.set(la, ya, ((za + \"px\")));\n            t.set(la, ((((ya === \"left\")) ? \"right\" : \"left\")), \"\");\n            var ab = this.getInsertScrollParent(), bb;\n            if (((ab !== window))) {\n                bb = ab.clientWidth;\n            }\n             else bb = JSBNG__document.documentElement.clientWidth;\n        ;\n        ;\n            var cb = u.getElementPosition(la).x;\n            if (((ya === \"left\"))) {\n                if (((((bb - cb)) > 0))) {\n                    t.set(la, \"width\", ((((bb - cb)) + \"px\")));\n                }\n                 else t.set(la, \"width\", \"\");\n            ;\n            ;\n            }\n             else t.set(la, \"width\", ((((cb + la.offsetWidth)) + \"px\")));\n        ;\n        ;\n            t.set(la, \"JSBNG__top\", ((((ta + ma.getOffsetY())) + \"px\")));\n            var db = z(ja, this.getInsertParent());\n            t.set(la, \"z-index\", ((((db > 200)) ? db : \"\")));\n            this.inform(\"reposition\", ma);\n            return true;\n        },\n        _updateWrapperPosition: function(ja) {\n            var ka = ((ja.getPosition() === \"above\"));\n            t.set(this._contentWrapper, \"bottom\", ((ka ? \"0\" : null)));\n            var la = ((q.isRTL() ? \"left\" : \"right\")), ma = ca(ja);\n            t.set(this._contentWrapper, la, ((ma ? \"0\" : null)));\n        },\n        _updateWrapperClass: function(ja) {\n            var ka = ja.getClassName();\n            if (((ka === this._orientationClass))) {\n                return;\n            }\n        ;\n        ;\n            if (this._orientationClass) {\n                l.removeClass(this._contentWrapper, this._orientationClass);\n            }\n        ;\n        ;\n            this._orientationClass = ka;\n            l.addClass(this._contentWrapper, ka);\n        },\n        simulateOrientation: function(ja, ka) {\n            var la = ja.getClassName();\n            if (((la === this._orientationClass))) {\n                return ka();\n            }\n             else {\n                if (this._orientationClass) {\n                    l.removeClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                l.addClass(this._contentWrapper, la);\n                var ma = ka();\n                l.removeClass(this._contentWrapper, la);\n                if (this._orientationClass) {\n                    l.addClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                return ma;\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.parent.destroy();\n            this._contentWrapper = null;\n            this._content = null;\n            return this;\n        }\n    });\n    var ga = y.thatReturnsArgument, ha = y.thatReturnsArgument;\n    function ia() {\n        this._default = {\n            _position: \"above\",\n            _alignment: \"left\",\n            _offsetX: 0,\n            _offsetY: 0,\n            _valid: true\n        };\n        this.reset();\n    };\n;\n    ia.OPPOSITE = {\n        above: \"below\",\n        below: \"above\",\n        left: \"right\",\n        right: \"left\"\n    };\n    x(ia.prototype, {\n        setPosition: function(ja) {\n            this._position = ga(ja);\n            return this;\n        },\n        setAlignment: function(ja) {\n            this._alignment = ha(ja);\n            return this;\n        },\n        getOppositePosition: function() {\n            return ia.OPPOSITE[this.getPosition()];\n        },\n        invalidate: function() {\n            this._valid = false;\n            return this;\n        },\n        getPosition: function() {\n            return ((this._position || \"above\"));\n        },\n        getAlignment: function() {\n            return ((this._alignment || \"left\"));\n        },\n        getOffsetX: function() {\n            var ja = ((this._offsetX || 0));\n            if (!this.isVertical()) {\n                if (((this._default._position !== this._position))) {\n                    ja *= -1;\n                }\n            ;\n            ;\n            }\n             else if (((this._default._alignment !== this._alignment))) {\n                ja *= -1;\n            }\n            \n        ;\n        ;\n            return ja;\n        },\n        getOffsetY: function() {\n            var ja = ((this._offsetY || 0));\n            if (((this.isVertical() && ((this._default._position !== this._position))))) {\n                ja *= -1;\n            }\n        ;\n        ;\n            return ja;\n        },\n        getClassName: function() {\n            var ja = this.getAlignment(), ka = this.getPosition();\n            if (((ka === \"below\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerBelowLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerBelowRight\";\n                }\n                 else return \"uiContextualLayerBelowCenter\"\n                \n            ;\n            }\n             else if (((ka === \"above\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerAboveLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerAboveRight\";\n                }\n                 else return \"uiContextualLayerAboveCenter\"\n                \n            ;\n            }\n             else if (((ka === \"left\"))) {\n                return \"uiContextualLayerLeft\";\n            }\n             else return \"uiContextualLayerRight\"\n            \n            \n        ;\n        },\n        isValid: function() {\n            return this._valid;\n        },\n        isVertical: function() {\n            return ((((this.getPosition() === \"above\")) || ((this.getPosition() === \"below\"))));\n        },\n        reset: function(ja, ka) {\n            x(this, this._default);\n            return this;\n        },\n        setDefaultPosition: function(ja) {\n            var ka = this._default._position;\n            this._default._position = ga(ja);\n            return ((ka !== ja));\n        },\n        setDefaultAlignment: function(ja) {\n            var ka = this._default._alignment;\n            this._default._alignment = ha(ja);\n            return ((ka !== ja));\n        },\n        setDefaultOffsetX: function(ja) {\n            var ka = this._default._offsetX;\n            this._default._offsetX = ja;\n            return ((ka !== ja));\n        },\n        setDefaultOffsetY: function(ja) {\n            var ka = this._default._offsetY;\n            this._default._offsetY = ja;\n            return ((ka !== ja));\n        }\n    });\n    e.exports = ea;\n});\n__d(\"ContextualLayerHideOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"contextchange\", this._handleContextChange.bind(this)),this._layer.subscribe(\"show\", this.attach.bind(this)),this._layer.subscribe(\"hide\", this.detach.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        attach: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            if (((j === window))) {\n                return;\n            }\n        ;\n        ;\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.hide.bind(this._layer));\n        },\n        detach: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        },\n        _handleContextChange: function() {\n            this.detach();\n            if (this._layer.isShown()) {\n                this.attach();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnEscape\", [\"JSBNG__Event\",\"copyProperties\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Keys\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"key\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (((g.getKeyCode(JSBNG__event) === i.ESC))) {\n                this._layer.hide();\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"TabbableElements\", [\"Style\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"createArrayFrom\");\n    function i(l) {\n        if (((l.tabIndex >= 0))) {\n            return true;\n        }\n    ;\n    ;\n        switch (l.tagName) {\n          case \"A\":\n            return ((l.href && ((l.rel != \"ignore\"))));\n          case \"INPUT\":\n            return ((((((l.type != \"hidden\")) && ((l.type != \"file\")))) && !l.disabled));\n          case \"BUTTON\":\n        \n          case \"SELECT\":\n        \n          case \"TEXTAREA\":\n            return !l.disabled;\n        };\n    ;\n        return false;\n    };\n;\n    function j(l) {\n        if (((((l.offsetHeight === 0)) && ((l.offsetWidth === 0))))) {\n            return false;\n        }\n    ;\n    ;\n        while (((((l !== JSBNG__document)) && ((g.get(l, \"visibility\") != \"hidden\"))))) {\n            l = l.parentNode;\n        ;\n        };\n    ;\n        return ((l === JSBNG__document));\n    };\n;\n    var k = {\n        JSBNG__find: function(l) {\n            var m = h(l.getElementsByTagName(\"*\"));\n            return m.filter(k.isTabbable);\n        },\n        isTabbable: function(l) {\n            return ((i(l) && j(l)));\n        }\n    };\n    e.exports = k;\n});\n__d(\"Toggler\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualThing\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"TabbableElements\",\"arrayContains\",\"cx\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"ge\",\"getContextualParent\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualThing\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"Dialog\"), n = b(\"DOM\"), o = b(\"DOMQuery\"), p = b(\"Focus\"), q = b(\"Parent\"), r = b(\"TabbableElements\"), s = b(\"arrayContains\"), t = b(\"cx\"), u = b(\"copyProperties\"), v = b(\"createArrayFrom\"), w = b(\"emptyFunction\"), x = b(\"ge\"), y = b(\"getContextualParent\"), z = b(\"getObjectValues\"), aa = [], ba;\n    function ca() {\n        ca = w;\n        g.listen(JSBNG__document.documentElement, \"click\", function(JSBNG__event) {\n            var ga = JSBNG__event.getTarget();\n            aa.forEach(function(ha) {\n                ha.clickedTarget = ga;\n                ((((((((((((ha.active && !ha.sticky)) && !j.containsIncludingLayers(ha.getActive(), ga))) && !ha.inTargetFlyout(ga))) && ha.inActiveDialog())) && !ha.isIgnoredByModalLayer(ga))) && ha.hide()));\n            });\n        }, g.Priority.URGENT);\n    };\n;\n    var da = function() {\n        this.active = null;\n        this.togglers = {\n        };\n        this.setSticky(false);\n        aa.push(this);\n        this.subscribe([\"show\",\"hide\",], da.inform.bind(da));\n        return ca();\n    };\n    u(da.prototype, i, {\n        show: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ga !== ia))) {\n                ((ia && ha.hide()));\n                ha.active = ga;\n                k.addClass(ga, \"openToggler\");\n                var ja = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.removeClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                var ka = o.scry(ga, \".uiToggleFlyout\")[0];\n                if (ka) {\n                    var la = ((r.JSBNG__find(ka)[0] || ka));\n                    if (((la.tabIndex == -1))) {\n                        la.tabIndex = 0;\n                    }\n                ;\n                ;\n                    p.setWithoutOutline(la);\n                }\n            ;\n            ;\n                n.appendContent(ga, ha.getToggler(\"next\"));\n                n.prependContent(ga, ha.getToggler(\"prev\"));\n                ha.inform(\"show\", ha);\n            }\n        ;\n        ;\n        },\n        hide: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ia && ((!ga || ((ga === ia))))))) {\n                k.removeClass(ia, \"openToggler\");\n                var ja = n.scry(ia, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.addClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                z(ha.togglers).forEach(n.remove);\n                ha.inform(\"hide\", ha);\n                ha.active = null;\n            }\n        ;\n        ;\n        },\n        toggle: function(ga) {\n            var ha = ea(this, ga);\n            if (((ha.active === ga))) {\n                ha.hide();\n            }\n             else ha.show(ga);\n        ;\n        ;\n        },\n        getActive: function() {\n            return ea(this).active;\n        },\n        isShown: function() {\n            return ((ea(this).active && k.hasClass(ea(this).active, \"openToggler\")));\n        },\n        inTargetFlyout: function(ga) {\n            var ha = fa(this.getActive());\n            return ((ha && j.containsIncludingLayers(ha, ga)));\n        },\n        inActiveDialog: function() {\n            var ga = m.getCurrent();\n            return ((!ga || n.contains(ga.getRoot(), this.getActive())));\n        },\n        isIgnoredByModalLayer: function(ga) {\n            return ((q.byClass(ga, \"-cx-PRIVATE-ModalLayer__root\") && !q.byClass(this.getActive(), \"-cx-PRIVATE-ModalLayer__root\")));\n        },\n        getToggler: function(ga) {\n            var ha = ea(this);\n            if (!ha.togglers[ga]) {\n                ha.togglers[ga] = n.create(\"button\", {\n                    className: \"hideToggler\",\n                    JSBNG__onfocus: function() {\n                        var ia = n.scry(ha.active, \"a[rel=\\\"toggle\\\"]\")[0];\n                        ((ia && ia.JSBNG__focus()));\n                        ha.hide();\n                    }\n                });\n                ha.togglers[ga].setAttribute(\"type\", \"button\");\n            }\n        ;\n        ;\n            return this.togglers[ga];\n        },\n        setSticky: function(ga) {\n            var ha = ea(this);\n            ga = ((ga !== false));\n            if (((ga !== ha.sticky))) {\n                ha.sticky = ga;\n                if (ga) {\n                    ((ha._pt && ha._pt.unsubscribe()));\n                }\n                 else ha._pt = h.subscribe(\"pre_page_transition\", ha.hide.bind(ha, null));\n            ;\n            ;\n            }\n        ;\n        ;\n            return ha;\n        }\n    });\n    u(da, da.prototype);\n    u(da, {\n        bootstrap: function(ga) {\n            var ha = ga.parentNode;\n            da.getInstance(ha).toggle(ha);\n        },\n        createInstance: function(ga) {\n            var ha = new da().setSticky(true);\n            l.set(ga, \"toggler\", ha);\n            return ha;\n        },\n        destroyInstance: function(ga) {\n            l.remove(ga, \"toggler\");\n        },\n        getInstance: function(ga) {\n            while (ga) {\n                var ha = l.get(ga, \"toggler\");\n                if (ha) {\n                    return ha;\n                }\n            ;\n            ;\n                if (k.hasClass(ga, \"uiToggleContext\")) {\n                    return da.createInstance(ga);\n                }\n            ;\n            ;\n                ga = y(ga);\n            };\n        ;\n            return (ba = ((ba || new da())));\n        },\n        listen: function(ga, ha, ia) {\n            return da.subscribe(v(ga), function(ja, ka) {\n                if (((ka.getActive() === ha))) {\n                    return ia(ja, ka);\n                }\n            ;\n            ;\n            });\n        },\n        subscribe: (function(ga) {\n            return function(ha, ia) {\n                ha = v(ha);\n                if (s(ha, \"show\")) {\n                    aa.forEach(function(ja) {\n                        if (ja.getActive()) {\n                            ia.curry(\"show\", ja).defer();\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return ga(ha, ia);\n            };\n        })(da.subscribe.bind(da))\n    });\n    function ea(ga, ha) {\n        if (((ga instanceof da))) {\n            return ga;\n        }\n    ;\n    ;\n        return da.getInstance(ha);\n    };\n;\n    function fa(ga) {\n        var ha = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n        if (((((ha.length > 0)) && ha[0].getAttribute(\"data-target\")))) {\n            return x(ha[0].getAttribute(\"data-target\"));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = da;\n});\n__d(\"curry\", [\"bind\",], function(a, b, c, d, e, f) {\n    var g = b(\"bind\"), h = g(null, g, null);\n    e.exports = h;\n});\n__d(\"Popover\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualLayer\",\"ContextualLayerHideOnScroll\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"Keys\",\"KeyStatus\",\"LayerHideOnEscape\",\"Toggler\",\"copyProperties\",\"curry\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerHideOnScroll\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Focus\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"LayerHideOnEscape\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"curry\");\n    s.subscribe([\"show\",\"hide\",], function(w, x) {\n        var y = m.get(x.getActive(), \"Popover\");\n        if (y) {\n            if (((w === \"show\"))) {\n                y.showLayer();\n            }\n             else y.hideLayer();\n        ;\n        }\n    ;\n    ;\n    });\n    function v(w, x, y, z) {\n        this._root = w;\n        this._triggerElem = x;\n        this._behaviors = y;\n        this._config = ((z || {\n        }));\n        this._disabled = !!this._config.disabled;\n        this._listeners = [];\n        if (((!this._disabled && ((((x.nodeName !== \"A\")) || ((x.rel !== \"toggle\"))))))) {\n            this._setupClickListener();\n        }\n    ;\n    ;\n        this._setupKeyListener();\n        x.setAttribute(\"role\", \"button\");\n        m.set(w, \"Popover\", this);\n    };\n;\n    t(v.prototype, i, {\n        _layer: null,\n        ensureInit: function() {\n            if (!this._layer) {\n                this._init();\n            }\n        ;\n        ;\n        },\n        showLayer: function() {\n            this.ensureInit();\n            this._layer.show();\n            s.show(this._root);\n            l.addClass(this._root, \"selected\");\n            this.inform(\"show\");\n            this._triggerElem.setAttribute(\"aria-expanded\", \"true\");\n        },\n        getLayer: function() {\n            return this._layer;\n        },\n        hideLayer: function() {\n            this._layer.hide();\n            this._triggerElem.setAttribute(\"aria-expanded\", \"false\");\n        },\n        isShown: function() {\n            return ((this._layer && this._layer.isShown()));\n        },\n        setLayerContent: function(w) {\n            this.ensureInit();\n            this._layer.setContent(w);\n        },\n        _init: function() {\n            var w = new j({\n                context: this._triggerElem,\n                position: \"below\"\n            }, n.create(\"div\"));\n            w.enableBehaviors([k,r,]);\n            s.createInstance(w.getRoot()).setSticky(false);\n            w.subscribe(\"hide\", this._onLayerHide.bind(this));\n            ((this._behaviors && w.enableBehaviors(this._behaviors)));\n            this._layer = w;\n            if (this._config.alignh) {\n                this._layer.setAlignment(this._config.alignh);\n            }\n        ;\n        ;\n            if (this._config.layer_content) {\n                this._layer.setContent(this._config.layer_content);\n            }\n        ;\n        ;\n            this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        _onLayerHide: function() {\n            s.hide(this._root);\n            l.removeClass(this._root, \"selected\");\n            this.inform(\"hide\");\n            if (((q.getKeyDownCode() === p.ESC))) {\n                o.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            if (!this._disabled) {\n                return;\n            }\n        ;\n        ;\n            this._setupClickListener();\n            this._setupKeyListener();\n            this._disabled = false;\n        },\n        disable: function() {\n            if (this._disabled) {\n                return;\n            }\n        ;\n        ;\n            if (this.isShown()) {\n                this.hideLayer();\n            }\n        ;\n        ;\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            if (((this._triggerElem.getAttribute(\"rel\") === \"toggle\"))) {\n                this._triggerElem.removeAttribute(\"rel\");\n            }\n        ;\n        ;\n            this._disabled = true;\n        },\n        _setupClickListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"click\", u(s.bootstrap, this._triggerElem)));\n        },\n        _setupKeyListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"keydown\", this._handleKeyEvent.bind(this)));\n        },\n        _handleKeyEvent: function(JSBNG__event) {\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case p.DOWN:\n            \n              case p.UP:\n                s.bootstrap(this._triggerElem);\n                break;\n              default:\n                return;\n            };\n        ;\n            JSBNG__event.prevent();\n        }\n    });\n    e.exports = v;\n});\n__d(\"PopoverMenu\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"BehaviorsMixin\",\"Focus\",\"Keys\",\"KeyStatus\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ARIA\"), k = b(\"BehaviorsMixin\"), l = b(\"Focus\"), m = b(\"Keys\"), n = b(\"KeyStatus\"), o = b(\"copyProperties\");\n    function p(q, r, s, t) {\n        this._popover = q;\n        this._triggerElem = r;\n        this._initialMenu = s;\n        q.subscribe(\"init\", this._onLayerInit.bind(this));\n        q.subscribe(\"show\", this._onPopoverShow.bind(this));\n        q.subscribe(\"hide\", this._onPopoverHide.bind(this));\n        g.listen(this._triggerElem, \"keydown\", this._handleKeyEventOnTrigger.bind(this));\n        ((t && this.enableBehaviors(t)));\n    };\n;\n    o(p.prototype, i, k);\n    o(p.prototype, {\n        _popoverShown: false,\n        setMenu: function(q) {\n            this._menu = q;\n            var r = q.getRoot();\n            this._popover.setLayerContent(r);\n            q.subscribe(\"done\", this._onMenuDone.bind(this));\n            if (this._popoverShown) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            j.owns(this._triggerElem, r);\n            this.inform(\"setMenu\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        getPopover: function() {\n            return this._popover;\n        },\n        getTriggerElem: function() {\n            return this._triggerElem;\n        },\n        getMenu: function() {\n            return this._menu;\n        },\n        _onLayerInit: function() {\n            this.setMenu(this._initialMenu);\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _onPopoverShow: function() {\n            if (this._menu) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            this._popoverShown = true;\n        },\n        _onPopoverHide: function() {\n            if (this._menu) {\n                this._menu.onHide();\n            }\n        ;\n        ;\n            this._popoverShown = false;\n        },\n        _handleKeyEvent: function(q, r) {\n            var s = g.getKeyCode(r);\n            if (((s === m.TAB))) {\n                this._popover.hideLayer();\n                l.set(this._triggerElem);\n                return;\n            }\n        ;\n        ;\n            if (r.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (s) {\n              case m.RETURN:\n                return;\n              case m.UP:\n            \n              case m.DOWN:\n                this._menu.handleKeydown(s, r);\n                break;\n              default:\n                if (((this._menu.handleKeydown(s, r) === false))) {\n                    this._menu.JSBNG__blur();\n                    this._menu.handleKeydown(s, r);\n                }\n            ;\n            ;\n                break;\n            };\n        ;\n            r.prevent();\n        },\n        _handleKeyEventOnTrigger: function(q) {\n            var r = g.getKeyCode(q);\n            switch (r) {\n              case m.DOWN:\n            \n              case m.UP:\n                break;\n              default:\n                var s = String.fromCharCode(r).toLowerCase();\n                if (!/^\\s?$/.test(s)) {\n                    this._popover.showLayer();\n                    this._menu.JSBNG__blur();\n                    if (((this._menu.handleKeydown(r, q) === false))) {\n                        this._popover.hideLayer();\n                        l.set(this._triggerElem);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _onMenuDone: function(q) {\n            this._popover.hideLayer.bind(this._popover).defer();\n            if (n.isKeyDown()) {\n                l.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            this._popover.enable();\n        },\n        disable: function() {\n            this._popover.disable();\n        }\n    });\n    e.exports = p;\n});\n__d(\"PopoverAsyncMenu\", [\"JSBNG__Event\",\"AsyncRequest\",\"Class\",\"PopoverMenu\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"Class\"), j = b(\"PopoverMenu\"), k = b(\"copyProperties\"), l = {\n    }, m = 0;\n    function n(o, p, q, r, s) {\n        this._endpoint = r;\n        this._loadingMenu = q;\n        this._instanceId = m++;\n        l[this._instanceId] = this;\n        this._mouseoverListener = g.listen(p, \"mouseover\", this._fetchMenu.bind(this));\n        this.parent.construct(this, o, p, null, s);\n    };\n;\n    n.setMenu = function(o, p) {\n        l[o].setMenu(p);\n    };\n    n.getInstance = function(o) {\n        return l[o];\n    };\n    i.extend(n, j);\n    k(n.prototype, {\n        _fetched: false,\n        _mouseoverListener: null,\n        _onLayerInit: function() {\n            if (!this._menu) {\n                this.setMenu(this._loadingMenu);\n            }\n        ;\n        ;\n            this._fetchMenu();\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _fetchMenu: function() {\n            if (this._fetched) {\n                return;\n            }\n        ;\n        ;\n            new h().setURI(this._endpoint).setData({\n                pmid: this._instanceId\n            }).send();\n            this._fetched = true;\n            if (this._mouseoverListener) {\n                this._mouseoverListener.remove();\n                this._mouseoverListener = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"PopoverMenuInterface\", [\"ArbiterMixin\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n;\n    h(j.prototype, g, {\n        getRoot: i,\n        onShow: i,\n        onHide: i,\n        focusAnItem: i.thatReturnsFalse,\n        JSBNG__blur: i,\n        handleKeydown: i.thatReturnsFalse,\n        done: function() {\n            this.inform(\"done\");\n        }\n    });\n    e.exports = j;\n});\n__d(\"PopoverMenuOverlappingBorder\", [\"CSS\",\"DOM\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"shield\");\n    function m(n) {\n        this._popoverMenu = n;\n        this._popover = n.getPopover();\n        this._triggerElem = n.getTriggerElem();\n    };\n;\n    j(m.prototype, {\n        _shortBorder: null,\n        _setMenuSubscription: null,\n        _showSubscription: null,\n        _menuSubscription: null,\n        enable: function() {\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", l(this._onSetMenu, this));\n        },\n        disable: function() {\n            this._popoverMenu.unsubscribe(this._setMenuSubscription);\n            this._setMenuSubscription = null;\n            this._removeBorderSubscriptions();\n            this._removeShortBorder();\n        },\n        _onSetMenu: function() {\n            this._removeBorderSubscriptions();\n            this._menu = this._popoverMenu.getMenu();\n            this._renderShortBorder(this._menu.getRoot());\n            this._showSubscription = this._popover.subscribe(\"show\", l(this._updateBorder, this));\n            this._menuSubscription = this._menu.subscribe([\"change\",\"resize\",], l(Function.prototype.defer, l(this._updateBorder, this)));\n            this._updateBorder();\n        },\n        _updateBorder: function() {\n            var n = this._menu.getRoot(), o = this._triggerElem.offsetWidth, p = Math.max(((n.offsetWidth - o)), 0);\n            i.set(this._shortBorder, \"width\", ((p + \"px\")));\n        },\n        _renderShortBorder: function(n) {\n            this._shortBorder = h.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__shortborder\"\n            });\n            h.appendContent(n, this._shortBorder);\n            g.addClass(n, \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n        },\n        _removeShortBorder: function() {\n            if (this._shortBorder) {\n                h.remove(this._shortBorder);\n                this._shortBorder = null;\n                g.removeClass(this._popoverMenu.getMenu().getRoot(), \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n            }\n        ;\n        ;\n        },\n        _removeBorderSubscriptions: function() {\n            if (this._showSubscription) {\n                this._popover.unsubscribe(this._showSubscription);\n                this._showSubscription = null;\n            }\n        ;\n        ;\n            if (this._menuSubscription) {\n                this._menu.unsubscribe(this._menuSubscription);\n                this._menuSubscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"PostLoadJS\", [\"Bootloader\",\"Run\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\"), i = b(\"emptyFunction\");\n    function j(l, m) {\n        h.onAfterLoad(function() {\n            g.loadModules.call(g, [l,], m);\n        });\n    };\n;\n    var k = {\n        loadAndRequire: function(l) {\n            j(l, i);\n        },\n        loadAndCall: function(l, m, n) {\n            j(l, function(o) {\n                o[m].apply(o, n);\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualLayerDimensions\", [\"DOM\",\"Locale\",\"JSBNG__Rect\",\"Vector\",\"ViewportBounds\",\"ge\",\"getOverlayZIndex\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Locale\"), i = b(\"JSBNG__Rect\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"getOverlayZIndex\"), n = {\n        getViewportRect: function(o) {\n            var p = l(\"globalContainer\"), q = o.getContext(), r = ((((p && g.contains(p, q))) || ((m(q) < 300)))), s = i.getViewportBounds();\n            if (r) {\n                s.t += k.getTop();\n                if (h.isRTL()) {\n                    s.r -= k.getLeft();\n                    s.l += k.getRight();\n                }\n                 else {\n                    s.r -= k.getRight();\n                    s.l += k.getLeft();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return s;\n        },\n        getLayerRect: function(o, p) {\n            var q = o.getContextBounds(\"viewport\"), r = o.simulateOrientation(p, function() {\n                return j.getElementDimensions(o.getContent());\n            }), s = ((q.t + p.getOffsetY()));\n            if (((p.getPosition() === \"above\"))) {\n                s -= r.y;\n            }\n             else if (((p.getPosition() === \"below\"))) {\n                s += ((q.b - q.t));\n            }\n            \n        ;\n        ;\n            var t = ((q.l + p.getOffsetX())), u = ((q.r - q.l));\n            if (p.isVertical()) {\n                var v = p.getAlignment();\n                if (((v === \"center\"))) {\n                    t += ((((u - r.x)) / 2));\n                }\n                 else if (((((v === \"right\")) !== h.isRTL()))) {\n                    t += ((u - r.x));\n                }\n                \n            ;\n            ;\n            }\n             else if (((((p.getPosition() === \"right\")) !== h.isRTL()))) {\n                t += u;\n            }\n             else t -= r.x;\n            \n        ;\n        ;\n            return new i(s, ((t + r.x)), ((s + r.y)), t, \"viewport\");\n        }\n    };\n    e.exports = n;\n});\n__d(\"ContextualLayerAutoFlip\", [\"ContextualLayerDimensions\",\"DOM\",\"Vector\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualLayerDimensions\"), h = b(\"DOM\"), i = b(\"Vector\"), j = b(\"arrayContains\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"adjust\", this._adjustOrientation.bind(this));\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        _adjustOrientation: function(m, n) {\n            var o = this._getValidPositions(n);\n            if (!o.length) {\n                n.invalidate();\n                return;\n            }\n        ;\n        ;\n            var p = g.getViewportRect(this._layer), q = this._getValidAlignments(n), r, s, t;\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                for (s = 0; ((s < o.length)); s++) {\n                    n.setPosition(o[s]);\n                    t = g.getLayerRect(this._layer, n);\n                    if (p.contains(t)) {\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            n.setPosition(((j(o, \"below\") ? \"below\" : o[0])));\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                t = g.getLayerRect(this._layer, n);\n                if (((((t.l >= p.l)) && ((t.r <= p.r))))) {\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            n.setAlignment(q[0]);\n        },\n        _getValidPositions: function(m) {\n            var n = [m.getPosition(),m.getOppositePosition(),], o = this._layer.getContextScrollParent();\n            if (((((o === window)) || ((o === h.getDocumentScrollElement()))))) {\n                return n;\n            }\n        ;\n        ;\n            var p = this._layer.getContext(), q = i.getElementPosition(o, \"viewport\").y, r = i.getElementPosition(p, \"viewport\").y;\n            if (m.isVertical()) {\n                return n.filter(function(t) {\n                    if (((t === \"above\"))) {\n                        return ((r >= q));\n                    }\n                     else {\n                        var u = ((q + o.offsetHeight)), v = ((r + p.offsetHeight));\n                        return ((v <= u));\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                var s = ((q + o.offsetHeight));\n                if (((((r >= q)) && ((((r + p.offsetHeight)) <= s))))) {\n                    return n;\n                }\n                 else return []\n            ;\n            }\n        ;\n        ;\n        },\n        _getValidAlignments: function(m) {\n            var n = [\"left\",\"right\",\"center\",], o = m.getAlignment(), p = n.indexOf(o);\n            if (((p > 0))) {\n                n.splice(p, 1);\n                n.unshift(o);\n            }\n        ;\n        ;\n            return n;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Tooltip\", [\"JSBNG__Event\",\"AsyncRequest\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"URI\",\"copyProperties\",\"emptyFunction\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"ContextualLayer\"), j = b(\"ContextualLayerAutoFlip\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Style\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"cx\"), s = b(\"tx\"), t = null, u = null, v = null, w = [], x;\n    function y() {\n        if (!u) {\n            v = m.create(\"div\", {\n                className: \"tooltipContent\"\n            });\n            var fa = m.create(\"i\", {\n                className: \"arrow\"\n            }), ga = m.create(\"div\", {\n                className: \"uiTooltipX\"\n            }, [v,fa,]);\n            u = new i({\n            }, ga);\n            u.shouldSetARIAProperties(false);\n            u.enableBehavior(j);\n        }\n    ;\n    ;\n    };\n;\n    function z(fa) {\n        return p({\n            JSBNG__content: fa.getAttribute(\"aria-label\"),\n            position: ((fa.getAttribute(\"data-tooltip-position\") || \"above\")),\n            alignH: ((fa.getAttribute(\"data-tooltip-alignh\") || \"left\"))\n        }, l.get(fa, \"tooltip\"));\n    };\n;\n    function aa(fa, ga) {\n        var ha = z(fa);\n        l.set(fa, \"tooltip\", {\n            JSBNG__content: ((ga.JSBNG__content || ha.JSBNG__content)),\n            position: ((ga.position || ha.position)),\n            alignH: ((ga.alignH || ha.alignH)),\n            suspend: ((ga.suspend || ha.suspend))\n        });\n        fa.setAttribute(\"data-hover\", \"tooltip\");\n    };\n;\n    function ba(fa, ga) {\n        ea.set(fa, \"Loading...\");\n        new h(ga).setHandler(function(ha) {\n            ea.set(fa, ha.getPayload());\n        }).setErrorHandler(q).send();\n    };\n;\n    var ca = /(\\r\\n|[\\r\\n])/;\n    function da(fa) {\n        return fa.split(ca).map(function(ga) {\n            return ((ca.test(ga) ? m.create(\"br\") : ga));\n        });\n    };\n;\n    var ea = {\n        process: function(fa, ga) {\n            if (!m.contains(fa, ga)) {\n                return;\n            }\n        ;\n        ;\n            if (((((fa !== t)) && !fa.getAttribute(\"data-tooltip-suspend\")))) {\n                var ha = fa.getAttribute(\"data-tooltip-uri\");\n                if (ha) {\n                    fa.removeAttribute(\"data-tooltip-uri\");\n                    ba(fa, ha);\n                }\n            ;\n            ;\n                ea.show(fa);\n            }\n        ;\n        ;\n        },\n        remove: function(fa) {\n            l.remove(fa, \"tooltip\");\n            fa.removeAttribute(\"data-hover\");\n            fa.removeAttribute(\"data-tooltip-position\");\n            fa.removeAttribute(\"data-tooltip-alignh\");\n            ((((fa === t)) && ea.hide()));\n        },\n        suspend: function(fa) {\n            fa.setAttribute(\"data-tooltip-suspend\", true);\n            ((((fa === t)) && ea.hide()));\n        },\n        unsuspend: function(fa) {\n            fa.removeAttribute(\"data-tooltip-suspend\");\n        },\n        hide: function() {\n            if (t) {\n                u.hide();\n                t = null;\n                while (w.length) {\n                    w.pop().remove();\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        set: function(fa, ga, ha, ia) {\n            if (((ha || ia))) {\n                aa(fa, {\n                    position: ha,\n                    alignH: ia\n                });\n            }\n        ;\n        ;\n            if (((ga instanceof o))) {\n                if (((fa === t))) {\n                    ba(fa, ga);\n                }\n                 else fa.setAttribute(\"data-tooltip-uri\", ga);\n            ;\n            ;\n            }\n             else {\n                if (((typeof ga !== \"string\"))) {\n                    ga = m.create(\"div\", {\n                    }, ga);\n                    fa.setAttribute(\"aria-label\", m.getText(ga));\n                }\n                 else fa.setAttribute(\"aria-label\", ga);\n            ;\n            ;\n                aa(fa, {\n                    JSBNG__content: ga\n                });\n                ((((fa === t)) && ea.show(fa)));\n            }\n        ;\n        ;\n        },\n        show: function(fa) {\n            y();\n            ea.hide();\n            var ga = z(fa);\n            if (!ga.JSBNG__content) {\n                return;\n            }\n        ;\n        ;\n            var ha = 0, ia = 0;\n            if (((((ga.position === \"left\")) || ((ga.position === \"right\"))))) {\n                x = ((x || k.hasClass(JSBNG__document.body, \"-cx-PUBLIC-hasLitestand__body\")));\n                var ja = ((x ? 28 : 20));\n                ia = ((((fa.offsetHeight - ja)) / 2));\n            }\n             else if (((ga.alignH !== \"center\"))) {\n                var ka = fa.offsetWidth;\n                if (((ka < 18))) {\n                    ha = ((((((ka - 18)) / 2)) * ((((ga.alignH === \"right\")) ? -1 : 1))));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            u.setContext(fa).setOffsetX(ha).setOffsetY(ia).setPosition(ga.position).setAlignment(ga.alignH);\n            if (((typeof ga.JSBNG__content === \"string\"))) {\n                k.addClass(u.getRoot(), \"invisible_elem\");\n                var la = m.create(\"span\", {\n                }, da(ga.JSBNG__content)), ma = m.create(\"div\", {\n                    className: \"tooltipText\"\n                }, la);\n                m.setContent(v, ma);\n                u.show();\n                var na;\n                if (ma.getClientRects) {\n                    var oa = ma.getClientRects()[0];\n                    if (oa) {\n                        na = Math.round(((oa.right - oa.left)));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (!na) {\n                    na = ma.offsetWidth;\n                }\n            ;\n            ;\n                if (((na < la.offsetWidth))) {\n                    k.addClass(ma, \"tooltipWrap\");\n                    u.updatePosition();\n                }\n            ;\n            ;\n                k.removeClass(u.getRoot(), \"invisible_elem\");\n            }\n             else {\n                m.setContent(v, ga.JSBNG__content);\n                u.show();\n            }\n        ;\n        ;\n            var pa = function(ra) {\n                if (!m.contains(t, ra.getTarget())) {\n                    ea.hide();\n                }\n            ;\n            ;\n            };\n            w.push(g.listen(JSBNG__document.documentElement, \"mouseover\", pa), g.listen(JSBNG__document.documentElement, \"focusin\", pa));\n            var qa = n.getScrollParent(fa);\n            if (((qa !== window))) {\n                w.push(g.listen(qa, \"JSBNG__scroll\", ea.hide));\n            }\n        ;\n        ;\n            w.push(g.listen(fa, \"click\", ea.hide));\n            t = fa;\n        }\n    };\n    g.listen(window, \"JSBNG__scroll\", ea.hide);\n    e.exports = ea;\n});\n__d(\"SelectorDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"HTML\",\"Keys\",\"KeyStatus\",\"MenuDeprecated\",\"Parent\",\"Style\",\"Toggler\",\"Tooltip\",\"Vector\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Button\"), j = b(\"ContextualLayer\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Focus\"), o = b(\"HTML\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"MenuDeprecated\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"Toggler\"), v = b(\"Tooltip\"), w = b(\"Vector\"), x = b(\"arrayContains\"), y = b(\"copyProperties\"), z = b(\"emptyFunction\"), aa, ba, ca = [], da;\n    function ea(pa) {\n        return s.byClass(pa, \"uiSelector\");\n    };\n;\n    function fa(pa) {\n        return s.byClass(pa, \"uiSelectorButton\");\n    };\n;\n    function ga() {\n        if (!ba) {\n            ba = new j({\n                position: \"below\"\n            }, m.create(\"div\"));\n            k.addClass(ba.getRoot(), \"uiSelectorContextualLayer\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function ha(pa) {\n        return m.scry(pa, \"select\")[0];\n    };\n;\n    function ia(pa) {\n        return m.JSBNG__find(pa, \"div.uiSelectorMenuWrapper\");\n    };\n;\n    function ja() {\n        ja = z;\n        r.subscribe(\"select\", function(pa, qa) {\n            if (((((!aa || !qa)) || ((qa.menu !== oa.getSelectorMenu(aa)))))) {\n                return;\n            }\n        ;\n        ;\n            var ra = ka(aa), sa = la(qa.item);\n            if (sa) {\n                var ta = aa, ua = oa.isOptionSelected(qa.item), va = oa.inform(\"select\", {\n                    selector: ta,\n                    option: qa.item,\n                    clone: da\n                });\n                if (((va === false))) {\n                    return;\n                }\n            ;\n            ;\n                if (((ra || !ua))) {\n                    oa.setSelected(ta, oa.getOptionValue(qa.item), !ua);\n                    oa.inform(\"toggle\", {\n                        selector: ta,\n                        option: qa.item\n                    });\n                    oa.inform(\"change\", {\n                        selector: ta\n                    });\n                    h.inform(\"Form/change\", {\n                        node: ta\n                    });\n                    if (ma(ta)) {\n                        l.set(ta, \"dirty\", true);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!ra || !sa))) {\n                ((aa && oa.toggle(aa)));\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ka(pa) {\n        return !!pa.getAttribute(\"data-multiple\");\n    };\n;\n    function la(pa) {\n        return k.hasClass(pa, \"uiSelectorOption\");\n    };\n;\n    function ma(pa) {\n        return !!pa.getAttribute(\"data-autosubmit\");\n    };\n;\n    var na = function() {\n        na = z;\n        var pa = {\n            keydown: function(JSBNG__event) {\n                var qa = JSBNG__event.getTarget();\n                if (m.isInputNode(qa)) {\n                    return;\n                }\n            ;\n            ;\n                switch (g.getKeyCode(JSBNG__event)) {\n                  case p.DOWN:\n                \n                  case p.SPACE:\n                \n                  case p.UP:\n                    if (fa(qa)) {\n                        var ra = ea(qa);\n                        oa.toggle(ra);\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                  case p.ESC:\n                    if (aa) {\n                        var sa = oa.getSelectorButton(aa);\n                        oa.toggle(aa);\n                        ((sa && n.set(sa)));\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                };\n            ;\n            },\n            mouseover: function(JSBNG__event) {\n                var qa = s.byAttribute(JSBNG__event.getTarget(), \"ajaxify\");\n                if (((qa && k.hasClass(qa, \"uiSelectorButton\")))) {\n                    oa.loadMenu(ea(qa));\n                }\n            ;\n            ;\n            }\n        };\n        g.listen(JSBNG__document.body, pa);\n    };\n    u.subscribe([\"show\",\"hide\",], function(pa, qa) {\n        var ra = ea(qa.getActive());\n        if (ra) {\n            na();\n            ja();\n            var sa = oa.getSelectorButton(ra), ta = oa.getSelectorMenu(ra), ua = ((pa === \"show\"));\n            sa.setAttribute(\"aria-expanded\", ((ua ? \"true\" : \"false\")));\n            if (ua) {\n                aa = ra;\n                if (k.hasClass(sa, \"uiButtonDisabled\")) {\n                    oa.setEnabled(ra, false);\n                    return false;\n                }\n            ;\n            ;\n                ta = ((ta || oa.loadMenu(ra)));\n                var va = t.getScrollParent(ra), wa = ((((va !== window)) && ((va !== m.getDocumentScrollElement()))));\n                if (((wa || k.hasClass(ra, \"uiSelectorUseLayer\")))) {\n                    if (wa) {\n                        ca.push(g.listen(va, \"JSBNG__scroll\", function() {\n                            qa.hide();\n                        }));\n                    }\n                ;\n                ;\n                    da = m.create(\"div\", {\n                        className: ra.className\n                    });\n                    k.addClass(da, \"invisible_elem\");\n                    w.getElementDimensions(ra).setElementDimensions(da);\n                    m.replace(ra, da);\n                    var xa = k.hasClass(ra, \"uiSelectorRight\"), ya = k.hasClass(ra, \"uiSelectorBottomUp\");\n                    ga().setContext(da).setContent(ra).setPosition(((ya ? \"above\" : \"below\"))).setAlignment(((xa ? \"right\" : \"left\"))).show();\n                }\n            ;\n            ;\n                r.register(ta);\n                if (q.isKeyDown()) {\n                    var za = r.getCheckedItems(ta);\n                    if (!za.length) {\n                        za = r.getEnabledItems(ta);\n                    }\n                ;\n                ;\n                    r.focusItem(za[0]);\n                }\n            ;\n            ;\n            }\n             else {\n                aa = null;\n                if (da) {\n                    while (ca.length) {\n                        ca.pop().remove();\n                    ;\n                    };\n                ;\n                    m.replace(da, ra);\n                    ga().hide();\n                    da = null;\n                }\n            ;\n            ;\n                ((ta && r.unregister(ta)));\n                if (((ma(ra) && l.get(ra, \"dirty\")))) {\n                    var ab = m.scry(ra, \"input.submitButton\")[0];\n                    ((ab && ab.click()));\n                    l.remove(ra, \"dirty\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            k.conditionClass(oa.getSelectorButton(ra), \"selected\", ua);\n            oa.inform(((ua ? \"open\" : \"close\")), {\n                selector: ra,\n                clone: da\n            });\n        }\n    ;\n    ;\n    });\n    var oa = y(new h(), {\n        attachMenu: function(pa, qa, ra) {\n            pa = ea(pa);\n            if (pa) {\n                ((aa && r.unregister(oa.getSelectorMenu(aa))));\n                m.setContent(ia(pa), qa);\n                ((aa && r.register(oa.getSelectorMenu(pa))));\n                ((da && ga().updatePosition()));\n                if (ra) {\n                    var sa = pa.getAttribute(\"data-name\");\n                    ((sa && ra.setAttribute(\"JSBNG__name\", sa)));\n                    if (!ka(pa)) {\n                        ra.setAttribute(\"multiple\", false);\n                    }\n                ;\n                ;\n                    var ta = ha(pa);\n                    if (ta) {\n                        m.replace(ta, ra);\n                    }\n                     else m.insertAfter(pa.firstChild, ra);\n                ;\n                ;\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n        },\n        getOption: function(pa, qa) {\n            var ra = oa.getOptions(pa), sa = ra.length;\n            while (sa--) {\n                if (((qa === oa.getOptionValue(ra[sa])))) {\n                    return ra[sa];\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getOptions: function(pa) {\n            var qa = r.getItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getEnabledOptions: function(pa) {\n            var qa = r.getEnabledItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getSelectedOptions: function(pa) {\n            return r.getCheckedItems(oa.getSelectorMenu(pa));\n        },\n        getOptionText: function(pa) {\n            return r.getItemLabel(pa);\n        },\n        getOptionValue: function(pa) {\n            var qa = ea(pa), ra = ha(qa), sa = oa.getOptions(qa).indexOf(pa);\n            return ((((sa >= 0)) ? ra.options[((sa + 1))].value : \"\"));\n        },\n        getSelectorButton: function(pa) {\n            return m.JSBNG__find(pa, \"a.uiSelectorButton\");\n        },\n        getSelectorMenu: function(pa) {\n            return m.scry(pa, \"div.uiSelectorMenu\")[0];\n        },\n        getValue: function(pa) {\n            var qa = ha(pa);\n            if (!qa) {\n                return null;\n            }\n        ;\n        ;\n            if (!ka(pa)) {\n                return qa.value;\n            }\n        ;\n        ;\n            var ra = [], sa = qa.options;\n            for (var ta = 1, ua = sa.length; ((ta < ua)); ta++) {\n                if (sa[ta].selected) {\n                    ra.push(sa[ta].value);\n                }\n            ;\n            ;\n            };\n        ;\n            return ra;\n        },\n        isOptionSelected: function(pa) {\n            return r.isItemChecked(pa);\n        },\n        listen: function(pa, qa, ra) {\n            return this.subscribe(qa, function(sa, ta) {\n                if (((ta.selector === pa))) {\n                    return ra(ta, sa);\n                }\n            ;\n            ;\n            });\n        },\n        loadMenu: function(pa) {\n            var qa = oa.getSelectorMenu(pa);\n            if (!qa) {\n                var ra = oa.getSelectorButton(pa), sa = ra.getAttribute(\"ajaxify\");\n                if (sa) {\n                    d([\"AsyncRequest\",], function(ua) {\n                        ua.bootstrap(sa, ra);\n                    });\n                    var ta = o(((((((((((((\"\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\" + \"\\u003Cdiv class=\\\"uiMenu uiSelectorMenu loading\\\"\\u003E\")) + \"\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\")) + \"\\u003Cli\\u003E\\u003Cspan\\u003E\\u003C/span\\u003E\\u003C/li\\u003E\")) + \"\\u003C/ul\\u003E\")) + \"\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\")));\n                    m.appendContent(ra.parentNode, ta);\n                    qa = oa.getSelectorMenu(pa);\n                    ra.removeAttribute(\"JSBNG__onmouseover\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        setButtonLabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = parseInt(ra.getAttribute(\"data-length\"), 10);\n            qa = ((((qa || ra.getAttribute(\"data-label\"))) || \"\"));\n            i.setLabel(ra, qa);\n            if (((typeof qa === \"string\"))) {\n                k.conditionClass(ra, \"uiSelectorBigButtonLabel\", ((qa.length > sa)));\n                if (((sa && ((qa.length > sa))))) {\n                    ra.setAttribute(\"title\", qa);\n                }\n                 else ra.removeAttribute(\"title\");\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setButtonTooltip: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            ((sa && v.set(sa, ((((qa || ra.getAttribute(\"data-tooltip\"))) || \"\")))));\n        },\n        updateButtonARIALabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            if (sa) {\n                var ta = ra.getAttribute(\"data-ariaprefix\");\n                if (ta) {\n                    ra.setAttribute(\"aria-label\", ((((ta + \": \")) + qa)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setEnabled: function(pa, qa) {\n            if (((((!qa && aa)) && ((ea(pa) === aa))))) {\n                oa.toggle(pa);\n            }\n        ;\n        ;\n            i.setEnabled(oa.getSelectorButton(pa), qa);\n        },\n        setOptionEnabled: function(pa, qa) {\n            r.setItemEnabled(pa, qa);\n        },\n        setSelected: function(pa, qa, ra) {\n            ra = ((ra !== false));\n            var sa = oa.getOption(pa, qa);\n            if (!sa) {\n                return;\n            }\n        ;\n        ;\n            var ta = oa.isOptionSelected(sa);\n            if (((ra !== ta))) {\n                if (((!ka(pa) && !ta))) {\n                    var ua = oa.getSelectedOptions(pa)[0];\n                    ((ua && r.toggleItem(ua)));\n                }\n            ;\n            ;\n                r.toggleItem(sa);\n            }\n        ;\n        ;\n            oa.updateSelector(pa);\n        },\n        toggle: function(pa) {\n            u.toggle(m.scry(ea(pa), \"div.wrap\")[0]);\n        },\n        updateSelector: function(pa) {\n            var qa = oa.getOptions(pa), ra = oa.getSelectedOptions(pa), sa = ha(pa).options, ta = [], ua = [];\n            for (var va = 0, wa = qa.length; ((va < wa)); va++) {\n                var xa = x(ra, qa[va]);\n                sa[((va + 1))].selected = xa;\n                if (xa) {\n                    var ya = oa.getOptionText(qa[va]);\n                    ta.push(ya);\n                    ua.push(((qa[va].getAttribute(\"data-tooltip\") || ya)));\n                }\n            ;\n            ;\n            };\n        ;\n            sa[0].selected = !ra.length;\n            var za = k.hasClass(pa, \"uiSelectorDynamicLabel\"), ab = k.hasClass(pa, \"uiSelectorDynamicTooltip\");\n            if (((za || ab))) {\n                var bb = \"\";\n                if (ka(pa)) {\n                    var cb = oa.getSelectorButton(pa);\n                    bb = ((cb.getAttribute(\"data-delimiter\") || \", \"));\n                }\n            ;\n            ;\n                ta = ta.join(bb);\n                ua = ua.join(bb);\n                if (za) {\n                    oa.setButtonLabel(pa, ta);\n                    oa.updateButtonARIALabel(pa, ta);\n                }\n            ;\n            ;\n                ((ab && oa.setButtonTooltip(pa, ua)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = oa;\n});\n__d(\"SubscriptionsHandler\", [\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"copyProperties\"), i = g.create(\"subscriptions_handler\");\n    function j(k) {\n        this._name = ((k || \"unnamed\"));\n        this._subscriptions = [];\n    };\n;\n    h(j.prototype, {\n        addSubscriptions: function() {\n            if (this._subscriptions) {\n                Array.prototype.push.apply(this._subscriptions, arguments);\n            }\n             else {\n                i.warn(((this._name + \".subscribe_while_released\")));\n                for (var k = 0, l = arguments.length; ((k < l)); k++) {\n                    this._unsubscribe(arguments[k]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        engage: function() {\n            this._subscriptions = ((this._subscriptions || []));\n        },\n        release: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(this._unsubscribe.bind(this));\n            }\n        ;\n        ;\n            this._subscriptions = null;\n        },\n        _unsubscribe: function(k) {\n            if (k.remove) {\n                k.remove();\n            }\n             else if (k.reset) {\n                k.reset();\n            }\n             else if (k.unsubscribe) {\n                k.unsubscribe();\n            }\n             else i.error(((this._name + \".invalid\")), k);\n            \n            \n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"UserActivity\", [\"Arbiter\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = 5000, j = 500, k = -5, l = JSBNG__Date.now(), m = l, n = {\n        subscribeOnce: function(p) {\n            var q = n.subscribe(function() {\n                n.unsubscribe(q);\n                p();\n            });\n        },\n        subscribe: function(p) {\n            return g.subscribe(\"useractivity/activity\", p);\n        },\n        unsubscribe: function(p) {\n            p.unsubscribe();\n        },\n        isActive: function(p) {\n            return ((((new JSBNG__Date() - l)) < ((p || i))));\n        },\n        getLastInformTime: function() {\n            return m;\n        }\n    };\n    function o(JSBNG__event) {\n        l = JSBNG__Date.now();\n        var p = ((l - m));\n        if (((p > j))) {\n            m = l;\n            g.inform(\"useractivity/activity\", {\n                JSBNG__event: JSBNG__event,\n                idleness: p,\n                last_inform: m\n            });\n        }\n         else if (((p < k))) {\n            m = l;\n        }\n        \n    ;\n    ;\n    };\n;\n    h.listen(window, \"JSBNG__scroll\", o);\n    h.listen(window, \"JSBNG__focus\", o);\n    h.listen(JSBNG__document.documentElement, {\n        DOMMouseScroll: o,\n        mousewheel: o,\n        keydown: o,\n        mouseover: o,\n        mousemove: o,\n        click: o\n    });\n    g.subscribe(\"Event/stop\", function(p, q) {\n        o(q.JSBNG__event);\n    });\n    e.exports = n;\n});\n__d(\"enforceMaxLength\", [\"JSBNG__Event\",\"function-extensions\",\"DOM\",\"Input\",\"InputSelection\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"DOM\"), i = b(\"Input\"), j = b(\"InputSelection\"), k = function(n, o) {\n        var p = i.getValue(n), q = p.length, r = ((q - o));\n        if (((r > 0))) {\n            var s, t;\n            try {\n                s = j.get(n);\n                t = s.end;\n            } catch (u) {\n                s = null;\n                t = 0;\n            };\n        ;\n            if (((t >= r))) {\n                q = t;\n            }\n        ;\n        ;\n            var v = ((q - r));\n            if (((v && ((((p.charCodeAt(((v - 1))) & 64512)) === 55296))))) {\n                v--;\n            }\n        ;\n        ;\n            t = Math.min(t, v);\n            i.setValue(n, ((p.slice(0, v) + p.slice(q))));\n            if (s) {\n                j.set(n, Math.min(s.start, t), t);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    }, l = function(JSBNG__event) {\n        var n = JSBNG__event.getTarget(), o = ((n.getAttribute && parseInt(n.getAttribute(\"maxlength\"), 10)));\n        if (((((o > 0)) && h.isNodeOfType(n, [\"input\",\"textarea\",])))) {\n            k.bind(null, n, o).defer();\n        }\n    ;\n    ;\n    }, m = ((((\"maxLength\" in h.create(\"input\"))) && ((\"maxLength\" in h.create(\"textarea\")))));\n    if (!m) {\n        g.listen(JSBNG__document.documentElement, {\n            keydown: l,\n            paste: l\n        });\n    }\n;\n;\n    e.exports = k;\n});\n__d(\"guid\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return ((\"f\" + ((Math.JSBNG__random() * ((1 << 30)))).toString(16).replace(\".\", \"\")));\n    };\n;\n    e.exports = g;\n});\n__d(\"reportData\", [\"EagleEye\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"EagleEye\"), h = b(\"userAction\");\n    function i(j, k) {\n        k = ((k || {\n        }));\n        var l = {\n            ft: ((k.ft || {\n            })),\n            gt: ((k.gt || {\n            }))\n        }, m = \"-\", n = a.ArbiterMonitor, o = (((!!n) ? n.getActFields() : [])), p = (((!n) ? \"r\" : \"a\")), q = [JSBNG__Date.now(),h.getCurrentUECount(),m,j,m,m,p,((a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((((JSBNG__location.pathname + JSBNG__location.search)) + JSBNG__location.hash)))),l,0,0,0,0,].concat(o);\n        g.log(\"act\", q);\n    };\n;\n    e.exports = i;\n});\n__d(\"NetEgo\", [\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"ge\",\"Animation\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"ge\"), l = b(\"Animation\"), m = {\n        setup: function(n) {\n            g.subscribe([\"page/liked\",\"FriendRequest/sending\",], function(o, p) {\n                if (((((n == p.id)) || ((n == p.uid))))) {\n                    var q = k(JSBNG__document.body, \".ego_unit_container\");\n                    if (q) {\n                        var r = i.scry(q, \".ego_unit\"), s = r.length;\n                        for (var t = 0; ((t < s)); t++) {\n                            var u = r[t].getAttribute(\"data-ego-fbid\");\n                            if (((((u == p.id)) || ((u == p.uid))))) {\n                                var v = i.JSBNG__find(r[t], \".ego_action a\");\n                                if (v) {\n                                    v.click();\n                                }\n                            ;\n                            ;\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        updateXids: function(n, o) {\n            if (((((n.length == 0)) && ((o.length == 0))))) {\n                return;\n            }\n        ;\n        ;\n            var p = function(z) {\n                return function(aa) {\n                    var ba = aa.getAttribute(z);\n                    if (!ba) {\n                        return false;\n                    }\n                ;\n                ;\n                    var ca = new j(ba).getQueryData();\n                    return !!ca.xids;\n                };\n            }, q = i.scry(JSBNG__document.body, \".ego_unit a\");\n            q = q.filter(p(\"ajaxify\"));\n            if (((q.length == 0))) {\n                return;\n            }\n        ;\n        ;\n            var r = new j(q[0].getAttribute(\"ajaxify\")), s = r.getQueryData();\n            if (!s.xids) {\n                return;\n            }\n        ;\n        ;\n            try {\n                var u = JSON.parse(s.xids);\n            } catch (t) {\n                return;\n            };\n        ;\n            for (var v = 0; ((v < n.length)); ++v) {\n                delete u[n[v]];\n            ;\n            };\n        ;\n            for (v = 0; ((v < o.length)); ++v) {\n                u[o[v]] = 1;\n            ;\n            };\n        ;\n            var w = JSON.stringify(u), x = function(z, aa) {\n                r = new j(z.getAttribute(aa));\n                s = r.getQueryData();\n                s.xids = w;\n                r.setQueryData(s);\n                z.setAttribute(aa, r.toString());\n            };\n            for (v = 0; ((v < q.length)); ++v) {\n                x(q[v], \"ajaxify\");\n            ;\n            };\n        ;\n            var y = i.scry(JSBNG__document.body, \".ego_unit form\");\n            y = y.filter(p(\"action\"));\n            for (v = 0; ((v < y.length)); ++v) {\n                x(y[v], \"action\");\n            ;\n            };\n        ;\n        },\n        replaceUnit: function(n, o, p, q) {\n            var r = i.insertAfter(n, o);\n            r.forEach(h.hide);\n            if (((((q !== undefined)) && ((q !== null))))) {\n                (function() {\n                    m._replaceUnitFadeout(n, r, p);\n                }).defer(q);\n            }\n             else m._replaceUnitFadeout(n, r, p);\n        ;\n        ;\n        },\n        _replaceUnitFadeout: function(n, o, p) {\n            if (p) {\n                new l(n).from(\"opacity\", 1).to(\"opacity\", 0).duration(p).checkpoint(1, function() {\n                    m._replaceUnitElement(n, o);\n                }).go();\n            }\n             else m._replaceUnitElement(n, o);\n        ;\n        ;\n        },\n        _replaceUnitElement: function(n, o) {\n            i.remove(n);\n            o.forEach(h.show);\n            g.inform(\"netego_replacedUnit\");\n            m.clearHeader();\n        },\n        clearHeader: function() {\n            var n = i.scry(JSBNG__document.body, \".ego_column\"), o = [];\n            for (var p = 0; ((p < n.length)); ++p) {\n                o = o.concat(i.scry(n[p], \".uiHeader\"));\n            ;\n            };\n        ;\n            for (p = 0; ((p < o.length)); ++p) {\n                var q = o[p].nextSibling;\n                if (((!q || ((q.childNodes.length === 0))))) {\n                    i.remove(o[p]);\n                }\n                 else if (((q.childNodes.length === 1))) {\n                    var r = q.childNodes[0];\n                    if (((h.hasClass(r, \"ego_appended_units\") && ((r.childNodes.length === 0))))) {\n                        i.remove(o[p]);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ControlledReferer\", [\"JSBNG__Event\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"URI\"), i = b(\"UserAgent\"), j = {\n        useFacebookReferer: function(k, l, m) {\n            var n = false;\n            function o() {\n                if (n) {\n                    return;\n                }\n            ;\n            ;\n                var q = k.contentWindow.JSBNG__location.pathname;\n                if (((((q !== \"/intern/common/referer_frame.php\")) && ((q !== \"/common/referer_frame.php\"))))) {\n                    return;\n                }\n            ;\n            ;\n                n = true;\n                k.contentWindow.JSBNG__document.body.style.margin = 0;\n                l();\n            };\n        ;\n            var p;\n            if (((JSBNG__document.domain !== \"facebook.com\"))) {\n                p = \"/intern/common/referer_frame.php\";\n            }\n             else if (i.JSBNG__opera()) {\n                p = \"/common/referer_frame.php\";\n            }\n             else if (h().isSecure()) {\n                p = \"https://s-static.ak.facebook.com/common/referer_frame.php\";\n            }\n             else p = \"http://static.ak.facebook.com/common/referer_frame.php\";\n            \n            \n        ;\n        ;\n            if (m) {\n                p += ((\"?fb_source=\" + m));\n            }\n        ;\n        ;\n            g.listen(k, \"load\", o);\n            k.src = p;\n        },\n        useFacebookRefererHtml: function(k, l, m) {\n            j.useFacebookReferer(k, function() {\n                k.contentWindow.JSBNG__document.body.innerHTML = l;\n            }, m);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UIIntentionalStreamMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        SET_AUTO_INSERT: \"UIIntentionalStream/setAutoInsert\",\n        UPDATE_STREAM: \"UIIntentionalStreamRefresh/updateStream\",\n        REFRESH_STREAM: \"UIIntentionalStreamRefresh/refreshStream\",\n        UPDATE_AUTOREFRESH_CONFIG: \"UIIntentionalStream/updateAutoRefreshConfig\",\n        UPDATE_HTML_CONTENT: \"UIIntentionalStream/updateHtmlContent\",\n        UPDATE_LAST_REFRESH_TIME: \"UIIntentionalStream/updateLastRefreshTime\",\n        INSERT_STORIES: \"UIIntentionalStream/updateLastRefreshTime\",\n        UNLOAD: \"UIIntentionalStream/unload\"\n    };\n    e.exports = g;\n});\n__d(\"UIPagelet\", [\"AjaxPipeRequest\",\"AsyncRequest\",\"DOM\",\"HTML\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"ScriptPathState\"), l = b(\"URI\"), m = b(\"copyProperties\"), n = b(\"emptyFunction\"), o = b(\"ge\");\n    function p(q, r, s) {\n        var t = ((((q && i.isElementNode(q))) ? q.id : q));\n        this._id = ((t || null));\n        this._element = o(((q || i.create(\"div\"))));\n        this._src = ((r || null));\n        this._context_data = ((s || {\n        }));\n        this._data = {\n        };\n        this._handler = n;\n        this._request = null;\n        this._use_ajaxpipe = false;\n        this._is_bundle = true;\n        this._allow_cross_page_transition = false;\n        this._append = false;\n    };\n;\n    p.loadFromEndpoint = function(q, r, s, t) {\n        t = ((t || {\n        }));\n        var u = ((\"/ajax/pagelet/generic.php/\" + q));\n        if (t.intern) {\n            u = ((\"/intern\" + u));\n        }\n    ;\n    ;\n        var v = new l(u.replace(/\\/+/g, \"/\"));\n        if (t.subdomain) {\n            v.setSubdomain(t.subdomain);\n        }\n    ;\n    ;\n        var w = new p(r, v, s).setUseAjaxPipe(t.usePipe).setBundleOption(((t.bundle !== false))).setAppend(t.append).setJSNonBlock(t.jsNonblock).setAutomatic(t.automatic).setDisplayCallback(t.displayCallback).setConstHeight(t.constHeight).setAllowCrossPageTransition(t.crossPage).setFinallyHandler(((t.finallyHandler || n))).setTransportErrorHandler(t.transportErrorHandler);\n        ((t.handler && w.setHandler(t.handler)));\n        w.go();\n        return w;\n    };\n    m(p.prototype, {\n        getElement: function() {\n            return this._element;\n        },\n        setHandler: function(q) {\n            this._handler = q;\n            return this;\n        },\n        go: function(q, r) {\n            if (((((arguments.length >= 2)) || ((typeof q == \"string\"))))) {\n                this._src = q;\n                this._data = ((r || {\n                }));\n            }\n             else if (((arguments.length == 1))) {\n                this._data = q;\n            }\n            \n        ;\n        ;\n            this.refresh();\n            return this;\n        },\n        setAllowCrossPageTransition: function(q) {\n            this._allow_cross_page_transition = q;\n            return this;\n        },\n        setBundleOption: function(q) {\n            this._is_bundle = q;\n            return this;\n        },\n        setTransportErrorHandler: function(q) {\n            this.transportErrorHandler = q;\n            return this;\n        },\n        refresh: function() {\n            if (this._use_ajaxpipe) {\n                k.setIsUIPageletRequest(true);\n                this._request = new g();\n                this._request.setCanvasId(this._id).setAppend(this._append).setConstHeight(this._constHeight).setJSNonBlock(this._jsNonblock).setAutomatic(this._automatic).setDisplayCallback(this._displayCallback).setFinallyHandler(this._finallyHandler);\n            }\n             else {\n                var q = function(t) {\n                    this._request = null;\n                    var u = j(t.getPayload());\n                    if (this._append) {\n                        i.appendContent(this._element, u);\n                    }\n                     else i.setContent(this._element, u);\n                ;\n                ;\n                    this._handler();\n                }.bind(this), r = this._displayCallback;\n                this._request = new h().setMethod(\"GET\").setReadOnly(true).setOption(\"bundle\", this._is_bundle).setHandler(function(t) {\n                    if (r) {\n                        r(q.curry(t));\n                    }\n                     else q(t);\n                ;\n                ;\n                    if (this._finallyHandler) {\n                        this._finallyHandler();\n                    }\n                ;\n                ;\n                });\n                if (this.transportErrorHandler) {\n                    this._request.setTransportErrorHandler(this.transportErrorHandler);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s = {\n            };\n            m(s, this._context_data);\n            m(s, this._data);\n            this._request.setURI(this._src).setAllowCrossPageTransition(this._allow_cross_page_transition).setData({\n                data: JSON.stringify(s)\n            }).send();\n            return this;\n        },\n        cancel: function() {\n            if (this._request) {\n                this._request.abort();\n            }\n        ;\n        ;\n        },\n        setUseAjaxPipe: function(q) {\n            this._use_ajaxpipe = !!q;\n            return this;\n        },\n        setAppend: function(q) {\n            this._append = !!q;\n            return this;\n        },\n        setJSNonBlock: function(q) {\n            this._jsNonblock = !!q;\n            return this;\n        },\n        setAutomatic: function(q) {\n            this._automatic = !!q;\n            return this;\n        },\n        setDisplayCallback: function(q) {\n            this._displayCallback = q;\n            return this;\n        },\n        setConstHeight: function(q) {\n            this._constHeight = !!q;\n            return this;\n        },\n        setFinallyHandler: function(q) {\n            this._finallyHandler = q;\n            return this;\n        }\n    });\n    e.exports = p;\n});\n__d(\"ScrollableArea\", [\"Animation\",\"ArbiterMixin\",\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"SimpleDrag\",\"Style\",\"UserAgent\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"Parent\"), o = b(\"Run\"), p = b(\"SimpleDrag\"), q = b(\"Style\"), r = b(\"UserAgent\"), s = b(\"Vector\"), t = b(\"copyProperties\"), u = b(\"throttle\"), v = 12;\n    function w(x, y) {\n        if (!x) {\n            return;\n        }\n    ;\n    ;\n        y = ((y || {\n        }));\n        this._elem = x;\n        this._wrap = l.JSBNG__find(x, \"div.uiScrollableAreaWrap\");\n        this._body = l.JSBNG__find(this._wrap, \"div.uiScrollableAreaBody\");\n        this._content = l.JSBNG__find(this._body, \"div.uiScrollableAreaContent\");\n        this._track = l.JSBNG__find(x, \"div.uiScrollableAreaTrack\");\n        this._gripper = l.JSBNG__find(this._track, \"div.uiScrollableAreaGripper\");\n        this._options = y;\n        this._throttledComputeHeights = u.withBlocking(this._computeHeights, 250, this);\n        this.throttledAdjustGripper = u.withBlocking(this.adjustGripper, 250, this);\n        this._throttledShowGripperAndShadows = u.withBlocking(this._showGripperAndShadows, 250, this);\n        this._throttledRespondMouseMove = u(this._respondMouseMove, 250, this);\n        this.adjustGripper.bind(this).defer();\n        this._listeners = [m.listen(this._wrap, \"JSBNG__scroll\", this._handleScroll.bind(this)),m.listen(x, \"mousemove\", this._handleMouseMove.bind(this)),m.listen(this._track, \"click\", this._handleClickOnTrack.bind(this)),];\n        if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"click\", this._handleClickOnTrack.bind(this)));\n        }\n    ;\n    ;\n        if (((y.fade !== false))) {\n            this._listeners.push(m.listen(x, \"mouseenter\", this._handleMouseEnter.bind(this)), m.listen(x, \"mouseleave\", this._handleMouseLeave.bind(this)), m.listen(x, \"focusin\", this.showScrollbar.bind(this, false)), m.listen(x, \"focusout\", this.hideScrollbar.bind(this)));\n        }\n         else if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"mouseleave\", j.removeClass.curry(x, \"uiScrollableAreaTrackOver\")));\n        }\n        \n    ;\n    ;\n        if (((r.webkit() || r.chrome()))) {\n            this._listeners.push(m.listen(x, \"mousedown\", function() {\n                var z = m.listen(window, \"mouseup\", function() {\n                    if (x.scrollLeft) {\n                        x.scrollLeft = 0;\n                    }\n                ;\n                ;\n                    z.remove();\n                });\n            }));\n        }\n         else if (r.firefox()) {\n            this._wrap.JSBNG__addEventListener(\"DOMMouseScroll\", function(JSBNG__event) {\n                ((((JSBNG__event.axis === JSBNG__event.HORIZONTAL_AXIS)) && JSBNG__event.preventDefault()));\n            }, false);\n        }\n        \n    ;\n    ;\n        this.initDrag();\n        k.set(this._elem, \"ScrollableArea\", this);\n        if (!y.persistent) {\n            o.onLeave(this.destroy.bind(this));\n        }\n    ;\n    ;\n        if (((y.shadow !== false))) {\n            j.addClass(this._elem, \"uiScrollableAreaWithShadow\");\n        }\n    ;\n    ;\n    };\n;\n    t(w, {\n        renderDOM: function() {\n            var x = l.create(\"div\", {\n                className: \"uiScrollableAreaContent\"\n            }), y = l.create(\"div\", {\n                className: \"uiScrollableAreaBody\"\n            }, x), z = l.create(\"div\", {\n                className: \"uiScrollableAreaWrap\"\n            }, y), aa = l.create(\"div\", {\n                className: \"uiScrollableArea native\"\n            }, z);\n            return {\n                root: aa,\n                wrap: z,\n                body: y,\n                JSBNG__content: x\n            };\n        },\n        fromNative: function(x, y) {\n            if (((!j.hasClass(x, \"uiScrollableArea\") || !j.hasClass(x, \"native\")))) {\n                return;\n            }\n        ;\n        ;\n            y = ((y || {\n            }));\n            j.removeClass(x, \"native\");\n            var z = l.create(\"div\", {\n                className: \"uiScrollableAreaTrack\"\n            }, l.create(\"div\", {\n                className: \"uiScrollableAreaGripper\"\n            }));\n            if (((y.fade !== false))) {\n                j.addClass(x, \"fade\");\n                j.addClass(z, \"invisible_elem\");\n            }\n             else j.addClass(x, \"nofade\");\n        ;\n        ;\n            l.appendContent(x, z);\n            var aa = new w(x, y);\n            aa.resize();\n            return aa;\n        },\n        getInstance: function(x) {\n            var y = n.byClass(x, \"uiScrollableArea\");\n            return ((y ? k.get(y, \"ScrollableArea\") : null));\n        },\n        poke: function(x) {\n            var y = w.getInstance(x);\n            ((y && y.poke()));\n        }\n    });\n    t(w.prototype, h, {\n        initDrag: function() {\n            var x = i.hasPointerEvents(), y = new p(((x ? this._elem : this._gripper)));\n            y.subscribe(\"start\", function(z, JSBNG__event) {\n                if (!((((JSBNG__event.which && ((JSBNG__event.which === 1)))) || ((JSBNG__event.button && ((JSBNG__event.button === 1))))))) {\n                    return;\n                }\n            ;\n            ;\n                var aa = s.getEventPosition(JSBNG__event, \"viewport\");\n                if (x) {\n                    var ba = this._gripper.getBoundingClientRect();\n                    if (((((((((aa.x < ba.left)) || ((aa.x > ba.right)))) || ((aa.y < ba.JSBNG__top)))) || ((aa.y > ba.bottom))))) {\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.inform(\"grip_start\");\n                var ca = aa.y, da = this._gripper.offsetTop;\n                j.addClass(this._elem, \"uiScrollableAreaDragging\");\n                var ea = y.subscribe(\"update\", function(ga, JSBNG__event) {\n                    var ha = ((s.getEventPosition(JSBNG__event, \"viewport\").y - ca));\n                    this._throttledComputeHeights();\n                    var ia = ((this._contentHeight - this._containerHeight)), ja = ((da + ha)), ka = ((this._trackHeight - this._gripperHeight));\n                    ja = Math.max(Math.min(ja, ka), 0);\n                    var la = ((((ja / ka)) * ia));\n                    this._wrap.scrollTop = la;\n                }.bind(this)), fa = y.subscribe(\"end\", function() {\n                    y.unsubscribe(ea);\n                    y.unsubscribe(fa);\n                    j.removeClass(this._elem, \"uiScrollableAreaDragging\");\n                    this.inform(\"grip_end\");\n                }.bind(this));\n            }.bind(this));\n        },\n        adjustGripper: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_845), function() {\n            if (this._needsGripper()) {\n                q.set(this._gripper, \"height\", ((this._gripperHeight + \"px\")));\n                this._slideGripper();\n            }\n        ;\n        ;\n            this._throttledShowGripperAndShadows();\n            return this;\n        })),\n        _computeHeights: function() {\n            this._containerHeight = this._elem.clientHeight;\n            this._contentHeight = this._content.offsetHeight;\n            this._trackHeight = this._track.offsetHeight;\n            this._gripperHeight = Math.max(((((this._containerHeight / this._contentHeight)) * this._trackHeight)), v);\n        },\n        _needsGripper: function() {\n            this._throttledComputeHeights();\n            return ((this._gripperHeight < this._trackHeight));\n        },\n        _slideGripper: function() {\n            var x = ((((this._wrap.scrollTop / ((this._contentHeight - this._containerHeight)))) * ((this._trackHeight - this._gripperHeight))));\n            q.set(this._gripper, \"JSBNG__top\", ((x + \"px\")));\n        },\n        _showGripperAndShadows: function() {\n            j.conditionShow(this._gripper, this._needsGripper());\n            j.conditionClass(this._elem, \"contentBefore\", ((this._wrap.scrollTop > 0)));\n            j.conditionClass(this._elem, \"contentAfter\", !this.isScrolledToBottom());\n        },\n        destroy: function() {\n            this._listeners.forEach(function(x) {\n                x.remove();\n            });\n            this._listeners.length = 0;\n        },\n        _handleClickOnTrack: function(JSBNG__event) {\n            var x = s.getEventPosition(JSBNG__event, \"viewport\"), y = this._gripper.getBoundingClientRect();\n            if (((((x.x < y.right)) && ((x.x > y.left))))) {\n                if (((x.y < y.JSBNG__top))) {\n                    this.setScrollTop(((this.getScrollTop() - this._elem.clientHeight)));\n                }\n                 else if (((x.y > y.bottom))) {\n                    this.setScrollTop(((this.getScrollTop() + this._elem.clientHeight)));\n                }\n                \n            ;\n            ;\n                JSBNG__event.prevent();\n            }\n        ;\n        ;\n        },\n        _handleMouseMove: function(JSBNG__event) {\n            var x = ((this._options.fade !== false));\n            if (((i.hasPointerEvents() || x))) {\n                this._mousePos = s.getEventPosition(JSBNG__event);\n                this._throttledRespondMouseMove();\n            }\n        ;\n        ;\n        },\n        _respondMouseMove: function() {\n            if (!this._mouseOver) {\n                return;\n            }\n        ;\n        ;\n            var x = ((this._options.fade !== false)), y = this._mousePos, z = s.getElementPosition(this._track).x, aa = s.getElementDimensions(this._track).x, ba = Math.abs(((((z + ((aa / 2)))) - y.x)));\n            j.conditionClass(this._elem, \"uiScrollableAreaTrackOver\", ((i.hasPointerEvents() && ((ba <= 10)))));\n            if (x) {\n                if (((ba < 25))) {\n                    this.showScrollbar(false);\n                }\n                 else if (!this._options.no_fade_on_hover) {\n                    this.hideScrollbar();\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        _handleScroll: function(JSBNG__event) {\n            if (this._needsGripper()) {\n                this._slideGripper();\n            }\n        ;\n        ;\n            this.throttledAdjustGripper();\n            if (((this._options.fade !== false))) {\n                this.showScrollbar();\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__scroll\");\n        },\n        _handleMouseLeave: function() {\n            this._mouseOver = false;\n            this.hideScrollbar();\n        },\n        _handleMouseEnter: function() {\n            this._mouseOver = true;\n            this.showScrollbar();\n        },\n        hideScrollbar: function(x) {\n            if (!this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = false;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (x) {\n                q.set(this._track, \"opacity\", 0);\n                j.addClass.curry(this._track, \"invisible_elem\");\n            }\n             else this._hideTimeout = function() {\n                if (this._hideAnimation) {\n                    this._hideAnimation.JSBNG__stop();\n                    this._hideAnimation = null;\n                }\n            ;\n            ;\n                this._hideAnimation = (new g(this._track)).from(\"opacity\", 1).to(\"opacity\", 0).duration(250).ondone(j.addClass.curry(this._track, \"invisible_elem\")).go();\n            }.bind(this).defer(750);\n        ;\n        ;\n            return this;\n        },\n        resize: function() {\n            var x = s.getElementDimensions(this._elem).x;\n            if (((this._options.fade === false))) {\n                x -= 10;\n            }\n        ;\n        ;\n            x = Math.max(0, x);\n            q.set(this._body, \"width\", ((x + \"px\")));\n            return this;\n        },\n        showScrollbar: function(x) {\n            this.throttledAdjustGripper();\n            if (this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = true;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (this._hideAnimation) {\n                this._hideAnimation.JSBNG__stop();\n                this._hideAnimation = null;\n            }\n        ;\n        ;\n            q.set(this._track, \"opacity\", 1);\n            j.removeClass(this._track, \"invisible_elem\");\n            if (((((x !== false)) && !this._options.no_fade_on_hover))) {\n                this.hideScrollbar();\n            }\n        ;\n        ;\n            return this;\n        },\n        isScrolledToBottom: function() {\n            return ((this._wrap.scrollTop >= ((this._contentHeight - this._containerHeight))));\n        },\n        isScrolledToTop: function() {\n            return ((this._wrap.scrollTop === 0));\n        },\n        scrollToBottom: function(x) {\n            this.setScrollTop(this._wrap.scrollHeight, x);\n        },\n        scrollToTop: function(x) {\n            this.setScrollTop(0, x);\n        },\n        scrollIntoView: function(x, y) {\n            var z = this._wrap.clientHeight, aa = x.offsetHeight, ba = this._wrap.scrollTop, ca = ((ba + z)), da = x.offsetTop, ea = ((da + aa));\n            if (((((da < ba)) || ((z < aa))))) {\n                this.setScrollTop(da, y);\n            }\n             else if (((ea > ca))) {\n                this.setScrollTop(((ba + ((ea - ca)))), y);\n            }\n            \n        ;\n        ;\n        },\n        poke: function() {\n            var x = this._wrap.scrollTop;\n            this._wrap.scrollTop += 1;\n            this._wrap.scrollTop -= 1;\n            this._wrap.scrollTop = x;\n            return this.showScrollbar(false);\n        },\n        getScrollTop: function() {\n            return this._wrap.scrollTop;\n        },\n        getScrollHeight: function() {\n            return this._wrap.scrollHeight;\n        },\n        setScrollTop: function(x, y, z) {\n            if (((y !== false))) {\n                if (this._scrollTopAnimation) {\n                    this._scrollTopAnimation.JSBNG__stop();\n                }\n            ;\n            ;\n                z = ((z || {\n                }));\n                var aa = ((z.duration || 250)), ba = ((z.ease || g.ease.end));\n                this._scrollTopAnimation = (new g(this._wrap)).to(\"scrollTop\", x).ease(ba).duration(aa).go();\n            }\n             else this._wrap.scrollTop = x;\n        ;\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Menu\", [\"CSS\",\"Class\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Keys\",\"Parent\",\"PopoverMenuInterface\",\"ScrollableArea\",\"Style\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Class\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"PopoverMenuInterface\"), o = b(\"ScrollableArea\"), p = b(\"Style\"), q = b(\"copyProperties\"), r = b(\"cx\");\n    function s(t, u) {\n        this.parent.construct(this);\n        this._items = [];\n        for (var v = 0; ((v < t.length)); v++) {\n            this._items[v] = new t[v].ctor(t[v]);\n        ;\n        };\n    ;\n        this._config = ((u || {\n        }));\n        this._theme = ((u.theme || {\n        }));\n    };\n;\n    h.extend(s, n);\n    q(s.prototype, {\n        _focused: null,\n        _root: null,\n        addItem: function(t) {\n            this._addItem(t);\n        },\n        addItemBefore: function(t, u) {\n            this._addItem(t, u, false);\n        },\n        addItemAfter: function(t, u) {\n            this._addItem(t, u, true);\n        },\n        _addItem: function(t, u, v) {\n            var w = this._items.indexOf(t);\n            if (((w >= 0))) {\n                var x = ((v ? -1 : 1));\n                if (((this._items[((w + x))] == u))) {\n                    return;\n                }\n            ;\n            ;\n                this._items.splice(w, 1);\n            }\n        ;\n        ;\n            if (u) {\n                w = this._items.indexOf(u);\n                if (((w < 0))) {\n                    throw new Error(\"reference item must already be in the menu\");\n                }\n            ;\n            ;\n                if (v) {\n                    w++;\n                }\n            ;\n            ;\n                this._items.splice(w, 0, t);\n            }\n             else this._items.push(t);\n        ;\n        ;\n            if (this._root) {\n                this._insertItem(t, u, v);\n            }\n        ;\n        ;\n        },\n        removeItem: function(t) {\n            var u = this._items.indexOf(t);\n            if (((u < 0))) {\n                return;\n            }\n        ;\n        ;\n            this._items.splice(u, 1);\n            ((this._root && j.remove(t.getRoot())));\n        },\n        forEachItem: function(t) {\n            this._items.forEach(t);\n        },\n        getItemAt: function(t) {\n            return ((this._items[t] || null));\n        },\n        getRoot: function() {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        onShow: function() {\n            if (this._config.maxheight) {\n                if (!this._scrollableArea) {\n                    this._scrollableArea = o.fromNative(this._scrollableElems.root, {\n                        fade: true\n                    });\n                }\n                 else this._scrollableArea.resize();\n            ;\n            }\n        ;\n        ;\n            this.focusAnItem();\n        },\n        onHide: function() {\n            this.JSBNG__blur();\n        },\n        focusAnItem: function() {\n            return this._attemptFocus(0, 1);\n        },\n        JSBNG__blur: function() {\n            if (this._focused) {\n                this._focused.JSBNG__blur();\n                this._focused = null;\n                this.inform(\"JSBNG__blur\");\n            }\n        ;\n        ;\n        },\n        handleKeydown: function(t, u) {\n            var v = this._items.indexOf(this._focused);\n            switch (t) {\n              case l.UP:\n            \n              case l.DOWN:\n                var w = ((((t === l.UP)) ? -1 : 1));\n                if (((v !== -1))) {\n                    return this._attemptFocus(((v + w)), w);\n                }\n                 else if (((t === l.UP))) {\n                    return this._attemptFocus(((this._items.length - 1)), -1);\n                }\n                 else return this._attemptFocus(0, 1)\n                \n            ;\n                break;\n              case l.SPACE:\n                if (((this._items.indexOf(this._focused) !== -1))) {\n                    this._handleItemClick(this._focused, u);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n              default:\n                var x = String.fromCharCode(t).toLowerCase(), y;\n                for (var z = ((v + 1)); ((z < this._items.length)); z++) {\n                    y = this._items[z].getAccessKey();\n                    if (((y && ((y.charAt(0).toLowerCase() === x))))) {\n                        if (this._focusItem(this._items[z])) {\n                            return true;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                return false;\n            };\n        ;\n        },\n        _render: function() {\n            this._ul = j.create(\"ul\", {\n                className: \"-cx-PUBLIC-abstractMenu__menu\"\n            });\n            this._ul.setAttribute(\"role\", \"menu\");\n            this._items.forEach(function(v) {\n                this._insertItem(v, null);\n            }.bind(this));\n            k.listen(this._ul, \"click\", this._handleClick.bind(this));\n            k.listen(this._ul, \"mouseover\", this._handleMouseOver.bind(this));\n            k.listen(this._ul, \"mouseout\", this._handleMouseOut.bind(this));\n            var t = this._ul;\n            if (this._config.maxheight) {\n                this._scrollableElems = o.renderDOM();\n                j.setContent(this._scrollableElems.JSBNG__content, this._ul);\n                t = this._scrollableElems.root;\n                p.set(this._scrollableElems.wrap, \"max-height\", ((this._config.maxheight + \"px\")));\n            }\n        ;\n        ;\n            var u = ((((\"-cx-PUBLIC-abstractMenu__wrapper\" + ((this._config.className ? ((\" \" + this._config.className)) : \"\")))) + ((this._theme.className ? ((\" \" + this._theme.className)) : \"\"))));\n            this._root = j.create(\"div\", {\n                className: u\n            }, j.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__border\"\n            }, t));\n            ((this._config.id && this._root.setAttribute(\"id\", this._config.id)));\n            this.inform(\"rendered\", this._root);\n        },\n        _needsDefaultBehavior: function(t) {\n            if (((t.isDefaultRequested && t.isDefaultRequested()))) {\n                var u = m.byTag(t.getTarget(), \"a\"), v = ((u && u.getAttribute(\"href\")));\n                return ((v && ((v[0] !== \"#\"))));\n            }\n        ;\n        ;\n            return false;\n        },\n        _handleClick: function(t) {\n            if (!this._needsDefaultBehavior(t)) {\n                var u = this._getItemInstance(t.getTarget());\n                if (u) {\n                    return this._handleItemClick(u, t);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _handleItemClick: function(t, u) {\n            this.inform(\"itemclick\", {\n                item: t,\n                JSBNG__event: u\n            });\n            if (t.hasAction()) {\n                this.done();\n            }\n        ;\n        ;\n            return t.handleClick();\n        },\n        _handleMouseOver: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            ((u && this._focusItem(u, true)));\n        },\n        _handleMouseOut: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            if (((u && ((this._focused === u))))) {\n                this.JSBNG__blur();\n            }\n        ;\n        ;\n        },\n        _insertItem: function(t, u, v) {\n            var w = t.getRoot();\n            g.addClass(w, \"__MenuItem\");\n            i.set(w, \"MenuItem\", t);\n            if (u) {\n                var x = ((v ? j.insertAfter : j.insertBefore));\n                x(u.getRoot(), w);\n            }\n             else j.appendContent(this._ul, w);\n        ;\n        ;\n        },\n        _attemptFocus: function(t, u) {\n            var v = this.getItemAt(t);\n            if (v) {\n                if (this._focusItem(v)) {\n                    return true;\n                }\n                 else return this._attemptFocus(((t + u)), u)\n            ;\n            }\n        ;\n        ;\n            return false;\n        },\n        _focusItem: function(t, u) {\n            if (((t.JSBNG__focus(u) !== false))) {\n                if (((this._focused !== t))) {\n                    this.JSBNG__blur();\n                    this._focused = t;\n                    this.inform(\"JSBNG__focus\");\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        _getItemInstance: function(t) {\n            var u = m.byClass(t, \"__MenuItem\");\n            return ((u ? i.get(u, \"MenuItem\") : null));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuItemInterface\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i() {\n    \n    };\n;\n    g(i.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = this.render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        render: h,\n        getAccessKey: h,\n        hasAction: h.thatReturnsFalse,\n        JSBNG__focus: h.thatReturnsFalse,\n        JSBNG__blur: h.thatReturnsFalse,\n        handleClick: h.thatReturnsFalse\n    });\n    e.exports = i;\n});\n__d(\"MenuItemBase\", [\"Class\",\"DOM\",\"HTML\",\"MenuItemInterface\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"MenuItemInterface\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n) {\n        this.parent.construct(this);\n        this._data = n;\n    };\n;\n    g.extend(m, j);\n    k(m.prototype, {\n        render: function() {\n            var n = \"-cx-PUBLIC-abstractMenuItem__root\";\n            if (this._data.className) {\n                n += ((\" \" + this._data.className));\n            }\n        ;\n        ;\n            var o = {\n                className: n,\n                \"aria-selected\": \"false\"\n            };\n            {\n                var fin110keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin110i = (0);\n                var p;\n                for (; (fin110i < fin110keys.length); (fin110i++)) {\n                    ((p) = (fin110keys[fin110i]));\n                    {\n                        if (((p.indexOf(\"data-\") === 0))) {\n                            o[p] = this._data[p];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return h.create(\"li\", o, this._renderItemContent());\n        },\n        _renderItemContent: function() {\n            return i(this._data.markup).getNodes();\n        }\n    });\n    e.exports = m;\n});\n__d(\"MenuItem\", [\"Class\",\"CSS\",\"DOM\",\"MenuItemBase\",\"React\",\"copyProperties\",\"cx\",\"emptyFunction\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MenuItemBase\"), k = b(\"React\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = b(\"emptyFunction\"), o = b(\"startsWith\");\n    function p(q) {\n        this.parent.construct(this, q);\n        this._disabled = !!this._data.disabled;\n    };\n;\n    g.extend(p, j);\n    l(p.prototype, {\n        getValue: function() {\n            return this._data.value;\n        },\n        getAccessKey: function() {\n            return ((this._data.label && this._data.label.charAt(0)));\n        },\n        hasAction: n.thatReturnsTrue,\n        JSBNG__focus: function(q) {\n            if (((this.isDisabled() || !this._root.offsetParent))) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.addClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"true\");\n            ((q || this._anchor.JSBNG__focus()));\n        },\n        JSBNG__blur: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.removeClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"false\");\n        },\n        handleClick: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            if (((typeof this._onclickHandler === \"function\"))) {\n                return this._onclickHandler();\n            }\n        ;\n        ;\n            return !!((((this._data.rel && ((this._data.rel !== \"ignore\")))) || this._data.href));\n        },\n        setOnClickHandler: function(q) {\n            this._onclickHandler = q;\n        },\n        _renderItemContent: function() {\n            this._anchor = i.create(\"a\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__anchor\"\n            });\n            if (this._data.reactChildren) {\n                k.renderComponent(k.DOM.span({\n                    className: \"-cx-PUBLIC-abstractMenuItem__label\"\n                }, this._data.reactChildren), this._anchor);\n                this._data.label = ((this._anchor.innerText || this._anchor.textContent));\n            }\n             else i.setContent(this._anchor, i.create(\"span\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__label\"\n            }, ((this._data.markup || this._data.label))));\n        ;\n        ;\n            if (this._data.icon) {\n                i.prependContent(this._anchor, this._data.icon);\n                h.addClass(this._anchor, \"-cx-PUBLIC-abstractMenuItem__hasicon\");\n            }\n        ;\n        ;\n            if (!this.isDisabled()) {\n                this._anchor.setAttribute(\"href\", ((this._data.href || \"#\")));\n            }\n        ;\n        ;\n            if (this._data.rel) {\n                this._anchor.setAttribute(\"rel\", this._data.rel);\n            }\n             else if (!this._data.href) {\n                this._anchor.setAttribute(\"rel\", \"ignore\");\n            }\n            \n        ;\n        ;\n            if (this._data.ajaxify) {\n                this._anchor.setAttribute(\"ajaxify\", this._data.ajaxify);\n            }\n        ;\n        ;\n            if (this._data.target) {\n                this._anchor.setAttribute(\"target\", this._data.target);\n            }\n        ;\n        ;\n            {\n                var fin111keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin111i = (0);\n                var q;\n                for (; (fin111i < fin111keys.length); (fin111i++)) {\n                    ((q) = (fin111keys[fin111i]));\n                    {\n                        if (((((typeof q === \"string\")) && o(q, \"data-\")))) {\n                            this._anchor.setAttribute(q, this._data[q]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._anchor.setAttribute(\"role\", \"menuitem\");\n            this._anchor.setAttribute(\"title\", this._data.title);\n            return this._anchor;\n        },\n        isDisabled: function() {\n            return this._disabled;\n        },\n        enable: function() {\n            this._anchor.setAttribute(\"href\", ((this._data.href || \"#\")));\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = false;\n        },\n        disable: function() {\n            this._anchor.removeAttribute(\"href\");\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = true;\n        },\n        render: function() {\n            var q = this.parent.render();\n            if (this._data.disabled) {\n                h.addClass(q, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            }\n        ;\n        ;\n            return q;\n        }\n    });\n    e.exports = p;\n});\n__d(\"MenuSelectableItem\", [\"Class\",\"CSS\",\"MenuItem\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"MenuItem\"), j = b(\"copyProperties\"), k = b(\"cx\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this._selected = !!this._data.selected;\n    };\n;\n    g.extend(l, i);\n    j(l.prototype, {\n        _selected: false,\n        getLabel: function() {\n            return this._data.label;\n        },\n        getIcon: function() {\n            return this._data.icon;\n        },\n        isSelected: function() {\n            return this._selected;\n        },\n        select: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = true;\n        },\n        deselect: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = false;\n        },\n        render: function() {\n            var m = this.parent.render();\n            if (this._data.selected) {\n                h.addClass(m, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            }\n        ;\n        ;\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"SelectableMenu\", [\"Class\",\"Menu\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"Menu\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\");\n    function l(o, p) {\n        this.parent.construct(this, o, p);\n    };\n;\n    function m(o) {\n        return ((((o.select && o.deselect)) && o.isSelected));\n    };\n;\n    function n(o) {\n        return ((m(o) && o.isSelected()));\n    };\n;\n    g.extend(l, h);\n    j(l.prototype, {\n        focusAnItem: function() {\n            for (var o = 0; ((o < this._items.length)); o++) {\n                if (n(this._items[o])) {\n                    if (((this._focusItem(this._items[o]) !== false))) {\n                        return true;\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return this.parent.focusAnItem();\n        },\n        setValue: function(o) {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            var p = k(o);\n            this._items.forEach(function(q) {\n                if (m(q)) {\n                    if (i(p, q.getValue())) {\n                        q.select();\n                    }\n                     else if (n(q)) {\n                        q.deselect();\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n            });\n            this.inform(\"change\", this._getSelection());\n        },\n        _handleItemClick: function(o, p) {\n            if (!m(o)) {\n                return this.parent._handleItemClick(o, p);\n            }\n        ;\n        ;\n            this.inform(\"itemclick\", {\n                item: o,\n                JSBNG__event: p\n            });\n            if (this._config.multiple) {\n                var q = ((n(o) ? o.deselect() : o.select()));\n                if (((q !== false))) {\n                    this.inform(\"change\", this._getSelection());\n                }\n            ;\n            ;\n            }\n             else {\n                if (!n(o)) {\n                    if (((o.select() !== false))) {\n                        this._items.forEach(function(r) {\n                            if (((n(r) && ((r !== o))))) {\n                                r.deselect();\n                            }\n                        ;\n                        ;\n                        });\n                        this.inform(\"change\", this._getSelection());\n                    }\n                ;\n                }\n            ;\n            ;\n                this.done();\n            }\n        ;\n        ;\n            return o.handleClick();\n        },\n        _getSelection: function() {\n            var o = [];\n            this._items.forEach(function(p) {\n                if (n(p)) {\n                    o.push({\n                        label: p.getLabel(),\n                        value: p.getValue(),\n                        item: p\n                    });\n                }\n            ;\n            ;\n            });\n            if (!this._config.multiple) {\n                o = o[0];\n            }\n        ;\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"PopoverLoadingMenu\", [\"Class\",\"DOM\",\"PopoverMenuInterface\",\"copyProperties\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"PopoverMenuInterface\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"joinClasses\");\n    function m(n) {\n        this.parent.construct(this);\n        this._config = ((n || {\n        }));\n        this._theme = ((n.theme || {\n        }));\n    };\n;\n    g.extend(m, i);\n    j(m.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = h.create(\"div\", {\n                    className: l(\"-cx-PUBLIC-abstractMenu__wrapper\", this._config.className, this._theme.className)\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__border\"\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__menu -cx-PUBLIC-abstractLoadingMenu__root\"\n                }, h.create(\"span\", {\n                    className: \"-cx-PUBLIC-abstractLoadingMenu__spinner\"\n                }))));\n            }\n        ;\n        ;\n            return this._root;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TabIsolation\", [\"JSBNG__Event\",\"DOMQuery\",\"Focus\",\"Keys\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOMQuery\"), i = b(\"Focus\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"copyProperties\"), m = [], n = 0;\n    function o(p) {\n        this._root = p;\n        this._eventHandler = null;\n        this._identifier = n++;\n    };\n;\n    l(o.prototype, {\n        enable: function() {\n            m.unshift(this._identifier);\n            this._eventHandler = g.listen(window, \"keydown\", function(p) {\n                if (((m[0] === this._identifier))) {\n                    this._tabHandler(p);\n                }\n            ;\n            ;\n            }.bind(this), g.Priority.URGENT);\n        },\n        disable: function() {\n            var p;\n            if (this._eventHandler) {\n                p = m.indexOf(this._identifier);\n                if (((p > -1))) {\n                    m.splice(p, 1);\n                }\n            ;\n            ;\n                this._eventHandler.remove();\n                this._eventHandler = null;\n            }\n        ;\n        ;\n        },\n        _tabHandler: function(p) {\n            if (((g.getKeyCode(p) !== j.TAB))) {\n                return;\n            }\n        ;\n        ;\n            var q = p.getTarget();\n            if (!q) {\n                return;\n            }\n        ;\n        ;\n            var r = k.JSBNG__find(this._root), s = r[0], t = r[((r.length - 1))], u = p.getModifiers().shift;\n            if (((u && ((q === s))))) {\n                p.preventDefault();\n                i.set(t);\n            }\n             else if (((((!u && ((q === t)))) || !h.contains(this._root, q)))) {\n                p.preventDefault();\n                i.set(s);\n            }\n            \n        ;\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"AccessibleLayer\", [\"JSBNG__Event\",\"DOM\",\"Focus\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Focus\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    j(l.prototype, {\n        enable: function() {\n            this._afterShowSubscription = this._layer.subscribe(\"aftershow\", this._onAfterShow.bind(this));\n        },\n        disable: function() {\n            ((this._listener && this._listener.remove()));\n            this._afterShowSubscription.unsubscribe();\n            this._listener = this._afterShowSubscription = null;\n        },\n        _closeListener: function(JSBNG__event) {\n            var m = this._layer.getCausalElement();\n            if (m) {\n                if (((m.tabIndex == -1))) {\n                    m.tabIndex = 0;\n                    i.setWithoutOutline(m);\n                }\n                 else i.set(m);\n            ;\n            }\n        ;\n        ;\n            this._layer.hide();\n        },\n        _onAfterShow: function() {\n            var m = this._layer.getContentRoot();\n            if (h.scry(m, \".layer_close_elem\")[0]) {\n                return;\n            }\n        ;\n        ;\n            var n = h.create(\"a\", {\n                className: \"accessible_elem layer_close_elem\",\n                href: \"#\"\n            }, [\"Close popup and return\",]);\n            h.appendContent(m, n);\n            this._listener = g.listen(n, \"click\", this._closeListener.bind(this));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualLayerAsyncRelative\", [\"JSBNG__Event\",\"copyProperties\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Parent\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _layerSubscription: null,\n        _listener: null,\n        enable: function() {\n            this._layerSubscription = this._layer.subscribe(\"show\", this._attachListener.bind(this));\n            if (this._layer.isShown()) {\n                this._attachListener();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._layerSubscription.unsubscribe();\n            this._layerSubscription = null;\n            if (this._listener) {\n                this._listener.remove();\n                this._listener = null;\n            }\n        ;\n        ;\n        },\n        _attachListener: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._onclick.bind(this));\n        },\n        _onclick: function(k) {\n            var l = i.byTag(k.getTarget(), \"A\");\n            if (!l) {\n                return;\n            }\n        ;\n        ;\n            var m = l.getAttribute(\"ajaxify\"), n = l.href, o = ((m || n));\n            if (((((l.rel === \"async\")) || ((l.rel === \"async-post\"))))) {\n                d([\"AsyncRequest\",], function(p) {\n                    p.bootstrap(o, this._layer.getContext(), ((l.rel === \"async-post\")));\n                }.bind(this));\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ContextualLayerUpdateOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attachScrollListener.bind(this)),this._layer.subscribe(\"hide\", this._removeScrollListener.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        _attachScrollListener: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.updatePosition.bind(this._layer));\n        },\n        _removeScrollListener: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerAutoFocus\", [\"function-extensions\",\"DOMQuery\",\"Focus\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Focus\"), i = b(\"TabbableElements\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"aftershow\", this._focus.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _focus: function() {\n            var l = this._layer.getRoot(), m = g.scry(l, \".autofocus\")[0], n = true;\n            if (!m) {\n                var o = JSBNG__document.activeElement;\n                if (g.isNodeOfType(o, [\"input\",\"textarea\",])) {\n                    return;\n                }\n            ;\n            ;\n                var p = i.JSBNG__find(l);\n                for (var q = 0; ((q < p.length)); q++) {\n                    if (((p[q].tagName != \"A\"))) {\n                        m = p[q];\n                        n = false;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else if (((m.tabIndex !== 0))) {\n                n = false;\n            }\n            \n        ;\n        ;\n            if (m) {\n                ((n ? h.set(m) : h.setWithoutOutline(m)));\n            }\n             else {\n                l.tabIndex = 0;\n                h.setWithoutOutline(l);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerButtons\", [\"JSBNG__Event\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Parent\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    i(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _handle: function(k) {\n            var l = k.getTarget(), m = h.byClass(l, \"layerConfirm\");\n            if (m) {\n                if (((this._layer.inform(\"JSBNG__confirm\", m) === false))) {\n                    k.prevent();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var n = h.byClass(l, \"layerCancel\");\n            if (n) {\n                if (((this._layer.inform(\"cancel\", n) !== false))) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                k.prevent();\n                return;\n            }\n        ;\n        ;\n            var o = h.byClass(l, \"layerButton\");\n            if (o) {\n                if (((this._layer.inform(\"button\", o) === false))) {\n                    k.prevent();\n                }\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerDestroyOnHide\", [\"function-extensions\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"shield\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    g(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", h(Function.prototype.defer, this._layer.destroy.bind(this._layer)));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerFadeOnHide\", [\"Animation\",\"Layer\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Layer\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (((j.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe(\"starthide\", this._handleStartHide.bind(this));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        },\n        _handleStartHide: function() {\n            var m = true, n = h.subscribe(\"show\", function() {\n                n.unsubscribe();\n                m = false;\n            });\n            (function() {\n                n.unsubscribe();\n                n = null;\n                if (m) {\n                    this._animate();\n                }\n                 else this._layer.finishHide();\n            ;\n            ;\n            }).bind(this).defer();\n            return false;\n        },\n        _animate: function() {\n            new g(this._layer.getRoot()).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(this._finish.bind(this)).go();\n        },\n        _finish: function() {\n            i.set(this._layer.getRoot(), \"opacity\", \"\");\n            this._layer.finishHide();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerFadeOnShow\", [\"Animation\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\"), i = b(\"UserAgent\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            if (((i.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscriptions = [this._layer.subscribe(\"beforeshow\", function() {\n                h.set(this._layer.getRoot(), \"opacity\", 0);\n            }.bind(this)),this._layer.subscribe(\"show\", this._animate.bind(this)),];\n        },\n        disable: function() {\n            if (this._subscriptions) {\n                while (this._subscriptions.length) {\n                    this._subscriptions.pop().unsubscribe();\n                ;\n                };\n            ;\n                this._subscriptions = null;\n            }\n        ;\n        ;\n        },\n        _getDuration: function() {\n            return 100;\n        },\n        _animate: function() {\n            var l = this._layer.getRoot();\n            new g(l).from(\"opacity\", 0).to(\"opacity\", 1).duration(this._getDuration()).ondone(h.set.curry(l, \"opacity\", \"\")).go();\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerFormHooks\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var j = this._layer.getRoot();\n            this._subscriptions = [g.listen(j, \"submit\", this._onSubmit.bind(this)),g.listen(j, \"success\", this._onSuccess.bind(this)),g.listen(j, \"error\", this._onError.bind(this)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(j) {\n                j.remove();\n            });\n            this._subscriptions = null;\n        },\n        _onSubmit: function(JSBNG__event) {\n            if (((this._layer.inform(\"submit\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onSuccess: function(JSBNG__event) {\n            if (((this._layer.inform(\"success\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onError: function(JSBNG__event) {\n            var j = JSBNG__event.getData();\n            if (((this._layer.inform(\"error\", {\n                response: j.response\n            }) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnBlur\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n;\n    g(h.prototype, {\n        _subscriptions: null,\n        _onBlur: null,\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attach.bind(this)),this._layer.subscribe(\"hide\", this._detach.bind(this)),];\n            if (this._layer.isShown()) {\n                this._attach();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._detach();\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = null;\n        },\n        _detach: function() {\n            ((this._onBlur && this._onBlur.unsubscribe()));\n            this._onBlur = null;\n        },\n        _attach: function() {\n            this._onBlur = this._layer.subscribe(\"JSBNG__blur\", function() {\n                this._layer.hide();\n                return false;\n            }.bind(this));\n        }\n    });\n    e.exports = h;\n});\n__d(\"LayerMouseHooks\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ContextualThing\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ContextualThing\"), j = b(\"Layer\"), k = b(\"copyProperties\"), l = new h();\n    function m(n) {\n        this._layer = n;\n        this._subscriptions = [];\n        this._currentlyActive = false;\n    };\n;\n    k(m.prototype, {\n        enable: function() {\n            this._subscriptions = [l.subscribe(\"mouseenter\", this._handleActive.bind(this)),l.subscribe(\"mouseleave\", this._handleInactive.bind(this)),this._layer.subscribe(\"hide\", function() {\n                this._currentlyActive = false;\n            }.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = [];\n            this._currentlyActive = false;\n        },\n        _handleActive: function(n, o) {\n            if (((!this._currentlyActive && this._isNodeWithinStack(o)))) {\n                this._layer.inform(\"mouseenter\");\n                this._currentlyActive = true;\n            }\n        ;\n        ;\n        },\n        _handleInactive: function(n, o) {\n            if (this._currentlyActive) {\n                if (((!o || !this._isNodeWithinStack(o)))) {\n                    this._layer.inform(\"mouseleave\");\n                    this._currentlyActive = false;\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        _isNodeWithinStack: function(n) {\n            return i.containsIncludingLayers(this._layer.getContentRoot(), n);\n        }\n    });\n    j.subscribe(\"show\", function(n, o) {\n        var p = o.getContentRoot(), q = [g.listen(p, \"mouseenter\", function() {\n            l.inform(\"mouseenter\", p);\n        }),g.listen(p, \"mouseleave\", function(s) {\n            l.inform(\"mouseleave\", s.getRelatedTarget());\n        }),], r = o.subscribe(\"hide\", function() {\n            while (q.length) {\n                q.pop().remove();\n            ;\n            };\n        ;\n            r.unsubscribe();\n            q = r = null;\n        });\n    });\n    e.exports = m;\n});\n__d(\"LayerRefocusOnHide\", [\"copyProperties\",\"Focus\",\"ContextualThing\",\"DOM\",\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Focus\"), i = b(\"ContextualThing\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"Parent\");\n    function m(n) {\n        this._layer = n;\n    };\n;\n    g(m.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(n, JSBNG__event) {\n            if (((((JSBNG__document.activeElement === JSBNG__document.body)) || k.contains(this._layer.getRoot(), JSBNG__document.activeElement)))) {\n                var o = this._layer.getCausalElement();\n                while (((o && (!o.offsetWidth)))) {\n                    var p = l.byClass(o, \"uiToggle\");\n                    if (((p && p.offsetWidth))) {\n                        o = j.scry(p, \"[rel=\\\"toggle\\\"]\")[0];\n                    }\n                     else {\n                        var q = i.getContext(o);\n                        if (q) {\n                            o = q;\n                        }\n                         else o = o.parentNode;\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((o && ((o.tabIndex != -1))))) {\n                    h.setWithoutOutline(o);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"LayerTabIsolation\", [\"TabIsolation\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TabIsolation\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n        this._tabIsolation = null;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._tabIsolation = new g(this._layer.getRoot());\n            this._subscriptions = [this._layer.subscribe(\"show\", this._tabIsolation.enable.bind(this._tabIsolation)),this._layer.subscribe(\"hide\", this._tabIsolation.disable.bind(this._tabIsolation)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._tabIsolation.disable();\n            this._tabIsolation = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ModalLayer\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMDimensions\",\"DOMQuery\",\"ScrollAwareDOM\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"isAsyncScrollQuery\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"DOMQuery\"), n = b(\"ScrollAwareDOM\"), o = b(\"Style\"), p = b(\"URI\"), q = b(\"UserAgent\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"debounceAcrossTransitions\"), w = b(\"isAsyncScrollQuery\"), x = b(\"removeFromArray\"), y = [], z = null, aa = null, ba = null;\n    function ca() {\n        if (!ba) {\n            ba = m.scry(JSBNG__document.body, \".-cx-PRIVATE-fbLayout__root\")[0];\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function da(la) {\n        var ma = {\n            position: r.getScrollPosition()\n        }, na = ((la.offsetTop - ma.position.y));\n        i.addClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n        o.set(la, \"JSBNG__top\", ((na + \"px\")));\n        h.inform(\"reflow\");\n        ma.listener = n.subscribe(\"JSBNG__scroll\", function(oa, pa) {\n            if (m.contains(la, pa.target)) {\n                var qa = ((la.offsetTop - pa.delta.y));\n                o.set(la, \"JSBNG__top\", ((qa + \"px\")));\n                ma.position = ma.position.add(pa.delta);\n                return false;\n            }\n        ;\n        ;\n        });\n        j.set(la, \"ModalLayerData\", ma);\n        if (((q.firefox() < 13))) {\n            ea.curry(la).defer();\n        }\n    ;\n    ;\n    };\n;\n    function ea(la) {\n        m.scry(la, \"div.swfObject\").forEach(function(ma) {\n            var na = ma.getAttribute(\"data-swfid\");\n            if (((na && window[na]))) {\n                var oa = window[na];\n                oa.addParam(\"autostart\", \"false\");\n                oa.addParam(\"autoplay\", \"false\");\n                oa.addParam(\"play\", \"false\");\n                oa.addVariable(\"video_autoplay\", \"0\");\n                oa.addVariable(\"autoplay\", \"0\");\n                oa.addVariable(\"play\", \"0\");\n                var pa = p(oa.getAttribute(\"swf\"));\n                pa.addQueryData({\n                    autoplay: \"0\"\n                });\n                pa.setPath(pa.getPath().replace(\"autoplay=1\", \"autoplay=0\"));\n                oa.setAttribute(\"swf\", pa.toString());\n                oa.write(ma);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function fa(la, ma) {\n        var na = j.get(la, \"ModalLayerData\");\n        if (na) {\n            var oa = function() {\n                i.removeClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n                o.set(la, \"JSBNG__top\", \"\");\n                if (ma) {\n                    var ra = m.getDocumentScrollElement();\n                    ra.scrollTop = na.position.y;\n                }\n            ;\n            ;\n                h.inform(\"reflow\");\n                na.listener.unsubscribe();\n                na.listener = null;\n                j.remove(la, \"ModalLayerData\");\n            };\n            if (((ma && w()))) {\n                var pa = k.create(\"div\", {\n                    className: \"-cx-PRIVATE-ModalLayer__support\"\n                });\n                o.set(pa, \"height\", ((la.offsetHeight + \"px\")));\n                k.appendContent(JSBNG__document.body, pa);\n                var qa = m.getDocumentScrollElement();\n                qa.scrollTop = na.position.y;\n                ma = false;\n                !function() {\n                    oa();\n                    k.remove(pa);\n                }.defer();\n            }\n             else oa();\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((q.ie() < 7))) {\n            o.set(la, \"height\", \"\");\n        }\n    ;\n    ;\n    };\n;\n    function ga() {\n        var la = ca();\n        if (!i.hasClass(la, \"-cx-PRIVATE-ModalLayer__fixed\")) {\n            da(la);\n        }\n    ;\n    ;\n    };\n;\n    function ha() {\n        if (!y.length) {\n            fa(ca(), true);\n        }\n    ;\n    ;\n    };\n;\n    function ia() {\n        var la;\n        if (((q.ie() < 7))) {\n            var ma = y[((y.length - 1))].getLayerRoot(), na = Math.max(ma.offsetHeight, ma.scrollHeight);\n            la = function(ta) {\n                o.set(ta, \"height\", ((((-ta.offsetTop + na)) + \"px\")));\n            };\n        }\n    ;\n    ;\n        var oa = y.length;\n        while (oa--) {\n            var pa = y[oa], qa = pa.getLayerRoot();\n            ja(qa, \"\");\n            var ra = pa.getLayerContentRoot(), sa = ((ra.offsetWidth + l.measureElementBox(ra, \"width\", 0, 0, 1)));\n            ja(qa, sa);\n            if (((la && ((oa < ((y.length - 1))))))) {\n                la(qa);\n            }\n        ;\n        ;\n        };\n    ;\n        ((la && la(ca())));\n    };\n;\n    function ja(la, ma) {\n        var na = ((q.ie() < 7));\n        if (((((na && ma)) && ((ma <= JSBNG__document.body.clientWidth))))) {\n            ma = \"\";\n        }\n    ;\n    ;\n        o.set(la, ((na ? \"width\" : \"min-width\")), ((ma + ((ma ? \"px\" : \"\")))));\n    };\n;\n    function ka(la) {\n        this._layer = la;\n    };\n;\n    s(ka.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(la) {\n                ((((la == \"show\")) ? this._addModal() : this._removeModal()));\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._addModal();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._removeModal();\n            }\n        ;\n        ;\n        },\n        _addModal: function() {\n            i.addClass(this.getLayerRoot(), \"-cx-PRIVATE-ModalLayer__root\");\n            var la = y[((y.length - 1))];\n            if (la) {\n                da(la.getLayerRoot());\n            }\n             else ga();\n        ;\n        ;\n            var ma = m.getDocumentScrollElement();\n            ma.scrollTop = 0;\n            if (!y.length) {\n                if (((q.ie() < 7))) {\n                    i.addClass(JSBNG__document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                }\n            ;\n            ;\n                var na = v(ia, 100);\n                z = g.listen(window, \"resize\", na);\n                aa = h.subscribe(\"reflow\", na);\n            }\n        ;\n        ;\n            y.push(this);\n            ia.defer();\n        },\n        _removeModal: function() {\n            var la = this.getLayerRoot();\n            i.removeClass(la, \"-cx-PRIVATE-ModalLayer__root\");\n            ja(la, \"\");\n            var ma = ((this === y[((y.length - 1))]));\n            x(y, this);\n            var na = y[((y.length - 1))];\n            if (!na) {\n                z.remove();\n                z = null;\n                aa.unsubscribe();\n                aa = null;\n            }\n        ;\n        ;\n            !function() {\n                if (na) {\n                    fa(na.getLayerRoot(), ma);\n                }\n                 else ha();\n            ;\n            ;\n                if (y.length) {\n                    ia.defer();\n                }\n                 else if (((q.ie() < 7))) {\n                    i.removeClass(JSBNG__document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                }\n                \n            ;\n            ;\n            }.defer(400, false);\n        },\n        getLayerRoot: function() {\n            return this._layer.getRoot();\n        },\n        getLayerContentRoot: function() {\n            return this._layer.getContentRoot();\n        }\n    });\n    e.exports = ka;\n});\n__d(\"ContextualDialogArrow\", [\"JSXDOM\",\"CSS\",\"DOM\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Locale\"), k = b(\"Style\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        bottom: \"-cx-PUBLIC-abstractContextualDialog__arrowbottom\",\n        JSBNG__top: \"-cx-PUBLIC-abstractContextualDialog__arrowtop\",\n        right: \"-cx-PUBLIC-abstractContextualDialog__arrowright\",\n        left: \"-cx-PUBLIC-abstractContextualDialog__arrowleft\"\n    }, p = {\n        above: \"bottom\",\n        below: \"JSBNG__top\",\n        left: \"right\",\n        right: \"left\"\n    };\n    function q(r) {\n        this._layer = r;\n    };\n;\n    m(q.prototype, {\n        _subscription: null,\n        _arrow: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"adjust\",\"reposition\",], this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(r, s) {\n            if (((r === \"adjust\"))) {\n                this._repositionArrow(s);\n            }\n             else this._repositionRoot(s);\n        ;\n        ;\n        },\n        _repositionRoot: function(r) {\n            var s = r.getAlignment();\n            if (((s == \"center\"))) {\n                return;\n            }\n        ;\n        ;\n            var t = this._layer.getRoot(), u = this._layer.getContext(), v = r.isVertical(), w = this._layer.getArrowDimensions(), x = w.offset, y = w.length, z = l.getElementDimensions(u), aa = ((v ? z.x : z.y));\n            if (((aa >= ((y + ((x * 2))))))) {\n                return;\n            }\n        ;\n        ;\n            var ba = ((((y / 2)) + x)), ca = ((aa / 2)), da = parseInt(((ba - ca)), 10);\n            if (v) {\n                if (((s == \"left\"))) {\n                    var ea = parseInt(k.get(t, \"left\"), 10);\n                    k.set(t, \"left\", ((((ea - da)) + \"px\")));\n                }\n                 else {\n                    var fa = parseInt(k.get(t, \"right\"), 10);\n                    k.set(t, \"right\", ((((fa - da)) + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                var ga = parseInt(k.get(t, \"JSBNG__top\"), 10);\n                k.set(t, \"JSBNG__top\", ((((ga - da)) + \"px\")));\n            }\n        ;\n        ;\n        },\n        _repositionArrow: function(r) {\n            var s = this._layer._contentWrapper, t = r.getPosition(), u = p[t];\n            {\n                var fin112keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin112i = (0);\n                var v;\n                for (; (fin112i < fin112keys.length); (fin112i++)) {\n                    ((v) = (fin112keys[fin112i]));\n                    {\n                        h.conditionClass(s, o[v], ((u === v)));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((t == \"none\"))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._arrow) {\n                this._arrow = g.i({\n                    className: \"-cx-PUBLIC-abstractContextualDialog__arrow\"\n                });\n                i.appendContent(s, this._arrow);\n            }\n        ;\n        ;\n            h.conditionClass(s, \"-cx-PRIVATE-uiContextualDialog__withfooter\", this._layer.getFooter());\n            k.set(this._arrow, \"JSBNG__top\", \"\");\n            k.set(this._arrow, \"left\", \"\");\n            k.set(this._arrow, \"right\", \"\");\n            k.set(this._arrow, \"margin\", \"\");\n            var w = q.getOffsetPercent(r), x = q.getOffset(r, w, this._layer), y = q.getOffsetSide(r);\n            k.set(this._arrow, y, ((w + \"%\")));\n            k.set(this._arrow, ((\"margin-\" + y)), ((x + \"px\")));\n        }\n    });\n    m(q, {\n        getOffsetPercent: function(r) {\n            var s = r.getAlignment(), t = r.getPosition();\n            if (((((t == \"above\")) || ((t == \"below\"))))) {\n                if (((s == \"center\"))) {\n                    return 50;\n                }\n                 else if (((s == \"right\"))) {\n                    return 100;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return 0;\n        },\n        getOffsetSide: function(r) {\n            var s = r.isVertical();\n            return ((s ? ((j.isRTL() ? \"right\" : \"left\")) : \"JSBNG__top\"));\n        },\n        getOffset: function(r, s, t) {\n            var u = t.getArrowDimensions(), v = u.offset, w = u.length, x = r.getAlignment(), y = ((((x == \"center\")) ? 0 : v));\n            y += ((((w * s)) / 100));\n            if (((x != \"left\"))) {\n                y *= -1;\n            }\n        ;\n        ;\n            return y;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ContextualDialogFitInViewport\", [\"JSBNG__Event\",\"ContextualLayerDimensions\",\"Style\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ContextualLayerDimensions\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"throttle\");\n    function m(n) {\n        this._layer = n;\n        this._listeners = [];\n    };\n;\n    k(m.prototype, {\n        _subscription: null,\n        _minimumTop: null,\n        enable: function() {\n            var n = this._layer.getArrowDimensions();\n            this._arrowOffset = n.offset;\n            var o = n.length;\n            this._arrowBuffer = ((this._arrowOffset + o));\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",\"reposition\",], function(p, q) {\n                if (((p == \"reposition\"))) {\n                    this._calculateMinimumTop(q);\n                }\n                 else if (((p == \"show\"))) {\n                    this._attachScroll();\n                    this._adjustForScroll();\n                }\n                 else this._detachScroll();\n                \n            ;\n            ;\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._attachScroll();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (this._layer.isShown()) {\n                this._detachScroll();\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _attachScroll: function() {\n            var n = l(this._adjustForScroll.bind(this)), o = ((this._layer.getContextScrollParent() || window));\n            this._listeners = [g.listen(o, \"JSBNG__scroll\", n),g.listen(window, \"resize\", n),];\n        },\n        _detachScroll: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            this._listeners = [];\n        },\n        _getContentHeight: function() {\n            return j.getElementDimensions(this._layer._contentWrapper).y;\n        },\n        _getContextY: function() {\n            return j.getElementPosition(this._layer.getContext()).y;\n        },\n        _calculateMinimumTop: function(n) {\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            this._minimumTop = ((((this._getContextY() - ((this._getContentHeight() - this._arrowBuffer)))) + n.getOffsetY()));\n        },\n        _adjustForScroll: function() {\n            if (this._layer.isFixed()) {\n                return;\n            }\n        ;\n        ;\n            var n = this._layer._getOrientation();\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            var o = h.getViewportRect(this._layer), p = ((o.b - this._minimumTop));\n            if (((p < 0))) {\n                return;\n            }\n        ;\n        ;\n            var q = this._getContentHeight(), r = ((q - ((this._arrowBuffer + this._arrowOffset)))), s = Math.max(0, Math.min(r, ((r - ((p - q))))));\n            i.set(this._layer.getContent(), \"JSBNG__top\", ((-s + \"px\")));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogDefaultTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = {\n        wrapperClassName: \"-cx-PRIVATE-uiContextualDialog__root\",\n        arrowDimensions: {\n            offset: 15,\n            length: 16\n        }\n    };\n    e.exports = h;\n});\n__d(\"ContextualDialog\", [\"AccessibleLayer\",\"Class\",\"ContextualDialogArrow\",\"ContextualDialogFitInViewport\",\"ContextualLayer\",\"ContextualDialogDefaultTheme\",\"CSS\",\"DOM\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerHideOnTransition\",\"LayerFormHooks\",\"LayerMouseHooks\",\"Style\",\"copyProperties\",\"csx\",\"cx\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"AccessibleLayer\"), h = b(\"Class\"), i = b(\"ContextualDialogArrow\"), j = b(\"ContextualDialogFitInViewport\"), k = b(\"ContextualLayer\"), l = b(\"ContextualDialogDefaultTheme\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"LayerAutoFocus\"), p = b(\"LayerButtons\"), q = b(\"LayerHideOnTransition\"), r = b(\"LayerFormHooks\"), s = b(\"LayerMouseHooks\"), t = b(\"Style\"), u = b(\"copyProperties\"), v = b(\"csx\"), w = b(\"cx\"), x = b(\"removeFromArray\");\n    function y(z, aa) {\n        this.parent.construct(this, z, aa);\n    };\n;\n    h.extend(y, k);\n    u(y.prototype, {\n        _footer: null,\n        _configure: function(z, aa) {\n            u(z, ((z.theme || l)));\n            var ba = ((z.arrowBehavior || i));\n            z.addedBehaviors = ((z.addedBehaviors || []));\n            z.addedBehaviors.push(ba);\n            this._footer = n.scry(aa, \"div.-cx-PUBLIC-abstractContextualDialog__footer\")[0];\n            this.parent._configure(z, aa);\n        },\n        _getDefaultBehaviors: function() {\n            var z = this.parent._getDefaultBehaviors();\n            x(z, q);\n            return z.concat([g,o,j,p,r,s,]);\n        },\n        _buildWrapper: function(z, aa) {\n            m.addClass(aa, \"-cx-PUBLIC-abstractContextualDialog__content\");\n            var ba = this.parent._buildWrapper(z, aa);\n            m.addClass(ba, z.wrapperClassName);\n            if (z.width) {\n                this.setWidth(z.width);\n            }\n        ;\n        ;\n            return ba;\n        },\n        setWidth: function(z) {\n            this._width = Math.floor(z);\n            t.set(this._contentWrapper, \"width\", ((z + \"px\")));\n            return this;\n        },\n        getFooter: function() {\n            return this._footer;\n        },\n        getArrowDimensions: function() {\n            return this._config.arrowDimensions;\n        }\n    });\n    u(y, {\n        setContext: function(z, aa) {\n            z.setContext(aa);\n        }\n    });\n    e.exports = y;\n});\n__d(\"DialogPosition\", [\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = 40, i, j = {\n        calculateTopMargin: function(k, l) {\n            if (i) {\n                return i;\n            }\n        ;\n        ;\n            var m = g.getViewportDimensions(), n = Math.floor(((((((m.x + k)) * ((m.y - l)))) / ((4 * m.x)))));\n            return Math.max(n, h);\n        },\n        setFixedTopMargin: function(k) {\n            i = k;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DialogX\", [\"function-extensions\",\"JSXDOM\",\"Arbiter\",\"Class\",\"CSS\",\"DialogPosition\",\"JSBNG__Event\",\"Layer\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerFormHooks\",\"LayerRefocusOnHide\",\"LayerTabIsolation\",\"ModalLayer\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",\"debounce\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DialogPosition\"), l = b(\"JSBNG__Event\"), m = b(\"Layer\"), n = b(\"LayerAutoFocus\"), o = b(\"LayerButtons\"), p = b(\"LayerFormHooks\"), q = b(\"LayerRefocusOnHide\"), r = b(\"LayerTabIsolation\"), s = b(\"ModalLayer\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"copyProperties\"), w = b(\"cx\"), x = b(\"debounce\"), y = b(\"shield\");\n    function z(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    i.extend(z, m);\n    v(z.prototype, {\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            j.addClass(this.getRoot(), \"-cx-PRIVATE-ModalLayer__xui\");\n            if (ba.autohide) {\n                var da = this.subscribe(\"show\", function() {\n                    da.unsubscribe();\n                    y(this.hide, this).defer(ba.autohide);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([aa,s,n,o,p,r,q,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = ((ba.xui ? \"-cx-PRIVATE-xuiDialog__content\" : \"-cx-PRIVATE-uiDialog__content\")), ea = ((ba.xui ? \"-cx-PUBLIC-xuiDialog__wrapper\" : \"-cx-PUBLIC-uiDialog__wrapper\"));\n            this._innerContent = g.div(null, ca);\n            this._wrapper = g.div({\n                className: ea,\n                role: \"dialog\",\n                \"aria-labelledby\": ((ba.titleID || null))\n            }, g.div({\n                className: da\n            }, this._innerContent));\n            this.setWidth(ba.width);\n            return (g.div({\n                className: \"-cx-PRIVATE-uiDialog__positioner\",\n                role: \"dialog\"\n            }, this._wrapper));\n        },\n        getContentRoot: function() {\n            return this._wrapper;\n        },\n        getInnerContent: function() {\n            return this._innerContent;\n        },\n        updatePosition: function() {\n            var ba = u.getElementDimensions(this._wrapper), ca = k.calculateTopMargin(ba.x, ba.y);\n            t.set(this._wrapper, \"margin-top\", ((ca + \"px\")));\n            this.inform(\"update_position\", {\n                type: \"DialogX\",\n                JSBNG__top: ca\n            });\n        },\n        setWidth: function(ba) {\n            ba = Math.floor(ba);\n            if (((ba === this._width))) {\n                return;\n            }\n        ;\n        ;\n            this._width = ba;\n            t.set(this._wrapper, \"width\", ((ba + \"px\")));\n        },\n        getWidth: function() {\n            return this._width;\n        }\n    });\n    function aa(ba) {\n        this._layer = ba;\n    };\n;\n    v(aa.prototype, {\n        _subscription: null,\n        _resize: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(ba) {\n                if (((ba === \"show\"))) {\n                    this._attach();\n                    h.inform(\"layer_shown\", {\n                        type: \"DialogX\"\n                    });\n                }\n                 else {\n                    this._detach();\n                    h.inform(\"layer_hidden\", {\n                        type: \"DialogX\"\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            ((this._resize && this._detach()));\n        },\n        _attach: function() {\n            this._layer.updatePosition();\n            this._resize = l.listen(window, \"resize\", x(this._layer.updatePosition.bind(this._layer)));\n        },\n        _detach: function() {\n            this._resize.remove();\n            this._resize = null;\n        }\n    });\n    e.exports = z;\n});\n__d(\"eachKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (((!h || !i))) {\n            return;\n        }\n    ;\n    ;\n        var k = Object.keys(h), l;\n        for (l = 0; ((l < k.length)); l++) {\n            i.call(j, k[l], h[k[l]], h, l);\n        ;\n        };\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"LoadingDialogDimensions\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HEIGHT: 96,\n        WIDTH: 300\n    };\n    e.exports = g;\n});\n__d(\"AsyncDialog\", [\"AsyncRequest\",\"Bootloader\",\"CSS\",\"DialogX\",\"DOM\",\"Env\",\"Keys\",\"LayerFadeOnShow\",\"Parent\",\"React\",\"URI\",\"XUISpinner.react\",\"copyProperties\",\"cx\",\"eachKeyVal\",\"emptyFunction\",\"LoadingDialogDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DialogX\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"Keys\"), n = b(\"LayerFadeOnShow\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"URI\"), r = b(\"XUISpinner.react\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"eachKeyVal\"), v = b(\"emptyFunction\"), w = b(\"LoadingDialogDimensions\").WIDTH, x;\n    function y() {\n        if (!x) {\n            var ga = k.create(\"div\", {\n                className: \"-cx-PRIVATE-loadingDialog__spinnercontainer\"\n            });\n            x = new j({\n                width: w,\n                addedBehaviors: [n,],\n                xui: true\n            }, k.create(\"div\", null, ga));\n            p.renderComponent(r({\n                size: \"large\"\n            }), ga);\n            x.subscribe([\"key\",\"JSBNG__blur\",], function(ha, ia) {\n                if (((((ha == \"JSBNG__blur\")) || ((((ha == \"key\")) && ((ia.keyCode == m.ESC))))))) {\n                    ca();\n                    return false;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n        return x;\n    };\n;\n    var z = {\n    }, aa = 1, ba = [];\n    function ca() {\n        u(z, function(ga, ha) {\n            ha.abandon();\n            da(ga);\n        });\n    };\n;\n    function da(ga) {\n        delete z[ga];\n        if (!Object.keys(z).length) {\n            y().hide();\n        }\n    ;\n    ;\n    };\n;\n    function ea(ga, ha) {\n        var ia = aa++;\n        ba[ia] = ha;\n        z[ia] = ga;\n        var ja = da.curry(((\"\" + ia)));\n        s(ga.getData(), {\n            __asyncDialog: ia\n        });\n        y().setCausalElement(ga.getRelativeTo()).show();\n        var ka = ga.finallyHandler;\n        ga.setFinallyHandler(function(la) {\n            var ma = la.getPayload();\n            if (((ma && ma.asyncURL))) {\n                fa.send(new g(ma.asyncURL));\n            }\n        ;\n        ;\n            ja();\n            ((ka && ka(la)));\n        });\n        ga.setInterceptHandler(ja).setAbortHandler(ja);\n        ga.send();\n    };\n;\n    var fa = {\n        send: function(ga, ha) {\n            ea(ga, ((ha || v)));\n        },\n        bootstrap: function(ga, ha, ia) {\n            if (!ga) {\n                return;\n            }\n        ;\n        ;\n            var ja = ((o.byClass(ha, \"stat_elem\") || ha));\n            if (((ja && i.hasClass(ja, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var ka = new q(ga).getQueryData(), la = ((ia === \"dialog\")), ma = new g().setURI(ga).setData(ka).setMethod(((la ? \"GET\" : \"POST\"))).setReadOnly(la).setRelativeTo(ha).setStatusElement(ja).setNectarModuleDataSafe(ha);\n            if (l.is_desktop) {\n                h.loadModules([\"FbdDialogProvider\",], function(na) {\n                    na.sendDialog(ma, fa.send);\n                });\n                return;\n            }\n        ;\n        ;\n            fa.send(ma);\n        },\n        respond: function(ga, ha) {\n            var ia = ba[ga];\n            if (ia) {\n                ia(ha);\n                delete ba[ga];\n            }\n        ;\n        ;\n        },\n        getLoadingDialog: function() {\n            return y();\n        }\n    };\n    e.exports = fa;\n});\n__d(\"Hovercard\", [\"JSXDOM\",\"JSBNG__Event\",\"function-extensions\",\"AccessibleLayer\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ContextualDialog\",\"ContextualThing\",\"DOM\",\"LayerAutoFocus\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"UserAgent\",\"Vector\",\"clickRefAction\",\"cx\",\"emptyFunction\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var i = b(\"AccessibleLayer\"), j = b(\"Arbiter\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"ContextualDialog\"), n = b(\"ContextualThing\"), o = b(\"DOM\"), p = b(\"LayerAutoFocus\"), q = b(\"Parent\"), r = b(\"JSBNG__Rect\"), s = b(\"Style\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"clickRefAction\"), w = b(\"cx\"), x = b(\"emptyFunction\"), y = b(\"tx\"), z = b(\"userAction\"), aa = {\n    }, ba = {\n    }, ca = null, da = null, ea = null, fa = 150, ga = 700, ha = 1000, ia = 250, ja = null, ka = null, la = null, ma = null;\n    function na(JSBNG__event) {\n        var cb = q.byTag(JSBNG__event.getTarget(), \"a\");\n        ((bb.processNode(cb) && JSBNG__event.JSBNG__stop()));\n    };\n;\n    function oa(cb) {\n        da = cb;\n        if (!pa(cb)) {\n            var db;\n            if (((!cb || !(db = qa(cb))))) {\n                ((ba.moveToken && ba.moveToken.remove()));\n                ba = {\n                };\n                return false;\n            }\n        ;\n        ;\n            if (((ba.node != cb))) {\n                ((ba.moveToken && ba.moveToken.remove()));\n                ba = {\n                    node: cb,\n                    endpoint: db,\n                    pos: null\n                };\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function pa(cb) {\n        return ((((cb && ca)) && ((ba.node == cb))));\n    };\n;\n    function qa(cb) {\n        return cb.getAttribute(\"data-hovercard\");\n    };\n;\n    function ra(cb) {\n        var db = h.listen(cb, \"mouseout\", function() {\n            JSBNG__clearTimeout(ja);\n            JSBNG__clearTimeout(ka);\n            db.remove();\n            da = null;\n            if (!bb.contains(cb)) {\n                bb.hide();\n            }\n        ;\n        ;\n        });\n        if (!ba.moveToken) {\n            ba.moveToken = h.listen(cb, \"mousemove\", function(JSBNG__event) {\n                ba.pos = u.getEventPosition(JSBNG__event);\n            });\n        }\n    ;\n    ;\n        JSBNG__clearTimeout(ja);\n        JSBNG__clearTimeout(ka);\n        JSBNG__clearTimeout(ma);\n        var eb = fa, fb = ((ca ? ia : ga));\n        if (cb.getAttribute(\"data-hovercard-instant\")) {\n            eb = fb = 50;\n        }\n    ;\n    ;\n        ja = JSBNG__setTimeout(wa.curry(cb), eb);\n        ka = JSBNG__setTimeout(sa.curry(cb), fb);\n    };\n;\n    function sa(cb, db) {\n        if (((ba.node != cb))) {\n            return;\n        }\n    ;\n    ;\n        var eb = aa[qa(cb)];\n        if (eb) {\n            ua(eb);\n        }\n         else if (db) {\n            ua(ya());\n        }\n         else {\n            var fb = ((ca ? ia : ga));\n            la = JSBNG__setTimeout(sa.curry(cb, true), ((ha - fb)));\n        }\n        \n    ;\n    ;\n    };\n;\n    function ta() {\n        bb.hide(true);\n        JSBNG__clearTimeout(ka);\n    };\n;\n    function ua(cb) {\n        var db = ba.node, eb = ca, fb = ((eb != db));\n        if (ea) {\n            var gb = ea.getContentRoot();\n            if (!n.containsIncludingLayers(gb, db)) {\n                ea.hide();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (!o.contains(JSBNG__document.body, db)) {\n            bb.hide(true);\n            return;\n        }\n    ;\n    ;\n        ca = db;\n        ea = cb;\n        cb.setContextWithBounds(db, va(db)).show();\n        if (fb) {\n            (function() {\n                new l(\"/ajax/hovercard/shown.php\").send();\n                v(\"himp\", ca, null, \"FORCE\", {\n                    ft: {\n                        evt: 39\n                    }\n                });\n                z(\"hovercard\", ca).uai(\"show\");\n            }).defer();\n        }\n    ;\n    ;\n    };\n;\n    function va(cb) {\n        var db = ba.pos, eb = cb.getClientRects();\n        if (((!db || ((eb.length === 0))))) {\n            return r.getElementBounds(cb);\n        }\n    ;\n    ;\n        var fb, gb = false;\n        for (var hb = 0; ((hb < eb.length)); hb++) {\n            var ib = new r(Math.round(eb[hb].JSBNG__top), Math.round(eb[hb].right), Math.round(eb[hb].bottom), Math.round(eb[hb].left), \"viewport\").convertTo(\"JSBNG__document\"), jb = ib.getPositionVector(), kb = jb.add(ib.getDimensionVector());\n            if (((!fb || ((((jb.x <= fb.l)) && ((jb.y > fb.t))))))) {\n                if (gb) {\n                    break;\n                }\n            ;\n            ;\n                fb = new r(jb.y, kb.x, kb.y, jb.x, \"JSBNG__document\");\n            }\n             else {\n                fb.t = Math.min(fb.t, jb.y);\n                fb.b = Math.max(fb.b, kb.y);\n                fb.r = kb.x;\n            }\n        ;\n        ;\n            if (ib.contains(db)) {\n                gb = true;\n            }\n        ;\n        ;\n        };\n    ;\n        return fb;\n    };\n;\n    function wa(cb) {\n        if (((cb.id && ((aa[cb.id] != null))))) {\n            return;\n        }\n    ;\n    ;\n        var db = qa(cb);\n        if (((aa[db] != null))) {\n            return;\n        }\n    ;\n    ;\n        xa(db);\n        var eb = function() {\n            bb.dirty(db);\n            ta();\n        };\n        new k(db).setData({\n            endpoint: db\n        }).setMethod(\"GET\").setReadOnly(true).setErrorHandler(eb).setTransportErrorHandler(eb).send();\n    };\n;\n    function xa(cb) {\n        aa[cb] = false;\n    };\n;\n    var ya = function() {\n        var cb = new m({\n            width: 275\n        }, g.div({\n            className: \"-cx-PRIVATE-hovercard__loading\"\n        }, \"Loading...\"));\n        cb.disableBehavior(i).disableBehavior(p);\n        za(cb);\n        ya = x.thatReturns(cb);\n        return cb;\n    };\n    function za(cb) {\n        var db = [cb.subscribe(\"mouseenter\", function() {\n            JSBNG__clearTimeout(ma);\n            da = ba.node;\n        }),cb.subscribe(\"mouseleave\", function() {\n            cb.hide();\n            da = null;\n        }),cb.subscribe(\"destroy\", function() {\n            while (db.length) {\n                db.pop().unsubscribe();\n            ;\n            };\n        ;\n            db = null;\n        }),];\n    };\n;\n    var ab = true, bb = {\n        hide: function(cb) {\n            if (!ca) {\n                return;\n            }\n        ;\n        ;\n            if (cb) {\n                if (ea) {\n                    ea.hide();\n                }\n            ;\n            ;\n                da = null;\n                ca = null;\n                ea = null;\n            }\n             else ma = JSBNG__setTimeout(bb.hide.curry(true), ia);\n        ;\n        ;\n        },\n        setDialog: function(cb, db) {\n            db.disableBehavior(i).disableBehavior(p);\n            aa[cb] = db;\n            za(db);\n            if (((((ba.endpoint == cb)) && ((da == ba.node))))) {\n                ya().hide();\n                var eb = ba.node.getAttribute(\"data-hovercard-position\");\n                ((eb && db.setPosition(eb)));\n                var fb = ba.node.getAttribute(\"data-hovercard-offset-x\");\n                ((fb && db.setOffsetX(parseInt(fb, 10))));\n                var gb = ba.node.getAttribute(\"data-hovercard-offset-y\");\n                ((gb && db.setOffsetY(parseInt(gb, 10))));\n                ua(db);\n            }\n        ;\n        ;\n        },\n        getDialog: function(cb) {\n            return aa[cb];\n        },\n        contains: function(cb) {\n            if (ea) {\n                return n.containsIncludingLayers(ea.getContentRoot(), cb);\n            }\n        ;\n        ;\n            return false;\n        },\n        dirty: function(cb) {\n            var db = aa[cb];\n            if (db) {\n                db.destroy();\n                delete aa[cb];\n            }\n        ;\n        ;\n        },\n        dirtyAll: function() {\n            {\n                var fin113keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin113i = (0);\n                var cb;\n                for (; (fin113i < fin113keys.length); (fin113i++)) {\n                    ((cb) = (fin113keys[fin113i]));\n                    {\n                        var db = aa[cb];\n                        ((db && bb.dirty(cb)));\n                    };\n                };\n            };\n        ;\n            j.inform(\"Hovercard/dirty\");\n        },\n        processNode: function(cb) {\n            if (((cb && oa(cb)))) {\n                ra(cb);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        setDirtyAllOnPageTransition: function(cb) {\n            ab = cb;\n        }\n    };\n    (function() {\n        if (((t.ie() < 8))) {\n            return;\n        }\n    ;\n    ;\n        h.listen(JSBNG__document.documentElement, \"mouseover\", na);\n        h.listen(window, \"JSBNG__scroll\", function() {\n            if (((ca && s.isFixed(ca)))) {\n                bb.hide(true);\n            }\n        ;\n        ;\n        });\n        j.subscribe(\"page_transition\", function() {\n            ta();\n            ((ab && bb.dirtyAll()));\n        }, j.SUBSCRIBE_NEW);\n    })();\n    e.exports = bb;\n});\n__d(\"StickyPlaceholderInput\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"Input\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Input\"), k = b(\"Parent\"), l = b(\"emptyFunction\");\n    function m(q) {\n        return k.byClass(q, \"uiStickyPlaceholderInput\");\n    };\n;\n    function n(q) {\n        return i.scry(q, \".placeholder\")[0];\n    };\n;\n    function o(q) {\n        q = ((q || window.JSBNG__event));\n        var r = ((q.target || q.srcElement));\n        if (i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            var s = m(r);\n            if (s) {\n                (function() {\n                    h.conditionClass(s, \"uiStickyPlaceholderEmptyInput\", !r.value.length);\n                }).defer();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var p = {\n        init: function() {\n            p.init = l;\n            g.listen(JSBNG__document.documentElement, {\n                keydown: o,\n                paste: o,\n                focusout: o\n            });\n        },\n        registerInput: function(q) {\n            p.init();\n            var r = ((q.getAttribute(\"placeholder\") || \"\"));\n            if (r.length) {\n                if (((JSBNG__document.activeElement === q))) {\n                    var s = g.listen(q, \"JSBNG__blur\", function() {\n                        p.manipulateInput(q, r);\n                        s.remove();\n                    });\n                }\n                 else p.manipulateInput(q, r);\n            ;\n            }\n        ;\n        ;\n        },\n        manipulateInput: function(q, r) {\n            var s = i.create(\"div\", {\n                className: \"placeholder\",\n                \"aria-hidden\": \"true\"\n            }, r), t = i.create(\"div\", {\n                className: \"uiStickyPlaceholderInput\"\n            }, s);\n            if (i.isNodeOfType(q, \"textarea\")) {\n                h.addClass(t, \"uiStickyPlaceholderTextarea\");\n            }\n        ;\n        ;\n            g.listen(s, \"click\", function() {\n                q.JSBNG__focus();\n            });\n            if (((q.value === r))) {\n                q.value = \"\";\n            }\n        ;\n        ;\n            h.removeClass(q, \"DOMControl_placeholder\");\n            q.setAttribute(\"placeholder\", \"\");\n            i.replace(q, t);\n            i.appendContent(t, q);\n            h.conditionClass(t, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n        },\n        setPlaceholderText: function(q, r) {\n            var s = m(q);\n            if (!s) {\n                j.setPlaceholder(q, r);\n            }\n             else {\n                var t = n(s);\n                ((t && i.setContent(t, r)));\n            }\n        ;\n        ;\n        },\n        getPlaceholderText: function(q) {\n            var r = m(q), s = n(r);\n            return ((s && i.getText(s)));\n        },\n        update: function(q) {\n            var r = m(q);\n            if (r) {\n                h.conditionClass(r, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n            }\n        ;\n        ;\n        },\n        getVisibleText: function(q) {\n            var r = m(q);\n            if (h.hasClass(r, \"uiStickyPlaceholderEmptyInput\")) {\n                var s = n(r);\n                return ((s && i.getText(s)));\n            }\n             else return q.value\n        ;\n        }\n    };\n    e.exports = p;\n});\n__d(\"UIForm\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"Form\",\"Run\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"DOM\"), k = b(\"Form\"), l = b(\"Run\"), m = b(\"areObjectsEqual\"), n = b(\"copyProperties\");\n    function o(p, q, r, s, t) {\n        this._root = p;\n        this.controller = p;\n        this._message = q;\n        if (s) {\n            this._confirm_dialog = s;\n            s.subscribe(\"JSBNG__confirm\", this._handleDialogConfirm.bind(this));\n            j.prependContent(this._root, j.create(\"input\", {\n                type: \"hidden\",\n                JSBNG__name: \"confirmed\",\n                value: \"true\"\n            }));\n        }\n    ;\n    ;\n        l.onAfterLoad(function() {\n            this._originalState = k.serialize(this._root);\n        }.bind(this));\n        this._forceDirty = r;\n        this._confirmed = false;\n        this._submitted = false;\n        g.listen(this._root, \"submit\", this._handleSubmit.bind(this));\n        if (((t && t.length))) {\n            this.enableBehaviors(t);\n        }\n    ;\n    ;\n        var u = true;\n        l.onBeforeUnload(this.checkUnsaved.bind(this), u);\n    };\n;\n    n(o.prototype, h, i, {\n        getRoot: function() {\n            return this._root;\n        },\n        _handleSubmit: function() {\n            if (((this._confirm_dialog && !this._confirmed))) {\n                this._confirm_dialog.show();\n                return false;\n            }\n        ;\n        ;\n            if (((this.inform(\"submit\") === false))) {\n                return false;\n            }\n        ;\n        ;\n            this._submitted = true;\n            return true;\n        },\n        _handleDialogConfirm: function() {\n            this._confirmed = true;\n            this._confirm_dialog.hide();\n            if (this._root.getAttribute(\"ajaxify\")) {\n                g.fire(this._root, \"submit\");\n            }\n             else if (this._handleSubmit()) {\n                this._root.submit();\n            }\n            \n        ;\n        ;\n        },\n        reset: function() {\n            this.inform(\"reset\");\n            this._submitted = false;\n            this._confirmed = false;\n        },\n        isDirty: function() {\n            if (((this._submitted || !j.contains(JSBNG__document.body, this._root)))) {\n                return false;\n            }\n        ;\n        ;\n            if (this._forceDirty) {\n                return true;\n            }\n        ;\n        ;\n            var p = k.serialize(this._root);\n            return !m(p, this._originalState);\n        },\n        checkUnsaved: function() {\n            if (this.isDirty()) {\n                return this._message;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = ((a.UIForm || o));\n});\n__d(\"MenuTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        className: \"-cx-PRIVATE-uiMenu__root\"\n    };\n});\n__d(\"legacy:Tooltip\", [\"Tooltip\",], function(a, b, c, d) {\n    a.Tooltip = b(\"Tooltip\");\n}, 3);\n__d(\"BanzaiODS\", [\"Banzai\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"invariant\");\n    function i() {\n        var k = {\n        };\n        function l(m, n, o, p) {\n            var q = ((k[m] || (k[m] = {\n            }))), r = ((q[n] || (q[n] = [0,])));\n            if (((o === undefined))) {\n                o = 1;\n            }\n        ;\n        ;\n            if (((p === undefined))) {\n                p = 1;\n            }\n        ;\n        ;\n            o = Number(o);\n            p = Number(p);\n            if (((!isFinite(o) || !isFinite(p)))) {\n                return;\n            }\n        ;\n        ;\n            r[0] += o;\n            if (((arguments.length >= 4))) {\n                if (!r[1]) {\n                    r[1] = 0;\n                }\n            ;\n            ;\n                r[1] += p;\n            }\n        ;\n        ;\n        };\n    ;\n        return {\n            bumpEntityKey: function(m, n, o) {\n                l(m, n, o);\n            },\n            bumpFraction: function(m, n, o, p) {\n                l(m, n, o, p);\n            },\n            flush: function(m) {\n                {\n                    var fin114keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin114i = (0);\n                    var n;\n                    for (; (fin114i < fin114keys.length); (fin114i++)) {\n                        ((n) = (fin114keys[fin114i]));\n                        {\n                            g.post(((\"ods:\" + n)), k[n], m);\n                        ;\n                        };\n                    };\n                };\n            ;\n                k = {\n                };\n            }\n        };\n    };\n;\n    var j = i();\n    j.create = i;\n    g.subscribe(g.SEND, j.flush.bind(j, null));\n    e.exports = j;\n});\n__d(\"endsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i, ((h.length - i.length))) > -1));\n    };\n;\n    e.exports = g;\n});\n__d(\"extendArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Array.prototype.push.apply(h, i);\n        return h;\n    };\n;\n    e.exports = g;\n});");
// 5683
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o26,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/u8zNU2dsVui.js",o57);
// undefined
o26 = null;
// undefined
o57 = null;
// 5704
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_171[0], o36,o58);
// undefined
o36 = null;
// undefined
o58 = null;
// 5978
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_171[1], o37,o67);
// undefined
o37 = null;
// undefined
o67 = null;
// 8467
JSBNG_Replay.s89b45f8367840725134eb4d5bfbd7b4248c14bdd_89[0](undefined);
// 8469
fpc.call(JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_845[0], o85,undefined);
// undefined
o85 = null;
// 8509
fpc.call(JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_845[0], o41,undefined);
// undefined
o41 = null;
// 8547
fpc.call(JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_523[0], o35,undefined);
// undefined
o35 = null;
// 8575
fpc.call(JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_845[0], o4,undefined);
// undefined
o4 = null;
// 8612
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"63VzN\",]);\n}\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString()\n            };\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\"));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && (i.getPath() == \"/ajax/vault/sharer_preview.php\"));\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            };\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    document.location.reload();\n                }\n                 else i(m);\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((7 * 24) * 3600000));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"LoginFormController\", [\"Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt((Date.now() / 1000), 10);\n        };\n    };\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; (j && (j != document.body)); j = j.parentNode) {\n                    if ((!j.id || (typeof j.id !== \"string\"))) {\n                        continue;\n                    };\n                    if ((j.id.substr(0, 8) == \"pagelet_\")) {\n                        return j.id.substr(8)\n                    };\n                    if ((j.id.substr(0, 8) == \"box_app_\")) {\n                        return j.id\n                    };\n                    if (i[j.id]) {\n                        return j.id\n                    };\n                };\n            }\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = (((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\")))) || h.action) || h.href) || h.name));\n            return ((typeof i === \"string\") ? i : null);\n        },\n        should_report: function(h, i) {\n            if ((i == \"FORCE\")) {\n                return true\n            };\n            if ((i == \"INDIRECT\")) {\n                return false\n            };\n            return (h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\"))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            document.cookie = (((\"act=\" + encodeURIComponent(i)) + \"; path=/; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        };\n    };\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"content\")) {\n            return [0,0,0,0,]\n        };\n        var r = n(\"content\"), s = (a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        });\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n    function p(q, r, event, s) {\n        var t = ((!a.ArbiterMonitor) ? \"r\" : \"a\"), u = [0,0,0,0,], v, w, x;\n        if (!!event) {\n            v = event.type;\n            if (((v == \"click\") && l(\"content\"))) {\n                u = o(event);\n            };\n            var y = 0;\n            (event.ctrlKey && (y += 1));\n            (event.shiftKey && (y += 2));\n            (event.altKey && (y += 4));\n            (event.metaKey && (y += 8));\n            if (y) {\n                v += y;\n            };\n        }\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        };\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n        var aa = j((!!event ? ((event.target || event.srcElement)) : r), [\"ft\",\"gt\",]);\n        k(aa.ft, (s.ft || {\n        }));\n        k(aa.gt, (s.gt || {\n        }));\n        if ((typeof (aa.ft.ei) === \"string\")) {\n            delete aa.ft.ei;\n        };\n        var ba = [q._ue_ts,q._ue_count,(w || \"-\"),q._context,(v || \"-\"),(x || i.get_intern_ref(r)),t,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),aa,].concat(u).concat(z);\n        return ba;\n    };\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.location.origin);\n            };\n        }\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l\n                };\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if ((la == \"#\")) {\n                return false\n            };\n            la = new s(la);\n            if ((la.getDomain() && (la.getDomain() != s().getDomain()))) {\n                return false\n            };\n            if ((la.getPath() == \"/l.php\")) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if ((ma && (ma != s().getDomain()))) {\n                        return false\n                    };\n                }\n            ;\n            }\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += (\"?\" + s.implodeQuery(oa));\n            };\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = (la || \"Facebook\");\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.setInterval(function() {\n                    var ma = da, na = k.get();\n                    if ((ma != na)) {\n                        k.set(ma);\n                    };\n                }, 5000, false);\n            };\n        }\n    ;\n    };\n    function ga(la) {\n        var ma = document.getElementsByTagName(\"link\");\n        for (var na = 0; (na < ma.length); ++na) {\n            if ((ma[na].rel != \"alternate\")) {\n                continue;\n            };\n            l.remove(ma[na]);\n        };\n        if (la.length) {\n            var oa = l.find(document, \"head\");\n            (oa && l.appendContent(oa, n(la[0])));\n        }\n    ;\n    };\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            (this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\"));\n            p.transitionComplete();\n            (this._onPageDisplayed && this._onPageDisplayed(this.pipe));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if ((la.version == y)) {\n                return true\n            };\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga((ma.syndication || []));\n            window.scrollTo(0, 0);\n            j.go(document.body, (ma.body_class || \"\"), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return (ba >= z);\n    };\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false\n        };\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false\n        };\n        window.ExitTime = Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"content\").send();\n        return true;\n    };\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if ((typeof oa !== \"function\")) {\n                oa = eval.bind(null, oa);\n            };\n            var ra = ma(m.guard(oa), pa);\n            if ((pa > 0)) {\n                if ((qa !== false)) {\n                    r.onLeave(function() {\n                        clearInterval(ra);\n                    });\n                }\n            };\n            return ra;\n        };\n        window[la] = na;\n    };\n    r.onAfterLoad(function la() {\n        ka(\"setInterval\");\n        ka(\"setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return\n            };\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            };\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        };\n        this.fields[m][n] = o;\n        return this;\n    };\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this\n            };\n            return k.call(this, m, n, o);\n        };\n    };\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; (q < o.length); q++) {\n            p.push(new RegExp(o[q], \"i\"));;\n        };\n        return p;\n    };\n    function l(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            };\n        };\n    };\n    function m(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].test(o)) {\n                return true\n            };\n        };\n        return false;\n    };\n    function n(o, p) {\n        var q = g.stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, document.getElementsByTagName(\"script\"));\n        l(q, document.getElementsByTagName(\"iframe\"));\n        for (var t = 0; (t < q.length); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            };\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            };\n        };\n    };\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return (\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"TimeSpentLogger\", [\"Arbiter\",\"Banzai\",\"CSS\",\"ClickRefUtils\",\"DOMEventListener\",\"ScriptPath\",\"UserActivity\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"CSS\"), j = b(\"ClickRefUtils\"), k = b(\"DOMEventListener\"), l = b(\"ScriptPath\"), m = b(\"UserActivity\"), n = b(\"collectDataAttributes\"), o = b(\"copyProperties\"), p = [m.getLastInformTime(),0,], q = m.getLastInformTime(), r = {\n        tos_seq: 0,\n        tos_cumulative: 0,\n        transport_cause: null,\n        buenopath: null,\n        page_token: null,\n        elements: 0,\n        uact_tos: null,\n        client_time: null\n    }, s = 100, t = 100, u = (10 * 1000), v = (3 * 1000), w = 1, x = 2, y = 4, z = 8, aa = {\n    };\n    m.subscribe(function(ia, ja) {\n        var ka = (p.length - 1);\n        q = ja.last_inform;\n        if ((ja.idleness < v)) {\n            p[ka] += ja.idleness;\n            r.tos_cumulative += ja.idleness;\n        }\n         else {\n            if ((ka > s)) {\n                fa(\"array_limit_reached\");\n            };\n            p.push(ja.idleness, 0);\n        }\n    ;\n    });\n    function ba(ia) {\n        var ja = 0;\n        if (document.getElementById(\"boulder_fixed_header\")) {\n            ja = (ja | w);\n        };\n        if (i.hasClass(document.body, \"timelineLayout\")) {\n            ja = (ja | y);\n            var ka = document.getElementById(\"pagelet_main_column_personal\");\n            if ((ka && (ka.getAttribute(\"data-referrer\") === \"pagelet_main_column_personal_timeline\"))) {\n                ja = (ja | x);\n            };\n            if (i.hasClass(document.body, \"pagesTimelineLayout\")) {\n                ja = (ja | z);\n            };\n        }\n    ;\n        return ja;\n    };\n    function ca(ia) {\n        var ja = ba(), ka = l.getScriptPath(), la = l.getCategoryToken();\n        r.uact_tos = p;\n        if (ka) {\n            r.buenopath = ka.substring(0, t);\n        }\n         else r.buenopath = \"\";\n    ;\n        if (la) {\n            r.page_token = la;\n        }\n         else r.page_token = \"\";\n    ;\n        r.elements = ja;\n        r.transport_cause = ia;\n        r.client_time = Date.now();\n    };\n    function da() {\n        r.tos_seq += 1;\n        p = [q,0,];\n    };\n    var ea = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    function fa(ia) {\n        ca(ia);\n        if (h.isEnabled(\"time_spent\")) {\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            h.post(\"time_spent\", o({\n            }, r), ea);\n        }\n    ;\n        da();\n    };\n    function ga() {\n        fa(\"heartbeat\");\n    };\n    function ha() {\n        fa(\"before_unload\");\n    };\n    if ((window.top == window.self)) {\n        k.add(window, \"beforeunload\", ha);\n        setInterval(function() {\n            if ((((Date.now() - m.getLastInformTime()) > ((u - 100))) && (((p.length > 2) || (p[(p.length - 1)] > 0))))) {\n                ga();\n            };\n        }, u);\n    }\n;\n    g.subscribe(\"UserAction/new\", function(ia, ja) {\n        if (j.should_report(ja.node, ja.mode)) {\n            var ka = n(ja.node, [\"gt\",]), la = {\n                iref: j.get_intern_ref(ja.node),\n                gt_ref: ka.ref,\n                nav_section: ka.nav_section\n            };\n            ca(\"useraction\");\n            o(la, r);\n            ja.ua.add_data(la);\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            da();\n        }\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    }, 1000);\n    function o() {\n        try {\n            if (a.sessionStorage) {\n                l = a.sessionStorage;\n                (l._ua_log && (m = JSON.parse(l._ua_log)));\n            }\n        ;\n        } catch (q) {\n            l = false;\n        };\n        m.log[(m.len % 10)] = {\n            ts: Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, event = s.event;\n            if ((!event || !((event.type in k)))) {\n                return\n            };\n            var v = {\n                path: i.getScriptPath(),\n                type: event.type,\n                ts: t._ue_ts,\n                iref: (h.get_intern_ref(u) || \"-\"),\n                index: m.len\n            };\n            m.log[(m.len++ % 10)] = v;\n            (l && n());\n        });\n    };\n    function p() {\n        return m.log.sort(function(q, r) {\n            return (((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index)));\n        });\n    };\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n    e.exports = g;\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            (g[i] && g[i].resetLoadingTimers());\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if ((i && j)) {\n                i = g(i);\n                j = g(j);\n                return ((i.getDomain() == j.getDomain()) && (i.getPath() == j.getPath()));\n            }\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if ((l.length !== m.length)) {\n                return false\n            };\n            for (var n = 0; (n < m.length); n++) {\n                if ((+l[n] < +m[n])) {\n                    return false;\n                }\n                 else if ((+l[n] > +m[n])) {\n                    return true\n                }\n            ;\n            };\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            for (var k in i) {\n                if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                    j[k] = i[k];\n                };\n            };\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = (a.MusicConstants || h);\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = (w || {\n        });\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = (y || \"\");\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if ((t !== this.STATES.LOADING)) {\n                this.resetLoadingTimers();\n                this.previousState = (this.state || t);\n            }\n        ;\n            if ((t === this.STATES.PLAYING)) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n            var u = this.buttonElem.parentNode;\n            (this.state && j.removeClass(u, this.state));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return (s.tracksetableTypes.indexOf(this.mediaType) !== -1);\n        },\n        handleIncomingEvent: function(t, u) {\n            clearTimeout(this._showLoadingTimer);\n            if (((u && u.provider) && (u.provider != this.provider))) {\n                return\n            };\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((u && u.track) && u.track.uri), w = ((u && u.context) && u.context.uri);\n                if (((u && u.playing) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((this.state === this.STATES.LOADING) && (((this.previousState === this.STATES.PAUSED) || (this.previousState === this.STATES.OFFLINE))))) {\n                    clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        },\n        processClick: function(t, u) {\n            if ((u != this.buttonElem)) {\n                if ((this.state === this.STATES.LOADING)) {\n                    (this.previousState && this.setState(this.previousState));\n                };\n                return;\n            }\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if ((this.state != this.STATES.PLAYING)) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", (\"music_play_button_click.\" + this.provider));\n                var w = o.byClass(this.buttonElem, \"-cx-PRIVATE-musicAppIconAttribution__wrapper\");\n                if (w) {\n                    j.addClass(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\");\n                    j.removeClass.curry(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\").defer(3000);\n                }\n            ;\n            }\n        ;\n            var x = (this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\")), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((da && (da.provider == aa)) && da.isTracksetable())) {\n                        y.push(da.url);\n                    };\n                };\n            }\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            };\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = (((x && (y.length > 1))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            clearTimeout(this._hideLoadingTimer);\n            clearTimeout(this._showLoadingTimer);\n            clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            (a.Music && a.Music.reInform([this.provider,]));\n            if ((!t && (this.state === this.STATES.LOADING))) {\n                this.setState(this.STATES.PAUSED);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = (fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea))));\n        if (!fa) {\n            return\n        };\n        return y(fa, da);\n    };\n    function x(da) {\n        var ea = (o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\"));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0]\n            };\n        }\n    ;\n        return null;\n    };\n    function y(da, event) {\n        (event && event.stop());\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n    function z(da) {\n        (a.Music && a.Music.reInform(da));\n    };\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        for (var ga in fa) {\n            if ((fa[ga].noGC || r(ga))) {\n                fa[ga].handleIncomingEvent(da, ea);\n            }\n             else l.removeButton(ga);\n        ;\n        };\n    };\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return\n            };\n            t = true;\n            k.tracksetableTypes = (da || []);\n            g.listen(document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            (t || ba.init());\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka\n            };\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                });\n            }\n        ;\n            if ((da && !u[da])) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    (na.length && z(na));\n                    u = {\n                    };\n                }.defer();\n            };\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return\n            };\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", (\"music_button_\" + v++));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            (fa && ca(fa, ea));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, (ea ? ga.tooltip : \"\"));\n        });\n    };\n    e.exports = (a.MusicButtonManager || ba);\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"queryThenMutateDOM\"), l = document.documentElement, m, n, o = k.bind(null, function() {\n        n = (n || i.getDocumentScrollElement());\n        m = ((l.clientHeight < 400) || (l.clientWidth < n.scrollWidth));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = (i * 32), k = 1500, l, m, n, o, p, q, r, s, t;\n    function u() {\n        if (l) {\n            var ca = Date.now();\n            if ((ca > p)) {\n                r = Math.min(j, Math.ceil((((ca / 1000)) - o)));\n            };\n            var da = z();\n            if (da) {\n                l(da);\n            };\n        }\n    ;\n        y();\n    };\n    function v() {\n        w();\n        m = setTimeout(u, ((n * 1000) + k), false);\n    };\n    function w() {\n        if (m) {\n            clearTimeout(m);\n            m = null;\n        }\n    ;\n    };\n    function x(ca) {\n        o = ca;\n        p = (o * 1000);\n        q = [1,];\n        for (var da = 1; (da < i); da++) {\n            q.push(0);;\n        };\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n    function z() {\n        if (!q) {\n            return null\n        };\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n    function aa(ca) {\n        if (((ca >= p) && (((ca - p)) < 1000))) {\n            return\n        };\n        ba(Math.floor((ca / 1000)));\n    };\n    function ba(ca) {\n        var da = (ca - o);\n        if (((da < 0) || (da >= j))) {\n            u();\n        };\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[(da >> 5)] |= ((1 << ((da & 31))));\n            r = (da + 1);\n            s += 1;\n            p = (ca * 1000);\n        }\n    ;\n    };\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = (da || j);\n            x(Math.floor((Date.now() / 1000)));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        for (var v in t) {\n            var w = t.getItem(v), x = j.unicodeEscape(v);\n            if ((typeof w === \"string\")) {\n                u[x] = w.length;\n            };\n        };\n        return u;\n    };\n    function p(t) {\n        if ((a.localStorage && t.keys)) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n    };\n    function q(t) {\n        if (a.localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n        if (a.sessionStorage) {\n            a.sessionStorage.clear();\n        };\n    };\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    };\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return\n            };\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = Date.now(), v = {\n            }, w = false;\n            [\"localStorage\",\"sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            });\n            var x = Date.now();\n            v.logtime = (x - u);\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        };\n                        p(z);\n                    }\n                ;\n                }.bind(this)).send();\n            };\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            };\n            if (a.sessionStorage) {\n                a.sessionStorage.clear();\n            };\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.localStorage)\n    };\n    e.exports = s;\n});");
// 8613
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"scb38ed7c6aaa195a276ac7856568a7b9e8f51b72");
// 8614
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"63VzN\",]);\n}\n;\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString();\n            }\n        ;\n        ;\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            i = g(i);\n            return ((i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\")));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            i = g(i);\n            return ((i.isFacebookURI() && ((i.getPath() == \"/ajax/vault/sharer_preview.php\"))));\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                JSBNG__document.JSBNG__location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                JSBNG__document.JSBNG__location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            }\n        ;\n        ;\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    JSBNG__document.JSBNG__location.reload();\n                }\n                 else i(m);\n            ;\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((((7 * 24)) * 3600000)));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"LoginFormController\", [\"JSBNG__Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt(((JSBNG__Date.now() / 1000)), 10);\n        }\n    ;\n    ;\n    };\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; ((j && ((j != JSBNG__document.body)))); j = j.parentNode) {\n                    if (((!j.id || ((typeof j.id !== \"string\"))))) {\n                        continue;\n                    }\n                ;\n                ;\n                    if (((j.id.substr(0, 8) == \"pagelet_\"))) {\n                        return j.id.substr(8);\n                    }\n                ;\n                ;\n                    if (((j.id.substr(0, 8) == \"box_app_\"))) {\n                        return j.id;\n                    }\n                ;\n                ;\n                    if (i[j.id]) {\n                        return j.id;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = ((((((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\"))))) || h.action)) || h.href)) || h.JSBNG__name));\n            return ((((typeof i === \"string\")) ? i : null));\n        },\n        should_report: function(h, i) {\n            if (((i == \"FORCE\"))) {\n                return true;\n            }\n        ;\n        ;\n            if (((i == \"INDIRECT\"))) {\n                return false;\n            }\n        ;\n        ;\n            return ((h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\")))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            JSBNG__document.cookie = ((((((\"act=\" + encodeURIComponent(i))) + \"; path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"JSBNG__content\")) {\n            return [0,0,0,0,];\n        }\n    ;\n    ;\n        var r = n(\"JSBNG__content\"), s = ((a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        }));\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n;\n    function p(q, r, JSBNG__event, s) {\n        var t = (((!a.ArbiterMonitor) ? \"r\" : \"a\")), u = [0,0,0,0,], v, w, x;\n        if (!!JSBNG__event) {\n            v = JSBNG__event.type;\n            if (((((v == \"click\")) && l(\"JSBNG__content\")))) {\n                u = o(JSBNG__event);\n            }\n        ;\n        ;\n            var y = 0;\n            ((JSBNG__event.ctrlKey && (y += 1)));\n            ((JSBNG__event.shiftKey && (y += 2)));\n            ((JSBNG__event.altKey && (y += 4)));\n            ((JSBNG__event.metaKey && (y += 8)));\n            if (y) {\n                v += y;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        }\n    ;\n    ;\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n    ;\n        var aa = j(((!!JSBNG__event ? ((JSBNG__event.target || JSBNG__event.srcElement)) : r)), [\"ft\",\"gt\",]);\n        k(aa.ft, ((s.ft || {\n        })));\n        k(aa.gt, ((s.gt || {\n        })));\n        if (((typeof (aa.ft.ei) === \"string\"))) {\n            delete aa.ft.ei;\n        }\n    ;\n    ;\n        var ba = [q._ue_ts,q._ue_count,((w || \"-\")),q._context,((v || \"-\")),((x || i.get_intern_ref(r))),t,((a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((((JSBNG__location.pathname + JSBNG__location.search)) + JSBNG__location.hash)))),aa,].concat(u).concat(z);\n        return ba;\n    };\n;\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.JSBNG__event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.JSBNG__postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.JSBNG__location.origin);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l;\n                }\n            ;\n            ;\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if (((la == \"#\"))) {\n                return false;\n            }\n        ;\n        ;\n            la = new s(la);\n            if (((la.getDomain() && ((la.getDomain() != s().getDomain()))))) {\n                return false;\n            }\n        ;\n        ;\n            if (((la.getPath() == \"/l.php\"))) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if (((ma && ((ma != s().getDomain()))))) {\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += ((\"?\" + s.implodeQuery(oa)));\n            }\n        ;\n        ;\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = ((la || \"Facebook\"));\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.JSBNG__setInterval(function() {\n                    var ma = da, na = k.get();\n                    if (((ma != na))) {\n                        k.set(ma);\n                    }\n                ;\n                ;\n                }, 5000, false);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ga(la) {\n        var ma = JSBNG__document.getElementsByTagName(\"link\");\n        for (var na = 0; ((na < ma.length)); ++na) {\n            if (((ma[na].rel != \"alternate\"))) {\n                continue;\n            }\n        ;\n        ;\n            l.remove(ma[na]);\n        };\n    ;\n        if (la.length) {\n            var oa = l.JSBNG__find(JSBNG__document, \"head\");\n            ((oa && l.appendContent(oa, n(la[0]))));\n        }\n    ;\n    ;\n    };\n;\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n;\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            ((this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\")));\n            p.transitionComplete();\n            ((this._onPageDisplayed && this._onPageDisplayed(this.pipe)));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if (((la.version == y))) {\n                return true;\n            }\n        ;\n        ;\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.JSBNG__location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga(((ma.syndication || [])));\n            window.JSBNG__scrollTo(0, 0);\n            j.go(JSBNG__document.body, ((ma.body_class || \"\")), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return ((ba >= z));\n    };\n;\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false;\n        }\n    ;\n    ;\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false;\n        }\n    ;\n    ;\n        window.ExitTime = JSBNG__Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"JSBNG__content\").send();\n        return true;\n    };\n;\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if (((typeof oa !== \"function\"))) {\n                oa = eval.bind(null, oa);\n            }\n        ;\n        ;\n            var ra = ma(m.guard(oa), pa);\n            if (((pa > 0))) {\n                if (((qa !== false))) {\n                    r.onLeave(function() {\n                        JSBNG__clearInterval(ra);\n                    });\n                }\n            ;\n            }\n        ;\n        ;\n            return ra;\n        };\n    ;\n        window[la] = na;\n    };\n;\n    r.onAfterLoad(function la() {\n        ka(\"JSBNG__setInterval\");\n        ka(\"JSBNG__setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return;\n            }\n        ;\n        ;\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            }\n        ;\n        ;\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n;\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        }\n    ;\n    ;\n        this.fields[m][n] = o;\n        return this;\n    };\n;\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this;\n            }\n        ;\n        ;\n            return k.call(this, m, n, o);\n        };\n    };\n;\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; ((q < o.length)); q++) {\n            p.push(new RegExp(o[q], \"i\"));\n        ;\n        };\n    ;\n        return p;\n    };\n;\n    function l(o, p) {\n        for (var q = 0; ((q < p.length)); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function m(o, p) {\n        for (var q = 0; ((q < p.length)); q++) {\n            if (p[q].test(o)) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    function n(o, p) {\n        var q = g.JSBNG__stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, JSBNG__document.getElementsByTagName(\"script\"));\n        l(q, JSBNG__document.getElementsByTagName(\"div\"));\n        for (var t = 0; ((t < q.length)); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            }\n        ;\n        ;\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return ((\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4)));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"TimeSpentLogger\", [\"Arbiter\",\"Banzai\",\"CSS\",\"ClickRefUtils\",\"DOMEventListener\",\"ScriptPath\",\"UserActivity\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"CSS\"), j = b(\"ClickRefUtils\"), k = b(\"DOMEventListener\"), l = b(\"ScriptPath\"), m = b(\"UserActivity\"), n = b(\"collectDataAttributes\"), o = b(\"copyProperties\"), p = [m.getLastInformTime(),0,], q = m.getLastInformTime(), r = {\n        tos_seq: 0,\n        tos_cumulative: 0,\n        transport_cause: null,\n        buenopath: null,\n        page_token: null,\n        elements: 0,\n        uact_tos: null,\n        client_time: null\n    }, s = 100, t = 100, u = ((10 * 1000)), v = ((3 * 1000)), w = 1, x = 2, y = 4, z = 8, aa = {\n    };\n    m.subscribe(function(ia, ja) {\n        var ka = ((p.length - 1));\n        q = ja.last_inform;\n        if (((ja.idleness < v))) {\n            p[ka] += ja.idleness;\n            r.tos_cumulative += ja.idleness;\n        }\n         else {\n            if (((ka > s))) {\n                fa(\"array_limit_reached\");\n            }\n        ;\n        ;\n            p.push(ja.idleness, 0);\n        }\n    ;\n    ;\n    });\n    function ba(ia) {\n        var ja = 0;\n        if (JSBNG__document.getElementById(\"boulder_fixed_header\")) {\n            ja = ((ja | w));\n        }\n    ;\n    ;\n        if (i.hasClass(JSBNG__document.body, \"timelineLayout\")) {\n            ja = ((ja | y));\n            var ka = JSBNG__document.getElementById(\"pagelet_main_column_personal\");\n            if (((ka && ((ka.getAttribute(\"data-referrer\") === \"pagelet_main_column_personal_timeline\"))))) {\n                ja = ((ja | x));\n            }\n        ;\n        ;\n            if (i.hasClass(JSBNG__document.body, \"pagesTimelineLayout\")) {\n                ja = ((ja | z));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return ja;\n    };\n;\n    function ca(ia) {\n        var ja = ba(), ka = l.getScriptPath(), la = l.getCategoryToken();\n        r.uact_tos = p;\n        if (ka) {\n            r.buenopath = ka.substring(0, t);\n        }\n         else r.buenopath = \"\";\n    ;\n    ;\n        if (la) {\n            r.page_token = la;\n        }\n         else r.page_token = \"\";\n    ;\n    ;\n        r.elements = ja;\n        r.transport_cause = ia;\n        r.client_time = JSBNG__Date.now();\n    };\n;\n    function da() {\n        r.tos_seq += 1;\n        p = [q,0,];\n    };\n;\n    var ea = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    function fa(ia) {\n        ca(ia);\n        if (h.isEnabled(\"time_spent\")) {\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            h.post(\"time_spent\", o({\n            }, r), ea);\n        }\n    ;\n    ;\n        da();\n    };\n;\n    function ga() {\n        fa(\"heartbeat\");\n    };\n;\n    function ha() {\n        fa(\"before_unload\");\n    };\n;\n    if (((window.JSBNG__top == window.JSBNG__self))) {\n        k.add(window, \"beforeunload\", ha);\n        JSBNG__setInterval(function() {\n            if (((((((JSBNG__Date.now() - m.getLastInformTime())) > ((u - 100)))) && ((((p.length > 2)) || ((p[((p.length - 1))] > 0))))))) {\n                ga();\n            }\n        ;\n        ;\n        }, u);\n    }\n;\n;\n    g.subscribe(\"UserAction/new\", function(ia, ja) {\n        if (j.should_report(ja.node, ja.mode)) {\n            var ka = n(ja.node, [\"gt\",]), la = {\n                iref: j.get_intern_ref(ja.node),\n                gt_ref: ka.ref,\n                nav_section: ka.nav_section\n            };\n            ca(\"useraction\");\n            o(la, r);\n            ja.ua.add_data(la);\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            da();\n        }\n    ;\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    ;\n    }, 1000);\n    function o() {\n        try {\n            if (a.JSBNG__sessionStorage) {\n                l = a.JSBNG__sessionStorage;\n                ((l._ua_log && (m = JSON.parse(l._ua_log))));\n            }\n        ;\n        ;\n        } catch (q) {\n            l = false;\n        };\n    ;\n        m.log[((m.len % 10))] = {\n            ts: JSBNG__Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, JSBNG__event = s.JSBNG__event;\n            if (((!JSBNG__event || !((JSBNG__event.type in k))))) {\n                return;\n            }\n        ;\n        ;\n            var v = {\n                path: i.getScriptPath(),\n                type: JSBNG__event.type,\n                ts: t._ue_ts,\n                iref: ((h.get_intern_ref(u) || \"-\")),\n                index: m.len\n            };\n            m.log[((m.len++ % 10))] = v;\n            ((l && n()));\n        });\n    };\n;\n    function p() {\n        return m.log.sort(function(q, r) {\n            return ((((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index))));\n        });\n    };\n;\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n;\n    e.exports = g;\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            ((g[i] && g[i].resetLoadingTimers()));\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if (((i && j))) {\n                i = g(i);\n                j = g(j);\n                return ((((i.getDomain() == j.getDomain())) && ((i.getPath() == j.getPath()))));\n            }\n        ;\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if (((l.length !== m.length))) {\n                return false;\n            }\n        ;\n        ;\n            for (var n = 0; ((n < m.length)); n++) {\n                if (((+l[n] < +m[n]))) {\n                    return false;\n                }\n                 else if (((+l[n] > +m[n]))) {\n                    return true;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            {\n                var fin115keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin115i = (0);\n                var k;\n                for (; (fin115i < fin115keys.length); (fin115i++)) {\n                    ((k) = (fin115keys[fin115i]));\n                    {\n                        if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                            j[k] = i[k];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = ((a.MusicConstants || h));\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = ((w || {\n        }));\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = ((y || \"\"));\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if (((t !== this.STATES.LOADING))) {\n                this.resetLoadingTimers();\n                this.previousState = ((this.state || t));\n            }\n        ;\n        ;\n            if (((t === this.STATES.PLAYING))) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n        ;\n            var u = this.buttonElem.parentNode;\n            ((this.state && j.removeClass(u, this.state)));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return ((s.tracksetableTypes.indexOf(this.mediaType) !== -1));\n        },\n        handleIncomingEvent: function(t, u) {\n            JSBNG__clearTimeout(this._showLoadingTimer);\n            if (((((u && u.provider)) && ((u.provider != this.provider))))) {\n                return;\n            }\n        ;\n        ;\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((((u && u.track)) && u.track.uri)), w = ((((u && u.context)) && u.context.uri));\n                if (((((u && u.playing)) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url)))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((((this.state === this.STATES.LOADING)) && ((((this.previousState === this.STATES.PAUSED)) || ((this.previousState === this.STATES.OFFLINE))))))) {\n                    JSBNG__clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n                \n            ;\n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        ;\n        },\n        processClick: function(t, u) {\n            if (((u != this.buttonElem))) {\n                if (((this.state === this.STATES.LOADING))) {\n                    ((this.previousState && this.setState(this.previousState)));\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if (((this.state != this.STATES.PLAYING))) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", ((\"music_play_button_click.\" + this.provider)));\n                var w = o.byClass(this.buttonElem, \"-cx-PRIVATE-musicAppIconAttribution__wrapper\");\n                if (w) {\n                    j.addClass(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\");\n                    j.removeClass.curry(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\").defer(3000);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var x = ((this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\"))), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; ((ca < ba.length)); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((((da && ((da.provider == aa)))) && da.isTracksetable()))) {\n                        y.push(da.url);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            }\n        ;\n        ;\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = ((((x && ((y.length > 1)))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context)));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            JSBNG__clearTimeout(this._hideLoadingTimer);\n            JSBNG__clearTimeout(this._showLoadingTimer);\n            JSBNG__clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            ((a.Music && a.Music.reInform([this.provider,])));\n            if (((!t && ((this.state === this.STATES.LOADING))))) {\n                this.setState(this.STATES.PAUSED);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"JSBNG__Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = ((fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea)))));\n        if (!fa) {\n            return;\n        }\n    ;\n    ;\n        return y(fa, da);\n    };\n;\n    function x(da) {\n        var ea = ((o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\")));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0];\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function y(da, JSBNG__event) {\n        ((JSBNG__event && JSBNG__event.JSBNG__stop()));\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n;\n    function z(da) {\n        ((a.Music && a.Music.reInform(da)));\n    };\n;\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        {\n            var fin116keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin116i = (0);\n            var ga;\n            for (; (fin116i < fin116keys.length); (fin116i++)) {\n                ((ga) = (fin116keys[fin116i]));\n                {\n                    if (((fa[ga].noGC || r(ga)))) {\n                        fa[ga].handleIncomingEvent(da, ea);\n                    }\n                     else l.removeButton(ga);\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            t = true;\n            k.tracksetableTypes = ((da || []));\n            g.listen(JSBNG__document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            ((t || ba.init()));\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka;\n            }\n        ;\n        ;\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            if (((da && !u[da]))) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    ((na.length && z(na)));\n                    u = {\n                    };\n                }.defer();\n            }\n        ;\n        ;\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return;\n            }\n        ;\n        ;\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", ((\"music_button_\" + v++)));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            ((fa && ca(fa, ea)));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.JSBNG__find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, ((ea ? ga.tooltip : \"\")));\n        });\n    };\n;\n    e.exports = ((a.MusicButtonManager || ba));\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"queryThenMutateDOM\"), l = JSBNG__document.documentElement, m, n, o = k.bind(null, function() {\n        n = ((n || i.getDocumentScrollElement()));\n        m = ((((l.clientHeight < 400)) || ((l.clientWidth < n.scrollWidth))));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = ((i * 32)), k = 1500, l, m, n, o, p, q, r, s, t;\n    {\n        function u() {\n            if (l) {\n                var ca = JSBNG__Date.now();\n                if (((ca > p))) {\n                    r = Math.min(j, Math.ceil(((((ca / 1000)) - o))));\n                }\n            ;\n            ;\n                var da = z();\n                if (da) {\n                    l(da);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            y();\n        };\n        ((window.top.JSBNG_Replay.scb38ed7c6aaa195a276ac7856568a7b9e8f51b72_133.push)((u)));\n    };\n;\n    function v() {\n        w();\n        m = JSBNG__setTimeout(u, ((((n * 1000)) + k)), false);\n    };\n;\n    function w() {\n        if (m) {\n            JSBNG__clearTimeout(m);\n            m = null;\n        }\n    ;\n    ;\n    };\n;\n    function x(ca) {\n        o = ca;\n        p = ((o * 1000));\n        q = [1,];\n        for (var da = 1; ((da < i)); da++) {\n            q.push(0);\n        ;\n        };\n    ;\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n;\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n;\n    function z() {\n        if (!q) {\n            return null;\n        }\n    ;\n    ;\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n;\n    function aa(ca) {\n        if (((((ca >= p)) && ((((ca - p)) < 1000))))) {\n            return;\n        }\n    ;\n    ;\n        ba(Math.floor(((ca / 1000))));\n    };\n;\n    function ba(ca) {\n        var da = ((ca - o));\n        if (((((da < 0)) || ((da >= j))))) {\n            u();\n        }\n    ;\n    ;\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[((da >> 5))] |= ((1 << ((da & 31))));\n            r = ((da + 1));\n            s += 1;\n            p = ((ca * 1000));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = ((da || j));\n            x(Math.floor(((JSBNG__Date.now() / 1000))));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"JSBNG__Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        {\n            var fin117keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin117i = (0);\n            var v;\n            for (; (fin117i < fin117keys.length); (fin117i++)) {\n                ((v) = (fin117keys[fin117i]));\n                {\n                    var w = t.getItem(v), x = j.unicodeEscape(v);\n                    if (((typeof w === \"string\"))) {\n                        u[x] = w.length;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return u;\n    };\n;\n    function p(t) {\n        if (((a.JSBNG__localStorage && t.keys))) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.JSBNG__localStorage.removeItem(u);\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n    };\n;\n    function q(t) {\n        if (a.JSBNG__localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.JSBNG__localStorage.removeItem(u);\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n        if (a.JSBNG__sessionStorage) {\n            a.JSBNG__sessionStorage.clear();\n        }\n    ;\n    ;\n    };\n;\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    ;\n    };\n;\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return;\n            }\n        ;\n        ;\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = JSBNG__Date.now(), v = {\n            }, w = false;\n            [\"JSBNG__localStorage\",\"JSBNG__sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            ;\n            });\n            var x = JSBNG__Date.now();\n            v.logtime = ((x - u));\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        }\n                    ;\n                    ;\n                        p(z);\n                    }\n                ;\n                ;\n                }.bind(this)).send();\n            }\n        ;\n        ;\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            }\n        ;\n        ;\n            if (a.JSBNG__sessionStorage) {\n                a.JSBNG__sessionStorage.clear();\n            }\n        ;\n        ;\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.JSBNG__localStorage)\n    };\n    e.exports = s;\n});");
// 8726
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o44,o45);
// undefined
o44 = null;
// undefined
o45 = null;
// 8731
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o1,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/AgtiweS9a6U.js",o46);
// undefined
o1 = null;
// undefined
o46 = null;
// 8735
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"4vv8/\",]);\n}\n;\n__d(\"TimeSpentBitArrayLogger\", [\"UserActivity\",\"copyProperties\",\"Banzai\",\"BanzaiODS\",\"TimeSpentArray\",\"Arbiter\",\"TimeSpentConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserActivity\"), h = b(\"copyProperties\"), i = b(\"Banzai\"), j = b(\"BanzaiODS\"), k = b(\"TimeSpentArray\"), l = b(\"Arbiter\"), m = b(\"TimeSpentConfig\"), n = {\n        store: true,\n        delay: m.initial_delay,\n        retry: true\n    };\n    function o(p) {\n        if (i.isEnabled(\"time_spent_bit_array\")) {\n            l.inform(\"timespent/tosbitdataposted\", h({\n            }, p));\n            i.post(\"time_spent_bit_array\", h({\n            }, p), n);\n            n.delay = m.delay;\n        }\n    ;\n    };\n    e.exports = {\n        init: function(p) {\n            if ((window.top == window.self)) {\n                g.subscribe(function(q, r) {\n                    k.update(r.last_inform);\n                });\n                k.init(o, m.initial_timeout);\n                j.bumpEntityKey(\"ms.time_spent.qa.www\", \"time_spent.bits.js_initialized\");\n            }\n        ;\n        }\n    };\n});");
// 8736
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s76aa385d8208e4e8eefbd18ade1f1e8c544e0113");
// 8737
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"4vv8/\",]);\n}\n;\n;\n__d(\"TimeSpentBitArrayLogger\", [\"UserActivity\",\"copyProperties\",\"Banzai\",\"BanzaiODS\",\"TimeSpentArray\",\"Arbiter\",\"TimeSpentConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserActivity\"), h = b(\"copyProperties\"), i = b(\"Banzai\"), j = b(\"BanzaiODS\"), k = b(\"TimeSpentArray\"), l = b(\"Arbiter\"), m = b(\"TimeSpentConfig\"), n = {\n        store: true,\n        delay: m.initial_delay,\n        retry: true\n    };\n    function o(p) {\n        if (i.isEnabled(\"time_spent_bit_array\")) {\n            l.inform(\"timespent/tosbitdataposted\", h({\n            }, p));\n            i.post(\"time_spent_bit_array\", h({\n            }, p), n);\n            n.delay = m.delay;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        init: function(p) {\n            if (((window.JSBNG__top == window.JSBNG__self))) {\n                g.subscribe(function(q, r) {\n                    k.update(r.last_inform);\n                });\n                k.init(o, m.initial_timeout);\n                j.bumpEntityKey(\"ms.time_spent.qa.www\", \"time_spent.bits.js_initialized\");\n            }\n        ;\n        ;\n        }\n    };\n});");
// 8744
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o49,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js",o52);
// undefined
o49 = null;
// undefined
o52 = null;
// 8748
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"u//Ut\",]);\n}\n;\n__d(\"MercuryAPIArgsSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        JEWEL: \"jewel\",\n        CHAT: \"chat\",\n        MERCURY: \"mercury\",\n        WEBMESSENGER: \"web_messenger\"\n    };\n});\n__d(\"MercuryActionStatus\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNCONFIRMED: 3,\n        UNSENT: 0,\n        RESENDING: 7,\n        RESENT: 6,\n        UNABLE_TO_CONFIRM: 5,\n        FAILED_UNKNOWN_REASON: 4,\n        SUCCESS: 1,\n        ERROR: 10\n    };\n});\n__d(\"MercuryActionTypeConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        LOG_MESSAGE: \"ma-type:log-message\",\n        CLEAR_CHAT: \"ma-type:clear_chat\",\n        UPDATE_ACTION_ID: \"ma-type:update-action-id\",\n        DELETE_MESSAGES: \"ma-type:delete-messages\",\n        CHANGE_FOLDER: \"ma-type:change-folder\",\n        SEND_MESSAGE: \"ma-type:send-message\",\n        CHANGE_ARCHIVED_STATUS: \"ma-type:change-archived-status\",\n        DELETE_THREAD: \"ma-type:delete-thread\",\n        USER_GENERATED_MESSAGE: \"ma-type:user-generated-message\",\n        CHANGE_READ_STATUS: \"ma-type:change_read_status\",\n        CHANGE_MUTE_SETTINGS: \"ma-type:change-mute-settings\"\n    };\n});\n__d(\"MercuryAttachmentContentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNKNOWN: \"attach:unknown\",\n        PHOTO: \"attach:image\",\n        VIDEO: \"attach:video\",\n        MSWORD: \"attach:ms:word\",\n        VOICE: \"attach:voice\",\n        MSPPT: \"attach:ms:ppt\",\n        TEXT: \"attach:text\",\n        MUSIC: \"attach:music\",\n        MSXLS: \"attach:ms:xls\"\n    };\n});\n__d(\"MercuryAttachmentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        STICKER: \"sticker\",\n        PHOTO: \"photo\",\n        FILE: \"file\",\n        SHARE: \"share\",\n        ERROR: \"error\"\n    };\n});\n__d(\"MercuryErrorType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER: 1,\n        TRANSPORT: 2,\n        TIMEOUT: 3\n    };\n});\n__d(\"MercuryGenericConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PENDING_THREAD_ID: \"pending:pending\"\n    };\n});\n__d(\"MercuryGlobalActionType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MARK_ALL_READ: \"mga-type:mark-all-read\"\n    };\n});\n__d(\"MercuryLogMessageType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_ERROR: \"log:error-msg\",\n        UNSUBSCRIBE: \"log:unsubscribe\",\n        JOINABLE_JOINED: \"log:joinable-joined\",\n        JOINABLE_CREATED: \"log:joinable-created\",\n        LIVE_LISTEN: \"log:live-listen\",\n        PHONE_CALL: \"log:phone-call\",\n        THREAD_IMAGE: \"log:thread-image\",\n        THREAD_NAME: \"log:thread-name\",\n        VIDEO_CALL: \"log:video-call\",\n        SUBSCRIBE: \"log:subscribe\"\n    };\n});\n__d(\"MercuryMessageSourceTags\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        CHAT: \"source:chat\",\n        MOBILE: \"source:mobile\",\n        MESSENGER: \"source:messenger\",\n        EMAIL: \"source:email\"\n    };\n});\n__d(\"MercuryParticipantTypes\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        FRIEND: \"friend\",\n        USER: \"user\",\n        THREAD: \"thread\",\n        EVENT: \"event\",\n        PAGE: \"page\"\n    };\n});\n__d(\"MercuryPayloadSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_INITIAL_DATA: \"server_initial_data\",\n        CLIENT_DELETE_THREAD: \"client_delete_thread\",\n        SERVER_ZAP: \"server_zap\",\n        SERVER_SAVE_DRAFT: \"server_save_draft\",\n        SERVER_CHANGE_ARCHIVED_STATUS: \"server_change_archived_status\",\n        SERVER_SEARCH: \"server_search\",\n        CLIENT_CHANGE_MUTE_SETTINGS: \"client_change_mute_settings\",\n        SERVER_UNREAD_THREADS: \"server_unread_threads\",\n        SERVER_MARK_SEEN: \"server_mark_seen\",\n        SERVER_THREAD_SYNC: \"server_thread_sync\",\n        CLIENT_DELETE_MESSAGES: \"client_delete_messages\",\n        SERVER_FETCH_THREADLIST_INFO: \"server_fetch_threadlist_info\",\n        CLIENT_CHANNEL_MESSAGE: \"client_channel_message\",\n        CLIENT_CHANGE_FOLDER: \"client_change_folder\",\n        CLIENT_CHANGE_READ_STATUS: \"client_change_read_status\",\n        CLIENT_CLEAR_CHAT: \"client_clear_chat\",\n        SERVER_FETCH_THREAD_INFO: \"server_fetch_thread_info\",\n        SERVER_CHANGE_READ_STATUS: \"server_change_read_status\",\n        SERVER_SEND_MESSAGE: \"server_send_message\",\n        CLIENT_SAVE_DRAFT: \"client_save_draft\",\n        UNKNOWN: \"unknown\",\n        SERVER_MARK_FOLDER_READ: \"server_mark_folder_read\",\n        SERVER_CONFIRM_MESSAGES: \"server_confirm_messages\",\n        SERVER_TAB_PRESENCE: \"server_tab_presence\",\n        CLIENT_CHANGE_ARCHIVED_STATUS: \"client_change-archived_status\",\n        CLIENT_SEND_MESSAGE: \"client_send_message\",\n        CLIENT_HANDLE_ERROR: \"client_handle_error\"\n    };\n});\n__d(\"MercurySourceType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        GIGABOXX_BLAST: \"source:gigaboxx:blast\",\n        TITAN_FACEWEB_BUFFY: \"source:titan:faceweb_buffy\",\n        TITAN_FACEWEB_UNKNOWN: \"source:titan:faceweb_unknown\",\n        CHAT_WEB: \"source:chat:web\",\n        WEBRTC_MOBILE: \"source:webrtc:mobile\",\n        GIGABOXX_API: \"source:gigaboxx:api\",\n        TITAN_M_JAPAN: \"source:titan:m_japan\",\n        BUFFY_SMS: \"source:buffy:sms\",\n        SEND_PLUGIN: \"source:sendplugin\",\n        CHAT_MEEBO: \"source:chat:meebo\",\n        TITAN_FACEWEB_IPAD: \"source:titan:faceweb_ipad\",\n        TITAN_FACEWEB_IPHONE: \"source:titan:faceweb_iphone\",\n        TEST: \"source:test\",\n        WEB: \"source:web\",\n        SOCIALFOX: \"source:socialfox\",\n        EMAIL: \"source:email\",\n        TITAN_API: \"source:titan:api\",\n        GIGABOXX_WEB: \"source:gigaboxx:web\",\n        DESKTOP: \"source:desktop\",\n        TITAN_FACEWEB_ANDROID: \"source:titan:faceweb_android\",\n        LEIA: \"source:leia\",\n        CHAT_JABBER: \"source:chat:jabber\",\n        CHAT_TEST: \"source:chat:test\",\n        SHARE_DIALOG: \"source:share:dialog\",\n        GIGABOXX_WAP: \"source:gigaboxx:wap\",\n        CHAT: \"source:chat\",\n        TITAN_M_APP: \"source:titan:m_app\",\n        TITAN_M_TOUCH: \"source:titan:m_touch\",\n        TITAN_ORCA: \"source:titan:orca\",\n        TITAN_WAP: \"source:titan:wap\",\n        TITAN_EMAIL_REPLY: \"source:titan:emailreply\",\n        CHAT_IPHONE: \"source:chat:iphone\",\n        SMS: \"source:sms\",\n        TITAN_M_BASIC: \"source:titan:m_basic\",\n        TITAN_M_MINI: \"source:titan:m_mini\",\n        GIGABOXX_MOBILE: \"source:gigaboxx:mobile\",\n        UNKNOWN: \"source:unknown\",\n        TITAN_WEB: \"source:titan:web\",\n        TITAN_M_ZERO: \"source:titan:m_zero\",\n        MOBILE: \"source:mobile\",\n        PAID_PROMOTION: \"source:paid_promotion\",\n        TITAN_API_MOBILE: \"source:titan:api_mobile\",\n        HELPCENTER: \"source:helpcenter\",\n        GIGABOXX_EMAIL_REPLY: \"source:gigaboxx:emailreply\",\n        CHAT_ORCA: \"source:chat:orca\",\n        TITAN_M_TALK: \"source:titan:m_talk\",\n        NEW_SHARE_DIALOG: \"source:share:dialog:new\"\n    };\n});\n__d(\"MercuryThreadMode\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        EMAIL_ORIGINATED: 1,\n        OBJECT_ORIGINATED: 3,\n        TITAN_ORIGINATED: 2\n    };\n});\n__d(\"MercuryTimePassed\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        TODAY: 0,\n        WEEK_AGO: 1,\n        CURRENT_YEAR: 3,\n        OTHER_YEAR: 4,\n        MONTH_AGO: 2\n    };\n});\n__d(\"MessagingEvent\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNSUBSCRIBE: \"unsubscribe\",\n        DELIVERY_RECEIPT: \"delivery_receipt\",\n        REPORT_SPAM_MESSAGES: \"report_spam_messages\",\n        DELIVER_FAST_PAST: \"deliver_fast_path\",\n        DELETE_MESSAGES: \"delete_messages\",\n        READ_RECEIPT: \"read_receipt\",\n        SENT_PUSH: \"sent_push\",\n        READ: \"read\",\n        CHANGE_MUTE_SETTINGS: \"change_mute_settings\",\n        ERROR: \"error\",\n        UNMARK_SPAM: \"unmark_spam\",\n        UNREAD: \"unread\",\n        DELIVER_LOG: \"deliver_log\",\n        DELIVER: \"deliver\",\n        READ_ALL: \"read_all\",\n        TAG: \"tag\",\n        MORE_THREADS: \"more_threads\",\n        DELETE: \"delete\",\n        REPORT_SPAM: \"report_spam\",\n        SUBSCRIBE: \"subscribe\"\n    };\n});\n__d(\"MessagingTag\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MTA_SYSTEM_MESSAGE: \"MTA:system_message\",\n        SENT: \"sent\",\n        INBOX: \"inbox\",\n        SMS_TAG_ROOT: \"SMSShortcode:\",\n        UPDATES: \"broadcasts_inbox\",\n        OTHER: \"other\",\n        GROUPS: \"groups\",\n        FILTERED_CONTENT: \"filtered_content\",\n        ACTION_ARCHIVED: \"action:archived\",\n        UNREAD: \"unread\",\n        BCC: \"header:bcc\",\n        SMS_MUTE: \"sms_mute\",\n        ARCHIVED: \"archived\",\n        DOMAIN_AUTH_PASS: \"MTA:dmarc:pass\",\n        EVENT: \"event\",\n        VOICEMAIL: \"voicemail\",\n        DOMAIN_AUTH_FAIL: \"MTA:dmarc:fail\",\n        SPAM_SPOOFING: \"spam:spoofing\",\n        SPOOF_WARNING: \"MTA:spoof_warning\",\n        SPAM: \"spam\",\n        EMAIL_MESSAGE: \"source:email\",\n        EMAIL: \"email\",\n        APP_ID_ROOT: \"app_id:\"\n    };\n});\n__d(\"AvailableListConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ON_AVAILABILITY_CHANGED: \"buddylist/availability-changed\",\n        ON_UPDATE_ERROR: \"buddylist/update-error\",\n        ON_UPDATED: \"buddylist/updated\",\n        ON_CHAT_NOTIFICATION_CHANGED: \"chat-notification-changed\",\n        OFFLINE: 0,\n        IDLE: 1,\n        ACTIVE: 2,\n        MOBILE: 3,\n        LEGACY_OVERLAY_OFFLINE: -1,\n        LEGACY_OVERLAY_ONLINE: 0,\n        LEGACY_OVERLAY_IDLE: 1,\n        legacyStatusMap: {\n            0: 2,\n            1: 1,\n            \"-1\": 0,\n            2: 3\n        },\n        reverseLegacyStatusMap: {\n            0: -1,\n            1: 1,\n            2: 0,\n            3: 2\n        }\n    };\n    a.AvailableListConstants = e.exports = g;\n});\n__d(\"PresenceUtil\", [\"Cookie\",\"Env\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Env\"), i = b(\"randomInt\"), j = b(\"tx\"), k = (i(0, 4294967295) + 1), l = {\n        checkMaintenanceError: function(m) {\n            if ((m.getError() == 1356007)) {\n                return true\n            };\n            return false;\n        },\n        getErrorDescription: function(m) {\n            var n = m.getError(), o = m.getErrorDescription();\n            if (!o) {\n                o = \"An error occurred.\";\n            };\n            if ((n == 1357001)) {\n                o = \"Your session has timed out. Please log in.\";\n            };\n            return o;\n        },\n        getSessionID: function() {\n            return k;\n        },\n        hasUserCookie: function() {\n            return (h.user === g.get(\"c_user\"));\n        }\n    };\n    e.exports = l;\n});\n__d(\"PresencePrivacy\", [\"hasArrayNature\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"copyProperties\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"PresencePrivacyInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"copyProperties\"), l = b(\"Env\"), m = b(\"JSLogger\"), n = b(\"PresenceUtil\"), o = b(\"PresencePrivacyInitialData\"), p = \"/ajax/chat/privacy/settings.php\", q = \"/ajax/chat/privacy/online_policy.php\", r = \"/ajax/chat/privacy/visibility.php\", s = \"friend_visibility\", t = \"visibility\", u = \"online_policy\", v = k({\n    }, o.privacyData), w = o.visibility, x = k({\n    }, o.privacyData), y = w, z = o.onlinePolicy, aa = z, ba = [], ca = false;\n    function da() {\n        return m.create(\"blackbird\");\n    };\n    var ea = k(new h(), {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1\n    });\n    function fa(ra) {\n        var sa;\n        for (sa in ra) {\n            var ta = ra[sa];\n            if ((sa == l.user)) {\n                da().error(\"set_viewer_visibility\");\n                throw new Error(\"Invalid to set current user's visibility\");\n            }\n        ;\n            switch (ta) {\n              case ea.WHITELISTED:\n            \n              case ea.BLACKLISTED:\n            \n              case ea.UNLISTED:\n                break;\n              default:\n                da().error(\"set_invalid_friend_visibility\", {\n                    id: sa,\n                    value: ta\n                });\n                throw new Error((\"Invalid state: \" + ta));\n            };\n        };\n        for (sa in ra) {\n            v[sa] = ra[sa];;\n        };\n        ea.inform(\"privacy-changed\");\n    };\n    function ga(ra, sa) {\n        var ta = {\n        };\n        ta[ra] = sa;\n        fa(ta);\n    };\n    function ha(ra) {\n        switch (ra) {\n          case ea.ONLINE:\n        \n          case ea.OFFLINE:\n            break;\n          default:\n            da().error(\"set_invalid_visibility\", {\n                value: ra\n            });\n            throw new Error((\"Invalid visibility: \" + ra));\n        };\n        w = ra;\n        ea.inform(\"privacy-changed\");\n        ea.inform(\"privacy-user-presence-changed\");\n        h.inform(\"chat/visibility-changed\", {\n            sender: this\n        });\n    };\n    function ia(ra) {\n        switch (ra) {\n          case ea.ONLINE_TO_WHITELIST:\n        \n          case ea.ONLINE_TO_BLACKLIST:\n            break;\n          default:\n            throw new Error((\"Invalid default online policy: \" + ra));\n        };\n        z = ra;\n        ea.inform(\"privacy-user-presence-changed\");\n        ea.inform(\"privacy-changed\");\n    };\n    function ja(ra, sa) {\n        ca = true;\n        ra.send();\n    };\n    function ka(ra, sa) {\n        ba.push({\n            request: ra,\n            data: sa\n        });\n        if (!ca) {\n            var ta = ba.shift();\n            ja(ta.request, ta.data);\n        }\n    ;\n    };\n    function la(ra, sa) {\n        var ta = ra.type;\n        if ((ta === s)) {\n            var ua = sa.payload.user_availabilities;\n            if (!g(ua)) {\n                ea.inform(\"privacy-availability-changed\", {\n                    user_availabilities: ua\n                });\n                for (var va in ra.settings) {\n                    x[va] = ra.settings[va];;\n                };\n            }\n        ;\n        }\n         else {\n            if ((ta === t)) {\n                y = ra.visibility;\n            }\n             else if ((ta === u)) {\n                aa = ra.online_policy;\n            }\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n        da().log(\"set_update_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n    function ma(ra, sa) {\n        if ((w !== y)) {\n            ha(y);\n        };\n        if ((z !== aa)) {\n            ia(aa);\n        };\n        k(v, x);\n        ea.inform(\"privacy-changed\");\n        ba = [];\n        da().log(\"set_error_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n    function na(ra) {\n        ca = false;\n        if ((ba.length > 0)) {\n            var sa = ba.shift();\n            ja(sa.request, sa.data);\n        }\n    ;\n    };\n    function oa(ra, sa) {\n        if ((n != null)) {\n            var ta = ra.getData();\n            ta.window_id = n.getSessionID();\n            ra.setData(ta);\n        }\n    ;\n        ra.setHandler(la.bind(this, sa)).setErrorHandler(ma.bind(this, sa)).setTransportErrorHandler(ma.bind(this, sa)).setFinallyHandler(na.bind(this)).setAllowCrossPageTransition(true);\n        return ra;\n    };\n    function pa(ra, sa, ta) {\n        return oa(new i(ra).setData(sa), ta);\n    };\n    function qa(ra, sa) {\n        var ta = sa.obj;\n        if ((ta.viewer_id != l.user)) {\n            da().error(\"invalid_viewer_for_channel_message\", {\n                type: ra,\n                data: sa\n            });\n            throw new Error(\"Viewer got from the channel is not the real viewer\");\n        }\n    ;\n        if ((ta.window_id === n.getSessionID())) {\n            return\n        };\n        var ua = ta.data;\n        if ((ta.event == \"access_control_entry\")) {\n            ua.target_ids.forEach(function(wa) {\n                ga(wa, ua.setting);\n                x[wa] = ua.setting;\n            });\n        }\n         else {\n            if ((ta.event == \"visibility_update\")) {\n                var va = (!!ua.visibility ? ea.ONLINE : ea.OFFLINE);\n                ha(va);\n                y = va;\n            }\n             else if ((ta.event == \"online_policy_update\")) {\n                ia(ua.online_policy);\n                aa = ua.online_policy;\n            }\n            \n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n        da().log(\"channel_message_received\", {\n            data: sa.obj\n        });\n    };\n    k(ea, {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1,\n        init: function(ra, sa, ta) {\n        \n        },\n        setVisibility: function(ra) {\n            y = w;\n            ha(ra);\n            var sa = {\n                visibility: ra\n            }, ta = {\n                type: t,\n                visibility: ra\n            }, ua = pa(r, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_visibility\", {\n                data: sa\n            });\n            return ra;\n        },\n        getVisibility: function() {\n            return w;\n        },\n        setOnlinePolicy: function(ra) {\n            aa = z;\n            ia(ra);\n            var sa = {\n                online_policy: ra\n            }, ta = {\n                type: u,\n                online_policy: ra\n            }, ua = pa(q, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_online_policy\", {\n                data: sa\n            });\n            return ra;\n        },\n        getOnlinePolicy: function() {\n            return z;\n        },\n        getFriendVisibility: function(ra) {\n            return (v[ra] || ea.UNLISTED);\n        },\n        allows: function(ra) {\n            if ((this.getVisibility() === ea.OFFLINE)) {\n                return false\n            };\n            var sa = this.getOnlinePolicy();\n            return ((sa === ea.ONLINE_TO_WHITELIST) ? (v[ra] == ea.WHITELISTED) : (v[ra] != ea.BLACKLISTED));\n        },\n        setFriendsVisibility: function(ra, sa) {\n            if ((ra.length > 0)) {\n                var ta = {\n                };\n                for (var ua = 0; (ua < ra.length); ua++) {\n                    var va = ra[ua];\n                    x[va] = v[va];\n                    ta[va] = sa;\n                };\n                fa(ta);\n                var wa = sa;\n                if ((wa == ea.UNLISTED)) {\n                    wa = x[ra[0]];\n                };\n                var xa = {\n                    users: ra,\n                    setting: sa,\n                    setting_type: wa\n                }, ya = {\n                    type: s,\n                    settings: ta\n                }, za = pa(p, xa, ya);\n                ka(za, ya);\n                da().log(\"set_friend_visibility\", {\n                    data: xa\n                });\n            }\n        ;\n            return sa;\n        },\n        setFriendVisibilityMap: function(ra, sa) {\n            for (var ta in ra) {\n                x[ta] = v[ta];;\n            };\n            fa(ra);\n            var ua = {\n                type: s,\n                settings: ra\n            };\n            ka(oa(sa, ua), ua);\n            da().log(\"set_friend_visibility_from_map\", {\n                data: ra\n            });\n        },\n        allow: function(ra) {\n            if (this.allows(ra)) {\n                da().error(\"allow_already_allowed\");\n                throw new Error((\"allow() should only be called for users that \" + \"are not already allowed\"));\n            }\n        ;\n            if ((this.getVisibility() === ea.OFFLINE)) {\n                da().error(\"allow_called_while_offline\");\n                throw new Error(\"allow() should only be called when the user is already online\");\n            }\n        ;\n            var sa = ((this.getOnlinePolicy() === ea.ONLINE_TO_WHITELIST) ? ea.WHITELISTED : ea.UNLISTED);\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        disallow: function(ra) {\n            if (!this.allows(ra)) {\n                da().error(\"disallow_already_disallowed\");\n                throw new Error((\"disallow() should only be called for users that \" + \"are not already disallowed\"));\n            }\n        ;\n            if ((this.getVisibility() === ea.OFFLINE)) {\n                da().error(\"disallow_called_while_offline\");\n                throw new Error(\"disallow() should only be called when the user is already online\");\n            }\n        ;\n            var sa = ((this.getOnlinePolicy() === ea.ONLINE_TO_BLACKLIST) ? ea.BLACKLISTED : ea.UNLISTED);\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        getBlacklist: function() {\n            var ra = [];\n            for (var sa in v) {\n                if ((v[sa] === ea.BLACKLISTED)) {\n                    ra.push(sa);\n                };\n            };\n            return ra;\n        },\n        getWhitelist: function() {\n            var ra = [];\n            for (var sa in v) {\n                if ((v[sa] === ea.WHITELISTED)) {\n                    ra.push(sa);\n                };\n            };\n            return ra;\n        },\n        getMapForTest: function() {\n            return v;\n        },\n        setMapForTest: function(ra) {\n            v = ra;\n        }\n    });\n    ea.inform(\"privacy-changed\");\n    ea.inform(\"privacy-user-presence-changed\");\n    da().log(\"initialized\", {\n        visibility: w,\n        policy: z\n    });\n    h.subscribe(j.getArbiterType(\"privacy_changed\"), qa.bind(this));\n    h.subscribe(j.ON_CONFIG, function(ra, sa) {\n        var ta = sa.getConfig(\"visibility\", null);\n        if (((ta !== null) && (typeof (ta) !== \"undefined\"))) {\n            var ua = (ta ? ea.ONLINE : ea.OFFLINE);\n            ha(ua);\n            da().log(\"config_visibility\", {\n                vis: ua\n            });\n        }\n    ;\n    }.bind(this));\n    a.PresencePrivacy = e.exports = ea;\n}, 3);\n__d(\"ChatVisibility\", [\"Arbiter\",\"JSLogger\",\"PresencePrivacy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = {\n        isOnline: function() {\n            return (i.getVisibility() === i.ONLINE);\n        },\n        hasBlackbirdEnabled: function() {\n            return (this.isVisibleToMostFriends() || this.isVisibleToSomeFriends());\n        },\n        isVisibleToMostFriends: function() {\n            return ((i.getOnlinePolicy() === i.ONLINE_TO_BLACKLIST) && (i.getBlacklist().length > 0));\n        },\n        isVisibleToSomeFriends: function() {\n            return ((i.getOnlinePolicy() === i.ONLINE_TO_WHITELIST) && (i.getWhitelist().length > 0));\n        },\n        goOnline: function(k) {\n            if ((i.getVisibility() === i.OFFLINE)) {\n                h.create(\"blackbird\").log(\"chat_go_online\");\n                i.setVisibility(i.ONLINE);\n                g.inform(\"chat-visibility/go-online\");\n            }\n        ;\n            (k && k());\n        },\n        goOffline: function(k) {\n            if ((i.getVisibility() === i.ONLINE)) {\n                h.create(\"blackbird\").log(\"chat_go_offline\");\n                i.setVisibility(i.OFFLINE);\n                g.inform(\"chat-visibility/go-offline\");\n            }\n        ;\n            (k && k());\n        },\n        toggleVisibility: function() {\n            if (j.isOnline()) {\n                j.goOffline();\n            }\n             else j.goOnline();\n        ;\n        }\n    };\n    a.ChatVisibility = e.exports = j;\n}, 3);\n__d(\"MercuryIDs\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((typeof i === \"string\") && (i.indexOf(\":\") !== -1));\n    };\n    var h = {\n        isValid: function(i) {\n            if (!i) {\n                return false\n            };\n            return g(i);\n        },\n        isValidThreadID: function(i) {\n            if (!h.isValid(i)) {\n                return false\n            };\n            var j = h.tokenize(i);\n            switch (j.type) {\n              case \"user\":\n            \n              case \"group\":\n            \n              case \"thread\":\n            \n              case \"root\":\n            \n              case \"pending\":\n                return true;\n              default:\n                return false;\n            };\n        },\n        tokenize: function(i) {\n            if (!this.isValid(i)) {\n                throw \"bad_id_format\"\n            };\n            var j = i.indexOf(\":\");\n            return {\n                type: i.substr(0, j),\n                value: i.substr((j + 1))\n            };\n        },\n        getUserIDFromParticipantID: function(i) {\n            if (!h.isValid(i)) {\n                return null\n            };\n            var j = h.tokenize(i);\n            if ((j.type != \"fbid\")) {\n                return null\n            };\n            return j.value;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryAssert\", [\"MercuryIDs\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryIDs\");\n    e.exports = {\n        isParticipantID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_participant_id\"\n            };\n        },\n        allParticipantIDs: function(h) {\n            h.forEach(this.isParticipantID);\n        },\n        isUserParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if ((i.type != \"fbid\")) {\n                throw \"bad_user_id\"\n            };\n        },\n        isEmailParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if ((i.type != \"email\")) {\n                throw \"bad_email_id\"\n            };\n        },\n        allThreadID: function(h) {\n            h.forEach(this.isThreadID);\n        },\n        isThreadID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_thread_id\"\n            };\n        }\n    };\n});\n__d(\"MercurySingletonMixin\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        _getInstances: function() {\n            if (!this._instances) {\n                this._instances = {\n                };\n            };\n            return this._instances;\n        },\n        get: function() {\n            return this.getForFBID(g.user);\n        },\n        getForFBID: function(i) {\n            var j = this._getInstances();\n            if (!j[i]) {\n                j[i] = new this(i);\n            };\n            return j[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryMessageIDs\", [\"KeyedCallbackManager\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = new g(), i = {\n        getServerIDs: function(j, k) {\n            var l = j.filter(function(n) {\n                return (n.indexOf(\"mail.projektitan.com\") !== -1);\n            }), m = function(n) {\n                var o = j.map(function(p) {\n                    return (n[p] ? n[p] : p);\n                });\n                k(o);\n            };\n            return h.executeOrEnqueue(l, m);\n        },\n        addServerID: function(j, k) {\n            h.setResource(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImageSourceType\", [], function(a, b, c, d, e, f) {\n    var g = {\n        PROFILE_PICTURE: \"profile_picture\",\n        IMAGE: \"image\"\n    };\n    e.exports = g;\n});\n__d(\"PhotoResizeModeConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COVER: \"s\",\n        CONTAIN: \"p\"\n    };\n    e.exports = g;\n});\n__d(\"ImageSourceRequest\", [\"arrayContains\",\"extendArray\",\"copyProperties\",\"Env\",\"KeyedCallbackManager\",\"ImageSourceType\",\"PhotoResizeModeConst\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"extendArray\"), i = b(\"copyProperties\"), j = b(\"Env\"), k = b(\"KeyedCallbackManager\"), l = b(\"ImageSourceType\"), m = b(\"PhotoResizeModeConst\"), n = b(\"MercuryServerDispatcher\");\n    function o() {\n        this._request = {\n            fbid: null,\n            type: null,\n            width: null,\n            height: null,\n            resize_mode: null\n        };\n        this._callback = null;\n    };\n    i(o.prototype, {\n        setFBID: function(s) {\n            this._request.fbid = s;\n            return this;\n        },\n        setType: function(s) {\n            if (!g([l.PROFILE_PICTURE,l.IMAGE,], s)) {\n                throw new TypeError((\"ImageSourceRequest.setType: invalid type \" + s))\n            };\n            this._request.type = s;\n            return this;\n        },\n        setDimensions: function(s, t) {\n            this._request.width = s;\n            this._request.height = t;\n            return this;\n        },\n        setResizeMode: function(s) {\n            if (!g([m.COVER,m.CONTAIN,], s)) {\n                throw new TypeError((\"ImageSourceRequest.setResizeMode: invalid resize mode \" + s))\n            };\n            this._request.resize_mode = s;\n            return this;\n        },\n        setCallback: function(s) {\n            this._callback = s;\n            return this;\n        },\n        send: function() {\n            if ((((((!this._request.fbid || !this._request.width) || !this._request.height) || !this._request.type) || !this._request.resize_mode) || !this._callback)) {\n                throw new Error(\"ImageSourceRequest: You must set all the fields\")\n            };\n            var s = q(), t = r(this._request);\n            s.executeOrEnqueue(t, this._callback);\n            if ((s.getUnavailableResourcesFromRequest(t).length === 1)) {\n                n.trySend(\"/ajax/image_source.php\", {\n                    requests: [this._request,]\n                });\n                return true;\n            }\n        ;\n            return false;\n        }\n    });\n    var p = null;\n    function q() {\n        if (p) {\n            return p\n        };\n        var s = new k();\n        p = s;\n        n.registerEndpoints({\n            \"/ajax/image_source.php\": {\n                request_user_id: j.user,\n                mode: n.BATCH_DEFERRED_MULTI,\n                batch_function: function(t, u) {\n                    h(t.requests, u.requests);\n                    return t;\n                },\n                handler: function(t, u) {\n                    var v = u.getData().requests;\n                    for (var w = 0; (w < v.length); ++w) {\n                        s.setResource(r(v[w]), t[w]);;\n                    };\n                }\n            }\n        });\n        return s;\n    };\n    function r(s) {\n        return [s.fbid,s.type,s.width,s.height,s.resize_mode,].join(\"|\");\n    };\n    e.exports = o;\n});\n__d(\"TimestampConverter\", [\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = g.create(\"timestamp_converter\");\n    function i(k) {\n        return (((typeof (k) == \"string\")) && (k.length > 6));\n    };\n    var j = {\n        convertActionIDToTimestamp: function(k) {\n            if (i(k)) {\n                var l = k.slice(0, -6);\n                return parseInt(l, 10);\n            }\n        ;\n        },\n        maxValidActionID: function(k, l) {\n            if (!i(k)) {\n                return l\n            };\n            if (!i(l)) {\n                return k\n            };\n            return (this.isGreaterThan(k, l) ? k : l);\n        },\n        isGreaterThan: function(k, l) {\n            if ((!i(k) || !i(l))) {\n                return false\n            };\n            return (this.convertActionIDToTimestamp(k) > this.convertActionIDToTimestamp(l));\n        }\n    };\n    e.exports = j;\n});\n__d(\"MessagingReliabilityLogger\", [\"function-extensions\",\"PresenceUtil\",\"MercuryServerDispatcher\",\"MessagingReliabilityLoggerInitialData\",\"isEmpty\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PresenceUtil\"), h = b(\"MercuryServerDispatcher\"), i = b(\"MessagingReliabilityLoggerInitialData\"), j = b(\"isEmpty\"), k = b(\"setTimeoutAcrossTransitions\"), l = \"/ajax/mercury/client_reliability.php\", m = 60000;\n    function n(t, u) {\n        var v = {\n            app: i.app,\n            categories: JSON.stringify(t)\n        };\n        if (!j(u)) {\n            v.extra = JSON.stringify(u);\n        };\n        return v;\n    };\n    function o(t, u, v, w) {\n        if ((t[u] === undefined)) {\n            t[u] = {\n            };\n        };\n        if ((t[u][v] === undefined)) {\n            t[u][v] = 0;\n        };\n        t[u][v] += w;\n    };\n    function p(t, u, v, w) {\n        if ((t[u] === undefined)) {\n            t[u] = {\n            };\n        };\n        if ((t[u][v] === undefined)) {\n            t[u][v] = [];\n        };\n        for (var x = 0; (x < w.length); ++x) {\n            t[u][v].push(w[x]);;\n        };\n    };\n    function q(t, u) {\n        if ((((t && !t.categories)) || ((u && !u.categories)))) {\n            return\n        };\n        var v = (t ? JSON.parse(t.categories) : {\n        }), w = ((t && t.extra) ? JSON.parse(t.extra) : {\n        }), x = JSON.parse(u.categories), y = (u.extra ? JSON.parse(u.extra) : {\n        });\n        for (var z in x) {\n            var aa = x[z], ba = y[z];\n            for (var ca in aa) {\n                o(v, z, ca, aa[ca]);\n                if ((ba !== undefined)) {\n                    var da = ba[ca];\n                    if ((da !== undefined)) {\n                        p(w, z, ca, da);\n                    };\n                }\n            ;\n            };\n        };\n        return n(v, w);\n    };\n    var r = {\n    };\n    r[l] = {\n        mode: h.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR,\n        batch_function: q\n    };\n    h.registerEndpoints(r);\n    var s = {\n        addEntry: function(t, u, v) {\n            if (!i.enabled) {\n                return\n            };\n            var w = {\n            };\n            o(w, t, u, 1);\n            var x = {\n            };\n            if ((v !== undefined)) {\n                p(x, t, u, [v,]);\n            };\n            h.trySend(l, n(w, x));\n        }\n    };\n    (function t() {\n        s.addEntry(\"page_event\", \"active\", g.getSessionID());\n        k(t, m);\n    })();\n    e.exports = s;\n});\n__d(\"MercuryThreadInformer\", [\"ArbiterMixin\",\"copyProperties\",\"MercuryAssert\",\"MercurySingletonMixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"MercuryAssert\"), j = b(\"MercurySingletonMixin\");\n    function k(m) {\n        if (!m._locked) {\n            var n = m._threadDeletions, o = m._threadChanges, p = m._threadReadChanges, q = m._threadlistChanged, r = m._unseenStateChanged, s = m._unreadStateChanged, t = m._receivedMessages, u = m._reorderedMessages, v = m._updatedMessages;\n            m._threadDeletions = {\n            };\n            m._threadChanges = {\n            };\n            m._threadReadChanges = {\n            };\n            m._threadlistChanged = false;\n            m._unseenStateChanged = false;\n            m._unreadStateChanged = false;\n            m._receivedMessages = {\n            };\n            m._reorderedMessages = {\n            };\n            m._updatedMessages = {\n            };\n            var w = Object.keys(o);\n            if ((w.length || q)) {\n                m.inform(\"threadlist-updated\", w);\n            };\n            if (w.length) {\n                m.inform(\"threads-updated\", o);\n            };\n            for (var x in p) {\n                m.inform(\"thread-read-changed\", p);\n                break;\n            };\n            for (var x in n) {\n                m.inform(\"threads-deleted\", n);\n                break;\n            };\n            if (r) {\n                m.inform(\"unseen-updated\", null);\n            };\n            if (s) {\n                m.inform(\"unread-updated\", null);\n            };\n            for (x in t) {\n                m.inform(\"messages-received\", t);\n                break;\n            };\n            for (x in u) {\n                m.inform(\"messages-reordered\", u);\n                break;\n            };\n            for (x in v) {\n                m.inform(\"messages-updated\", v);\n                break;\n            };\n        }\n    ;\n    };\n    function l(m) {\n        this._fbid = m;\n        this._threadDeletions = {\n        };\n        this._threadChanges = {\n        };\n        this._threadReadChanges = {\n        };\n        this._threadlistChanged = false;\n        this._unseenStateChanged = false;\n        this._unreadStateChanged = false;\n        this._receivedMessages = {\n        };\n        this._reorderedMessages = {\n        };\n        this._updatedMessages = {\n        };\n        this._locked = 0;\n    };\n    h(l.prototype, g, {\n        updatedThread: function(m) {\n            this._threadChanges[m] = true;\n            k(this);\n        },\n        deletedThread: function(m) {\n            this._threadDeletions[m] = true;\n            k(this);\n        },\n        updatedThreadlist: function() {\n            this._threadlistChanged = true;\n            k(this);\n        },\n        updatedUnseenState: function() {\n            this._unseenStateChanged = true;\n            k(this);\n        },\n        updatedUnreadState: function() {\n            this._unreadStateChanged = true;\n            k(this);\n        },\n        changedThreadReadState: function(m, n, o) {\n            if ((!this._threadReadChanges[m] || (this._threadReadChanges[m].timestamp < o))) {\n                this._threadReadChanges[m] = {\n                    mark_as_read: n,\n                    timestamp: o\n                };\n            };\n            k(this);\n        },\n        receivedMessage: function(m) {\n            i.isThreadID(m.thread_id);\n            var n = m.thread_id;\n            if (!this._receivedMessages[n]) {\n                this._receivedMessages[n] = [];\n            };\n            this._receivedMessages[n].push(m);\n            this.updatedThread(n);\n        },\n        reorderedMessages: function(m, n) {\n            this._reorderedMessages[m] = {\n                source: n\n            };\n            k(this);\n        },\n        updatedMessage: function(m, n, o) {\n            if (!this._updatedMessages[m]) {\n                this._updatedMessages[m] = {\n                };\n            };\n            this._updatedMessages[m][n] = {\n                source: o\n            };\n            this.updatedThread(m);\n        },\n        synchronizeInforms: function(m) {\n            this._locked++;\n            try {\n                m();\n            } catch (n) {\n                throw n;\n            } finally {\n                this._locked--;\n                k(this);\n            };\n        },\n        listen: function(m, n) {\n            return this.subscribe(\"threads-updated\", function(o, p) {\n                if (p[m]) {\n                    n(m);\n                };\n            });\n        }\n    });\n    h(l, j);\n    e.exports = l;\n});\n__d(\"MercuryServerRequests\", [\"ArbiterMixin\",\"AsyncResponse\",\"TimestampConverter\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAPIArgsSource\",\"MercuryAssert\",\"MercuryErrorType\",\"MercuryGenericConstants\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryPayloadSource\",\"MercuryServerRequestsConfig\",\"MercurySourceType\",\"MercuryThreadlistConstants\",\"MercuryMessageIDs\",\"MessagingConfig\",\"MessagingReliabilityLogger\",\"MessagingTag\",\"MercurySingletonMixin\",\"MercuryServerDispatcher\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncResponse\"), i = b(\"TimestampConverter\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"KeyedCallbackManager\"), m = b(\"MercuryActionTypeConstants\"), n = b(\"MercuryActionStatus\"), o = b(\"MercuryAPIArgsSource\"), p = b(\"MercuryAssert\"), q = b(\"MercuryErrorType\"), r = b(\"MercuryGenericConstants\"), s = b(\"MercuryGlobalActionType\"), t = b(\"MercuryIDs\"), u = b(\"MercuryLogMessageType\"), v = b(\"MercuryPayloadSource\"), w = b(\"MercuryServerRequestsConfig\"), x = b(\"MercurySourceType\"), y = b(\"MercuryThreadlistConstants\"), z = b(\"MercuryMessageIDs\"), aa = b(\"MessagingConfig\"), ba = b(\"MessagingReliabilityLogger\"), ca = b(\"MessagingTag\"), da = b(\"MercurySingletonMixin\"), ea = b(\"MercuryServerDispatcher\"), fa = b(\"MercuryThreadInformer\"), ga = b(\"copyProperties\"), ha = b(\"createObjectFrom\"), ia = k.create(\"mercury_server\"), ja = o.MERCURY;\n    function ka(sb, tb) {\n        if (tb) {\n            sb._lastActionId = i.maxValidActionID(sb._lastActionId, tb);\n        };\n    };\n    function la(sb, tb) {\n        var ub = tb.thread_id, vb = sb._serverToClientIDs.getResource(ub);\n        if (!vb) {\n            if (tb.canonical_fbid) {\n                vb = (\"user:\" + tb.canonical_fbid);\n            }\n             else if (tb.root_message_threading_id) {\n                vb = (\"root:\" + tb.root_message_threading_id);\n            }\n        ;\n            vb = (vb || (\"thread:\" + ub));\n            ma(sb, ub, vb);\n        }\n    ;\n        tb.thread_id = vb;\n    };\n    function ma(sb, tb, ub) {\n        sb._serverToClientIDs.setResource(tb, ub);\n        sb._clientToServerIDs.setResource(ub, tb);\n        sb._newlyAddedClientIDs[tb] = ub;\n    };\n    function na(sb, tb, ub) {\n        var vb = sb._clientToServerIDs.executeOrEnqueue(tb, ub), wb = sb._clientToServerIDs.getUnavailableResources(vb), xb = sb.tokenizeThreadID(tb);\n        if ((wb.length && (xb.type != \"root\"))) {\n            sb.fetchThreadData(wb);\n        };\n    };\n    function oa(sb, tb) {\n        return sb._clientToServerIDs.getResource(tb);\n    };\n    function pa(sb, tb) {\n        return !!sb._serverToClientIDs.getResource(tb);\n    };\n    function qa(sb, tb) {\n        var ub = sb._serverToClientIDs.getResource(tb);\n        if ((typeof ub == \"undefined\")) {\n            ia.warn(\"no_client_thread_id\", {\n                server_id: tb\n            });\n        };\n        return ub;\n    };\n    function ra(sb, tb, ub) {\n        sb._serverToClientIDs.executeOrEnqueue(tb, ub);\n        sb.ensureThreadIsFetched(tb);\n    };\n    function sa(sb, tb, ub) {\n        if ((tb.action_type != m.SEND_MESSAGE)) {\n            return\n        };\n        var vb = tb.client_thread_id;\n        if (!vb) {\n            vb = qa(sb, tb.thread_id);\n        };\n        var wb = null;\n        if (vb) {\n            wb = t.tokenize(vb).type;\n        };\n        ba.addEntry((\"send_\" + wb), ub, ((tb.thread_id + \",\") + tb.message_id));\n    };\n    function ta(sb) {\n        return (sb.getError() ? (\"_\" + sb.getError()) : \"\");\n    };\n    function ua(sb, tb) {\n        var ub = null;\n        switch (tb.status) {\n          case n.SUCCESS:\n            ub = \"success\";\n            break;\n          case n.FAILED_UNKNOWN_REASON:\n            ub = \"confirmed_error\";\n            break;\n          case n.UNABLE_TO_CONFIRM:\n            ub = \"confirm_error\";\n            break;\n          default:\n            return;\n        };\n        sa(sb, tb, ub);\n    };\n    function va(sb, tb) {\n        ((tb.message_counts || [])).forEach(function(cc) {\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.threads || [])).forEach(function(cc) {\n            la(sb, cc);\n            delete sb._fetchingThreads[cc.thread_id];\n            var dc = oa(sb, cc.thread_id);\n            delete sb._fetchingThreads[dc];\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.ordered_threadlists || [])).forEach(function(cc) {\n            cc.thread_ids = cc.thread_ids.map(qa.curry(sb));\n        });\n        tb.actions = (tb.actions || []);\n        tb.actions.forEach(function(cc) {\n            ua(sb, cc);\n            if (((cc.status && (cc.status != n.SUCCESS)) && !cc.thread_id)) {\n                cc.thread_id = cc.client_thread_id;\n                return;\n            }\n        ;\n            if ((((cc.action_type == m.SEND_MESSAGE) && cc.client_thread_id) && (cc.client_thread_id != r.PENDING_THREAD_ID))) {\n                ma(sb, cc.thread_id, cc.client_thread_id);\n            };\n            cc.server_thread_id = cc.thread_id;\n            cc.thread_id = (pa(sb, cc.thread_id) ? qa(sb, cc.thread_id) : null);\n            ka(sb, cc.action_id);\n        });\n        if (tb.end_of_history) {\n            var ub = [];\n            for (var vb = 0; (vb < tb.end_of_history.length); vb++) {\n                var wb = tb.end_of_history[vb];\n                if ((wb.type == \"user\")) {\n                    ub.push((\"user:\" + wb.id));\n                }\n                 else if (((wb.type == \"thread\") && pa(sb, wb.id))) {\n                    ub.push(qa(sb, wb.id));\n                }\n            ;\n            };\n            tb.end_of_history = ub;\n        }\n    ;\n        if (tb.roger) {\n            var xb = {\n            };\n            for (var yb in tb.roger) {\n                var zb = sb._serverToClientIDs.getResource(yb);\n                if (zb) {\n                    var ac = tb.roger[yb];\n                    xb[zb] = {\n                    };\n                    for (var bc in ac) {\n                        xb[zb][(\"fbid:\" + bc)] = ac[bc];;\n                    };\n                }\n            ;\n            };\n            tb.roger = xb;\n        }\n    ;\n    };\n    function wa(sb) {\n        if ((sb._pendingUpdates && sb._pendingUpdates.length)) {\n            var tb = sb._pendingUpdates[0];\n            sb._pendingUpdates = sb._pendingUpdates.slice(1);\n            sb.handleUpdate(tb);\n        }\n    ;\n    };\n    function xa(sb, tb) {\n        var ub = ga({\n        }, sb), vb;\n        if (tb.threads) {\n            if (!ub.threads) {\n                ub.threads = {\n                };\n            };\n            for (vb in tb.threads) {\n                ub.threads[vb] = Object.keys(ha(((ub.threads[vb] || [])).concat(tb.threads[vb])));;\n            };\n        }\n    ;\n        if (tb.messages) {\n            if (!ub.messages) {\n                ub.messages = {\n                };\n            };\n            for (vb in tb.messages) {\n                if (!ub.messages[vb]) {\n                    ub.messages[vb] = {\n                    };\n                };\n                for (var wb in tb.messages[vb]) {\n                    if (ub.messages[vb][wb]) {\n                        ub.messages[vb][wb] = ab(ub.messages[vb][wb], tb.messages[vb][wb]);\n                    }\n                     else ub.messages[vb][wb] = tb.messages[vb][wb];\n                ;\n                };\n            };\n        }\n    ;\n        ub.client = (sb.client || tb.client);\n        return ub;\n    };\n    function ya(sb, tb) {\n        var ub = ga(ha(sb.folders, true), ha(tb.folders, true)), vb = (sb.client || tb.client);\n        return {\n            folders: Object.keys(ub),\n            client: vb\n        };\n    };\n    function za(sb, tb) {\n        for (var ub in tb) {\n            if ((sb[ub] && (typeof sb[ub] === \"object\"))) {\n                sb[ub] = ab(sb[ub], tb[ub]);\n            }\n             else if ((tb[ub] && (typeof tb[ub] === \"object\"))) {\n                var vb = {\n                };\n                ga(vb, tb[ub]);\n                sb[ub] = vb;\n            }\n            \n        ;\n        };\n        return sb;\n    };\n    function ab(sb, tb) {\n        var ub = ((sb.offset < tb.offset) ? sb.offset : tb.offset), vb = (sb.offset + sb.limit), wb = (tb.offset + tb.limit), xb = (((vb > wb)) ? vb : wb), yb = (xb - ub);\n        return {\n            offset: ub,\n            limit: yb\n        };\n    };\n    function bb(sb, tb) {\n        var ub = (sb.client || tb.client), vb = {\n            ids: {\n            },\n            client: ub\n        };\n        ga(vb.ids, sb.ids);\n        ga(vb.ids, tb.ids);\n        return vb;\n    };\n    function cb(sb, tb) {\n        var ub = {\n        }, vb, wb = (sb.client || tb.client);\n        delete sb.client;\n        delete tb.client;\n        for (vb in sb) {\n            ga(ub, ha(sb[vb], vb));;\n        };\n        for (vb in tb) {\n            ga(ub, ha(tb[vb], vb));;\n        };\n        var xb = {\n            client: wb\n        };\n        for (var yb in ub) {\n            vb = ub[yb];\n            if (!xb[vb]) {\n                xb[vb] = [];\n            };\n            xb[vb].push(yb);\n        };\n        return xb;\n    };\n    function db(sb, tb) {\n        var ub = (sb.client || tb.client), vb = ha(sb.ids, true), wb = ha(tb.ids, true), xb = ga(vb, wb);\n        return {\n            ids: Object.keys(xb),\n            client: ub\n        };\n    };\n    function eb(sb) {\n        this._fbid = sb;\n        this._lastActionId = 0;\n        this._serverToClientIDs = new l();\n        this._clientToServerIDs = new l();\n        this._pendingUpdates = [];\n        this._fetchingThreads = {\n        };\n        this._newlyAddedClientIDs = {\n        };\n        qb(this);\n    };\n    ga(eb.prototype, g, {\n        tokenizeThreadID: function(sb) {\n            p.isThreadID(sb);\n            return t.tokenize(sb);\n        },\n        getServerThreadID: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, tb);\n        },\n        getClientThreadID: function(sb, tb) {\n            ra(this, sb, tb);\n        },\n        getClientThreadIDNow: function(sb) {\n            return qa(this, sb);\n        },\n        getServerThreadIDNow: function(sb) {\n            return oa(this, sb);\n        },\n        convertThreadIDIfAvailable: function(sb) {\n            var tb = this._serverToClientIDs.getResource(sb);\n            if ((tb === undefined)) {\n                return sb;\n            }\n             else return tb\n        ;\n        },\n        canLinkExternally: function(sb) {\n            p.isThreadID(sb);\n            var tb = this.tokenizeThreadID(sb);\n            return (((tb.type == \"user\")) || !!oa(this, sb));\n        },\n        fetchThreadlistInfo: function(sb, tb, ub, vb, wb) {\n            ub = (ub || ca.INBOX);\n            wb = (wb || ja);\n            var xb = (vb ? ea.IMMEDIATE : null), yb = {\n                client: wb\n            };\n            yb[ub] = {\n                offset: sb,\n                limit: tb,\n                filter: vb\n            };\n            rb(this, \"/ajax/mercury/threadlist_info.php\", yb, xb);\n        },\n        fetchUnseenThreadIDs: function(sb, tb) {\n            tb = (tb || ja);\n            this.fetchThreadlistInfo(y.RECENT_THREAD_OFFSET, y.JEWEL_THREAD_COUNT, sb, null, tb);\n        },\n        fetchUnreadThreadIDs: function(sb, tb) {\n            tb = (tb || ja);\n            rb(this, \"/ajax/mercury/unread_threads.php\", {\n                folders: [sb,],\n                client: tb\n            });\n        },\n        fetchMissedMessages: function(sb, tb) {\n            tb = (tb || ja);\n            rb(this, \"/ajax/mercury/thread_sync.php\", {\n                last_action_id: this._lastActionId,\n                folders: sb,\n                client: tb\n            });\n        },\n        fetchThreadData: function(sb, tb) {\n            tb = (tb || ja);\n            p.allThreadID(sb);\n            var ub = {\n                threads: {\n                },\n                client: tb\n            }, vb = [], wb = [];\n            sb.forEach(function(yb) {\n                if (this._fetchingThreads[yb]) {\n                    return\n                };\n                this._fetchingThreads[yb] = true;\n                var zb = oa(this, yb);\n                if (zb) {\n                    wb.push(zb);\n                    ub.threads.thread_ids = wb;\n                }\n                 else {\n                    var ac = this.tokenizeThreadID(yb);\n                    if ((ac.type == \"user\")) {\n                        vb.push(ac.value);\n                        ub.threads.user_ids = vb;\n                    }\n                     else if ((ac.type == \"thread\")) {\n                        wb.push(ac.value);\n                        ub.threads.thread_ids = wb;\n                    }\n                     else if (((ac.type != \"root\") && (ac.type != \"pending\"))) {\n                        throw new Error(\"Unknown thread type\", ac)\n                    }\n                    \n                ;\n                }\n            ;\n            }.bind(this));\n            this.inform(\"fetch-thread-data\", ub);\n            for (var xb in ub.threads) {\n                rb(this, \"/ajax/mercury/thread_info.php\", ub);\n                break;\n            };\n        },\n        ensureThreadIsFetched: function(sb, tb) {\n            tb = (tb || ja);\n            if ((!this._serverToClientIDs.getResource(sb) && !this._fetchingThreads[sb])) {\n                this._fetchingThreads[sb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [sb,]\n                    },\n                    client: tb\n                });\n            }\n        ;\n        },\n        fetchThreadMessages: function(sb, tb, ub, vb, wb) {\n            p.isThreadID(sb);\n            wb = (wb || ja);\n            var xb, yb, zb = this.tokenizeThreadID(sb), ac = oa(this, sb), bc = false;\n            if ((ac && (zb.type != \"group\"))) {\n                yb = \"thread_ids\";\n                xb = ac;\n            }\n             else {\n                xb = zb.value;\n                switch (zb.type) {\n                  case \"user\":\n                    yb = \"user_ids\";\n                    bc = true;\n                    break;\n                  case \"group\":\n                    yb = \"group_ids\";\n                    break;\n                  case \"thread\":\n                    yb = \"thread_ids\";\n                    break;\n                };\n            }\n        ;\n            var cc = {\n                messages: {\n                },\n                threads: {\n                },\n                client: wb\n            };\n            if (yb) {\n                cc.messages[yb] = {\n                };\n                cc.messages[yb][xb] = {\n                    offset: tb,\n                    limit: ub\n                };\n                if (bc) {\n                    cc.threads[yb] = [xb,];\n                };\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }\n             else na(this, sb, function(dc) {\n                cc.messages.thread_ids = {\n                };\n                cc.messages.thread_ids[dc] = {\n                    offset: tb,\n                    limit: ub\n                };\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }.bind(this));\n        ;\n        },\n        handleThreadInfoError: function(sb) {\n            var tb = sb.getRequest().getData(), ub = [];\n            if (tb.messages) {\n                for (var vb in tb.messages.thread_ids) {\n                    ub.push(fb(qa(this, vb)));;\n                };\n                for (var wb in tb.messages.user_ids) {\n                    ub.push(fb((\"user:\" + wb)));;\n                };\n                for (var xb in tb.messages.group_ids) {\n                    ub.push(fb((\"group:\" + xb)));;\n                };\n            }\n        ;\n            if (ub.length) {\n                this.handleUpdate({\n                    actions: ub,\n                    from_client: true,\n                    payload_source: v.CLIENT_CHANNEL_MESSAGE\n                });\n            };\n            if ((tb.threads && (((tb.threads.user_ids || tb.threads.group_ids) || tb.threads.thread_ids)))) {\n                var yb = 5, zb = true;\n                if (!tb.retry_count) {\n                    tb.retry_count = 0;\n                    if (tb.messages) {\n                        delete tb.messages;\n                    };\n                }\n                 else if ((tb.retry_count >= yb)) {\n                    zb = false;\n                    ((tb.threads.thread_ids || [])).forEach(function(bc) {\n                        if ((bc in this._fetchingThreads)) {\n                            delete this._fetchingThreads[bc];\n                        };\n                    }.bind(this));\n                }\n                \n            ;\n                if (zb) {\n                    var ac = (tb.retry_count * 1000);\n                    (function() {\n                        ia.log(\"retry_thread\", tb);\n                        rb(this, \"/ajax/mercury/thread_info.php\", tb);\n                    }.bind(this)).defer(ac, false);\n                    tb.retry_count++;\n                }\n            ;\n            }\n        ;\n        },\n        markFolderAsRead: function(sb) {\n            rb(this, \"/ajax/mercury/mark_folder_as_read.php\", {\n                folder: sb\n            });\n            var tb = [{\n                action_type: s.MARK_ALL_READ,\n                action_id: null,\n                folder: sb\n            },];\n            this.handleUpdate({\n                global_actions: tb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadReadStatus: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_read_status.php\", xb);\n            }.bind(this));\n            var vb = [{\n                action_type: m.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: sb,\n                mark_as_read: tb,\n                folder: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadArchivedStatus: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_archived_status.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: sb,\n                archived: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_ARCHIVED_STATUS\n            };\n            this.handleUpdate(vb);\n        },\n        changeThreadFolder: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                };\n                xb[tb] = [wb,];\n                rb(this, \"/ajax/mercury/move_thread.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        changeMutingOnThread: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                rb(this, \"/ajax/mercury/change_mute_thread.php\", {\n                    thread_id: wb,\n                    mute_settings: tb,\n                    payload_source: ja\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_MUTE_SETTINGS,\n                action_id: null,\n                thread_id: sb,\n                mute_settings: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_MUTE_SETTINGS\n            };\n            this.handleUpdate(vb);\n        },\n        markThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.SPAM\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        markMessagesSpam: function(sb, tb) {\n            z.getServerIDs((tb || []), function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam_messages.php\", {\n                    message_ids: vb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n            this.handleUpdate({\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        unmarkThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/unmark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.INBOX\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        deleteThread: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                var wb = {\n                    ids: [vb,]\n                };\n                rb(this, \"/ajax/mercury/delete_thread.php\", wb);\n            }.bind(this));\n            var tb = {\n                action_type: m.DELETE_THREAD,\n                action_id: null,\n                thread_id: sb\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_THREAD\n            };\n            this.handleUpdate(ub);\n        },\n        deleteMessages: function(sb, tb, ub) {\n            z.getServerIDs((tb || []), function(wb) {\n                rb(this, \"/ajax/mercury/delete_messages.php\", {\n                    message_ids: wb\n                });\n            }.bind(this));\n            var vb;\n            if (ub) {\n                vb = {\n                    action_type: m.DELETE_THREAD,\n                    action_id: null,\n                    thread_id: sb\n                };\n            }\n             else vb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n        ;\n            this.handleUpdate({\n                actions: [vb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        clearChat: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            rb(this, \"/ajax/chat/settings.php\", {\n                clear_history_id: tb\n            });\n            var vb = [{\n                action_type: m.CLEAR_CHAT,\n                action_id: null,\n                thread_id: sb,\n                clear_time: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CLEAR_CHAT\n            });\n        },\n        sendNewMessage: function(sb, tb) {\n            tb = (tb || ja);\n            if (!sb.do_not_send_to_server) {\n                z.getServerIDs((sb.forward_message_ids || []), function(vb) {\n                    var wb = sb.thread_id, xb = this.tokenizeThreadID(sb.thread_id), yb = xb.type, zb = ga({\n                    }, sb);\n                    zb.forward_message_ids = vb;\n                    if ((((((yb == \"root\") && (xb.value == zb.message_id))) || (((yb == \"user\") && !oa(this, wb)))) || ((sb.thread_id == r.PENDING_THREAD_ID)))) {\n                        zb.client_thread_id = zb.thread_id;\n                        zb.thread_id = null;\n                        this._sendNewMessageToServer(zb, tb);\n                    }\n                     else na(this, zb.thread_id, function(ac) {\n                        zb.thread_id = ac;\n                        this._sendNewMessageToServer(zb);\n                    }.bind(this));\n                ;\n                }.bind(this));\n            };\n            if ((sb.thread_id != r.PENDING_THREAD_ID)) {\n                var ub = {\n                    actions: [ga({\n                    }, sb),],\n                    from_client: true,\n                    payload_source: v.CLIENT_SEND_MESSAGE\n                };\n                this.handleUpdate(ub);\n            }\n        ;\n        },\n        _sendNewMessageToServer: function(sb, tb) {\n            tb = (tb || ja);\n            rb(this, \"/ajax/mercury/send_messages.php\", {\n                message_batch: [sb,],\n                client: tb\n            });\n        },\n        requestMessageConfirmation: function(sb, tb) {\n            tb = (tb || ja);\n            var ub = {\n            }, vb = {\n            };\n            for (var wb in sb) {\n                var xb = oa(this, wb);\n                if (xb) {\n                    ub[xb] = sb[wb];\n                }\n                 else {\n                    var yb = sb[wb];\n                    for (var zb = 0; (zb < yb.length); zb++) {\n                        vb[yb[zb]] = wb;;\n                    };\n                }\n            ;\n            };\n            var ac = Object.keys(ub), bc = Object.keys(vb);\n            if ((ac.length || bc.length)) {\n                rb(this, \"/ajax/mercury/confirm_messages.php\", {\n                    thread_message_map: ub,\n                    local_messages: vb,\n                    client: tb\n                });\n            };\n        },\n        handleMessageConfirmError: function(sb) {\n            var tb = sb.getRequest().getData().thread_message_map, ub = sb.getRequest().getData().local_messages;\n            if ((!tb && !ub)) {\n                return\n            };\n            var vb = [];\n            for (var wb in tb) {\n                var xb = tb[wb];\n                xb.forEach(function(ac) {\n                    vb.push({\n                        action_type: m.SEND_MESSAGE,\n                        client_message_id: ac,\n                        message_id: ac,\n                        client_thread_id: null,\n                        thread_id: wb,\n                        status: n.UNABLE_TO_CONFIRM\n                    });\n                });\n            };\n            for (var yb in ub) {\n                var zb = ub[yb];\n                vb.push({\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: yb,\n                    message_id: yb,\n                    client_thread_id: zb,\n                    thread_id: null,\n                    status: n.UNABLE_TO_CONFIRM\n                });\n            };\n            if (vb.length) {\n                this.handleUpdate({\n                    actions: vb,\n                    payload_source: v.CLIENT_HANDLE_ERROR\n                });\n            };\n        },\n        markSeen: function() {\n            var sb = i.convertActionIDToTimestamp(this._lastActionId);\n            rb(this, \"/ajax/mercury/mark_seen.php\", {\n                seen_timestamp: sb\n            });\n        },\n        handleRoger: function(sb) {\n            var tb = (sb.tid ? this._serverToClientIDs.getResource(sb.tid) : ((\"user:\" + sb.reader)));\n            if (tb) {\n                var ub = {\n                };\n                ub[tb] = {\n                };\n                ub[tb][(\"fbid:\" + sb.reader)] = sb.time;\n                this.inform(\"update-roger\", ub);\n            }\n        ;\n        },\n        handleUpdateWaitForThread: function(sb, tb, ub) {\n            ub = (ub || ja);\n            var vb = this._serverToClientIDs.getResource(tb);\n            if (vb) {\n                this.handleUpdate(sb);\n                return;\n            }\n        ;\n            this._serverToClientIDs.executeOrEnqueue(tb, function() {\n                this._pendingUpdates.push(sb);\n            }.bind(this));\n            if (!this._fetchingThreads[tb]) {\n                this._fetchingThreads[tb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [tb,]\n                    },\n                    client: ub\n                });\n            }\n        ;\n        },\n        handleUpdate: function(sb) {\n            var tb = [];\n            if ((sb && sb.threads)) {\n                for (var ub = 0; (ub < sb.threads.length); ub++) {\n                    if (!sb.threads[ub].snippet_attachments) {\n                        continue;\n                    };\n                    for (var vb = 0; (vb < sb.threads[ub].snippet_attachments.length); vb++) {\n                        if (sb.threads[ub].snippet_attachments[vb].share_xhp) {\n                            tb.push({\n                                i: ub,\n                                j: vb,\n                                xhp: sb.threads[ub].snippet_attachments[vb].share_xhp\n                            });\n                            sb.threads[ub].snippet_attachments[vb].share_xhp = ((\"HTMLDivElement not shown: object contains circular \" + \"reference, which was breaking JSON.stringify. \") + \"Look at MercuryServerRequests.handleUpdate\");\n                        }\n                    ;\n                    };\n                }\n            };\n            ia.debug(\"handle_update\", {\n                payload: sb,\n                from_client: sb.from_client\n            });\n            for (var wb = 0; (wb < tb.length); wb++) {\n                sb.threads[tb[wb].i].snippet_attachments[tb[wb].j].share_xhp = tb[wb].xhp;;\n            };\n            for (wb in sb) {\n                fa.getForFBID(this._fbid).synchronizeInforms(function() {\n                    if (!sb.from_client) {\n                        va(this, sb);\n                        this.inform(\"payload-preprocessed\", sb);\n                    }\n                ;\n                    this.inform(\"update-thread-ids\", this._newlyAddedClientIDs);\n                    this._newlyAddedClientIDs = {\n                    };\n                    this.inform(\"update-participants\", sb);\n                    this.inform(\"update-threads\", sb);\n                    this.inform(\"update-unread\", sb);\n                    this.inform(\"update-threadlist\", sb);\n                    this.inform(\"update-messages\", sb);\n                    this.inform(\"update-unseen\", sb);\n                    this.inform(\"update-typing-state\", sb);\n                    this.inform(\"update-roger\", sb.roger);\n                    this.inform(\"model-update-completed\", null);\n                    wa(this);\n                }.bind(this));\n                break;\n            };\n        },\n        _handleSendMessageErrorCommon: function(sb, tb, ub, vb) {\n            ia.debug(\"handle_send_message_error_common\", {\n                reliability_error_status: ub,\n                request_error_status: tb\n            });\n            var wb = sb.getData(), xb = wb.message_batch, yb = xb.map(function(ac) {\n                return {\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: ac.message_id,\n                    message_id: ac.message_id,\n                    client_thread_id: ac.client_thread_id,\n                    thread_id: ac.thread_id,\n                    status: tb,\n                    error_data: vb\n                };\n            });\n            yb.forEach(function(ac) {\n                sa(this, ac, ub);\n            }.bind(this));\n            var zb = {\n                actions: yb,\n                payload_source: v.CLIENT_HANDLE_ERROR\n            };\n            this.handleUpdate(zb);\n        },\n        handleSendMessageError: function(sb) {\n            var tb = sb.getPayload(), ub = null, vb = null;\n            if ((tb && tb.error_payload)) {\n                ub = n.UNCONFIRMED;\n                vb = \"send_error\";\n            }\n             else {\n                ub = n.ERROR;\n                vb = (\"request_error\" + ta(sb));\n            }\n        ;\n            var wb = sb.error;\n            if ((wb === 1404102)) {\n                h.verboseErrorHandler(sb);\n            };\n            var xb = (/<.*>/.test(sb.getErrorDescription()) ? sb.getErrorSummary() : sb.getErrorDescription());\n            this._handleSendMessageErrorCommon(sb.getRequest(), ub, vb, {\n                type: q.SERVER,\n                code: sb.getError(),\n                description: xb,\n                is_transient: sb.isTransient()\n            });\n        },\n        handleSendMessageTransportError: function(sb) {\n            this._handleSendMessageErrorCommon(sb.getRequest(), n.ERROR, (\"transport_error\" + ta(sb)), {\n                type: q.TRANSPORT,\n                code: sb.getError(),\n                is_transient: true\n            });\n        },\n        handleSendMessageTimeout: function(sb) {\n            this._handleSendMessageErrorCommon(sb, n.ERROR, \"transport_timeout\", {\n                type: q.TIMEOUT,\n                is_transient: true\n            });\n        },\n        getLastActionID: function() {\n            return this._lastActionId;\n        }\n    });\n    ga(eb, da);\n    function fb(sb) {\n        return {\n            action_type: m.LOG_MESSAGE,\n            thread_id: sb,\n            message_id: sb,\n            timestamp: Date.now(),\n            timestamp_absolute: \"\",\n            timestamp_relative: \"\",\n            is_unread: false,\n            source: x.UNKNOWN,\n            log_message_type: u.SERVER_ERROR,\n            log_message_data: {\n            }\n        };\n    };\n    function gb(sb) {\n        var tb = sb.getData(), ub = (tb.request_user_id ? tb.request_user_id : j.user);\n        return eb.getForFBID(ub);\n    };\n    function hb(sb, tb) {\n        gb(tb).handleUpdate(sb);\n    };\n    function ib(sb, tb) {\n        var ub = (sb.client || tb.client);\n        return {\n            client: ub,\n            message_batch: sb.message_batch.concat(tb.message_batch)\n        };\n    };\n    function jb(sb, tb) {\n        var ub = {\n        };\n        ga(ub, sb.ids);\n        ga(ub, tb.ids);\n        var vb = (sb.client || tb.client);\n        return {\n            ids: ub,\n            client: vb\n        };\n    };\n    function kb(sb, tb) {\n        return tb;\n    };\n    function lb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleThreadInfoError(sb);\n    };\n    function mb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageError(sb);\n    };\n    function nb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageTransportError(sb);\n    };\n    function ob(sb) {\n        var tb = gb(sb);\n        tb.handleSendMessageTimeout(sb);\n    };\n    function pb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleMessageConfirmError(sb);\n    };\n    function qb(sb) {\n        ea.registerEndpoints({\n            \"/ajax/mercury/thread_sync.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IDEMPOTENT,\n                handler: hb\n            },\n            \"/ajax/mercury/thread_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_DEFERRED_MULTI,\n                batch_function: xa,\n                handler: hb,\n                error_handler: lb\n            },\n            \"/ajax/mercury/mark_folder_as_read.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/change_read_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: jb,\n                handler: hb\n            },\n            \"/ajax/mercury/send_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: ib,\n                batch_size_limit: aa.SEND_BATCH_LIMIT,\n                handler: hb,\n                error_handler: mb,\n                transport_error_handler: nb,\n                timeout: w.sendMessageTimeout,\n                timeout_handler: ob,\n                connection_retries: aa.SEND_CONNECTION_RETRIES\n            },\n            \"/ajax/mercury/mark_seen.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: kb,\n                handler: hb\n            },\n            \"/ajax/mercury/confirm_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb,\n                error_handler: pb\n            },\n            \"/ajax/mercury/threadlist_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: za,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unmark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unread_threads.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: ya,\n                handler: hb\n            },\n            \"/ajax/chat/settings.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE\n            },\n            \"/ajax/mercury/change_archived_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: bb,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: db,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/move_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: cb,\n                handler: hb\n            },\n            \"/ajax/mercury/change_mute_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            }\n        });\n    };\n    function rb(sb, tb, ub, vb) {\n        ea.trySend(tb, ub, vb, sb._fbid);\n    };\n    e.exports = eb;\n});\n__d(\"MercuryParticipants\", [\"Env\",\"ImageSourceRequest\",\"ImageSourceType\",\"MercuryAssert\",\"MercuryIDs\",\"MercuryParticipantTypes\",\"MercuryParticipantsConstants\",\"PhotoResizeModeConst\",\"MercuryServerRequests\",\"ShortProfiles\",\"copyProperties\",\"getObjectValues\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ImageSourceRequest\"), i = b(\"ImageSourceType\"), j = b(\"MercuryAssert\"), k = b(\"MercuryIDs\"), l = b(\"MercuryParticipantTypes\"), m = b(\"MercuryParticipantsConstants\"), n = b(\"PhotoResizeModeConst\"), o = b(\"MercuryServerRequests\").get(), p = b(\"ShortProfiles\"), q = b(\"copyProperties\"), r = b(\"getObjectValues\"), s = b(\"tx\"), t = (\"fbid:\" + g.user), u = {\n    }, v = {\n    }, w = function(ba) {\n        ba = z(ba);\n        if (u[ba.id]) {\n            q(u[ba.id], ba);\n        }\n         else u[ba.id] = q({\n        }, ba);\n    ;\n        if (ba.vanity) {\n            v[ba.vanity] = ba.id;\n        };\n    };\n    function x(ba) {\n        j.isEmailParticipantID(ba);\n        var ca = k.tokenize(ba), da = ca.value;\n        return {\n            gender: m.UNKNOWN_GENDER,\n            href: null,\n            id: ba,\n            image_src: m.EMAIL_IMAGE,\n            big_image_src: m.EMAIL_IMAGE,\n            name: da,\n            short_name: da,\n            employee: false,\n            call_promo: false\n        };\n    };\n    function y(ba, ca, da) {\n        j.allParticipantIDs(ba);\n        var ea = {\n        }, fa = {\n        };\n        ba.forEach(function(ha) {\n            if ((u[ha] && !da)) {\n                ea[ha] = q({\n                }, u[ha]);\n            }\n             else {\n                var ia = k.tokenize(ha);\n                if ((ia.type == \"fbid\")) {\n                    var ja = ia.value;\n                    fa[ha] = ja;\n                }\n                 else if ((ia.type == \"email\")) {\n                    ea[ha] = x(ha);\n                }\n            ;\n            }\n        ;\n        });\n        var ga = r(fa);\n        if (ga.length) {\n            p.getMulti(ga, function(ha) {\n                for (var ia in fa) {\n                    var ja = fa[ia], ka = ha[ja];\n                    ea[ia] = {\n                        gender: ka.gender,\n                        href: ka.uri,\n                        id: ia,\n                        image_src: ka.thumbSrc,\n                        name: ka.name,\n                        short_name: ka.firstName,\n                        employee: ka.employee,\n                        call_promo: ka.showVideoPromo,\n                        type: ka.type,\n                        vanity: ka.vanity,\n                        is_friend: ka.is_friend,\n                        social_snippets: ka.social_snippets\n                    };\n                    w(ea[ia]);\n                };\n                ca(ea);\n            });\n        }\n         else ca(ea);\n    ;\n    };\n    function z(ba) {\n        var ca = ((ba.type === l.USER) || (ba.type === l.FRIEND));\n        if (!ca) {\n            return ba\n        };\n        if (((!ba.name && !ba.href) && !ba.vanity)) {\n            var da = \"Facebook User\";\n            ba.name = da;\n            ba.short_name = da;\n        }\n    ;\n        return ba;\n    };\n    var aa = {\n        user: t,\n        isAuthor: function(ba) {\n            return (ba === t);\n        },\n        getIDFromVanityOrFBID: function(ba) {\n            if (!ba) {\n                return\n            };\n            if (v[ba]) {\n                return v[ba]\n            };\n            if (ba.match(\"^\\\\d+$\")) {\n                return aa.getIDForUser(ba)\n            };\n        },\n        getNow: function(ba) {\n            return u[ba];\n        },\n        get: function(ba, ca) {\n            j.isParticipantID(ba);\n            aa.getMulti([ba,], function(da) {\n                ca(da[ba]);\n            });\n        },\n        getMulti: function(ba, ca, da) {\n            return y(ba, ca, false);\n        },\n        getBigImageMulti: function(ba, ca) {\n            j.allParticipantIDs(ba);\n            var da = m.BIG_IMAGE_SIZE;\n            aa.getMulti(ba, function(ea) {\n                var fa = {\n                }, ga = 0, ha = function(la, ma) {\n                    ga++;\n                    fa[la] = ma;\n                    if ((ga === ba.length)) {\n                        ca(fa);\n                    };\n                }, ia = function(la, ma) {\n                    u[la].big_image_src = ma.uri;\n                    ha(la, ma.uri);\n                };\n                for (var ja in ea) {\n                    var ka = ea[ja];\n                    if (!ka.big_image_src) {\n                        new h().setFBID(aa.getUserID(ja)).setType(i.PROFILE_PICTURE).setDimensions(da, da).setResizeMode(n.COVER).setCallback(ia.curry(ja)).send();\n                    }\n                     else ha(ka.id, ka.big_image_src);\n                ;\n                };\n            });\n        },\n        getOrderedBigImageMulti: function(ba, ca) {\n            aa.getBigImageMulti(ba, function(da) {\n                var ea = ba.map(function(fa) {\n                    return da[fa];\n                });\n                ca(ea);\n            });\n        },\n        getMultiForceDownload: function(ba, ca) {\n            return y(ba, ca, true);\n        },\n        getUserID: function(ba) {\n            return k.getUserIDFromParticipantID(ba);\n        },\n        getIDForUser: function(ba) {\n            return (\"fbid:\" + ba);\n        },\n        addParticipants: function(ba) {\n            ba.forEach(w);\n        }\n    };\n    o.subscribe(\"update-participants\", function(ba, ca) {\n        aa.addParticipants((ca.participants || []));\n    });\n    e.exports = aa;\n});\n__d(\"RangedCallbackManager\", [\"CallbackManagerController\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"copyProperties\"), i = b(\"createObjectFrom\"), j = function(k, l, m) {\n        this._resources = [];\n        this._reachedEndOfArray = false;\n        this._error = false;\n        this._existingIDs = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n        this._getValueHandler = k;\n        this._compareValuesHandler = l;\n        this._skipOnStrictHandler = m;\n    };\n    h(j.prototype, {\n        executeOrEnqueue: function(k, l, m, n) {\n            return this._controller.executeOrEnqueue({\n                start: k,\n                limit: l\n            }, m, {\n                strict: !!n\n            });\n        },\n        unsubscribe: function(k) {\n            this._controller.unsubscribe(k);\n        },\n        getUnavailableResources: function(k) {\n            var l = this._controller.getRequest(k), m = [];\n            if ((l && !this._reachedEndOfArray)) {\n                var n = l.request, o = this._filterForStrictResults(l.options), p = (n.start + n.limit);\n                for (var q = o.length; (q < p); q++) {\n                    m.push(q);;\n                };\n            }\n        ;\n            return m;\n        },\n        addResources: function(k) {\n            k.forEach(function(l) {\n                if (!this._existingIDs[l]) {\n                    this._existingIDs[l] = true;\n                    this._resources.push(l);\n                    this._error = null;\n                }\n            ;\n            }.bind(this));\n            this.resortResources();\n            this._controller.runPossibleCallbacks();\n        },\n        addResourcesWithoutSorting: function(k, l) {\n            var m = this._resources.slice(0, l);\n            m = m.concat(k);\n            m = m.concat(this._resources.slice(l));\n            this._resources = m;\n            h(this._existingIDs, i(k, true));\n            this._error = null;\n            this._controller.runPossibleCallbacks();\n        },\n        removeResources: function(k) {\n            k.forEach(function(l) {\n                if (this._existingIDs[l]) {\n                    this._existingIDs[l] = false;\n                    var m = this._resources.indexOf(l);\n                    if ((m != -1)) {\n                        this._resources.splice(m, 1);\n                    };\n                }\n            ;\n            }.bind(this));\n        },\n        removeAllResources: function() {\n            this._resources = [];\n            this._existingIDs = {\n            };\n        },\n        resortResources: function() {\n            this._resources = this._resources.sort(function(k, l) {\n                return this._compareValuesHandler(this._getValueHandler(k), this._getValueHandler(l));\n            }.bind(this));\n        },\n        setReachedEndOfArray: function() {\n            if (!this._reachedEndOfArray) {\n                this._reachedEndOfArray = true;\n                this._error = null;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        },\n        hasReachedEndOfArray: function() {\n            return this._reachedEndOfArray;\n        },\n        setError: function(k) {\n            if ((this._error !== k)) {\n                this._error = k;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        },\n        getError: function(k, l, m) {\n            var n = this._filterForStrictResults({\n                strict: m\n            });\n            return (((k + l) > n.length) ? this._error : null);\n        },\n        hasResource: function(k) {\n            return this._existingIDs[k];\n        },\n        getResourceAtIndex: function(k) {\n            return this._resources[k];\n        },\n        getAllResources: function() {\n            return this._resources.concat();\n        },\n        getCurrentArraySize: function() {\n            return this._resources.length;\n        },\n        _filterForStrictResults: function(k) {\n            var l = this._resources;\n            if (((k && k.strict) && this._skipOnStrictHandler)) {\n                l = l.filter(this._skipOnStrictHandler);\n            };\n            return l;\n        },\n        _constructCallbackArg: function(k, l) {\n            var m = this._filterForStrictResults(l);\n            if (((!this._reachedEndOfArray && !this._error) && ((k.start + k.limit) > m.length))) {\n                return false;\n            }\n             else {\n                var n = m.slice(k.start, (k.start + k.limit)), o = (((k.start + k.limit) > m.length) ? this._error : null);\n                return [n,o,];\n            }\n        ;\n        },\n        getElementsUntil: function(k) {\n            var l = [];\n            for (var m = 0; (m < this._resources.length); m++) {\n                var n = this._getValueHandler(this._resources[m]);\n                if ((this._compareValuesHandler(n, k) > 0)) {\n                    break;\n                };\n                l.push(this._resources[m]);\n            };\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFolders\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.INBOX,g.OTHER,g.ACTION_ARCHIVED,g.SPAM,], j = {\n        getSupportedFolders: function() {\n            return i.concat();\n        },\n        isSupportedFolder: function(k) {\n            return h(i, k);\n        },\n        getFromMeta: function(k) {\n            var l = k.folder;\n            if (k.is_archived) {\n                l = g.ACTION_ARCHIVED;\n            };\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryAttachment\", [\"MercuryAttachmentContentType\",\"MercuryAttachmentType\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentContentType\"), h = b(\"MercuryAttachmentType\"), i = b(\"startsWith\"), j = {\n        getAttachIconClass: function(k) {\n            switch (k) {\n              case g.PHOTO:\n                return \"MercuryPhotoIcon\";\n              case g.VIDEO:\n                return \"MercuryVideoIcon\";\n              case g.MUSIC:\n                return \"MercuryMusicIcon\";\n              case g.VOICE:\n                return \"MercuryVoiceIcon\";\n              case g.TEXT:\n                return \"MercuryTextIcon\";\n              case g.MSWORD:\n                return \"MercuryMSWordIcon\";\n              case g.MSXLS:\n                return \"MercuryMSXLSIcon\";\n              case g.MSPPT:\n                return \"MercuryMSPPTIcon\";\n            };\n            return \"MercuryDefaultIcon\";\n        },\n        getAttachIconClassByMime: function(k) {\n            if (i(k, \"image\")) {\n                return \"MercuryPhotoIcon\";\n            }\n             else if (i(k, \"video\")) {\n                return \"MercuryVideoIcon\";\n            }\n             else if (i(k, \"audio\")) {\n                return \"MercuryMusicIcon\";\n            }\n             else if (i(k, \"text/plain\")) {\n                return \"MercuryTextIcon\";\n            }\n             else return \"MercuryDefaultIcon\"\n            \n            \n            \n        ;\n        },\n        getAttachTypeByMime: function(k) {\n            if (i(k, \"image\")) {\n                return g.PHOTO;\n            }\n             else if (i(k, \"video\")) {\n                return g.VIDEO;\n            }\n             else if (i(k, \"audio\")) {\n                return g.MUSIC;\n            }\n             else if (i(k, \"text/plain\")) {\n                return g.TEXT;\n            }\n             else return g.UNKNOWN\n            \n            \n            \n        ;\n        },\n        convertRaw: function(k) {\n            var l = [];\n            for (var m = 0; (m < k.length); m++) {\n                var n = k[m];\n                if ((n.attach_type === h.PHOTO)) {\n                    l.push(n);\n                }\n                 else if (n.filename) {\n                    var o = j.getAttachTypeByMime(n.filetype), p = {\n                    };\n                    p.attach_type = h.FILE;\n                    p.name = n.filename;\n                    p.icon_type = o;\n                    p.url = \"\";\n                    if ((o == g.PHOTO)) {\n                        p.preview_loading = true;\n                    };\n                    l.push(p);\n                }\n                \n            ;\n            };\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreads\", [\"Arbiter\",\"TimestampConverter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryAttachment\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercurySingletonMixin\",\"MercuryThreadMode\",\"MessagingTag\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"MercuryFolders\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryAssert\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryGlobalActionType\"), p = b(\"MercuryIDs\"), q = b(\"MercuryLogMessageType\"), r = b(\"MercurySingletonMixin\"), s = b(\"MercuryThreadMode\"), t = b(\"MessagingTag\"), u = b(\"MercuryParticipants\"), v = b(\"MercuryServerRequests\"), w = b(\"MercuryThreadInformer\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"removeFromArray\"), aa = j.create(\"mercury_threads\");\n    function ba(na, oa, pa) {\n        var qa = y(oa.participants, true), ra = u.getIDForUser(na._fbid);\n        pa.forEach(function(sa) {\n            if ((qa[sa] !== true)) {\n                oa.participants.push(sa);\n                if ((sa === ra)) {\n                    oa.is_subscribed = true;\n                };\n            }\n        ;\n        });\n    };\n    function ca(na, oa, pa) {\n        z(oa.participants, pa);\n        if ((pa === u.getIDForUser(na._fbid))) {\n            oa.is_subscribed = false;\n        };\n    };\n    function da(na, oa) {\n        if ((na.participants[0] != oa)) {\n            z(na.participants, oa);\n            na.participants.unshift(oa);\n        }\n    ;\n    };\n    function ea(na, oa) {\n        var pa = oa.body, qa = oa.subject, ra = \"\";\n        if (qa) {\n            qa = qa.toLowerCase();\n            if ((pa.slice(0, qa.length).toLowerCase() == qa)) {\n                ra = pa;\n            }\n             else if (pa) {\n                ra = ((qa + \" \\u00b7 \") + pa);\n            }\n             else ra = qa;\n            \n        ;\n        }\n         else ra = pa;\n    ;\n        na.snippet = ra;\n        na.snippet_has_attachment = oa.has_attachment;\n        if ((oa.raw_attachments && (oa.raw_attachments.length > 0))) {\n            var sa = n.convertRaw(oa.raw_attachments);\n            na.snippet_attachments = sa;\n        }\n         else na.snippet_attachments = oa.attachments;\n    ;\n        na.is_forwarded_snippet = !!oa.forward_count;\n        na.snippet_sender = oa.author;\n    };\n    function fa(na, oa, pa) {\n        if (!oa) {\n            return false\n        };\n        if (!oa.timestamp) {\n            return true\n        };\n        var qa = !oa.unread_count;\n        if ((pa == qa)) {\n            return false\n        };\n        oa.unread_count = (pa ? 0 : 1);\n        na._threadInformer.updatedThread(oa.thread_id);\n        return true;\n    };\n    function ga(na, oa) {\n        var pa = na._threads.getAllResources();\n        for (var qa in pa) {\n            var ra = pa[qa];\n            if ((ra.folder == oa)) {\n                ra.unread_count = 0;\n                na._threads.setResource(qa, ra);\n                na._threadInformer.updatedThread(qa);\n            }\n        ;\n        };\n    };\n    function ha(na, oa, pa) {\n        if ((!oa || (oa.chat_clear_time === pa))) {\n            return false\n        };\n        oa.chat_clear_time = pa;\n        na._threadInformer.reorderedMessages(oa.thread_id);\n        return true;\n    };\n    function ia(na, oa, pa, qa) {\n        var ra = pa.action_type;\n        if (((ra == l.USER_GENERATED_MESSAGE) || (ra == l.LOG_MESSAGE))) {\n            (pa.is_unread && oa.unread_count++);\n            oa.message_count++;\n            oa.is_archived = false;\n        }\n    ;\n        switch (ra) {\n          case l.USER_GENERATED_MESSAGE:\n            da(oa, pa.author);\n            break;\n          case l.SEND_MESSAGE:\n            var sa = pa.log_message_type;\n            if ((sa == q.THREAD_IMAGE)) {\n                oa.image_src = (pa.log_message_data.image ? pa.log_message_data.image.preview_url : null);\n            };\n            oa.snippet_attachments = pa.attachments;\n            break;\n          case l.LOG_MESSAGE:\n            var sa = pa.log_message_type;\n            if ((sa == q.SUBSCRIBE)) {\n                ba(na, oa, pa.log_message_data.added_participants);\n            }\n             else if ((sa == q.JOINABLE_JOINED)) {\n                ba(na, oa, [pa.log_message_data.joined_participant,]);\n            }\n             else if ((sa == q.UNSUBSCRIBE)) {\n                ca(na, oa, pa.author);\n            }\n             else if ((sa == q.THREAD_IMAGE)) {\n                if (!qa) {\n                    oa.image_src = (pa.log_message_data.image ? pa.log_message_data.image.preview_url : null);\n                };\n            }\n             else if ((sa == q.THREAD_NAME)) {\n                oa.name = pa.log_message_data.name;\n            }\n            \n            \n            \n        ;\n            break;\n          case l.CHANGE_READ_STATUS:\n            if (pa.timestamp) {\n                na._threadInformer.changedThreadReadState(oa.thread_id, pa.mark_as_read, pa.timestamp);\n            };\n            fa(na, oa, pa.mark_as_read);\n            break;\n          case l.CLEAR_CHAT:\n            ha(na, oa, pa.clear_time);\n            break;\n          case l.CHANGE_ARCHIVED_STATUS:\n            oa.is_archived = pa.archived;\n            break;\n          case l.CHANGE_FOLDER:\n            oa.folder = pa.new_folder;\n            break;\n          case l.DELETE_MESSAGES:\n            if (qa) {\n                oa.snippet = \"...\";\n                oa.snippet_has_attachment = false;\n                oa.snippet_attachments = null;\n                oa.snippet_sender = null;\n                oa.is_forwarded_snippet = false;\n                na._threadInformer.updatedThread(pa.thread_id);\n            }\n             else if (pa.message_ids) {\n                oa.message_count = (oa.message_count - pa.message_ids.length);\n            }\n        ;\n            break;\n          case l.CHANGE_MUTE_SETTINGS:\n            if ((pa.mute_settings !== undefined)) {\n                var ta = (na._fbid + \"@facebook.com\");\n                if (oa.mute_settings) {\n                    if (pa.mute_settings) {\n                        oa.mute_settings[ta] = pa.mute_settings;\n                    }\n                     else delete oa.mute_settings[ta];\n                ;\n                    na._threadInformer.updatedThread(oa.thread_id);\n                }\n            ;\n            }\n        ;\n            break;\n        };\n        if (pa.action_id) {\n            oa.last_action_id = h.maxValidActionID(pa.action_id, oa.last_action_id);\n        };\n    };\n    function ja(na, oa) {\n        var pa = na._serverRequests.tokenizeThreadID(oa.thread_id);\n        if ((pa.type == \"group\")) {\n            aa.error(\"invalid_new_thread_message\", oa);\n            return undefined;\n        }\n    ;\n        var qa = la(na, oa.specific_to_list), ra = {\n            thread_id: oa.thread_id,\n            last_action_id: oa.action_id,\n            participants: oa.specific_to_list,\n            name: null,\n            snippet: oa.body,\n            snippet_has_attachment: false,\n            snippet_attachments: [],\n            snippet_sender: oa.author,\n            unread_count: 0,\n            message_count: 0,\n            image_src: null,\n            timestamp_absolute: oa.timestamp_absolute,\n            timestamp_relative: oa.timestamp_relative,\n            timestamp: oa.timestamp,\n            canonical_fbid: ((pa.type === \"user\") ? pa.value : null),\n            is_canonical_user: (pa.type === \"user\"),\n            is_canonical: qa,\n            is_subscribed: true,\n            root_message_threading_id: oa.message_id,\n            folder: t.INBOX,\n            is_archived: false,\n            mode: s.TITAN_ORIGINATED\n        };\n        return ra;\n    };\n    function ka(na) {\n        this._fbid = na;\n        this._serverRequests = v.getForFBID(this._fbid);\n        this._threadInformer = w.getForFBID(this._fbid);\n        this._threads = new k();\n        ma(this);\n    };\n    x(ka.prototype, {\n        getThreadMetaNow: function(na) {\n            m.isThreadID(na);\n            return this._threads.getResource(na);\n        },\n        getThreadMeta: function(na, oa, pa) {\n            m.isThreadID(na);\n            var qa = this._threads.executeOrEnqueue(na, oa), ra = this._threads.getUnavailableResources(qa);\n            if (ra.length) {\n                var sa = this._serverRequests.tokenizeThreadID(na);\n                if ((sa.type == \"user\")) {\n                    this.getCanonicalThreadToUser(sa.value);\n                }\n                 else this._serverRequests.fetchThreadData(ra, pa);\n            ;\n            }\n        ;\n            return qa;\n        },\n        unsubscribe: function(na) {\n            this._threads.unsubscribe(na);\n        },\n        changeThreadReadStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (fa(this, pa, oa)) {\n                this._serverRequests.changeThreadReadStatus(na, oa, i.getFromMeta(pa));\n            };\n        },\n        changeThreadArchivedStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if ((pa.is_archived != oa)) {\n                pa.is_archived = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadArchivedStatus(na, oa);\n            }\n        ;\n        },\n        markThreadSpam: function(na) {\n            this._serverRequests.markThreadSpam(na);\n        },\n        unmarkThreadSpam: function(na) {\n            this._serverRequests.unmarkThreadSpam(na);\n        },\n        updateThreadMuteSetting: function(na, oa) {\n            this._serverRequests.changeMutingOnThread(na, oa);\n        },\n        changeFolder: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if ((pa && (pa.folder != oa))) {\n                pa.folder = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadFolder(na, oa);\n            }\n        ;\n        },\n        deleteThread: function(na) {\n            m.isThreadID(na);\n            this._serverRequests.deleteThread(na);\n        },\n        updateThreads: function(na) {\n            if ((!na || !na.length)) {\n                return\n            };\n            var oa = {\n            };\n            na.forEach(function(pa) {\n                oa[pa.thread_id] = pa;\n            });\n            this._threads.addResourcesAndExecute(oa);\n        },\n        updateMetadataByActions: function(na, oa) {\n            if ((!na || !na.length)) {\n                return\n            };\n            var pa = {\n            }, qa = {\n            }, ra = {\n            };\n            for (var sa = 0; (sa < na.length); sa++) {\n                var ta = na[sa];\n                if (ta.is_forward) {\n                    continue;\n                };\n                var ua = ta.action_type, va = ta.thread_id;\n                m.isThreadID(va);\n                var wa = this.getThreadMetaNow(va);\n                if (((ua == l.LOG_MESSAGE) && (ta.log_message_type == q.SERVER_ERROR))) {\n                    continue;\n                };\n                if (((!wa && !ta.action_id) && (ua == l.USER_GENERATED_MESSAGE))) {\n                    wa = ja(this, ta);\n                    this._threads.setResource(va, wa);\n                }\n            ;\n                if (wa) {\n                    if ((ua == l.DELETE_THREAD)) {\n                        wa.message_count = 0;\n                        this._threadInformer.deletedThread(va);\n                        continue;\n                    }\n                ;\n                    var xa = !!ta.action_id;\n                    if (((ua == l.LOG_MESSAGE) || (ua == l.USER_GENERATED_MESSAGE))) {\n                        xa = !oa;\n                    };\n                    if (((wa.server_timestamp && (ta.timestamp <= wa.server_timestamp)) && xa)) {\n                        continue;\n                    };\n                    if (!ra[va]) {\n                        ra[va] = x({\n                        }, wa);\n                    };\n                    ia(this, ra[va], ta, oa);\n                    if ((ua == l.USER_GENERATED_MESSAGE)) {\n                        pa[va] = ta;\n                    };\n                    if ((((ua == l.USER_GENERATED_MESSAGE) || (ua == l.LOG_MESSAGE)) || (ua == l.SEND_MESSAGE))) {\n                        if (((ta && ta.timestamp) && ((!qa[va] || (ta.timestamp > qa[va].timestamp))))) {\n                            qa[va] = ta;\n                        }\n                    };\n                }\n            ;\n            };\n            for (var ya in ra) {\n                var za = ra[ya], ab = pa[ya];\n                if (ab) {\n                    ea(za, ab);\n                };\n                var bb = qa[ya], cb = za.timestamp;\n                if (bb) {\n                    if ((bb.timestamp > cb)) {\n                        za = x(za, {\n                            timestamp_absolute: bb.timestamp_absolute,\n                            timestamp_relative: bb.timestamp_relative,\n                            timestamp: bb.timestamp\n                        });\n                    };\n                    var db = za.server_timestamp;\n                    if ((!oa && (bb.timestamp > db))) {\n                        za.server_timestamp = bb.timestamp;\n                    };\n                }\n            ;\n                this._threads.setResource(ya, za);\n            };\n        },\n        getCanonicalThreadToUser: function(na, oa, pa) {\n            return this.getCanonicalThreadToParticipant((\"fbid:\" + na), oa, pa);\n        },\n        getCanonicalThreadToParticipant: function(na, oa, pa) {\n            var qa = this.getThreadIDForParticipant(na), ra = this._threads.getResource(qa);\n            if ((typeof ra == \"undefined\")) {\n                ra = this.createNewLocalThread(qa, [u.getIDForUser(this._fbid),na,], oa);\n                this._serverRequests.fetchThreadData([qa,], pa);\n            }\n        ;\n            return ra;\n        },\n        getThreadIdForUser: function(na) {\n            return (\"user:\" + na);\n        },\n        getThreadIDForParticipant: function(na) {\n            var oa = p.tokenize(na);\n            return this.getThreadIdForUser(oa.value);\n        },\n        createNewLocalThread: function(na, oa, pa) {\n            var qa = this._threads.getResource(na);\n            if (!qa) {\n                var ra = this._serverRequests.tokenizeThreadID(na);\n                qa = {\n                    thread_id: na,\n                    last_action_id: null,\n                    participants: oa,\n                    name: null,\n                    snippet: \"\",\n                    snippet_has_attachment: false,\n                    snippet_sender: null,\n                    unread_count: (pa ? pa : 0),\n                    message_count: 0,\n                    image_src: null,\n                    timestamp_absolute: null,\n                    timestamp_relative: null,\n                    timestamp: null,\n                    canonical_fbid: ((ra.type === \"user\") ? ra.value : null),\n                    is_canonical_user: (ra.type == \"user\"),\n                    is_canonical: la(this, oa),\n                    is_subscribed: true,\n                    root_message_threading_id: null,\n                    folder: t.INBOX,\n                    is_archived: false,\n                    mode: s.TITAN_ORIGINATED\n                };\n                this._threads.setResource(na, qa);\n            }\n        ;\n            return qa;\n        },\n        addParticipantsToThreadLocally: function(na, oa) {\n            var pa = this._threads.getResource(na);\n            if (pa) {\n                ba(this, pa, oa);\n                this._threadInformer.updatedThread(pa.thread_id);\n            }\n        ;\n        },\n        getCanonicalUserInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((oa.type == \"user\") ? oa.value : null);\n        },\n        getCanonicalGroupInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((oa.type == \"group\") ? oa.value : null);\n        },\n        isEmptyLocalThread: function(na) {\n            var oa = this._threads.getResource(na);\n            if (!oa) {\n                return false\n            };\n            var pa = this._serverRequests.tokenizeThreadID(na);\n            return ((pa.type == \"root\") && !oa.timestamp);\n        },\n        isNewEmptyLocalThread: function(na) {\n            if (!this.isEmptyLocalThread(na)) {\n                return false\n            };\n            var oa = this._threads.getResource(na);\n            return (oa.participants && (oa.participants.length === 0));\n        },\n        canReply: function(na) {\n            var oa = this._threads.getResource(na);\n            return (((oa && oa.is_subscribed) && (oa.mode != s.OBJECT_ORIGINATED)) && ((oa.recipients_loadable || (oa.recipients_loadable === undefined))));\n        }\n    });\n    x(ka, r);\n    function la(na, oa) {\n        var pa = oa.filter(function(qa) {\n            return (qa != u.getIDForUser(na._fbid));\n        });\n        return (pa.length <= 1);\n    };\n    function ma(na) {\n        na._serverRequests.subscribe(\"update-threads\", function(oa, pa) {\n            var qa = ((pa.actions || [])).filter(function(ua) {\n                return ua.thread_id;\n            });\n            na.updateThreads(pa.threads);\n            na.updateMetadataByActions(qa, pa.from_client);\n            ((pa.threads || [])).forEach(function(ua) {\n                na._threadInformer.updatedThread(ua.thread_id);\n            });\n            var ra = (pa.global_actions || []);\n            for (var sa = 0; (sa < ra.length); sa++) {\n                var ta = ra[sa];\n                if ((ta.action_type == o.MARK_ALL_READ)) {\n                    ga(na, ta.folder);\n                };\n            };\n        });\n    };\n    g.subscribe(j.DUMP_EVENT, function(na, oa) {\n        oa.messaging = (oa.messaging || {\n        });\n        oa.messaging.threads = {\n        };\n        var pa = ka._getInstances();\n        for (var qa in pa) {\n            oa.messaging.threads[qa] = pa[qa]._threads.dumpResources();;\n        };\n    });\n    e.exports = ka;\n});\n__d(\"formatDate\", [\"DateFormatConfig\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DateFormatConfig\"), h = b(\"tx\"), i = [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",], j = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",], k = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",], l = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function m(o, p) {\n        p = (p || 2);\n        o = (\"\" + o);\n        while ((o.length < p)) {\n            o = (\"0\" + o);;\n        };\n        return o;\n    };\n    function n(o, p, q, r) {\n        if (!p) {\n            return \"\"\n        };\n        var s = [], t = null, u = null, v = (q ? \"getUTC\" : \"get\"), w = o[(v + \"Date\")](), x = o[(v + \"Day\")](), y = o[(v + \"Month\")](), z = o[(v + \"FullYear\")](), aa = o[(v + \"Hours\")](), ba = o[(v + \"Minutes\")](), ca = o[(v + \"Seconds\")](), da = o[(v + \"Milliseconds\")]();\n        for (var ea = 0; (ea < p.length); ea++) {\n            u = p.charAt(ea);\n            if ((u == \"\\\\\")) {\n                ea++;\n                s.push(p.charAt(ea));\n                continue;\n            }\n        ;\n            switch (u) {\n              case \"d\":\n                t = m(w);\n                break;\n              case \"D\":\n                t = i[x];\n                break;\n              case \"j\":\n                t = w;\n                break;\n              case \"l\":\n                t = j[x];\n                break;\n              case \"F\":\n            \n              case \"f\":\n                t = l[y];\n                break;\n              case \"m\":\n                t = m((y + 1));\n                break;\n              case \"M\":\n                t = k[y];\n                break;\n              case \"n\":\n                t = (y + 1);\n                break;\n              case \"Y\":\n                t = z;\n                break;\n              case \"y\":\n                t = ((\"\" + z)).slice(2);\n                break;\n              case \"a\":\n                t = ((aa < 12) ? \"am\" : \"pm\");\n                break;\n              case \"A\":\n                t = ((aa < 12) ? \"AM\" : \"PM\");\n                break;\n              case \"g\":\n                t = ((((aa == 0) || (aa == 12))) ? 12 : (aa % 12));\n                break;\n              case \"G\":\n                t = aa;\n                break;\n              case \"h\":\n                t = ((((aa == 0) || (aa == 12))) ? 12 : m((aa % 12)));\n                break;\n              case \"H\":\n                t = m(aa);\n                break;\n              case \"i\":\n                t = m(ba);\n                break;\n              case \"s\":\n                t = m(ca);\n                break;\n              case \"S\":\n                if (r) {\n                    t = g.ordinalSuffixes[w];\n                }\n                 else t = m(da, 3);\n            ;\n                break;\n              default:\n                t = u;\n            };\n            s.push(t);\n        };\n        return s.join(\"\");\n    };\n    e.exports = n;\n});\n__d(\"MercuryMessages\", [\"Arbiter\",\"AsyncRequest\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAssert\",\"MercuryAttachmentType\",\"MercuryConfig\",\"MercuryGenericConstants\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageSourceTags\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercurySourceType\",\"MercuryTimePassed\",\"MercuryMessageIDs\",\"MercuryParticipants\",\"PresenceUtil\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"debounce\",\"formatDate\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryActionStatus\"), n = b(\"MercuryAssert\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryConfig\"), q = b(\"MercuryGenericConstants\"), r = b(\"MercuryIDs\"), s = b(\"MercuryLogMessageType\"), t = b(\"MercuryMessageSourceTags\"), u = b(\"MercuryPayloadSource\"), v = b(\"MercurySingletonMixin\"), w = b(\"MercurySourceType\"), x = b(\"MercuryTimePassed\"), y = b(\"MercuryMessageIDs\"), z = b(\"MercuryParticipants\"), aa = b(\"PresenceUtil\"), ba = b(\"RangedCallbackManager\"), ca = b(\"MercuryServerRequests\"), da = b(\"MercuryThreadInformer\"), ea = b(\"MercuryThreads\"), fa = b(\"copyProperties\"), ga = b(\"debounce\"), ha = b(\"formatDate\"), ia = b(\"randomInt\"), ja = b(\"tx\");\n    function ka(bb, cb) {\n        var db = cb;\n        if (bb._localIdsMap[cb]) {\n            db = bb._localIdsMap[cb];\n        };\n        return bb._messages[db];\n    };\n    var la = new k();\n    function ma(bb, cb) {\n        if ((cb.status === undefined)) {\n            cb.status = m.UNSENT;\n        };\n        cb.timestamp_absolute = \"Today\";\n        cb.message_id = (cb.message_id || bb.generateNewClientMessageID(cb.timestamp));\n        var db = z.getIDForUser(bb._fbid);\n        cb.specific_to_list = (cb.specific_to_list || []);\n        if ((cb.specific_to_list.length && (cb.specific_to_list.indexOf(db) === -1))) {\n            cb.specific_to_list.push(db);\n        };\n        if (!cb.thread_id) {\n            if ((cb.specific_to_list.length == 1)) {\n                cb.thread_id = (\"user:\" + bb._fbid);\n            }\n             else if ((cb.specific_to_list.length == 2)) {\n                var eb = ((cb.specific_to_list[0] == db) ? cb.specific_to_list[1] : cb.specific_to_list[0]);\n                if ((r.tokenize(eb).type == \"email\")) {\n                    cb.thread_id = q.PENDING_THREAD_ID;\n                }\n                 else cb.thread_id = bb._threads.getThreadIDForParticipant(eb);\n            ;\n            }\n            \n        ;\n            cb.thread_id = (cb.thread_id || (\"root:\" + cb.message_id));\n        }\n    ;\n        if (!cb.specific_to_list.length) {\n            var fb = bb._serverRequests.tokenizeThreadID(cb.thread_id);\n            if ((fb.type == \"user\")) {\n                cb.specific_to_list = [(\"fbid:\" + fb.value),db,];\n            };\n        }\n    ;\n    };\n    function na(bb, cb, db, eb) {\n        var fb = (xa(db) ? [t.CHAT,] : []), gb = Date.now(), hb = ha(new Date(gb), (p[\"24h_times\"] ? \"H:i\" : \"g:ia\")), ib = {\n            action_type: cb,\n            thread_id: eb,\n            author: z.getIDForUser(bb._fbid),\n            author_email: null,\n            coordinates: null,\n            timestamp: gb,\n            timestamp_absolute: (new Date(gb)).toLocaleDateString(),\n            timestamp_relative: hb,\n            timestamp_time_passed: x.TODAY,\n            is_unread: false,\n            is_cleared: false,\n            is_forward: false,\n            is_filtered_content: false,\n            spoof_warning: false,\n            source: db,\n            source_tags: fb\n        };\n        return ib;\n    };\n    function oa(bb) {\n        switch (bb) {\n          case u.UNKNOWN:\n        \n          case u.SERVER_INITIAL_DATA:\n        \n          case u.SERVER_FETCH_THREAD_INFO:\n        \n          case u.SERVER_THREAD_SYNC:\n            return true;\n        };\n        return false;\n    };\n    function pa(bb) {\n        return (bb && (bb.substr(0, 6) === \"server\"));\n    };\n    function qa(bb, cb) {\n        if (!bb._threadsToMessages[cb]) {\n            bb._threadsToMessages[cb] = new ba(function(db) {\n                return ka(bb, db).timestamp;\n            }, function(db, eb) {\n                return (eb - db);\n            });\n        };\n        return bb._threadsToMessages[cb];\n    };\n    g.subscribe(j.DUMP_EVENT, function(bb, cb) {\n        var db = {\n        }, eb = {\n        }, fb = sa._getInstances();\n        for (var gb in fb) {\n            db[gb] = {\n            };\n            for (var hb in fb[gb]._messages) {\n                var ib = fb[gb]._messages[hb];\n                if ((Object.keys(ib).length === 0)) {\n                    continue;\n                };\n                var jb = ib.thread_id;\n                db[gb][jb] = (db[gb][jb] || {\n                });\n                db[gb][jb][ib.message_id] = {\n                    action_type: ib.action_type,\n                    author: ib.author,\n                    is_unread: ib.is_unread,\n                    timestamp: ib.timestamp\n                };\n            };\n            eb[gb] = fa({\n            }, fb[gb]._localIdsMap);\n        };\n        cb.messaging = (cb.messaging || {\n        });\n        cb.messaging.local_message_ids = eb;\n        cb.messaging.messages = db;\n    });\n    function ra(bb, cb, db) {\n        cb.forEach(function(eb) {\n            var fb = qa(bb, eb);\n            fb.setReachedEndOfArray();\n            bb._threadInformer.reorderedMessages(eb, db);\n        });\n    };\n    function sa(bb) {\n        this._fbid = bb;\n        this._serverRequests = ca.getForFBID(this._fbid);\n        this._threadInformer = da.getForFBID(this._fbid);\n        this._threads = ea.getForFBID(this._fbid);\n        this._failedHistoryFetchThreads = {\n        };\n        this._threadsToMessages = {\n        };\n        this._titanMessagesCount = {\n        };\n        this._localTitanMessagesCount = {\n        };\n        this._messages = {\n        };\n        this._attachmentData = {\n        };\n        this._messagesNeedingAttachmentData = {\n        };\n        this._localIdsMap = {\n        };\n        this._serverRequests.subscribe(\"update-messages\", function(cb, db) {\n            var eb = ((db.actions || [])).filter(function(gb) {\n                var hb = gb.action_type;\n                return (((gb.is_forward || gb.thread_id)) && (((((((hb == l.LOG_MESSAGE) || (hb == l.USER_GENERATED_MESSAGE)) || (hb == l.SEND_MESSAGE)) || (hb == l.CLEAR_CHAT)) || (hb == l.DELETE_THREAD)) || (hb == l.DELETE_MESSAGES))));\n            }), fb = oa(db.payload_source);\n            if (pa(db.payload_source)) {\n                eb.forEach(function(gb) {\n                    if (!gb.is_forward) {\n                        var hb = this._threads.getThreadMetaNow(gb.thread_id);\n                        if (hb) {\n                            gb.is_cleared = (gb.timestamp < hb.chat_clear_time);\n                        };\n                    }\n                ;\n                }.bind(this));\n            };\n            this.handleUpdates(eb, fb, db.payload_source, db.from_client);\n            if (db.end_of_history) {\n                ra(this, db.end_of_history, db.payload_source);\n            };\n        }.bind(this));\n    };\n    fa(sa.prototype, {\n        getMessagesFromIDs: function(bb) {\n            return ((bb || [])).map(ka.curry(this)).filter(function(cb) {\n                return cb;\n            });\n        },\n        hasLoadedNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return (db.hasReachedEndOfArray() || (db.getCurrentArraySize() >= cb));\n        },\n        hasLoadedExactlyNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return (db.getCurrentArraySize() == cb);\n        },\n        getThreadMessagesRange: function(bb, cb, db, eb, fb, gb) {\n            var hb = qa(this, bb), ib = function(ob) {\n                eb(ta(this, ob));\n            }.bind(this), jb = hb.executeOrEnqueue(cb, db, ib), kb = hb.getUnavailableResources(jb), lb = this._failedHistoryFetchThreads[bb];\n            if ((kb.length && !lb)) {\n                var mb = (((this._titanMessagesCount[bb] || 0)) - ((this._localTitanMessagesCount[bb] || 0))), nb = (kb.length + ((this._localTitanMessagesCount[bb] || 0)));\n                this._serverRequests.fetchThreadMessages(bb, mb, nb, fb, gb);\n            }\n             else this._failedHistoryFetchThreads[bb] = false;\n        ;\n            return jb;\n        },\n        getThreadMessagesSinceTimestamp: function(bb, cb) {\n            var db = qa(this, bb), eb = db.getElementsUntil(cb);\n            return ta(this, eb);\n        },\n        hasLoadedAllMessages: function(bb) {\n            return qa(this, bb).hasReachedEndOfArray();\n        },\n        getCurrentlyLoadedMessages: function(bb) {\n            var cb = qa(this, bb).getAllResources();\n            return ta(this, cb);\n        },\n        unsubscribe: function(bb, cb) {\n            n.isThreadID(cb);\n            var db = qa(this, cb);\n            db.unsubscribe(bb);\n        },\n        addAttachmentData: function(bb, cb, db) {\n            var eb = ka(this, bb);\n            if (eb) {\n                var fb = eb.attachments.indexOf(cb);\n                if ((fb != -1)) {\n                    eb.attachments[fb] = db;\n                    this._threadInformer.updatedMessage(eb.thread_id, eb.message_id, \"attach\");\n                }\n            ;\n            }\n             else {\n                if (!this._attachmentData[bb]) {\n                    this._attachmentData[bb] = [];\n                };\n                this._attachmentData[bb].push({\n                    attach_key: cb,\n                    data: db\n                });\n            }\n        ;\n        },\n        handleUpdates: function(bb, cb, db, eb) {\n            var fb, gb = {\n            }, hb = {\n            };\n            for (var ib = 0; (ib < bb.length); ib++) {\n                var jb = bb[ib];\n                if ((jb.is_forward || (db == u.SERVER_SEARCH))) {\n                    if (!this._messages[jb.message_id]) {\n                        this._messages[jb.message_id] = jb;\n                        ya(this, jb);\n                    }\n                ;\n                    continue;\n                }\n            ;\n                var kb = jb.action_type;\n                if ((kb == l.SEND_MESSAGE)) {\n                    var lb = jb.client_message_id;\n                    if (((lb && this._localIdsMap[lb]) && jb.status)) {\n                        if ((jb.status == m.UNCONFIRMED)) {\n                            if (!hb[jb.thread_id]) {\n                                hb[jb.thread_id] = [];\n                            };\n                            hb[jb.thread_id].push(jb.client_message_id);\n                        }\n                         else if (!gb[jb.thread_id]) {\n                            gb[jb.thread_id] = [];\n                        }\n                    ;\n                        var mb = ka(this, jb.client_message_id), nb = mb.status;\n                        mb.status = jb.status;\n                        if (((jb.status === m.SUCCESS) || jb.error_data)) {\n                            mb.error_data = jb.error_data;\n                        };\n                        if ((jb.status == m.SUCCESS)) {\n                            this.updateLocalMessage(jb, db);\n                            if ((jb.client_thread_id == q.PENDING_THREAD_ID)) {\n                                mb.thread_id = jb.thread_id;\n                                gb[jb.thread_id].push(mb.message_id);\n                                la.setResource(mb.message_id, mb.thread_id);\n                            }\n                        ;\n                        }\n                    ;\n                        if ((((((typeof nb != \"undefined\") || (jb.status == m.FAILED_UNKNOWN_REASON)) || (jb.status == m.UNABLE_TO_CONFIRM)) || (jb.status == m.SUCCESS)) || (jb.status == m.ERROR))) {\n                            this._threadInformer.updatedMessage(jb.thread_id, ka(this, jb.client_message_id).message_id, db);\n                        };\n                    }\n                ;\n                    continue;\n                }\n                 else if ((kb == l.DELETE_THREAD)) {\n                    qa(this, jb.thread_id).removeAllResources();\n                    continue;\n                }\n                 else if ((kb == l.DELETE_MESSAGES)) {\n                    var ob = jb.message_ids.map(function(wb) {\n                        return ka(this, wb).message_id;\n                    }.bind(this));\n                    fb = qa(this, jb.thread_id);\n                    fb.removeResources(ob);\n                    this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    continue;\n                }\n                 else if ((kb == l.LOG_MESSAGE)) {\n                    if ((jb.log_message_type == s.SERVER_ERROR)) {\n                        this._failedHistoryFetchThreads[jb.thread_id] = true;\n                    };\n                }\n                 else if ((kb == l.CLEAR_CHAT)) {\n                    var pb = qa(this, jb.thread_id).getAllResources();\n                    pb.map(ka.curry(this)).forEach(function(wb) {\n                        wb.is_cleared = true;\n                    });\n                    continue;\n                }\n                \n                \n                \n                \n            ;\n                if ((jb.threading_id && this._localIdsMap[jb.threading_id])) {\n                    var qb = ka(this, jb.threading_id);\n                    if ((qb && qb.is_zap)) {\n                        fb = qa(this, jb.thread_id);\n                        fb.removeResources([qb.message_id,]);\n                        this._localIdsMap[jb.threading_id] = null;\n                        this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    }\n                ;\n                }\n            ;\n                var rb = ka(this, jb.message_id);\n                if ((((jb.threading_id && this._localIdsMap[jb.threading_id])) || ((rb && !rb.is_forward)))) {\n                    continue;\n                };\n                if (!gb[jb.thread_id]) {\n                    gb[jb.thread_id] = [];\n                };\n                gb[jb.thread_id].push(jb.message_id);\n                this._messages[jb.message_id] = jb;\n                ya(this, jb);\n                if ((jb.threading_id && (jb.threading_id != jb.message_id))) {\n                    y.addServerID(jb.threading_id, jb.message_id);\n                };\n                if (!cb) {\n                    this._threadInformer.receivedMessage(jb);\n                };\n            };\n            for (var sb in gb) {\n                fb = qa(this, sb);\n                var tb = fb.getAllResources(), ub = tb.filter(function(wb) {\n                    var xb = this._messages[wb];\n                    return ((xb.action_type == l.LOG_MESSAGE) && (xb.log_message_type == s.SERVER_ERROR));\n                }.bind(this));\n                fb.removeResources(ub);\n                ua(this, sb, gb[sb]);\n                if (eb) {\n                    va(this, sb, gb[sb]);\n                };\n                if (cb) {\n                    fb.addResources(gb[sb]);\n                    this._threadInformer.reorderedMessages(sb, db);\n                }\n                 else fb.addResourcesWithoutSorting(gb[sb].reverse(), 0);\n            ;\n                this._threadInformer.updatedThread(sb);\n            };\n            var vb = Object.keys(hb);\n            if (vb.length) {\n                this._serverRequests.requestMessageConfirmation(hb);\n            };\n        },\n        sendMessage: function(bb, cb, db) {\n            cb = (cb || Function.prototype);\n            ma(this, bb);\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            if ((bb.thread_id == (\"root:\" + bb.message_id))) {\n                qa(this, bb.thread_id).setReachedEndOfArray();\n            };\n            this._serverRequests.sendNewMessage(bb, db);\n            if ((bb.thread_id == q.PENDING_THREAD_ID)) {\n                this._messages[bb.message_id] = bb;\n                return la.executeOrEnqueue(bb.message_id, cb);\n            }\n             else cb(bb.thread_id);\n        ;\n        },\n        zapMessage: function(bb, cb, db) {\n            if ((bb.thread_id == q.PENDING_THREAD_ID)) {\n                return\n            };\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            this._serverRequests.handleUpdate({\n                actions: [fa({\n                }, bb),],\n                from_client: true,\n                payload_source: u.SERVER_ZAP\n            });\n        },\n        isFirstMessage: function(bb) {\n            var cb = qa(this, bb.thread_id);\n            if ((cb.getCurrentArraySize() === 0)) {\n                return false\n            };\n            var db = cb.getResourceAtIndex((cb.getCurrentArraySize() - 1)), eb = ka(this, db).message_id, fb = ka(this, bb.message_id).message_id;\n            return (cb.hasReachedEndOfArray() && (eb == fb));\n        },\n        unsubscribeSend: function(bb) {\n            la.unsubscribe(bb);\n        },\n        resendMessage: function(bb, cb) {\n            var db = fa({\n            }, bb);\n            db.status = m.RESENDING;\n            db.timestamp = Date.now();\n            db.message_id = bb.message_id;\n            this._messages[bb.message_id] = db;\n            var eb = qa(this, bb.thread_id);\n            eb.resortResources([bb.message_id,]);\n            this.sendMessage(db, null, cb);\n            this._threadInformer.reorderedMessages(bb.thread_id, u.CLIENT_SEND_MESSAGE);\n        },\n        deleteMessages: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((db.getCurrentArraySize() == cb.length) && db.hasReachedEndOfArray());\n                this._serverRequests.deleteMessages(bb, cb, eb);\n            }\n        ;\n        },\n        markMessagesSpam: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((db.getCurrentArraySize() == cb.length) && db.hasReachedEndOfArray());\n                if (eb) {\n                    this._serverRequests.markThreadSpam(bb);\n                }\n                 else this._serverRequests.markMessagesSpam(bb, cb);\n            ;\n            }\n        ;\n        },\n        updateLocalMessage: function(bb, cb) {\n            var db = bb.message_id, eb = bb.client_message_id;\n            this._localIdsMap[eb] = db;\n            this._messages[db] = this._messages[eb];\n            y.addServerID(eb, db);\n            this._messages[eb] = {\n            };\n            var fb = ka(this, eb);\n            if (bb.timestamp) {\n                fb.timestamp = bb.timestamp;\n            };\n            if ((bb.attachments && bb.attachments.length)) {\n                fb.raw_attachments = null;\n                fb.attachments = bb.attachments;\n                ya(this, fb, db);\n            }\n        ;\n            if (bb.log_message_data) {\n                fb.log_message_data = bb.log_message_data;\n            };\n            if (wa(fb)) {\n                this._localTitanMessagesCount[fb.thread_id]--;\n            };\n        },\n        constructUserGeneratedMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.USER_GENERATED_MESSAGE, cb, db);\n            fb.body = bb;\n            fb.has_attachment = false;\n            fb.html_body = false;\n            fb.attachments = [];\n            fb.specific_to_list = (eb || []);\n            return fb;\n        },\n        constructLogMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.LOG_MESSAGE, bb, cb);\n            fb.log_message_type = db;\n            fb.log_message_data = eb;\n            return fb;\n        },\n        generateNewClientMessageID: function(bb) {\n            var cb = ((((bb + \":\") + ((ia(0, 4294967295) + 1))) + \"-\") + aa.getSessionID());\n            return ((\"\\u003C\" + cb) + \"@mail.projektitan.com\\u003E\");\n        },\n        getNumberLocalMessages: function(bb) {\n            return (this._localTitanMessagesCount[bb] || 0);\n        }\n    });\n    fa(sa, v, {\n        addAttachmentData: function(bb, cb, db, eb) {\n            eb = (eb || i.user);\n            sa.getForFBID(eb).addAttachmentData(bb, cb, db);\n        }\n    });\n    function ta(bb, cb) {\n        var db = cb.map(ka.curry(bb));\n        return db.reverse();\n    };\n    function ua(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._titanMessagesCount[cb]) {\n            bb._titanMessagesCount[cb] = 0;\n        };\n        bb._titanMessagesCount[cb] += eb.length;\n    };\n    function va(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._localTitanMessagesCount[cb]) {\n            bb._localTitanMessagesCount[cb] = 0;\n        };\n        bb._localTitanMessagesCount[cb] += eb.length;\n    };\n    function wa(bb) {\n        var cb = bb.action_type;\n        if ((cb == l.USER_GENERATED_MESSAGE)) {\n            return !bb.is_zap\n        };\n        switch (bb.log_message_type) {\n          case s.SUBSCRIBE:\n        \n          case s.UNSUBSCRIBE:\n        \n          case s.SERVER_ERROR:\n        \n          case s.LIVE_LISTEN:\n            return false;\n          default:\n            return true;\n        };\n    };\n    function xa(bb) {\n        switch (bb) {\n          case w.CHAT_WEB:\n        \n          case w.CHAT_JABBER:\n        \n          case w.CHAT_IPHONE:\n        \n          case w.CHAT_MEEBO:\n        \n          case w.CHAT_ORCA:\n        \n          case w.CHAT_TEST:\n        \n          case w.CHAT:\n        \n          case w.DESKTOP:\n            return true;\n          default:\n            return false;\n        };\n    };\n    function ya(bb, cb, db) {\n        db = (db || cb.message_id);\n        var eb = bb._attachmentData[db];\n        if (eb) {\n            eb.forEach(function(fb) {\n                var gb = cb.attachments.indexOf(fb.attach_key);\n                if ((gb !== -1)) {\n                    cb.attachments[gb] = fb.data;\n                };\n            });\n            delete bb._attachmentData[db];\n        }\n         else if ((!cb.is_forward && za(bb, cb))) {\n            bb._messagesNeedingAttachmentData[db] = true;\n            ab(bb);\n        }\n        \n    ;\n    };\n    function za(bb, cb) {\n        if ((!cb || !cb.attachments)) {\n            return false\n        };\n        for (var db = 0; (db < cb.attachments.length); db++) {\n            var eb = cb.attachments[db];\n            if (((typeof eb === \"string\") && (eb.indexOf(o.SHARE) === 0))) {\n                return true\n            };\n        };\n        var fb = (cb.forward_message_ids || []);\n        for (db = 0; (db < fb.length); db++) {\n            var gb = ka(bb, fb[db]);\n            if (za(bb, gb)) {\n                return true\n            };\n        };\n        return false;\n    };\n    var ab = ga(function(bb) {\n        var cb = {\n        };\n        for (var db in bb._messagesNeedingAttachmentData) {\n            var eb = ka(bb, db);\n            if (za(bb, eb)) {\n                cb[db] = true;\n            };\n        };\n        var fb = Object.keys(cb);\n        if (fb.length) {\n            new h(\"/ajax/mercury/attachments/fetch_shares.php\").setData({\n                message_ids: fb\n            }).setAllowCrossPageTransition(true).send();\n        };\n        bb._messagesNeedingAttachmentData = {\n        };\n    }, 0, this, true);\n    e.exports = sa;\n});\n__d(\"ChatOpenTab\", [\"Arbiter\",\"Banzai\",\"Bootloader\",\"ChatVisibility\",\"Event\",\"MercuryIDs\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"Bootloader\"), j = b(\"ChatVisibility\"), k = b(\"Event\"), l = b(\"MercuryIDs\"), m = b(\"MercuryMessages\").get(), n = b(\"MercuryServerRequests\").get(), o = b(\"MercuryThreads\").get(), p = \"messaging_tracking\";\n    function q(u) {\n        o.getThreadMeta(u, function() {\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        });\n    };\n    function r(u, v, w, x) {\n        k.listen(u, \"click\", function(y) {\n            if (x(v, w)) {\n                return\n            };\n            return y.kill();\n        });\n    };\n    function s(u, v, w) {\n        var x = {\n            referrer: (u || \"\"),\n            message_thread_id: v,\n            message_view: \"chat\",\n            timestamp_send: Date.now()\n        };\n        if ((w !== undefined)) {\n            x.message_target_ids = [w,];\n        };\n        h.post(p, x, {\n            delay: 0,\n            retry: true\n        });\n    };\n    var t = {\n        openEmptyTab: function(u, v) {\n            if ((!window.Chat || !j.isOnline())) {\n                return true\n            };\n            i.loadModules([\"ChatTabModel\",], function(w) {\n                var x = w.getEmptyTab();\n                if (!x) {\n                    x = (\"root:\" + m.generateNewClientMessageID(Date.now()));\n                    o.createNewLocalThread(x, []);\n                }\n            ;\n                q(x);\n                s(v, x);\n            });\n        },\n        listenOpenEmptyTab: function(u, v) {\n            r(u, null, v, t.openEmptyTab);\n        },\n        openThread: function(u, v) {\n            if (l.isValid(u)) {\n                q(u);\n            }\n             else n.getClientThreadID(u, q);\n        ;\n            s(v, u);\n        },\n        listenOpenThread: function(u, v, w) {\n            r(u, v, w, t.openThread);\n        },\n        openUserTab: function(u, v) {\n            var w = o.getCanonicalThreadToUser(u);\n            q(w.thread_id);\n            s(v, w.thread_id, u);\n        },\n        listenOpenUserTab: function(u, v, w) {\n            r(u, v, w, t.openUserTab);\n        }\n    };\n    e.exports = t;\n});\n__d(\"SplitImage.react\", [\"React\",\"Image.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"Image.react\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"SplitImage\",\n        render: function() {\n            var k = this.props.size;\n            return this.transferPropsTo(g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__root\",\n                style: {\n                    width: k,\n                    height: k\n                }\n            }, this.renderImages()));\n        },\n        renderImages: function() {\n            if (!this.props.srcs) {\n                return null\n            };\n            if (!((this.props.srcs instanceof Array))) {\n                return (h({\n                    src: this.props.srcs,\n                    height: this.props.size,\n                    width: this.props.size\n                }))\n            };\n            switch (this.props.srcs.length) {\n              case 1:\n                return (h({\n                    src: this.props.srcs[0],\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n              case 2:\n                return this.renderTwo();\n              default:\n                return this.renderThree();\n            };\n        },\n        renderTwo: function() {\n            var k = Math.floor((this.props.size / 2)), l = -Math.floor((k / 2)), m = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? (\" \" + \"-cx-PRIVATE-splitImage__borderleft\") : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: m,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            }))));\n        },\n        renderThree: function() {\n            var k = Math.floor(((this.props.size / 3) * 2)), l = -Math.floor((((this.props.size - k)) / 2)), m = Math.floor((this.props.size / 2)), n = (this.props.size - k), o = -Math.floor((((m - n)) / 2)), p = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? (\" \" + \"-cx-PRIVATE-splitImage__borderright\") : \"\")))), q = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? (\" \" + \"-cx-PRIVATE-splitImage__borderbottom\") : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: p,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: q,\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            })), g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[2],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            }))));\n        }\n    });\n    e.exports = j;\n});\n__d(\"TypeaheadFacepile\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\");\n    function h() {\n    \n    };\n    h.render = function(i) {\n        var j = [g.create(\"span\", {\n            className: \"splitpic leftpic\"\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[0]\n        }),]),g.create(\"span\", {\n            className: (\"splitpic\" + ((i[2] ? \" toppic\" : \"\")))\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[1]\n        }),]),];\n        if (i[2]) {\n            j.push(g.create(\"span\", {\n                className: \"splitpic bottompic\"\n            }, [g.create(\"img\", {\n                alt: \"\",\n                src: i[2]\n            }),]));\n        };\n        return g.create(\"span\", {\n            className: \"splitpics clearfix\"\n        }, j);\n    };\n    e.exports = h;\n});\n__d(\"ModalMask\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = null, i = 0, j = {\n        show: function() {\n            i++;\n            if (!h) {\n                h = g.create(\"div\", {\n                    id: \"modalMaskOverlay\"\n                });\n                g.appendContent(document.body, h);\n            }\n        ;\n        },\n        hide: function() {\n            if (i) {\n                i--;\n                if ((!i && h)) {\n                    g.remove(h);\n                    h = null;\n                }\n            ;\n            }\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"LitestandMessages\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FILTER_SWITCH_BEGIN: \"LitestandMessages/FilterSwitchBegin\",\n        NEWSFEED_LOAD: \"LitestandMessages/NewsFeedLoad\",\n        LEAVE_HOME: \"LitestandMessages/LeaveHome\",\n        UPDATE_HOME_COUNT: \"LitestandMessages/UpdateHomeCount\",\n        STORIES_INSERTED: \"LitestandMessages/StoriesInserted\",\n        STORIES_REMOVED: \"LitestandMessages/StoriesRemoved\",\n        NEWER_STORIES_INSERTED: \"LitestandMessages/NewerStoriesInserted\",\n        EXPAND_FILTER_SWITCHER: \"LitestandMessages/ExpandFilterSwitcher\",\n        RESTORE_FILTER_SWITCHER: \"LitestandMessages/RestoreFilterSwitcher\",\n        NEW_STORY_BAR_CLICK: \"LitestandMessages/NewStoryBarClick\",\n        COLLAPSE_FILTER_SWITCHER: \"LitestandMessages/CollapseFilterSwitcher\",\n        TOUR_BEGIN: \"LitestandMessages/TourBegin\",\n        TOUR_END: \"LitestandMessages/TourEnd\",\n        TOUR_SIDEBAR_HIGHLIGHT: \"LitestandMessages/TourSidebarHighlight\",\n        TOUR_SIDEBAR_UNHIGHLIGHT: \"LitestandMessages/TourSidebarUnhighlight\",\n        RHC_RELOADED: \"LitestandMessages/RHCReloaded\",\n        UNLOCK_FILTER_SWITCHER: \"LitestandMessage/UnlockFilterSwitcher\"\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerPermalinkConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        ARCHIVED_PATH: \"/messages/archived\",\n        BASE_PATH: \"/messages\",\n        OTHER_PATH: \"/messages/other\",\n        SPAM_PATH: \"/messages/spam\",\n        COMPOSE_POSTFIX_PATH: \"/new\",\n        SEARCH_POSTFIX_PATH: \"/search\",\n        TID_POSTFIX_PARTIAL_PATH: \"/conversation-\",\n        overriddenVanities: \"(archived|other|spam|new|search|conversation-.*)\",\n        getURIPathForThreadID: function(i, j) {\n            return ((((j || h.BASE_PATH)) + h.TID_POSTFIX_PARTIAL_PATH) + g.encodeComponent(g.encodeComponent(i)));\n        },\n        getThreadIDFromURI: function(i) {\n            var j = i.getPath().match((((h.BASE_PATH + \"(/[^/]*)*\") + h.TID_POSTFIX_PARTIAL_PATH) + \"([^/]+)\"));\n            if (j) {\n                var k = g.decodeComponent(g.decodeComponent(j[2]));\n                return k;\n            }\n        ;\n        },\n        getURIPathForIDOrVanity: function(i, j) {\n            if (i.match(((\"^\" + h.overriddenVanities) + \"$\"))) {\n                i = (\".\" + i);\n            };\n            return ((((j || h.BASE_PATH)) + \"/\") + i);\n        },\n        getUserIDOrVanity: function(i) {\n            var j = i.match((h.BASE_PATH + \".*/([^/]+)/?$\")), k = (j && j[1]), l = h.overriddenVanities;\n            if ((!k || k.match(((\"^\" + l) + \"$\")))) {\n                return false;\n            }\n             else if (k.match(((\"^\\\\.\" + l) + \"$\"))) {\n                return k.substr(1);\n            }\n             else return k\n            \n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryEmoji\", [\"MercuryConfig\",\"Emoji\",\"Emote\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"Emoji\"), i = b(\"Emote\"), j = {\n        htmlEmojiAndEmote: function(k, l) {\n            if (g.MessagingDisplayEmojiGK) {\n                return h.htmlEmojiAndEmote(k, l);\n            }\n             else return i.htmlEmote(k, l)\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryErrorInfo\", [\"MercuryErrorType\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryErrorType\"), h = b(\"tx\"), i = {\n        getMessage: function(j) {\n            var k = \"This message failed to send.\";\n            if (i.isConnectionError(j)) {\n                k = \"Unable to connect to Facebook. This message failed to send. \";\n            }\n             else if (j.description) {\n                k = j.description;\n            }\n        ;\n            return k;\n        },\n        isConnectionError: function(j) {\n            if ((j && (j.type == g.TRANSPORT))) {\n                return (((j.code === 1001) || (j.code === 1004)) || (j.code === 1006))\n            };\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"MercuryChannelHandler\", [\"Arbiter\",\"ChannelConstants\",\"Env\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercuryMessages\",\"MercuryPayloadSource\",\"MessagingReliabilityLogger\",\"MessagingEvent\",\"MessagingTag\",\"MercuryParticipants\",\"PresenceUtil\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"Env\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryGlobalActionType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryPayloadSource\"), n = b(\"MessagingReliabilityLogger\"), o = b(\"MessagingEvent\"), p = b(\"MessagingTag\"), q = b(\"MercuryParticipants\"), r = b(\"PresenceUtil\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"copyProperties\");\n    function v(la, ma) {\n        if ((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.message)) {\n            n.addEntry(\"channel_receive\", \"invalid_data\");\n            return;\n        }\n    ;\n        var na = ma.obj.message, oa = {\n            author: na.mercury_author_id,\n            author_email: na.mercury_author_email,\n            body: na.body,\n            subject: na.subject,\n            has_attachment: na.has_attachment,\n            attachments: na.attachments,\n            html_body: na.html_body,\n            thread_id: na.tid,\n            message_id: na.mid,\n            coordinates: na.mercury_coordinates,\n            spoof_warning: na.mercury_spoof_warning,\n            source: na.mercury_source,\n            source_tags: na.mercury_source_tags,\n            threading_id: na.threading_id,\n            timestamp: na.timestamp,\n            timestamp_absolute: na.timestamp_absolute,\n            timestamp_relative: na.timestamp_relative,\n            timestamp_time_passed: na.timestamp_time_passed,\n            action_type: j.USER_GENERATED_MESSAGE,\n            is_unread: na.is_unread,\n            action_id: na.action_id,\n            is_forward: false,\n            forward_count: (na.forward_count || na.forward),\n            forward_message_ids: na.forward_msg_ids,\n            location_text: na.location_text,\n            folder: ma.obj.folder\n        }, pa = [u({\n        }, oa),];\n        pa = pa.concat((na.forward_actions || []));\n        var qa = m.CLIENT_CHANNEL_MESSAGE;\n        s.handleUpdateWaitForThread({\n            actions: pa,\n            payload_source: qa\n        }, na.tid);\n        if ((!na.is_unread && (na.mercury_author_id === q.user))) {\n            var ra = {\n            };\n            ra[na.tid] = ma.obj.folder;\n            w(h.getArbiterType(\"messaging\"), {\n                obj: {\n                    event: o.READ,\n                    tids: [na.tid,],\n                    folder_info: ra,\n                    timestamp: na.timestamp\n                }\n            });\n        }\n    ;\n        n.addEntry(\"channel_receive\", \"success\", [oa.thread_id,oa.message_id,r.getSessionID(),]);\n    };\n    function w(la, ma) {\n        if ((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.tids)) {\n            return\n        };\n        var na = [], oa = (ma.obj.event == o.READ);\n        ma.obj.tids.forEach(function(pa) {\n            na.push({\n                action_type: j.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: pa,\n                mark_as_read: oa,\n                timestamp: (ma.obj.timestamp || 0),\n                folder: ma.obj.folder_info[pa]\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function x(la, ma) {\n        if ((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.tids)) {\n            return\n        };\n        var na = [];\n        ma.obj.tids.forEach(function(oa) {\n            na.push({\n                action_type: j.DELETE_THREAD,\n                action_id: null,\n                thread_id: oa\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function y(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.tids) || !ma.obj.mids)) {\n            return\n        };\n        var na = ma.obj.tids[0], oa = {\n            action_type: j.DELETE_MESSAGES,\n            action_id: null,\n            thread_id: na,\n            message_ids: ma.obj.mids\n        };\n        s.handleUpdate({\n            actions: [oa,],\n            threads: [ma.obj.updated_thread,],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function z(la, ma) {\n        if ((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.folder)) {\n            return\n        };\n        var na = {\n            action_type: k.MARK_ALL_READ,\n            action_id: ma.obj.action_id,\n            folder: ma.obj.folder\n        };\n        s.handleUpdate({\n            global_actions: [na,]\n        });\n    };\n    function aa(la, ma) {\n        if (((la != h.getArbiterType(\"messaging\")) || !ma.obj.tids)) {\n            return\n        };\n        var na = m.CLIENT_CHANNEL_MESSAGE;\n        ma.obj.tids.forEach(function(oa) {\n            var pa = {\n                action_type: j.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: oa,\n                archived: ma.obj.state\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, pa),],\n                payload_source: na\n            }, oa);\n        });\n    };\n    function ba(la, ma) {\n        if (((la != h.getArbiterType(\"messaging\")) || !ma.obj.tids)) {\n            return\n        };\n        var na = m.CLIENT_CHANNEL_MESSAGE, oa;\n        ma.obj.tids.forEach(function(pa) {\n            if ((ma.obj.event == o.TAG)) {\n                oa = ma.obj.tag;\n            }\n             else oa = (ma.obj.marked_as_spam ? p.SPAM : p.INBOX);\n        ;\n            var qa = {\n                action_type: j.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: pa,\n                new_folder: oa\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, qa),],\n                payload_source: na\n            }, pa);\n        });\n    };\n    function ca(la, ma) {\n        if (((la != h.getArbiterType(\"messaging\")) || !ma.obj.tag)) {\n            return\n        };\n        switch (ma.obj.tag) {\n          case p.ACTION_ARCHIVED:\n            aa(la, ma);\n            break;\n          case p.INBOX:\n        \n          case p.OTHER:\n            ba(la, ma);\n            break;\n        };\n    };\n    function da(la, ma) {\n        if ((((la != h.getArbiterType(\"inbox\")) || !ma.obj) || !ma.obj.seen_timestamp)) {\n            return\n        };\n        s.handleUpdate({\n            message_counts: [{\n                seen_timestamp: ma.obj.seen_timestamp,\n                folder: p.INBOX\n            },],\n            unseen_thread_ids: [{\n                thread_ids: [],\n                folder: p.INBOX\n            },],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function ea(la, ma) {\n        if (((la != h.getArbiterType(\"mercury\")) || !ma.obj)) {\n            return\n        };\n        t.synchronizeInforms(function() {\n            var na = ma.obj, oa = [];\n            ((na.actions || [])).forEach(function(pa) {\n                var qa = j.USER_GENERATED_MESSAGE;\n                if ((pa.action_type == j.LOG_MESSAGE)) {\n                    var ra = m.CLIENT_CHANNEL_MESSAGE;\n                    s.handleUpdateWaitForThread({\n                        actions: [u({\n                        }, pa),],\n                        payload_source: ra\n                    }, pa.thread_id);\n                }\n                 else if ((pa.action_type != qa)) {\n                    oa.push(pa);\n                }\n            ;\n            });\n            na.actions = oa;\n            na.payload_source = m.CLIENT_CHANNEL_MESSAGE;\n            s.handleUpdate(na);\n        });\n    };\n    function fa(la, ma) {\n        s.handleRoger(ma.obj);\n    };\n    function ga(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || (ma.obj.mute_settings === undefined)) || !ma.obj.thread_id)) {\n            return\n        };\n        var na = j.CHANGE_MUTE_SETTINGS, oa = [{\n            action_type: na,\n            action_id: null,\n            thread_id: ma.obj.thread_id,\n            mute_settings: ma.obj.mute_settings\n        },];\n        s.handleUpdate({\n            actions: oa,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function ha(la, ma) {\n        switch (ma.obj.event) {\n          case o.DELIVER:\n            v(la, ma);\n            break;\n          case o.READ:\n        \n          case o.UNREAD:\n            w(la, ma);\n            break;\n          case o.READ_ALL:\n            z(la, ma);\n            break;\n          case o.DELETE:\n            x(la, ma);\n            break;\n          case o.DELETE_MESSAGES:\n            y(la, ma);\n            break;\n          case o.TAG:\n            ca(la, ma);\n            break;\n          case o.REPORT_SPAM:\n            ba(la, ma);\n            break;\n          case o.READ_RECEIPT:\n            fa(la, ma);\n            break;\n          case o.CHANGE_MUTE_SETTINGS:\n            ga(la, ma);\n            break;\n        };\n    };\n    function ia(la, ma) {\n        if (((la != h.getArbiterType(\"messaging_zap\")) || !ma.obj)) {\n            n.addEntry(\"channel_receive_zap\", \"invalid_data\");\n            return;\n        }\n    ;\n        if (!ma.obj.is_canonical) {\n            return\n        };\n        var na = ma.obj.sender_id;\n        if ((na == i.user)) {\n            na = ma.obj.recipient_id;\n        };\n        na = (\"user:\" + na);\n        var oa = {\n            action_type: j.USER_GENERATED_MESSAGE,\n            author: (\"fbid:\" + ma.obj.sender_id),\n            body: ma.obj.body,\n            source: ma.obj.source,\n            timestamp: ma.obj.timestamp,\n            message_id: ma.obj.message_id,\n            thread_id: na,\n            specific_to_list: [(\"fbid:\" + ma.obj.sender_id),(\"fbid:\" + ma.obj.recipient_id),],\n            spoof_warning: false,\n            is_unread: true,\n            is_zap: true\n        };\n        l.zapMessage(oa);\n    };\n    var ja = [], ka = {\n        turnOn: function() {\n            if (!ja.length) {\n                var la = {\n                    mercury: ea,\n                    messaging: ha,\n                    messaging_zap: ia,\n                    inbox: da\n                };\n                for (var ma in la) {\n                    ja.push(g.subscribe(h.getArbiterType(ma), la[ma]));;\n                };\n            }\n        ;\n        },\n        turnOff: function() {\n            if (ja.length) {\n                ja.forEach(g.unsubscribe);\n                ja = [];\n            }\n        ;\n        }\n    };\n    ka.turnOn();\n    e.exports = ka;\n});\n__d(\"MercuryRoger\", [\"ArbiterMixin\",\"MercuryActionStatus\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"MercuryActionStatus\"), i = b(\"MercuryServerRequests\").get(), j = b(\"copyProperties\"), k = {\n    }, l = {\n        getSeenBy: function(m, n) {\n            if (!m) {\n                return []\n            };\n            var o = [], p = k[m.thread_id], q = h.SUCCESS;\n            for (var r in p) {\n                if ((((p[r] > m.timestamp) && (((m.status === undefined) || (m.status === q)))) && ((!n || (r != m.author))))) {\n                    o.push(r);\n                };\n            };\n            return o;\n        },\n        getSeenTimestamp: function(m, n) {\n            var o = k[m];\n            return (o ? o[n] : null);\n        }\n    };\n    j(l, g);\n    i.subscribe(\"update-roger\", function(m, n) {\n        for (var o in n) {\n            if (!k[o]) {\n                k[o] = {\n                };\n            };\n            for (var p in n[o]) {\n                var q = k[o][p], r = n[o][p];\n                if ((!q || (r > q))) {\n                    k[o][p] = r;\n                };\n            };\n        };\n        if (n) {\n            l.inform(\"state-changed\", n);\n        };\n    });\n    e.exports = l;\n});\n__d(\"MercuryDelayedRoger\", [\"ArbiterMixin\",\"LiveTimer\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryMessages\",\"MercuryRoger\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LiveTimer\"), i = b(\"MercuryActionStatus\"), j = b(\"MercuryConfig\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryRoger\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = b(\"setTimeoutAcrossTransitions\"), q = {\n    }, r = {\n    }, s = j[\"roger.seen_delay\"], t = o({\n        getSeenBy: function(x, y) {\n            if (r[x]) {\n                return []\n            };\n            if (!q[x]) {\n                var z = n.getThreadMetaNow(x);\n                if (z) {\n                    q[x] = {\n                        thread_id: x,\n                        author: z.participants[0],\n                        timestamp: z.timestamp\n                    };\n                };\n            }\n        ;\n            return l.getSeenBy(q[x], y);\n        }\n    }, g);\n    function u(x) {\n        var y = false;\n        k.getThreadMessagesRange(x, 0, 1, function(z) {\n            var aa = z[0];\n            if (!aa) {\n                return\n            };\n            var ba = aa.timestamp;\n            if ((aa.action_id || (aa.status == i.SUCCESS))) {\n                ba -= h.getServerTimeOffset();\n            };\n            var ca = t.getSeenBy(x);\n            if (r[x]) {\n                clearTimeout(r[x]);\n                delete r[x];\n            }\n        ;\n            var da = (ba + s), ea = (da - Date.now());\n            if ((ea > 0)) {\n                r[x] = p(function() {\n                    delete r[x];\n                    v(x);\n                }, ea);\n            };\n            q[x] = aa;\n            var fa = t.getSeenBy(x);\n            if ((ca.length || fa.length)) {\n                y = true;\n            };\n        });\n        return y;\n    };\n    function v(x) {\n        var y = {\n        };\n        y[x] = true;\n        t.inform(\"state-changed\", y);\n    };\n    function w(event, x) {\n        var y = {\n        };\n        for (var z in x) {\n            if (u(z)) {\n                y[z] = true;\n            };\n        };\n        for (var aa in y) {\n            t.inform(\"state-changed\", y);\n            break;\n        };\n    };\n    l.subscribe(\"state-changed\", function(x, y) {\n        for (var z in y) {\n            (!r[z] && v(z));;\n        };\n    });\n    m.subscribe(\"messages-received\", w);\n    m.subscribe(\"messages-reordered\", w);\n    m.subscribe(\"messages-updated\", w);\n    e.exports = t;\n});\n__d(\"MercuryFilters\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.UNREAD,], j = {\n        ALL: \"all\",\n        getSupportedFilters: function() {\n            return i.concat();\n        },\n        isSupportedFilter: function(k) {\n            return h(i, k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryOrderedThreadlist\", [\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryFilters\",\"MercuryFolders\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MessagingTag\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"MercuryActionTypeConstants\"), i = b(\"MercuryFilters\"), j = b(\"MercuryFolders\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercurySingletonMixin\"), m = b(\"MessagingTag\"), n = b(\"RangedCallbackManager\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"MercuryThreads\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = g.create(\"ordered_threadlist_model\"), u = i.getSupportedFilters().concat([i.ALL,m.GROUPS,]), v = j.getSupportedFolders();\n    function w(ga, ha, ia, ja) {\n        var ka = [], la = false, ma = false, na = ((ha || [])).filter(function(ua) {\n            var va = (ua.filter || i.ALL);\n            return ((((ua.folder == ia) || ((!ua.folder && (ia == m.INBOX))))) && (va == ja));\n        }), oa = ga._threadlistOrderMap[ia][ja].getAllResources(), pa;\n        na.forEach(function(ua) {\n            ka = ka.concat(ua.thread_ids);\n            if (ua.error) {\n                if ((ua.end > oa.length)) {\n                    ma = ua.error;\n                };\n            }\n             else {\n                var va = (ua.end - ua.start);\n                if ((ua.thread_ids.length < va)) {\n                    la = true;\n                };\n            }\n        ;\n            if ((!pa || (ua.end > pa))) {\n                pa = ua.end;\n            };\n        });\n        aa(ga, ka, ia, ja);\n        if (la) {\n            ga._threadlistOrderMap[ia][ja].setReachedEndOfArray();\n        }\n         else if (ma) {\n            ga._threadlistOrderMap[ia][ja].setError(ma);\n        }\n         else {\n            var qa = ga._threadlistOrderMap[ia][ja].getCurrentArraySize();\n            if ((pa && (qa < pa))) {\n                var ra = {\n                }, sa = oa.concat(ka), ta = sa.filter(function(ua) {\n                    var va = ra[ua];\n                    ra[ua] = true;\n                    return va;\n                });\n                if (ta.length) {\n                    t.warn(\"duplicate_threads\", {\n                        folder: ia,\n                        expected_final_size: pa,\n                        actual_final_size: qa,\n                        duplicate_thread_ids: ta\n                    });\n                    ga._serverRequests.fetchThreadlistInfo(pa, ta.length, ia, ((ja == i.ALL) ? null : ja));\n                }\n            ;\n            }\n        ;\n        }\n        \n    ;\n    };\n    function x(ga, ha) {\n        v.forEach(function(ia) {\n            u.forEach(function(ja) {\n                w(ga, ha, ia, ja);\n            });\n        });\n    };\n    function y(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = {\n                    to_add: [],\n                    to_remove: [],\n                    to_remove_if_last_after_add: {\n                    }\n                };\n            });\n        });\n        ha.forEach(function(ja) {\n            if (ja.is_forward) {\n                return\n            };\n            var ka = ja.thread_id, la = ba(ga, ka), ma = ca(ga, ka);\n            function na() {\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_add.push(ka);\n                    if ((!ga._threadlistOrderMap[la][pa].hasReachedEndOfArray() && !ga._threadlistOrderMap[la][pa].hasResource(ka))) {\n                        ia[la][pa].to_remove_if_last_after_add[ka] = true;\n                    };\n                });\n            };\n            function oa(pa) {\n                if (r(u, pa)) {\n                    if (r(ma, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                     else ia[la][pa].to_remove.push(ka);\n                \n                };\n            };\n            if (!la) {\n                if (((ja.action_type === h.CHANGE_FOLDER) || (ja.action_type === h.CHANGE_ARCHIVED_STATUS))) {\n                    v.forEach(function(pa) {\n                        if ((pa !== la)) {\n                            u.forEach(function(qa) {\n                                ga._threadlistOrderMap[pa][qa].removeResources([ka,]);\n                            });\n                        };\n                    });\n                };\n                return;\n            }\n        ;\n            switch (ja.action_type) {\n              case h.DELETE_THREAD:\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_remove.push(ka);\n                });\n                break;\n              case h.CHANGE_ARCHIVED_STATUS:\n            \n              case h.CHANGE_FOLDER:\n                na();\n                break;\n              case h.CHANGE_READ_STATUS:\n                oa(m.UNREAD);\n                break;\n              case h.USER_GENERATED_MESSAGE:\n            \n              case h.LOG_MESSAGE:\n                ma.forEach(function(pa) {\n                    if (da(ga, ka, la, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    };\n                });\n                break;\n            };\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                var la = ga._threadlistOrderMap[ja][ka];\n                aa(ga, ia[ja][ka].to_add, ja, ka);\n                for (var ma = (la.getCurrentArraySize() - 1); (ma >= 0); ma--) {\n                    var na = la.getResourceAtIndex(ma);\n                    if (!ia[ja][ka].to_remove_if_last_after_add[na]) {\n                        break;\n                    };\n                    ia[ja][ka].to_remove.push(na);\n                };\n                la.removeResources(ia[ja][ka].to_remove);\n            });\n        });\n    };\n    function z(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = [];\n            });\n        });\n        ha.forEach(function(ja) {\n            var ka = ba(ga, ja.thread_id), la = ca(ga, ja.thread_id);\n            if (ka) {\n                la.forEach(function(ma) {\n                    if (da(ga, ja.thread_id, ka, ma)) {\n                        ia[ka][ma].push(ja.thread_id);\n                    };\n                });\n            };\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                if ((ia[ja][ka].length > 0)) {\n                    aa(ga, ia[ja][ka], ja, ka);\n                };\n            });\n        });\n    };\n    function aa(ga, ha, ia, ja) {\n        ja = (ja || i.ALL);\n        ga._threadlistOrderMap[ia][ja].addResources(ha);\n        v.forEach(function(ka) {\n            if ((ka != ia)) {\n                ga._threadlistOrderMap[ka][ja].removeResources(ha);\n            };\n        });\n    };\n    function ba(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = null;\n        if (!ia) {\n            ja = \"No thread metadata\";\n        }\n         else if (!ia.folder) {\n            ja = \"No thread folder\";\n        }\n    ;\n        if (ja) {\n            var ka = {\n                error: ja,\n                tid: ha\n            };\n            t.warn(\"no_thread_folder\", ka);\n            return null;\n        }\n    ;\n        var la = ia.folder;\n        if (ia.is_archived) {\n            la = m.ACTION_ARCHIVED;\n        };\n        if (ga._threadlistOrderMap[la]) {\n            return la;\n        }\n         else return null\n    ;\n    };\n    function ca(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = [i.ALL,];\n        if (!ia) {\n            var ka = {\n                error: \"no_thread_metadata\",\n                tid: ha\n            };\n            t.warn(\"no_thread_metadata\", ka);\n            return [];\n        }\n    ;\n        if (ia.unread_count) {\n            ja.push(m.UNREAD);\n        };\n        if (!ia.is_canonical) {\n            ja.push(m.GROUPS);\n        };\n        return ja;\n    };\n    function da(ga, ha, ia, ja) {\n        var ka = ga._threads.getThreadMetaNow(ha);\n        return (((ka && ka.timestamp) && (ba(ga, ha) == ia)) && r(ca(ga, ha), ja));\n    };\n    function ea(ga) {\n        this._fbid = ga;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._threads = q.getForFBID(this._fbid);\n        this._threadlistOrderMap = {\n        };\n        v.forEach(function(ha) {\n            this._threadlistOrderMap[ha] = {\n            };\n            u.forEach(function(ia) {\n                this._threadlistOrderMap[ha][ia] = new n(function(ja) {\n                    return this._threads.getThreadMetaNow(ja).timestamp;\n                }.bind(this), function(ja, ka) {\n                    return (ka - ja);\n                }, this._serverRequests.canLinkExternally.bind(this._serverRequests));\n            }.bind(this));\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-threadlist\", function(ha, ia) {\n            if (!fa(ia)) {\n                return\n            };\n            var ja = ia.ordered_threadlists;\n            if ((ja && ja.length)) {\n                x(this, ja);\n            }\n             else {\n                var ka = ((ia.actions || [])).filter(function(la) {\n                    return la.thread_id;\n                });\n                z(this, (ia.threads || []));\n                y(this, ka);\n            }\n        ;\n            this._threadInformer.updatedThreadlist();\n        }.bind(this));\n    };\n    s(ea.prototype, {\n        getThreadlist: function(ga, ha, ia, ja, ka, la) {\n            return this.getFilteredThreadlist(ga, ha, ia, i.ALL, ja, ka, la);\n        },\n        getFilteredThreadlist: function(ga, ha, ia, ja, ka, la, ma) {\n            var na = this._threadlistOrderMap[ia][ja], oa = na.executeOrEnqueue(ga, ha, ka, la), pa = na.getUnavailableResources(oa), qa = na.getError(ga, ha, la);\n            if ((pa.length || qa)) {\n                if ((na.getCurrentArraySize() < ga)) {\n                    var ra = {\n                        start: ga,\n                        limit: ha,\n                        filter: ja,\n                        resources_size: na.getCurrentArraySize()\n                    };\n                    t.warn(\"range_with_gap\", ra);\n                }\n            ;\n                na.setError(false);\n                this._serverRequests.fetchThreadlistInfo(na.getCurrentArraySize(), pa.length, ia, ((ja == i.ALL) ? null : ja), ma);\n            }\n        ;\n            return oa;\n        },\n        getThreadlistUntilTimestamp: function(ga, ha, ia) {\n            ia = (ia || i.ALL);\n            return this._threadlistOrderMap[ha][ia].getElementsUntil(ga);\n        },\n        unsubscribe: function(ga, ha, ia) {\n            ia = (ia || i.ALL);\n            this._threadlistOrderMap[ha][ia].unsubscribe(ga);\n        }\n    });\n    s(ea, l);\n    function fa(ga) {\n        switch (ga.payload_source) {\n          case k.CLIENT_CHANGE_ARCHIVED_STATUS:\n        \n          case k.CLIENT_CHANGE_READ_STATUS:\n        \n          case k.CLIENT_CHANGE_FOLDER:\n        \n          case k.CLIENT_CHANNEL_MESSAGE:\n        \n          case k.CLIENT_DELETE_MESSAGES:\n        \n          case k.CLIENT_DELETE_THREAD:\n        \n          case k.CLIENT_SEND_MESSAGE:\n        \n          case k.SERVER_SEND_MESSAGE:\n        \n          case k.SERVER_CONFIRM_MESSAGES:\n        \n          case k.SERVER_FETCH_THREADLIST_INFO:\n        \n          case k.SERVER_THREAD_SYNC:\n        \n          case k.SERVER_ZAP:\n            return true;\n          case k.SERVER_INITIAL_DATA:\n            return ga.ordered_threadlists;\n          default:\n            return false;\n        };\n    };\n    e.exports = ea;\n});\n__d(\"MercuryUnreadState\", [\"Arbiter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryFolders\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercuryGlobalActionType\"), m = b(\"MercurySingletonMixin\"), n = b(\"MercuryThreadlistConstants\"), o = b(\"MessagingTag\"), p = b(\"MercuryServerRequests\"), q = b(\"MercuryThreadInformer\"), r = b(\"MercuryThreads\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"createObjectFrom\"), v = ((h.getSupportedFolders() || [])).filter(function(ma) {\n        return (ma != o.ACTION_ARCHIVED);\n    }), w = \"unread_thread_hash\", x = \"unseen_thread_list\", y = n.MAX_UNREAD_COUNT, z = i.create(\"mercury_unread_state\");\n    function aa(ma) {\n        this._fbid = ma;\n        this._serverRequests = p.getForFBID(this._fbid);\n        this._threadInformer = q.getForFBID(this._fbid);\n        this._threads = r.getForFBID(this._fbid);\n        this._allReadTimestamp = {\n        };\n        this._threadReadTimestamp = {\n        };\n        this._initialUnreadCount = {\n        };\n        this._maxCount = {\n        };\n        this._unreadResources = {\n        };\n        v.forEach(function(na) {\n            this._initialUnreadCount[na] = 0;\n            this._maxCount[na] = false;\n            this._unreadResources[na] = new j();\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-unread\", function(na, oa) {\n            fa(this, oa);\n            var pa = (oa.global_actions || []);\n            for (var qa = 0; (qa < pa.length); qa++) {\n                var ra = pa[qa];\n                if ((ra.action_type == l.MARK_ALL_READ)) {\n                    ia(this, ra.folder, ra.timestamp);\n                };\n            };\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(na, oa) {\n            ka(this, oa);\n        }.bind(this));\n    };\n    t(aa.prototype, {\n        getUnreadCount: function(ma) {\n            if (this.exceedsMaxCount(ma)) {\n                z.error(\"unguarded_unread_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n            return ea(this, ma);\n        },\n        exceedsMaxCount: function(ma) {\n            return (this._maxCount[ma] || ((ea(this, ma) > y)));\n        },\n        markFolderAsRead: function(ma) {\n            if ((this._maxCount[ma] || (ea(this, ma) > 0))) {\n                this._serverRequests.markFolderAsRead(ma);\n            };\n        }\n    });\n    t(aa, m);\n    function ba(ma, na, oa) {\n        ma._unreadResources[na].setResource(w, oa);\n        ma._unreadResources[na].setResource(x, Object.keys(oa));\n    };\n    function ca(ma, na, oa) {\n        var pa = ma._unreadResources[na].executeOrEnqueue(w, oa), qa = ma._unreadResources[na].getUnavailableResources(pa);\n        if (qa.length) {\n            ma._serverRequests.fetchUnreadThreadIDs(na);\n        };\n    };\n    function da(ma, na) {\n        return ma._unreadResources[na].getResource(w);\n    };\n    function ea(ma, na) {\n        var oa = ma._unreadResources[na].getResource(x);\n        if (oa) {\n            return oa.length;\n        }\n         else return ma._initialUnreadCount[na]\n    ;\n    };\n    function fa(ma, na) {\n        var oa;\n        ((na.unread_thread_ids || [])).forEach(function(pa) {\n            oa = pa.folder;\n            if (!la(oa)) {\n                return\n            };\n            var qa = ja(ma, pa.thread_ids);\n            ba(ma, oa, u(qa, true));\n            if ((qa.length > y)) {\n                ma._maxCount[oa] = true;\n            };\n            ma._threadInformer.updatedUnreadState();\n        });\n        ((na.message_counts || [])).forEach(function(pa) {\n            if ((pa.unread_count === undefined)) {\n                return\n            };\n            oa = pa.folder;\n            if ((pa.unread_count > y)) {\n                ma._maxCount[oa] = true;\n                ba(ma, oa, {\n                });\n                ma._threadInformer.updatedUnreadState();\n            }\n             else {\n                ma._initialUnreadCount[oa] = pa.unread_count;\n                if ((ma._initialUnreadCount[oa] === 0)) {\n                    ba(ma, oa, {\n                    });\n                };\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        });\n        ((na.actions || [])).forEach(function(pa) {\n            if (pa.is_forward) {\n                return\n            };\n            var qa = k, ra = (pa.thread_id ? pa.thread_id : pa.server_thread_id);\n            if ((pa.action_type == qa.DELETE_THREAD)) {\n                v.forEach(function(ta) {\n                    ha(ma, ta, ra);\n                });\n            }\n             else if (((pa.action_type == qa.CHANGE_ARCHIVED_STATUS) || (pa.action_type == qa.CHANGE_FOLDER))) {\n                var sa = ma._threads.getThreadMetaNow(pa.thread_id);\n                oa = h.getFromMeta(sa);\n                if ((la(oa) && (sa.unread_count > 0))) {\n                    ga(ma, oa, ra);\n                };\n                v.forEach(function(ta) {\n                    if ((ta != oa)) {\n                        ha(ma, ta, ra);\n                    };\n                });\n            }\n             else {\n                oa = pa.folder;\n                if (!la(oa)) {\n                    return\n                };\n                if ((pa.action_type == qa.CHANGE_READ_STATUS)) {\n                    if (pa.mark_as_read) {\n                        ha(ma, oa, ra, pa.timestamp);\n                    }\n                     else ga(ma, oa, ra, pa.timestamp);\n                ;\n                }\n                 else if (((pa.action_type == qa.USER_GENERATED_MESSAGE) || (pa.action_type == qa.LOG_MESSAGE))) {\n                    if (pa.is_unread) {\n                        ga(ma, oa, ra, pa.timestamp);\n                    }\n                }\n            ;\n            }\n            \n        ;\n        });\n    };\n    function ga(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return\n        };\n        ca(ma, na, function(qa) {\n            var ra = (ma._allReadTimestamp[na] || 0), sa = (ma._threadReadTimestamp[oa] || 0), ta = (pa || Number.POSITIVE_INFINITY);\n            if ((((ta >= ra) && (ta >= sa)) && !qa[oa])) {\n                qa[oa] = (pa || 0);\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        });\n    };\n    function ha(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return\n        };\n        ca(ma, na, function(qa) {\n            if (pa) {\n                var ra = ma._threadReadTimestamp[oa];\n                if ((!ra || (ra < pa))) {\n                    ma._threadReadTimestamp[oa] = pa;\n                };\n            }\n        ;\n            var sa = qa[oa];\n            if (((pa && (typeof sa == \"number\")) && (pa < sa))) {\n                return\n            };\n            if ((oa in qa)) {\n                delete qa[oa];\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        });\n    };\n    function ia(ma, na, oa) {\n        ma._maxCount[na] = false;\n        ba(ma, na, {\n        });\n        ma._allReadTimestamp[na] = Math.max((ma._allReadTimestamp[na] || 0), (oa || 0));\n        ma._threadInformer.updatedUnreadState();\n    };\n    function ja(ma, na) {\n        return na.map(ma._serverRequests.convertThreadIDIfAvailable.bind(ma._serverRequests));\n    };\n    function ka(ma, na) {\n        v.forEach(function(oa) {\n            var pa = da(ma, oa);\n            if (!pa) {\n                return\n            };\n            for (var qa in na) {\n                var ra = na[qa];\n                if (pa[qa]) {\n                    pa[ra] = pa[qa];\n                    delete pa[qa];\n                }\n            ;\n            };\n            ba(ma, oa, pa);\n        });\n    };\n    function la(ma) {\n        return s(v, ma);\n    };\n    g.subscribe(i.DUMP_EVENT, function(ma, na) {\n        na.messaging = (na.messaging || {\n        });\n        na.messaging.unread = {\n        };\n        na.messaging.unread_max_count = {\n        };\n        var oa = aa._getInstances();\n        for (var pa in oa) {\n            na.messaging.unread[pa] = {\n            };\n            na.messaging.unread_max_count[pa] = {\n            };\n            v.forEach(function(qa) {\n                na.messaging.unread[pa][qa] = t({\n                }, da(oa[pa], qa));\n                na.messaging.unread_max_count[pa][qa] = oa[pa]._maxCount[qa];\n            });\n        };\n    });\n    e.exports = aa;\n});\n__d(\"MercuryUnseenState\", [\"Arbiter\",\"TimestampConverter\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercurySingletonMixin\"), m = b(\"MercuryThreadlistConstants\"), n = b(\"MessagingTag\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"copyProperties\"), r = b(\"createObjectFrom\"), s = m.MAX_UNSEEN_COUNT, t = \"unseen_thread_hash\", u = \"unseen_thread_list\", v = i.create(\"mercury_unseen_state\");\n    function w(ja) {\n        this._fbid = ja;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._initialUnseenCount = 0;\n        this._lastSeenTimestamp = 0;\n        this._maxCount = false;\n        this._unseenResources = new j();\n        this._serverRequests.subscribe(\"update-unseen\", function(ka, la) {\n            ba(this, la);\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(ka, la) {\n            ha(this, la);\n        }.bind(this));\n    };\n    q(w.prototype, {\n        getUnseenCount: function() {\n            if (this.exceedsMaxCount()) {\n                v.error(\"unguarded_unseen_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n            return aa(this);\n        },\n        exceedsMaxCount: function() {\n            return (this._maxCount || ((aa(this) > s)));\n        },\n        markAsSeen: function() {\n            if (((aa(this) > 0) || this._maxCount)) {\n                this._serverRequests.markSeen();\n                ca(this, h.convertActionIDToTimestamp(this._serverRequests.getLastActionID()), []);\n            }\n        ;\n        },\n        markThreadSeen: function(ja, ka) {\n            var la = {\n            };\n            la[ja] = null;\n            ea(this, la, ka);\n        }\n    });\n    q(w, l);\n    function x(ja, ka) {\n        ja._unseenResources.setResource(t, ka);\n        ja._unseenResources.setResource(u, Object.keys(ka));\n    };\n    function y(ja, ka) {\n        var la = ja._unseenResources.executeOrEnqueue(t, ka), ma = ja._unseenResources.getUnavailableResources(la);\n        if (ma.length) {\n            ja._serverRequests.fetchUnseenThreadIDs();\n        };\n    };\n    function z(ja) {\n        return ja._unseenResources.getResource(t);\n    };\n    function aa(ja) {\n        var ka = ja._unseenResources.getResource(u);\n        if (ka) {\n            return ka.length;\n        }\n         else return ja._initialUnseenCount\n    ;\n    };\n    function ba(ja, ka) {\n        var la = ia(ka);\n        if (ka.unseen_thread_ids) {\n            ka.unseen_thread_ids.forEach(function(wa) {\n                if ((wa.folder != n.INBOX)) {\n                    return\n                };\n                var xa = ga(ja, wa.thread_ids), ya = ja._lastSeenTimestamp;\n                if ((la && la.seen_timestamp)) {\n                    ya = la.seen_timestamp;\n                };\n                ca(ja, ya, xa);\n                if ((la && (la.unseen_count > s))) {\n                    ja._maxCount = true;\n                };\n            });\n        }\n         else if ((la && la.seen_timestamp)) {\n            ja._lastSeenTimestamp = la.seen_timestamp;\n            if ((la.unseen_count > s)) {\n                ja._maxCount = true;\n                x(ja, {\n                });\n            }\n             else {\n                ja._initialUnseenCount = la.unseen_count;\n                if ((ja._initialUnseenCount === 0)) {\n                    x(ja, {\n                    });\n                };\n            }\n        ;\n        }\n         else {\n            if (ja._maxCount) {\n                return\n            };\n            var ma = ka.actions;\n            if ((!ma || !(ma.length))) {\n                return\n            };\n            var na = {\n            }, oa = {\n            };\n            for (var pa = 0; (pa < ma.length); pa++) {\n                var qa = ma[pa];\n                if (qa.is_forward) {\n                    continue;\n                };\n                var ra = qa.action_type, sa = qa.action_id, ta = (qa.thread_id ? qa.thread_id : qa.server_thread_id), ua = ((qa.folder === undefined) || (qa.folder == n.INBOX));\n                if (!ua) {\n                    continue;\n                };\n                if (((ra == k.USER_GENERATED_MESSAGE) || (ra == k.LOG_MESSAGE))) {\n                    var va = h.isGreaterThan(sa, na[ta]);\n                    if ((qa.is_unread && ((!na[ta] || va)))) {\n                        na[ta] = sa;\n                    };\n                }\n                 else if (((ra == k.CHANGE_READ_STATUS) && qa.mark_as_read)) {\n                    oa[ta] = sa;\n                }\n            ;\n            };\n            da(ja, na);\n            ea(ja, oa);\n        }\n        \n    ;\n    };\n    function ca(ja, ka, la) {\n        var ma = z(ja);\n        if ((((ma === undefined) || (ka > ja._lastSeenTimestamp)) || ja._maxCount)) {\n            ja._lastSeenTimestamp = ka;\n            la = (la || []);\n            if ((la.length <= s)) {\n                ja._maxCount = false;\n            };\n            var na = {\n            }, oa = (z(ja) || {\n            });\n            for (var pa in oa) {\n                if ((oa[pa] !== true)) {\n                    var qa = oa[pa];\n                    if (fa(ja, qa)) {\n                        na[pa] = qa;\n                    };\n                }\n            ;\n            };\n            var ra = q(r(la, true), na);\n            x(ja, ra);\n            ja._threadInformer.updatedUnseenState();\n        }\n    ;\n    };\n    function da(ja, ka) {\n        if (ja._maxCount) {\n            return\n        };\n        var la = {\n        }, ma = false;\n        for (var na in ka) {\n            var oa = ka[na];\n            if (fa(ja, oa)) {\n                la[na] = oa;\n                ma = true;\n            }\n        ;\n        };\n        if (!ma) {\n            return\n        };\n        y(ja, function(pa) {\n            for (var qa in la) {\n                var ra = la[qa];\n                if ((!pa[qa] && fa(ja, ra))) {\n                    pa[qa] = la[qa];\n                };\n            };\n            x(ja, pa);\n            ja._threadInformer.updatedUnseenState();\n        });\n    };\n    function ea(ja, ka, la) {\n        var ma = false;\n        for (var na in ka) {\n            ma = true;\n            break;\n        };\n        if (ma) {\n            y(ja, function(oa) {\n                var pa = false;\n                for (var qa in ka) {\n                    var ra = ka[qa], sa = h.isGreaterThan(ra, oa[qa]);\n                    if ((oa[qa] && ((!ra || sa)))) {\n                        delete oa[qa];\n                        pa = true;\n                    }\n                ;\n                };\n                if (pa) {\n                    x(ja, oa);\n                    ja._threadInformer.updatedUnseenState();\n                    if ((la && (aa(ja) === 0))) {\n                        ja._serverRequests.markSeen();\n                    };\n                }\n            ;\n            });\n        };\n    };\n    function fa(ja, ka) {\n        var la = h.convertActionIDToTimestamp(ka);\n        return (la > ja._lastSeenTimestamp);\n    };\n    function ga(ja, ka) {\n        return ka.map(ja._serverRequests.convertThreadIDIfAvailable.bind(ja._serverRequests));\n    };\n    function ha(ja, ka) {\n        var la = z(ja);\n        if (!la) {\n            return\n        };\n        for (var ma in ka) {\n            var na = ka[ma];\n            if (la[ma]) {\n                la[na] = la[ma];\n                delete la[ma];\n            }\n        ;\n        };\n        x(ja, la);\n    };\n    function ia(ja) {\n        var ka = ((ja.message_counts || []));\n        for (var la = 0; (la < ka.length); la++) {\n            if ((ka[la].folder == n.INBOX)) {\n                return ka[la]\n            };\n        };\n        return null;\n    };\n    g.subscribe(i.DUMP_EVENT, function(ja, ka) {\n        ka.messaging = (ka.messaging || {\n        });\n        ka.messaging.unseen = {\n        };\n        ka.messaging.unseen_max_count = {\n        };\n        ka.messaging.unseen_time = {\n        };\n        var la = w._getInstances();\n        for (var ma in la) {\n            ka.messaging.unseen[ma] = q({\n            }, z(la[ma]));\n            ka.messaging.unseen_max_count[ma] = la[ma]._maxCount;\n            ka.messaging.unseen_time[ma] = la[ma]._lastSeenTimestamp;\n        };\n    });\n    e.exports = w;\n});\n__d(\"MercuryThreadMetadataRawRenderer\", [\"Event\",\"CSS\",\"DOM\",\"MercuryActionStatus\",\"MercuryErrorInfo\",\"MessagingTag\",\"MercuryStatusTemplates\",\"Tooltip\",\"URI\",\"WebMessengerPermalinkConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryActionStatus\"), k = b(\"MercuryErrorInfo\"), l = b(\"MessagingTag\"), m = b(\"MercuryStatusTemplates\"), n = b(\"Tooltip\"), o = b(\"URI\"), p = b(\"WebMessengerPermalinkConstants\"), q = b(\"cx\"), r = b(\"tx\"), s = {\n        renderParticipantListWithNoThreadName: function(u, v, w, x, y, z) {\n            var aa = {\n                callback: true,\n                check_length: true,\n                show_unread_count: true\n            };\n            z = (z || {\n            });\n            var ba = {\n            };\n            for (var ca in z) {\n                if (aa[ca]) {\n                    ba[ca] = z[ca];\n                    delete z[ca];\n                }\n            ;\n            };\n            var da = w.map(function(ia) {\n                return x[ia];\n            }), ea = this.renderRawParticipantList(u, da, w.length, z);\n            ea = this.renderRawTitleWithUnreadCount(ea, (ba.show_unread_count ? v.unread_count : 0));\n            var fa = z.abbr_mode, ga = {\n            };\n            for (var ha in z) {\n                ga[ha] = z[ha];;\n            };\n            ga.abbr_mode = true;\n            y.forEach(function(ia) {\n                var ja = ((y.length > 1) ? this._cloneIfDOMElement(ea) : ea);\n                i.setContent(ia, ja);\n                if (((ba.check_length && !fa) && (ia.scrollWidth > ia.clientWidth))) {\n                    var ka = this.renderRawParticipantList(u, da, w.length, ga), la = this.renderRawTitleWithUnreadCount(ka, (ba.show_unread_count ? v.unread_count : 0));\n                    i.setContent(ia, la);\n                }\n            ;\n            }.bind(this));\n            (ba.callback && ba.callback(ea));\n        },\n        renderRawParticipantList: function(u, v, w, x) {\n            var y = {\n                abbr_mode: true,\n                last_separator_uses_and: true,\n                names_renderer: true\n            };\n            x = (x || {\n            });\n            var z = null;\n            if (x.names_renderer) {\n                z = x.names_renderer(v);\n            }\n             else z = v.map(function(ca) {\n                return ca.name;\n            });\n        ;\n            var aa = null;\n            if ((z.length === 0)) {\n                if (!u) {\n                    aa = \"New Message\";\n                }\n                 else aa = \"No Participants\";\n            ;\n            }\n             else if ((z.length == 1)) {\n                aa = z[0];\n            }\n             else if ((z.length == 2)) {\n                var ba = {\n                    participant1: z[0],\n                    participant2: z[1]\n                };\n                if (x.last_separator_uses_and) {\n                    aa = r._(\"{participant1} and {participant2}\", ba);\n                }\n                 else aa = r._(\"{participant1}, {participant2}\", ba);\n            ;\n            }\n             else if (x.last_separator_uses_and) {\n                if (x.abbr_mode) {\n                    aa = r._(\"{participant1} and {others_link}\", {\n                        participant1: z[0],\n                        others_link: this.renderRawParticipantCount(u, {\n                            render_subset: true,\n                            count: (w - 1)\n                        })\n                    });\n                }\n                 else if ((z.length == 3)) {\n                    aa = r._(\"{participant1}, {participant2} and {participant3}\", {\n                        participant1: z[0],\n                        participant2: z[1],\n                        participant3: z[2]\n                    });\n                }\n                 else aa = r._(\"{participant1}, {participant2} and {others_link}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    others_link: this.renderRawParticipantCount(u, {\n                        render_subset: true,\n                        count: (w - 2)\n                    })\n                });\n                \n            ;\n            }\n             else if ((z.length == 3)) {\n                aa = r._(\"{participant1}, {participant2}, {participant3}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    participant3: z[2]\n                });\n            }\n             else aa = r._(\"{participant1}, {participant2}, {participant3}, {others_link}\", {\n                participant1: z[0],\n                participant2: z[1],\n                participant3: z[2],\n                others_link: this.renderRawParticipantCount(u, {\n                    render_subset: true,\n                    count: (w - 3)\n                })\n            });\n            \n            \n            \n            \n        ;\n            if (Array.isArray(aa)) {\n                aa = i.create(\"span\", {\n                }, aa);\n            };\n            return aa;\n        },\n        renderRawTitleWithUnreadCount: function(u, v) {\n            var w = u;\n            if ((v && (v > 1))) {\n                w = i.create(\"span\", {\n                }, r._(\"{conversation_title} ({unread_count})\", {\n                    conversation_title: u,\n                    unread_count: v\n                }));\n            };\n            return w;\n        },\n        renderRawParticipantCount: function(u, v) {\n            var w = v.render_subset, x;\n            if (!w) {\n                x = ((v.count > 1) ? r._(\"{num} people\", {\n                    num: v.count\n                }) : \"1 person\");\n            }\n             else x = ((v.count > 1) ? r._(\"{others_count} others\", {\n                others_count: v.count\n            }) : \"1 other\");\n        ;\n            return x;\n        },\n        renderShortNames: function(u) {\n            if ((u.length == 1)) {\n                return [u[0].name,]\n            };\n            return u.map(function(v) {\n                return v.short_name;\n            });\n        },\n        getUserCanonicalTitanURL: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\"), y = u.substr((u.indexOf(\":\") + 1));\n            x.setPath(((t(w) + \"/\") + y));\n            (v && v(x.toString()));\n            return x.toString();\n        },\n        getTitanURLWithServerID: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\");\n            x.setPath(p.getURIPathForThreadID(u, t(w)));\n            (v && v(x.toString()));\n            return x.toString();\n        },\n        renderUserCanonicalTitanLink: function(u, v, w, x) {\n            var y = this.getUserCanonicalTitanURL(u, null, x);\n            v.setAttribute(\"href\", y);\n            (w && w());\n        },\n        renderTitanLinkWithServerID: function(u, v, w, x) {\n            var y = this.getTitanURLWithServerID(u, null, x);\n            v.setAttribute(\"href\", y);\n            (w && w());\n        },\n        renderStatusIndicator: function(u, v, w) {\n            var x;\n            if ((u == j.RESENDING)) {\n                x = this.renderResendIndicator();\n            }\n             else if (((((u !== undefined) && (u != j.UNSENT)) && (u != j.UNCONFIRMED)) && (u != j.SUCCESS))) {\n                x = this.renderErrorIndicator(v, w);\n            }\n        ;\n            return x;\n        },\n        renderResendIndicator: function() {\n            return m[\":fb:mercury:resend-indicator\"].render();\n        },\n        renderErrorIndicator: function(u, v) {\n            if (!u) {\n                return null\n            };\n            var w = m[\":fb:mercury:error-indicator\"].render(), x = u.is_transient, y = k.getMessage(u);\n            if (x) {\n                if (k.isConnectionError(u)) {\n                    y = r._(\"{message} Check your network connection or click to try again.\", {\n                        message: y\n                    });\n                }\n                 else y = r._(\"{message} Click to send again.\", {\n                    message: y\n                });\n            \n            };\n            n.set(w, y, \"above\", \"center\");\n            if ((v && x)) {\n                g.listen(w, \"click\", v);\n                w.setAttribute(\"tabindex\", \"0\");\n                h.addClass(w, \"-cx-PRIVATE-fbMercuryStatus__clickableerror\");\n            }\n        ;\n            return w;\n        },\n        _cloneIfDOMElement: function(u) {\n            if (u.cloneNode) {\n                return u.cloneNode();\n            }\n             else return u\n        ;\n        }\n    };\n    function t(u) {\n        var v = p.BASE_PATH;\n        if ((u && (u != l.INBOX))) {\n            v += (\"/\" + u);\n        };\n        return v;\n    };\n    e.exports = s;\n});\n__d(\"MercurySeenByAll\", [\"CSS\",\"DataStore\",\"DOM\",\"MercuryParticipants\",\"MercuryDelayedRoger\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryThreads\").get(), m = {\n    }, n = {\n        updateOnSeenChange: function(p, q) {\n            m[p.tagName] = true;\n            h.set(p, \"thread-id\", q.thread_id);\n            g.addClass(p, \"seenByListener\");\n            o(p, q);\n        }\n    };\n    function o(p, q) {\n        var r = q.participants.filter(function(t) {\n            return (t !== j.user);\n        }), s = ((q.participants.length > 0) && (q.participants[0] === j.user));\n        g.conditionClass(p, \"repliedLast\", s);\n        g.conditionClass(p, \"seenByAll\", (s && (k.getSeenBy(q.thread_id).length === r.length)));\n    };\n    k.subscribe(\"state-changed\", function(p, q) {\n        for (var r in m) {\n            var s = i.scry(document.body, (r + \".seenByListener\"));\n            for (var t = 0; (t < s.length); t++) {\n                var u = s[t], v = h.get(u, \"thread-id\");\n                if (q[v]) {\n                    l.getThreadMeta(v, function(w) {\n                        o(u, w);\n                    });\n                };\n            };\n        };\n    });\n    e.exports = n;\n});\n__d(\"MercuryThreadMetadataRenderer\", [\"MercuryConfig\",\"CSS\",\"DOM\",\"HTML\",\"JSLogger\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryEmoji\",\"MercuryMessageSourceTags\",\"MercurySingletonMixin\",\"MercuryThreadMetadataRawRenderer\",\"MercuryParticipants\",\"MercuryParticipantsConstants\",\"React\",\"MercurySeenByAll\",\"MercuryServerRequests\",\"SplitImage.react\",\"Style\",\"MercuryThreadlistIconTemplates\",\"MercuryThreads\",\"Tooltip\",\"URI\",\"arrayContains\",\"createArrayFrom\",\"copyProperties\",\"cx\",\"formatDate\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"JSLogger\"), l = b(\"MercuryAttachment\"), m = b(\"MercuryAttachmentType\"), n = b(\"MercuryEmoji\"), o = b(\"MercuryMessageSourceTags\"), p = b(\"MercurySingletonMixin\"), q = b(\"MercuryThreadMetadataRawRenderer\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryParticipantsConstants\"), t = b(\"React\"), u = b(\"MercurySeenByAll\"), v = b(\"MercuryServerRequests\"), w = b(\"SplitImage.react\"), x = b(\"Style\"), y = b(\"MercuryThreadlistIconTemplates\"), z = b(\"MercuryThreads\"), aa = b(\"Tooltip\"), ba = b(\"URI\"), ca = b(\"arrayContains\"), da = b(\"createArrayFrom\"), ea = b(\"copyProperties\"), fa = b(\"cx\"), ga = b(\"formatDate\"), ha = b(\"tx\"), ia = k.create(\"wm_timestamp\");\n    function ja(pa) {\n        this._fbid = pa;\n        this._serverRequests = v.getForFBID(pa);\n        this._threads = z.getForFBID(pa);\n    };\n    ea(ja, p);\n    ea(ja.prototype, {\n        renderTimestamp: function(pa, qa, ra, sa) {\n            if (sa) {\n                if (!qa) {\n                    ia.warn(\"no_title\");\n                    qa = (new Date(sa)).toLocaleDateString();\n                }\n            ;\n                pa.setAttribute(\"title\", qa);\n                pa.setAttribute(\"data-utime\", (sa / 1000));\n                if (!ra) {\n                    ia.warn(\"no_display\");\n                    ra = ga(new Date(sa), (g[\"24h_times\"] ? \"H:i\" : \"g:ia\"));\n                }\n            ;\n                i.setContent(pa, ra);\n                h.show(pa);\n            }\n        ;\n        },\n        renderMessageSourceTags: function(pa, qa, ra, sa) {\n            var ta = \"\", ua = \"\", va = \"\";\n            if (ca(ra, o.MESSENGER)) {\n                ta = \"Sent from Messenger\";\n                ua = new ba(\"/mobile/messenger\");\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemessenger\";\n            }\n             else if (ca(ra, o.MOBILE)) {\n                ta = \"Sent from Mobile\";\n                ua = new ba(\"/mobile/\");\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemobile\";\n            }\n             else if (ca(ra, o.CHAT)) {\n                ta = \"Sent from chat\";\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourcechat\";\n            }\n             else if (ca(ra, o.EMAIL)) {\n                if (sa) {\n                    ta = ha._(\"Sent from {email}\", {\n                        email: sa\n                    });\n                }\n                 else ta = \"Sent from email\";\n            ;\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourceemail\";\n            }\n            \n            \n            \n        ;\n            if (va) {\n                aa.set(pa, ta);\n                h.addClass(qa, va);\n                if (ua) {\n                    pa.setAttribute(\"href\", ua);\n                }\n                 else pa.removeAttribute(\"href\");\n            ;\n            }\n             else h.hide(pa);\n        ;\n        },\n        renderMessageLocation: function(pa, qa, ra) {\n            var sa = ba(\"/ajax/messaging/hovercard/map.php\").setQueryData(ra);\n            pa.setAttribute(\"data-hovercard\", sa);\n            h.removeClass(pa, \"-cx-PRIVATE-webMessengerMessageGroup__nolocation\");\n            h.show(qa);\n        },\n        renderSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                h.addClass(pa, \"-cx-PRIVATE-webMessengerMessageGroup__spoofwarning\");\n                aa.set(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.name\n                }));\n            }\n        ;\n        },\n        renderChatSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                i.appendContent(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.name\n                }));\n            };\n        },\n        renderCoreThreadlist: function(pa, qa, ra, sa, ta) {\n            sa = (sa || {\n            });\n            this.renderThreadImage(pa, qa.getNode(\"image\"));\n            var ua = qa.getNode(\"accessibleName\"), va = [qa.getNode(\"name\"),];\n            if (ua) {\n                va.push(ua);\n            };\n            oa(this, pa, va, sa);\n            if ((pa.folder && ta)) {\n                na(qa.getNode(\"folderBadge\"), pa.folder);\n            };\n            var wa = qa.getNode(\"timestamp\");\n            this.renderTimestamp(wa, pa.timestamp_absolute, pa.timestamp_relative, pa.timestamp);\n            this.renderSnippet(pa, qa.getNode(\"snippet\"));\n            la(qa, pa);\n            ra(qa, pa);\n        },\n        renderAndSeparatedParticipantList: function(pa, qa, ra) {\n            ra = (ra || {\n            });\n            ra.last_separator_uses_and = true;\n            this._threads.getThreadMeta(pa, function(sa) {\n                oa(this, sa, qa, ra);\n            }.bind(this));\n        },\n        renderSnippet: function(pa, qa) {\n            var ra = false, sa = i.create(\"span\");\n            h.addClass(sa, \"MercuryRepliedIndicator\");\n            i.appendContent(qa, sa);\n            u.updateOnSeenChange(sa, pa);\n            var ta = pa.snippet;\n            if (ta) {\n                if (pa.snippet_has_attachment) {\n                    i.appendContent(qa, i.create(\"span\", {\n                        className: \"MercuryAttachmentIndicator\"\n                    }));\n                };\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message:\"));\n                };\n                if ((ta.substr(0, 4) == \"?OTR\")) {\n                    ta = \"[encrypted message]\";\n                }\n                 else ta = ta.replace(/\\r\\n|[\\r\\n]/g, \" \");\n            ;\n                ta = j(n.htmlEmojiAndEmote(ta));\n            }\n             else {\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message\"));\n                };\n                if (((pa.snippet_has_attachment && pa.snippet_attachments) && pa.snippet_attachments.length)) {\n                    ra = true;\n                    ta = i.create(\"span\");\n                    ma(this, pa, ta);\n                }\n            ;\n            }\n        ;\n            var ua = pa.participants.length;\n            if (pa.is_subscribed) {\n                ua--;\n            };\n            if ((((!ra && pa.snippet_sender) && (r.getIDForUser(this._fbid) != pa.snippet_sender)) && (ua > 1))) {\n                r.get(pa.snippet_sender, function(va) {\n                    if (va.short_name) {\n                        i.appendContent(qa, ha._(\"{name}: {conversation_snippet}\", {\n                            name: va.short_name,\n                            conversation_snippet: ta\n                        }));\n                    }\n                     else i.appendContent(qa, ta);\n                ;\n                });\n            }\n             else i.appendContent(qa, ta);\n        ;\n        },\n        getTitanURL: function(pa, qa, ra) {\n            if ((pa.substr(0, pa.indexOf(\":\")) == \"user\")) {\n                q.getUserCanonicalTitanURL(pa, qa, ra);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(sa) {\n                q.getTitanURLWithServerID(sa, qa, ra);\n            });\n        ;\n        },\n        renderTitanLink: function(pa, qa, ra, sa) {\n            if ((pa.substr(0, pa.indexOf(\":\")) == \"user\")) {\n                q.renderUserCanonicalTitanLink(pa, qa, ra, sa);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(ta) {\n                q.renderTitanLinkWithServerID(ta, qa, ra, sa);\n            });\n        ;\n        },\n        renderThreadImage: function(pa, qa) {\n            if (pa.image_src) {\n                var ra = w({\n                    srcs: pa.image_src,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(ra, qa);\n                return;\n            }\n        ;\n            var sa = r.getIDForUser(this._fbid), ta = [], ua = pa.participants.filter(function(va) {\n                return (va != sa);\n            });\n            if (!ua.length) {\n                ta = [sa,];\n            }\n             else if ((ua.length == 1)) {\n                ta = [ua[0],];\n            }\n             else ta = ua.slice(0, 3);\n            \n        ;\n            this.renderParticipantImages(ta, qa);\n        },\n        renderParticipantImages: function(pa, qa) {\n            r.getOrderedBigImageMulti(pa, function(ra) {\n                var sa = w({\n                    srcs: ra,\n                    border: true,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(sa, qa);\n            });\n        },\n        renderParticipantList: function(pa, qa, ra, sa) {\n            return q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa);\n        },\n        renderThreadNameAndParticipantList: function(pa, qa, ra, sa) {\n            var ta = q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa), ua = this._threads.getThreadMetaNow(pa);\n            if (!ua.name) {\n                return ta\n            };\n            return ha._(\"{conversation_name} [with {participant_list}]\", {\n                conversation_name: ua.name,\n                participant_list: ta\n            });\n        },\n        renderParticipantCount: function(pa, qa) {\n            return q.renderRawParticipantCount(this._serverRequests.getServerThreadIDNow(pa), qa);\n        }\n    });\n    function ka(pa) {\n        if (!pa.snippet_attachments) {\n            return []\n        };\n        return pa.snippet_attachments.filter(function(qa) {\n            return (qa.attach_type === m.PHOTO);\n        });\n    };\n    function la(pa, qa) {\n        var ra = ka(qa);\n        if ((ra.length === 0)) {\n            return\n        };\n        var sa = ra[0].thumbnail_url;\n        if (!sa) {\n            return\n        };\n        var ta = (((ra.length == 1)) ? \"snippet-thumbnail-single\" : \"snippet-thumbnail-multiple\"), ua = pa.getNode(ta);\n        if (!ua) {\n            return\n        };\n        var va = i.find(ua, \"i\");\n        x.set(va, \"background-image\", ((\"url(\" + sa) + \")\"));\n        h.show(ua);\n    };\n    function ma(pa, qa, ra) {\n        var sa = (qa.snippet_sender && (r.getIDForUser(pa._fbid) == qa.snippet_sender)), ta = function(ya) {\n            if ((!qa.snippet_sender || sa)) {\n                ya(null);\n                return;\n            }\n        ;\n            r.get(qa.snippet_sender, function(za) {\n                ya(za.short_name);\n            });\n        }, ua = ka(qa), va = (ua.length == qa.snippet_attachments.length), wa = (((qa.snippet_attachments.length === 1) && qa.snippet_attachments[0].metadata) && (qa.snippet_attachments[0].metadata.type == \"fb_voice_message\")), xa = ((qa.snippet_attachments.length === 1) && (qa.snippet_attachments[0].attach_type === m.STICKER));\n        ta(function(ya) {\n            var za = null;\n            if (va) {\n                var ab = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                if ((ua.length === 1)) {\n                    za = (sa ? \"You sent a photo.\" : ha._(\"{name} sent a photo.\", {\n                        name: ya\n                    }));\n                }\n                 else za = (sa ? ha._(\"You sent {num_photos} photos.\", {\n                    num_photos: ua.length\n                }) : ha._(\"{name} sent {num_photos} photos.\", {\n                    name: ya,\n                    num_photos: ua.length\n                }));\n            ;\n                h.addClass(ab, l.getAttachIconClass(ua[0].icon_type));\n                i.appendContent(ab, za);\n                i.appendContent(ra, ab);\n            }\n             else if (wa) {\n                var bb = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                za = (sa ? \"You sent a voice message.\" : ha._(\"{name} sent a voice message.\", {\n                    name: ya\n                }));\n                h.addClass(bb, l.getAttachIconClass(qa.snippet_attachments[0].icon_type));\n                i.appendContent(bb, za);\n                i.appendContent(ra, bb);\n            }\n             else if (xa) {\n                za = (sa ? \"You sent a sticker.\" : ha._(\"{name} sent a sticker.\", {\n                    name: ya\n                }));\n                i.appendContent(ra, za);\n            }\n             else qa.snippet_attachments.filter(function(cb) {\n                return ((cb.attach_type == m.FILE) || (cb.attach_type == m.PHOTO));\n            }).forEach(function(cb) {\n                var db = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                i.appendContent(db, cb.name);\n                h.addClass(db, l.getAttachIconClass(cb.icon_type));\n                i.appendContent(ra, db);\n            });\n            \n            \n        ;\n        });\n    };\n    function na(pa, qa) {\n        da(pa).forEach(function(ra) {\n            i.setContent(ra, qa);\n        });\n    };\n    function oa(pa, qa, ra, sa) {\n        ra = da(ra);\n        if (qa.name) {\n            var ta = q.renderRawTitleWithUnreadCount(qa.name, (sa.show_unread_count ? qa.unread_count : 0));\n            ra.forEach(function(va) {\n                i.setContent(va, ta);\n            });\n            (sa.callback && sa.callback(ta));\n            return;\n        }\n    ;\n        var ua = qa.participants;\n        if ((qa.participants.length > 1)) {\n            ua = qa.participants.filter(function(va) {\n                return (va != r.getIDForUser(pa._fbid));\n            });\n        };\n        r.getMulti(ua, function(va) {\n            q.renderParticipantListWithNoThreadName(pa._serverRequests.getServerThreadIDNow(qa.thread_id), qa, ua, va, ra, sa);\n        });\n    };\n    e.exports = ja;\n});\n__d(\"MercuryChatUtils\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        canOpenChatTab: function(i) {\n            var j = (i.is_canonical && !i.is_canonical_user);\n            return ((i.is_subscribed && !j) && (i.canonical_fbid != g.user));\n        }\n    };\n    e.exports = h;\n});\n__d(\"RenderManager\", [\"function-extensions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._isDirty = false;\n        this._obj = i;\n    };\n    g(h.prototype, {\n        dirty: function() {\n            if (!this._isDirty) {\n                this._isDirty = true;\n                this._doPaint.bind(this).defer();\n            }\n        ;\n        },\n        _doPaint: function() {\n            this._isDirty = false;\n            this._obj.paint();\n        }\n    });\n    e.exports = h;\n});\n__d(\"CounterDisplay\", [\"Arbiter\",\"CSS\",\"DOM\",\"RenderManager\",\"Run\",\"$\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"RenderManager\"), k = b(\"Run\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\");\n    function o(p, q, r, s, t, u) {\n        m(this, {\n            _name: p,\n            _valueNode: l(q),\n            _wrapperNode: (l(r) || null),\n            _statusClass: t,\n            _rm: new j(this),\n            _arbiterSubscription: null,\n            _count: 0\n        });\n        var v = this._valueNode.firstChild;\n        if (v) {\n            var w = parseInt(v.nodeValue, 10);\n            if (!isNaN(w)) {\n                this._count = w;\n            };\n        }\n    ;\n        this._statusNode = (s ? l(s) : null);\n        this._subscribeAll();\n        o.instances.push(this);\n        if (!u) {\n            k.onLeave(this._destroy.bind(this), true);\n        };\n    };\n    m(o, {\n        EVENT_TYPE_ADJUST: \"CounterDisplay/adjust\",\n        EVENT_TYPE_UPDATE: \"CounterDisplay/update\",\n        instances: [],\n        adjustCount: function(p, q) {\n            g.inform(((o.EVENT_TYPE_ADJUST + \"/\") + p), q);\n        },\n        setCount: function(p, q) {\n            g.inform(((o.EVENT_TYPE_UPDATE + \"/\") + p), q);\n        }\n    });\n    m(o.prototype, {\n        _destroy: function() {\n            delete this._valueNode;\n            delete this._wrapperNode;\n            if (this._arbiterSubscription) {\n                this._arbiterSubscription.unsubscribe();\n                delete this._arbiterSubscription;\n            }\n        ;\n            n(o.instances, this);\n        },\n        adjustCount: function(p) {\n            this._count = Math.max(0, (this._count + p));\n            this._rm.dirty();\n            return this;\n        },\n        setCount: function(p) {\n            this._count = Math.max(0, p);\n            this._rm.dirty();\n            return this;\n        },\n        paint: function() {\n            i.setContent(this._valueNode, this._count);\n            this._toggleNodes();\n        },\n        _toggleNodes: function() {\n            if (this._wrapperNode) {\n                h.conditionClass(this._wrapperNode, \"hidden_elem\", (this._count <= 0));\n            };\n            if ((this._statusClass && this._statusNode)) {\n                h.conditionClass(this._statusNode, this._statusClass, (this._count > 0));\n            };\n        },\n        _subscribeAll: function() {\n            var p = [((o.EVENT_TYPE_ADJUST + \"/\") + this._name),((o.EVENT_TYPE_UPDATE + \"/\") + this._name),];\n            this._arbiterSubscription = g.subscribe(p, this._onInform.bind(this), g.SUBSCRIBE_NEW);\n        },\n        _onInform: function(p, q) {\n            q = parseInt(q);\n            if (isNaN(q)) {\n                return\n            };\n            if ((p.indexOf(o.EVENT_TYPE_ADJUST) != -1)) {\n                this.adjustCount(q);\n            }\n             else if ((p.indexOf(o.EVENT_TYPE_UPDATE) != -1)) {\n                this.setCount(q);\n            }\n             else return\n            \n        ;\n            return;\n        }\n    });\n    e.exports = o;\n});\n__d(\"CacheStorage\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        memory: k,\n        localstorage: i,\n        sessionstorage: j\n    };\n    function i() {\n        this._store = a.localStorage;\n    };\n    i.available = function() {\n        try {\n            return !!a.localStorage;\n        } catch (m) {\n            return false;\n        };\n    };\n    g(i.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; (n < this._store.length); n++) {\n                m.push(this._store.key(n));;\n            };\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function j() {\n        this._store = a.sessionStorage;\n    };\n    j.available = function() {\n        try {\n            return !!a.sessionStorage;\n        } catch (m) {\n            return false;\n        };\n    };\n    g(j.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; (n < this._store.length); n++) {\n                m.push(this._store.key(n));;\n            };\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function k() {\n        this._store = {\n        };\n    };\n    k.available = function() {\n        return true;\n    };\n    g(k.prototype, {\n        keys: function() {\n            return Object.keys(this._store);\n        },\n        get: function(m) {\n            if ((this._store[m] === undefined)) {\n                return null\n            };\n            return this._store[m];\n        },\n        set: function(m, n) {\n            this._store[m] = n;\n        },\n        remove: function(m) {\n            if ((m in this._store)) {\n                delete this._store[m];\n            };\n        },\n        clear: function() {\n            this._store = {\n            };\n        }\n    });\n    function l(m, n) {\n        this._key_prefix = (n || \"_cs_\");\n        this._magic_prefix = \"_@_\";\n        if (((m == \"AUTO\") || !m)) {\n            for (var o in h) {\n                var p = h[o];\n                if (p.available()) {\n                    m = o;\n                    break;\n                }\n            ;\n            }\n        };\n        if (m) {\n            if ((typeof m == \"string\")) {\n                if ((!h[m] || !h[m].available())) {\n                    this._backend = new k();\n                }\n                 else this._backend = new h[m]();\n            ;\n            }\n             else if ((!m.available || !m.available())) {\n                this._backend = new k();\n            }\n             else this._backend = m;\n            \n        \n        };\n    };\n    g(l, {\n        getAllStorageTypes: function() {\n            return Object.keys(h);\n        }\n    });\n    g(l.prototype, {\n        keys: function() {\n            var m = [];\n            try {\n                if (this._backend) {\n                    var o = this._backend.keys();\n                    for (var p = 0; (p < o.length); p++) {\n                        if ((o[p].substr(0, this._key_prefix.length) == this._key_prefix)) {\n                            m.push(o[p].substr(this._key_prefix.length));\n                        };\n                    };\n                }\n            ;\n            } catch (n) {\n            \n            };\n            return m;\n        },\n        set: function(m, n) {\n            if (this._backend) {\n                if ((typeof n == \"string\")) {\n                    n = (this._magic_prefix + n);\n                }\n                 else n = JSON.stringify(n);\n            ;\n                try {\n                    this._backend.set((this._key_prefix + m), n);\n                } catch (o) {\n                \n                };\n            }\n        ;\n        },\n        get: function(m, n) {\n            var o;\n            if (this._backend) {\n                try {\n                    o = this._backend.get((this._key_prefix + m));\n                } catch (p) {\n                    o = null;\n                };\n                if ((o !== null)) {\n                    if ((o.substr(0, this._magic_prefix.length) == this._magic_prefix)) {\n                        o = o.substr(this._magic_prefix.length);\n                    }\n                     else try {\n                        o = JSON.parse(o);\n                    } catch (q) {\n                        o = undefined;\n                    }\n                ;\n                }\n                 else o = undefined;\n            ;\n            }\n        ;\n            if (((o === undefined) && (n !== undefined))) {\n                o = n;\n                if (this._backend) {\n                    var r;\n                    if ((typeof o == \"string\")) {\n                        r = (this._magic_prefix + o);\n                    }\n                     else r = JSON.stringify(o);\n                ;\n                    try {\n                        this._backend.set((this._key_prefix + m), r);\n                    } catch (p) {\n                    \n                    };\n                }\n            ;\n            }\n        ;\n            return o;\n        },\n        remove: function(m) {\n            if (this._backend) {\n                try {\n                    this._backend.remove((this._key_prefix + m));\n                } catch (n) {\n                \n                }\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"Badge\", [\"DOM\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"cx\"), i = function(j) {\n        var k;\n        switch (j) {\n          case \"xsmall\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__xsmall\";\n            break;\n          case \"small\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__small\";\n            break;\n          case \"medium\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__medium\";\n            break;\n          case \"large\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__large\";\n            break;\n          case \"xlarge\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__xlarge\";\n            break;\n        };\n        if (k) {\n            return g.create(\"span\", {\n                className: k\n            })\n        };\n        return null;\n    };\n    e.exports = i;\n});\n__d(\"BasicTypeaheadRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(j, k) {\n        var l = [];\n        if (j.icon) {\n            l.push(h.create(\"img\", {\n                alt: \"\",\n                src: j.icon\n            }));\n        };\n        if (j.text) {\n            var m = [j.text,];\n            if (j.verified) {\n                m.push(g(\"xsmall\"));\n            };\n            l.push(h.create(\"span\", {\n                className: \"text\"\n            }, m));\n        }\n    ;\n        if (j.subtext) {\n            l.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [j.subtext,]));\n        };\n        var n = h.create(\"li\", {\n            className: (j.type || \"\")\n        }, l);\n        if (j.text) {\n            n.setAttribute(\"aria-label\", j.text);\n        };\n        return n;\n    };\n    i.className = \"basic\";\n    e.exports = i;\n});\n__d(\"TypeaheadView\", [\"Event\",\"ArbiterMixin\",\"BasicTypeaheadRenderer\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"BasicTypeaheadRenderer\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"$\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\");\n    function p(q, r) {\n        this.element = this.content = m(q);\n        this.showBadges = r.showBadges;\n        n(this, r);\n    };\n    n(p.prototype, h, {\n        events: [\"highlight\",\"render\",\"reset\",\"select\",\"beforeRender\",\"next\",\"prev\",],\n        renderer: i,\n        autoSelect: false,\n        ignoreMouseover: false,\n        init: function() {\n            this.init = o;\n            this.initializeEvents();\n            this.reset();\n        },\n        initializeEvents: function() {\n            g.listen(this.element, {\n                mouseup: this.mouseup.bind(this),\n                mouseover: this.mouseover.bind(this)\n            });\n        },\n        setTypeahead: function(q) {\n            this.typeahead = q;\n        },\n        setAccessibilityControlElement: function(q) {\n            this.accessibilityElement = q;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        mouseup: function(event) {\n            if ((event.button != 2)) {\n                this.select(true);\n                event.kill();\n            }\n        ;\n        },\n        mouseover: function(event) {\n            if (this.ignoreMouseover) {\n                this.ignoreMouseover = false;\n                return;\n            }\n        ;\n            if (this.visible) {\n                this.highlight(this.getIndex(event));\n            };\n        },\n        reset: function(q) {\n            if (!q) {\n                this.disableAutoSelect = false;\n            };\n            this.justRendered = false;\n            this.justShown = false;\n            this.index = -1;\n            this.items = [];\n            this.results = [];\n            this.value = \"\";\n            this.content.innerHTML = \"\";\n            this.inform(\"reset\");\n            return this;\n        },\n        getIndex: function(event) {\n            return this.items.indexOf(l.byTag(event.getTarget(), \"li\"));\n        },\n        getSelection: function() {\n            var q = (this.results[this.index] || null);\n            return (this.visible ? q : null);\n        },\n        isEmpty: function() {\n            return !this.results.length;\n        },\n        isVisible: function() {\n            return this.visible;\n        },\n        show: function() {\n            j.show(this.element);\n            if ((this.results && this.results.length)) {\n                if (((this.autoSelect && this.accessibilityElement) && this.selected)) {\n                    this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                }\n            };\n            (this.accessibilityElement && this.accessibilityElement.setAttribute(\"aria-expanded\", \"true\"));\n            this.visible = true;\n            return this;\n        },\n        hide: function() {\n            j.hide(this.element);\n            if (this.accessibilityElement) {\n                this.accessibilityElement.setAttribute(\"aria-expanded\", \"false\");\n                this.accessibilityElement.removeAttribute(\"aria-activedescendant\");\n            }\n        ;\n            this.visible = false;\n            return this;\n        },\n        render: function(q, r, s) {\n            this.value = q;\n            if (!r.length) {\n                (this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\"));\n                this.reset(true);\n                return;\n            }\n        ;\n            this.justRendered = true;\n            if (!this.results.length) {\n                this.justShown = true;\n            };\n            var t = {\n                results: r,\n                value: q\n            };\n            this.inform(\"beforeRender\", t);\n            r = t.results;\n            var u = this.getDefaultIndex(r);\n            if (((this.index > 0) && (this.index !== this.getDefaultIndex(this.results)))) {\n                var v = this.results[this.index];\n                for (var w = 0, x = r.length; (w < x); ++w) {\n                    if ((v.uid == r[w].uid)) {\n                        u = w;\n                        break;\n                    }\n                ;\n                };\n            }\n        ;\n            this.results = r;\n            k.setContent(this.content, this.buildResults(r));\n            this.items = this.getItems();\n            this.highlight(u, false);\n            this.inform(\"render\", r);\n        },\n        getItems: function() {\n            return k.scry(this.content, \"li\");\n        },\n        buildResults: function(q) {\n            var r, s = null;\n            if ((typeof this.renderer == \"function\")) {\n                r = this.renderer;\n                s = (this.renderer.className || \"\");\n            }\n             else {\n                r = a.TypeaheadRenderers[this.renderer];\n                s = this.renderer;\n            }\n        ;\n            r = r.bind(this);\n            var t = this.showBadges, u = q.map(function(w, x) {\n                if (!t) {\n                    w.verified = null;\n                };\n                var y = (w.node || r(w, x));\n                y.setAttribute(\"role\", \"option\");\n                return y;\n            }), v = k.create(\"ul\", {\n                className: s,\n                id: (\"typeahead_list_\" + ((this.typeahead ? k.getID(this.typeahead) : k.getID(this.element))))\n            }, u);\n            v.setAttribute(\"role\", \"listbox\");\n            return v;\n        },\n        getDefaultIndex: function(q) {\n            var r = ((this.autoSelect && !this.disableAutoSelect));\n            return (((this.index < 0) && !r) ? -1 : 0);\n        },\n        next: function() {\n            this.highlight((this.index + 1));\n            this.inform(\"next\", this.selected);\n        },\n        prev: function() {\n            this.highlight((this.index - 1));\n            this.inform(\"prev\", this.selected);\n        },\n        getItemText: function(q) {\n            var r = \"\";\n            if (q) {\n                r = q.getAttribute(\"aria-label\");\n                if (!r) {\n                    r = k.getText(q);\n                    q.setAttribute(\"aria-label\", r);\n                }\n            ;\n            }\n        ;\n            return r;\n        },\n        setIsViewingSelectedItems: function(q) {\n            this.viewingSelected = q;\n            return this;\n        },\n        getIsViewingSelectedItems: function() {\n            return this.viewingSelected;\n        },\n        highlight: function(q, r) {\n            var s = true;\n            if (this.selected) {\n                j.removeClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n            if ((q > (this.items.length - 1))) {\n                q = -1;\n            }\n             else if ((q < -1)) {\n                q = (this.items.length - 1);\n            }\n        ;\n            if (((q >= 0) && (q < this.items.length))) {\n                if ((this.selected && (this.getItemText(this.items[q]) === this.getItemText(this.selected)))) {\n                    s = false;\n                };\n                this.selected = this.items[q];\n                j.addClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"true\");\n                if (this.accessibilityElement) {\n                    (function() {\n                        this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                    }).bind(this).defer();\n                };\n            }\n             else (this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\"));\n        ;\n            this.index = q;\n            this.disableAutoSelect = ((q == -1));\n            var t = ((q !== -1)), u = this.getItemText(this.selected);\n            if (((((q !== -1) && this.isVisible()) && u) && this.autoSelect)) {\n                if (this.justShown) {\n                    this.justRendered = false;\n                    this.justShown = false;\n                    t = false;\n                }\n                 else if ((s && this.justRendered)) {\n                    this.justRendered = false;\n                    t = false;\n                }\n                \n            \n            };\n            if ((r !== false)) {\n                this.inform(\"highlight\", {\n                    index: q,\n                    selected: this.results[q],\n                    element: this.selected\n                });\n            };\n        },\n        select: function(q) {\n            var r = this.index, s = this.results[r], t = this.element.getAttribute(\"id\");\n            if (s) {\n                this.inform(\"select\", {\n                    index: r,\n                    clicked: !!q,\n                    selected: s,\n                    id: t,\n                    query: this.value\n                });\n                this.inform(\"afterSelect\");\n            }\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"BucketedTypeaheadView\", [\"Class\",\"DOM\",\"tx\",\"TypeaheadView\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"tx\"), j = b(\"TypeaheadView\"), k = b(\"copyProperties\");\n    function l(m, n) {\n        this.parent.construct(this, m, n);\n    };\n    g.extend(l, j);\n    k(l.prototype, {\n        render: function(m, n, o) {\n            n = this.buildBuckets(m, n);\n            return this.parent.render(m, n, o);\n        },\n        highlight: function(m, n) {\n            if (((m == -1) && (this.index !== 0))) {\n                m = this.index;\n            };\n            while ((((m >= 0) && (m < this.items.length)) && !this.isHighlightable(this.results[m]))) {\n                m = (m + 1);;\n            };\n            this.parent.highlight(m, n);\n        },\n        buildBuckets: function(m, n) {\n            if (((!this.typeObjects || !n) || !n.length)) {\n                return n\n            };\n            var o = [], p = {\n            };\n            for (var q = 0; (q < n.length); ++q) {\n                var r = n[q], s = (r.render_type || r.type);\n                if (!p.hasOwnProperty(s)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                }\n            ;\n                r.classNames = s;\n                r.groupIndex = p[s];\n                r.indexInGroup = (o[r.groupIndex].length - 1);\n                o[r.groupIndex].push(r);\n            };\n            for (s in this.typeObjects) {\n                if ((!p.hasOwnProperty(s) && this.typeObjects[s].show_always)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                    r = this.buildNoResultsEntry();\n                    r.classNames = r.type;\n                    r.groupIndex = p[s];\n                    r.indexInGroup = (o[r.groupIndex].length - 1);\n                    o[r.groupIndex].push(r);\n                }\n            ;\n            };\n            var t = [];\n            if (this.typeObjectsOrder) {\n                for (var u = 0; (u < this.typeObjectsOrder.length); ++u) {\n                    var v = this.typeObjectsOrder[u];\n                    if (p.hasOwnProperty(v)) {\n                        t = t.concat(o[p[v]]);\n                    };\n                };\n            }\n             else for (var w = 0; (w < o.length); ++w) {\n                t = t.concat(o[w]);;\n            }\n        ;\n            return t;\n        },\n        buildNoResultsEntry: function() {\n            return {\n                uid: \"disabled_result\",\n                type: \"disabled_result\",\n                text: \"No Results\"\n            };\n        },\n        buildBucketHeader: function(m) {\n            var n = this.typeObjects[m];\n            if ((n === undefined)) {\n                throw new Error(((m + \" is undefined in \") + JSON.stringify(this.typeObjects)))\n            };\n            if (n.markup) {\n                n.text = n.markup;\n                delete n.markup;\n            }\n        ;\n            return this.typeObjects[m];\n        },\n        buildResults: function(m) {\n            var n = this.parent.buildResults(m);\n            if (this.typeObjects) {\n                return h.create(\"div\", {\n                    className: \"bucketed\"\n                }, [n,]);\n            }\n             else return n\n        ;\n        },\n        isHighlightable: function(m) {\n            return ((m.type != \"header\") && (m.type != \"disabled_result\"));\n        },\n        select: function(m) {\n            var n = this.results[this.index];\n            if ((n && this.isHighlightable(n))) {\n                this.parent.select(m);\n            };\n        },\n        normalizeIndex: function(m) {\n            var n = this.results.length;\n            if ((n === 0)) {\n                return -1;\n            }\n             else if ((m < -1)) {\n                return ((((m % n)) + n) + 1);\n            }\n             else if ((m >= n)) {\n                return (((m % n)) - 1);\n            }\n             else return m\n            \n            \n        ;\n        },\n        getDefaultIndex: function(m) {\n            var n = ((this.autoSelect && !this.disableAutoSelect));\n            if (((this.index < 0) && !n)) {\n                return -1\n            };\n            if ((m.length === 0)) {\n                return -1\n            };\n            var o = 0;\n            while ((!this.isHighlightable(m) && (o < m.length))) {\n                o++;;\n            };\n            return o;\n        },\n        prev: function() {\n            var m = this.results[this.normalizeIndex((this.index - 1))];\n            while ((m && !this.isHighlightable(m))) {\n                this.index = this.normalizeIndex((this.index - 1));\n                m = this.results[this.normalizeIndex((this.index - 1))];\n            };\n            return this.parent.prev();\n        },\n        next: function() {\n            var m = this.results[this.normalizeIndex((this.index + 1))];\n            while ((m && !this.isHighlightable(m))) {\n                this.index = this.normalizeIndex((this.index + 1));\n                m = this.results[this.normalizeIndex((this.index + 1))];\n            };\n            return this.parent.next();\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualTypeaheadView\", [\"BucketedTypeaheadView\",\"CSS\",\"Class\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"ContextualLayerHideOnScroll\",\"DOM\",\"DOMDimensions\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"CSS\"), i = b(\"Class\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerAutoFlip\"), l = b(\"ContextualLayerHideOnScroll\"), m = b(\"DOM\"), n = b(\"DOMDimensions\"), o = b(\"Style\"), p = b(\"copyProperties\");\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n    };\n    i.extend(q, g);\n    p(q.prototype, {\n        init: function() {\n            this.initializeLayer();\n            this.parent.init();\n        },\n        initializeLayer: function() {\n            this.context = this.getContext();\n            this.wrapper = m.create(\"div\");\n            m.appendContent(this.wrapper, this.element);\n            h.addClass(this.element, \"uiContextualTypeaheadView\");\n            this.layer = new j({\n                context: this.context,\n                position: \"below\",\n                alignment: this.alignment,\n                causalElement: this.causalElement,\n                permanent: true\n            }, this.wrapper);\n            this.layer.enableBehavior(l);\n            if ((o.isFixed(this.context) || this.autoflip)) {\n                this.layer.enableBehavior(k);\n            };\n            this.subscribe(\"render\", this.renderLayer.bind(this));\n        },\n        show: function() {\n            if (this.minWidth) {\n                o.set(this.wrapper, \"min-width\", (this.minWidth + \"px\"));\n            }\n             else if (this.width) {\n                o.set(this.wrapper, \"width\", (this.width + \"px\"));\n            }\n             else o.set(this.wrapper, \"width\", (n.getElementDimensions(this.context).width + \"px\"));\n            \n        ;\n            var r = this.parent.show();\n            this.layer.show();\n            return r;\n        },\n        hide: function() {\n            this.layer.hide();\n            return this.parent.hide();\n        },\n        renderLayer: function() {\n            if (!this.isVisible()) {\n                return\n            };\n            if (this.layer.isShown()) {\n                this.layer.updatePosition();\n            }\n             else this.layer.show();\n        ;\n        },\n        clearText: function() {\n            this.layer.getCausalElement().value = \"\";\n        },\n        getContext: function() {\n            return this.element.parentNode;\n        }\n    });\n    e.exports = q;\n});\n__d(\"DOMClone\", [], function(a, b, c, d, e, f) {\n    var g = {\n        shallowClone: function(i) {\n            return h(i, false);\n        },\n        deepClone: function(i) {\n            return h(i, true);\n        }\n    };\n    function h(i, j) {\n        var k = i.cloneNode(j);\n        if ((typeof k.__FB_TOKEN !== \"undefined\")) {\n            delete k.__FB_TOKEN;\n        };\n        return k;\n    };\n    e.exports = g;\n});\n__d(\"Dcode\", [], function(a, b, c, d, e, f) {\n    var g, h = {\n    }, i = {\n        _: \"%\",\n        A: \"%2\",\n        B: \"000\",\n        C: \"%7d\",\n        D: \"%7b%22\",\n        E: \"%2c%22\",\n        F: \"%22%3a\",\n        G: \"%2c%22ut%22%3a1\",\n        H: \"%2c%22bls%22%3a\",\n        I: \"%2c%22n%22%3a%22%\",\n        J: \"%22%3a%7b%22i%22%3a0%7d\",\n        K: \"%2c%22pt%22%3a0%2c%22vis%22%3a\",\n        L: \"%2c%22ch%22%3a%7b%22h%22%3a%22\",\n        M: \"%7b%22v%22%3a2%2c%22time%22%3a1\",\n        N: \".channel%22%2c%22sub%22%3a%5b\",\n        O: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b\",\n        P: \"%2c%22ud%22%3a100%2c%22lc%22%3a0\",\n        Q: \"%5d%2c%22f%22%3anull%2c%22uct%22%3a\",\n        R: \".channel%22%2c%22sub%22%3a%5b1%5d\",\n        S: \"%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a\",\n        T: \"%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        U: \"%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        V: \"%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a\",\n        W: \"%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\",\n        X: \"%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1\",\n        Y: \"%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        Z: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\"\n    };\n    (function() {\n        var k = [];\n        for (var l in i) {\n            h[i[l]] = l;\n            k.push(i[l]);\n        };\n        k.reverse();\n        g = new RegExp(k.join(\"|\"), \"g\");\n    })();\n    var j = {\n        encode: function(k) {\n            return encodeURIComponent(k).replace(/([_A-Z])|%../g, function(l, m) {\n                return (m ? (\"%\" + m.charCodeAt(0).toString(16)) : l);\n            }).toLowerCase().replace(g, function(l) {\n                return h[l];\n            });\n        },\n        decode: function(k) {\n            return decodeURIComponent(k.replace(/[_A-Z]/g, function(l) {\n                return i[l];\n            }));\n        }\n    };\n    e.exports = j;\n});\n__d(\"FileInput\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"DOMClone\",\"Focus\",\"UserAgent\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMClone\"), k = b(\"Focus\"), l = b(\"UserAgent\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = l.ie();\n    function p(q, r, s) {\n        this.container = q;\n        this.control = r;\n        this.input = s;\n        var t = i.scry(this.container, \"a\")[0];\n        (t && t.removeAttribute(\"href\"));\n        var u = i.create(\"div\", {\n            className: \"-cx-PRIVATE-uiFileInput__wrap\"\n        }, this.input);\n        i.appendContent(this.control, u);\n        this._initListeners();\n    };\n    m(p.prototype, h, {\n        getValue: function() {\n            return this.input.value;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        clear: function() {\n            if (o) {\n                var q = j.deepClone(this.input);\n                i.replace(this.input, q);\n                this.input = q;\n                while (this._listeners.length) {\n                    this._listeners.pop().remove();;\n                };\n                this._initListeners();\n            }\n             else {\n                this.input.value = \"\";\n                this.input.files = null;\n            }\n        ;\n        },\n        _initListeners: function() {\n            k.relocate(this.input, this.control);\n            this._listeners = [g.listen(this.input, \"change\", this._handleChange.bind(this)),];\n        },\n        _handleChange: function(event) {\n            this.inform(\"change\", event);\n            var q = this.input.form;\n            if ((q && (o < 9))) {\n                g.fire(q, \"change\", event);\n            };\n        }\n    });\n    e.exports = p;\n});\n__d(\"Poller\", [\"ArbiterMixin\",\"AsyncRequest\",\"Cookie\",\"Env\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"Cookie\"), j = b(\"Env\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(p) {\n        this._config = k({\n            clearOnQuicklingEvents: true,\n            setupRequest: l,\n            interval: null,\n            maxRequests: Infinity,\n            dontStart: false\n        }, p);\n        if (!this._config.dontStart) {\n            this.start();\n        };\n    };\n    m.MIN_INTERVAL = 2000;\n    k(m.prototype, g, {\n        start: function() {\n            if (this._polling) {\n                return this\n            };\n            this._requests = 0;\n            this.request();\n            return this;\n        },\n        stop: function() {\n            this._cancelRequest();\n            return this;\n        },\n        mute: function() {\n            this._muted = true;\n            return this;\n        },\n        resume: function() {\n            if (this._muted) {\n                this._muted = false;\n                if ((!this._handle && this._polling)) {\n                    return this.request()\n                };\n            }\n        ;\n            return this;\n        },\n        skip: function() {\n            this._skip = true;\n            return this;\n        },\n        reset: function() {\n            return this.stop().start();\n        },\n        request: function() {\n            this._cancelRequest();\n            this._polling = true;\n            if (!o()) {\n                return this._done()\n            };\n            if (this._muted) {\n                return this\n            };\n            if ((++this._requests > this._config.maxRequests)) {\n                return this._done()\n            };\n            var p = new h(), q = false;\n            p.setInitialHandler(function() {\n                return !q;\n            });\n            this._cancelRequest = function() {\n                q = true;\n                this._cleanup();\n            }.bind(this);\n            p.setFinallyHandler(n.bind(this));\n            p.setInitialHandler = l;\n            p.setFinallyHandler = l;\n            this._config.setupRequest(p, this);\n            if (this._skip) {\n                this._skip = false;\n                n.bind(this).defer();\n            }\n             else p.send();\n        ;\n            return this;\n        },\n        isPolling: function() {\n            return this._polling;\n        },\n        isMuted: function() {\n            return this._muted;\n        },\n        setInterval: function(p) {\n            if (p) {\n                this._config.interval = p;\n                this.start();\n            }\n        ;\n        },\n        getInterval: function() {\n            return this._config.interval;\n        },\n        _cleanup: function() {\n            if (this._handle) {\n                clearTimeout(this._handle);\n            };\n            this._handle = null;\n            this._cancelRequest = l;\n            this._polling = false;\n        },\n        _done: function() {\n            this._cleanup();\n            this.inform(\"done\", {\n                sender: this\n            });\n            return this;\n        },\n        _config: null,\n        _requests: 0,\n        _muted: false,\n        _polling: false,\n        _skip: false,\n        _cancelRequest: l\n    });\n    function n() {\n        if (!this._polling) {\n            return\n        };\n        if ((this._requests < this._config.maxRequests)) {\n            var p = this._config.interval;\n            p = ((typeof p === \"function\") ? p(this._requests) : p);\n            this._handle = this.request.bind(this).defer((((p > m.MIN_INTERVAL)) ? p : m.MIN_INTERVAL), this._config.clearOnQuicklingEvents);\n        }\n         else this._done();\n    ;\n    };\n    function o() {\n        return (j.user == i.get(\"c_user\"));\n    };\n    e.exports = m;\n});\n__d(\"SystemEvents\", [\"Arbiter\",\"Env\",\"ErrorUtils\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"ErrorUtils\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = new g(), m = [], n = 1000;\n    setInterval(function() {\n        for (var w = 0; (w < m.length); w++) {\n            m[w]();;\n        };\n    }, n, false);\n    function o() {\n        return (((/c_user=(\\d+)/.test(document.cookie) && RegExp.$1)) || 0);\n    };\n    var p = h.user, q = navigator.onLine;\n    function r() {\n        if (!q) {\n            q = true;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    };\n    function s() {\n        if (q) {\n            q = false;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    };\n    if (j.ie()) {\n        if ((j.ie() >= 8)) {\n            window.attachEvent(\"onload\", function() {\n                document.body.ononline = r;\n                document.body.onoffline = s;\n            });\n        }\n         else m.push(function() {\n            ((navigator.onLine ? r : s))();\n        });\n    ;\n    }\n     else if (window.addEventListener) {\n        if (!j.chrome()) {\n            window.addEventListener(\"online\", r, false);\n            window.addEventListener(\"offline\", s, false);\n        }\n    \n    }\n;\n    var t = p;\n    m.push(function() {\n        var w = o();\n        if ((t != w)) {\n            l.inform(l.USER, w);\n            t = w;\n        }\n    ;\n    });\n    var u = Date.now();\n    function v() {\n        var w = Date.now(), x = (w - u), y = ((x < 0) || (x > 10000));\n        u = w;\n        if (y) {\n            l.inform(l.TIME_TRAVEL, x);\n        };\n        return y;\n    };\n    m.push(v);\n    m.push(function() {\n        if ((window.onerror != i.onerror)) {\n            window.onerror = i.onerror;\n        };\n    });\n    k(l, {\n        USER: \"SystemEvents/USER\",\n        ONLINE: \"SystemEvents/ONLINE\",\n        TIME_TRAVEL: \"SystemEvents/TIME_TRAVEL\",\n        isPageOwner: function(w) {\n            return (((w || o())) == p);\n        },\n        isOnline: function() {\n            return (j.chrome() || q);\n        },\n        checkTimeTravel: v\n    });\n    e.exports = l;\n});\n__d(\"Typeahead\", [\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"DataStore\",\"Event\",\"Parent\",\"Run\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"BehaviorsMixin\"), i = b(\"DOM\"), j = b(\"DataStore\"), k = b(\"Event\"), l = b(\"Parent\"), m = b(\"Run\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\"), p = b(\"ge\");\n    function q(r, s, t, u) {\n        this.args = {\n            data: r,\n            view: s,\n            core: t\n        };\n        j.set(u, \"Typeahead\", this);\n        this.element = u;\n    };\n    q.getInstance = function(r) {\n        var s = l.byClass(r, \"uiTypeahead\");\n        return (s ? j.get(s, \"Typeahead\") : null);\n    };\n    n(q.prototype, g, h, {\n        init: function(r) {\n            this.init = o;\n            this.getCore();\n            this.getView().setAccessibilityControlElement(this.getCore().getElement());\n            this.proxyEvents();\n            this.initBehaviors((r || []));\n            this.inform(\"init\", this);\n            this.data.bootstrap();\n            this.core.focus();\n        },\n        getData: function() {\n            if (!this.data) {\n                var r = this.args.data;\n                this.data = r;\n                this.data.init();\n            }\n        ;\n            return this.data;\n        },\n        getView: function() {\n            if (!this.view) {\n                var r = this.args.view, s = (r.node || p(r.node_id));\n                if (!s) {\n                    s = i.create(\"div\", {\n                        className: \"uiTypeaheadView\"\n                    });\n                    i.appendContent(this.element, s);\n                }\n            ;\n                if ((typeof r.ctor === \"string\")) {\n                    this.view = new window[r.ctor](s, (r.options || {\n                    }));\n                }\n                 else this.view = new r.ctor(s, (r.options || {\n                }));\n            ;\n                this.view.init();\n                this.view.setTypeahead(this.element);\n            }\n        ;\n            return this.view;\n        },\n        getCore: function() {\n            if (!this.core) {\n                var r = this.args.core;\n                if ((typeof r.ctor === \"string\")) {\n                    this.core = new window[r.ctor]((r.options || {\n                    }));\n                }\n                 else this.core = new r.ctor((r.options || {\n                }));\n            ;\n                this.core.init(this.getData(), this.getView(), this.getElement());\n            }\n        ;\n            return this.core;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        swapData: function(r) {\n            var s = this.core;\n            this.data = this.args.data = r;\n            r.init();\n            if (s) {\n                s.data = r;\n                s.initData();\n                s.reset();\n            }\n        ;\n            r.bootstrap();\n            return r;\n        },\n        proxyEvents: function() {\n            [this.data,this.view,this.core,].forEach(function(r) {\n                r.subscribe(r.events, this.inform.bind(this));\n            }, this);\n        },\n        initBehaviors: function(r) {\n            r.forEach(function(s) {\n                if ((typeof s === \"string\")) {\n                    if ((a.TypeaheadBehaviors && a.TypeaheadBehaviors[s])) {\n                        a.TypeaheadBehaviors[s](this);\n                    }\n                     else m.onLoad(function() {\n                        if (a.TypeaheadBehaviors) {\n                            ((a.TypeaheadBehaviors[s] || o))(this);\n                        };\n                    }.bind(this));\n                ;\n                }\n                 else this.enableBehavior(s);\n            ;\n            }, this);\n        }\n    });\n    q.initNow = function(r, s, t) {\n        if (t) {\n            t.init(r);\n        };\n        r.init(s);\n    };\n    q.init = function(r, s, t, u) {\n        if (!i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            r = (i.scry(r, \"input\")[0] || i.scry(r, \"textarea\")[0]);\n        };\n        var v = false;\n        try {\n            v = (document.activeElement === r);\n        } catch (w) {\n        \n        };\n        if (v) {\n            q.initNow(s, t, u);\n        }\n         else var x = k.listen(r, \"focus\", function() {\n            q.initNow(s, t, u);\n            x.remove();\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"TypeaheadCore\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"Focus\",\"Input\",\"InputSelection\",\"Keys\",\"StickyPlaceholderInput\",\"UserAgent\",\"bind\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"Input\"), n = b(\"InputSelection\"), o = b(\"Keys\"), p = b(\"StickyPlaceholderInput\"), q = b(\"UserAgent\"), r = b(\"bind\"), s = b(\"copyProperties\"), t = b(\"emptyFunction\");\n    function u(v) {\n        s(this, v);\n    };\n    s(u.prototype, i, {\n        events: [\"blur\",\"focus\",\"click\",\"unselect\",\"loading\",],\n        keepFocused: true,\n        resetOnSelect: false,\n        resetOnKeyup: true,\n        setValueOnSelect: false,\n        queryTimeout: 250,\n        preventFocusChangeOnTab: false,\n        init: function(v, w, x) {\n            this.init = t;\n            this.data = v;\n            this.view = w;\n            this.root = x;\n            this.initInput();\n            this.inputWrap = k.find(x, \"div.wrap\");\n            this.hiddenInput = k.find(x, \"input.hiddenInput\");\n            this.value = \"\";\n            this.nextQuery = null;\n            this.selectedText = null;\n            if ((this.setValueOnSelect && j.hasClass(this.inputWrap, \"selected\"))) {\n                this.selectedText = this.getValue();\n            };\n            this.initView();\n            this.initData();\n            this.initEvents();\n            this.initToggle();\n            this._exclusions = [];\n        },\n        initInput: function() {\n            this.element = k.find(this.root, \".textInput\");\n            var v = k.scry(this.element, \"input\")[0];\n            if (v) {\n                this.element = v;\n            };\n        },\n        initView: function() {\n            this.view.subscribe(\"highlight\", l.set.curry(this.element));\n            this.view.subscribe(\"select\", function(v, w) {\n                this.select(w.selected);\n            }.bind(this));\n            this.view.subscribe(\"afterSelect\", function() {\n                this.afterSelect();\n            }.bind(this));\n        },\n        initData: function() {\n            this.data.subscribe(\"respond\", function(v, w) {\n                if ((w.forceDisplay || ((w.value == this.getValue()) && !this.element.disabled))) {\n                    this.view.render(w.value, w.results, w.isAsync);\n                };\n            }.bind(this));\n            this.data.subscribe(\"activity\", function(v, w) {\n                this.fetching = w.activity;\n                if (!this.fetching) {\n                    (this.nextQuery && this.performQuery());\n                };\n                if ((this.loading != this.fetching)) {\n                    this.loading = this.fetching;\n                    this.inform(\"loading\", {\n                        loading: this.loading\n                    });\n                }\n            ;\n            }.bind(this));\n        },\n        initEvents: function() {\n            g.listen(this.view.getElement(), {\n                mouseup: this.viewMouseup.bind(this),\n                mousedown: this.viewMousedown.bind(this)\n            });\n            var v = {\n                blur: r(this, \"blur\"),\n                focus: r(this, \"focus\"),\n                click: r(this, \"click\"),\n                keyup: r(this, \"keyup\"),\n                keydown: r(this, \"keydown\")\n            };\n            if (q.firefox()) {\n                v.text = v.keyup;\n            };\n            if ((q.firefox() < 4)) {\n                v.keypress = v.keydown;\n                delete v.keydown;\n            }\n        ;\n            g.listen(this.element, v);\n            g.listen(this.element, \"keypress\", r(this, \"keypress\"));\n        },\n        initToggle: function() {\n            this.subscribe(\"blur\", this.view.hide.bind(this.view));\n            this.subscribe(\"focus\", this.view.show.bind(this.view));\n        },\n        viewMousedown: function() {\n            this.selecting = true;\n        },\n        viewMouseup: function() {\n            this.selecting = false;\n        },\n        blur: function() {\n            if (this.selecting) {\n                this.selecting = false;\n                return;\n            }\n        ;\n            this.inform(\"blur\");\n        },\n        click: function() {\n            var v = n.get(this.element);\n            if ((v.start == v.end)) {\n                this.element.select();\n            };\n            this.inform(\"click\");\n        },\n        focus: function() {\n            this.checkValue();\n            this.inform(\"focus\");\n        },\n        keyup: function() {\n            if ((this.resetOnKeyup && !this.getValue())) {\n                this.view.reset();\n            };\n            this.checkValue();\n        },\n        keydown: function(event) {\n            if ((!this.view.isVisible() || this.view.isEmpty())) {\n                this.checkValue.bind(this).defer();\n                return;\n            }\n        ;\n            switch (g.getKeyCode(event)) {\n              case o.TAB:\n                this.handleTab(event);\n                return;\n              case o.UP:\n                this.view.prev();\n                break;\n              case o.DOWN:\n                this.view.next();\n                break;\n              case o.ESC:\n                this.view.reset();\n                break;\n              default:\n                this.checkValue.bind(this).defer();\n                return;\n            };\n            event.kill();\n        },\n        keypress: function(event) {\n            if ((this.view.getSelection() && (g.getKeyCode(event) == o.RETURN))) {\n                this.view.select();\n                event.kill();\n            }\n        ;\n        },\n        handleTab: function(event) {\n            if (this.preventFocusChangeOnTab) {\n                if (this.view.getSelection()) {\n                    event.kill();\n                }\n                 else event.prevent();\n            \n            };\n            this.view.select();\n        },\n        select: function(v) {\n            if ((v && this.setValueOnSelect)) {\n                this.setValue(v.text);\n                this.setHiddenValue(v.uid);\n                this.selectedText = v.text;\n                j.addClass(this.inputWrap, \"selected\");\n            }\n        ;\n        },\n        afterSelect: function() {\n            (this.keepFocused ? l.set(this.element) : this.element.blur());\n            (this.resetOnSelect ? this.reset() : this.view.reset());\n        },\n        unselect: function() {\n            if (this.setValueOnSelect) {\n                this.selectedText = null;\n                j.removeClass(this.inputWrap, \"selected\");\n            }\n        ;\n            this.setHiddenValue();\n            this.inform(\"unselect\", this);\n        },\n        setEnabled: function(v) {\n            var w = (v === false);\n            this.element.disabled = w;\n            j.conditionClass(this.root, \"uiTypeaheadDisabled\", w);\n        },\n        reset: function() {\n            this.unselect();\n            this.setValue();\n            (!this.keepFocused && m.reset(this.element));\n            this.view.reset();\n            this.inform(\"reset\");\n        },\n        getElement: function() {\n            return this.element;\n        },\n        setExclusions: function(v) {\n            this._exclusions = v;\n        },\n        getExclusions: function() {\n            return this._exclusions;\n        },\n        setValue: function(v) {\n            this.value = this.nextQuery = (v || \"\");\n            m.setValue(this.element, this.value);\n            p.update(this.element);\n        },\n        setHiddenValue: function(v) {\n            this.hiddenInput.value = (((v || (v === 0))) ? v : \"\");\n            h.inform(\"Form/change\", {\n                node: this.hiddenInput\n            });\n        },\n        getValue: function() {\n            return m.getValue(this.element);\n        },\n        getHiddenValue: function() {\n            return (this.hiddenInput.value || \"\");\n        },\n        checkValue: function() {\n            var v = this.getValue();\n            if ((v == this.value)) {\n                return\n            };\n            if ((this.selectedText && (this.selectedText != v))) {\n                this.unselect();\n            };\n            var w = Date.now(), x = (w - this.time);\n            this.time = w;\n            this.value = this.nextQuery = v;\n            this.performQuery(x);\n        },\n        performQuery: function(v) {\n            if (this.selectedText) {\n                return\n            };\n            v = (v || 0);\n            if ((this.fetching && (v < this.queryTimeout))) {\n                this.data.query(this.nextQuery, true, this._exclusions, v);\n            }\n             else {\n                this.data.query(this.nextQuery, false, this._exclusions, v);\n                this.nextQuery = null;\n            }\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"setIntervalAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return setInterval(h, i, false);\n    };\n    e.exports = g;\n});\n__d(\"PresenceCookieManager\", [\"Cookie\",\"Dcode\",\"ErrorUtils\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"URI\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Dcode\"), i = b(\"ErrorUtils\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"PresenceUtil\"), m = b(\"URI\"), n = b(\"PresenceInitialData\"), o = n.cookieVersion, p = n.dictEncode, q = \"presence\", r = {\n    }, s = null, t = null, u = k.create(\"presence_cookie\");\n    function v() {\n        try {\n            var z = g.get(q);\n            if ((s !== z)) {\n                s = z;\n                t = null;\n                if ((z && (z.charAt(0) == \"E\"))) {\n                    z = h.decode(z.substring(1));\n                };\n                if (z) {\n                    t = JSON.parse(z);\n                };\n            }\n        ;\n            if ((t && ((!t.user || (t.user === j.user))))) {\n                return t\n            };\n        } catch (y) {\n            u.warn(\"getcookie_error\");\n        };\n        return null;\n    };\n    function w() {\n        return parseInt((Date.now() / 1000), 10);\n    };\n    var x = {\n        register: function(y, z) {\n            r[y] = z;\n        },\n        store: function() {\n            var y = v();\n            if (((y && y.v) && (o < y.v))) {\n                return\n            };\n            var z = {\n                v: o,\n                time: w(),\n                user: j.user\n            };\n            for (var aa in r) {\n                z[aa] = i.applyWithGuard(r[aa], r, [(y && y[aa]),], function(ea) {\n                    ea.presence_subcookie = aa;\n                });;\n            };\n            var ba = JSON.stringify(z);\n            if (p) {\n                ba = (\"E\" + h.encode(ba));\n            };\n            if (l.hasUserCookie()) {\n                var ca = ba.length;\n                if ((ca > 1024)) {\n                    u.warn(\"big_cookie\", ca);\n                };\n                var da = (m.getRequestURI(false).isSecure() && !!g.get(\"csm\"));\n                g.set(q, ba, null, null, da);\n            }\n        ;\n        },\n        clear: function() {\n            g.clear(q);\n        },\n        getSubCookie: function(y) {\n            var z = v();\n            if (!z) {\n                return null\n            };\n            return z[y];\n        }\n    };\n    e.exports = x;\n});\n__d(\"PresenceState\", [\"Arbiter\",\"ErrorUtils\",\"JSLogger\",\"PresenceCookieManager\",\"copyProperties\",\"debounceAcrossTransitions\",\"setIntervalAcrossTransitions\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"JSLogger\"), j = b(\"PresenceCookieManager\"), k = b(\"copyProperties\"), l = b(\"debounceAcrossTransitions\"), m = b(\"setIntervalAcrossTransitions\"), n = b(\"PresenceInitialData\"), o = (n.cookiePollInterval || 2000), p = [], q = [], r = null, s = null, t = 0, u = null, v = 0, w = [\"sb2\",\"t2\",\"lm2\",\"uct2\",\"tr\",\"tw\",\"at\",\"wml\",], x = i.create(\"presence_state\");\n    function y() {\n        return j.getSubCookie(\"state\");\n    };\n    function z() {\n        t = Date.now();\n        j.store();\n        da(s);\n    };\n    var aa = l(z, 0);\n    function ba(ia) {\n        if (((((typeof ia == \"undefined\") || isNaN(ia)) || (ia == Number.POSITIVE_INFINITY)) || (ia == Number.NEGATIVE_INFINITY))) {\n            ia = 0;\n        };\n        return ia;\n    };\n    function ca(ia) {\n        var ja = {\n        };\n        if (ia) {\n            w.forEach(function(ma) {\n                ja[ma] = ia[ma];\n            });\n            if ((t < ia.ut)) {\n                x.error(\"new_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            };\n        }\n    ;\n        ja.ut = t;\n        for (var ka = 0, la = p.length; (ka < la); ka++) {\n            h.applyWithGuard(p[ka], null, [ja,]);;\n        };\n        s = ja;\n        return s;\n    };\n    function da(ia) {\n        v++;\n        t = ba(ia.ut);\n        if (!r) {\n            r = m(ga, o);\n        };\n        s = ia;\n        if ((u === null)) {\n            u = ia;\n        };\n        for (var ja = 0, ka = q.length; (ja < ka); ja++) {\n            h.applyWithGuard(q[ja], null, [ia,]);;\n        };\n        v--;\n    };\n    function ea(ia) {\n        if ((ia && ia.ut)) {\n            if ((t < ia.ut)) {\n                return true;\n            }\n             else if ((ia.ut < t)) {\n                x.error(\"old_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n        \n        };\n        return false;\n    };\n    function fa() {\n        var ia = y();\n        if (ea(ia)) {\n            s = ia;\n        };\n        return s;\n    };\n    function ga() {\n        var ia = y();\n        if (ea(ia)) {\n            da(ia);\n        };\n    };\n    j.register(\"state\", ca);\n    g.subscribe(i.DUMP_EVENT, function(ia, ja) {\n        ja.presence_state = {\n            initial: k({\n            }, u),\n            state: k({\n            }, s),\n            update_time: t,\n            sync_paused: v,\n            poll_time: o\n        };\n    });\n    (function() {\n        var ia = fa();\n        if (ia) {\n            da(ia);\n        }\n         else {\n            x.debug(\"no_cookie_initial\");\n            da(ca());\n            return;\n        }\n    ;\n    })();\n    var ha = {\n        doSync: function(ia) {\n            if (v) {\n                return\n            };\n            if (ia) {\n                z();\n            }\n             else aa();\n        ;\n        },\n        registerStateStorer: function(ia) {\n            p.push(ia);\n        },\n        registerStateLoader: function(ia) {\n            q.push(ia);\n        },\n        get: function() {\n            return fa();\n        },\n        getInitial: function() {\n            return u;\n        },\n        verifyNumber: ba\n    };\n    e.exports = ha;\n});\n__d(\"TypeaheadBestName\", [\"TypeaheadUtil\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TypeaheadUtil\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n    i.prototype.enable = function() {\n        var j = this._typeahead.getView();\n        this._subscription = j.subscribe(\"beforeRender\", function(k, l) {\n            var m = l.value;\n            for (var n = 0; (n < l.results.length); ++n) {\n                var o = l.results[n];\n                if ((o.alternate_names == null)) {\n                    continue;\n                };\n                if (g.isQueryMatch(m, o.default_name)) {\n                    o.text = o.default_name;\n                    return;\n                }\n            ;\n                for (var p = 0; (p < o.alternate_names.length); p++) {\n                    if (g.isQueryMatch(m, o.alternate_names[p])) {\n                        o.text = o.alternate_names[p];\n                        return;\n                    }\n                ;\n                };\n                o.text = o.default_name;\n            };\n        });\n    };\n    i.prototype.disable = function() {\n        this._typeahead.getView().unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:BestNameTypeaheadBehavior\", [\"TypeaheadBestName\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadBestName\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.buildBestAvailableNames = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypingDetector\", [\"Event\",\"function-extensions\",\"ArbiterMixin\",\"Input\",\"Run\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"Input\"), j = b(\"Run\"), k = b(\"copyProperties\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\");\n    function n(o) {\n        this._input = o;\n        this._ignoreKeys = {\n        };\n    };\n    n.INACTIVE = 0;\n    n.TYPING = 1;\n    n.QUITTING = 2;\n    k(n.prototype, h, {\n        _timeout: 7000,\n        _currentState: n.INACTIVE,\n        init: function() {\n            this.init = m;\n            this.reset();\n            g.listen(this._input, \"keyup\", this._update.bind(this));\n            j.onUnload(this._onunload.bind(this));\n        },\n        reset: function() {\n            clearTimeout(this._checkTimer);\n            this._checkTimer = null;\n            this._lastKeystrokeAt = null;\n            this._currentState = n.INACTIVE;\n        },\n        setIgnoreKeys: function(o) {\n            this._ignoreKeys = l(o);\n        },\n        _onunload: function() {\n            if ((this._currentState == n.TYPING)) {\n                this._transition(n.QUITTING);\n            };\n        },\n        _update: function(event) {\n            var o = g.getKeyCode(event), p = this._currentState;\n            if (!this._ignoreKeys[o]) {\n                if ((i.getValue(this._input).trim().length === 0)) {\n                    if ((p == n.TYPING)) {\n                        this._transition(n.INACTIVE);\n                    };\n                }\n                 else if ((p == n.TYPING)) {\n                    this._recordKeystroke();\n                }\n                 else if ((p == n.INACTIVE)) {\n                    this._transition(n.TYPING);\n                    this._recordKeystroke();\n                }\n                \n                \n            \n            };\n        },\n        _transition: function(o) {\n            this.reset();\n            this._currentState = o;\n            this.inform(\"change\", o);\n        },\n        _recordKeystroke: function() {\n            this._lastKeystrokeTime = Date.now();\n            if (!this._checkTimer) {\n                this._checkTimer = this._checkTyping.bind(this).defer(this._timeout);\n            };\n        },\n        _checkTyping: function() {\n            var o = (this._lastKeystrokeTime + this._timeout), p = Date.now();\n            if ((p > o)) {\n                this._transition(n.INACTIVE);\n            }\n             else {\n                clearTimeout(this._checkTimer);\n                this._checkTimer = this._checkTyping.bind(this).defer(((o - p) + 10));\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"ClearableTypeahead\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = {\n        resetOnCloseButtonClick: function(i, j) {\n            g.listen(j, \"click\", function() {\n                var k = i.getCore();\n                k.getElement().focus();\n                k.reset();\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"TypeaheadShowLoadingIndicator\", [\"CSS\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._typeahead.subscribe(\"loading\", function(j, k) {\n                g.conditionClass(this._typeahead.getElement(), \"typeaheadLoading\", k.loading);\n                g.conditionClass(this._typeahead.getView().getElement(), \"typeaheadViewLoading\", k.loading);\n            }.bind(this));\n        },\n        disable: function() {\n            this._typeahead.unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:ShowLoadingIndicatorTypeaheadBehavior\", [\"TypeaheadShowLoadingIndicator\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadShowLoadingIndicator\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.showLoadingIndicator = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"CompactTypeaheadRenderer\", [\"Badge\",\"DOM\",\"TypeaheadFacepile\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"TypeaheadFacepile\");\n    function j(k, l) {\n        var m = [];\n        if (k.xhp) {\n            return h.create(\"li\", {\n                className: \"raw\"\n            }, k.xhp)\n        };\n        var n = (k.photos || k.photo);\n        if (n) {\n            if ((n instanceof Array)) {\n                n = i.render(n);\n            }\n             else n = h.create(\"img\", {\n                alt: \"\",\n                src: n\n            });\n        ;\n            m.push(n);\n        }\n    ;\n        if (k.text) {\n            var o = [k.text,];\n            if (k.verified) {\n                o.push(g(\"xsmall\"));\n            };\n            m.push(h.create(\"span\", {\n                className: \"text\"\n            }, o));\n        }\n    ;\n        var p = k.subtext, q = k.category;\n        if ((p || q)) {\n            var r = [];\n            (p && r.push(p));\n            ((p && q) && r.push(\" \\u00b7 \"));\n            (q && r.push(q));\n            m.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, r));\n        }\n    ;\n        var s = h.create(\"li\", {\n            className: (k.type || \"\")\n        }, m);\n        if (k.text) {\n            s.setAttribute(\"aria-label\", k.text);\n        };\n        return s;\n    };\n    j.className = \"compact\";\n    e.exports = j;\n});\n__d(\"URLMatcher\", [], function(a, b, c, d, e, f) {\n    var g = \"!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\", h = \"\\u2000-\\u206f\\u00ab\\u00bb\\uff08\\uff09\", i = \"(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\", j = \"(?:(?:ht|f)tps?)://\", k = ((((\"(?:(?:\" + i) + \"[.]){3}\") + i) + \")\"), l = \"\\\\[(?:(?:[A-Za-z0-9]{1,4}::?){1,7}[A-Za-z0-9]{1,4})\\\\]\", m = \"(?:\\\\b)www\\\\d{0,3}[.]\", n = (((\"[^\\\\s\" + g) + h) + \"]\"), o = ((((((\"(?:(?:(?:[.:\\\\-_%@]|\" + n) + \")*\") + n) + \")|\") + l) + \")\"), p = \"(?:[.][a-z]{2,4})\", q = \"(?::\\\\d+){0,1}\", r = \"(?=[/?#])\", s = ((((((((((((((((((((((((((\"(?:\" + \"(?:\") + j) + o) + q) + \")|\") + \"(?:\") + k) + q) + \")|\") + \"(?:\") + l) + q) + \")|\") + \"(?:\") + m) + o) + p) + q) + \")|\") + \"(?:\") + o) + p) + q) + r) + \")\") + \")\"), t = \"[/#?]\", u = \"\\\\([^\\\\s()\\u003C\\u003E]+\\\\)\", v = \"[^\\\\s()\\u003C\\u003E?#]+\", w = new RegExp(s, \"im\"), x = (((((((((((\"(?:\" + \"(?:\") + t) + \")\") + \"(?:\") + \"(?:\") + u) + \"|\") + v) + \")*\") + \")*\") + \")*\"), y = new RegExp((((((((\"(\" + \"(?:\") + s) + \")\") + \"(?:\") + x) + \")\") + \")\"), \"im\"), z = new RegExp(((((((((((((\"(\" + \"(?:\") + j) + o) + q) + \")|\") + \"(?:\") + m) + o) + p) + q) + \")\") + \")\")), aa = /[\\s'\";]/, ba = new RegExp(t, \"im\"), ca = new RegExp(\"[\\\\s!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\\u00ab\\u00bb\\u2000-\\u206f\\uff08\\uff09]\", \"im\"), da = new RegExp(\"[\\\\s()\\u003C\\u003E?#]\", \"im\"), ea = new RegExp(\"\\\\s()\\u003C\\u003E\"), fa = function(ma) {\n        if ((ma && (ma.indexOf(\"@\") != -1))) {\n            return ((z.exec(ma)) ? ma : null);\n        }\n         else return ma\n    ;\n    }, ga = function(ma) {\n        return ha(ma, y);\n    }, ha = function(ma, na) {\n        var oa = (((na.exec(ma) || []))[1] || null);\n        return fa(oa);\n    }, ia = function(ma) {\n        return w.exec(ma);\n    }, ja = function(ma) {\n        return !aa.test(ma.charAt((ma.length - 1)));\n    }, ka = function(ma) {\n        var na = w.exec(ma);\n        if (!na) {\n            return null\n        };\n        var oa = ma.substr((na.index + na[0].length));\n        if (((oa.length === 0) || !(ba.test(oa[0])))) {\n            return fa(na[0])\n        };\n        var pa = 0, qa = 0, ra = 1, sa = 0, ta = qa;\n        for (var ua = 1; (ua < oa.length); ua++) {\n            var va = oa[ua];\n            if ((ta === qa)) {\n                if ((va === \"(\")) {\n                    sa = (sa + 1);\n                    ta = ra;\n                }\n                 else if ((ba.test(va) || !(ca.test(va)))) {\n                    pa = ua;\n                }\n                 else if (da.test(va)) {\n                    break;\n                }\n                \n            ;\n            }\n             else if ((va === \"(\")) {\n                sa = (sa + 1);\n            }\n             else if ((va === \")\")) {\n                sa = (sa - 1);\n                if ((sa === 0)) {\n                    ta = qa;\n                    pa = ua;\n                }\n            ;\n            }\n             else if (ea.test(va)) {\n                break;\n            }\n            \n            \n        ;\n        };\n        return fa((na[0] + oa.substring(0, (pa + 1))));\n    }, la = {\n    };\n    la.permissiveMatch = ga;\n    la.matchToPattern = ha;\n    la.matchHost = ia;\n    la.trigger = ja;\n    la.match = ka;\n    e.exports = la;\n});");
// 8749
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6");
// 8750
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"u//Ut\",]);\n}\n;\n;\n__d(\"MercuryAPIArgsSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        JEWEL: \"jewel\",\n        CHAT: \"chat\",\n        MERCURY: \"mercury\",\n        WEBMESSENGER: \"web_messenger\"\n    };\n});\n__d(\"MercuryActionStatus\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNCONFIRMED: 3,\n        UNSENT: 0,\n        RESENDING: 7,\n        RESENT: 6,\n        UNABLE_TO_CONFIRM: 5,\n        FAILED_UNKNOWN_REASON: 4,\n        SUCCESS: 1,\n        ERROR: 10\n    };\n});\n__d(\"MercuryActionTypeConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        LOG_MESSAGE: \"ma-type:log-message\",\n        CLEAR_CHAT: \"ma-type:clear_chat\",\n        UPDATE_ACTION_ID: \"ma-type:update-action-id\",\n        DELETE_MESSAGES: \"ma-type:delete-messages\",\n        CHANGE_FOLDER: \"ma-type:change-folder\",\n        SEND_MESSAGE: \"ma-type:send-message\",\n        CHANGE_ARCHIVED_STATUS: \"ma-type:change-archived-status\",\n        DELETE_THREAD: \"ma-type:delete-thread\",\n        USER_GENERATED_MESSAGE: \"ma-type:user-generated-message\",\n        CHANGE_READ_STATUS: \"ma-type:change_read_status\",\n        CHANGE_MUTE_SETTINGS: \"ma-type:change-mute-settings\"\n    };\n});\n__d(\"MercuryAttachmentContentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNKNOWN: \"attach:unknown\",\n        PHOTO: \"attach:image\",\n        VIDEO: \"attach:video\",\n        MSWORD: \"attach:ms:word\",\n        VOICE: \"attach:voice\",\n        MSPPT: \"attach:ms:ppt\",\n        TEXT: \"attach:text\",\n        MUSIC: \"attach:music\",\n        MSXLS: \"attach:ms:xls\"\n    };\n});\n__d(\"MercuryAttachmentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        STICKER: \"sticker\",\n        PHOTO: \"photo\",\n        FILE: \"file\",\n        SHARE: \"share\",\n        ERROR: \"error\"\n    };\n});\n__d(\"MercuryErrorType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER: 1,\n        TRANSPORT: 2,\n        TIMEOUT: 3\n    };\n});\n__d(\"MercuryGenericConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PENDING_THREAD_ID: \"pending:pending\"\n    };\n});\n__d(\"MercuryGlobalActionType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MARK_ALL_READ: \"mga-type:mark-all-read\"\n    };\n});\n__d(\"MercuryLogMessageType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_ERROR: \"log:error-msg\",\n        UNSUBSCRIBE: \"log:unsubscribe\",\n        JOINABLE_JOINED: \"log:joinable-joined\",\n        JOINABLE_CREATED: \"log:joinable-created\",\n        LIVE_LISTEN: \"log:live-listen\",\n        PHONE_CALL: \"log:phone-call\",\n        THREAD_IMAGE: \"log:thread-image\",\n        THREAD_NAME: \"log:thread-name\",\n        VIDEO_CALL: \"log:video-call\",\n        SUBSCRIBE: \"log:subscribe\"\n    };\n});\n__d(\"MercuryMessageSourceTags\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        CHAT: \"source:chat\",\n        MOBILE: \"source:mobile\",\n        MESSENGER: \"source:messenger\",\n        EMAIL: \"source:email\"\n    };\n});\n__d(\"MercuryParticipantTypes\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        FRIEND: \"friend\",\n        USER: \"user\",\n        THREAD: \"thread\",\n        EVENT: \"JSBNG__event\",\n        PAGE: \"page\"\n    };\n});\n__d(\"MercuryPayloadSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_INITIAL_DATA: \"server_initial_data\",\n        CLIENT_DELETE_THREAD: \"client_delete_thread\",\n        SERVER_ZAP: \"server_zap\",\n        SERVER_SAVE_DRAFT: \"server_save_draft\",\n        SERVER_CHANGE_ARCHIVED_STATUS: \"server_change_archived_status\",\n        SERVER_SEARCH: \"server_search\",\n        CLIENT_CHANGE_MUTE_SETTINGS: \"client_change_mute_settings\",\n        SERVER_UNREAD_THREADS: \"server_unread_threads\",\n        SERVER_MARK_SEEN: \"server_mark_seen\",\n        SERVER_THREAD_SYNC: \"server_thread_sync\",\n        CLIENT_DELETE_MESSAGES: \"client_delete_messages\",\n        SERVER_FETCH_THREADLIST_INFO: \"server_fetch_threadlist_info\",\n        CLIENT_CHANNEL_MESSAGE: \"client_channel_message\",\n        CLIENT_CHANGE_FOLDER: \"client_change_folder\",\n        CLIENT_CHANGE_READ_STATUS: \"client_change_read_status\",\n        CLIENT_CLEAR_CHAT: \"client_clear_chat\",\n        SERVER_FETCH_THREAD_INFO: \"server_fetch_thread_info\",\n        SERVER_CHANGE_READ_STATUS: \"server_change_read_status\",\n        SERVER_SEND_MESSAGE: \"server_send_message\",\n        CLIENT_SAVE_DRAFT: \"client_save_draft\",\n        UNKNOWN: \"unknown\",\n        SERVER_MARK_FOLDER_READ: \"server_mark_folder_read\",\n        SERVER_CONFIRM_MESSAGES: \"server_confirm_messages\",\n        SERVER_TAB_PRESENCE: \"server_tab_presence\",\n        CLIENT_CHANGE_ARCHIVED_STATUS: \"client_change-archived_status\",\n        CLIENT_SEND_MESSAGE: \"client_send_message\",\n        CLIENT_HANDLE_ERROR: \"client_handle_error\"\n    };\n});\n__d(\"MercurySourceType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        GIGABOXX_BLAST: \"source:gigaboxx:blast\",\n        TITAN_FACEWEB_BUFFY: \"source:titan:faceweb_buffy\",\n        TITAN_FACEWEB_UNKNOWN: \"source:titan:faceweb_unknown\",\n        CHAT_WEB: \"source:chat:web\",\n        WEBRTC_MOBILE: \"source:webrtc:mobile\",\n        GIGABOXX_API: \"source:gigaboxx:api\",\n        TITAN_M_JAPAN: \"source:titan:m_japan\",\n        BUFFY_SMS: \"source:buffy:sms\",\n        SEND_PLUGIN: \"source:sendplugin\",\n        CHAT_MEEBO: \"source:chat:meebo\",\n        TITAN_FACEWEB_IPAD: \"source:titan:faceweb_ipad\",\n        TITAN_FACEWEB_IPHONE: \"source:titan:faceweb_iphone\",\n        TEST: \"source:test\",\n        WEB: \"source:web\",\n        SOCIALFOX: \"source:socialfox\",\n        EMAIL: \"source:email\",\n        TITAN_API: \"source:titan:api\",\n        GIGABOXX_WEB: \"source:gigaboxx:web\",\n        DESKTOP: \"source:desktop\",\n        TITAN_FACEWEB_ANDROID: \"source:titan:faceweb_android\",\n        LEIA: \"source:leia\",\n        CHAT_JABBER: \"source:chat:jabber\",\n        CHAT_TEST: \"source:chat:test\",\n        SHARE_DIALOG: \"source:share:dialog\",\n        GIGABOXX_WAP: \"source:gigaboxx:wap\",\n        CHAT: \"source:chat\",\n        TITAN_M_APP: \"source:titan:m_app\",\n        TITAN_M_TOUCH: \"source:titan:m_touch\",\n        TITAN_ORCA: \"source:titan:orca\",\n        TITAN_WAP: \"source:titan:wap\",\n        TITAN_EMAIL_REPLY: \"source:titan:emailreply\",\n        CHAT_IPHONE: \"source:chat:iphone\",\n        SMS: \"source:sms\",\n        TITAN_M_BASIC: \"source:titan:m_basic\",\n        TITAN_M_MINI: \"source:titan:m_mini\",\n        GIGABOXX_MOBILE: \"source:gigaboxx:mobile\",\n        UNKNOWN: \"source:unknown\",\n        TITAN_WEB: \"source:titan:web\",\n        TITAN_M_ZERO: \"source:titan:m_zero\",\n        MOBILE: \"source:mobile\",\n        PAID_PROMOTION: \"source:paid_promotion\",\n        TITAN_API_MOBILE: \"source:titan:api_mobile\",\n        HELPCENTER: \"source:helpcenter\",\n        GIGABOXX_EMAIL_REPLY: \"source:gigaboxx:emailreply\",\n        CHAT_ORCA: \"source:chat:orca\",\n        TITAN_M_TALK: \"source:titan:m_talk\",\n        NEW_SHARE_DIALOG: \"source:share:dialog:new\"\n    };\n});\n__d(\"MercuryThreadMode\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        EMAIL_ORIGINATED: 1,\n        OBJECT_ORIGINATED: 3,\n        TITAN_ORIGINATED: 2\n    };\n});\n__d(\"MercuryTimePassed\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        TODAY: 0,\n        WEEK_AGO: 1,\n        CURRENT_YEAR: 3,\n        OTHER_YEAR: 4,\n        MONTH_AGO: 2\n    };\n});\n__d(\"MessagingEvent\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNSUBSCRIBE: \"unsubscribe\",\n        DELIVERY_RECEIPT: \"delivery_receipt\",\n        REPORT_SPAM_MESSAGES: \"report_spam_messages\",\n        DELIVER_FAST_PAST: \"deliver_fast_path\",\n        DELETE_MESSAGES: \"delete_messages\",\n        READ_RECEIPT: \"read_receipt\",\n        SENT_PUSH: \"sent_push\",\n        READ: \"read\",\n        CHANGE_MUTE_SETTINGS: \"change_mute_settings\",\n        ERROR: \"error\",\n        UNMARK_SPAM: \"unmark_spam\",\n        UNREAD: \"unread\",\n        DELIVER_LOG: \"deliver_log\",\n        DELIVER: \"deliver\",\n        READ_ALL: \"read_all\",\n        TAG: \"tag\",\n        MORE_THREADS: \"more_threads\",\n        DELETE: \"delete\",\n        REPORT_SPAM: \"report_spam\",\n        SUBSCRIBE: \"subscribe\"\n    };\n});\n__d(\"MessagingTag\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MTA_SYSTEM_MESSAGE: \"MTA:system_message\",\n        SENT: \"sent\",\n        INBOX: \"inbox\",\n        SMS_TAG_ROOT: \"SMSShortcode:\",\n        UPDATES: \"broadcasts_inbox\",\n        OTHER: \"other\",\n        GROUPS: \"groups\",\n        FILTERED_CONTENT: \"filtered_content\",\n        ACTION_ARCHIVED: \"action:archived\",\n        UNREAD: \"unread\",\n        BCC: \"header:bcc\",\n        SMS_MUTE: \"sms_mute\",\n        ARCHIVED: \"archived\",\n        DOMAIN_AUTH_PASS: \"MTA:dmarc:pass\",\n        EVENT: \"JSBNG__event\",\n        VOICEMAIL: \"voicemail\",\n        DOMAIN_AUTH_FAIL: \"MTA:dmarc:fail\",\n        SPAM_SPOOFING: \"spam:spoofing\",\n        SPOOF_WARNING: \"MTA:spoof_warning\",\n        SPAM: \"spam\",\n        EMAIL_MESSAGE: \"source:email\",\n        EMAIL: \"email\",\n        APP_ID_ROOT: \"app_id:\"\n    };\n});\n__d(\"AvailableListConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ON_AVAILABILITY_CHANGED: \"buddylist/availability-changed\",\n        ON_UPDATE_ERROR: \"buddylist/update-error\",\n        ON_UPDATED: \"buddylist/updated\",\n        ON_CHAT_NOTIFICATION_CHANGED: \"chat-notification-changed\",\n        OFFLINE: 0,\n        IDLE: 1,\n        ACTIVE: 2,\n        MOBILE: 3,\n        LEGACY_OVERLAY_OFFLINE: -1,\n        LEGACY_OVERLAY_ONLINE: 0,\n        LEGACY_OVERLAY_IDLE: 1,\n        legacyStatusMap: {\n            0: 2,\n            1: 1,\n            \"-1\": 0,\n            2: 3\n        },\n        reverseLegacyStatusMap: {\n            0: -1,\n            1: 1,\n            2: 0,\n            3: 2\n        }\n    };\n    a.AvailableListConstants = e.exports = g;\n});\n__d(\"PresenceUtil\", [\"Cookie\",\"Env\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Env\"), i = b(\"randomInt\"), j = b(\"tx\"), k = ((i(0, 4294967295) + 1)), l = {\n        checkMaintenanceError: function(m) {\n            if (((m.getError() == 1356007))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        getErrorDescription: function(m) {\n            var n = m.getError(), o = m.getErrorDescription();\n            if (!o) {\n                o = \"An error occurred.\";\n            }\n        ;\n        ;\n            if (((n == 1357001))) {\n                o = \"Your session has timed out. Please log in.\";\n            }\n        ;\n        ;\n            return o;\n        },\n        getSessionID: function() {\n            return k;\n        },\n        hasUserCookie: function() {\n            return ((h.user === g.get(\"c_user\")));\n        }\n    };\n    e.exports = l;\n});\n__d(\"PresencePrivacy\", [\"hasArrayNature\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"copyProperties\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"PresencePrivacyInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"copyProperties\"), l = b(\"Env\"), m = b(\"JSLogger\"), n = b(\"PresenceUtil\"), o = b(\"PresencePrivacyInitialData\"), p = \"/ajax/chat/privacy/settings.php\", q = \"/ajax/chat/privacy/online_policy.php\", r = \"/ajax/chat/privacy/visibility.php\", s = \"friend_visibility\", t = \"visibility\", u = \"online_policy\", v = k({\n    }, o.privacyData), w = o.visibility, x = k({\n    }, o.privacyData), y = w, z = o.onlinePolicy, aa = z, ba = [], ca = false;\n    function da() {\n        return m.create(\"blackbird\");\n    };\n;\n    var ea = k(new h(), {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1\n    });\n    function fa(ra) {\n        var sa;\n        {\n            var fin118keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin118i = (0);\n            (0);\n            for (; (fin118i < fin118keys.length); (fin118i++)) {\n                ((sa) = (fin118keys[fin118i]));\n                {\n                    var ta = ra[sa];\n                    if (((sa == l.user))) {\n                        da().error(\"set_viewer_visibility\");\n                        throw new Error(\"Invalid to set current user's visibility\");\n                    }\n                ;\n                ;\n                    switch (ta) {\n                      case ea.WHITELISTED:\n                    \n                      case ea.BLACKLISTED:\n                    \n                      case ea.UNLISTED:\n                        break;\n                      default:\n                        da().error(\"set_invalid_friend_visibility\", {\n                            id: sa,\n                            value: ta\n                        });\n                        throw new Error(((\"Invalid state: \" + ta)));\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin119keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin119i = (0);\n            (0);\n            for (; (fin119i < fin119keys.length); (fin119i++)) {\n                ((sa) = (fin119keys[fin119i]));\n                {\n                    v[sa] = ra[sa];\n                ;\n                };\n            };\n        };\n    ;\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ga(ra, sa) {\n        var ta = {\n        };\n        ta[ra] = sa;\n        fa(ta);\n    };\n;\n    function ha(ra) {\n        switch (ra) {\n          case ea.ONLINE:\n        \n          case ea.OFFLINE:\n            break;\n          default:\n            da().error(\"set_invalid_visibility\", {\n                value: ra\n            });\n            throw new Error(((\"Invalid visibility: \" + ra)));\n        };\n    ;\n        w = ra;\n        ea.inform(\"privacy-changed\");\n        ea.inform(\"privacy-user-presence-changed\");\n        h.inform(\"chat/visibility-changed\", {\n            sender: this\n        });\n    };\n;\n    function ia(ra) {\n        switch (ra) {\n          case ea.ONLINE_TO_WHITELIST:\n        \n          case ea.ONLINE_TO_BLACKLIST:\n            break;\n          default:\n            throw new Error(((\"Invalid default online policy: \" + ra)));\n        };\n    ;\n        z = ra;\n        ea.inform(\"privacy-user-presence-changed\");\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ja(ra, sa) {\n        ca = true;\n        ra.send();\n    };\n;\n    function ka(ra, sa) {\n        ba.push({\n            request: ra,\n            data: sa\n        });\n        if (!ca) {\n            var ta = ba.shift();\n            ja(ta.request, ta.data);\n        }\n    ;\n    ;\n    };\n;\n    function la(ra, sa) {\n        var ta = ra.type;\n        if (((ta === s))) {\n            var ua = sa.payload.user_availabilities;\n            if (!g(ua)) {\n                ea.inform(\"privacy-availability-changed\", {\n                    user_availabilities: ua\n                });\n                {\n                    var fin120keys = ((window.top.JSBNG_Replay.forInKeys)((ra.settings))), fin120i = (0);\n                    var va;\n                    for (; (fin120i < fin120keys.length); (fin120i++)) {\n                        ((va) = (fin120keys[fin120i]));\n                        {\n                            x[va] = ra.settings[va];\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (((ta === t))) {\n                y = ra.visibility;\n            }\n             else if (((ta === u))) {\n                aa = ra.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"set_update_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function ma(ra, sa) {\n        if (((w !== y))) {\n            ha(y);\n        }\n    ;\n    ;\n        if (((z !== aa))) {\n            ia(aa);\n        }\n    ;\n    ;\n        k(v, x);\n        ea.inform(\"privacy-changed\");\n        ba = [];\n        da().log(\"set_error_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function na(ra) {\n        ca = false;\n        if (((ba.length > 0))) {\n            var sa = ba.shift();\n            ja(sa.request, sa.data);\n        }\n    ;\n    ;\n    };\n;\n    function oa(ra, sa) {\n        if (((n != null))) {\n            var ta = ra.getData();\n            ta.window_id = n.getSessionID();\n            ra.setData(ta);\n        }\n    ;\n    ;\n        ra.setHandler(la.bind(this, sa)).setErrorHandler(ma.bind(this, sa)).setTransportErrorHandler(ma.bind(this, sa)).setFinallyHandler(na.bind(this)).setAllowCrossPageTransition(true);\n        return ra;\n    };\n;\n    function pa(ra, sa, ta) {\n        return oa(new i(ra).setData(sa), ta);\n    };\n;\n    function qa(ra, sa) {\n        var ta = sa.obj;\n        if (((ta.viewer_id != l.user))) {\n            da().error(\"invalid_viewer_for_channel_message\", {\n                type: ra,\n                data: sa\n            });\n            throw new Error(\"Viewer got from the channel is not the real viewer\");\n        }\n    ;\n    ;\n        if (((ta.window_id === n.getSessionID()))) {\n            return;\n        }\n    ;\n    ;\n        var ua = ta.data;\n        if (((ta.JSBNG__event == \"access_control_entry\"))) {\n            ua.target_ids.forEach(function(wa) {\n                ga(wa, ua.setting);\n                x[wa] = ua.setting;\n            });\n        }\n         else {\n            if (((ta.JSBNG__event == \"visibility_update\"))) {\n                var va = ((!!ua.visibility ? ea.ONLINE : ea.OFFLINE));\n                ha(va);\n                y = va;\n            }\n             else if (((ta.JSBNG__event == \"online_policy_update\"))) {\n                ia(ua.online_policy);\n                aa = ua.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"channel_message_received\", {\n            data: sa.obj\n        });\n    };\n;\n    k(ea, {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1,\n        init: function(ra, sa, ta) {\n        \n        },\n        setVisibility: function(ra) {\n            y = w;\n            ha(ra);\n            var sa = {\n                visibility: ra\n            }, ta = {\n                type: t,\n                visibility: ra\n            }, ua = pa(r, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_visibility\", {\n                data: sa\n            });\n            return ra;\n        },\n        getVisibility: function() {\n            return w;\n        },\n        setOnlinePolicy: function(ra) {\n            aa = z;\n            ia(ra);\n            var sa = {\n                online_policy: ra\n            }, ta = {\n                type: u,\n                online_policy: ra\n            }, ua = pa(q, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_online_policy\", {\n                data: sa\n            });\n            return ra;\n        },\n        getOnlinePolicy: function() {\n            return z;\n        },\n        getFriendVisibility: function(ra) {\n            return ((v[ra] || ea.UNLISTED));\n        },\n        allows: function(ra) {\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = this.getOnlinePolicy();\n            return ((((sa === ea.ONLINE_TO_WHITELIST)) ? ((v[ra] == ea.WHITELISTED)) : ((v[ra] != ea.BLACKLISTED))));\n        },\n        setFriendsVisibility: function(ra, sa) {\n            if (((ra.length > 0))) {\n                var ta = {\n                };\n                for (var ua = 0; ((ua < ra.length)); ua++) {\n                    var va = ra[ua];\n                    x[va] = v[va];\n                    ta[va] = sa;\n                };\n            ;\n                fa(ta);\n                var wa = sa;\n                if (((wa == ea.UNLISTED))) {\n                    wa = x[ra[0]];\n                }\n            ;\n            ;\n                var xa = {\n                    users: ra,\n                    setting: sa,\n                    setting_type: wa\n                }, ya = {\n                    type: s,\n                    settings: ta\n                }, za = pa(p, xa, ya);\n                ka(za, ya);\n                da().log(\"set_friend_visibility\", {\n                    data: xa\n                });\n            }\n        ;\n        ;\n            return sa;\n        },\n        setFriendVisibilityMap: function(ra, sa) {\n            {\n                var fin121keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin121i = (0);\n                var ta;\n                for (; (fin121i < fin121keys.length); (fin121i++)) {\n                    ((ta) = (fin121keys[fin121i]));\n                    {\n                        x[ta] = v[ta];\n                    ;\n                    };\n                };\n            };\n        ;\n            fa(ra);\n            var ua = {\n                type: s,\n                settings: ra\n            };\n            ka(oa(sa, ua), ua);\n            da().log(\"set_friend_visibility_from_map\", {\n                data: ra\n            });\n        },\n        allow: function(ra) {\n            if (this.allows(ra)) {\n                da().error(\"allow_already_allowed\");\n                throw new Error(((\"allow() should only be called for users that \" + \"are not already allowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"allow_called_while_offline\");\n                throw new Error(\"allow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_WHITELIST)) ? ea.WHITELISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        disallow: function(ra) {\n            if (!this.allows(ra)) {\n                da().error(\"disallow_already_disallowed\");\n                throw new Error(((\"disallow() should only be called for users that \" + \"are not already disallowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"disallow_called_while_offline\");\n                throw new Error(\"disallow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_BLACKLIST)) ? ea.BLACKLISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        getBlacklist: function() {\n            var ra = [];\n            {\n                var fin122keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin122i = (0);\n                var sa;\n                for (; (fin122i < fin122keys.length); (fin122i++)) {\n                    ((sa) = (fin122keys[fin122i]));\n                    {\n                        if (((v[sa] === ea.BLACKLISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getWhitelist: function() {\n            var ra = [];\n            {\n                var fin123keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin123i = (0);\n                var sa;\n                for (; (fin123i < fin123keys.length); (fin123i++)) {\n                    ((sa) = (fin123keys[fin123i]));\n                    {\n                        if (((v[sa] === ea.WHITELISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getMapForTest: function() {\n            return v;\n        },\n        setMapForTest: function(ra) {\n            v = ra;\n        }\n    });\n    ea.inform(\"privacy-changed\");\n    ea.inform(\"privacy-user-presence-changed\");\n    da().log(\"initialized\", {\n        visibility: w,\n        policy: z\n    });\n    h.subscribe(j.getArbiterType(\"privacy_changed\"), qa.bind(this));\n    h.subscribe(j.ON_CONFIG, function(ra, sa) {\n        var ta = sa.getConfig(\"visibility\", null);\n        if (((((ta !== null)) && ((typeof (ta) !== \"undefined\"))))) {\n            var ua = ((ta ? ea.ONLINE : ea.OFFLINE));\n            ha(ua);\n            da().log(\"config_visibility\", {\n                vis: ua\n            });\n        }\n    ;\n    ;\n    }.bind(this));\n    a.PresencePrivacy = e.exports = ea;\n}, 3);\n__d(\"ChatVisibility\", [\"Arbiter\",\"JSLogger\",\"PresencePrivacy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = {\n        isOnline: function() {\n            return ((i.getVisibility() === i.ONLINE));\n        },\n        hasBlackbirdEnabled: function() {\n            return ((this.isVisibleToMostFriends() || this.isVisibleToSomeFriends()));\n        },\n        isVisibleToMostFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_BLACKLIST)) && ((i.getBlacklist().length > 0))));\n        },\n        isVisibleToSomeFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_WHITELIST)) && ((i.getWhitelist().length > 0))));\n        },\n        goOnline: function(k) {\n            if (((i.getVisibility() === i.OFFLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_online\");\n                i.setVisibility(i.ONLINE);\n                g.inform(\"chat-visibility/go-online\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        goOffline: function(k) {\n            if (((i.getVisibility() === i.ONLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_offline\");\n                i.setVisibility(i.OFFLINE);\n                g.inform(\"chat-visibility/go-offline\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        toggleVisibility: function() {\n            if (j.isOnline()) {\n                j.goOffline();\n            }\n             else j.goOnline();\n        ;\n        ;\n        }\n    };\n    a.ChatVisibility = e.exports = j;\n}, 3);\n__d(\"MercuryIDs\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((((typeof i === \"string\")) && ((i.indexOf(\":\") !== -1))));\n    };\n;\n    var h = {\n        isValid: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            return g(i);\n        },\n        isValidThreadID: function(i) {\n            if (!h.isValid(i)) {\n                return false;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            switch (j.type) {\n              case \"user\":\n            \n              case \"group\":\n            \n              case \"thread\":\n            \n              case \"root\":\n            \n              case \"pending\":\n                return true;\n              default:\n                return false;\n            };\n        ;\n        },\n        tokenize: function(i) {\n            if (!this.isValid(i)) {\n                throw \"bad_id_format\";\n            }\n        ;\n        ;\n            var j = i.indexOf(\":\");\n            return {\n                type: i.substr(0, j),\n                value: i.substr(((j + 1)))\n            };\n        },\n        getUserIDFromParticipantID: function(i) {\n            if (!h.isValid(i)) {\n                return null;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            if (((j.type != \"fbid\"))) {\n                return null;\n            }\n        ;\n        ;\n            return j.value;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryAssert\", [\"MercuryIDs\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryIDs\");\n    e.exports = {\n        isParticipantID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_participant_id\";\n            }\n        ;\n        ;\n        },\n        allParticipantIDs: function(h) {\n            h.forEach(this.isParticipantID);\n        },\n        isUserParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"fbid\"))) {\n                throw \"bad_user_id\";\n            }\n        ;\n        ;\n        },\n        isEmailParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"email\"))) {\n                throw \"bad_email_id\";\n            }\n        ;\n        ;\n        },\n        allThreadID: function(h) {\n            h.forEach(this.isThreadID);\n        },\n        isThreadID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_thread_id\";\n            }\n        ;\n        ;\n        }\n    };\n});\n__d(\"MercurySingletonMixin\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        _getInstances: function() {\n            if (!this._instances) {\n                this._instances = {\n                };\n            }\n        ;\n        ;\n            return this._instances;\n        },\n        get: function() {\n            return this.getForFBID(g.user);\n        },\n        getForFBID: function(i) {\n            var j = this._getInstances();\n            if (!j[i]) {\n                j[i] = new this(i);\n            }\n        ;\n        ;\n            return j[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryMessageIDs\", [\"KeyedCallbackManager\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = new g(), i = {\n        getServerIDs: function(j, k) {\n            var l = j.filter(function(n) {\n                return ((n.indexOf(\"mail.projektitan.com\") !== -1));\n            }), m = function(n) {\n                var o = j.map(function(p) {\n                    return ((n[p] ? n[p] : p));\n                });\n                k(o);\n            };\n            return h.executeOrEnqueue(l, m);\n        },\n        addServerID: function(j, k) {\n            h.setResource(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImageSourceType\", [], function(a, b, c, d, e, f) {\n    var g = {\n        PROFILE_PICTURE: \"profile_picture\",\n        IMAGE: \"image\"\n    };\n    e.exports = g;\n});\n__d(\"PhotoResizeModeConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COVER: \"s\",\n        CONTAIN: \"p\"\n    };\n    e.exports = g;\n});\n__d(\"ImageSourceRequest\", [\"arrayContains\",\"extendArray\",\"copyProperties\",\"Env\",\"KeyedCallbackManager\",\"ImageSourceType\",\"PhotoResizeModeConst\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"extendArray\"), i = b(\"copyProperties\"), j = b(\"Env\"), k = b(\"KeyedCallbackManager\"), l = b(\"ImageSourceType\"), m = b(\"PhotoResizeModeConst\"), n = b(\"MercuryServerDispatcher\");\n    function o() {\n        this._request = {\n            fbid: null,\n            type: null,\n            width: null,\n            height: null,\n            resize_mode: null\n        };\n        this._callback = null;\n    };\n;\n    i(o.prototype, {\n        setFBID: function(s) {\n            this._request.fbid = s;\n            return this;\n        },\n        setType: function(s) {\n            if (!g([l.PROFILE_PICTURE,l.IMAGE,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setType: invalid type \" + s)));\n            }\n        ;\n        ;\n            this._request.type = s;\n            return this;\n        },\n        setDimensions: function(s, t) {\n            this._request.width = s;\n            this._request.height = t;\n            return this;\n        },\n        setResizeMode: function(s) {\n            if (!g([m.COVER,m.CONTAIN,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setResizeMode: invalid resize mode \" + s)));\n            }\n        ;\n        ;\n            this._request.resize_mode = s;\n            return this;\n        },\n        setCallback: function(s) {\n            this._callback = s;\n            return this;\n        },\n        send: function() {\n            if (((((((((((!this._request.fbid || !this._request.width)) || !this._request.height)) || !this._request.type)) || !this._request.resize_mode)) || !this._callback))) {\n                throw new Error(\"ImageSourceRequest: You must set all the fields\");\n            }\n        ;\n        ;\n            var s = q(), t = r(this._request);\n            s.executeOrEnqueue(t, this._callback);\n            if (((s.getUnavailableResourcesFromRequest(t).length === 1))) {\n                n.trySend(\"/ajax/image_source.php\", {\n                    requests: [this._request,]\n                });\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    });\n    var p = null;\n    function q() {\n        if (p) {\n            return p;\n        }\n    ;\n    ;\n        var s = new k();\n        p = s;\n        n.registerEndpoints({\n            \"/ajax/image_source.php\": {\n                request_user_id: j.user,\n                mode: n.BATCH_DEFERRED_MULTI,\n                batch_function: function(t, u) {\n                    h(t.requests, u.requests);\n                    return t;\n                },\n                handler: function(t, u) {\n                    var v = u.getData().requests;\n                    for (var w = 0; ((w < v.length)); ++w) {\n                        s.setResource(r(v[w]), t[w]);\n                    ;\n                    };\n                ;\n                }\n            }\n        });\n        return s;\n    };\n;\n    function r(s) {\n        return [s.fbid,s.type,s.width,s.height,s.resize_mode,].join(\"|\");\n    };\n;\n    e.exports = o;\n});\n__d(\"TimestampConverter\", [\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = g.create(\"timestamp_converter\");\n    function i(k) {\n        return ((((typeof (k) == \"string\")) && ((k.length > 6))));\n    };\n;\n    var j = {\n        convertActionIDToTimestamp: function(k) {\n            if (i(k)) {\n                var l = k.slice(0, -6);\n                return parseInt(l, 10);\n            }\n        ;\n        ;\n        },\n        maxValidActionID: function(k, l) {\n            if (!i(k)) {\n                return l;\n            }\n        ;\n        ;\n            if (!i(l)) {\n                return k;\n            }\n        ;\n        ;\n            return ((this.isGreaterThan(k, l) ? k : l));\n        },\n        isGreaterThan: function(k, l) {\n            if (((!i(k) || !i(l)))) {\n                return false;\n            }\n        ;\n        ;\n            return ((this.convertActionIDToTimestamp(k) > this.convertActionIDToTimestamp(l)));\n        }\n    };\n    e.exports = j;\n});\n__d(\"MessagingReliabilityLogger\", [\"function-extensions\",\"PresenceUtil\",\"MercuryServerDispatcher\",\"MessagingReliabilityLoggerInitialData\",\"isEmpty\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PresenceUtil\"), h = b(\"MercuryServerDispatcher\"), i = b(\"MessagingReliabilityLoggerInitialData\"), j = b(\"isEmpty\"), k = b(\"setTimeoutAcrossTransitions\"), l = \"/ajax/mercury/client_reliability.php\", m = 60000;\n    function n(t, u) {\n        var v = {\n            app: i.app,\n            categories: JSON.stringify(t)\n        };\n        if (!j(u)) {\n            v.extra = JSON.stringify(u);\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    function o(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = 0;\n        }\n    ;\n    ;\n        t[u][v] += w;\n    };\n;\n    function p(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = [];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); ++x) {\n            t[u][v].push(w[x]);\n        ;\n        };\n    ;\n    };\n;\n    function q(t, u) {\n        if (((((t && !t.categories)) || ((u && !u.categories))))) {\n            return;\n        }\n    ;\n    ;\n        var v = ((t ? JSON.parse(t.categories) : {\n        })), w = ((((t && t.extra)) ? JSON.parse(t.extra) : {\n        })), x = JSON.parse(u.categories), y = ((u.extra ? JSON.parse(u.extra) : {\n        }));\n        {\n            var fin124keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin124i = (0);\n            var z;\n            for (; (fin124i < fin124keys.length); (fin124i++)) {\n                ((z) = (fin124keys[fin124i]));\n                {\n                    var aa = x[z], ba = y[z];\n                    {\n                        var fin125keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin125i = (0);\n                        var ca;\n                        for (; (fin125i < fin125keys.length); (fin125i++)) {\n                            ((ca) = (fin125keys[fin125i]));\n                            {\n                                o(v, z, ca, aa[ca]);\n                                if (((ba !== undefined))) {\n                                    var da = ba[ca];\n                                    if (((da !== undefined))) {\n                                        p(w, z, ca, da);\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        return n(v, w);\n    };\n;\n    var r = {\n    };\n    r[l] = {\n        mode: h.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR,\n        batch_function: q\n    };\n    h.registerEndpoints(r);\n    var s = {\n        addEntry: function(t, u, v) {\n            if (!i.enabled) {\n                return;\n            }\n        ;\n        ;\n            var w = {\n            };\n            o(w, t, u, 1);\n            var x = {\n            };\n            if (((v !== undefined))) {\n                p(x, t, u, [v,]);\n            }\n        ;\n        ;\n            h.trySend(l, n(w, x));\n        }\n    };\n    (function t() {\n        s.addEntry(\"page_event\", \"active\", g.getSessionID());\n        k(t, m);\n    })();\n    e.exports = s;\n});\n__d(\"MercuryThreadInformer\", [\"ArbiterMixin\",\"copyProperties\",\"MercuryAssert\",\"MercurySingletonMixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"MercuryAssert\"), j = b(\"MercurySingletonMixin\");\n    function k(m) {\n        if (!m._locked) {\n            var n = m._threadDeletions, o = m._threadChanges, p = m._threadReadChanges, q = m._threadlistChanged, r = m._unseenStateChanged, s = m._unreadStateChanged, t = m._receivedMessages, u = m._reorderedMessages, v = m._updatedMessages;\n            m._threadDeletions = {\n            };\n            m._threadChanges = {\n            };\n            m._threadReadChanges = {\n            };\n            m._threadlistChanged = false;\n            m._unseenStateChanged = false;\n            m._unreadStateChanged = false;\n            m._receivedMessages = {\n            };\n            m._reorderedMessages = {\n            };\n            m._updatedMessages = {\n            };\n            var w = Object.keys(o);\n            if (((w.length || q))) {\n                m.inform(\"threadlist-updated\", w);\n            }\n        ;\n        ;\n            if (w.length) {\n                m.inform(\"threads-updated\", o);\n            }\n        ;\n        ;\n            {\n                var fin126keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin126i = (0);\n                var x;\n                for (; (fin126i < fin126keys.length); (fin126i++)) {\n                    ((x) = (fin126keys[fin126i]));\n                    {\n                        m.inform(\"thread-read-changed\", p);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin127keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin127i = (0);\n                var x;\n                for (; (fin127i < fin127keys.length); (fin127i++)) {\n                    ((x) = (fin127keys[fin127i]));\n                    {\n                        m.inform(\"threads-deleted\", n);\n                        break;\n                    };\n                };\n            };\n        ;\n            if (r) {\n                m.inform(\"unseen-updated\", null);\n            }\n        ;\n        ;\n            if (s) {\n                m.inform(\"unread-updated\", null);\n            }\n        ;\n        ;\n            {\n                var fin128keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin128i = (0);\n                (0);\n                for (; (fin128i < fin128keys.length); (fin128i++)) {\n                    ((x) = (fin128keys[fin128i]));\n                    {\n                        m.inform(\"messages-received\", t);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin129keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin129i = (0);\n                (0);\n                for (; (fin129i < fin129keys.length); (fin129i++)) {\n                    ((x) = (fin129keys[fin129i]));\n                    {\n                        m.inform(\"messages-reordered\", u);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin130keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin130i = (0);\n                (0);\n                for (; (fin130i < fin130keys.length); (fin130i++)) {\n                    ((x) = (fin130keys[fin130i]));\n                    {\n                        m.inform(\"messages-updated\", v);\n                        break;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function l(m) {\n        this._fbid = m;\n        this._threadDeletions = {\n        };\n        this._threadChanges = {\n        };\n        this._threadReadChanges = {\n        };\n        this._threadlistChanged = false;\n        this._unseenStateChanged = false;\n        this._unreadStateChanged = false;\n        this._receivedMessages = {\n        };\n        this._reorderedMessages = {\n        };\n        this._updatedMessages = {\n        };\n        this._locked = 0;\n    };\n;\n    h(l.prototype, g, {\n        updatedThread: function(m) {\n            this._threadChanges[m] = true;\n            k(this);\n        },\n        deletedThread: function(m) {\n            this._threadDeletions[m] = true;\n            k(this);\n        },\n        updatedThreadlist: function() {\n            this._threadlistChanged = true;\n            k(this);\n        },\n        updatedUnseenState: function() {\n            this._unseenStateChanged = true;\n            k(this);\n        },\n        updatedUnreadState: function() {\n            this._unreadStateChanged = true;\n            k(this);\n        },\n        changedThreadReadState: function(m, n, o) {\n            if (((!this._threadReadChanges[m] || ((this._threadReadChanges[m].timestamp < o))))) {\n                this._threadReadChanges[m] = {\n                    mark_as_read: n,\n                    timestamp: o\n                };\n            }\n        ;\n        ;\n            k(this);\n        },\n        receivedMessage: function(m) {\n            i.isThreadID(m.thread_id);\n            var n = m.thread_id;\n            if (!this._receivedMessages[n]) {\n                this._receivedMessages[n] = [];\n            }\n        ;\n        ;\n            this._receivedMessages[n].push(m);\n            this.updatedThread(n);\n        },\n        reorderedMessages: function(m, n) {\n            this._reorderedMessages[m] = {\n                source: n\n            };\n            k(this);\n        },\n        updatedMessage: function(m, n, o) {\n            if (!this._updatedMessages[m]) {\n                this._updatedMessages[m] = {\n                };\n            }\n        ;\n        ;\n            this._updatedMessages[m][n] = {\n                source: o\n            };\n            this.updatedThread(m);\n        },\n        synchronizeInforms: function(m) {\n            this._locked++;\n            try {\n                m();\n            } catch (n) {\n                throw n;\n            } finally {\n                this._locked--;\n                k(this);\n            };\n        ;\n        },\n        listen: function(m, n) {\n            return this.subscribe(\"threads-updated\", function(o, p) {\n                if (p[m]) {\n                    n(m);\n                }\n            ;\n            ;\n            });\n        }\n    });\n    h(l, j);\n    e.exports = l;\n});\n__d(\"MercuryServerRequests\", [\"ArbiterMixin\",\"AsyncResponse\",\"TimestampConverter\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAPIArgsSource\",\"MercuryAssert\",\"MercuryErrorType\",\"MercuryGenericConstants\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryPayloadSource\",\"MercuryServerRequestsConfig\",\"MercurySourceType\",\"MercuryThreadlistConstants\",\"MercuryMessageIDs\",\"MessagingConfig\",\"MessagingReliabilityLogger\",\"MessagingTag\",\"MercurySingletonMixin\",\"MercuryServerDispatcher\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncResponse\"), i = b(\"TimestampConverter\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"KeyedCallbackManager\"), m = b(\"MercuryActionTypeConstants\"), n = b(\"MercuryActionStatus\"), o = b(\"MercuryAPIArgsSource\"), p = b(\"MercuryAssert\"), q = b(\"MercuryErrorType\"), r = b(\"MercuryGenericConstants\"), s = b(\"MercuryGlobalActionType\"), t = b(\"MercuryIDs\"), u = b(\"MercuryLogMessageType\"), v = b(\"MercuryPayloadSource\"), w = b(\"MercuryServerRequestsConfig\"), x = b(\"MercurySourceType\"), y = b(\"MercuryThreadlistConstants\"), z = b(\"MercuryMessageIDs\"), aa = b(\"MessagingConfig\"), ba = b(\"MessagingReliabilityLogger\"), ca = b(\"MessagingTag\"), da = b(\"MercurySingletonMixin\"), ea = b(\"MercuryServerDispatcher\"), fa = b(\"MercuryThreadInformer\"), ga = b(\"copyProperties\"), ha = b(\"createObjectFrom\"), ia = k.create(\"mercury_server\"), ja = o.MERCURY;\n    function ka(sb, tb) {\n        if (tb) {\n            sb._lastActionId = i.maxValidActionID(sb._lastActionId, tb);\n        }\n    ;\n    ;\n    };\n;\n    function la(sb, tb) {\n        var ub = tb.thread_id, vb = sb._serverToClientIDs.getResource(ub);\n        if (!vb) {\n            if (tb.canonical_fbid) {\n                vb = ((\"user:\" + tb.canonical_fbid));\n            }\n             else if (tb.root_message_threading_id) {\n                vb = ((\"root:\" + tb.root_message_threading_id));\n            }\n            \n        ;\n        ;\n            vb = ((vb || ((\"thread:\" + ub))));\n            ma(sb, ub, vb);\n        }\n    ;\n    ;\n        tb.thread_id = vb;\n    };\n;\n    function ma(sb, tb, ub) {\n        sb._serverToClientIDs.setResource(tb, ub);\n        sb._clientToServerIDs.setResource(ub, tb);\n        sb._newlyAddedClientIDs[tb] = ub;\n    };\n;\n    function na(sb, tb, ub) {\n        var vb = sb._clientToServerIDs.executeOrEnqueue(tb, ub), wb = sb._clientToServerIDs.getUnavailableResources(vb), xb = sb.tokenizeThreadID(tb);\n        if (((wb.length && ((xb.type != \"root\"))))) {\n            sb.fetchThreadData(wb);\n        }\n    ;\n    ;\n    };\n;\n    function oa(sb, tb) {\n        return sb._clientToServerIDs.getResource(tb);\n    };\n;\n    function pa(sb, tb) {\n        return !!sb._serverToClientIDs.getResource(tb);\n    };\n;\n    function qa(sb, tb) {\n        var ub = sb._serverToClientIDs.getResource(tb);\n        if (((typeof ub == \"undefined\"))) {\n            ia.warn(\"no_client_thread_id\", {\n                server_id: tb\n            });\n        }\n    ;\n    ;\n        return ub;\n    };\n;\n    function ra(sb, tb, ub) {\n        sb._serverToClientIDs.executeOrEnqueue(tb, ub);\n        sb.ensureThreadIsFetched(tb);\n    };\n;\n    function sa(sb, tb, ub) {\n        if (((tb.action_type != m.SEND_MESSAGE))) {\n            return;\n        }\n    ;\n    ;\n        var vb = tb.client_thread_id;\n        if (!vb) {\n            vb = qa(sb, tb.thread_id);\n        }\n    ;\n    ;\n        var wb = null;\n        if (vb) {\n            wb = t.tokenize(vb).type;\n        }\n    ;\n    ;\n        ba.addEntry(((\"send_\" + wb)), ub, ((((tb.thread_id + \",\")) + tb.message_id)));\n    };\n;\n    function ta(sb) {\n        return ((sb.getError() ? ((\"_\" + sb.getError())) : \"\"));\n    };\n;\n    function ua(sb, tb) {\n        var ub = null;\n        switch (tb.JSBNG__status) {\n          case n.SUCCESS:\n            ub = \"success\";\n            break;\n          case n.FAILED_UNKNOWN_REASON:\n            ub = \"confirmed_error\";\n            break;\n          case n.UNABLE_TO_CONFIRM:\n            ub = \"confirm_error\";\n            break;\n          default:\n            return;\n        };\n    ;\n        sa(sb, tb, ub);\n    };\n;\n    function va(sb, tb) {\n        ((tb.message_counts || [])).forEach(function(cc) {\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.threads || [])).forEach(function(cc) {\n            la(sb, cc);\n            delete sb._fetchingThreads[cc.thread_id];\n            var dc = oa(sb, cc.thread_id);\n            delete sb._fetchingThreads[dc];\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.ordered_threadlists || [])).forEach(function(cc) {\n            cc.thread_ids = cc.thread_ids.map(qa.curry(sb));\n        });\n        tb.actions = ((tb.actions || []));\n        tb.actions.forEach(function(cc) {\n            ua(sb, cc);\n            if (((((cc.JSBNG__status && ((cc.JSBNG__status != n.SUCCESS)))) && !cc.thread_id))) {\n                cc.thread_id = cc.client_thread_id;\n                return;\n            }\n        ;\n        ;\n            if (((((((cc.action_type == m.SEND_MESSAGE)) && cc.client_thread_id)) && ((cc.client_thread_id != r.PENDING_THREAD_ID))))) {\n                ma(sb, cc.thread_id, cc.client_thread_id);\n            }\n        ;\n        ;\n            cc.server_thread_id = cc.thread_id;\n            cc.thread_id = ((pa(sb, cc.thread_id) ? qa(sb, cc.thread_id) : null));\n            ka(sb, cc.action_id);\n        });\n        if (tb.end_of_history) {\n            var ub = [];\n            for (var vb = 0; ((vb < tb.end_of_history.length)); vb++) {\n                var wb = tb.end_of_history[vb];\n                if (((wb.type == \"user\"))) {\n                    ub.push(((\"user:\" + wb.id)));\n                }\n                 else if (((((wb.type == \"thread\")) && pa(sb, wb.id)))) {\n                    ub.push(qa(sb, wb.id));\n                }\n                \n            ;\n            ;\n            };\n        ;\n            tb.end_of_history = ub;\n        }\n    ;\n    ;\n        if (tb.roger) {\n            var xb = {\n            };\n            {\n                var fin131keys = ((window.top.JSBNG_Replay.forInKeys)((tb.roger))), fin131i = (0);\n                var yb;\n                for (; (fin131i < fin131keys.length); (fin131i++)) {\n                    ((yb) = (fin131keys[fin131i]));\n                    {\n                        var zb = sb._serverToClientIDs.getResource(yb);\n                        if (zb) {\n                            var ac = tb.roger[yb];\n                            xb[zb] = {\n                            };\n                            {\n                                var fin132keys = ((window.top.JSBNG_Replay.forInKeys)((ac))), fin132i = (0);\n                                var bc;\n                                for (; (fin132i < fin132keys.length); (fin132i++)) {\n                                    ((bc) = (fin132keys[fin132i]));\n                                    {\n                                        xb[zb][((\"fbid:\" + bc))] = ac[bc];\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            tb.roger = xb;\n        }\n    ;\n    ;\n    };\n;\n    function wa(sb) {\n        if (((sb._pendingUpdates && sb._pendingUpdates.length))) {\n            var tb = sb._pendingUpdates[0];\n            sb._pendingUpdates = sb._pendingUpdates.slice(1);\n            sb.handleUpdate(tb);\n        }\n    ;\n    ;\n    };\n;\n    function xa(sb, tb) {\n        var ub = ga({\n        }, sb), vb;\n        if (tb.threads) {\n            if (!ub.threads) {\n                ub.threads = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin133keys = ((window.top.JSBNG_Replay.forInKeys)((tb.threads))), fin133i = (0);\n                (0);\n                for (; (fin133i < fin133keys.length); (fin133i++)) {\n                    ((vb) = (fin133keys[fin133i]));\n                    {\n                        ub.threads[vb] = Object.keys(ha(((ub.threads[vb] || [])).concat(tb.threads[vb])));\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        if (tb.messages) {\n            if (!ub.messages) {\n                ub.messages = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin134keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages))), fin134i = (0);\n                (0);\n                for (; (fin134i < fin134keys.length); (fin134i++)) {\n                    ((vb) = (fin134keys[fin134i]));\n                    {\n                        if (!ub.messages[vb]) {\n                            ub.messages[vb] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin135keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages[vb]))), fin135i = (0);\n                            var wb;\n                            for (; (fin135i < fin135keys.length); (fin135i++)) {\n                                ((wb) = (fin135keys[fin135i]));\n                                {\n                                    if (ub.messages[vb][wb]) {\n                                        ub.messages[vb][wb] = ab(ub.messages[vb][wb], tb.messages[vb][wb]);\n                                    }\n                                     else ub.messages[vb][wb] = tb.messages[vb][wb];\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        ub.client = ((sb.client || tb.client));\n        return ub;\n    };\n;\n    function ya(sb, tb) {\n        var ub = ga(ha(sb.folders, true), ha(tb.folders, true)), vb = ((sb.client || tb.client));\n        return {\n            folders: Object.keys(ub),\n            client: vb\n        };\n    };\n;\n    function za(sb, tb) {\n        {\n            var fin136keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin136i = (0);\n            var ub;\n            for (; (fin136i < fin136keys.length); (fin136i++)) {\n                ((ub) = (fin136keys[fin136i]));\n                {\n                    if (((sb[ub] && ((typeof sb[ub] === \"object\"))))) {\n                        sb[ub] = ab(sb[ub], tb[ub]);\n                    }\n                     else if (((tb[ub] && ((typeof tb[ub] === \"object\"))))) {\n                        var vb = {\n                        };\n                        ga(vb, tb[ub]);\n                        sb[ub] = vb;\n                    }\n                    \n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return sb;\n    };\n;\n    function ab(sb, tb) {\n        var ub = ((((sb.offset < tb.offset)) ? sb.offset : tb.offset)), vb = ((sb.offset + sb.limit)), wb = ((tb.offset + tb.limit)), xb = ((((vb > wb)) ? vb : wb)), yb = ((xb - ub));\n        return {\n            offset: ub,\n            limit: yb\n        };\n    };\n;\n    function bb(sb, tb) {\n        var ub = ((sb.client || tb.client)), vb = {\n            ids: {\n            },\n            client: ub\n        };\n        ga(vb.ids, sb.ids);\n        ga(vb.ids, tb.ids);\n        return vb;\n    };\n;\n    function cb(sb, tb) {\n        var ub = {\n        }, vb, wb = ((sb.client || tb.client));\n        delete sb.client;\n        delete tb.client;\n        {\n            var fin137keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin137i = (0);\n            (0);\n            for (; (fin137i < fin137keys.length); (fin137i++)) {\n                ((vb) = (fin137keys[fin137i]));\n                {\n                    ga(ub, ha(sb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin138keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin138i = (0);\n            (0);\n            for (; (fin138i < fin138keys.length); (fin138i++)) {\n                ((vb) = (fin138keys[fin138i]));\n                {\n                    ga(ub, ha(tb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        var xb = {\n            client: wb\n        };\n        {\n            var fin139keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin139i = (0);\n            var yb;\n            for (; (fin139i < fin139keys.length); (fin139i++)) {\n                ((yb) = (fin139keys[fin139i]));\n                {\n                    vb = ub[yb];\n                    if (!xb[vb]) {\n                        xb[vb] = [];\n                    }\n                ;\n                ;\n                    xb[vb].push(yb);\n                };\n            };\n        };\n    ;\n        return xb;\n    };\n;\n    function db(sb, tb) {\n        var ub = ((sb.client || tb.client)), vb = ha(sb.ids, true), wb = ha(tb.ids, true), xb = ga(vb, wb);\n        return {\n            ids: Object.keys(xb),\n            client: ub\n        };\n    };\n;\n    function eb(sb) {\n        this._fbid = sb;\n        this._lastActionId = 0;\n        this._serverToClientIDs = new l();\n        this._clientToServerIDs = new l();\n        this._pendingUpdates = [];\n        this._fetchingThreads = {\n        };\n        this._newlyAddedClientIDs = {\n        };\n        qb(this);\n    };\n;\n    ga(eb.prototype, g, {\n        tokenizeThreadID: function(sb) {\n            p.isThreadID(sb);\n            return t.tokenize(sb);\n        },\n        getServerThreadID: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, tb);\n        },\n        getClientThreadID: function(sb, tb) {\n            ra(this, sb, tb);\n        },\n        getClientThreadIDNow: function(sb) {\n            return qa(this, sb);\n        },\n        getServerThreadIDNow: function(sb) {\n            return oa(this, sb);\n        },\n        convertThreadIDIfAvailable: function(sb) {\n            var tb = this._serverToClientIDs.getResource(sb);\n            if (((tb === undefined))) {\n                return sb;\n            }\n             else return tb\n        ;\n        },\n        canLinkExternally: function(sb) {\n            p.isThreadID(sb);\n            var tb = this.tokenizeThreadID(sb);\n            return ((((tb.type == \"user\")) || !!oa(this, sb)));\n        },\n        fetchThreadlistInfo: function(sb, tb, ub, vb, wb) {\n            ub = ((ub || ca.INBOX));\n            wb = ((wb || ja));\n            var xb = ((vb ? ea.IMMEDIATE : null)), yb = {\n                client: wb\n            };\n            yb[ub] = {\n                offset: sb,\n                limit: tb,\n                filter: vb\n            };\n            rb(this, \"/ajax/mercury/threadlist_info.php\", yb, xb);\n        },\n        fetchUnseenThreadIDs: function(sb, tb) {\n            tb = ((tb || ja));\n            this.fetchThreadlistInfo(y.RECENT_THREAD_OFFSET, y.JEWEL_THREAD_COUNT, sb, null, tb);\n        },\n        fetchUnreadThreadIDs: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/unread_threads.php\", {\n                folders: [sb,],\n                client: tb\n            });\n        },\n        fetchMissedMessages: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/thread_sync.php\", {\n                last_action_id: this._lastActionId,\n                folders: sb,\n                client: tb\n            });\n        },\n        fetchThreadData: function(sb, tb) {\n            tb = ((tb || ja));\n            p.allThreadID(sb);\n            var ub = {\n                threads: {\n                },\n                client: tb\n            }, vb = [], wb = [];\n            sb.forEach(function(yb) {\n                if (this._fetchingThreads[yb]) {\n                    return;\n                }\n            ;\n            ;\n                this._fetchingThreads[yb] = true;\n                var zb = oa(this, yb);\n                if (zb) {\n                    wb.push(zb);\n                    ub.threads.thread_ids = wb;\n                }\n                 else {\n                    var ac = this.tokenizeThreadID(yb);\n                    if (((ac.type == \"user\"))) {\n                        vb.push(ac.value);\n                        ub.threads.user_ids = vb;\n                    }\n                     else if (((ac.type == \"thread\"))) {\n                        wb.push(ac.value);\n                        ub.threads.thread_ids = wb;\n                    }\n                     else if (((((ac.type != \"root\")) && ((ac.type != \"pending\"))))) {\n                        throw new Error(\"Unknown thread type\", ac);\n                    }\n                    \n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.inform(\"fetch-thread-data\", ub);\n            {\n                var fin140keys = ((window.top.JSBNG_Replay.forInKeys)((ub.threads))), fin140i = (0);\n                var xb;\n                for (; (fin140i < fin140keys.length); (fin140i++)) {\n                    ((xb) = (fin140keys[fin140i]));\n                    {\n                        rb(this, \"/ajax/mercury/thread_info.php\", ub);\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        ensureThreadIsFetched: function(sb, tb) {\n            tb = ((tb || ja));\n            if (((!this._serverToClientIDs.getResource(sb) && !this._fetchingThreads[sb]))) {\n                this._fetchingThreads[sb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [sb,]\n                    },\n                    client: tb\n                });\n            }\n        ;\n        ;\n        },\n        fetchThreadMessages: function(sb, tb, ub, vb, wb) {\n            p.isThreadID(sb);\n            wb = ((wb || ja));\n            var xb, yb, zb = this.tokenizeThreadID(sb), ac = oa(this, sb), bc = false;\n            if (((ac && ((zb.type != \"group\"))))) {\n                yb = \"thread_ids\";\n                xb = ac;\n            }\n             else {\n                xb = zb.value;\n                switch (zb.type) {\n                  case \"user\":\n                    yb = \"user_ids\";\n                    bc = true;\n                    break;\n                  case \"group\":\n                    yb = \"group_ids\";\n                    break;\n                  case \"thread\":\n                    yb = \"thread_ids\";\n                    break;\n                };\n            ;\n            }\n        ;\n        ;\n            var cc = {\n                messages: {\n                },\n                threads: {\n                },\n                client: wb\n            };\n            if (yb) {\n                cc.messages[yb] = {\n                };\n                cc.messages[yb][xb] = {\n                    offset: tb,\n                    limit: ub\n                };\n                if (bc) {\n                    cc.threads[yb] = [xb,];\n                }\n            ;\n            ;\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }\n             else na(this, sb, function(dc) {\n                cc.messages.thread_ids = {\n                };\n                cc.messages.thread_ids[dc] = {\n                    offset: tb,\n                    limit: ub\n                };\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }.bind(this));\n        ;\n        ;\n        },\n        handleThreadInfoError: function(sb) {\n            var tb = sb.getRequest().getData(), ub = [];\n            if (tb.messages) {\n                {\n                    var fin141keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.thread_ids))), fin141i = (0);\n                    var vb;\n                    for (; (fin141i < fin141keys.length); (fin141i++)) {\n                        ((vb) = (fin141keys[fin141i]));\n                        {\n                            ub.push(fb(qa(this, vb)));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin142keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.user_ids))), fin142i = (0);\n                    var wb;\n                    for (; (fin142i < fin142keys.length); (fin142i++)) {\n                        ((wb) = (fin142keys[fin142i]));\n                        {\n                            ub.push(fb(((\"user:\" + wb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin143keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.group_ids))), fin143i = (0);\n                    var xb;\n                    for (; (fin143i < fin143keys.length); (fin143i++)) {\n                        ((xb) = (fin143keys[fin143i]));\n                        {\n                            ub.push(fb(((\"group:\" + xb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n            if (ub.length) {\n                this.handleUpdate({\n                    actions: ub,\n                    from_client: true,\n                    payload_source: v.CLIENT_CHANNEL_MESSAGE\n                });\n            }\n        ;\n        ;\n            if (((tb.threads && ((((tb.threads.user_ids || tb.threads.group_ids)) || tb.threads.thread_ids))))) {\n                var yb = 5, zb = true;\n                if (!tb.retry_count) {\n                    tb.retry_count = 0;\n                    if (tb.messages) {\n                        delete tb.messages;\n                    }\n                ;\n                ;\n                }\n                 else if (((tb.retry_count >= yb))) {\n                    zb = false;\n                    ((tb.threads.thread_ids || [])).forEach(function(bc) {\n                        if (((bc in this._fetchingThreads))) {\n                            delete this._fetchingThreads[bc];\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n                \n            ;\n            ;\n                if (zb) {\n                    var ac = ((tb.retry_count * 1000));\n                    (function() {\n                        ia.log(\"retry_thread\", tb);\n                        rb(this, \"/ajax/mercury/thread_info.php\", tb);\n                    }.bind(this)).defer(ac, false);\n                    tb.retry_count++;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        markFolderAsRead: function(sb) {\n            rb(this, \"/ajax/mercury/mark_folder_as_read.php\", {\n                folder: sb\n            });\n            var tb = [{\n                action_type: s.MARK_ALL_READ,\n                action_id: null,\n                folder: sb\n            },];\n            this.handleUpdate({\n                global_actions: tb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadReadStatus: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_read_status.php\", xb);\n            }.bind(this));\n            var vb = [{\n                action_type: m.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: sb,\n                mark_as_read: tb,\n                folder: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadArchivedStatus: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_archived_status.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: sb,\n                archived: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_ARCHIVED_STATUS\n            };\n            this.handleUpdate(vb);\n        },\n        changeThreadFolder: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                };\n                xb[tb] = [wb,];\n                rb(this, \"/ajax/mercury/move_thread.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        changeMutingOnThread: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                rb(this, \"/ajax/mercury/change_mute_thread.php\", {\n                    thread_id: wb,\n                    mute_settings: tb,\n                    payload_source: ja\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_MUTE_SETTINGS,\n                action_id: null,\n                thread_id: sb,\n                mute_settings: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_MUTE_SETTINGS\n            };\n            this.handleUpdate(vb);\n        },\n        markThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.SPAM\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        markMessagesSpam: function(sb, tb) {\n            z.getServerIDs(((tb || [])), function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam_messages.php\", {\n                    message_ids: vb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n            this.handleUpdate({\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        unmarkThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/unmark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.INBOX\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        deleteThread: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                var wb = {\n                    ids: [vb,]\n                };\n                rb(this, \"/ajax/mercury/delete_thread.php\", wb);\n            }.bind(this));\n            var tb = {\n                action_type: m.DELETE_THREAD,\n                action_id: null,\n                thread_id: sb\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_THREAD\n            };\n            this.handleUpdate(ub);\n        },\n        deleteMessages: function(sb, tb, ub) {\n            z.getServerIDs(((tb || [])), function(wb) {\n                rb(this, \"/ajax/mercury/delete_messages.php\", {\n                    message_ids: wb\n                });\n            }.bind(this));\n            var vb;\n            if (ub) {\n                vb = {\n                    action_type: m.DELETE_THREAD,\n                    action_id: null,\n                    thread_id: sb\n                };\n            }\n             else vb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n        ;\n        ;\n            this.handleUpdate({\n                actions: [vb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        clearChat: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            rb(this, \"/ajax/chat/settings.php\", {\n                clear_history_id: tb\n            });\n            var vb = [{\n                action_type: m.CLEAR_CHAT,\n                action_id: null,\n                thread_id: sb,\n                clear_time: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CLEAR_CHAT\n            });\n        },\n        sendNewMessage: function(sb, tb) {\n            tb = ((tb || ja));\n            if (!sb.do_not_send_to_server) {\n                z.getServerIDs(((sb.forward_message_ids || [])), function(vb) {\n                    var wb = sb.thread_id, xb = this.tokenizeThreadID(sb.thread_id), yb = xb.type, zb = ga({\n                    }, sb);\n                    zb.forward_message_ids = vb;\n                    if (((((((((yb == \"root\")) && ((xb.value == zb.message_id)))) || ((((yb == \"user\")) && !oa(this, wb))))) || ((sb.thread_id == r.PENDING_THREAD_ID))))) {\n                        zb.client_thread_id = zb.thread_id;\n                        zb.thread_id = null;\n                        this._sendNewMessageToServer(zb, tb);\n                    }\n                     else na(this, zb.thread_id, function(ac) {\n                        zb.thread_id = ac;\n                        this._sendNewMessageToServer(zb);\n                    }.bind(this));\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            if (((sb.thread_id != r.PENDING_THREAD_ID))) {\n                var ub = {\n                    actions: [ga({\n                    }, sb),],\n                    from_client: true,\n                    payload_source: v.CLIENT_SEND_MESSAGE\n                };\n                this.handleUpdate(ub);\n            }\n        ;\n        ;\n        },\n        _sendNewMessageToServer: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/send_messages.php\", {\n                message_batch: [sb,],\n                client: tb\n            });\n        },\n        requestMessageConfirmation: function(sb, tb) {\n            tb = ((tb || ja));\n            var ub = {\n            }, vb = {\n            };\n            {\n                var fin144keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin144i = (0);\n                var wb;\n                for (; (fin144i < fin144keys.length); (fin144i++)) {\n                    ((wb) = (fin144keys[fin144i]));\n                    {\n                        var xb = oa(this, wb);\n                        if (xb) {\n                            ub[xb] = sb[wb];\n                        }\n                         else {\n                            var yb = sb[wb];\n                            for (var zb = 0; ((zb < yb.length)); zb++) {\n                                vb[yb[zb]] = wb;\n                            ;\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ac = Object.keys(ub), bc = Object.keys(vb);\n            if (((ac.length || bc.length))) {\n                rb(this, \"/ajax/mercury/confirm_messages.php\", {\n                    thread_message_map: ub,\n                    local_messages: vb,\n                    client: tb\n                });\n            }\n        ;\n        ;\n        },\n        handleMessageConfirmError: function(sb) {\n            var tb = sb.getRequest().getData().thread_message_map, ub = sb.getRequest().getData().local_messages;\n            if (((!tb && !ub))) {\n                return;\n            }\n        ;\n        ;\n            var vb = [];\n            {\n                var fin145keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin145i = (0);\n                var wb;\n                for (; (fin145i < fin145keys.length); (fin145i++)) {\n                    ((wb) = (fin145keys[fin145i]));\n                    {\n                        var xb = tb[wb];\n                        xb.forEach(function(ac) {\n                            vb.push({\n                                action_type: m.SEND_MESSAGE,\n                                client_message_id: ac,\n                                message_id: ac,\n                                client_thread_id: null,\n                                thread_id: wb,\n                                JSBNG__status: n.UNABLE_TO_CONFIRM\n                            });\n                        });\n                    };\n                };\n            };\n        ;\n            {\n                var fin146keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin146i = (0);\n                var yb;\n                for (; (fin146i < fin146keys.length); (fin146i++)) {\n                    ((yb) = (fin146keys[fin146i]));\n                    {\n                        var zb = ub[yb];\n                        vb.push({\n                            action_type: m.SEND_MESSAGE,\n                            client_message_id: yb,\n                            message_id: yb,\n                            client_thread_id: zb,\n                            thread_id: null,\n                            JSBNG__status: n.UNABLE_TO_CONFIRM\n                        });\n                    };\n                };\n            };\n        ;\n            if (vb.length) {\n                this.handleUpdate({\n                    actions: vb,\n                    payload_source: v.CLIENT_HANDLE_ERROR\n                });\n            }\n        ;\n        ;\n        },\n        markSeen: function() {\n            var sb = i.convertActionIDToTimestamp(this._lastActionId);\n            rb(this, \"/ajax/mercury/mark_seen.php\", {\n                seen_timestamp: sb\n            });\n        },\n        handleRoger: function(sb) {\n            var tb = ((sb.tid ? this._serverToClientIDs.getResource(sb.tid) : ((\"user:\" + sb.reader))));\n            if (tb) {\n                var ub = {\n                };\n                ub[tb] = {\n                };\n                ub[tb][((\"fbid:\" + sb.reader))] = sb.time;\n                this.inform(\"update-roger\", ub);\n            }\n        ;\n        ;\n        },\n        handleUpdateWaitForThread: function(sb, tb, ub) {\n            ub = ((ub || ja));\n            var vb = this._serverToClientIDs.getResource(tb);\n            if (vb) {\n                this.handleUpdate(sb);\n                return;\n            }\n        ;\n        ;\n            this._serverToClientIDs.executeOrEnqueue(tb, function() {\n                this._pendingUpdates.push(sb);\n            }.bind(this));\n            if (!this._fetchingThreads[tb]) {\n                this._fetchingThreads[tb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [tb,]\n                    },\n                    client: ub\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdate: function(sb) {\n            var tb = [];\n            if (((sb && sb.threads))) {\n                for (var ub = 0; ((ub < sb.threads.length)); ub++) {\n                    if (!sb.threads[ub].snippet_attachments) {\n                        continue;\n                    }\n                ;\n                ;\n                    for (var vb = 0; ((vb < sb.threads[ub].snippet_attachments.length)); vb++) {\n                        if (sb.threads[ub].snippet_attachments[vb].share_xhp) {\n                            tb.push({\n                                i: ub,\n                                j: vb,\n                                xhp: sb.threads[ub].snippet_attachments[vb].share_xhp\n                            });\n                            sb.threads[ub].snippet_attachments[vb].share_xhp = ((((\"HTMLDivElement not shown: object contains circular \" + \"reference, which was breaking JSON.stringify. \")) + \"Look at MercuryServerRequests.handleUpdate\"));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            }\n        ;\n        ;\n            ia.debug(\"handle_update\", {\n                payload: sb,\n                from_client: sb.from_client\n            });\n            for (var wb = 0; ((wb < tb.length)); wb++) {\n                sb.threads[tb[wb].i].snippet_attachments[tb[wb].j].share_xhp = tb[wb].xhp;\n            ;\n            };\n        ;\n            {\n                var fin147keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin147i = (0);\n                (0);\n                for (; (fin147i < fin147keys.length); (fin147i++)) {\n                    ((wb) = (fin147keys[fin147i]));\n                    {\n                        fa.getForFBID(this._fbid).synchronizeInforms(function() {\n                            if (!sb.from_client) {\n                                va(this, sb);\n                                this.inform(\"payload-preprocessed\", sb);\n                            }\n                        ;\n                        ;\n                            this.inform(\"update-thread-ids\", this._newlyAddedClientIDs);\n                            this._newlyAddedClientIDs = {\n                            };\n                            this.inform(\"update-participants\", sb);\n                            this.inform(\"update-threads\", sb);\n                            this.inform(\"update-unread\", sb);\n                            this.inform(\"update-threadlist\", sb);\n                            this.inform(\"update-messages\", sb);\n                            this.inform(\"update-unseen\", sb);\n                            this.inform(\"update-typing-state\", sb);\n                            this.inform(\"update-roger\", sb.roger);\n                            this.inform(\"model-update-completed\", null);\n                            wa(this);\n                        }.bind(this));\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        _handleSendMessageErrorCommon: function(sb, tb, ub, vb) {\n            ia.debug(\"handle_send_message_error_common\", {\n                reliability_error_status: ub,\n                request_error_status: tb\n            });\n            var wb = sb.getData(), xb = wb.message_batch, yb = xb.map(function(ac) {\n                return {\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: ac.message_id,\n                    message_id: ac.message_id,\n                    client_thread_id: ac.client_thread_id,\n                    thread_id: ac.thread_id,\n                    JSBNG__status: tb,\n                    error_data: vb\n                };\n            });\n            yb.forEach(function(ac) {\n                sa(this, ac, ub);\n            }.bind(this));\n            var zb = {\n                actions: yb,\n                payload_source: v.CLIENT_HANDLE_ERROR\n            };\n            this.handleUpdate(zb);\n        },\n        handleSendMessageError: function(sb) {\n            var tb = sb.getPayload(), ub = null, vb = null;\n            if (((tb && tb.error_payload))) {\n                ub = n.UNCONFIRMED;\n                vb = \"send_error\";\n            }\n             else {\n                ub = n.ERROR;\n                vb = ((\"request_error\" + ta(sb)));\n            }\n        ;\n        ;\n            var wb = sb.error;\n            if (((wb === 1404102))) {\n                h.verboseErrorHandler(sb);\n            }\n        ;\n        ;\n            var xb = ((/<.*>/.test(sb.getErrorDescription()) ? sb.getErrorSummary() : sb.getErrorDescription()));\n            this._handleSendMessageErrorCommon(sb.getRequest(), ub, vb, {\n                type: q.SERVER,\n                code: sb.getError(),\n                description: xb,\n                is_transient: sb.isTransient()\n            });\n        },\n        handleSendMessageTransportError: function(sb) {\n            this._handleSendMessageErrorCommon(sb.getRequest(), n.ERROR, ((\"transport_error\" + ta(sb))), {\n                type: q.TRANSPORT,\n                code: sb.getError(),\n                is_transient: true\n            });\n        },\n        handleSendMessageTimeout: function(sb) {\n            this._handleSendMessageErrorCommon(sb, n.ERROR, \"transport_timeout\", {\n                type: q.TIMEOUT,\n                is_transient: true\n            });\n        },\n        getLastActionID: function() {\n            return this._lastActionId;\n        }\n    });\n    ga(eb, da);\n    function fb(sb) {\n        return {\n            action_type: m.LOG_MESSAGE,\n            thread_id: sb,\n            message_id: sb,\n            timestamp: JSBNG__Date.now(),\n            timestamp_absolute: \"\",\n            timestamp_relative: \"\",\n            is_unread: false,\n            source: x.UNKNOWN,\n            log_message_type: u.SERVER_ERROR,\n            log_message_data: {\n            }\n        };\n    };\n;\n    function gb(sb) {\n        var tb = sb.getData(), ub = ((tb.request_user_id ? tb.request_user_id : j.user));\n        return eb.getForFBID(ub);\n    };\n;\n    function hb(sb, tb) {\n        gb(tb).handleUpdate(sb);\n    };\n;\n    function ib(sb, tb) {\n        var ub = ((sb.client || tb.client));\n        return {\n            client: ub,\n            message_batch: sb.message_batch.concat(tb.message_batch)\n        };\n    };\n;\n    function jb(sb, tb) {\n        var ub = {\n        };\n        ga(ub, sb.ids);\n        ga(ub, tb.ids);\n        var vb = ((sb.client || tb.client));\n        return {\n            ids: ub,\n            client: vb\n        };\n    };\n;\n    function kb(sb, tb) {\n        return tb;\n    };\n;\n    function lb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleThreadInfoError(sb);\n    };\n;\n    function mb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageError(sb);\n    };\n;\n    function nb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageTransportError(sb);\n    };\n;\n    function ob(sb) {\n        var tb = gb(sb);\n        tb.handleSendMessageTimeout(sb);\n    };\n;\n    function pb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleMessageConfirmError(sb);\n    };\n;\n    function qb(sb) {\n        ea.registerEndpoints({\n            \"/ajax/mercury/thread_sync.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IDEMPOTENT,\n                handler: hb\n            },\n            \"/ajax/mercury/thread_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_DEFERRED_MULTI,\n                batch_function: xa,\n                handler: hb,\n                error_handler: lb\n            },\n            \"/ajax/mercury/mark_folder_as_read.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/change_read_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: jb,\n                handler: hb\n            },\n            \"/ajax/mercury/send_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: ib,\n                batch_size_limit: aa.SEND_BATCH_LIMIT,\n                handler: hb,\n                error_handler: mb,\n                transport_error_handler: nb,\n                timeout: w.sendMessageTimeout,\n                timeout_handler: ob,\n                connection_retries: aa.SEND_CONNECTION_RETRIES\n            },\n            \"/ajax/mercury/mark_seen.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: kb,\n                handler: hb\n            },\n            \"/ajax/mercury/confirm_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb,\n                error_handler: pb\n            },\n            \"/ajax/mercury/threadlist_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: za,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unmark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unread_threads.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: ya,\n                handler: hb\n            },\n            \"/ajax/chat/settings.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE\n            },\n            \"/ajax/mercury/change_archived_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: bb,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: db,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/move_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: cb,\n                handler: hb\n            },\n            \"/ajax/mercury/change_mute_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            }\n        });\n    };\n;\n    function rb(sb, tb, ub, vb) {\n        ea.trySend(tb, ub, vb, sb._fbid);\n    };\n;\n    e.exports = eb;\n});\n__d(\"MercuryParticipants\", [\"Env\",\"ImageSourceRequest\",\"ImageSourceType\",\"MercuryAssert\",\"MercuryIDs\",\"MercuryParticipantTypes\",\"MercuryParticipantsConstants\",\"PhotoResizeModeConst\",\"MercuryServerRequests\",\"ShortProfiles\",\"copyProperties\",\"getObjectValues\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ImageSourceRequest\"), i = b(\"ImageSourceType\"), j = b(\"MercuryAssert\"), k = b(\"MercuryIDs\"), l = b(\"MercuryParticipantTypes\"), m = b(\"MercuryParticipantsConstants\"), n = b(\"PhotoResizeModeConst\"), o = b(\"MercuryServerRequests\").get(), p = b(\"ShortProfiles\"), q = b(\"copyProperties\"), r = b(\"getObjectValues\"), s = b(\"tx\"), t = ((\"fbid:\" + g.user)), u = {\n    }, v = {\n    }, w = function(ba) {\n        ba = z(ba);\n        if (u[ba.id]) {\n            q(u[ba.id], ba);\n        }\n         else u[ba.id] = q({\n        }, ba);\n    ;\n    ;\n        if (ba.vanity) {\n            v[ba.vanity] = ba.id;\n        }\n    ;\n    ;\n    };\n    function x(ba) {\n        j.isEmailParticipantID(ba);\n        var ca = k.tokenize(ba), da = ca.value;\n        return {\n            gender: m.UNKNOWN_GENDER,\n            href: null,\n            id: ba,\n            image_src: m.EMAIL_IMAGE,\n            big_image_src: m.EMAIL_IMAGE,\n            JSBNG__name: da,\n            short_name: da,\n            employee: false,\n            call_promo: false\n        };\n    };\n;\n    function y(ba, ca, da) {\n        j.allParticipantIDs(ba);\n        var ea = {\n        }, fa = {\n        };\n        ba.forEach(function(ha) {\n            if (((u[ha] && !da))) {\n                ea[ha] = q({\n                }, u[ha]);\n            }\n             else {\n                var ia = k.tokenize(ha);\n                if (((ia.type == \"fbid\"))) {\n                    var ja = ia.value;\n                    fa[ha] = ja;\n                }\n                 else if (((ia.type == \"email\"))) {\n                    ea[ha] = x(ha);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        var ga = r(fa);\n        if (ga.length) {\n            p.getMulti(ga, function(ha) {\n                {\n                    var fin148keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin148i = (0);\n                    var ia;\n                    for (; (fin148i < fin148keys.length); (fin148i++)) {\n                        ((ia) = (fin148keys[fin148i]));\n                        {\n                            var ja = fa[ia], ka = ha[ja];\n                            ea[ia] = {\n                                gender: ka.gender,\n                                href: ka.uri,\n                                id: ia,\n                                image_src: ka.thumbSrc,\n                                JSBNG__name: ka.JSBNG__name,\n                                short_name: ka.firstName,\n                                employee: ka.employee,\n                                call_promo: ka.showVideoPromo,\n                                type: ka.type,\n                                vanity: ka.vanity,\n                                is_friend: ka.is_friend,\n                                social_snippets: ka.social_snippets\n                            };\n                            w(ea[ia]);\n                        };\n                    };\n                };\n            ;\n                ca(ea);\n            });\n        }\n         else ca(ea);\n    ;\n    ;\n    };\n;\n    function z(ba) {\n        var ca = ((((ba.type === l.USER)) || ((ba.type === l.FRIEND))));\n        if (!ca) {\n            return ba;\n        }\n    ;\n    ;\n        if (((((!ba.JSBNG__name && !ba.href)) && !ba.vanity))) {\n            var da = \"Facebook User\";\n            ba.JSBNG__name = da;\n            ba.short_name = da;\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    var aa = {\n        user: t,\n        isAuthor: function(ba) {\n            return ((ba === t));\n        },\n        getIDFromVanityOrFBID: function(ba) {\n            if (!ba) {\n                return;\n            }\n        ;\n        ;\n            if (v[ba]) {\n                return v[ba];\n            }\n        ;\n        ;\n            if (ba.match(\"^\\\\d+$\")) {\n                return aa.getIDForUser(ba);\n            }\n        ;\n        ;\n        },\n        getNow: function(ba) {\n            return u[ba];\n        },\n        get: function(ba, ca) {\n            j.isParticipantID(ba);\n            aa.getMulti([ba,], function(da) {\n                ca(da[ba]);\n            });\n        },\n        getMulti: function(ba, ca, da) {\n            return y(ba, ca, false);\n        },\n        getBigImageMulti: function(ba, ca) {\n            j.allParticipantIDs(ba);\n            var da = m.BIG_IMAGE_SIZE;\n            aa.getMulti(ba, function(ea) {\n                var fa = {\n                }, ga = 0, ha = function(la, ma) {\n                    ga++;\n                    fa[la] = ma;\n                    if (((ga === ba.length))) {\n                        ca(fa);\n                    }\n                ;\n                ;\n                }, ia = function(la, ma) {\n                    u[la].big_image_src = ma.uri;\n                    ha(la, ma.uri);\n                };\n                {\n                    var fin149keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin149i = (0);\n                    var ja;\n                    for (; (fin149i < fin149keys.length); (fin149i++)) {\n                        ((ja) = (fin149keys[fin149i]));\n                        {\n                            var ka = ea[ja];\n                            if (!ka.big_image_src) {\n                                new h().setFBID(aa.getUserID(ja)).setType(i.PROFILE_PICTURE).setDimensions(da, da).setResizeMode(n.COVER).setCallback(ia.curry(ja)).send();\n                            }\n                             else ha(ka.id, ka.big_image_src);\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            });\n        },\n        getOrderedBigImageMulti: function(ba, ca) {\n            aa.getBigImageMulti(ba, function(da) {\n                var ea = ba.map(function(fa) {\n                    return da[fa];\n                });\n                ca(ea);\n            });\n        },\n        getMultiForceDownload: function(ba, ca) {\n            return y(ba, ca, true);\n        },\n        getUserID: function(ba) {\n            return k.getUserIDFromParticipantID(ba);\n        },\n        getIDForUser: function(ba) {\n            return ((\"fbid:\" + ba));\n        },\n        addParticipants: function(ba) {\n            ba.forEach(w);\n        }\n    };\n    o.subscribe(\"update-participants\", function(ba, ca) {\n        aa.addParticipants(((ca.participants || [])));\n    });\n    e.exports = aa;\n});\n__d(\"RangedCallbackManager\", [\"CallbackManagerController\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"copyProperties\"), i = b(\"createObjectFrom\"), j = function(k, l, m) {\n        this._resources = [];\n        this._reachedEndOfArray = false;\n        this._error = false;\n        this._existingIDs = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n        this._getValueHandler = k;\n        this._compareValuesHandler = l;\n        this._skipOnStrictHandler = m;\n    };\n    h(j.prototype, {\n        executeOrEnqueue: function(k, l, m, n) {\n            return this._controller.executeOrEnqueue({\n                start: k,\n                limit: l\n            }, m, {\n                strict: !!n\n            });\n        },\n        unsubscribe: function(k) {\n            this._controller.unsubscribe(k);\n        },\n        getUnavailableResources: function(k) {\n            var l = this._controller.getRequest(k), m = [];\n            if (((l && !this._reachedEndOfArray))) {\n                var n = l.request, o = this._filterForStrictResults(l.options), p = ((n.start + n.limit));\n                for (var q = o.length; ((q < p)); q++) {\n                    m.push(q);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return m;\n        },\n        addResources: function(k) {\n            k.forEach(function(l) {\n                if (!this._existingIDs[l]) {\n                    this._existingIDs[l] = true;\n                    this._resources.push(l);\n                    this._error = null;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.resortResources();\n            this._controller.runPossibleCallbacks();\n        },\n        addResourcesWithoutSorting: function(k, l) {\n            var m = this._resources.slice(0, l);\n            m = m.concat(k);\n            m = m.concat(this._resources.slice(l));\n            this._resources = m;\n            h(this._existingIDs, i(k, true));\n            this._error = null;\n            this._controller.runPossibleCallbacks();\n        },\n        removeResources: function(k) {\n            k.forEach(function(l) {\n                if (this._existingIDs[l]) {\n                    this._existingIDs[l] = false;\n                    var m = this._resources.indexOf(l);\n                    if (((m != -1))) {\n                        this._resources.splice(m, 1);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        removeAllResources: function() {\n            this._resources = [];\n            this._existingIDs = {\n            };\n        },\n        resortResources: function() {\n            this._resources = this._resources.sort(function(k, l) {\n                return this._compareValuesHandler(this._getValueHandler(k), this._getValueHandler(l));\n            }.bind(this));\n        },\n        setReachedEndOfArray: function() {\n            if (!this._reachedEndOfArray) {\n                this._reachedEndOfArray = true;\n                this._error = null;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        hasReachedEndOfArray: function() {\n            return this._reachedEndOfArray;\n        },\n        setError: function(k) {\n            if (((this._error !== k))) {\n                this._error = k;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        getError: function(k, l, m) {\n            var n = this._filterForStrictResults({\n                strict: m\n            });\n            return ((((((k + l)) > n.length)) ? this._error : null));\n        },\n        hasResource: function(k) {\n            return this._existingIDs[k];\n        },\n        getResourceAtIndex: function(k) {\n            return this._resources[k];\n        },\n        getAllResources: function() {\n            return this._resources.concat();\n        },\n        getCurrentArraySize: function() {\n            return this._resources.length;\n        },\n        _filterForStrictResults: function(k) {\n            var l = this._resources;\n            if (((((k && k.strict)) && this._skipOnStrictHandler))) {\n                l = l.filter(this._skipOnStrictHandler);\n            }\n        ;\n        ;\n            return l;\n        },\n        _constructCallbackArg: function(k, l) {\n            var m = this._filterForStrictResults(l);\n            if (((((!this._reachedEndOfArray && !this._error)) && ((((k.start + k.limit)) > m.length))))) {\n                return false;\n            }\n             else {\n                var n = m.slice(k.start, ((k.start + k.limit))), o = ((((((k.start + k.limit)) > m.length)) ? this._error : null));\n                return [n,o,];\n            }\n        ;\n        ;\n        },\n        getElementsUntil: function(k) {\n            var l = [];\n            for (var m = 0; ((m < this._resources.length)); m++) {\n                var n = this._getValueHandler(this._resources[m]);\n                if (((this._compareValuesHandler(n, k) > 0))) {\n                    break;\n                }\n            ;\n            ;\n                l.push(this._resources[m]);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFolders\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.INBOX,g.OTHER,g.ACTION_ARCHIVED,g.SPAM,], j = {\n        getSupportedFolders: function() {\n            return i.concat();\n        },\n        isSupportedFolder: function(k) {\n            return h(i, k);\n        },\n        getFromMeta: function(k) {\n            var l = k.folder;\n            if (k.is_archived) {\n                l = g.ACTION_ARCHIVED;\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryAttachment\", [\"MercuryAttachmentContentType\",\"MercuryAttachmentType\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentContentType\"), h = b(\"MercuryAttachmentType\"), i = b(\"startsWith\"), j = {\n        getAttachIconClass: function(k) {\n            switch (k) {\n              case g.PHOTO:\n                return \"MercuryPhotoIcon\";\n              case g.VIDEO:\n                return \"MercuryVideoIcon\";\n              case g.MUSIC:\n                return \"MercuryMusicIcon\";\n              case g.VOICE:\n                return \"MercuryVoiceIcon\";\n              case g.TEXT:\n                return \"MercuryTextIcon\";\n              case g.MSWORD:\n                return \"MercuryMSWordIcon\";\n              case g.MSXLS:\n                return \"MercuryMSXLSIcon\";\n              case g.MSPPT:\n                return \"MercuryMSPPTIcon\";\n            };\n        ;\n            return \"MercuryDefaultIcon\";\n        },\n        getAttachIconClassByMime: function(k) {\n            if (i(k, \"image\")) {\n                return \"MercuryPhotoIcon\";\n            }\n             else if (i(k, \"video\")) {\n                return \"MercuryVideoIcon\";\n            }\n             else if (i(k, \"audio\")) {\n                return \"MercuryMusicIcon\";\n            }\n             else if (i(k, \"text/plain\")) {\n                return \"MercuryTextIcon\";\n            }\n             else return \"MercuryDefaultIcon\"\n            \n            \n            \n        ;\n        },\n        getAttachTypeByMime: function(k) {\n            if (i(k, \"image\")) {\n                return g.PHOTO;\n            }\n             else if (i(k, \"video\")) {\n                return g.VIDEO;\n            }\n             else if (i(k, \"audio\")) {\n                return g.MUSIC;\n            }\n             else if (i(k, \"text/plain\")) {\n                return g.TEXT;\n            }\n             else return g.UNKNOWN\n            \n            \n            \n        ;\n        },\n        convertRaw: function(k) {\n            var l = [];\n            for (var m = 0; ((m < k.length)); m++) {\n                var n = k[m];\n                if (((n.attach_type === h.PHOTO))) {\n                    l.push(n);\n                }\n                 else if (n.filename) {\n                    var o = j.getAttachTypeByMime(n.filetype), p = {\n                    };\n                    p.attach_type = h.FILE;\n                    p.JSBNG__name = n.filename;\n                    p.icon_type = o;\n                    p.url = \"\";\n                    if (((o == g.PHOTO))) {\n                        p.preview_loading = true;\n                    }\n                ;\n                ;\n                    l.push(p);\n                }\n                \n            ;\n            ;\n            };\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreads\", [\"Arbiter\",\"TimestampConverter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryAttachment\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercurySingletonMixin\",\"MercuryThreadMode\",\"MessagingTag\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"MercuryFolders\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryAssert\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryGlobalActionType\"), p = b(\"MercuryIDs\"), q = b(\"MercuryLogMessageType\"), r = b(\"MercurySingletonMixin\"), s = b(\"MercuryThreadMode\"), t = b(\"MessagingTag\"), u = b(\"MercuryParticipants\"), v = b(\"MercuryServerRequests\"), w = b(\"MercuryThreadInformer\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"removeFromArray\"), aa = j.create(\"mercury_threads\");\n    function ba(na, oa, pa) {\n        var qa = y(oa.participants, true), ra = u.getIDForUser(na._fbid);\n        pa.forEach(function(sa) {\n            if (((qa[sa] !== true))) {\n                oa.participants.push(sa);\n                if (((sa === ra))) {\n                    oa.is_subscribed = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ca(na, oa, pa) {\n        z(oa.participants, pa);\n        if (((pa === u.getIDForUser(na._fbid)))) {\n            oa.is_subscribed = false;\n        }\n    ;\n    ;\n    };\n;\n    function da(na, oa) {\n        if (((na.participants[0] != oa))) {\n            z(na.participants, oa);\n            na.participants.unshift(oa);\n        }\n    ;\n    ;\n    };\n;\n    function ea(na, oa) {\n        var pa = oa.body, qa = oa.subject, ra = \"\";\n        if (qa) {\n            qa = qa.toLowerCase();\n            if (((pa.slice(0, qa.length).toLowerCase() == qa))) {\n                ra = pa;\n            }\n             else if (pa) {\n                ra = ((((qa + \" \\u00b7 \")) + pa));\n            }\n             else ra = qa;\n            \n        ;\n        ;\n        }\n         else ra = pa;\n    ;\n    ;\n        na.snippet = ra;\n        na.snippet_has_attachment = oa.has_attachment;\n        if (((oa.raw_attachments && ((oa.raw_attachments.length > 0))))) {\n            var sa = n.convertRaw(oa.raw_attachments);\n            na.snippet_attachments = sa;\n        }\n         else na.snippet_attachments = oa.attachments;\n    ;\n    ;\n        na.is_forwarded_snippet = !!oa.forward_count;\n        na.snippet_sender = oa.author;\n    };\n;\n    function fa(na, oa, pa) {\n        if (!oa) {\n            return false;\n        }\n    ;\n    ;\n        if (!oa.timestamp) {\n            return true;\n        }\n    ;\n    ;\n        var qa = !oa.unread_count;\n        if (((pa == qa))) {\n            return false;\n        }\n    ;\n    ;\n        oa.unread_count = ((pa ? 0 : 1));\n        na._threadInformer.updatedThread(oa.thread_id);\n        return true;\n    };\n;\n    function ga(na, oa) {\n        var pa = na._threads.getAllResources();\n        {\n            var fin150keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin150i = (0);\n            var qa;\n            for (; (fin150i < fin150keys.length); (fin150i++)) {\n                ((qa) = (fin150keys[fin150i]));\n                {\n                    var ra = pa[qa];\n                    if (((ra.folder == oa))) {\n                        ra.unread_count = 0;\n                        na._threads.setResource(qa, ra);\n                        na._threadInformer.updatedThread(qa);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function ha(na, oa, pa) {\n        if (((!oa || ((oa.chat_clear_time === pa))))) {\n            return false;\n        }\n    ;\n    ;\n        oa.chat_clear_time = pa;\n        na._threadInformer.reorderedMessages(oa.thread_id);\n        return true;\n    };\n;\n    function ia(na, oa, pa, qa) {\n        var ra = pa.action_type;\n        if (((((ra == l.USER_GENERATED_MESSAGE)) || ((ra == l.LOG_MESSAGE))))) {\n            ((pa.is_unread && oa.unread_count++));\n            oa.message_count++;\n            oa.is_archived = false;\n        }\n    ;\n    ;\n        switch (ra) {\n          case l.USER_GENERATED_MESSAGE:\n            da(oa, pa.author);\n            break;\n          case l.SEND_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.THREAD_IMAGE))) {\n                oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n            }\n        ;\n        ;\n            oa.snippet_attachments = pa.attachments;\n            break;\n          case l.LOG_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.SUBSCRIBE))) {\n                ba(na, oa, pa.log_message_data.added_participants);\n            }\n             else if (((sa == q.JOINABLE_JOINED))) {\n                ba(na, oa, [pa.log_message_data.joined_participant,]);\n            }\n             else if (((sa == q.UNSUBSCRIBE))) {\n                ca(na, oa, pa.author);\n            }\n             else if (((sa == q.THREAD_IMAGE))) {\n                if (!qa) {\n                    oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n                }\n            ;\n            ;\n            }\n             else if (((sa == q.THREAD_NAME))) {\n                oa.JSBNG__name = pa.log_message_data.JSBNG__name;\n            }\n            \n            \n            \n            \n        ;\n        ;\n            break;\n          case l.CHANGE_READ_STATUS:\n            if (pa.timestamp) {\n                na._threadInformer.changedThreadReadState(oa.thread_id, pa.mark_as_read, pa.timestamp);\n            }\n        ;\n        ;\n            fa(na, oa, pa.mark_as_read);\n            break;\n          case l.CLEAR_CHAT:\n            ha(na, oa, pa.clear_time);\n            break;\n          case l.CHANGE_ARCHIVED_STATUS:\n            oa.is_archived = pa.archived;\n            break;\n          case l.CHANGE_FOLDER:\n            oa.folder = pa.new_folder;\n            break;\n          case l.DELETE_MESSAGES:\n            if (qa) {\n                oa.snippet = \"...\";\n                oa.snippet_has_attachment = false;\n                oa.snippet_attachments = null;\n                oa.snippet_sender = null;\n                oa.is_forwarded_snippet = false;\n                na._threadInformer.updatedThread(pa.thread_id);\n            }\n             else if (pa.message_ids) {\n                oa.message_count = ((oa.message_count - pa.message_ids.length));\n            }\n            \n        ;\n        ;\n            break;\n          case l.CHANGE_MUTE_SETTINGS:\n            if (((pa.mute_settings !== undefined))) {\n                var ta = ((na._fbid + \"@facebook.com\"));\n                if (oa.mute_settings) {\n                    if (pa.mute_settings) {\n                        oa.mute_settings[ta] = pa.mute_settings;\n                    }\n                     else delete oa.mute_settings[ta];\n                ;\n                ;\n                    na._threadInformer.updatedThread(oa.thread_id);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            break;\n        };\n    ;\n        if (pa.action_id) {\n            oa.last_action_id = h.maxValidActionID(pa.action_id, oa.last_action_id);\n        }\n    ;\n    ;\n    };\n;\n    function ja(na, oa) {\n        var pa = na._serverRequests.tokenizeThreadID(oa.thread_id);\n        if (((pa.type == \"group\"))) {\n            aa.error(\"invalid_new_thread_message\", oa);\n            return undefined;\n        }\n    ;\n    ;\n        var qa = la(na, oa.specific_to_list), ra = {\n            thread_id: oa.thread_id,\n            last_action_id: oa.action_id,\n            participants: oa.specific_to_list,\n            JSBNG__name: null,\n            snippet: oa.body,\n            snippet_has_attachment: false,\n            snippet_attachments: [],\n            snippet_sender: oa.author,\n            unread_count: 0,\n            message_count: 0,\n            image_src: null,\n            timestamp_absolute: oa.timestamp_absolute,\n            timestamp_relative: oa.timestamp_relative,\n            timestamp: oa.timestamp,\n            canonical_fbid: ((((pa.type === \"user\")) ? pa.value : null)),\n            is_canonical_user: ((pa.type === \"user\")),\n            is_canonical: qa,\n            is_subscribed: true,\n            root_message_threading_id: oa.message_id,\n            folder: t.INBOX,\n            is_archived: false,\n            mode: s.TITAN_ORIGINATED\n        };\n        return ra;\n    };\n;\n    function ka(na) {\n        this._fbid = na;\n        this._serverRequests = v.getForFBID(this._fbid);\n        this._threadInformer = w.getForFBID(this._fbid);\n        this._threads = new k();\n        ma(this);\n    };\n;\n    x(ka.prototype, {\n        getThreadMetaNow: function(na) {\n            m.isThreadID(na);\n            return this._threads.getResource(na);\n        },\n        getThreadMeta: function(na, oa, pa) {\n            m.isThreadID(na);\n            var qa = this._threads.executeOrEnqueue(na, oa), ra = this._threads.getUnavailableResources(qa);\n            if (ra.length) {\n                var sa = this._serverRequests.tokenizeThreadID(na);\n                if (((sa.type == \"user\"))) {\n                    this.getCanonicalThreadToUser(sa.value);\n                }\n                 else this._serverRequests.fetchThreadData(ra, pa);\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        unsubscribe: function(na) {\n            this._threads.unsubscribe(na);\n        },\n        changeThreadReadStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (fa(this, pa, oa)) {\n                this._serverRequests.changeThreadReadStatus(na, oa, i.getFromMeta(pa));\n            }\n        ;\n        ;\n        },\n        changeThreadArchivedStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa.is_archived != oa))) {\n                pa.is_archived = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadArchivedStatus(na, oa);\n            }\n        ;\n        ;\n        },\n        markThreadSpam: function(na) {\n            this._serverRequests.markThreadSpam(na);\n        },\n        unmarkThreadSpam: function(na) {\n            this._serverRequests.unmarkThreadSpam(na);\n        },\n        updateThreadMuteSetting: function(na, oa) {\n            this._serverRequests.changeMutingOnThread(na, oa);\n        },\n        changeFolder: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa && ((pa.folder != oa))))) {\n                pa.folder = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadFolder(na, oa);\n            }\n        ;\n        ;\n        },\n        deleteThread: function(na) {\n            m.isThreadID(na);\n            this._serverRequests.deleteThread(na);\n        },\n        updateThreads: function(na) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var oa = {\n            };\n            na.forEach(function(pa) {\n                oa[pa.thread_id] = pa;\n            });\n            this._threads.addResourcesAndExecute(oa);\n        },\n        updateMetadataByActions: function(na, oa) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var pa = {\n            }, qa = {\n            }, ra = {\n            };\n            for (var sa = 0; ((sa < na.length)); sa++) {\n                var ta = na[sa];\n                if (ta.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ua = ta.action_type, va = ta.thread_id;\n                m.isThreadID(va);\n                var wa = this.getThreadMetaNow(va);\n                if (((((ua == l.LOG_MESSAGE)) && ((ta.log_message_type == q.SERVER_ERROR))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((!wa && !ta.action_id)) && ((ua == l.USER_GENERATED_MESSAGE))))) {\n                    wa = ja(this, ta);\n                    this._threads.setResource(va, wa);\n                }\n            ;\n            ;\n                if (wa) {\n                    if (((ua == l.DELETE_THREAD))) {\n                        wa.message_count = 0;\n                        this._threadInformer.deletedThread(va);\n                        continue;\n                    }\n                ;\n                ;\n                    var xa = !!ta.action_id;\n                    if (((((ua == l.LOG_MESSAGE)) || ((ua == l.USER_GENERATED_MESSAGE))))) {\n                        xa = !oa;\n                    }\n                ;\n                ;\n                    if (((((wa.server_timestamp && ((ta.timestamp <= wa.server_timestamp)))) && xa))) {\n                        continue;\n                    }\n                ;\n                ;\n                    if (!ra[va]) {\n                        ra[va] = x({\n                        }, wa);\n                    }\n                ;\n                ;\n                    ia(this, ra[va], ta, oa);\n                    if (((ua == l.USER_GENERATED_MESSAGE))) {\n                        pa[va] = ta;\n                    }\n                ;\n                ;\n                    if (((((((ua == l.USER_GENERATED_MESSAGE)) || ((ua == l.LOG_MESSAGE)))) || ((ua == l.SEND_MESSAGE))))) {\n                        if (((((ta && ta.timestamp)) && ((!qa[va] || ((ta.timestamp > qa[va].timestamp))))))) {\n                            qa[va] = ta;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin151keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin151i = (0);\n                var ya;\n                for (; (fin151i < fin151keys.length); (fin151i++)) {\n                    ((ya) = (fin151keys[fin151i]));\n                    {\n                        var za = ra[ya], ab = pa[ya];\n                        if (ab) {\n                            ea(za, ab);\n                        }\n                    ;\n                    ;\n                        var bb = qa[ya], cb = za.timestamp;\n                        if (bb) {\n                            if (((bb.timestamp > cb))) {\n                                za = x(za, {\n                                    timestamp_absolute: bb.timestamp_absolute,\n                                    timestamp_relative: bb.timestamp_relative,\n                                    timestamp: bb.timestamp\n                                });\n                            }\n                        ;\n                        ;\n                            var db = za.server_timestamp;\n                            if (((!oa && ((bb.timestamp > db))))) {\n                                za.server_timestamp = bb.timestamp;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        this._threads.setResource(ya, za);\n                    };\n                };\n            };\n        ;\n        },\n        getCanonicalThreadToUser: function(na, oa, pa) {\n            return this.getCanonicalThreadToParticipant(((\"fbid:\" + na)), oa, pa);\n        },\n        getCanonicalThreadToParticipant: function(na, oa, pa) {\n            var qa = this.getThreadIDForParticipant(na), ra = this._threads.getResource(qa);\n            if (((typeof ra == \"undefined\"))) {\n                ra = this.createNewLocalThread(qa, [u.getIDForUser(this._fbid),na,], oa);\n                this._serverRequests.fetchThreadData([qa,], pa);\n            }\n        ;\n        ;\n            return ra;\n        },\n        getThreadIdForUser: function(na) {\n            return ((\"user:\" + na));\n        },\n        getThreadIDForParticipant: function(na) {\n            var oa = p.tokenize(na);\n            return this.getThreadIdForUser(oa.value);\n        },\n        createNewLocalThread: function(na, oa, pa) {\n            var qa = this._threads.getResource(na);\n            if (!qa) {\n                var ra = this._serverRequests.tokenizeThreadID(na);\n                qa = {\n                    thread_id: na,\n                    last_action_id: null,\n                    participants: oa,\n                    JSBNG__name: null,\n                    snippet: \"\",\n                    snippet_has_attachment: false,\n                    snippet_sender: null,\n                    unread_count: ((pa ? pa : 0)),\n                    message_count: 0,\n                    image_src: null,\n                    timestamp_absolute: null,\n                    timestamp_relative: null,\n                    timestamp: null,\n                    canonical_fbid: ((((ra.type === \"user\")) ? ra.value : null)),\n                    is_canonical_user: ((ra.type == \"user\")),\n                    is_canonical: la(this, oa),\n                    is_subscribed: true,\n                    root_message_threading_id: null,\n                    folder: t.INBOX,\n                    is_archived: false,\n                    mode: s.TITAN_ORIGINATED\n                };\n                this._threads.setResource(na, qa);\n            }\n        ;\n        ;\n            return qa;\n        },\n        addParticipantsToThreadLocally: function(na, oa) {\n            var pa = this._threads.getResource(na);\n            if (pa) {\n                ba(this, pa, oa);\n                this._threadInformer.updatedThread(pa.thread_id);\n            }\n        ;\n        ;\n        },\n        getCanonicalUserInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"user\")) ? oa.value : null));\n        },\n        getCanonicalGroupInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"group\")) ? oa.value : null));\n        },\n        isEmptyLocalThread: function(na) {\n            var oa = this._threads.getResource(na);\n            if (!oa) {\n                return false;\n            }\n        ;\n        ;\n            var pa = this._serverRequests.tokenizeThreadID(na);\n            return ((((pa.type == \"root\")) && !oa.timestamp));\n        },\n        isNewEmptyLocalThread: function(na) {\n            if (!this.isEmptyLocalThread(na)) {\n                return false;\n            }\n        ;\n        ;\n            var oa = this._threads.getResource(na);\n            return ((oa.participants && ((oa.participants.length === 0))));\n        },\n        canReply: function(na) {\n            var oa = this._threads.getResource(na);\n            return ((((((oa && oa.is_subscribed)) && ((oa.mode != s.OBJECT_ORIGINATED)))) && ((oa.recipients_loadable || ((oa.recipients_loadable === undefined))))));\n        }\n    });\n    x(ka, r);\n    function la(na, oa) {\n        var pa = oa.filter(function(qa) {\n            return ((qa != u.getIDForUser(na._fbid)));\n        });\n        return ((pa.length <= 1));\n    };\n;\n    function ma(na) {\n        na._serverRequests.subscribe(\"update-threads\", function(oa, pa) {\n            var qa = ((pa.actions || [])).filter(function(ua) {\n                return ua.thread_id;\n            });\n            na.updateThreads(pa.threads);\n            na.updateMetadataByActions(qa, pa.from_client);\n            ((pa.threads || [])).forEach(function(ua) {\n                na._threadInformer.updatedThread(ua.thread_id);\n            });\n            var ra = ((pa.global_actions || []));\n            for (var sa = 0; ((sa < ra.length)); sa++) {\n                var ta = ra[sa];\n                if (((ta.action_type == o.MARK_ALL_READ))) {\n                    ga(na, ta.folder);\n                }\n            ;\n            ;\n            };\n        ;\n        });\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(na, oa) {\n        oa.messaging = ((oa.messaging || {\n        }));\n        oa.messaging.threads = {\n        };\n        var pa = ka._getInstances();\n        {\n            var fin152keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin152i = (0);\n            var qa;\n            for (; (fin152i < fin152keys.length); (fin152i++)) {\n                ((qa) = (fin152keys[fin152i]));\n                {\n                    oa.messaging.threads[qa] = pa[qa]._threads.dumpResources();\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = ka;\n});\n__d(\"formatDate\", [\"DateFormatConfig\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DateFormatConfig\"), h = b(\"tx\"), i = [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",], j = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",], k = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",], l = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function m(o, p) {\n        p = ((p || 2));\n        o = ((\"\" + o));\n        while (((o.length < p))) {\n            o = ((\"0\" + o));\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    function n(o, p, q, r) {\n        if (!p) {\n            return \"\";\n        }\n    ;\n    ;\n        var s = [], t = null, u = null, v = ((q ? \"getUTC\" : \"get\")), w = o[((v + \"JSBNG__Date\"))](), x = o[((v + \"Day\"))](), y = o[((v + \"Month\"))](), z = o[((v + \"FullYear\"))](), aa = o[((v + \"Hours\"))](), ba = o[((v + \"Minutes\"))](), ca = o[((v + \"Seconds\"))](), da = o[((v + \"Milliseconds\"))]();\n        for (var ea = 0; ((ea < p.length)); ea++) {\n            u = p.charAt(ea);\n            if (((u == \"\\\\\"))) {\n                ea++;\n                s.push(p.charAt(ea));\n                continue;\n            }\n        ;\n        ;\n            switch (u) {\n              case \"d\":\n                t = m(w);\n                break;\n              case \"D\":\n                t = i[x];\n                break;\n              case \"j\":\n                t = w;\n                break;\n              case \"l\":\n                t = j[x];\n                break;\n              case \"F\":\n            \n              case \"f\":\n                t = l[y];\n                break;\n              case \"m\":\n                t = m(((y + 1)));\n                break;\n              case \"M\":\n                t = k[y];\n                break;\n              case \"n\":\n                t = ((y + 1));\n                break;\n              case \"Y\":\n                t = z;\n                break;\n              case \"y\":\n                t = ((\"\" + z)).slice(2);\n                break;\n              case \"a\":\n                t = ((((aa < 12)) ? \"am\" : \"pm\"));\n                break;\n              case \"A\":\n                t = ((((aa < 12)) ? \"AM\" : \"PM\"));\n                break;\n              case \"g\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : ((aa % 12))));\n                break;\n              case \"G\":\n                t = aa;\n                break;\n              case \"h\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : m(((aa % 12)))));\n                break;\n              case \"H\":\n                t = m(aa);\n                break;\n              case \"i\":\n                t = m(ba);\n                break;\n              case \"s\":\n                t = m(ca);\n                break;\n              case \"S\":\n                if (r) {\n                    t = g.ordinalSuffixes[w];\n                }\n                 else t = m(da, 3);\n            ;\n            ;\n                break;\n              default:\n                t = u;\n            };\n        ;\n            s.push(t);\n        };\n    ;\n        return s.join(\"\");\n    };\n;\n    e.exports = n;\n});\n__d(\"MercuryMessages\", [\"Arbiter\",\"AsyncRequest\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAssert\",\"MercuryAttachmentType\",\"MercuryConfig\",\"MercuryGenericConstants\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageSourceTags\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercurySourceType\",\"MercuryTimePassed\",\"MercuryMessageIDs\",\"MercuryParticipants\",\"PresenceUtil\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"debounce\",\"formatDate\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryActionStatus\"), n = b(\"MercuryAssert\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryConfig\"), q = b(\"MercuryGenericConstants\"), r = b(\"MercuryIDs\"), s = b(\"MercuryLogMessageType\"), t = b(\"MercuryMessageSourceTags\"), u = b(\"MercuryPayloadSource\"), v = b(\"MercurySingletonMixin\"), w = b(\"MercurySourceType\"), x = b(\"MercuryTimePassed\"), y = b(\"MercuryMessageIDs\"), z = b(\"MercuryParticipants\"), aa = b(\"PresenceUtil\"), ba = b(\"RangedCallbackManager\"), ca = b(\"MercuryServerRequests\"), da = b(\"MercuryThreadInformer\"), ea = b(\"MercuryThreads\"), fa = b(\"copyProperties\"), ga = b(\"debounce\"), ha = b(\"formatDate\"), ia = b(\"randomInt\"), ja = b(\"tx\");\n    function ka(bb, cb) {\n        var db = cb;\n        if (bb._localIdsMap[cb]) {\n            db = bb._localIdsMap[cb];\n        }\n    ;\n    ;\n        return bb._messages[db];\n    };\n;\n    var la = new k();\n    function ma(bb, cb) {\n        if (((cb.JSBNG__status === undefined))) {\n            cb.JSBNG__status = m.UNSENT;\n        }\n    ;\n    ;\n        cb.timestamp_absolute = \"Today\";\n        cb.message_id = ((cb.message_id || bb.generateNewClientMessageID(cb.timestamp)));\n        var db = z.getIDForUser(bb._fbid);\n        cb.specific_to_list = ((cb.specific_to_list || []));\n        if (((cb.specific_to_list.length && ((cb.specific_to_list.indexOf(db) === -1))))) {\n            cb.specific_to_list.push(db);\n        }\n    ;\n    ;\n        if (!cb.thread_id) {\n            if (((cb.specific_to_list.length == 1))) {\n                cb.thread_id = ((\"user:\" + bb._fbid));\n            }\n             else if (((cb.specific_to_list.length == 2))) {\n                var eb = ((((cb.specific_to_list[0] == db)) ? cb.specific_to_list[1] : cb.specific_to_list[0]));\n                if (((r.tokenize(eb).type == \"email\"))) {\n                    cb.thread_id = q.PENDING_THREAD_ID;\n                }\n                 else cb.thread_id = bb._threads.getThreadIDForParticipant(eb);\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            cb.thread_id = ((cb.thread_id || ((\"root:\" + cb.message_id))));\n        }\n    ;\n    ;\n        if (!cb.specific_to_list.length) {\n            var fb = bb._serverRequests.tokenizeThreadID(cb.thread_id);\n            if (((fb.type == \"user\"))) {\n                cb.specific_to_list = [((\"fbid:\" + fb.value)),db,];\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function na(bb, cb, db, eb) {\n        var fb = ((xa(db) ? [t.CHAT,] : [])), gb = JSBNG__Date.now(), hb = ha(new JSBNG__Date(gb), ((p[\"24h_times\"] ? \"H:i\" : \"g:ia\"))), ib = {\n            action_type: cb,\n            thread_id: eb,\n            author: z.getIDForUser(bb._fbid),\n            author_email: null,\n            coordinates: null,\n            timestamp: gb,\n            timestamp_absolute: (new JSBNG__Date(gb)).toLocaleDateString(),\n            timestamp_relative: hb,\n            timestamp_time_passed: x.TODAY,\n            is_unread: false,\n            is_cleared: false,\n            is_forward: false,\n            is_filtered_content: false,\n            spoof_warning: false,\n            source: db,\n            source_tags: fb\n        };\n        return ib;\n    };\n;\n    function oa(bb) {\n        switch (bb) {\n          case u.UNKNOWN:\n        \n          case u.SERVER_INITIAL_DATA:\n        \n          case u.SERVER_FETCH_THREAD_INFO:\n        \n          case u.SERVER_THREAD_SYNC:\n            return true;\n        };\n    ;\n        return false;\n    };\n;\n    function pa(bb) {\n        return ((bb && ((bb.substr(0, 6) === \"server\"))));\n    };\n;\n    function qa(bb, cb) {\n        if (!bb._threadsToMessages[cb]) {\n            bb._threadsToMessages[cb] = new ba(function(db) {\n                return ka(bb, db).timestamp;\n            }, function(db, eb) {\n                return ((eb - db));\n            });\n        }\n    ;\n    ;\n        return bb._threadsToMessages[cb];\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(bb, cb) {\n        var db = {\n        }, eb = {\n        }, fb = sa._getInstances();\n        {\n            var fin153keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin153i = (0);\n            var gb;\n            for (; (fin153i < fin153keys.length); (fin153i++)) {\n                ((gb) = (fin153keys[fin153i]));\n                {\n                    db[gb] = {\n                    };\n                    {\n                        var fin154keys = ((window.top.JSBNG_Replay.forInKeys)((fb[gb]._messages))), fin154i = (0);\n                        var hb;\n                        for (; (fin154i < fin154keys.length); (fin154i++)) {\n                            ((hb) = (fin154keys[fin154i]));\n                            {\n                                var ib = fb[gb]._messages[hb];\n                                if (((Object.keys(ib).length === 0))) {\n                                    continue;\n                                }\n                            ;\n                            ;\n                                var jb = ib.thread_id;\n                                db[gb][jb] = ((db[gb][jb] || {\n                                }));\n                                db[gb][jb][ib.message_id] = {\n                                    action_type: ib.action_type,\n                                    author: ib.author,\n                                    is_unread: ib.is_unread,\n                                    timestamp: ib.timestamp\n                                };\n                            };\n                        };\n                    };\n                ;\n                    eb[gb] = fa({\n                    }, fb[gb]._localIdsMap);\n                };\n            };\n        };\n    ;\n        cb.messaging = ((cb.messaging || {\n        }));\n        cb.messaging.local_message_ids = eb;\n        cb.messaging.messages = db;\n    });\n    function ra(bb, cb, db) {\n        cb.forEach(function(eb) {\n            var fb = qa(bb, eb);\n            fb.setReachedEndOfArray();\n            bb._threadInformer.reorderedMessages(eb, db);\n        });\n    };\n;\n    function sa(bb) {\n        this._fbid = bb;\n        this._serverRequests = ca.getForFBID(this._fbid);\n        this._threadInformer = da.getForFBID(this._fbid);\n        this._threads = ea.getForFBID(this._fbid);\n        this._failedHistoryFetchThreads = {\n        };\n        this._threadsToMessages = {\n        };\n        this._titanMessagesCount = {\n        };\n        this._localTitanMessagesCount = {\n        };\n        this._messages = {\n        };\n        this._attachmentData = {\n        };\n        this._messagesNeedingAttachmentData = {\n        };\n        this._localIdsMap = {\n        };\n        this._serverRequests.subscribe(\"update-messages\", function(cb, db) {\n            var eb = ((db.actions || [])).filter(function(gb) {\n                var hb = gb.action_type;\n                return ((((gb.is_forward || gb.thread_id)) && ((((((((((((hb == l.LOG_MESSAGE)) || ((hb == l.USER_GENERATED_MESSAGE)))) || ((hb == l.SEND_MESSAGE)))) || ((hb == l.CLEAR_CHAT)))) || ((hb == l.DELETE_THREAD)))) || ((hb == l.DELETE_MESSAGES))))));\n            }), fb = oa(db.payload_source);\n            if (pa(db.payload_source)) {\n                eb.forEach(function(gb) {\n                    if (!gb.is_forward) {\n                        var hb = this._threads.getThreadMetaNow(gb.thread_id);\n                        if (hb) {\n                            gb.is_cleared = ((gb.timestamp < hb.chat_clear_time));\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            this.handleUpdates(eb, fb, db.payload_source, db.from_client);\n            if (db.end_of_history) {\n                ra(this, db.end_of_history, db.payload_source);\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    fa(sa.prototype, {\n        getMessagesFromIDs: function(bb) {\n            return ((bb || [])).map(ka.curry(this)).filter(function(cb) {\n                return cb;\n            });\n        },\n        hasLoadedNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return ((db.hasReachedEndOfArray() || ((db.getCurrentArraySize() >= cb))));\n        },\n        hasLoadedExactlyNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return ((db.getCurrentArraySize() == cb));\n        },\n        getThreadMessagesRange: function(bb, cb, db, eb, fb, gb) {\n            var hb = qa(this, bb), ib = function(ob) {\n                eb(ta(this, ob));\n            }.bind(this), jb = hb.executeOrEnqueue(cb, db, ib), kb = hb.getUnavailableResources(jb), lb = this._failedHistoryFetchThreads[bb];\n            if (((kb.length && !lb))) {\n                var mb = ((((this._titanMessagesCount[bb] || 0)) - ((this._localTitanMessagesCount[bb] || 0)))), nb = ((kb.length + ((this._localTitanMessagesCount[bb] || 0))));\n                this._serverRequests.fetchThreadMessages(bb, mb, nb, fb, gb);\n            }\n             else this._failedHistoryFetchThreads[bb] = false;\n        ;\n        ;\n            return jb;\n        },\n        getThreadMessagesSinceTimestamp: function(bb, cb) {\n            var db = qa(this, bb), eb = db.getElementsUntil(cb);\n            return ta(this, eb);\n        },\n        hasLoadedAllMessages: function(bb) {\n            return qa(this, bb).hasReachedEndOfArray();\n        },\n        getCurrentlyLoadedMessages: function(bb) {\n            var cb = qa(this, bb).getAllResources();\n            return ta(this, cb);\n        },\n        unsubscribe: function(bb, cb) {\n            n.isThreadID(cb);\n            var db = qa(this, cb);\n            db.unsubscribe(bb);\n        },\n        addAttachmentData: function(bb, cb, db) {\n            var eb = ka(this, bb);\n            if (eb) {\n                var fb = eb.attachments.indexOf(cb);\n                if (((fb != -1))) {\n                    eb.attachments[fb] = db;\n                    this._threadInformer.updatedMessage(eb.thread_id, eb.message_id, \"attach\");\n                }\n            ;\n            ;\n            }\n             else {\n                if (!this._attachmentData[bb]) {\n                    this._attachmentData[bb] = [];\n                }\n            ;\n            ;\n                this._attachmentData[bb].push({\n                    attach_key: cb,\n                    data: db\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdates: function(bb, cb, db, eb) {\n            var fb, gb = {\n            }, hb = {\n            };\n            for (var ib = 0; ((ib < bb.length)); ib++) {\n                var jb = bb[ib];\n                if (((jb.is_forward || ((db == u.SERVER_SEARCH))))) {\n                    if (!this._messages[jb.message_id]) {\n                        this._messages[jb.message_id] = jb;\n                        ya(this, jb);\n                    }\n                ;\n                ;\n                    continue;\n                }\n            ;\n            ;\n                var kb = jb.action_type;\n                if (((kb == l.SEND_MESSAGE))) {\n                    var lb = jb.client_message_id;\n                    if (((((lb && this._localIdsMap[lb])) && jb.JSBNG__status))) {\n                        if (((jb.JSBNG__status == m.UNCONFIRMED))) {\n                            if (!hb[jb.thread_id]) {\n                                hb[jb.thread_id] = [];\n                            }\n                        ;\n                        ;\n                            hb[jb.thread_id].push(jb.client_message_id);\n                        }\n                         else if (!gb[jb.thread_id]) {\n                            gb[jb.thread_id] = [];\n                        }\n                        \n                    ;\n                    ;\n                        var mb = ka(this, jb.client_message_id), nb = mb.JSBNG__status;\n                        mb.JSBNG__status = jb.JSBNG__status;\n                        if (((((jb.JSBNG__status === m.SUCCESS)) || jb.error_data))) {\n                            mb.error_data = jb.error_data;\n                        }\n                    ;\n                    ;\n                        if (((jb.JSBNG__status == m.SUCCESS))) {\n                            this.updateLocalMessage(jb, db);\n                            if (((jb.client_thread_id == q.PENDING_THREAD_ID))) {\n                                mb.thread_id = jb.thread_id;\n                                gb[jb.thread_id].push(mb.message_id);\n                                la.setResource(mb.message_id, mb.thread_id);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        if (((((((((((typeof nb != \"undefined\")) || ((jb.JSBNG__status == m.FAILED_UNKNOWN_REASON)))) || ((jb.JSBNG__status == m.UNABLE_TO_CONFIRM)))) || ((jb.JSBNG__status == m.SUCCESS)))) || ((jb.JSBNG__status == m.ERROR))))) {\n                            this._threadInformer.updatedMessage(jb.thread_id, ka(this, jb.client_message_id).message_id, db);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    continue;\n                }\n                 else if (((kb == l.DELETE_THREAD))) {\n                    qa(this, jb.thread_id).removeAllResources();\n                    continue;\n                }\n                 else if (((kb == l.DELETE_MESSAGES))) {\n                    var ob = jb.message_ids.map(function(wb) {\n                        return ka(this, wb).message_id;\n                    }.bind(this));\n                    fb = qa(this, jb.thread_id);\n                    fb.removeResources(ob);\n                    this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    continue;\n                }\n                 else if (((kb == l.LOG_MESSAGE))) {\n                    if (((jb.log_message_type == s.SERVER_ERROR))) {\n                        this._failedHistoryFetchThreads[jb.thread_id] = true;\n                    }\n                ;\n                ;\n                }\n                 else if (((kb == l.CLEAR_CHAT))) {\n                    var pb = qa(this, jb.thread_id).getAllResources();\n                    pb.map(ka.curry(this)).forEach(function(wb) {\n                        wb.is_cleared = true;\n                    });\n                    continue;\n                }\n                \n                \n                \n                \n            ;\n            ;\n                if (((jb.threading_id && this._localIdsMap[jb.threading_id]))) {\n                    var qb = ka(this, jb.threading_id);\n                    if (((qb && qb.is_zap))) {\n                        fb = qa(this, jb.thread_id);\n                        fb.removeResources([qb.message_id,]);\n                        this._localIdsMap[jb.threading_id] = null;\n                        this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var rb = ka(this, jb.message_id);\n                if (((((jb.threading_id && this._localIdsMap[jb.threading_id])) || ((rb && !rb.is_forward))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (!gb[jb.thread_id]) {\n                    gb[jb.thread_id] = [];\n                }\n            ;\n            ;\n                gb[jb.thread_id].push(jb.message_id);\n                this._messages[jb.message_id] = jb;\n                ya(this, jb);\n                if (((jb.threading_id && ((jb.threading_id != jb.message_id))))) {\n                    y.addServerID(jb.threading_id, jb.message_id);\n                }\n            ;\n            ;\n                if (!cb) {\n                    this._threadInformer.receivedMessage(jb);\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin155keys = ((window.top.JSBNG_Replay.forInKeys)((gb))), fin155i = (0);\n                var sb;\n                for (; (fin155i < fin155keys.length); (fin155i++)) {\n                    ((sb) = (fin155keys[fin155i]));\n                    {\n                        fb = qa(this, sb);\n                        var tb = fb.getAllResources(), ub = tb.filter(function(wb) {\n                            var xb = this._messages[wb];\n                            return ((((xb.action_type == l.LOG_MESSAGE)) && ((xb.log_message_type == s.SERVER_ERROR))));\n                        }.bind(this));\n                        fb.removeResources(ub);\n                        ua(this, sb, gb[sb]);\n                        if (eb) {\n                            va(this, sb, gb[sb]);\n                        }\n                    ;\n                    ;\n                        if (cb) {\n                            fb.addResources(gb[sb]);\n                            this._threadInformer.reorderedMessages(sb, db);\n                        }\n                         else fb.addResourcesWithoutSorting(gb[sb].reverse(), 0);\n                    ;\n                    ;\n                        this._threadInformer.updatedThread(sb);\n                    };\n                };\n            };\n        ;\n            var vb = Object.keys(hb);\n            if (vb.length) {\n                this._serverRequests.requestMessageConfirmation(hb);\n            }\n        ;\n        ;\n        },\n        sendMessage: function(bb, cb, db) {\n            cb = ((cb || Function.prototype));\n            ma(this, bb);\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            if (((bb.thread_id == ((\"root:\" + bb.message_id))))) {\n                qa(this, bb.thread_id).setReachedEndOfArray();\n            }\n        ;\n        ;\n            this._serverRequests.sendNewMessage(bb, db);\n            if (((bb.thread_id == q.PENDING_THREAD_ID))) {\n                this._messages[bb.message_id] = bb;\n                return la.executeOrEnqueue(bb.message_id, cb);\n            }\n             else cb(bb.thread_id);\n        ;\n        ;\n        },\n        zapMessage: function(bb, cb, db) {\n            if (((bb.thread_id == q.PENDING_THREAD_ID))) {\n                return;\n            }\n        ;\n        ;\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            this._serverRequests.handleUpdate({\n                actions: [fa({\n                }, bb),],\n                from_client: true,\n                payload_source: u.SERVER_ZAP\n            });\n        },\n        isFirstMessage: function(bb) {\n            var cb = qa(this, bb.thread_id);\n            if (((cb.getCurrentArraySize() === 0))) {\n                return false;\n            }\n        ;\n        ;\n            var db = cb.getResourceAtIndex(((cb.getCurrentArraySize() - 1))), eb = ka(this, db).message_id, fb = ka(this, bb.message_id).message_id;\n            return ((cb.hasReachedEndOfArray() && ((eb == fb))));\n        },\n        unsubscribeSend: function(bb) {\n            la.unsubscribe(bb);\n        },\n        resendMessage: function(bb, cb) {\n            var db = fa({\n            }, bb);\n            db.JSBNG__status = m.RESENDING;\n            db.timestamp = JSBNG__Date.now();\n            db.message_id = bb.message_id;\n            this._messages[bb.message_id] = db;\n            var eb = qa(this, bb.thread_id);\n            eb.resortResources([bb.message_id,]);\n            this.sendMessage(db, null, cb);\n            this._threadInformer.reorderedMessages(bb.thread_id, u.CLIENT_SEND_MESSAGE);\n        },\n        deleteMessages: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((((db.getCurrentArraySize() == cb.length)) && db.hasReachedEndOfArray()));\n                this._serverRequests.deleteMessages(bb, cb, eb);\n            }\n        ;\n        ;\n        },\n        markMessagesSpam: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((((db.getCurrentArraySize() == cb.length)) && db.hasReachedEndOfArray()));\n                if (eb) {\n                    this._serverRequests.markThreadSpam(bb);\n                }\n                 else this._serverRequests.markMessagesSpam(bb, cb);\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        updateLocalMessage: function(bb, cb) {\n            var db = bb.message_id, eb = bb.client_message_id;\n            this._localIdsMap[eb] = db;\n            this._messages[db] = this._messages[eb];\n            y.addServerID(eb, db);\n            this._messages[eb] = {\n            };\n            var fb = ka(this, eb);\n            if (bb.timestamp) {\n                fb.timestamp = bb.timestamp;\n            }\n        ;\n        ;\n            if (((bb.attachments && bb.attachments.length))) {\n                fb.raw_attachments = null;\n                fb.attachments = bb.attachments;\n                ya(this, fb, db);\n            }\n        ;\n        ;\n            if (bb.log_message_data) {\n                fb.log_message_data = bb.log_message_data;\n            }\n        ;\n        ;\n            if (wa(fb)) {\n                this._localTitanMessagesCount[fb.thread_id]--;\n            }\n        ;\n        ;\n        },\n        constructUserGeneratedMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.USER_GENERATED_MESSAGE, cb, db);\n            fb.body = bb;\n            fb.has_attachment = false;\n            fb.html_body = false;\n            fb.attachments = [];\n            fb.specific_to_list = ((eb || []));\n            return fb;\n        },\n        constructLogMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.LOG_MESSAGE, bb, cb);\n            fb.log_message_type = db;\n            fb.log_message_data = eb;\n            return fb;\n        },\n        generateNewClientMessageID: function(bb) {\n            var cb = ((((((((bb + \":\")) + ((ia(0, 4294967295) + 1)))) + \"-\")) + aa.getSessionID()));\n            return ((((\"\\u003C\" + cb)) + \"@mail.projektitan.com\\u003E\"));\n        },\n        getNumberLocalMessages: function(bb) {\n            return ((this._localTitanMessagesCount[bb] || 0));\n        }\n    });\n    fa(sa, v, {\n        addAttachmentData: function(bb, cb, db, eb) {\n            eb = ((eb || i.user));\n            sa.getForFBID(eb).addAttachmentData(bb, cb, db);\n        }\n    });\n    function ta(bb, cb) {\n        var db = cb.map(ka.curry(bb));\n        return db.reverse();\n    };\n;\n    function ua(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._titanMessagesCount[cb]) {\n            bb._titanMessagesCount[cb] = 0;\n        }\n    ;\n    ;\n        bb._titanMessagesCount[cb] += eb.length;\n    };\n;\n    function va(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._localTitanMessagesCount[cb]) {\n            bb._localTitanMessagesCount[cb] = 0;\n        }\n    ;\n    ;\n        bb._localTitanMessagesCount[cb] += eb.length;\n    };\n;\n    function wa(bb) {\n        var cb = bb.action_type;\n        if (((cb == l.USER_GENERATED_MESSAGE))) {\n            return !bb.is_zap;\n        }\n    ;\n    ;\n        switch (bb.log_message_type) {\n          case s.SUBSCRIBE:\n        \n          case s.UNSUBSCRIBE:\n        \n          case s.SERVER_ERROR:\n        \n          case s.LIVE_LISTEN:\n            return false;\n          default:\n            return true;\n        };\n    ;\n    };\n;\n    function xa(bb) {\n        switch (bb) {\n          case w.CHAT_WEB:\n        \n          case w.CHAT_JABBER:\n        \n          case w.CHAT_IPHONE:\n        \n          case w.CHAT_MEEBO:\n        \n          case w.CHAT_ORCA:\n        \n          case w.CHAT_TEST:\n        \n          case w.CHAT:\n        \n          case w.DESKTOP:\n            return true;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    function ya(bb, cb, db) {\n        db = ((db || cb.message_id));\n        var eb = bb._attachmentData[db];\n        if (eb) {\n            eb.forEach(function(fb) {\n                var gb = cb.attachments.indexOf(fb.attach_key);\n                if (((gb !== -1))) {\n                    cb.attachments[gb] = fb.data;\n                }\n            ;\n            ;\n            });\n            delete bb._attachmentData[db];\n        }\n         else if (((!cb.is_forward && za(bb, cb)))) {\n            bb._messagesNeedingAttachmentData[db] = true;\n            ab(bb);\n        }\n        \n    ;\n    ;\n    };\n;\n    function za(bb, cb) {\n        if (((!cb || !cb.attachments))) {\n            return false;\n        }\n    ;\n    ;\n        for (var db = 0; ((db < cb.attachments.length)); db++) {\n            var eb = cb.attachments[db];\n            if (((((typeof eb === \"string\")) && ((eb.indexOf(o.SHARE) === 0))))) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        var fb = ((cb.forward_message_ids || []));\n        for (db = 0; ((db < fb.length)); db++) {\n            var gb = ka(bb, fb[db]);\n            if (za(bb, gb)) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    var ab = ga(function(bb) {\n        var cb = {\n        };\n        {\n            var fin156keys = ((window.top.JSBNG_Replay.forInKeys)((bb._messagesNeedingAttachmentData))), fin156i = (0);\n            var db;\n            for (; (fin156i < fin156keys.length); (fin156i++)) {\n                ((db) = (fin156keys[fin156i]));\n                {\n                    var eb = ka(bb, db);\n                    if (za(bb, eb)) {\n                        cb[db] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        var fb = Object.keys(cb);\n        if (fb.length) {\n            new h(\"/ajax/mercury/attachments/fetch_shares.php\").setData({\n                message_ids: fb\n            }).setAllowCrossPageTransition(true).send();\n        }\n    ;\n    ;\n        bb._messagesNeedingAttachmentData = {\n        };\n    }, 0, this, true);\n    e.exports = sa;\n});\n__d(\"ChatOpenTab\", [\"Arbiter\",\"Banzai\",\"Bootloader\",\"ChatVisibility\",\"JSBNG__Event\",\"MercuryIDs\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"Bootloader\"), j = b(\"ChatVisibility\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryIDs\"), m = b(\"MercuryMessages\").get(), n = b(\"MercuryServerRequests\").get(), o = b(\"MercuryThreads\").get(), p = \"messaging_tracking\";\n    function q(u) {\n        o.getThreadMeta(u, function() {\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        });\n    };\n;\n    function r(u, v, w, x) {\n        k.listen(u, \"click\", function(y) {\n            if (x(v, w)) {\n                return;\n            }\n        ;\n        ;\n            return y.kill();\n        });\n    };\n;\n    function s(u, v, w) {\n        var x = {\n            referrer: ((u || \"\")),\n            message_thread_id: v,\n            message_view: \"chat\",\n            timestamp_send: JSBNG__Date.now()\n        };\n        if (((w !== undefined))) {\n            x.message_target_ids = [w,];\n        }\n    ;\n    ;\n        h.post(p, x, {\n            delay: 0,\n            retry: true\n        });\n    };\n;\n    var t = {\n        openEmptyTab: function(u, v) {\n            if (((!window.Chat || !j.isOnline()))) {\n                return true;\n            }\n        ;\n        ;\n            i.loadModules([\"ChatTabModel\",], function(w) {\n                var x = w.getEmptyTab();\n                if (!x) {\n                    x = ((\"root:\" + m.generateNewClientMessageID(JSBNG__Date.now())));\n                    o.createNewLocalThread(x, []);\n                }\n            ;\n            ;\n                q(x);\n                s(v, x);\n            });\n        },\n        listenOpenEmptyTab: function(u, v) {\n            r(u, null, v, t.openEmptyTab);\n        },\n        openThread: function(u, v) {\n            if (l.isValid(u)) {\n                q(u);\n            }\n             else n.getClientThreadID(u, q);\n        ;\n        ;\n            s(v, u);\n        },\n        listenOpenThread: function(u, v, w) {\n            r(u, v, w, t.openThread);\n        },\n        openUserTab: function(u, v) {\n            var w = o.getCanonicalThreadToUser(u);\n            q(w.thread_id);\n            s(v, w.thread_id, u);\n        },\n        listenOpenUserTab: function(u, v, w) {\n            r(u, v, w, t.openUserTab);\n        }\n    };\n    e.exports = t;\n});\n__d(\"SplitImage.react\", [\"React\",\"JSBNG__Image.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"JSBNG__Image.react\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"SplitImage\",\n        render: function() {\n            var k = this.props.size;\n            return this.transferPropsTo(g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__root\",\n                style: {\n                    width: k,\n                    height: k\n                }\n            }, this.renderImages()));\n        },\n        renderImages: function() {\n            if (!this.props.srcs) {\n                return null;\n            }\n        ;\n        ;\n            if (!((this.props.srcs instanceof Array))) {\n                return (h({\n                    src: this.props.srcs,\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n            }\n        ;\n        ;\n            switch (this.props.srcs.length) {\n              case 1:\n                return (h({\n                    src: this.props.srcs[0],\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n              case 2:\n                return this.renderTwo();\n              default:\n                return this.renderThree();\n            };\n        ;\n        },\n        renderTwo: function() {\n            var k = Math.floor(((this.props.size / 2))), l = -Math.floor(((k / 2))), m = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? ((\" \" + \"-cx-PRIVATE-splitImage__borderleft\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: m,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            }))));\n        },\n        renderThree: function() {\n            var k = Math.floor(((((this.props.size / 3)) * 2))), l = -Math.floor(((((this.props.size - k)) / 2))), m = Math.floor(((this.props.size / 2))), n = ((this.props.size - k)), o = -Math.floor(((((m - n)) / 2))), p = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? ((\" \" + \"-cx-PRIVATE-splitImage__borderright\")) : \"\")))), q = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? ((\" \" + \"-cx-PRIVATE-splitImage__borderbottom\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: p,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: q,\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            })), g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[2],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            }))));\n        }\n    });\n    e.exports = j;\n});\n__d(\"TypeaheadFacepile\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\");\n    function h() {\n    \n    };\n;\n    h.render = function(i) {\n        var j = [g.create(\"span\", {\n            className: \"splitpic leftpic\"\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[0]\n        }),]),g.create(\"span\", {\n            className: ((\"splitpic\" + ((i[2] ? \" toppic\" : \"\"))))\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[1]\n        }),]),];\n        if (i[2]) {\n            j.push(g.create(\"span\", {\n                className: \"splitpic bottompic\"\n            }, [g.create(\"img\", {\n                alt: \"\",\n                src: i[2]\n            }),]));\n        }\n    ;\n    ;\n        return g.create(\"span\", {\n            className: \"splitpics clearfix\"\n        }, j);\n    };\n    e.exports = h;\n});\n__d(\"ModalMask\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = null, i = 0, j = {\n        show: function() {\n            i++;\n            if (!h) {\n                h = g.create(\"div\", {\n                    id: \"modalMaskOverlay\"\n                });\n                g.appendContent(JSBNG__document.body, h);\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (i) {\n                i--;\n                if (((!i && h))) {\n                    g.remove(h);\n                    h = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"LitestandMessages\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FILTER_SWITCH_BEGIN: \"LitestandMessages/FilterSwitchBegin\",\n        NEWSFEED_LOAD: \"LitestandMessages/NewsFeedLoad\",\n        LEAVE_HOME: \"LitestandMessages/LeaveHome\",\n        UPDATE_HOME_COUNT: \"LitestandMessages/UpdateHomeCount\",\n        STORIES_INSERTED: \"LitestandMessages/StoriesInserted\",\n        STORIES_REMOVED: \"LitestandMessages/StoriesRemoved\",\n        NEWER_STORIES_INSERTED: \"LitestandMessages/NewerStoriesInserted\",\n        EXPAND_FILTER_SWITCHER: \"LitestandMessages/ExpandFilterSwitcher\",\n        RESTORE_FILTER_SWITCHER: \"LitestandMessages/RestoreFilterSwitcher\",\n        NEW_STORY_BAR_CLICK: \"LitestandMessages/NewStoryBarClick\",\n        COLLAPSE_FILTER_SWITCHER: \"LitestandMessages/CollapseFilterSwitcher\",\n        TOUR_BEGIN: \"LitestandMessages/TourBegin\",\n        TOUR_END: \"LitestandMessages/TourEnd\",\n        TOUR_SIDEBAR_HIGHLIGHT: \"LitestandMessages/TourSidebarHighlight\",\n        TOUR_SIDEBAR_UNHIGHLIGHT: \"LitestandMessages/TourSidebarUnhighlight\",\n        RHC_RELOADED: \"LitestandMessages/RHCReloaded\",\n        UNLOCK_FILTER_SWITCHER: \"LitestandMessage/UnlockFilterSwitcher\"\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerPermalinkConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        ARCHIVED_PATH: \"/messages/archived\",\n        BASE_PATH: \"/messages\",\n        OTHER_PATH: \"/messages/other\",\n        SPAM_PATH: \"/messages/spam\",\n        COMPOSE_POSTFIX_PATH: \"/new\",\n        SEARCH_POSTFIX_PATH: \"/search\",\n        TID_POSTFIX_PARTIAL_PATH: \"/conversation-\",\n        overriddenVanities: \"(archived|other|spam|new|search|conversation-.*)\",\n        getURIPathForThreadID: function(i, j) {\n            return ((((((j || h.BASE_PATH)) + h.TID_POSTFIX_PARTIAL_PATH)) + g.encodeComponent(g.encodeComponent(i))));\n        },\n        getThreadIDFromURI: function(i) {\n            var j = i.getPath().match(((((((h.BASE_PATH + \"(/[^/]*)*\")) + h.TID_POSTFIX_PARTIAL_PATH)) + \"([^/]+)\")));\n            if (j) {\n                var k = g.decodeComponent(g.decodeComponent(j[2]));\n                return k;\n            }\n        ;\n        ;\n        },\n        getURIPathForIDOrVanity: function(i, j) {\n            if (i.match(((((\"^\" + h.overriddenVanities)) + \"$\")))) {\n                i = ((\".\" + i));\n            }\n        ;\n        ;\n            return ((((((j || h.BASE_PATH)) + \"/\")) + i));\n        },\n        getUserIDOrVanity: function(i) {\n            var j = i.match(((h.BASE_PATH + \".*/([^/]+)/?$\"))), k = ((j && j[1])), l = h.overriddenVanities;\n            if (((!k || k.match(((((\"^\" + l)) + \"$\")))))) {\n                return false;\n            }\n             else if (k.match(((((\"^\\\\.\" + l)) + \"$\")))) {\n                return k.substr(1);\n            }\n             else return k\n            \n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryEmoji\", [\"MercuryConfig\",\"Emoji\",\"Emote\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"Emoji\"), i = b(\"Emote\"), j = {\n        htmlEmojiAndEmote: function(k, l) {\n            if (g.MessagingDisplayEmojiGK) {\n                return h.htmlEmojiAndEmote(k, l);\n            }\n             else return i.htmlEmote(k, l)\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryErrorInfo\", [\"MercuryErrorType\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryErrorType\"), h = b(\"tx\"), i = {\n        getMessage: function(j) {\n            var k = \"This message failed to send.\";\n            if (i.isConnectionError(j)) {\n                k = \"Unable to connect to Facebook. This message failed to send. \";\n            }\n             else if (j.description) {\n                k = j.description;\n            }\n            \n        ;\n        ;\n            return k;\n        },\n        isConnectionError: function(j) {\n            if (((j && ((j.type == g.TRANSPORT))))) {\n                return ((((((j.code === 1001)) || ((j.code === 1004)))) || ((j.code === 1006))));\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"MercuryChannelHandler\", [\"Arbiter\",\"ChannelConstants\",\"Env\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercuryMessages\",\"MercuryPayloadSource\",\"MessagingReliabilityLogger\",\"MessagingEvent\",\"MessagingTag\",\"MercuryParticipants\",\"PresenceUtil\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"Env\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryGlobalActionType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryPayloadSource\"), n = b(\"MessagingReliabilityLogger\"), o = b(\"MessagingEvent\"), p = b(\"MessagingTag\"), q = b(\"MercuryParticipants\"), r = b(\"PresenceUtil\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"copyProperties\");\n    function v(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.message))) {\n            n.addEntry(\"channel_receive\", \"invalid_data\");\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.message, oa = {\n            author: na.mercury_author_id,\n            author_email: na.mercury_author_email,\n            body: na.body,\n            subject: na.subject,\n            has_attachment: na.has_attachment,\n            attachments: na.attachments,\n            html_body: na.html_body,\n            thread_id: na.tid,\n            message_id: na.mid,\n            coordinates: na.mercury_coordinates,\n            spoof_warning: na.mercury_spoof_warning,\n            source: na.mercury_source,\n            source_tags: na.mercury_source_tags,\n            threading_id: na.threading_id,\n            timestamp: na.timestamp,\n            timestamp_absolute: na.timestamp_absolute,\n            timestamp_relative: na.timestamp_relative,\n            timestamp_time_passed: na.timestamp_time_passed,\n            action_type: j.USER_GENERATED_MESSAGE,\n            is_unread: na.is_unread,\n            action_id: na.action_id,\n            is_forward: false,\n            forward_count: ((na.forward_count || na.JSBNG__forward)),\n            forward_message_ids: na.forward_msg_ids,\n            location_text: na.location_text,\n            folder: ma.obj.folder\n        }, pa = [u({\n        }, oa),];\n        pa = pa.concat(((na.forward_actions || [])));\n        var qa = m.CLIENT_CHANNEL_MESSAGE;\n        s.handleUpdateWaitForThread({\n            actions: pa,\n            payload_source: qa\n        }, na.tid);\n        if (((!na.is_unread && ((na.mercury_author_id === q.user))))) {\n            var ra = {\n            };\n            ra[na.tid] = ma.obj.folder;\n            w(h.getArbiterType(\"messaging\"), {\n                obj: {\n                    JSBNG__event: o.READ,\n                    tids: [na.tid,],\n                    folder_info: ra,\n                    timestamp: na.timestamp\n                }\n            });\n        }\n    ;\n    ;\n        n.addEntry(\"channel_receive\", \"success\", [oa.thread_id,oa.message_id,r.getSessionID(),]);\n    };\n;\n    function w(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = [], oa = ((ma.obj.JSBNG__event == o.READ));\n        ma.obj.tids.forEach(function(pa) {\n            na.push({\n                action_type: j.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: pa,\n                mark_as_read: oa,\n                timestamp: ((ma.obj.timestamp || 0)),\n                folder: ma.obj.folder_info[pa]\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function x(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = [];\n        ma.obj.tids.forEach(function(oa) {\n            na.push({\n                action_type: j.DELETE_THREAD,\n                action_id: null,\n                thread_id: oa\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function y(la, ma) {\n        if (((((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids)) || !ma.obj.mids))) {\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.tids[0], oa = {\n            action_type: j.DELETE_MESSAGES,\n            action_id: null,\n            thread_id: na,\n            message_ids: ma.obj.mids\n        };\n        s.handleUpdate({\n            actions: [oa,],\n            threads: [ma.obj.updated_thread,],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function z(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.folder))) {\n            return;\n        }\n    ;\n    ;\n        var na = {\n            action_type: k.MARK_ALL_READ,\n            action_id: ma.obj.action_id,\n            folder: ma.obj.folder\n        };\n        s.handleUpdate({\n            global_actions: [na,]\n        });\n    };\n;\n    function aa(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = m.CLIENT_CHANNEL_MESSAGE;\n        ma.obj.tids.forEach(function(oa) {\n            var pa = {\n                action_type: j.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: oa,\n                archived: ma.obj.state\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, pa),],\n                payload_source: na\n            }, oa);\n        });\n    };\n;\n    function ba(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = m.CLIENT_CHANNEL_MESSAGE, oa;\n        ma.obj.tids.forEach(function(pa) {\n            if (((ma.obj.JSBNG__event == o.TAG))) {\n                oa = ma.obj.tag;\n            }\n             else oa = ((ma.obj.marked_as_spam ? p.SPAM : p.INBOX));\n        ;\n        ;\n            var qa = {\n                action_type: j.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: pa,\n                new_folder: oa\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, qa),],\n                payload_source: na\n            }, pa);\n        });\n    };\n;\n    function ca(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tag))) {\n            return;\n        }\n    ;\n    ;\n        switch (ma.obj.tag) {\n          case p.ACTION_ARCHIVED:\n            aa(la, ma);\n            break;\n          case p.INBOX:\n        \n          case p.OTHER:\n            ba(la, ma);\n            break;\n        };\n    ;\n    };\n;\n    function da(la, ma) {\n        if (((((((la != h.getArbiterType(\"inbox\"))) || !ma.obj)) || !ma.obj.seen_timestamp))) {\n            return;\n        }\n    ;\n    ;\n        s.handleUpdate({\n            message_counts: [{\n                seen_timestamp: ma.obj.seen_timestamp,\n                folder: p.INBOX\n            },],\n            unseen_thread_ids: [{\n                thread_ids: [],\n                folder: p.INBOX\n            },],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function ea(la, ma) {\n        if (((((la != h.getArbiterType(\"mercury\"))) || !ma.obj))) {\n            return;\n        }\n    ;\n    ;\n        t.synchronizeInforms(function() {\n            var na = ma.obj, oa = [];\n            ((na.actions || [])).forEach(function(pa) {\n                var qa = j.USER_GENERATED_MESSAGE;\n                if (((pa.action_type == j.LOG_MESSAGE))) {\n                    var ra = m.CLIENT_CHANNEL_MESSAGE;\n                    s.handleUpdateWaitForThread({\n                        actions: [u({\n                        }, pa),],\n                        payload_source: ra\n                    }, pa.thread_id);\n                }\n                 else if (((pa.action_type != qa))) {\n                    oa.push(pa);\n                }\n                \n            ;\n            ;\n            });\n            na.actions = oa;\n            na.payload_source = m.CLIENT_CHANNEL_MESSAGE;\n            s.handleUpdate(na);\n        });\n    };\n;\n    function fa(la, ma) {\n        s.handleRoger(ma.obj);\n    };\n;\n    function ga(la, ma) {\n        if (((((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || ((ma.obj.mute_settings === undefined)))) || !ma.obj.thread_id))) {\n            return;\n        }\n    ;\n    ;\n        var na = j.CHANGE_MUTE_SETTINGS, oa = [{\n            action_type: na,\n            action_id: null,\n            thread_id: ma.obj.thread_id,\n            mute_settings: ma.obj.mute_settings\n        },];\n        s.handleUpdate({\n            actions: oa,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function ha(la, ma) {\n        switch (ma.obj.JSBNG__event) {\n          case o.DELIVER:\n            v(la, ma);\n            break;\n          case o.READ:\n        \n          case o.UNREAD:\n            w(la, ma);\n            break;\n          case o.READ_ALL:\n            z(la, ma);\n            break;\n          case o.DELETE:\n            x(la, ma);\n            break;\n          case o.DELETE_MESSAGES:\n            y(la, ma);\n            break;\n          case o.TAG:\n            ca(la, ma);\n            break;\n          case o.REPORT_SPAM:\n            ba(la, ma);\n            break;\n          case o.READ_RECEIPT:\n            fa(la, ma);\n            break;\n          case o.CHANGE_MUTE_SETTINGS:\n            ga(la, ma);\n            break;\n        };\n    ;\n    };\n;\n    function ia(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging_zap\"))) || !ma.obj))) {\n            n.addEntry(\"channel_receive_zap\", \"invalid_data\");\n            return;\n        }\n    ;\n    ;\n        if (!ma.obj.is_canonical) {\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.sender_id;\n        if (((na == i.user))) {\n            na = ma.obj.recipient_id;\n        }\n    ;\n    ;\n        na = ((\"user:\" + na));\n        var oa = {\n            action_type: j.USER_GENERATED_MESSAGE,\n            author: ((\"fbid:\" + ma.obj.sender_id)),\n            body: ma.obj.body,\n            source: ma.obj.source,\n            timestamp: ma.obj.timestamp,\n            message_id: ma.obj.message_id,\n            thread_id: na,\n            specific_to_list: [((\"fbid:\" + ma.obj.sender_id)),((\"fbid:\" + ma.obj.recipient_id)),],\n            spoof_warning: false,\n            is_unread: true,\n            is_zap: true\n        };\n        l.zapMessage(oa);\n    };\n;\n    var ja = [], ka = {\n        turnOn: function() {\n            if (!ja.length) {\n                var la = {\n                    mercury: ea,\n                    messaging: ha,\n                    messaging_zap: ia,\n                    inbox: da\n                };\n                {\n                    var fin157keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin157i = (0);\n                    var ma;\n                    for (; (fin157i < fin157keys.length); (fin157i++)) {\n                        ((ma) = (fin157keys[fin157i]));\n                        {\n                            ja.push(g.subscribe(h.getArbiterType(ma), la[ma]));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        turnOff: function() {\n            if (ja.length) {\n                ja.forEach(g.unsubscribe);\n                ja = [];\n            }\n        ;\n        ;\n        }\n    };\n    ka.turnOn();\n    e.exports = ka;\n});\n__d(\"MercuryRoger\", [\"ArbiterMixin\",\"MercuryActionStatus\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"MercuryActionStatus\"), i = b(\"MercuryServerRequests\").get(), j = b(\"copyProperties\"), k = {\n    }, l = {\n        getSeenBy: function(m, n) {\n            if (!m) {\n                return [];\n            }\n        ;\n        ;\n            var o = [], p = k[m.thread_id], q = h.SUCCESS;\n            {\n                var fin158keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin158i = (0);\n                var r;\n                for (; (fin158i < fin158keys.length); (fin158i++)) {\n                    ((r) = (fin158keys[fin158i]));\n                    {\n                        if (((((((p[r] > m.timestamp)) && ((((m.JSBNG__status === undefined)) || ((m.JSBNG__status === q)))))) && ((!n || ((r != m.author))))))) {\n                            o.push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return o;\n        },\n        getSeenTimestamp: function(m, n) {\n            var o = k[m];\n            return ((o ? o[n] : null));\n        }\n    };\n    j(l, g);\n    i.subscribe(\"update-roger\", function(m, n) {\n        {\n            var fin159keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin159i = (0);\n            var o;\n            for (; (fin159i < fin159keys.length); (fin159i++)) {\n                ((o) = (fin159keys[fin159i]));\n                {\n                    if (!k[o]) {\n                        k[o] = {\n                        };\n                    }\n                ;\n                ;\n                    {\n                        var fin160keys = ((window.top.JSBNG_Replay.forInKeys)((n[o]))), fin160i = (0);\n                        var p;\n                        for (; (fin160i < fin160keys.length); (fin160i++)) {\n                            ((p) = (fin160keys[fin160i]));\n                            {\n                                var q = k[o][p], r = n[o][p];\n                                if (((!q || ((r > q))))) {\n                                    k[o][p] = r;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        if (n) {\n            l.inform(\"state-changed\", n);\n        }\n    ;\n    ;\n    });\n    e.exports = l;\n});\n__d(\"MercuryDelayedRoger\", [\"ArbiterMixin\",\"LiveTimer\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryMessages\",\"MercuryRoger\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LiveTimer\"), i = b(\"MercuryActionStatus\"), j = b(\"MercuryConfig\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryRoger\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = b(\"setTimeoutAcrossTransitions\"), q = {\n    }, r = {\n    }, s = j[\"roger.seen_delay\"], t = o({\n        getSeenBy: function(x, y) {\n            if (r[x]) {\n                return [];\n            }\n        ;\n        ;\n            if (!q[x]) {\n                var z = n.getThreadMetaNow(x);\n                if (z) {\n                    q[x] = {\n                        thread_id: x,\n                        author: z.participants[0],\n                        timestamp: z.timestamp\n                    };\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return l.getSeenBy(q[x], y);\n        }\n    }, g);\n    function u(x) {\n        var y = false;\n        k.getThreadMessagesRange(x, 0, 1, function(z) {\n            var aa = z[0];\n            if (!aa) {\n                return;\n            }\n        ;\n        ;\n            var ba = aa.timestamp;\n            if (((aa.action_id || ((aa.JSBNG__status == i.SUCCESS))))) {\n                ba -= h.getServerTimeOffset();\n            }\n        ;\n        ;\n            var ca = t.getSeenBy(x);\n            if (r[x]) {\n                JSBNG__clearTimeout(r[x]);\n                delete r[x];\n            }\n        ;\n        ;\n            var da = ((ba + s)), ea = ((da - JSBNG__Date.now()));\n            if (((ea > 0))) {\n                r[x] = p(function() {\n                    delete r[x];\n                    v(x);\n                }, ea);\n            }\n        ;\n        ;\n            q[x] = aa;\n            var fa = t.getSeenBy(x);\n            if (((ca.length || fa.length))) {\n                y = true;\n            }\n        ;\n        ;\n        });\n        return y;\n    };\n;\n    function v(x) {\n        var y = {\n        };\n        y[x] = true;\n        t.inform(\"state-changed\", y);\n    };\n;\n    function w(JSBNG__event, x) {\n        var y = {\n        };\n        {\n            var fin161keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin161i = (0);\n            var z;\n            for (; (fin161i < fin161keys.length); (fin161i++)) {\n                ((z) = (fin161keys[fin161i]));\n                {\n                    if (u(z)) {\n                        y[z] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin162keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin162i = (0);\n            var aa;\n            for (; (fin162i < fin162keys.length); (fin162i++)) {\n                ((aa) = (fin162keys[fin162i]));\n                {\n                    t.inform(\"state-changed\", y);\n                    break;\n                };\n            };\n        };\n    ;\n    };\n;\n    l.subscribe(\"state-changed\", function(x, y) {\n        {\n            var fin163keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin163i = (0);\n            var z;\n            for (; (fin163i < fin163keys.length); (fin163i++)) {\n                ((z) = (fin163keys[fin163i]));\n                {\n                    ((!r[z] && v(z)));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    m.subscribe(\"messages-received\", w);\n    m.subscribe(\"messages-reordered\", w);\n    m.subscribe(\"messages-updated\", w);\n    e.exports = t;\n});\n__d(\"MercuryFilters\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.UNREAD,], j = {\n        ALL: \"all\",\n        getSupportedFilters: function() {\n            return i.concat();\n        },\n        isSupportedFilter: function(k) {\n            return h(i, k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryOrderedThreadlist\", [\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryFilters\",\"MercuryFolders\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MessagingTag\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"MercuryActionTypeConstants\"), i = b(\"MercuryFilters\"), j = b(\"MercuryFolders\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercurySingletonMixin\"), m = b(\"MessagingTag\"), n = b(\"RangedCallbackManager\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"MercuryThreads\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = g.create(\"ordered_threadlist_model\"), u = i.getSupportedFilters().concat([i.ALL,m.GROUPS,]), v = j.getSupportedFolders();\n    function w(ga, ha, ia, ja) {\n        var ka = [], la = false, ma = false, na = ((ha || [])).filter(function(ua) {\n            var va = ((ua.filter || i.ALL));\n            return ((((((ua.folder == ia)) || ((!ua.folder && ((ia == m.INBOX)))))) && ((va == ja))));\n        }), oa = ga._threadlistOrderMap[ia][ja].getAllResources(), pa;\n        na.forEach(function(ua) {\n            ka = ka.concat(ua.thread_ids);\n            if (ua.error) {\n                if (((ua.end > oa.length))) {\n                    ma = ua.error;\n                }\n            ;\n            ;\n            }\n             else {\n                var va = ((ua.end - ua.start));\n                if (((ua.thread_ids.length < va))) {\n                    la = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!pa || ((ua.end > pa))))) {\n                pa = ua.end;\n            }\n        ;\n        ;\n        });\n        aa(ga, ka, ia, ja);\n        if (la) {\n            ga._threadlistOrderMap[ia][ja].setReachedEndOfArray();\n        }\n         else if (ma) {\n            ga._threadlistOrderMap[ia][ja].setError(ma);\n        }\n         else {\n            var qa = ga._threadlistOrderMap[ia][ja].getCurrentArraySize();\n            if (((pa && ((qa < pa))))) {\n                var ra = {\n                }, sa = oa.concat(ka), ta = sa.filter(function(ua) {\n                    var va = ra[ua];\n                    ra[ua] = true;\n                    return va;\n                });\n                if (ta.length) {\n                    t.warn(\"duplicate_threads\", {\n                        folder: ia,\n                        expected_final_size: pa,\n                        actual_final_size: qa,\n                        duplicate_thread_ids: ta\n                    });\n                    ga._serverRequests.fetchThreadlistInfo(pa, ta.length, ia, ((((ja == i.ALL)) ? null : ja)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n    };\n;\n    function x(ga, ha) {\n        v.forEach(function(ia) {\n            u.forEach(function(ja) {\n                w(ga, ha, ia, ja);\n            });\n        });\n    };\n;\n    function y(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = {\n                    to_add: [],\n                    to_remove: [],\n                    to_remove_if_last_after_add: {\n                    }\n                };\n            });\n        });\n        ha.forEach(function(ja) {\n            if (ja.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var ka = ja.thread_id, la = ba(ga, ka), ma = ca(ga, ka);\n            function na() {\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_add.push(ka);\n                    if (((!ga._threadlistOrderMap[la][pa].hasReachedEndOfArray() && !ga._threadlistOrderMap[la][pa].hasResource(ka)))) {\n                        ia[la][pa].to_remove_if_last_after_add[ka] = true;\n                    }\n                ;\n                ;\n                });\n            };\n        ;\n            function oa(pa) {\n                if (r(u, pa)) {\n                    if (r(ma, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                     else ia[la][pa].to_remove.push(ka);\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!la) {\n                if (((((ja.action_type === h.CHANGE_FOLDER)) || ((ja.action_type === h.CHANGE_ARCHIVED_STATUS))))) {\n                    v.forEach(function(pa) {\n                        if (((pa !== la))) {\n                            u.forEach(function(qa) {\n                                ga._threadlistOrderMap[pa][qa].removeResources([ka,]);\n                            });\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            switch (ja.action_type) {\n              case h.DELETE_THREAD:\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_remove.push(ka);\n                });\n                break;\n              case h.CHANGE_ARCHIVED_STATUS:\n            \n              case h.CHANGE_FOLDER:\n                na();\n                break;\n              case h.CHANGE_READ_STATUS:\n                oa(m.UNREAD);\n                break;\n              case h.USER_GENERATED_MESSAGE:\n            \n              case h.LOG_MESSAGE:\n                ma.forEach(function(pa) {\n                    if (da(ga, ka, la, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                ;\n                ;\n                });\n                break;\n            };\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                var la = ga._threadlistOrderMap[ja][ka];\n                aa(ga, ia[ja][ka].to_add, ja, ka);\n                for (var ma = ((la.getCurrentArraySize() - 1)); ((ma >= 0)); ma--) {\n                    var na = la.getResourceAtIndex(ma);\n                    if (!ia[ja][ka].to_remove_if_last_after_add[na]) {\n                        break;\n                    }\n                ;\n                ;\n                    ia[ja][ka].to_remove.push(na);\n                };\n            ;\n                la.removeResources(ia[ja][ka].to_remove);\n            });\n        });\n    };\n;\n    function z(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = [];\n            });\n        });\n        ha.forEach(function(ja) {\n            var ka = ba(ga, ja.thread_id), la = ca(ga, ja.thread_id);\n            if (ka) {\n                la.forEach(function(ma) {\n                    if (da(ga, ja.thread_id, ka, ma)) {\n                        ia[ka][ma].push(ja.thread_id);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                if (((ia[ja][ka].length > 0))) {\n                    aa(ga, ia[ja][ka], ja, ka);\n                }\n            ;\n            ;\n            });\n        });\n    };\n;\n    function aa(ga, ha, ia, ja) {\n        ja = ((ja || i.ALL));\n        ga._threadlistOrderMap[ia][ja].addResources(ha);\n        v.forEach(function(ka) {\n            if (((ka != ia))) {\n                ga._threadlistOrderMap[ka][ja].removeResources(ha);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ba(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = null;\n        if (!ia) {\n            ja = \"No thread metadata\";\n        }\n         else if (!ia.folder) {\n            ja = \"No thread folder\";\n        }\n        \n    ;\n    ;\n        if (ja) {\n            var ka = {\n                error: ja,\n                tid: ha\n            };\n            t.warn(\"no_thread_folder\", ka);\n            return null;\n        }\n    ;\n    ;\n        var la = ia.folder;\n        if (ia.is_archived) {\n            la = m.ACTION_ARCHIVED;\n        }\n    ;\n    ;\n        if (ga._threadlistOrderMap[la]) {\n            return la;\n        }\n         else return null\n    ;\n    };\n;\n    function ca(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = [i.ALL,];\n        if (!ia) {\n            var ka = {\n                error: \"no_thread_metadata\",\n                tid: ha\n            };\n            t.warn(\"no_thread_metadata\", ka);\n            return [];\n        }\n    ;\n    ;\n        if (ia.unread_count) {\n            ja.push(m.UNREAD);\n        }\n    ;\n    ;\n        if (!ia.is_canonical) {\n            ja.push(m.GROUPS);\n        }\n    ;\n    ;\n        return ja;\n    };\n;\n    function da(ga, ha, ia, ja) {\n        var ka = ga._threads.getThreadMetaNow(ha);\n        return ((((((ka && ka.timestamp)) && ((ba(ga, ha) == ia)))) && r(ca(ga, ha), ja)));\n    };\n;\n    function ea(ga) {\n        this._fbid = ga;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._threads = q.getForFBID(this._fbid);\n        this._threadlistOrderMap = {\n        };\n        v.forEach(function(ha) {\n            this._threadlistOrderMap[ha] = {\n            };\n            u.forEach(function(ia) {\n                this._threadlistOrderMap[ha][ia] = new n(function(ja) {\n                    return this._threads.getThreadMetaNow(ja).timestamp;\n                }.bind(this), function(ja, ka) {\n                    return ((ka - ja));\n                }, this._serverRequests.canLinkExternally.bind(this._serverRequests));\n            }.bind(this));\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-threadlist\", function(ha, ia) {\n            if (!fa(ia)) {\n                return;\n            }\n        ;\n        ;\n            var ja = ia.ordered_threadlists;\n            if (((ja && ja.length))) {\n                x(this, ja);\n            }\n             else {\n                var ka = ((ia.actions || [])).filter(function(la) {\n                    return la.thread_id;\n                });\n                z(this, ((ia.threads || [])));\n                y(this, ka);\n            }\n        ;\n        ;\n            this._threadInformer.updatedThreadlist();\n        }.bind(this));\n    };\n;\n    s(ea.prototype, {\n        getThreadlist: function(ga, ha, ia, ja, ka, la) {\n            return this.getFilteredThreadlist(ga, ha, ia, i.ALL, ja, ka, la);\n        },\n        getFilteredThreadlist: function(ga, ha, ia, ja, ka, la, ma) {\n            var na = this._threadlistOrderMap[ia][ja], oa = na.executeOrEnqueue(ga, ha, ka, la), pa = na.getUnavailableResources(oa), qa = na.getError(ga, ha, la);\n            if (((pa.length || qa))) {\n                if (((na.getCurrentArraySize() < ga))) {\n                    var ra = {\n                        start: ga,\n                        limit: ha,\n                        filter: ja,\n                        resources_size: na.getCurrentArraySize()\n                    };\n                    t.warn(\"range_with_gap\", ra);\n                }\n            ;\n            ;\n                na.setError(false);\n                this._serverRequests.fetchThreadlistInfo(na.getCurrentArraySize(), pa.length, ia, ((((ja == i.ALL)) ? null : ja)), ma);\n            }\n        ;\n        ;\n            return oa;\n        },\n        getThreadlistUntilTimestamp: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            return this._threadlistOrderMap[ha][ia].getElementsUntil(ga);\n        },\n        unsubscribe: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            this._threadlistOrderMap[ha][ia].unsubscribe(ga);\n        }\n    });\n    s(ea, l);\n    function fa(ga) {\n        switch (ga.payload_source) {\n          case k.CLIENT_CHANGE_ARCHIVED_STATUS:\n        \n          case k.CLIENT_CHANGE_READ_STATUS:\n        \n          case k.CLIENT_CHANGE_FOLDER:\n        \n          case k.CLIENT_CHANNEL_MESSAGE:\n        \n          case k.CLIENT_DELETE_MESSAGES:\n        \n          case k.CLIENT_DELETE_THREAD:\n        \n          case k.CLIENT_SEND_MESSAGE:\n        \n          case k.SERVER_SEND_MESSAGE:\n        \n          case k.SERVER_CONFIRM_MESSAGES:\n        \n          case k.SERVER_FETCH_THREADLIST_INFO:\n        \n          case k.SERVER_THREAD_SYNC:\n        \n          case k.SERVER_ZAP:\n            return true;\n          case k.SERVER_INITIAL_DATA:\n            return ga.ordered_threadlists;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    e.exports = ea;\n});\n__d(\"MercuryUnreadState\", [\"Arbiter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryFolders\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercuryGlobalActionType\"), m = b(\"MercurySingletonMixin\"), n = b(\"MercuryThreadlistConstants\"), o = b(\"MessagingTag\"), p = b(\"MercuryServerRequests\"), q = b(\"MercuryThreadInformer\"), r = b(\"MercuryThreads\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"createObjectFrom\"), v = ((h.getSupportedFolders() || [])).filter(function(ma) {\n        return ((ma != o.ACTION_ARCHIVED));\n    }), w = \"unread_thread_hash\", x = \"unseen_thread_list\", y = n.MAX_UNREAD_COUNT, z = i.create(\"mercury_unread_state\");\n    function aa(ma) {\n        this._fbid = ma;\n        this._serverRequests = p.getForFBID(this._fbid);\n        this._threadInformer = q.getForFBID(this._fbid);\n        this._threads = r.getForFBID(this._fbid);\n        this._allReadTimestamp = {\n        };\n        this._threadReadTimestamp = {\n        };\n        this._initialUnreadCount = {\n        };\n        this._maxCount = {\n        };\n        this._unreadResources = {\n        };\n        v.forEach(function(na) {\n            this._initialUnreadCount[na] = 0;\n            this._maxCount[na] = false;\n            this._unreadResources[na] = new j();\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-unread\", function(na, oa) {\n            fa(this, oa);\n            var pa = ((oa.global_actions || []));\n            for (var qa = 0; ((qa < pa.length)); qa++) {\n                var ra = pa[qa];\n                if (((ra.action_type == l.MARK_ALL_READ))) {\n                    ia(this, ra.folder, ra.timestamp);\n                }\n            ;\n            ;\n            };\n        ;\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(na, oa) {\n            ka(this, oa);\n        }.bind(this));\n    };\n;\n    t(aa.prototype, {\n        getUnreadCount: function(ma) {\n            if (this.exceedsMaxCount(ma)) {\n                z.error(\"unguarded_unread_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return ea(this, ma);\n        },\n        exceedsMaxCount: function(ma) {\n            return ((this._maxCount[ma] || ((ea(this, ma) > y))));\n        },\n        markFolderAsRead: function(ma) {\n            if (((this._maxCount[ma] || ((ea(this, ma) > 0))))) {\n                this._serverRequests.markFolderAsRead(ma);\n            }\n        ;\n        ;\n        }\n    });\n    t(aa, m);\n    function ba(ma, na, oa) {\n        ma._unreadResources[na].setResource(w, oa);\n        ma._unreadResources[na].setResource(x, Object.keys(oa));\n    };\n;\n    function ca(ma, na, oa) {\n        var pa = ma._unreadResources[na].executeOrEnqueue(w, oa), qa = ma._unreadResources[na].getUnavailableResources(pa);\n        if (qa.length) {\n            ma._serverRequests.fetchUnreadThreadIDs(na);\n        }\n    ;\n    ;\n    };\n;\n    function da(ma, na) {\n        return ma._unreadResources[na].getResource(w);\n    };\n;\n    function ea(ma, na) {\n        var oa = ma._unreadResources[na].getResource(x);\n        if (oa) {\n            return oa.length;\n        }\n         else return ma._initialUnreadCount[na]\n    ;\n    };\n;\n    function fa(ma, na) {\n        var oa;\n        ((na.unread_thread_ids || [])).forEach(function(pa) {\n            oa = pa.folder;\n            if (!la(oa)) {\n                return;\n            }\n        ;\n        ;\n            var qa = ja(ma, pa.thread_ids);\n            ba(ma, oa, u(qa, true));\n            if (((qa.length > y))) {\n                ma._maxCount[oa] = true;\n            }\n        ;\n        ;\n            ma._threadInformer.updatedUnreadState();\n        });\n        ((na.message_counts || [])).forEach(function(pa) {\n            if (((pa.unread_count === undefined))) {\n                return;\n            }\n        ;\n        ;\n            oa = pa.folder;\n            if (((pa.unread_count > y))) {\n                ma._maxCount[oa] = true;\n                ba(ma, oa, {\n                });\n                ma._threadInformer.updatedUnreadState();\n            }\n             else {\n                ma._initialUnreadCount[oa] = pa.unread_count;\n                if (((ma._initialUnreadCount[oa] === 0))) {\n                    ba(ma, oa, {\n                    });\n                }\n            ;\n            ;\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n        ((na.actions || [])).forEach(function(pa) {\n            if (pa.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var qa = k, ra = ((pa.thread_id ? pa.thread_id : pa.server_thread_id));\n            if (((pa.action_type == qa.DELETE_THREAD))) {\n                v.forEach(function(ta) {\n                    ha(ma, ta, ra);\n                });\n            }\n             else if (((((pa.action_type == qa.CHANGE_ARCHIVED_STATUS)) || ((pa.action_type == qa.CHANGE_FOLDER))))) {\n                var sa = ma._threads.getThreadMetaNow(pa.thread_id);\n                oa = h.getFromMeta(sa);\n                if (((la(oa) && ((sa.unread_count > 0))))) {\n                    ga(ma, oa, ra);\n                }\n            ;\n            ;\n                v.forEach(function(ta) {\n                    if (((ta != oa))) {\n                        ha(ma, ta, ra);\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                oa = pa.folder;\n                if (!la(oa)) {\n                    return;\n                }\n            ;\n            ;\n                if (((pa.action_type == qa.CHANGE_READ_STATUS))) {\n                    if (pa.mark_as_read) {\n                        ha(ma, oa, ra, pa.timestamp);\n                    }\n                     else ga(ma, oa, ra, pa.timestamp);\n                ;\n                ;\n                }\n                 else if (((((pa.action_type == qa.USER_GENERATED_MESSAGE)) || ((pa.action_type == qa.LOG_MESSAGE))))) {\n                    if (pa.is_unread) {\n                        ga(ma, oa, ra, pa.timestamp);\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            }\n            \n        ;\n        ;\n        });\n    };\n;\n    function ga(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            var ra = ((ma._allReadTimestamp[na] || 0)), sa = ((ma._threadReadTimestamp[oa] || 0)), ta = ((pa || Number.POSITIVE_INFINITY));\n            if (((((((ta >= ra)) && ((ta >= sa)))) && !qa[oa]))) {\n                qa[oa] = ((pa || 0));\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ha(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            if (pa) {\n                var ra = ma._threadReadTimestamp[oa];\n                if (((!ra || ((ra < pa))))) {\n                    ma._threadReadTimestamp[oa] = pa;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var sa = qa[oa];\n            if (((((pa && ((typeof sa == \"number\")))) && ((pa < sa))))) {\n                return;\n            }\n        ;\n        ;\n            if (((oa in qa))) {\n                delete qa[oa];\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ia(ma, na, oa) {\n        ma._maxCount[na] = false;\n        ba(ma, na, {\n        });\n        ma._allReadTimestamp[na] = Math.max(((ma._allReadTimestamp[na] || 0)), ((oa || 0)));\n        ma._threadInformer.updatedUnreadState();\n    };\n;\n    function ja(ma, na) {\n        return na.map(ma._serverRequests.convertThreadIDIfAvailable.bind(ma._serverRequests));\n    };\n;\n    function ka(ma, na) {\n        v.forEach(function(oa) {\n            var pa = da(ma, oa);\n            if (!pa) {\n                return;\n            }\n        ;\n        ;\n            {\n                var fin164keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin164i = (0);\n                var qa;\n                for (; (fin164i < fin164keys.length); (fin164i++)) {\n                    ((qa) = (fin164keys[fin164i]));\n                    {\n                        var ra = na[qa];\n                        if (pa[qa]) {\n                            pa[ra] = pa[qa];\n                            delete pa[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ba(ma, oa, pa);\n        });\n    };\n;\n    function la(ma) {\n        return s(v, ma);\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ma, na) {\n        na.messaging = ((na.messaging || {\n        }));\n        na.messaging.unread = {\n        };\n        na.messaging.unread_max_count = {\n        };\n        var oa = aa._getInstances();\n        {\n            var fin165keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin165i = (0);\n            var pa;\n            for (; (fin165i < fin165keys.length); (fin165i++)) {\n                ((pa) = (fin165keys[fin165i]));\n                {\n                    na.messaging.unread[pa] = {\n                    };\n                    na.messaging.unread_max_count[pa] = {\n                    };\n                    v.forEach(function(qa) {\n                        na.messaging.unread[pa][qa] = t({\n                        }, da(oa[pa], qa));\n                        na.messaging.unread_max_count[pa][qa] = oa[pa]._maxCount[qa];\n                    });\n                };\n            };\n        };\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"MercuryUnseenState\", [\"Arbiter\",\"TimestampConverter\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercurySingletonMixin\"), m = b(\"MercuryThreadlistConstants\"), n = b(\"MessagingTag\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"copyProperties\"), r = b(\"createObjectFrom\"), s = m.MAX_UNSEEN_COUNT, t = \"unseen_thread_hash\", u = \"unseen_thread_list\", v = i.create(\"mercury_unseen_state\");\n    function w(ja) {\n        this._fbid = ja;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._initialUnseenCount = 0;\n        this._lastSeenTimestamp = 0;\n        this._maxCount = false;\n        this._unseenResources = new j();\n        this._serverRequests.subscribe(\"update-unseen\", function(ka, la) {\n            ba(this, la);\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(ka, la) {\n            ha(this, la);\n        }.bind(this));\n    };\n;\n    q(w.prototype, {\n        getUnseenCount: function() {\n            if (this.exceedsMaxCount()) {\n                v.error(\"unguarded_unseen_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return aa(this);\n        },\n        exceedsMaxCount: function() {\n            return ((this._maxCount || ((aa(this) > s))));\n        },\n        markAsSeen: function() {\n            if (((((aa(this) > 0)) || this._maxCount))) {\n                this._serverRequests.markSeen();\n                ca(this, h.convertActionIDToTimestamp(this._serverRequests.getLastActionID()), []);\n            }\n        ;\n        ;\n        },\n        markThreadSeen: function(ja, ka) {\n            var la = {\n            };\n            la[ja] = null;\n            ea(this, la, ka);\n        }\n    });\n    q(w, l);\n    function x(ja, ka) {\n        ja._unseenResources.setResource(t, ka);\n        ja._unseenResources.setResource(u, Object.keys(ka));\n    };\n;\n    function y(ja, ka) {\n        var la = ja._unseenResources.executeOrEnqueue(t, ka), ma = ja._unseenResources.getUnavailableResources(la);\n        if (ma.length) {\n            ja._serverRequests.fetchUnseenThreadIDs();\n        }\n    ;\n    ;\n    };\n;\n    function z(ja) {\n        return ja._unseenResources.getResource(t);\n    };\n;\n    function aa(ja) {\n        var ka = ja._unseenResources.getResource(u);\n        if (ka) {\n            return ka.length;\n        }\n         else return ja._initialUnseenCount\n    ;\n    };\n;\n    function ba(ja, ka) {\n        var la = ia(ka);\n        if (ka.unseen_thread_ids) {\n            ka.unseen_thread_ids.forEach(function(wa) {\n                if (((wa.folder != n.INBOX))) {\n                    return;\n                }\n            ;\n            ;\n                var xa = ga(ja, wa.thread_ids), ya = ja._lastSeenTimestamp;\n                if (((la && la.seen_timestamp))) {\n                    ya = la.seen_timestamp;\n                }\n            ;\n            ;\n                ca(ja, ya, xa);\n                if (((la && ((la.unseen_count > s))))) {\n                    ja._maxCount = true;\n                }\n            ;\n            ;\n            });\n        }\n         else if (((la && la.seen_timestamp))) {\n            ja._lastSeenTimestamp = la.seen_timestamp;\n            if (((la.unseen_count > s))) {\n                ja._maxCount = true;\n                x(ja, {\n                });\n            }\n             else {\n                ja._initialUnseenCount = la.unseen_count;\n                if (((ja._initialUnseenCount === 0))) {\n                    x(ja, {\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (ja._maxCount) {\n                return;\n            }\n        ;\n        ;\n            var ma = ka.actions;\n            if (((!ma || !(ma.length)))) {\n                return;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = {\n            };\n            for (var pa = 0; ((pa < ma.length)); pa++) {\n                var qa = ma[pa];\n                if (qa.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ra = qa.action_type, sa = qa.action_id, ta = ((qa.thread_id ? qa.thread_id : qa.server_thread_id)), ua = ((((qa.folder === undefined)) || ((qa.folder == n.INBOX))));\n                if (!ua) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((ra == k.USER_GENERATED_MESSAGE)) || ((ra == k.LOG_MESSAGE))))) {\n                    var va = h.isGreaterThan(sa, na[ta]);\n                    if (((qa.is_unread && ((!na[ta] || va))))) {\n                        na[ta] = sa;\n                    }\n                ;\n                ;\n                }\n                 else if (((((ra == k.CHANGE_READ_STATUS)) && qa.mark_as_read))) {\n                    oa[ta] = sa;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            da(ja, na);\n            ea(ja, oa);\n        }\n        \n    ;\n    ;\n    };\n;\n    function ca(ja, ka, la) {\n        var ma = z(ja);\n        if (((((((ma === undefined)) || ((ka > ja._lastSeenTimestamp)))) || ja._maxCount))) {\n            ja._lastSeenTimestamp = ka;\n            la = ((la || []));\n            if (((la.length <= s))) {\n                ja._maxCount = false;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = ((z(ja) || {\n            }));\n            {\n                var fin166keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin166i = (0);\n                var pa;\n                for (; (fin166i < fin166keys.length); (fin166i++)) {\n                    ((pa) = (fin166keys[fin166i]));\n                    {\n                        if (((oa[pa] !== true))) {\n                            var qa = oa[pa];\n                            if (fa(ja, qa)) {\n                                na[pa] = qa;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ra = q(r(la, true), na);\n            x(ja, ra);\n            ja._threadInformer.updatedUnseenState();\n        }\n    ;\n    ;\n    };\n;\n    function da(ja, ka) {\n        if (ja._maxCount) {\n            return;\n        }\n    ;\n    ;\n        var la = {\n        }, ma = false;\n        {\n            var fin167keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin167i = (0);\n            var na;\n            for (; (fin167i < fin167keys.length); (fin167i++)) {\n                ((na) = (fin167keys[fin167i]));\n                {\n                    var oa = ka[na];\n                    if (fa(ja, oa)) {\n                        la[na] = oa;\n                        ma = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        if (!ma) {\n            return;\n        }\n    ;\n    ;\n        y(ja, function(pa) {\n            {\n                var fin168keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin168i = (0);\n                var qa;\n                for (; (fin168i < fin168keys.length); (fin168i++)) {\n                    ((qa) = (fin168keys[fin168i]));\n                    {\n                        var ra = la[qa];\n                        if (((!pa[qa] && fa(ja, ra)))) {\n                            pa[qa] = la[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            x(ja, pa);\n            ja._threadInformer.updatedUnseenState();\n        });\n    };\n;\n    function ea(ja, ka, la) {\n        var ma = false;\n        {\n            var fin169keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin169i = (0);\n            var na;\n            for (; (fin169i < fin169keys.length); (fin169i++)) {\n                ((na) = (fin169keys[fin169i]));\n                {\n                    ma = true;\n                    break;\n                };\n            };\n        };\n    ;\n        if (ma) {\n            y(ja, function(oa) {\n                var pa = false;\n                {\n                    var fin170keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin170i = (0);\n                    var qa;\n                    for (; (fin170i < fin170keys.length); (fin170i++)) {\n                        ((qa) = (fin170keys[fin170i]));\n                        {\n                            var ra = ka[qa], sa = h.isGreaterThan(ra, oa[qa]);\n                            if (((oa[qa] && ((!ra || sa))))) {\n                                delete oa[qa];\n                                pa = true;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (pa) {\n                    x(ja, oa);\n                    ja._threadInformer.updatedUnseenState();\n                    if (((la && ((aa(ja) === 0))))) {\n                        ja._serverRequests.markSeen();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n    };\n;\n    function fa(ja, ka) {\n        var la = h.convertActionIDToTimestamp(ka);\n        return ((la > ja._lastSeenTimestamp));\n    };\n;\n    function ga(ja, ka) {\n        return ka.map(ja._serverRequests.convertThreadIDIfAvailable.bind(ja._serverRequests));\n    };\n;\n    function ha(ja, ka) {\n        var la = z(ja);\n        if (!la) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin171keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin171i = (0);\n            var ma;\n            for (; (fin171i < fin171keys.length); (fin171i++)) {\n                ((ma) = (fin171keys[fin171i]));\n                {\n                    var na = ka[ma];\n                    if (la[ma]) {\n                        la[na] = la[ma];\n                        delete la[ma];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        x(ja, la);\n    };\n;\n    function ia(ja) {\n        var ka = ((ja.message_counts || []));\n        for (var la = 0; ((la < ka.length)); la++) {\n            if (((ka[la].folder == n.INBOX))) {\n                return ka[la];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ja, ka) {\n        ka.messaging = ((ka.messaging || {\n        }));\n        ka.messaging.unseen = {\n        };\n        ka.messaging.unseen_max_count = {\n        };\n        ka.messaging.unseen_time = {\n        };\n        var la = w._getInstances();\n        {\n            var fin172keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin172i = (0);\n            var ma;\n            for (; (fin172i < fin172keys.length); (fin172i++)) {\n                ((ma) = (fin172keys[fin172i]));\n                {\n                    ka.messaging.unseen[ma] = q({\n                    }, z(la[ma]));\n                    ka.messaging.unseen_max_count[ma] = la[ma]._maxCount;\n                    ka.messaging.unseen_time[ma] = la[ma]._lastSeenTimestamp;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = w;\n});\n__d(\"MercuryThreadMetadataRawRenderer\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"MercuryActionStatus\",\"MercuryErrorInfo\",\"MessagingTag\",\"MercuryStatusTemplates\",\"Tooltip\",\"URI\",\"WebMessengerPermalinkConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryActionStatus\"), k = b(\"MercuryErrorInfo\"), l = b(\"MessagingTag\"), m = b(\"MercuryStatusTemplates\"), n = b(\"Tooltip\"), o = b(\"URI\"), p = b(\"WebMessengerPermalinkConstants\"), q = b(\"cx\"), r = b(\"tx\"), s = {\n        renderParticipantListWithNoThreadName: function(u, v, w, x, y, z) {\n            var aa = {\n                callback: true,\n                check_length: true,\n                show_unread_count: true\n            };\n            z = ((z || {\n            }));\n            var ba = {\n            };\n            {\n                var fin173keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin173i = (0);\n                var ca;\n                for (; (fin173i < fin173keys.length); (fin173i++)) {\n                    ((ca) = (fin173keys[fin173i]));\n                    {\n                        if (aa[ca]) {\n                            ba[ca] = z[ca];\n                            delete z[ca];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = w.map(function(ia) {\n                return x[ia];\n            }), ea = this.renderRawParticipantList(u, da, w.length, z);\n            ea = this.renderRawTitleWithUnreadCount(ea, ((ba.show_unread_count ? v.unread_count : 0)));\n            var fa = z.abbr_mode, ga = {\n            };\n            {\n                var fin174keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin174i = (0);\n                var ha;\n                for (; (fin174i < fin174keys.length); (fin174i++)) {\n                    ((ha) = (fin174keys[fin174i]));\n                    {\n                        ga[ha] = z[ha];\n                    ;\n                    };\n                };\n            };\n        ;\n            ga.abbr_mode = true;\n            y.forEach(function(ia) {\n                var ja = ((((y.length > 1)) ? this._cloneIfDOMElement(ea) : ea));\n                i.setContent(ia, ja);\n                if (((((ba.check_length && !fa)) && ((ia.scrollWidth > ia.clientWidth))))) {\n                    var ka = this.renderRawParticipantList(u, da, w.length, ga), la = this.renderRawTitleWithUnreadCount(ka, ((ba.show_unread_count ? v.unread_count : 0)));\n                    i.setContent(ia, la);\n                }\n            ;\n            ;\n            }.bind(this));\n            ((ba.callback && ba.callback(ea)));\n        },\n        renderRawParticipantList: function(u, v, w, x) {\n            var y = {\n                abbr_mode: true,\n                last_separator_uses_and: true,\n                names_renderer: true\n            };\n            x = ((x || {\n            }));\n            var z = null;\n            if (x.names_renderer) {\n                z = x.names_renderer(v);\n            }\n             else z = v.map(function(ca) {\n                return ca.JSBNG__name;\n            });\n        ;\n        ;\n            var aa = null;\n            if (((z.length === 0))) {\n                if (!u) {\n                    aa = \"New Message\";\n                }\n                 else aa = \"No Participants\";\n            ;\n            ;\n            }\n             else if (((z.length == 1))) {\n                aa = z[0];\n            }\n             else if (((z.length == 2))) {\n                var ba = {\n                    participant1: z[0],\n                    participant2: z[1]\n                };\n                if (x.last_separator_uses_and) {\n                    aa = r._(\"{participant1} and {participant2}\", ba);\n                }\n                 else aa = r._(\"{participant1}, {participant2}\", ba);\n            ;\n            ;\n            }\n             else if (x.last_separator_uses_and) {\n                if (x.abbr_mode) {\n                    aa = r._(\"{participant1} and {others_link}\", {\n                        participant1: z[0],\n                        others_link: this.renderRawParticipantCount(u, {\n                            render_subset: true,\n                            count: ((w - 1))\n                        })\n                    });\n                }\n                 else if (((z.length == 3))) {\n                    aa = r._(\"{participant1}, {participant2} and {participant3}\", {\n                        participant1: z[0],\n                        participant2: z[1],\n                        participant3: z[2]\n                    });\n                }\n                 else aa = r._(\"{participant1}, {participant2} and {others_link}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    others_link: this.renderRawParticipantCount(u, {\n                        render_subset: true,\n                        count: ((w - 2))\n                    })\n                });\n                \n            ;\n            ;\n            }\n             else if (((z.length == 3))) {\n                aa = r._(\"{participant1}, {participant2}, {participant3}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    participant3: z[2]\n                });\n            }\n             else aa = r._(\"{participant1}, {participant2}, {participant3}, {others_link}\", {\n                participant1: z[0],\n                participant2: z[1],\n                participant3: z[2],\n                others_link: this.renderRawParticipantCount(u, {\n                    render_subset: true,\n                    count: ((w - 3))\n                })\n            });\n            \n            \n            \n            \n        ;\n        ;\n            if (Array.isArray(aa)) {\n                aa = i.create(\"span\", {\n                }, aa);\n            }\n        ;\n        ;\n            return aa;\n        },\n        renderRawTitleWithUnreadCount: function(u, v) {\n            var w = u;\n            if (((v && ((v > 1))))) {\n                w = i.create(\"span\", {\n                }, r._(\"{conversation_title} ({unread_count})\", {\n                    conversation_title: u,\n                    unread_count: v\n                }));\n            }\n        ;\n        ;\n            return w;\n        },\n        renderRawParticipantCount: function(u, v) {\n            var w = v.render_subset, x;\n            if (!w) {\n                x = ((((v.count > 1)) ? r._(\"{num} people\", {\n                    num: v.count\n                }) : \"1 person\"));\n            }\n             else x = ((((v.count > 1)) ? r._(\"{others_count} others\", {\n                others_count: v.count\n            }) : \"1 other\"));\n        ;\n        ;\n            return x;\n        },\n        renderShortNames: function(u) {\n            if (((u.length == 1))) {\n                return [u[0].JSBNG__name,];\n            }\n        ;\n        ;\n            return u.map(function(v) {\n                return v.short_name;\n            });\n        },\n        getUserCanonicalTitanURL: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\"), y = u.substr(((u.indexOf(\":\") + 1)));\n            x.setPath(((((t(w) + \"/\")) + y)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        getTitanURLWithServerID: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\");\n            x.setPath(p.getURIPathForThreadID(u, t(w)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        renderUserCanonicalTitanLink: function(u, v, w, x) {\n            var y = this.getUserCanonicalTitanURL(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderTitanLinkWithServerID: function(u, v, w, x) {\n            var y = this.getTitanURLWithServerID(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderStatusIndicator: function(u, v, w) {\n            var x;\n            if (((u == j.RESENDING))) {\n                x = this.renderResendIndicator();\n            }\n             else if (((((((((u !== undefined)) && ((u != j.UNSENT)))) && ((u != j.UNCONFIRMED)))) && ((u != j.SUCCESS))))) {\n                x = this.renderErrorIndicator(v, w);\n            }\n            \n        ;\n        ;\n            return x;\n        },\n        renderResendIndicator: function() {\n            return m[\":fb:mercury:resend-indicator\"].render();\n        },\n        renderErrorIndicator: function(u, v) {\n            if (!u) {\n                return null;\n            }\n        ;\n        ;\n            var w = m[\":fb:mercury:error-indicator\"].render(), x = u.is_transient, y = k.getMessage(u);\n            if (x) {\n                if (k.isConnectionError(u)) {\n                    y = r._(\"{message} Check your network connection or click to try again.\", {\n                        message: y\n                    });\n                }\n                 else y = r._(\"{message} Click to send again.\", {\n                    message: y\n                });\n            ;\n            }\n        ;\n        ;\n            n.set(w, y, \"above\", \"center\");\n            if (((v && x))) {\n                g.listen(w, \"click\", v);\n                w.setAttribute(\"tabindex\", \"0\");\n                h.addClass(w, \"-cx-PRIVATE-fbMercuryStatus__clickableerror\");\n            }\n        ;\n        ;\n            return w;\n        },\n        _cloneIfDOMElement: function(u) {\n            if (u.cloneNode) {\n                return u.cloneNode();\n            }\n             else return u\n        ;\n        }\n    };\n    function t(u) {\n        var v = p.BASE_PATH;\n        if (((u && ((u != l.INBOX))))) {\n            v += ((\"/\" + u));\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    e.exports = s;\n});\n__d(\"MercurySeenByAll\", [\"CSS\",\"DataStore\",\"DOM\",\"MercuryParticipants\",\"MercuryDelayedRoger\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryThreads\").get(), m = {\n    }, n = {\n        updateOnSeenChange: function(p, q) {\n            m[p.tagName] = true;\n            h.set(p, \"thread-id\", q.thread_id);\n            g.addClass(p, \"seenByListener\");\n            o(p, q);\n        }\n    };\n    function o(p, q) {\n        var r = q.participants.filter(function(t) {\n            return ((t !== j.user));\n        }), s = ((((q.participants.length > 0)) && ((q.participants[0] === j.user))));\n        g.conditionClass(p, \"repliedLast\", s);\n        g.conditionClass(p, \"seenByAll\", ((s && ((k.getSeenBy(q.thread_id).length === r.length)))));\n    };\n;\n    k.subscribe(\"state-changed\", function(p, q) {\n        {\n            var fin175keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin175i = (0);\n            var r;\n            for (; (fin175i < fin175keys.length); (fin175i++)) {\n                ((r) = (fin175keys[fin175i]));\n                {\n                    var s = i.scry(JSBNG__document.body, ((r + \".seenByListener\")));\n                    for (var t = 0; ((t < s.length)); t++) {\n                        var u = s[t], v = h.get(u, \"thread-id\");\n                        if (q[v]) {\n                            l.getThreadMeta(v, function(w) {\n                                o(u, w);\n                            });\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = n;\n});\n__d(\"MercuryThreadMetadataRenderer\", [\"MercuryConfig\",\"CSS\",\"DOM\",\"HTML\",\"JSLogger\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryEmoji\",\"MercuryMessageSourceTags\",\"MercurySingletonMixin\",\"MercuryThreadMetadataRawRenderer\",\"MercuryParticipants\",\"MercuryParticipantsConstants\",\"React\",\"MercurySeenByAll\",\"MercuryServerRequests\",\"SplitImage.react\",\"Style\",\"MercuryThreadlistIconTemplates\",\"MercuryThreads\",\"Tooltip\",\"URI\",\"arrayContains\",\"createArrayFrom\",\"copyProperties\",\"cx\",\"formatDate\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"JSLogger\"), l = b(\"MercuryAttachment\"), m = b(\"MercuryAttachmentType\"), n = b(\"MercuryEmoji\"), o = b(\"MercuryMessageSourceTags\"), p = b(\"MercurySingletonMixin\"), q = b(\"MercuryThreadMetadataRawRenderer\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryParticipantsConstants\"), t = b(\"React\"), u = b(\"MercurySeenByAll\"), v = b(\"MercuryServerRequests\"), w = b(\"SplitImage.react\"), x = b(\"Style\"), y = b(\"MercuryThreadlistIconTemplates\"), z = b(\"MercuryThreads\"), aa = b(\"Tooltip\"), ba = b(\"URI\"), ca = b(\"arrayContains\"), da = b(\"createArrayFrom\"), ea = b(\"copyProperties\"), fa = b(\"cx\"), ga = b(\"formatDate\"), ha = b(\"tx\"), ia = k.create(\"wm_timestamp\");\n    function ja(pa) {\n        this._fbid = pa;\n        this._serverRequests = v.getForFBID(pa);\n        this._threads = z.getForFBID(pa);\n    };\n;\n    ea(ja, p);\n    ea(ja.prototype, {\n        renderTimestamp: function(pa, qa, ra, sa) {\n            if (sa) {\n                if (!qa) {\n                    ia.warn(\"no_title\");\n                    qa = (new JSBNG__Date(sa)).toLocaleDateString();\n                }\n            ;\n            ;\n                pa.setAttribute(\"title\", qa);\n                pa.setAttribute(\"data-utime\", ((sa / 1000)));\n                if (!ra) {\n                    ia.warn(\"no_display\");\n                    ra = ga(new JSBNG__Date(sa), ((g[\"24h_times\"] ? \"H:i\" : \"g:ia\")));\n                }\n            ;\n            ;\n                i.setContent(pa, ra);\n                h.show(pa);\n            }\n        ;\n        ;\n        },\n        renderMessageSourceTags: function(pa, qa, ra, sa) {\n            var ta = \"\", ua = \"\", va = \"\";\n            if (ca(ra, o.MESSENGER)) {\n                ta = \"Sent from Messenger\";\n                ua = new ba(\"/mobile/messenger\");\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemessenger\";\n            }\n             else if (ca(ra, o.MOBILE)) {\n                ta = \"Sent from Mobile\";\n                ua = new ba(\"/mobile/\");\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemobile\";\n            }\n             else if (ca(ra, o.CHAT)) {\n                ta = \"Sent from chat\";\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourcechat\";\n            }\n             else if (ca(ra, o.EMAIL)) {\n                if (sa) {\n                    ta = ha._(\"Sent from {email}\", {\n                        email: sa\n                    });\n                }\n                 else ta = \"Sent from email\";\n            ;\n            ;\n                va = \"-cx-PRIVATE-webMessengerMessageGroup__sourceemail\";\n            }\n            \n            \n            \n        ;\n        ;\n            if (va) {\n                aa.set(pa, ta);\n                h.addClass(qa, va);\n                if (ua) {\n                    pa.setAttribute(\"href\", ua);\n                }\n                 else pa.removeAttribute(\"href\");\n            ;\n            ;\n            }\n             else h.hide(pa);\n        ;\n        ;\n        },\n        renderMessageLocation: function(pa, qa, ra) {\n            var sa = ba(\"/ajax/messaging/hovercard/map.php\").setQueryData(ra);\n            pa.setAttribute(\"data-hovercard\", sa);\n            h.removeClass(pa, \"-cx-PRIVATE-webMessengerMessageGroup__nolocation\");\n            h.show(qa);\n        },\n        renderSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                h.addClass(pa, \"-cx-PRIVATE-webMessengerMessageGroup__spoofwarning\");\n                aa.set(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderChatSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                i.appendContent(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderCoreThreadlist: function(pa, qa, ra, sa, ta) {\n            sa = ((sa || {\n            }));\n            this.renderThreadImage(pa, qa.getNode(\"image\"));\n            var ua = qa.getNode(\"accessibleName\"), va = [qa.getNode(\"JSBNG__name\"),];\n            if (ua) {\n                va.push(ua);\n            }\n        ;\n        ;\n            oa(this, pa, va, sa);\n            if (((pa.folder && ta))) {\n                na(qa.getNode(\"folderBadge\"), pa.folder);\n            }\n        ;\n        ;\n            var wa = qa.getNode(\"timestamp\");\n            this.renderTimestamp(wa, pa.timestamp_absolute, pa.timestamp_relative, pa.timestamp);\n            this.renderSnippet(pa, qa.getNode(\"snippet\"));\n            la(qa, pa);\n            ra(qa, pa);\n        },\n        renderAndSeparatedParticipantList: function(pa, qa, ra) {\n            ra = ((ra || {\n            }));\n            ra.last_separator_uses_and = true;\n            this._threads.getThreadMeta(pa, function(sa) {\n                oa(this, sa, qa, ra);\n            }.bind(this));\n        },\n        renderSnippet: function(pa, qa) {\n            var ra = false, sa = i.create(\"span\");\n            h.addClass(sa, \"MercuryRepliedIndicator\");\n            i.appendContent(qa, sa);\n            u.updateOnSeenChange(sa, pa);\n            var ta = pa.snippet;\n            if (ta) {\n                if (pa.snippet_has_attachment) {\n                    i.appendContent(qa, i.create(\"span\", {\n                        className: \"MercuryAttachmentIndicator\"\n                    }));\n                }\n            ;\n            ;\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message:\"));\n                }\n            ;\n            ;\n                if (((ta.substr(0, 4) == \"?OTR\"))) {\n                    ta = \"[encrypted message]\";\n                }\n                 else ta = ta.replace(/\\r\\n|[\\r\\n]/g, \" \");\n            ;\n            ;\n                ta = j(n.htmlEmojiAndEmote(ta));\n            }\n             else {\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message\"));\n                }\n            ;\n            ;\n                if (((((pa.snippet_has_attachment && pa.snippet_attachments)) && pa.snippet_attachments.length))) {\n                    ra = true;\n                    ta = i.create(\"span\");\n                    ma(this, pa, ta);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ua = pa.participants.length;\n            if (pa.is_subscribed) {\n                ua--;\n            }\n        ;\n        ;\n            if (((((((!ra && pa.snippet_sender)) && ((r.getIDForUser(this._fbid) != pa.snippet_sender)))) && ((ua > 1))))) {\n                r.get(pa.snippet_sender, function(va) {\n                    if (va.short_name) {\n                        i.appendContent(qa, ha._(\"{name}: {conversation_snippet}\", {\n                            JSBNG__name: va.short_name,\n                            conversation_snippet: ta\n                        }));\n                    }\n                     else i.appendContent(qa, ta);\n                ;\n                ;\n                });\n            }\n             else i.appendContent(qa, ta);\n        ;\n        ;\n        },\n        getTitanURL: function(pa, qa, ra) {\n            if (((pa.substr(0, pa.indexOf(\":\")) == \"user\"))) {\n                q.getUserCanonicalTitanURL(pa, qa, ra);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(sa) {\n                q.getTitanURLWithServerID(sa, qa, ra);\n            });\n        ;\n        ;\n        },\n        renderTitanLink: function(pa, qa, ra, sa) {\n            if (((pa.substr(0, pa.indexOf(\":\")) == \"user\"))) {\n                q.renderUserCanonicalTitanLink(pa, qa, ra, sa);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(ta) {\n                q.renderTitanLinkWithServerID(ta, qa, ra, sa);\n            });\n        ;\n        ;\n        },\n        renderThreadImage: function(pa, qa) {\n            if (pa.image_src) {\n                var ra = w({\n                    srcs: pa.image_src,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(ra, qa);\n                return;\n            }\n        ;\n        ;\n            var sa = r.getIDForUser(this._fbid), ta = [], ua = pa.participants.filter(function(va) {\n                return ((va != sa));\n            });\n            if (!ua.length) {\n                ta = [sa,];\n            }\n             else if (((ua.length == 1))) {\n                ta = [ua[0],];\n            }\n             else ta = ua.slice(0, 3);\n            \n        ;\n        ;\n            this.renderParticipantImages(ta, qa);\n        },\n        renderParticipantImages: function(pa, qa) {\n            r.getOrderedBigImageMulti(pa, function(ra) {\n                var sa = w({\n                    srcs: ra,\n                    border: true,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(sa, qa);\n            });\n        },\n        renderParticipantList: function(pa, qa, ra, sa) {\n            return q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa);\n        },\n        renderThreadNameAndParticipantList: function(pa, qa, ra, sa) {\n            var ta = q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa), ua = this._threads.getThreadMetaNow(pa);\n            if (!ua.JSBNG__name) {\n                return ta;\n            }\n        ;\n        ;\n            return ha._(\"{conversation_name} [with {participant_list}]\", {\n                conversation_name: ua.JSBNG__name,\n                participant_list: ta\n            });\n        },\n        renderParticipantCount: function(pa, qa) {\n            return q.renderRawParticipantCount(this._serverRequests.getServerThreadIDNow(pa), qa);\n        }\n    });\n    function ka(pa) {\n        if (!pa.snippet_attachments) {\n            return [];\n        }\n    ;\n    ;\n        return pa.snippet_attachments.filter(function(qa) {\n            return ((qa.attach_type === m.PHOTO));\n        });\n    };\n;\n    function la(pa, qa) {\n        var ra = ka(qa);\n        if (((ra.length === 0))) {\n            return;\n        }\n    ;\n    ;\n        var sa = ra[0].thumbnail_url;\n        if (!sa) {\n            return;\n        }\n    ;\n    ;\n        var ta = ((((ra.length == 1)) ? \"snippet-thumbnail-single\" : \"snippet-thumbnail-multiple\")), ua = pa.getNode(ta);\n        if (!ua) {\n            return;\n        }\n    ;\n    ;\n        var va = i.JSBNG__find(ua, \"i\");\n        x.set(va, \"background-image\", ((((\"url(\" + sa)) + \")\")));\n        h.show(ua);\n    };\n;\n    function ma(pa, qa, ra) {\n        var sa = ((qa.snippet_sender && ((r.getIDForUser(pa._fbid) == qa.snippet_sender)))), ta = function(ya) {\n            if (((!qa.snippet_sender || sa))) {\n                ya(null);\n                return;\n            }\n        ;\n        ;\n            r.get(qa.snippet_sender, function(za) {\n                ya(za.short_name);\n            });\n        }, ua = ka(qa), va = ((ua.length == qa.snippet_attachments.length)), wa = ((((((qa.snippet_attachments.length === 1)) && qa.snippet_attachments[0].metadata)) && ((qa.snippet_attachments[0].metadata.type == \"fb_voice_message\")))), xa = ((((qa.snippet_attachments.length === 1)) && ((qa.snippet_attachments[0].attach_type === m.STICKER))));\n        ta(function(ya) {\n            var za = null;\n            if (va) {\n                var ab = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                if (((ua.length === 1))) {\n                    za = ((sa ? \"You sent a photo.\" : ha._(\"{name} sent a photo.\", {\n                        JSBNG__name: ya\n                    })));\n                }\n                 else za = ((sa ? ha._(\"You sent {num_photos} photos.\", {\n                    num_photos: ua.length\n                }) : ha._(\"{name} sent {num_photos} photos.\", {\n                    JSBNG__name: ya,\n                    num_photos: ua.length\n                })));\n            ;\n            ;\n                h.addClass(ab, l.getAttachIconClass(ua[0].icon_type));\n                i.appendContent(ab, za);\n                i.appendContent(ra, ab);\n            }\n             else if (wa) {\n                var bb = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                za = ((sa ? \"You sent a voice message.\" : ha._(\"{name} sent a voice message.\", {\n                    JSBNG__name: ya\n                })));\n                h.addClass(bb, l.getAttachIconClass(qa.snippet_attachments[0].icon_type));\n                i.appendContent(bb, za);\n                i.appendContent(ra, bb);\n            }\n             else if (xa) {\n                za = ((sa ? \"You sent a sticker.\" : ha._(\"{name} sent a sticker.\", {\n                    JSBNG__name: ya\n                })));\n                i.appendContent(ra, za);\n            }\n             else qa.snippet_attachments.filter(function(cb) {\n                return ((((cb.attach_type == m.FILE)) || ((cb.attach_type == m.PHOTO))));\n            }).forEach(function(cb) {\n                var db = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                i.appendContent(db, cb.JSBNG__name);\n                h.addClass(db, l.getAttachIconClass(cb.icon_type));\n                i.appendContent(ra, db);\n            });\n            \n            \n        ;\n        ;\n        });\n    };\n;\n    function na(pa, qa) {\n        da(pa).forEach(function(ra) {\n            i.setContent(ra, qa);\n        });\n    };\n;\n    function oa(pa, qa, ra, sa) {\n        ra = da(ra);\n        if (qa.JSBNG__name) {\n            var ta = q.renderRawTitleWithUnreadCount(qa.JSBNG__name, ((sa.show_unread_count ? qa.unread_count : 0)));\n            ra.forEach(function(va) {\n                i.setContent(va, ta);\n            });\n            ((sa.callback && sa.callback(ta)));\n            return;\n        }\n    ;\n    ;\n        var ua = qa.participants;\n        if (((qa.participants.length > 1))) {\n            ua = qa.participants.filter(function(va) {\n                return ((va != r.getIDForUser(pa._fbid)));\n            });\n        }\n    ;\n    ;\n        r.getMulti(ua, function(va) {\n            q.renderParticipantListWithNoThreadName(pa._serverRequests.getServerThreadIDNow(qa.thread_id), qa, ua, va, ra, sa);\n        });\n    };\n;\n    e.exports = ja;\n});\n__d(\"MercuryChatUtils\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        canOpenChatTab: function(i) {\n            var j = ((i.is_canonical && !i.is_canonical_user));\n            return ((((i.is_subscribed && !j)) && ((i.canonical_fbid != g.user))));\n        }\n    };\n    e.exports = h;\n});\n__d(\"RenderManager\", [\"function-extensions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._isDirty = false;\n        this._obj = i;\n    };\n;\n    g(h.prototype, {\n        dirty: function() {\n            if (!this._isDirty) {\n                this._isDirty = true;\n                this._doPaint.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        _doPaint: function() {\n            this._isDirty = false;\n            this._obj.paint();\n        }\n    });\n    e.exports = h;\n});\n__d(\"CounterDisplay\", [\"Arbiter\",\"CSS\",\"DOM\",\"RenderManager\",\"Run\",\"$\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"RenderManager\"), k = b(\"Run\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\");\n    function o(p, q, r, s, t, u) {\n        m(this, {\n            _name: p,\n            _valueNode: l(q),\n            _wrapperNode: ((l(r) || null)),\n            _statusClass: t,\n            _rm: new j(this),\n            _arbiterSubscription: null,\n            _count: 0\n        });\n        var v = this._valueNode.firstChild;\n        if (v) {\n            var w = parseInt(v.nodeValue, 10);\n            if (!isNaN(w)) {\n                this._count = w;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this._statusNode = ((s ? l(s) : null));\n        this._subscribeAll();\n        o.instances.push(this);\n        if (!u) {\n            k.onLeave(this._destroy.bind(this), true);\n        }\n    ;\n    ;\n    };\n;\n    m(o, {\n        EVENT_TYPE_ADJUST: \"CounterDisplay/adjust\",\n        EVENT_TYPE_UPDATE: \"CounterDisplay/update\",\n        instances: [],\n        adjustCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_ADJUST + \"/\")) + p)), q);\n        },\n        setCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_UPDATE + \"/\")) + p)), q);\n        }\n    });\n    m(o.prototype, {\n        _destroy: function() {\n            delete this._valueNode;\n            delete this._wrapperNode;\n            if (this._arbiterSubscription) {\n                this._arbiterSubscription.unsubscribe();\n                delete this._arbiterSubscription;\n            }\n        ;\n        ;\n            n(o.instances, this);\n        },\n        adjustCount: function(p) {\n            this._count = Math.max(0, ((this._count + p)));\n            this._rm.dirty();\n            return this;\n        },\n        setCount: function(p) {\n            this._count = Math.max(0, p);\n            this._rm.dirty();\n            return this;\n        },\n        paint: function() {\n            i.setContent(this._valueNode, this._count);\n            this._toggleNodes();\n        },\n        _toggleNodes: function() {\n            if (this._wrapperNode) {\n                h.conditionClass(this._wrapperNode, \"hidden_elem\", ((this._count <= 0)));\n            }\n        ;\n        ;\n            if (((this._statusClass && this._statusNode))) {\n                h.conditionClass(this._statusNode, this._statusClass, ((this._count > 0)));\n            }\n        ;\n        ;\n        },\n        _subscribeAll: function() {\n            var p = [((((o.EVENT_TYPE_ADJUST + \"/\")) + this._name)),((((o.EVENT_TYPE_UPDATE + \"/\")) + this._name)),];\n            this._arbiterSubscription = g.subscribe(p, this._onInform.bind(this), g.SUBSCRIBE_NEW);\n        },\n        _onInform: function(p, q) {\n            q = parseInt(q);\n            if (isNaN(q)) {\n                return;\n            }\n        ;\n        ;\n            if (((p.indexOf(o.EVENT_TYPE_ADJUST) != -1))) {\n                this.adjustCount(q);\n            }\n             else if (((p.indexOf(o.EVENT_TYPE_UPDATE) != -1))) {\n                this.setCount(q);\n            }\n             else return\n            \n        ;\n            return;\n        }\n    });\n    e.exports = o;\n});\n__d(\"CacheStorage\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        memory: k,\n        localstorage: i,\n        sessionstorage: j\n    };\n    function i() {\n        this._store = a.JSBNG__localStorage;\n    };\n;\n    i.available = function() {\n        try {\n            return !!a.JSBNG__localStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(i.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function j() {\n        this._store = a.JSBNG__sessionStorage;\n    };\n;\n    j.available = function() {\n        try {\n            return !!a.JSBNG__sessionStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(j.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function k() {\n        this._store = {\n        };\n    };\n;\n    k.available = function() {\n        return true;\n    };\n    g(k.prototype, {\n        keys: function() {\n            return Object.keys(this._store);\n        },\n        get: function(m) {\n            if (((this._store[m] === undefined))) {\n                return null;\n            }\n        ;\n        ;\n            return this._store[m];\n        },\n        set: function(m, n) {\n            this._store[m] = n;\n        },\n        remove: function(m) {\n            if (((m in this._store))) {\n                delete this._store[m];\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            this._store = {\n            };\n        }\n    });\n    function l(m, n) {\n        this._key_prefix = ((n || \"_cs_\"));\n        this._magic_prefix = \"_@_\";\n        if (((((m == \"AUTO\")) || !m))) {\n            {\n                var fin176keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin176i = (0);\n                var o;\n                for (; (fin176i < fin176keys.length); (fin176i++)) {\n                    ((o) = (fin176keys[fin176i]));\n                    {\n                        var p = h[o];\n                        if (p.available()) {\n                            m = o;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        if (m) {\n            if (((typeof m == \"string\"))) {\n                if (((!h[m] || !h[m].available()))) {\n                    this._backend = new k();\n                }\n                 else this._backend = new h[m]();\n            ;\n            ;\n            }\n             else if (((!m.available || !m.available()))) {\n                this._backend = new k();\n            }\n             else this._backend = m;\n            \n        ;\n        }\n    ;\n    ;\n    };\n;\n    g(l, {\n        getAllStorageTypes: function() {\n            return Object.keys(h);\n        }\n    });\n    g(l.prototype, {\n        keys: function() {\n            var m = [];\n            try {\n                if (this._backend) {\n                    var o = this._backend.keys();\n                    for (var p = 0; ((p < o.length)); p++) {\n                        if (((o[p].substr(0, this._key_prefix.length) == this._key_prefix))) {\n                            m.push(o[p].substr(this._key_prefix.length));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n            } catch (n) {\n            \n            };\n        ;\n            return m;\n        },\n        set: function(m, n) {\n            if (this._backend) {\n                if (((typeof n == \"string\"))) {\n                    n = ((this._magic_prefix + n));\n                }\n                 else n = JSON.stringify(n);\n            ;\n            ;\n                try {\n                    this._backend.set(((this._key_prefix + m)), n);\n                } catch (o) {\n                \n                };\n            ;\n            }\n        ;\n        ;\n        },\n        get: function(m, n) {\n            var o;\n            if (this._backend) {\n                try {\n                    o = this._backend.get(((this._key_prefix + m)));\n                } catch (p) {\n                    o = null;\n                };\n            ;\n                if (((o !== null))) {\n                    if (((o.substr(0, this._magic_prefix.length) == this._magic_prefix))) {\n                        o = o.substr(this._magic_prefix.length);\n                    }\n                     else try {\n                        o = JSON.parse(o);\n                    } catch (q) {\n                        o = undefined;\n                    }\n                ;\n                ;\n                }\n                 else o = undefined;\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((o === undefined)) && ((n !== undefined))))) {\n                o = n;\n                if (this._backend) {\n                    var r;\n                    if (((typeof o == \"string\"))) {\n                        r = ((this._magic_prefix + o));\n                    }\n                     else r = JSON.stringify(o);\n                ;\n                ;\n                    try {\n                        this._backend.set(((this._key_prefix + m)), r);\n                    } catch (p) {\n                    \n                    };\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return o;\n        },\n        remove: function(m) {\n            if (this._backend) {\n                try {\n                    this._backend.remove(((this._key_prefix + m)));\n                } catch (n) {\n                \n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Badge\", [\"DOM\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"cx\"), i = function(j) {\n        var k;\n        switch (j) {\n          case \"xsmall\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__xsmall\";\n            break;\n          case \"small\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__small\";\n            break;\n          case \"medium\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__medium\";\n            break;\n          case \"large\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__large\";\n            break;\n          case \"xlarge\":\n            k = \"-cx-PUBLIC-verifiedBadge__root -cx-PRIVATE-verifiedBadge__xlarge\";\n            break;\n        };\n    ;\n        if (k) {\n            return g.create(\"span\", {\n                className: k\n            });\n        }\n    ;\n    ;\n        return null;\n    };\n    e.exports = i;\n});\n__d(\"BasicTypeaheadRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(j, k) {\n        var l = [];\n        if (j.icon) {\n            l.push(h.create(\"img\", {\n                alt: \"\",\n                src: j.icon\n            }));\n        }\n    ;\n    ;\n        if (j.text) {\n            var m = [j.text,];\n            if (j.verified) {\n                m.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            l.push(h.create(\"span\", {\n                className: \"text\"\n            }, m));\n        }\n    ;\n    ;\n        if (j.subtext) {\n            l.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [j.subtext,]));\n        }\n    ;\n    ;\n        var n = h.create(\"li\", {\n            className: ((j.type || \"\"))\n        }, l);\n        if (j.text) {\n            n.setAttribute(\"aria-label\", j.text);\n        }\n    ;\n    ;\n        return n;\n    };\n;\n    i.className = \"basic\";\n    e.exports = i;\n});\n__d(\"TypeaheadView\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BasicTypeaheadRenderer\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BasicTypeaheadRenderer\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"$\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\");\n    function p(q, r) {\n        this.element = this.JSBNG__content = m(q);\n        this.showBadges = r.showBadges;\n        n(this, r);\n    };\n;\n    n(p.prototype, h, {\n        events: [\"highlight\",\"render\",\"reset\",\"select\",\"beforeRender\",\"next\",\"prev\",],\n        renderer: i,\n        autoSelect: false,\n        ignoreMouseover: false,\n        init: function() {\n            this.init = o;\n            this.initializeEvents();\n            this.reset();\n        },\n        initializeEvents: function() {\n            g.listen(this.element, {\n                mouseup: this.mouseup.bind(this),\n                mouseover: this.mouseover.bind(this)\n            });\n        },\n        setTypeahead: function(q) {\n            this.typeahead = q;\n        },\n        setAccessibilityControlElement: function(q) {\n            this.accessibilityElement = q;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        mouseup: function(JSBNG__event) {\n            if (((JSBNG__event.button != 2))) {\n                this.select(true);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        mouseover: function(JSBNG__event) {\n            if (this.ignoreMouseover) {\n                this.ignoreMouseover = false;\n                return;\n            }\n        ;\n        ;\n            if (this.visible) {\n                this.highlight(this.getIndex(JSBNG__event));\n            }\n        ;\n        ;\n        },\n        reset: function(q) {\n            if (!q) {\n                this.disableAutoSelect = false;\n            }\n        ;\n        ;\n            this.justRendered = false;\n            this.justShown = false;\n            this.index = -1;\n            this.items = [];\n            this.results = [];\n            this.value = \"\";\n            this.JSBNG__content.innerHTML = \"\";\n            this.inform(\"reset\");\n            return this;\n        },\n        getIndex: function(JSBNG__event) {\n            return this.items.indexOf(l.byTag(JSBNG__event.getTarget(), \"li\"));\n        },\n        JSBNG__getSelection: function() {\n            var q = ((this.results[this.index] || null));\n            return ((this.visible ? q : null));\n        },\n        isEmpty: function() {\n            return !this.results.length;\n        },\n        isVisible: function() {\n            return this.visible;\n        },\n        show: function() {\n            j.show(this.element);\n            if (((this.results && this.results.length))) {\n                if (((((this.autoSelect && this.accessibilityElement)) && this.selected))) {\n                    this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                }\n            ;\n            }\n        ;\n        ;\n            ((this.accessibilityElement && this.accessibilityElement.setAttribute(\"aria-expanded\", \"true\")));\n            this.visible = true;\n            return this;\n        },\n        hide: function() {\n            j.hide(this.element);\n            if (this.accessibilityElement) {\n                this.accessibilityElement.setAttribute(\"aria-expanded\", \"false\");\n                this.accessibilityElement.removeAttribute(\"aria-activedescendant\");\n            }\n        ;\n        ;\n            this.visible = false;\n            return this;\n        },\n        render: function(q, r, s) {\n            this.value = q;\n            if (!r.length) {\n                ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n                this.reset(true);\n                return;\n            }\n        ;\n        ;\n            this.justRendered = true;\n            if (!this.results.length) {\n                this.justShown = true;\n            }\n        ;\n        ;\n            var t = {\n                results: r,\n                value: q\n            };\n            this.inform(\"beforeRender\", t);\n            r = t.results;\n            var u = this.getDefaultIndex(r);\n            if (((((this.index > 0)) && ((this.index !== this.getDefaultIndex(this.results)))))) {\n                var v = this.results[this.index];\n                for (var w = 0, x = r.length; ((w < x)); ++w) {\n                    if (((v.uid == r[w].uid))) {\n                        u = w;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this.results = r;\n            k.setContent(this.JSBNG__content, this.buildResults(r));\n            this.items = this.getItems();\n            this.highlight(u, false);\n            this.inform(\"render\", r);\n        },\n        getItems: function() {\n            return k.scry(this.JSBNG__content, \"li\");\n        },\n        buildResults: function(q) {\n            var r, s = null;\n            if (((typeof this.renderer == \"function\"))) {\n                r = this.renderer;\n                s = ((this.renderer.className || \"\"));\n            }\n             else {\n                r = a.TypeaheadRenderers[this.renderer];\n                s = this.renderer;\n            }\n        ;\n        ;\n            r = r.bind(this);\n            var t = this.showBadges, u = q.map(function(w, x) {\n                if (!t) {\n                    w.verified = null;\n                }\n            ;\n            ;\n                var y = ((w.node || r(w, x)));\n                y.setAttribute(\"role\", \"option\");\n                return y;\n            }), v = k.create(\"ul\", {\n                className: s,\n                id: ((\"typeahead_list_\" + ((this.typeahead ? k.getID(this.typeahead) : k.getID(this.element)))))\n            }, u);\n            v.setAttribute(\"role\", \"listbox\");\n            return v;\n        },\n        getDefaultIndex: function(q) {\n            var r = ((this.autoSelect && !this.disableAutoSelect));\n            return ((((((this.index < 0)) && !r)) ? -1 : 0));\n        },\n        next: function() {\n            this.highlight(((this.index + 1)));\n            this.inform(\"next\", this.selected);\n        },\n        prev: function() {\n            this.highlight(((this.index - 1)));\n            this.inform(\"prev\", this.selected);\n        },\n        getItemText: function(q) {\n            var r = \"\";\n            if (q) {\n                r = q.getAttribute(\"aria-label\");\n                if (!r) {\n                    r = k.getText(q);\n                    q.setAttribute(\"aria-label\", r);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return r;\n        },\n        setIsViewingSelectedItems: function(q) {\n            this.viewingSelected = q;\n            return this;\n        },\n        getIsViewingSelectedItems: function() {\n            return this.viewingSelected;\n        },\n        highlight: function(q, r) {\n            var s = true;\n            if (this.selected) {\n                j.removeClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n        ;\n            if (((q > ((this.items.length - 1))))) {\n                q = -1;\n            }\n             else if (((q < -1))) {\n                q = ((this.items.length - 1));\n            }\n            \n        ;\n        ;\n            if (((((q >= 0)) && ((q < this.items.length))))) {\n                if (((this.selected && ((this.getItemText(this.items[q]) === this.getItemText(this.selected)))))) {\n                    s = false;\n                }\n            ;\n            ;\n                this.selected = this.items[q];\n                j.addClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"true\");\n                if (this.accessibilityElement) {\n                    (function() {\n                        this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                    }).bind(this).defer();\n                }\n            ;\n            ;\n            }\n             else ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n        ;\n        ;\n            this.index = q;\n            this.disableAutoSelect = ((q == -1));\n            var t = ((q !== -1)), u = this.getItemText(this.selected);\n            if (((((((((q !== -1)) && this.isVisible())) && u)) && this.autoSelect))) {\n                if (this.justShown) {\n                    this.justRendered = false;\n                    this.justShown = false;\n                    t = false;\n                }\n                 else if (((s && this.justRendered))) {\n                    this.justRendered = false;\n                    t = false;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            if (((r !== false))) {\n                this.inform(\"highlight\", {\n                    index: q,\n                    selected: this.results[q],\n                    element: this.selected\n                });\n            }\n        ;\n        ;\n        },\n        select: function(q) {\n            var r = this.index, s = this.results[r], t = this.element.getAttribute(\"id\");\n            if (s) {\n                this.inform(\"select\", {\n                    index: r,\n                    clicked: !!q,\n                    selected: s,\n                    id: t,\n                    query: this.value\n                });\n                this.inform(\"afterSelect\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"BucketedTypeaheadView\", [\"Class\",\"DOM\",\"tx\",\"TypeaheadView\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"tx\"), j = b(\"TypeaheadView\"), k = b(\"copyProperties\");\n    function l(m, n) {\n        this.parent.construct(this, m, n);\n    };\n;\n    g.extend(l, j);\n    k(l.prototype, {\n        render: function(m, n, o) {\n            n = this.buildBuckets(m, n);\n            return this.parent.render(m, n, o);\n        },\n        highlight: function(m, n) {\n            if (((((m == -1)) && ((this.index !== 0))))) {\n                m = this.index;\n            }\n        ;\n        ;\n            while (((((((m >= 0)) && ((m < this.items.length)))) && !this.isHighlightable(this.results[m])))) {\n                m = ((m + 1));\n            ;\n            };\n        ;\n            this.parent.highlight(m, n);\n        },\n        buildBuckets: function(m, n) {\n            if (((((!this.typeObjects || !n)) || !n.length))) {\n                return n;\n            }\n        ;\n        ;\n            var o = [], p = {\n            };\n            for (var q = 0; ((q < n.length)); ++q) {\n                var r = n[q], s = ((r.render_type || r.type));\n                if (!p.hasOwnProperty(s)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                }\n            ;\n            ;\n                r.classNames = s;\n                r.groupIndex = p[s];\n                r.indexInGroup = ((o[r.groupIndex].length - 1));\n                o[r.groupIndex].push(r);\n            };\n        ;\n            {\n                var fin177keys = ((window.top.JSBNG_Replay.forInKeys)((this.typeObjects))), fin177i = (0);\n                (0);\n                for (; (fin177i < fin177keys.length); (fin177i++)) {\n                    ((s) = (fin177keys[fin177i]));\n                    {\n                        if (((!p.hasOwnProperty(s) && this.typeObjects[s].show_always))) {\n                            p[s] = o.length;\n                            o.push([this.buildBucketHeader(s),]);\n                            r = this.buildNoResultsEntry();\n                            r.classNames = r.type;\n                            r.groupIndex = p[s];\n                            r.indexInGroup = ((o[r.groupIndex].length - 1));\n                            o[r.groupIndex].push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var t = [];\n            if (this.typeObjectsOrder) {\n                for (var u = 0; ((u < this.typeObjectsOrder.length)); ++u) {\n                    var v = this.typeObjectsOrder[u];\n                    if (p.hasOwnProperty(v)) {\n                        t = t.concat(o[p[v]]);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else for (var w = 0; ((w < o.length)); ++w) {\n                t = t.concat(o[w]);\n            ;\n            }\n        ;\n        ;\n            return t;\n        },\n        buildNoResultsEntry: function() {\n            return {\n                uid: \"disabled_result\",\n                type: \"disabled_result\",\n                text: \"No Results\"\n            };\n        },\n        buildBucketHeader: function(m) {\n            var n = this.typeObjects[m];\n            if (((n === undefined))) {\n                throw new Error(((((m + \" is undefined in \")) + JSON.stringify(this.typeObjects))));\n            }\n        ;\n        ;\n            if (n.markup) {\n                n.text = n.markup;\n                delete n.markup;\n            }\n        ;\n        ;\n            return this.typeObjects[m];\n        },\n        buildResults: function(m) {\n            var n = this.parent.buildResults(m);\n            if (this.typeObjects) {\n                return h.create(\"div\", {\n                    className: \"bucketed\"\n                }, [n,]);\n            }\n             else return n\n        ;\n        },\n        isHighlightable: function(m) {\n            return ((((m.type != \"header\")) && ((m.type != \"disabled_result\"))));\n        },\n        select: function(m) {\n            var n = this.results[this.index];\n            if (((n && this.isHighlightable(n)))) {\n                this.parent.select(m);\n            }\n        ;\n        ;\n        },\n        normalizeIndex: function(m) {\n            var n = this.results.length;\n            if (((n === 0))) {\n                return -1;\n            }\n             else if (((m < -1))) {\n                return ((((((m % n)) + n)) + 1));\n            }\n             else if (((m >= n))) {\n                return ((((m % n)) - 1));\n            }\n             else return m\n            \n            \n        ;\n        },\n        getDefaultIndex: function(m) {\n            var n = ((this.autoSelect && !this.disableAutoSelect));\n            if (((((this.index < 0)) && !n))) {\n                return -1;\n            }\n        ;\n        ;\n            if (((m.length === 0))) {\n                return -1;\n            }\n        ;\n        ;\n            var o = 0;\n            while (((!this.isHighlightable(m) && ((o < m.length))))) {\n                o++;\n            ;\n            };\n        ;\n            return o;\n        },\n        prev: function() {\n            var m = this.results[this.normalizeIndex(((this.index - 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index - 1)));\n                m = this.results[this.normalizeIndex(((this.index - 1)))];\n            };\n        ;\n            return this.parent.prev();\n        },\n        next: function() {\n            var m = this.results[this.normalizeIndex(((this.index + 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index + 1)));\n                m = this.results[this.normalizeIndex(((this.index + 1)))];\n            };\n        ;\n            return this.parent.next();\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualTypeaheadView\", [\"BucketedTypeaheadView\",\"CSS\",\"Class\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"ContextualLayerHideOnScroll\",\"DOM\",\"DOMDimensions\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"CSS\"), i = b(\"Class\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerAutoFlip\"), l = b(\"ContextualLayerHideOnScroll\"), m = b(\"DOM\"), n = b(\"DOMDimensions\"), o = b(\"Style\"), p = b(\"copyProperties\");\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n    };\n;\n    i.extend(q, g);\n    p(q.prototype, {\n        init: function() {\n            this.initializeLayer();\n            this.parent.init();\n        },\n        initializeLayer: function() {\n            this.context = this.getContext();\n            this.wrapper = m.create(\"div\");\n            m.appendContent(this.wrapper, this.element);\n            h.addClass(this.element, \"uiContextualTypeaheadView\");\n            this.layer = new j({\n                context: this.context,\n                position: \"below\",\n                alignment: this.alignment,\n                causalElement: this.causalElement,\n                permanent: true\n            }, this.wrapper);\n            this.layer.enableBehavior(l);\n            if (((o.isFixed(this.context) || this.autoflip))) {\n                this.layer.enableBehavior(k);\n            }\n        ;\n        ;\n            this.subscribe(\"render\", this.renderLayer.bind(this));\n        },\n        show: function() {\n            if (this.minWidth) {\n                o.set(this.wrapper, \"min-width\", ((this.minWidth + \"px\")));\n            }\n             else if (this.width) {\n                o.set(this.wrapper, \"width\", ((this.width + \"px\")));\n            }\n             else o.set(this.wrapper, \"width\", ((n.getElementDimensions(this.context).width + \"px\")));\n            \n        ;\n        ;\n            var r = this.parent.show();\n            this.layer.show();\n            return r;\n        },\n        hide: function() {\n            this.layer.hide();\n            return this.parent.hide();\n        },\n        renderLayer: function() {\n            if (!this.isVisible()) {\n                return;\n            }\n        ;\n        ;\n            if (this.layer.isShown()) {\n                this.layer.updatePosition();\n            }\n             else this.layer.show();\n        ;\n        ;\n        },\n        clearText: function() {\n            this.layer.getCausalElement().value = \"\";\n        },\n        getContext: function() {\n            return this.element.parentNode;\n        }\n    });\n    e.exports = q;\n});\n__d(\"DOMClone\", [], function(a, b, c, d, e, f) {\n    var g = {\n        shallowClone: function(i) {\n            return h(i, false);\n        },\n        deepClone: function(i) {\n            return h(i, true);\n        }\n    };\n    function h(i, j) {\n        var k = i.cloneNode(j);\n        if (((typeof k.__FB_TOKEN !== \"undefined\"))) {\n            delete k.__FB_TOKEN;\n        }\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = g;\n});\n__d(\"Dcode\", [], function(a, b, c, d, e, f) {\n    var g, h = {\n    }, i = {\n        _: \"%\",\n        A: \"%2\",\n        B: \"000\",\n        C: \"%7d\",\n        D: \"%7b%22\",\n        E: \"%2c%22\",\n        F: \"%22%3a\",\n        G: \"%2c%22ut%22%3a1\",\n        H: \"%2c%22bls%22%3a\",\n        I: \"%2c%22n%22%3a%22%\",\n        J: \"%22%3a%7b%22i%22%3a0%7d\",\n        K: \"%2c%22pt%22%3a0%2c%22vis%22%3a\",\n        L: \"%2c%22ch%22%3a%7b%22h%22%3a%22\",\n        M: \"%7b%22v%22%3a2%2c%22time%22%3a1\",\n        N: \".channel%22%2c%22sub%22%3a%5b\",\n        O: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b\",\n        P: \"%2c%22ud%22%3a100%2c%22lc%22%3a0\",\n        Q: \"%5d%2c%22f%22%3anull%2c%22uct%22%3a\",\n        R: \".channel%22%2c%22sub%22%3a%5b1%5d\",\n        S: \"%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a\",\n        T: \"%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        U: \"%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        V: \"%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a\",\n        W: \"%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\",\n        X: \"%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1\",\n        Y: \"%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        Z: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\"\n    };\n    (function() {\n        var k = [];\n        {\n            var fin178keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin178i = (0);\n            var l;\n            for (; (fin178i < fin178keys.length); (fin178i++)) {\n                ((l) = (fin178keys[fin178i]));\n                {\n                    h[i[l]] = l;\n                    k.push(i[l]);\n                };\n            };\n        };\n    ;\n        k.reverse();\n        g = new RegExp(k.join(\"|\"), \"g\");\n    })();\n    var j = {\n        encode: function(k) {\n            return encodeURIComponent(k).replace(/([_A-Z])|%../g, function(l, m) {\n                return ((m ? ((\"%\" + m.charCodeAt(0).toString(16))) : l));\n            }).toLowerCase().replace(g, function(l) {\n                return h[l];\n            });\n        },\n        decode: function(k) {\n            return decodeURIComponent(k.replace(/[_A-Z]/g, function(l) {\n                return i[l];\n            }));\n        }\n    };\n    e.exports = j;\n});\n__d(\"FileInput\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"DOMClone\",\"Focus\",\"UserAgent\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMClone\"), k = b(\"Focus\"), l = b(\"UserAgent\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = l.ie();\n    function p(q, r, s) {\n        this.container = q;\n        this.control = r;\n        this.input = s;\n        var t = i.scry(this.container, \"a\")[0];\n        ((t && t.removeAttribute(\"href\")));\n        var u = i.create(\"div\", {\n            className: \"-cx-PRIVATE-uiFileInput__wrap\"\n        }, this.input);\n        i.appendContent(this.control, u);\n        this._initListeners();\n    };\n;\n    m(p.prototype, h, {\n        getValue: function() {\n            return this.input.value;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        clear: function() {\n            if (o) {\n                var q = j.deepClone(this.input);\n                i.replace(this.input, q);\n                this.input = q;\n                while (this._listeners.length) {\n                    this._listeners.pop().remove();\n                ;\n                };\n            ;\n                this._initListeners();\n            }\n             else {\n                this.input.value = \"\";\n                this.input.files = null;\n            }\n        ;\n        ;\n        },\n        _initListeners: function() {\n            k.relocate(this.input, this.control);\n            this._listeners = [g.listen(this.input, \"change\", this._handleChange.bind(this)),];\n        },\n        _handleChange: function(JSBNG__event) {\n            this.inform(\"change\", JSBNG__event);\n            var q = this.input.form;\n            if (((q && ((o < 9))))) {\n                g.fire(q, \"change\", JSBNG__event);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"Poller\", [\"ArbiterMixin\",\"AsyncRequest\",\"Cookie\",\"Env\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"Cookie\"), j = b(\"Env\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(p) {\n        this._config = k({\n            clearOnQuicklingEvents: true,\n            setupRequest: l,\n            interval: null,\n            maxRequests: Infinity,\n            dontStart: false\n        }, p);\n        if (!this._config.dontStart) {\n            this.start();\n        }\n    ;\n    ;\n    };\n;\n    m.MIN_INTERVAL = 2000;\n    k(m.prototype, g, {\n        start: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_739), function() {\n            if (this._polling) {\n                return this;\n            }\n        ;\n        ;\n            this._requests = 0;\n            this.request();\n            return this;\n        })),\n        JSBNG__stop: function() {\n            this._cancelRequest();\n            return this;\n        },\n        mute: function() {\n            this._muted = true;\n            return this;\n        },\n        resume: function() {\n            if (this._muted) {\n                this._muted = false;\n                if (((!this._handle && this._polling))) {\n                    return this.request();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        skip: function() {\n            this._skip = true;\n            return this;\n        },\n        reset: function() {\n            return this.JSBNG__stop().start();\n        },\n        request: function() {\n            this._cancelRequest();\n            this._polling = true;\n            if (!o()) {\n                return this._done();\n            }\n        ;\n        ;\n            if (this._muted) {\n                return this;\n            }\n        ;\n        ;\n            if (((++this._requests > this._config.maxRequests))) {\n                return this._done();\n            }\n        ;\n        ;\n            var p = new h(), q = false;\n            p.setInitialHandler(function() {\n                return !q;\n            });\n            this._cancelRequest = function() {\n                q = true;\n                this._cleanup();\n            }.bind(this);\n            p.setFinallyHandler(n.bind(this));\n            p.setInitialHandler = l;\n            p.setFinallyHandler = l;\n            this._config.setupRequest(p, this);\n            if (this._skip) {\n                this._skip = false;\n                n.bind(this).defer();\n            }\n             else p.send();\n        ;\n        ;\n            return this;\n        },\n        isPolling: function() {\n            return this._polling;\n        },\n        isMuted: function() {\n            return this._muted;\n        },\n        JSBNG__setInterval: function(p) {\n            if (p) {\n                this._config.interval = p;\n                this.start();\n            }\n        ;\n        ;\n        },\n        getInterval: function() {\n            return this._config.interval;\n        },\n        _cleanup: function() {\n            if (this._handle) {\n                JSBNG__clearTimeout(this._handle);\n            }\n        ;\n        ;\n            this._handle = null;\n            this._cancelRequest = l;\n            this._polling = false;\n        },\n        _done: function() {\n            this._cleanup();\n            this.inform(\"done\", {\n                sender: this\n            });\n            return this;\n        },\n        _config: null,\n        _requests: 0,\n        _muted: false,\n        _polling: false,\n        _skip: false,\n        _cancelRequest: l\n    });\n    function n() {\n        if (!this._polling) {\n            return;\n        }\n    ;\n    ;\n        if (((this._requests < this._config.maxRequests))) {\n            var p = this._config.interval;\n            p = ((((typeof p === \"function\")) ? p(this._requests) : p));\n            this._handle = this.request.bind(this).defer(((((p > m.MIN_INTERVAL)) ? p : m.MIN_INTERVAL)), this._config.clearOnQuicklingEvents);\n        }\n         else this._done();\n    ;\n    ;\n    };\n;\n    function o() {\n        return ((j.user == i.get(\"c_user\")));\n    };\n;\n    e.exports = m;\n});\n__d(\"SystemEvents\", [\"Arbiter\",\"Env\",\"ErrorUtils\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"ErrorUtils\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = new g(), m = [], n = 1000;\n    JSBNG__setInterval(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757), function() {\n        for (var w = 0; ((w < m.length)); w++) {\n            m[w]();\n        ;\n        };\n    ;\n    })), n, false);\n    function o() {\n        return ((((/c_user=(\\d+)/.test(JSBNG__document.cookie) && RegExp.$1)) || 0));\n    };\n;\n    var p = h.user, q = JSBNG__navigator.onLine;\n    function r() {\n        if (!q) {\n            q = true;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    function s() {\n        if (q) {\n            q = false;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    if (j.ie()) {\n        if (((j.ie() >= 8))) {\n            window.JSBNG__attachEvent(\"JSBNG__onload\", function() {\n                JSBNG__document.body.JSBNG__ononline = r;\n                JSBNG__document.body.JSBNG__onoffline = s;\n            });\n        }\n         else m.push(function() {\n            ((JSBNG__navigator.onLine ? r : s))();\n        });\n    ;\n    ;\n    }\n     else if (window.JSBNG__addEventListener) {\n        if (!j.chrome()) {\n            window.JSBNG__addEventListener(\"online\", r, false);\n            window.JSBNG__addEventListener(\"offline\", s, false);\n        }\n    ;\n    }\n    \n;\n;\n    var t = p;\n    m.push(function() {\n        var w = o();\n        if (((t != w))) {\n            l.inform(l.USER, w);\n            t = w;\n        }\n    ;\n    ;\n    });\n    var u = JSBNG__Date.now();\n    function v() {\n        var w = JSBNG__Date.now(), x = ((w - u)), y = ((((x < 0)) || ((x > 10000))));\n        u = w;\n        if (y) {\n            l.inform(l.TIME_TRAVEL, x);\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    m.push(v);\n    m.push(function() {\n        if (((window.JSBNG__onerror != i.JSBNG__onerror))) {\n            window.JSBNG__onerror = i.JSBNG__onerror;\n        }\n    ;\n    ;\n    });\n    k(l, {\n        USER: \"SystemEvents/USER\",\n        ONLINE: \"SystemEvents/ONLINE\",\n        TIME_TRAVEL: \"SystemEvents/TIME_TRAVEL\",\n        isPageOwner: function(w) {\n            return ((((w || o())) == p));\n        },\n        isOnline: function() {\n            return ((j.chrome() || q));\n        },\n        checkTimeTravel: v\n    });\n    e.exports = l;\n});\n__d(\"Typeahead\", [\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"DataStore\",\"JSBNG__Event\",\"Parent\",\"Run\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"BehaviorsMixin\"), i = b(\"DOM\"), j = b(\"DataStore\"), k = b(\"JSBNG__Event\"), l = b(\"Parent\"), m = b(\"Run\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\"), p = b(\"ge\");\n    function q(r, s, t, u) {\n        this.args = {\n            data: r,\n            view: s,\n            core: t\n        };\n        j.set(u, \"Typeahead\", this);\n        this.element = u;\n    };\n;\n    q.getInstance = function(r) {\n        var s = l.byClass(r, \"uiTypeahead\");\n        return ((s ? j.get(s, \"Typeahead\") : null));\n    };\n    n(q.prototype, g, h, {\n        init: function(r) {\n            this.init = o;\n            this.getCore();\n            this.getView().setAccessibilityControlElement(this.getCore().getElement());\n            this.proxyEvents();\n            this.initBehaviors(((r || [])));\n            this.inform(\"init\", this);\n            this.data.bootstrap();\n            this.core.JSBNG__focus();\n        },\n        getData: function() {\n            if (!this.data) {\n                var r = this.args.data;\n                this.data = r;\n                this.data.init();\n            }\n        ;\n        ;\n            return this.data;\n        },\n        getView: function() {\n            if (!this.view) {\n                var r = this.args.view, s = ((r.node || p(r.node_id)));\n                if (!s) {\n                    s = i.create(\"div\", {\n                        className: \"uiTypeaheadView\"\n                    });\n                    i.appendContent(this.element, s);\n                }\n            ;\n            ;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.view = new window[r.ctor](s, ((r.options || {\n                    })));\n                }\n                 else this.view = new r.ctor(s, ((r.options || {\n                })));\n            ;\n            ;\n                this.view.init();\n                this.view.setTypeahead(this.element);\n            }\n        ;\n        ;\n            return this.view;\n        },\n        getCore: function() {\n            if (!this.core) {\n                var r = this.args.core;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.core = new window[r.ctor](((r.options || {\n                    })));\n                }\n                 else this.core = new r.ctor(((r.options || {\n                })));\n            ;\n            ;\n                this.core.init(this.getData(), this.getView(), this.getElement());\n            }\n        ;\n        ;\n            return this.core;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        swapData: function(r) {\n            var s = this.core;\n            this.data = this.args.data = r;\n            r.init();\n            if (s) {\n                s.data = r;\n                s.initData();\n                s.reset();\n            }\n        ;\n        ;\n            r.bootstrap();\n            return r;\n        },\n        proxyEvents: function() {\n            [this.data,this.view,this.core,].forEach(function(r) {\n                r.subscribe(r.events, this.inform.bind(this));\n            }, this);\n        },\n        initBehaviors: function(r) {\n            r.forEach(function(s) {\n                if (((typeof s === \"string\"))) {\n                    if (((a.TypeaheadBehaviors && a.TypeaheadBehaviors[s]))) {\n                        a.TypeaheadBehaviors[s](this);\n                    }\n                     else m.onLoad(function() {\n                        if (a.TypeaheadBehaviors) {\n                            ((a.TypeaheadBehaviors[s] || o))(this);\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                ;\n                ;\n                }\n                 else this.enableBehavior(s);\n            ;\n            ;\n            }, this);\n        }\n    });\n    q.initNow = function(r, s, t) {\n        if (t) {\n            t.init(r);\n        }\n    ;\n    ;\n        r.init(s);\n    };\n    q.init = function(r, s, t, u) {\n        if (!i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            r = ((i.scry(r, \"input\")[0] || i.scry(r, \"textarea\")[0]));\n        }\n    ;\n    ;\n        var v = false;\n        try {\n            v = ((JSBNG__document.activeElement === r));\n        } catch (w) {\n        \n        };\n    ;\n        if (v) {\n            q.initNow(s, t, u);\n        }\n         else var x = k.listen(r, \"JSBNG__focus\", function() {\n            q.initNow(s, t, u);\n            x.remove();\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"TypeaheadCore\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"Focus\",\"Input\",\"InputSelection\",\"Keys\",\"StickyPlaceholderInput\",\"UserAgent\",\"bind\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"Input\"), n = b(\"InputSelection\"), o = b(\"Keys\"), p = b(\"StickyPlaceholderInput\"), q = b(\"UserAgent\"), r = b(\"bind\"), s = b(\"copyProperties\"), t = b(\"emptyFunction\");\n    function u(v) {\n        s(this, v);\n    };\n;\n    s(u.prototype, i, {\n        events: [\"JSBNG__blur\",\"JSBNG__focus\",\"click\",\"unselect\",\"loading\",],\n        keepFocused: true,\n        resetOnSelect: false,\n        resetOnKeyup: true,\n        setValueOnSelect: false,\n        queryTimeout: 250,\n        preventFocusChangeOnTab: false,\n        init: function(v, w, x) {\n            this.init = t;\n            this.data = v;\n            this.view = w;\n            this.root = x;\n            this.initInput();\n            this.inputWrap = k.JSBNG__find(x, \"div.wrap\");\n            this.hiddenInput = k.JSBNG__find(x, \"input.hiddenInput\");\n            this.value = \"\";\n            this.nextQuery = null;\n            this.selectedText = null;\n            if (((this.setValueOnSelect && j.hasClass(this.inputWrap, \"selected\")))) {\n                this.selectedText = this.getValue();\n            }\n        ;\n        ;\n            this.initView();\n            this.initData();\n            this.initEvents();\n            this.initToggle();\n            this._exclusions = [];\n        },\n        initInput: function() {\n            this.element = k.JSBNG__find(this.root, \".textInput\");\n            var v = k.scry(this.element, \"input\")[0];\n            if (v) {\n                this.element = v;\n            }\n        ;\n        ;\n        },\n        initView: function() {\n            this.view.subscribe(\"highlight\", l.set.curry(this.element));\n            this.view.subscribe(\"select\", function(v, w) {\n                this.select(w.selected);\n            }.bind(this));\n            this.view.subscribe(\"afterSelect\", function() {\n                this.afterSelect();\n            }.bind(this));\n        },\n        initData: function() {\n            this.data.subscribe(\"respond\", function(v, w) {\n                if (((w.forceDisplay || ((((w.value == this.getValue())) && !this.element.disabled))))) {\n                    this.view.render(w.value, w.results, w.isAsync);\n                }\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"activity\", function(v, w) {\n                this.fetching = w.activity;\n                if (!this.fetching) {\n                    ((this.nextQuery && this.performQuery()));\n                }\n            ;\n            ;\n                if (((this.loading != this.fetching))) {\n                    this.loading = this.fetching;\n                    this.inform(\"loading\", {\n                        loading: this.loading\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        initEvents: function() {\n            g.listen(this.view.getElement(), {\n                mouseup: this.viewMouseup.bind(this),\n                mousedown: this.viewMousedown.bind(this)\n            });\n            var v = {\n                JSBNG__blur: r(this, \"JSBNG__blur\"),\n                JSBNG__focus: r(this, \"JSBNG__focus\"),\n                click: r(this, \"click\"),\n                keyup: r(this, \"keyup\"),\n                keydown: r(this, \"keydown\")\n            };\n            if (q.firefox()) {\n                v.text = v.keyup;\n            }\n        ;\n        ;\n            if (((q.firefox() < 4))) {\n                v.keypress = v.keydown;\n                delete v.keydown;\n            }\n        ;\n        ;\n            g.listen(this.element, v);\n            g.listen(this.element, \"keypress\", r(this, \"keypress\"));\n        },\n        initToggle: function() {\n            this.subscribe(\"JSBNG__blur\", this.view.hide.bind(this.view));\n            this.subscribe(\"JSBNG__focus\", this.view.show.bind(this.view));\n        },\n        viewMousedown: function() {\n            this.selecting = true;\n        },\n        viewMouseup: function() {\n            this.selecting = false;\n        },\n        JSBNG__blur: function() {\n            if (this.selecting) {\n                this.selecting = false;\n                return;\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__blur\");\n        },\n        click: function() {\n            var v = n.get(this.element);\n            if (((v.start == v.end))) {\n                this.element.select();\n            }\n        ;\n        ;\n            this.inform(\"click\");\n        },\n        JSBNG__focus: function() {\n            this.checkValue();\n            this.inform(\"JSBNG__focus\");\n        },\n        keyup: function() {\n            if (((this.resetOnKeyup && !this.getValue()))) {\n                this.view.reset();\n            }\n        ;\n        ;\n            this.checkValue();\n        },\n        keydown: function(JSBNG__event) {\n            if (((!this.view.isVisible() || this.view.isEmpty()))) {\n                this.checkValue.bind(this).defer();\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case o.TAB:\n                this.handleTab(JSBNG__event);\n                return;\n              case o.UP:\n                this.view.prev();\n                break;\n              case o.DOWN:\n                this.view.next();\n                break;\n              case o.ESC:\n                this.view.reset();\n                break;\n              default:\n                this.checkValue.bind(this).defer();\n                return;\n            };\n        ;\n            JSBNG__event.kill();\n        },\n        keypress: function(JSBNG__event) {\n            if (((this.view.JSBNG__getSelection() && ((g.getKeyCode(JSBNG__event) == o.RETURN))))) {\n                this.view.select();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        handleTab: function(JSBNG__event) {\n            if (this.preventFocusChangeOnTab) {\n                if (this.view.JSBNG__getSelection()) {\n                    JSBNG__event.kill();\n                }\n                 else JSBNG__event.prevent();\n            ;\n            }\n        ;\n        ;\n            this.view.select();\n        },\n        select: function(v) {\n            if (((v && this.setValueOnSelect))) {\n                this.setValue(v.text);\n                this.setHiddenValue(v.uid);\n                this.selectedText = v.text;\n                j.addClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n        },\n        afterSelect: function() {\n            ((this.keepFocused ? l.set(this.element) : this.element.JSBNG__blur()));\n            ((this.resetOnSelect ? this.reset() : this.view.reset()));\n        },\n        unselect: function() {\n            if (this.setValueOnSelect) {\n                this.selectedText = null;\n                j.removeClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n            this.setHiddenValue();\n            this.inform(\"unselect\", this);\n        },\n        setEnabled: function(v) {\n            var w = ((v === false));\n            this.element.disabled = w;\n            j.conditionClass(this.root, \"uiTypeaheadDisabled\", w);\n        },\n        reset: function() {\n            this.unselect();\n            this.setValue();\n            ((!this.keepFocused && m.reset(this.element)));\n            this.view.reset();\n            this.inform(\"reset\");\n        },\n        getElement: function() {\n            return this.element;\n        },\n        setExclusions: function(v) {\n            this._exclusions = v;\n        },\n        getExclusions: function() {\n            return this._exclusions;\n        },\n        setValue: function(v) {\n            this.value = this.nextQuery = ((v || \"\"));\n            m.setValue(this.element, this.value);\n            p.update(this.element);\n        },\n        setHiddenValue: function(v) {\n            this.hiddenInput.value = ((((v || ((v === 0)))) ? v : \"\"));\n            h.inform(\"Form/change\", {\n                node: this.hiddenInput\n            });\n        },\n        getValue: function() {\n            return m.getValue(this.element);\n        },\n        getHiddenValue: function() {\n            return ((this.hiddenInput.value || \"\"));\n        },\n        checkValue: function() {\n            var v = this.getValue();\n            if (((v == this.value))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.selectedText && ((this.selectedText != v))))) {\n                this.unselect();\n            }\n        ;\n        ;\n            var w = JSBNG__Date.now(), x = ((w - this.time));\n            this.time = w;\n            this.value = this.nextQuery = v;\n            this.performQuery(x);\n        },\n        performQuery: function(v) {\n            if (this.selectedText) {\n                return;\n            }\n        ;\n        ;\n            v = ((v || 0));\n            if (((this.fetching && ((v < this.queryTimeout))))) {\n                this.data.query(this.nextQuery, true, this._exclusions, v);\n            }\n             else {\n                this.data.query(this.nextQuery, false, this._exclusions, v);\n                this.nextQuery = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"setIntervalAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return JSBNG__setInterval(h, i, false);\n    };\n;\n    e.exports = g;\n});\n__d(\"PresenceCookieManager\", [\"Cookie\",\"Dcode\",\"ErrorUtils\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"URI\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Dcode\"), i = b(\"ErrorUtils\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"PresenceUtil\"), m = b(\"URI\"), n = b(\"PresenceInitialData\"), o = n.cookieVersion, p = n.dictEncode, q = \"presence\", r = {\n    }, s = null, t = null, u = k.create(\"presence_cookie\");\n    function v() {\n        try {\n            var z = g.get(q);\n            if (((s !== z))) {\n                s = z;\n                t = null;\n                if (((z && ((z.charAt(0) == \"E\"))))) {\n                    z = h.decode(z.substring(1));\n                }\n            ;\n            ;\n                if (z) {\n                    t = JSON.parse(z);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((t && ((!t.user || ((t.user === j.user))))))) {\n                return t;\n            }\n        ;\n        ;\n        } catch (y) {\n            u.warn(\"getcookie_error\");\n        };\n    ;\n        return null;\n    };\n;\n    function w() {\n        return parseInt(((JSBNG__Date.now() / 1000)), 10);\n    };\n;\n    var x = {\n        register: function(y, z) {\n            r[y] = z;\n        },\n        store: function() {\n            var y = v();\n            if (((((y && y.v)) && ((o < y.v))))) {\n                return;\n            }\n        ;\n        ;\n            var z = {\n                v: o,\n                time: w(),\n                user: j.user\n            };\n            {\n                var fin179keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin179i = (0);\n                var aa;\n                for (; (fin179i < fin179keys.length); (fin179i++)) {\n                    ((aa) = (fin179keys[fin179i]));\n                    {\n                        z[aa] = i.applyWithGuard(r[aa], r, [((y && y[aa])),], function(ea) {\n                            ea.presence_subcookie = aa;\n                        });\n                    ;\n                    };\n                };\n            };\n        ;\n            var ba = JSON.stringify(z);\n            if (p) {\n                ba = ((\"E\" + h.encode(ba)));\n            }\n        ;\n        ;\n            if (l.hasUserCookie()) {\n                var ca = ba.length;\n                if (((ca > 1024))) {\n                    u.warn(\"big_cookie\", ca);\n                }\n            ;\n            ;\n                var da = ((m.getRequestURI(false).isSecure() && !!g.get(\"csm\")));\n                g.set(q, ba, null, null, da);\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            g.clear(q);\n        },\n        getSubCookie: function(y) {\n            var z = v();\n            if (!z) {\n                return null;\n            }\n        ;\n        ;\n            return z[y];\n        }\n    };\n    e.exports = x;\n});\n__d(\"PresenceState\", [\"Arbiter\",\"ErrorUtils\",\"JSLogger\",\"PresenceCookieManager\",\"copyProperties\",\"debounceAcrossTransitions\",\"setIntervalAcrossTransitions\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"JSLogger\"), j = b(\"PresenceCookieManager\"), k = b(\"copyProperties\"), l = b(\"debounceAcrossTransitions\"), m = b(\"setIntervalAcrossTransitions\"), n = b(\"PresenceInitialData\"), o = ((n.cookiePollInterval || 2000)), p = [], q = [], r = null, s = null, t = 0, u = null, v = 0, w = [\"sb2\",\"t2\",\"lm2\",\"uct2\",\"tr\",\"tw\",\"at\",\"wml\",], x = i.create(\"presence_state\");\n    function y() {\n        return j.getSubCookie(\"state\");\n    };\n;\n    function z() {\n        t = JSBNG__Date.now();\n        j.store();\n        da(s);\n    };\n;\n    var aa = l(z, 0);\n    function ba(ia) {\n        if (((((((((typeof ia == \"undefined\")) || isNaN(ia))) || ((ia == Number.POSITIVE_INFINITY)))) || ((ia == Number.NEGATIVE_INFINITY))))) {\n            ia = 0;\n        }\n    ;\n    ;\n        return ia;\n    };\n;\n    function ca(ia) {\n        var ja = {\n        };\n        if (ia) {\n            w.forEach(function(ma) {\n                ja[ma] = ia[ma];\n            });\n            if (((t < ia.ut))) {\n                x.error(\"new_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        ja.ut = t;\n        for (var ka = 0, la = p.length; ((ka < la)); ka++) {\n            h.applyWithGuard(p[ka], null, [ja,]);\n        ;\n        };\n    ;\n        s = ja;\n        return s;\n    };\n;\n    function da(ia) {\n        v++;\n        t = ba(ia.ut);\n        if (!r) {\n            r = m(ga, o);\n        }\n    ;\n    ;\n        s = ia;\n        if (((u === null))) {\n            u = ia;\n        }\n    ;\n    ;\n        for (var ja = 0, ka = q.length; ((ja < ka)); ja++) {\n            h.applyWithGuard(q[ja], null, [ia,]);\n        ;\n        };\n    ;\n        v--;\n    };\n;\n    function ea(ia) {\n        if (((ia && ia.ut))) {\n            if (((t < ia.ut))) {\n                return true;\n            }\n             else if (((ia.ut < t))) {\n                x.error(\"old_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function fa() {\n        var ia = y();\n        if (ea(ia)) {\n            s = ia;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    {\n        function ga() {\n            var ia = y();\n            if (ea(ia)) {\n                da(ia);\n            }\n        ;\n        ;\n        };\n        ((window.top.JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839.push)((ga)));\n    };\n;\n    j.register(\"state\", ca);\n    g.subscribe(i.DUMP_EVENT, function(ia, ja) {\n        ja.presence_state = {\n            initial: k({\n            }, u),\n            state: k({\n            }, s),\n            update_time: t,\n            sync_paused: v,\n            poll_time: o\n        };\n    });\n    (function() {\n        var ia = fa();\n        if (ia) {\n            da(ia);\n        }\n         else {\n            x.debug(\"no_cookie_initial\");\n            da(ca());\n            return;\n        }\n    ;\n    ;\n    })();\n    var ha = {\n        doSync: function(ia) {\n            if (v) {\n                return;\n            }\n        ;\n        ;\n            if (ia) {\n                z();\n            }\n             else aa();\n        ;\n        ;\n        },\n        registerStateStorer: function(ia) {\n            p.push(ia);\n        },\n        registerStateLoader: function(ia) {\n            q.push(ia);\n        },\n        get: function() {\n            return fa();\n        },\n        getInitial: function() {\n            return u;\n        },\n        verifyNumber: ba\n    };\n    e.exports = ha;\n});\n__d(\"TypeaheadBestName\", [\"TypeaheadUtil\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TypeaheadUtil\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        var j = this._typeahead.getView();\n        this._subscription = j.subscribe(\"beforeRender\", function(k, l) {\n            var m = l.value;\n            for (var n = 0; ((n < l.results.length)); ++n) {\n                var o = l.results[n];\n                if (((o.alternate_names == null))) {\n                    continue;\n                }\n            ;\n            ;\n                if (g.isQueryMatch(m, o.default_name)) {\n                    o.text = o.default_name;\n                    return;\n                }\n            ;\n            ;\n                for (var p = 0; ((p < o.alternate_names.length)); p++) {\n                    if (g.isQueryMatch(m, o.alternate_names[p])) {\n                        o.text = o.alternate_names[p];\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n                o.text = o.default_name;\n            };\n        ;\n        });\n    };\n    i.prototype.disable = function() {\n        this._typeahead.getView().unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:BestNameTypeaheadBehavior\", [\"TypeaheadBestName\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadBestName\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.buildBestAvailableNames = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypingDetector\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"Input\",\"Run\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"Input\"), j = b(\"Run\"), k = b(\"copyProperties\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\");\n    function n(o) {\n        this._input = o;\n        this._ignoreKeys = {\n        };\n    };\n;\n    n.INACTIVE = 0;\n    n.TYPING = 1;\n    n.QUITTING = 2;\n    k(n.prototype, h, {\n        _timeout: 7000,\n        _currentState: n.INACTIVE,\n        init: function() {\n            this.init = m;\n            this.reset();\n            g.listen(this._input, \"keyup\", this._update.bind(this));\n            j.onUnload(this._onunload.bind(this));\n        },\n        reset: function() {\n            JSBNG__clearTimeout(this._checkTimer);\n            this._checkTimer = null;\n            this._lastKeystrokeAt = null;\n            this._currentState = n.INACTIVE;\n        },\n        setIgnoreKeys: function(o) {\n            this._ignoreKeys = l(o);\n        },\n        _onunload: function() {\n            if (((this._currentState == n.TYPING))) {\n                this._transition(n.QUITTING);\n            }\n        ;\n        ;\n        },\n        _update: function(JSBNG__event) {\n            var o = g.getKeyCode(JSBNG__event), p = this._currentState;\n            if (!this._ignoreKeys[o]) {\n                if (((i.getValue(this._input).trim().length === 0))) {\n                    if (((p == n.TYPING))) {\n                        this._transition(n.INACTIVE);\n                    }\n                ;\n                ;\n                }\n                 else if (((p == n.TYPING))) {\n                    this._recordKeystroke();\n                }\n                 else if (((p == n.INACTIVE))) {\n                    this._transition(n.TYPING);\n                    this._recordKeystroke();\n                }\n                \n                \n            ;\n            }\n        ;\n        ;\n        },\n        _transition: function(o) {\n            this.reset();\n            this._currentState = o;\n            this.inform(\"change\", o);\n        },\n        _recordKeystroke: function() {\n            this._lastKeystrokeTime = JSBNG__Date.now();\n            if (!this._checkTimer) {\n                this._checkTimer = this._checkTyping.bind(this).defer(this._timeout);\n            }\n        ;\n        ;\n        },\n        _checkTyping: function() {\n            var o = ((this._lastKeystrokeTime + this._timeout)), p = JSBNG__Date.now();\n            if (((p > o))) {\n                this._transition(n.INACTIVE);\n            }\n             else {\n                JSBNG__clearTimeout(this._checkTimer);\n                this._checkTimer = this._checkTyping.bind(this).defer(((((o - p)) + 10)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"ClearableTypeahead\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = {\n        resetOnCloseButtonClick: function(i, j) {\n            g.listen(j, \"click\", function() {\n                var k = i.getCore();\n                k.getElement().JSBNG__focus();\n                k.reset();\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"TypeaheadShowLoadingIndicator\", [\"CSS\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._typeahead.subscribe(\"loading\", function(j, k) {\n                g.conditionClass(this._typeahead.getElement(), \"typeaheadLoading\", k.loading);\n                g.conditionClass(this._typeahead.getView().getElement(), \"typeaheadViewLoading\", k.loading);\n            }.bind(this));\n        },\n        disable: function() {\n            this._typeahead.unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:ShowLoadingIndicatorTypeaheadBehavior\", [\"TypeaheadShowLoadingIndicator\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadShowLoadingIndicator\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.showLoadingIndicator = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"CompactTypeaheadRenderer\", [\"Badge\",\"DOM\",\"TypeaheadFacepile\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"TypeaheadFacepile\");\n    function j(k, l) {\n        var m = [];\n        if (k.xhp) {\n            return h.create(\"li\", {\n                className: \"raw\"\n            }, k.xhp);\n        }\n    ;\n    ;\n        var n = ((k.photos || k.photo));\n        if (n) {\n            if (((n instanceof Array))) {\n                n = i.render(n);\n            }\n             else n = h.create(\"img\", {\n                alt: \"\",\n                src: n\n            });\n        ;\n        ;\n            m.push(n);\n        }\n    ;\n    ;\n        if (k.text) {\n            var o = [k.text,];\n            if (k.verified) {\n                o.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            m.push(h.create(\"span\", {\n                className: \"text\"\n            }, o));\n        }\n    ;\n    ;\n        var p = k.subtext, q = k.category;\n        if (((p || q))) {\n            var r = [];\n            ((p && r.push(p)));\n            ((((p && q)) && r.push(\" \\u00b7 \")));\n            ((q && r.push(q)));\n            m.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, r));\n        }\n    ;\n    ;\n        var s = h.create(\"li\", {\n            className: ((k.type || \"\"))\n        }, m);\n        if (k.text) {\n            s.setAttribute(\"aria-label\", k.text);\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    j.className = \"compact\";\n    e.exports = j;\n});\n__d(\"URLMatcher\", [], function(a, b, c, d, e, f) {\n    var g = \"!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\", h = \"\\u2000-\\u206f\\u00ab\\u00bb\\uff08\\uff09\", i = \"(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\", j = \"(?:(?:ht|f)tps?)://\", k = ((((((((\"(?:(?:\" + i)) + \"[.]){3}\")) + i)) + \")\")), l = \"\\\\[(?:(?:[A-Za-z0-9]{1,4}::?){1,7}[A-Za-z0-9]{1,4})\\\\]\", m = \"(?:\\\\b)www\\\\d{0,3}[.]\", n = ((((((\"[^\\\\s\" + g)) + h)) + \"]\")), o = ((((((((((((\"(?:(?:(?:[.:\\\\-_%@]|\" + n)) + \")*\")) + n)) + \")|\")) + l)) + \")\")), p = \"(?:[.][a-z]{2,4})\", q = \"(?::\\\\d+){0,1}\", r = \"(?=[/?#])\", s = ((((((((((((((((((((((((((((((((((((((((((((((((((((\"(?:\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + k)) + q)) + \")|\")) + \"(?:\")) + l)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")|\")) + \"(?:\")) + o)) + p)) + q)) + r)) + \")\")) + \")\")), t = \"[/#?]\", u = \"\\\\([^\\\\s()\\u003C\\u003E]+\\\\)\", v = \"[^\\\\s()\\u003C\\u003E?#]+\", w = new RegExp(s, \"im\"), x = ((((((((((((((((((((((\"(?:\" + \"(?:\")) + t)) + \")\")) + \"(?:\")) + \"(?:\")) + u)) + \"|\")) + v)) + \")*\")) + \")*\")) + \")*\")), y = new RegExp(((((((((((((((\"(\" + \"(?:\")) + s)) + \")\")) + \"(?:\")) + x)) + \")\")) + \")\")), \"im\"), z = new RegExp(((((((((((((((((((((((((\"(\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")\")) + \")\"))), aa = /[\\s'\";]/, ba = new RegExp(t, \"im\"), ca = new RegExp(\"[\\\\s!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\\u00ab\\u00bb\\u2000-\\u206f\\uff08\\uff09]\", \"im\"), da = new RegExp(\"[\\\\s()\\u003C\\u003E?#]\", \"im\"), ea = new RegExp(\"\\\\s()\\u003C\\u003E\"), fa = function(ma) {\n        if (((ma && ((ma.indexOf(\"@\") != -1))))) {\n            return (((z.exec(ma)) ? ma : null));\n        }\n         else return ma\n    ;\n    }, ga = function(ma) {\n        return ha(ma, y);\n    }, ha = function(ma, na) {\n        var oa = ((((na.exec(ma) || []))[1] || null));\n        return fa(oa);\n    }, ia = function(ma) {\n        return w.exec(ma);\n    }, ja = function(ma) {\n        return !aa.test(ma.charAt(((ma.length - 1))));\n    }, ka = function(ma) {\n        var na = w.exec(ma);\n        if (!na) {\n            return null;\n        }\n    ;\n    ;\n        var oa = ma.substr(((na.index + na[0].length)));\n        if (((((oa.length === 0)) || !(ba.test(oa[0]))))) {\n            return fa(na[0]);\n        }\n    ;\n    ;\n        var pa = 0, qa = 0, ra = 1, sa = 0, ta = qa;\n        for (var ua = 1; ((ua < oa.length)); ua++) {\n            var va = oa[ua];\n            if (((ta === qa))) {\n                if (((va === \"(\"))) {\n                    sa = ((sa + 1));\n                    ta = ra;\n                }\n                 else if (((ba.test(va) || !(ca.test(va))))) {\n                    pa = ua;\n                }\n                 else if (da.test(va)) {\n                    break;\n                }\n                \n                \n            ;\n            ;\n            }\n             else if (((va === \"(\"))) {\n                sa = ((sa + 1));\n            }\n             else if (((va === \")\"))) {\n                sa = ((sa - 1));\n                if (((sa === 0))) {\n                    ta = qa;\n                    pa = ua;\n                }\n            ;\n            ;\n            }\n             else if (ea.test(va)) {\n                break;\n            }\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        return fa(((na[0] + oa.substring(0, ((pa + 1))))));\n    }, la = {\n    };\n    la.permissiveMatch = ga;\n    la.matchToPattern = ha;\n    la.matchHost = ia;\n    la.trigger = ja;\n    la.match = ka;\n    e.exports = la;\n});");
// 8804
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o55,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/2vpWO_t_tQV.js",o56);
// undefined
o55 = null;
// undefined
o56 = null;
// 8808
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"hfrQl\",]);\n}\n;\n__d(\"FriendBrowserCheckboxController\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"Event\",\"Form\",\"OnVisible\",\"$\",\"bind\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"Form\"), l = b(\"OnVisible\"), m = b(\"$\"), n = b(\"bind\"), o = b(\"copyProperties\"), p = b(\"ge\");\n    function q() {\n    \n    };\n    o(q, {\n        instances: {\n        },\n        getInstance: function(r) {\n            return this.instances[r];\n        }\n    });\n    o(q.prototype, {\n        init: function(r, s, t, u) {\n            q.instances[r] = this;\n            this._id = r;\n            this._simplified = t;\n            this._infiniteScroll = u;\n            this._form = s;\n            this._contentGrid = i.find(s, \".friendBrowserCheckboxContentGrid\");\n            this._loadingIndicator = i.find(s, \".friendBrowsingCheckboxContentLoadingIndicator\");\n            this._checkboxResults = i.find(s, \".friendBrowserCheckboxResults\");\n            this._contentPager = i.find(s, \".friendBrowserCheckboxContentPager\");\n            this.numGetNewRequests = 0;\n            this.queuedRequests = {\n            };\n            j.listen(this._form, \"submit\", this.onFormSubmit.bind(this));\n        },\n        addTypeahead: function(r, s) {\n            r.subscribe(\"select\", this.onHubSelect.bind(this, r, s));\n            if (this._simplified) {\n                r.subscribe(\"unselect\", this.onHubSelect.bind(this, r, s));\n            };\n        },\n        onFormSubmit: function() {\n            this.getNew(true);\n            return false;\n        },\n        addSelector: function(r) {\n            r.subscribe(\"change\", this.getNew.bind(this, false));\n        },\n        onHubSelect: function(r, s, event, t) {\n            if (this._simplified) {\n                this.getNew(true);\n                return;\n            }\n        ;\n            if (!((((event == \"select\")) && t.selected))) {\n                return\n            };\n            var u = this.buildNewCheckbox(s, t.selected.text, t.selected.uid), v = i.find(this._form, (\".checkboxes_\" + s));\n            i.appendContent(v.firstChild, u);\n            var w = i.scry(r.getElement(), \"input[type=\\\"button\\\"]\");\n            if ((w && w[0])) {\n                w[0].click();\n            };\n            this.getNew(true);\n        },\n        buildNewCheckbox: function(r, s, t) {\n            var u = ((r + \"_ids_\") + t), v = (r + \"_ids[]\"), w = i.create(\"input\", {\n                id: u,\n                type: \"checkbox\",\n                value: t,\n                name: v,\n                checked: true\n            });\n            j.listen(w, \"click\", n(this, \"getNew\", false));\n            var x = i.create(\"td\", null, w);\n            h.addClass(x, \"vTop\");\n            h.addClass(x, \"hLeft\");\n            var y = i.create(\"label\", null, s), z = i.create(\"td\", null, y);\n            h.addClass(z, \"vMid\");\n            h.addClass(z, \"hLeft\");\n            var aa = i.create(\"tr\");\n            aa.appendChild(x);\n            aa.appendChild(z);\n            return aa;\n        },\n        showMore: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (!r) {\n                return false\n            };\n            if (h.hasClass(r, \"async_saving\")) {\n                return false\n            };\n            var s = this.numGetNewRequests, t = k.serialize(this._form);\n            t.show_more = true;\n            var u = new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(v) {\n                this.showMoreHandler(v, s);\n            })).setStatusElement(r).send();\n        },\n        showMoreHandler: function(r, s) {\n            if ((s == this.numGetNewRequests)) {\n                var t = r.payload;\n                i.appendContent(this._contentGrid, t.results);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        },\n        getNew: function(r) {\n            this.numGetNewRequests++;\n            var s = this.numGetNewRequests;\n            h.addClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n            if (p(\"friendBrowserCI\")) {\n                h.addClass(m(\"friendBrowserCI\"), \"friendBrowserCheckboxContentOnload\");\n            };\n            h.show(this._loadingIndicator);\n            var t = k.serialize(this._form);\n            t.used_typeahead = r;\n            new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(u) {\n                this.getNewHandler(u, s);\n            })).send();\n        },\n        getNewHandler: function(r, s) {\n            if ((s == this.numGetNewRequests)) {\n                var t = r.payload;\n                i.setContent(this._contentGrid, t.results);\n                h.removeClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n                if (p(\"friendBrowserCI\")) {\n                    h.hide(m(\"friendBrowserCI\"));\n                };\n                h.hide(this._loadingIndicator);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        },\n        updatePagerAndExtraData: function(r, s) {\n            i.setContent(this._contentPager, r);\n            if (this._infiniteScroll) {\n                this.setupOnVisible();\n            };\n            i.replace(this._form.elements.extra_data, s);\n        },\n        setupOnVisible: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if ((r && (this._id != \"jewel\"))) {\n                (this._onVisible && this._onVisible.remove());\n                this._onVisible = new l(r, n(this, \"showMore\"), false, 1000);\n            }\n        ;\n        }\n    });\n    e.exports = q;\n});\n__d(\"legacy:friend-browser-checkbox-js\", [\"FriendBrowserCheckboxController\",], function(a, b, c, d) {\n    a.FriendBrowserCheckboxController = b(\"FriendBrowserCheckboxController\");\n}, 3);\n__d(\"FacebarResultStoreUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        processEntityResult: function(h, i, j, k) {\n            var l = {\n                semantic: i.toString(),\n                structure: [{\n                    type: (\"ent:\" + h),\n                    text: j,\n                    uid: i\n                },],\n                type: ((\"{\" + h) + \"}\"),\n                cost: k,\n                cache_id_length: 0,\n                bolding: []\n            };\n            l.tuid = JSON.stringify({\n                semantic: l.semantic,\n                structure: l.structure\n            });\n            return l;\n        }\n    };\n    e.exports = g;\n});\n__d(\"HashtagParser\", [\"URLMatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"URLMatcher\"), h = 100, i = 30, j = /@\\[([0-9]+):([0-9]+):((?:[^\\\\\\]]*(?:\\\\.)*)*)\\]/g;\n    function k() {\n        var da = ((((((((((((((((\"\\u00c0-\\u00d6\" + \"\\u00d8-\\u00f6\") + \"\\u00f8-\\u00ff\") + \"\\u0100-\\u024f\") + \"\\u0253-\\u0254\") + \"\\u0256-\\u0257\") + \"\\u0259\") + \"\\u025b\") + \"\\u0263\") + \"\\u0268\") + \"\\u026f\") + \"\\u0272\") + \"\\u0289\") + \"\\u028b\") + \"\\u02bb\") + \"\\u0300-\\u036f\") + \"\\u1e00-\\u1eff\"), ea = ((((((((((((((((((((((((((((((((((((((((((((\"\\u0400-\\u04ff\" + \"\\u0500-\\u0527\") + \"\\u2de0-\\u2dff\") + \"\\ua640-\\ua69f\") + \"\\u0591-\\u05bf\") + \"\\u05c1-\\u05c2\") + \"\\u05c4-\\u05c5\") + \"\\u05c7\") + \"\\u05d0-\\u05ea\") + \"\\u05f0-\\u05f4\") + \"\\ufb12-\\ufb28\") + \"\\ufb2a-\\ufb36\") + \"\\ufb38-\\ufb3c\") + \"\\ufb3e\") + \"\\ufb40-\\ufb41\") + \"\\ufb43-\\ufb44\") + \"\\ufb46-\\ufb4f\") + \"\\u0610-\\u061a\") + \"\\u0620-\\u065f\") + \"\\u066e-\\u06d3\") + \"\\u06d5-\\u06dc\") + \"\\u06de-\\u06e8\") + \"\\u06ea-\\u06ef\") + \"\\u06fa-\\u06fc\") + \"\\u06ff\") + \"\\u0750-\\u077f\") + \"\\u08a0\") + \"\\u08a2-\\u08ac\") + \"\\u08e4-\\u08fe\") + \"\\ufb50-\\ufbb1\") + \"\\ufbd3-\\ufd3d\") + \"\\ufd50-\\ufd8f\") + \"\\ufd92-\\ufdc7\") + \"\\ufdf0-\\ufdfb\") + \"\\ufe70-\\ufe74\") + \"\\ufe76-\\ufefc\") + \"\\u200c-\\u200c\") + \"\\u0e01-\\u0e3a\") + \"\\u0e40-\\u0e4e\") + \"\\u1100-\\u11ff\") + \"\\u3130-\\u3185\") + \"\\ua960-\\ua97f\") + \"\\uac00-\\ud7af\") + \"\\ud7b0-\\ud7ff\") + \"\\uffa1-\\uffdc\"), fa = String.fromCharCode, ga = ((((((((((((((((\"\\u30a1-\\u30fa\\u30fc-\\u30fe\" + \"\\uff66-\\uff9f\") + \"\\uff10-\\uff19\\uff21-\\uff3a\") + \"\\uff41-\\uff5a\") + \"\\u3041-\\u3096\\u3099-\\u309e\") + \"\\u3400-\\u4dbf\") + \"\\u4e00-\\u9fff\") + fa(173824)) + \"-\") + fa(177983)) + fa(177984)) + \"-\") + fa(178207)) + fa(194560)) + \"-\") + fa(195103)) + \"\\u3003\\u3005\\u303b\"), ha = ((da + ea) + ga), ia = ((((((((((((((((((((((((((((((((((((((((((((((((((\"A-Za-z\\u00aa\\u00b5\\u00ba\\u00c0-\\u00d6\\u00d8-\\u00f6\" + \"\\u00f8-\\u0241\\u0250-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ee\\u037a\\u0386\") + \"\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03ce\\u03d0-\\u03f5\\u03f7-\\u0481\") + \"\\u048a-\\u04ce\\u04d0-\\u04f9\\u0500-\\u050f\\u0531-\\u0556\\u0559\\u0561-\\u0587\") + \"\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0621-\\u063a\\u0640-\\u064a\\u066e-\\u066f\") + \"\\u0671-\\u06d3\\u06d5\\u06e5-\\u06e6\\u06ee-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\") + \"\\u0712-\\u072f\\u074d-\\u076d\\u0780-\\u07a5\\u07b1\\u0904-\\u0939\\u093d\\u0950\") + \"\\u0958-\\u0961\\u097d\\u0985-\\u098c\\u098f-\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\") + \"\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc-\\u09dd\\u09df-\\u09e1\\u09f0-\\u09f1\") + \"\\u0a05-\\u0a0a\\u0a0f-\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32-\\u0a33\") + \"\\u0a35-\\u0a36\\u0a38-\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\") + \"\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2-\\u0ab3\\u0ab5-\\u0ab9\\u0abd\") + \"\\u0ad0\\u0ae0-\\u0ae1\\u0b05-\\u0b0c\\u0b0f-\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\") + \"\\u0b32-\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c-\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\") + \"\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99-\\u0b9a\\u0b9c\\u0b9e-\\u0b9f\") + \"\\u0ba3-\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0c05-\\u0c0c\\u0c0e-\\u0c10\") + \"\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c60-\\u0c61\\u0c85-\\u0c8c\") + \"\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\") + \"\\u0ce0-\\u0ce1\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d28\\u0d2a-\\u0d39\") + \"\\u0d60-\\u0d61\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\") + \"\\u0e01-\\u0e30\\u0e32-\\u0e33\\u0e40-\\u0e46\\u0e81-\\u0e82\\u0e84\\u0e87-\\u0e88\") + \"\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\") + \"\\u0eaa-\\u0eab\\u0ead-\\u0eb0\\u0eb2-\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\") + \"\\u0edc-\\u0edd\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6a\\u0f88-\\u0f8b\\u1000-\\u1021\") + \"\\u1023-\\u1027\\u1029-\\u102a\\u1050-\\u1055\\u10a0-\\u10c5\\u10d0-\\u10fa\\u10fc\") + \"\\u1100-\\u1159\\u115f-\\u11a2\\u11a8-\\u11f9\\u1200-\\u1248\\u124a-\\u124d\") + \"\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\") + \"\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\") + \"\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\") + \"\\u166f-\\u1676\\u1681-\\u169a\\u16a0-\\u16ea\\u1700-\\u170c\\u170e-\\u1711\") + \"\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\") + \"\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\") + \"\\u1980-\\u19a9\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1d00-\\u1dbf\\u1e00-\\u1e9b\") + \"\\u1ea0-\\u1ef9\\u1f00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\") + \"\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\") + \"\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\") + \"\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u2094\\u2102\\u2107\") + \"\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\") + \"\\u212f-\\u2131\\u2133-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u2c00-\\u2c2e\") + \"\\u2c30-\\u2c5e\\u2c80-\\u2ce4\\u2d00-\\u2d25\\u2d30-\\u2d65\\u2d6f\\u2d80-\\u2d96\") + \"\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\") + \"\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3006\\u3031-\\u3035\") + \"\\u303b-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\") + \"\\u3105-\\u312c\\u3131-\\u318e\\u31a0-\\u31b7\\u31f0-\\u31ff\\u3400-\\u4db5\") + \"\\u4e00-\\u9fbb\\ua000-\\ua48c\\ua800-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\") + \"\\ua80c-\\ua822\\uac00-\\ud7a3\\uf900-\\ufa2d\\ufa30-\\ufa6a\\ufa70-\\ufad9\") + \"\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\") + \"\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\") + \"\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\") + \"\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\") + \"\\uffda-\\uffdc\"), ja = ((((((((((((((((((((\"\\u0300-\\u036f\\u0483-\\u0486\\u0591-\\u05b9\\u05bb-\\u05bd\\u05bf\" + \"\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u0610-\\u0615\\u064b-\\u065e\\u0670\") + \"\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\") + \"\\u07a6-\\u07b0\\u0901-\\u0903\\u093c\\u093e-\\u094d\\u0951-\\u0954\\u0962-\\u0963\") + \"\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7-\\u09c8\\u09cb-\\u09cd\\u09d7\") + \"\\u09e2-\\u09e3\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\") + \"\\u0a70-\\u0a71\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\") + \"\\u0ae2-\\u0ae3\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b43\\u0b47-\\u0b48\\u0b4b-\\u0b4d\") + \"\\u0b56-\\u0b57\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\") + \"\\u0c01-\\u0c03\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56\") + \"\\u0c82-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5-\\u0cd6\") + \"\\u0d02-\\u0d03\\u0d3e-\\u0d43\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d82-\\u0d83\") + \"\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2-\\u0df3\\u0e31\\u0e34-\\u0e3a\") + \"\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\") + \"\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f3f\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f90-\\u0f97\") + \"\\u0f99-\\u0fbc\\u0fc6\\u102c-\\u1032\\u1036-\\u1039\\u1056-\\u1059\\u135f\") + \"\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17b6-\\u17d3\\u17dd\") + \"\\u180b-\\u180d\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u19b0-\\u19c0\\u19c8-\\u19c9\") + \"\\u1a17-\\u1a1b\\u1dc0-\\u1dc3\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20eb\\u302a-\\u302f\") + \"\\u3099-\\u309a\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ufb1e\\ufe00-\\ufe0f\") + \"\\ufe20-\\ufe23\"), ka = ((((\"0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u0966-\\u096f\\u09e6-\\u09ef\" + \"\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\") + \"\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\") + \"\\u1040-\\u1049\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\") + \"\\uff10-\\uff19\"), la = ((ia + ja) + ha), ma = (ka + \"_\"), na = (la + ma), oa = ((\"[\" + la) + \"]\"), pa = ((\"[\" + na) + \"]\"), qa = ((\"^|$|[^&\" + na) + \"]\"), ra = \"[#\\\\uFF03]\", sa = (((((((((\"(\" + qa) + \")(\") + ra) + \")(\") + pa) + \"*\") + oa) + pa) + \"*)\");\n        return new RegExp(sa, \"ig\");\n    };\n    function l(da) {\n        var ea = y(da), fa = 0, ga = 0;\n        return n(da).map(function(ha) {\n            while ((fa < ea.length)) {\n                var ia = ea[fa], ja = (ia.offset - ga);\n                if ((ja < ha.offset)) {\n                    ga += (ia.token.length - ia.name.length);\n                    fa++;\n                }\n                 else break;\n            ;\n            };\n            return {\n                marker: ha.marker,\n                tag: ha.hashtag,\n                rawOffset: (ha.offset + ga),\n                offset: ha.offset\n            };\n        });\n    };\n    function m(da) {\n        return o(da, t(da));\n    };\n    function n(da) {\n        var ea = aa(da);\n        return o(ea, p(da, ea));\n    };\n    function o(da, ea) {\n        return r(da).slice(0, i).filter(function(fa) {\n            var ga = v(fa.offset, fa.hashtag.length, ea);\n            return (!ga && (fa.hashtag.length <= h));\n        });\n    };\n    function p(da, ea) {\n        return u(s(da), t(ea));\n    };\n    var q = k();\n    function r(da) {\n        var ea = [];\n        da.replace(q, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                marker: ha,\n                hashtag: ia,\n                offset: (ja + ga.length)\n            });\n        });\n        return ea;\n    };\n    function s(da) {\n        return ba(da).map(function(ea) {\n            return [ea.offset,ea.name.length,];\n        });\n    };\n    function t(da) {\n        var ea = [], fa, ga = 0;\n        while ((fa = g.permissiveMatch(da))) {\n            var ha = da.indexOf(fa);\n            ea.push([(ga + ha),fa.length,]);\n            da = da.substring((ha + fa.length));\n            ga += (ha + fa.length);\n        };\n        return ea;\n    };\n    function u(da, ea) {\n        var fa = [], ga = 0, ha = 0, ia = 0;\n        while (((ga < da.length) && (ha < ea.length))) {\n            if ((da[ga][0] > ea[ha][0])) {\n                fa[ia++] = ea[ha++];\n            }\n             else fa[ia++] = da[ga++];\n        ;\n        };\n        return fa.concat(da.slice(ga), ea.slice(ha));\n    };\n    function v(da, ea, fa) {\n        if (!fa) {\n            return false\n        };\n        var ga = x(fa, da);\n        return (w(da, ea, fa, ga) || w(da, ea, fa, (ga + 1)));\n    };\n    function w(da, ea, fa, ga) {\n        if (!fa[ga]) {\n            return false\n        };\n        var ha = fa[ga][0], ia = fa[ga][1];\n        return !((((((da + ea) - 1) < ha)) || ((da > ((ha + ia) - 1)))));\n    };\n    function x(da, ea) {\n        var fa = 0, ga = (da.length - 1);\n        while ((fa <= ga)) {\n            var ha = Math.floor((((fa + ga)) / 2)), ia = da[ha][0];\n            if ((ia == ea)) {\n                return ha;\n            }\n             else if ((ia < ea)) {\n                fa = (ha + 1);\n            }\n             else ga = (ha - 1);\n            \n        ;\n        };\n        return ga;\n    };\n    function y(da) {\n        var ea = [];\n        da.replace(j, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                token: fa,\n                id: ga,\n                type: ha,\n                name: ia,\n                offset: ja\n            });\n        });\n        return ea;\n    };\n    function z(da) {\n        return (da ? da.replace(/\\\\([^\\\\])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\") : null);\n    };\n    function aa(da) {\n        return da.replace(j, function(ea, fa, ga, ha, ia) {\n            return z(ha);\n        });\n    };\n    function ba(da) {\n        var ea = 0, fa = 0;\n        return y(da).map(function(ga) {\n            var ha = da.indexOf(ga.token, fa);\n            fa = (ha + 1);\n            ha -= ea;\n            var ia = z(ga.name);\n            ea += (ga.token.length - ia.length);\n            if ((ha >= 0)) {\n                return {\n                    id: ga.id,\n                    name: ia,\n                    type: ga.type,\n                    offset: ha\n                }\n            };\n        });\n    };\n    var ca = {\n    };\n    ca.parse = l;\n    ca.parseWithoutMentions = m;\n    e.exports = ca;\n});\n__d(\"HashtagSearchResultUtils\", [\"FacebarResultStoreUtils\",\"HashtagParser\",\"HashtagSearchResultConfig\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarResultStoreUtils\"), h = b(\"HashtagParser\"), i = b(\"HashtagSearchResultConfig\"), j = b(\"URI\"), k = {\n        getHashtagFromQuery: function(l) {\n            var m = h.parse(l);\n            if (((m && (m.length === 1)) && (m[0].offset === 0))) {\n                return m[0].tag\n            };\n            return false;\n        },\n        makeTypeaheadResult: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j((\"/hashtag/\" + l)).toString(),\n                photo: i.image_url,\n                rankType: null,\n                replace_results: (i.boost_result ? true : false),\n                scaled_score: 1,\n                score: 0,\n                text: (\"#\" + l),\n                type: \"hashtag_exact\",\n                uid: (\"hashtag:\" + l)\n            };\n        },\n        makeFacebarEntry: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j((\"/hashtag/\" + l)).toString(),\n                photo: i.image_url,\n                replace_results: (i.boost_result ? true : false),\n                text: (\"#\" + l),\n                type: \"hashtag_exact\",\n                uid: (\"hashtag:\" + l)\n            };\n        },\n        makeFacebarResult: function(l) {\n            var m = g.processEntityResult(\"hashtag_exact\", (\"hashtag:\" + l), (\"#\" + l), i.hashtag_cost);\n            m.parse = {\n                display: [{\n                    type: \"ent:hashtag_exact\",\n                    uid: (\"hashtag:\" + l)\n                },],\n                remTokens: [],\n                suffix: \"\",\n                unmatch: []\n            };\n            return m;\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualHelpSearchController\", [\"Event\",\"AsyncRequest\",\"DOM\",\"CSS\",\"Focus\",\"Input\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"CSS\"), k = b(\"Focus\"), l = b(\"Input\"), m = b(\"copyProperties\"), n = 400;\n    function o() {\n        this._token = null;\n        this._timerID = 0;\n        this._lastQuery = null;\n        this.typing_listener = null;\n        this.clear_listener = null;\n        this.async_request = null;\n    };\n    m(o.prototype, {\n        init: function(p, q, r, s, t) {\n            this.loader = p;\n            this.search_box = q;\n            this.topics_area = r;\n            this.results_area = s;\n            this.clear_button = t;\n            this.typing_listener = g.listen(this.search_box, \"keyup\", this.setTimer.bind(this));\n            this.clear_listener = g.listen(this.clear_button, \"click\", this.clearResults.bind(this));\n            k.set(this.search_box);\n        },\n        source: \"contextual_help\",\n        clearResults: function() {\n            this.show(this.topics_area);\n            this._lastQuery = \"\";\n            l.reset(this.search_box);\n            k.set(this.search_box);\n            if ((this.async_request !== null)) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n            j.addClass(this.clear_button, \"hidden_elem\");\n        },\n        update: function() {\n            var p = l.getValue(this.search_box);\n            if ((p === this._lastQuery)) {\n                return\n            };\n            this._lastQuery = p;\n            if ((p === \"\")) {\n                this.clearResults();\n                return;\n            }\n        ;\n            this.show(this.loader);\n            var q = {\n                query: p,\n                width: (this._width || n),\n                source: this.source\n            };\n            this.async_request = new h(\"/help/ajax/search/\").setData(q).setHandler(function(r) {\n                this._update(r);\n            }.bind(this));\n            this.async_request.send();\n        },\n        _update: function(p) {\n            this.async_request = null;\n            var q = p.getPayload().results;\n            i.setContent(this.results_area, q);\n            this.show(this.results_area);\n            if ((l.getValue(this.search_box) === \"\")) {\n                this.clearResults();\n            }\n             else j.removeClass(this.clear_button, \"hidden_elem\");\n        ;\n        },\n        setTimer: function() {\n            if ((this._timerID !== 0)) {\n                clearTimeout(this._timerID);\n            };\n            this._timerID = setTimeout(this.update.bind(this), 300);\n            if ((this.async_request != null)) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        },\n        show: function(p) {\n            var q = [this.loader,this.topics_area,this.results_area,];\n            for (var r = 0; (r < q.length); r++) {\n                j.addClass(q[r], \"hidden_elem\");;\n            };\n            j.removeClass(p, \"hidden_elem\");\n        }\n    });\n    e.exports = o;\n});\n__d(\"RequestsJewel\", [\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Event\",\"FriendBrowserCheckboxController\",\"LinkController\",\"Parent\",\"ScrollableArea\",\"Vector\",\"copyProperties\",\"ge\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"FriendBrowserCheckboxController\"), o = b(\"LinkController\"), p = b(\"Parent\"), q = b(\"ScrollableArea\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"shield\"), v = b(\"tx\");\n    function w() {\n    \n    };\n    s(w, {\n        instance: null,\n        getInstance: function() {\n            return this.instance;\n        }\n    });\n    s(w.prototype, {\n        init: function(x, y, z) {\n            w.instance = this;\n            this.countNew = 0;\n            this.jewel = x;\n            this.jewelFlyoutCase = x.getRoot();\n            this.jewelFlyout = t(\"fbRequestsFlyout\");\n            this.newCountSpan = t(\"newRequestCount\");\n            this.folder = y;\n            this.doNewMarkRead = z;\n            this.openTimestamp = 0;\n            this._requestList = {\n            };\n            this._requestCount = 0;\n            this.egoPredictedCount = 0;\n            this.pendingCount = 0;\n            this.shouldLogEgoClick = false;\n            this.shouldClearPredictionAssocOnClick = false;\n            var aa = t(\"requestsMarkReadButton\");\n            if (aa) {\n                m.listen(aa, \"click\", u(this._markRead, this));\n            };\n            this.jewel.subscribe(\"marked-seen\", u(this._markSeenCallback, this));\n            this.jewel.subscribe(\"closed\", u(this._clearNewItems, this));\n            this.jewel.subscribe(\"updated\", this._updateCount.bind(this));\n            this.jewel.subscribe(\"opened\", this._openHandler.bind(this));\n            o.registerHandler(this._handleLink.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_add\"), this._addRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_remove_old\"), this._removeOldRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"friend_requests_seen\"), this._markSeenFromMessage.bind(this));\n            g.subscribe(\"jewel/ego_predicted_count\", function(ba, ca) {\n                this.egoPredictedCount = ca.ego_predicted_count;\n                this.pendingCount = ca.pending_count;\n                this.egoUnseenTimestamp = ca.unseen_timestamp;\n                this.shouldLogEgoClick = ca.should_log_ego_click;\n                this.actionContext = ca.action_context;\n            }.bind(this));\n            m.listen(this.jewelFlyout, \"submit\", function(ba) {\n                var ca = p.byClass(ba.getTarget(), \"objectListItem\");\n                if (ca) {\n                    k.removeClass(ca, \"jewelItemNew\");\n                    k.addClass(ca, \"jewelItemResponded\");\n                    this.pageInCollapsedRequests();\n                }\n            ;\n            }.bind(this));\n            this.setupScroll();\n            return this;\n        },\n        setupScroll: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableAreaWrap\")[0];\n            if (x) {\n                this._scrollableWrap = x;\n                this._lastLinkPosition = 0;\n                this._scrollListener = m.listen(x, \"scroll\", this._handleScroll.bind(this), m.Priority._BUBBLE);\n            }\n        ;\n        },\n        fromDom: function() {\n            l.scry(this.jewelFlyout, \".jewelItemList li.objectListItem\").forEach(function(x) {\n                var y = x.getAttribute(\"id\");\n                if (y) {\n                    var z = this._parseIDToInts(y);\n                    if (z.requester) {\n                        this._requestList[z.requester] = y;\n                    };\n                    ++this._requestCount;\n                }\n            ;\n            }.bind(this));\n            this._conditionShowEmptyMessage();\n        },\n        _parseID: function(x) {\n            var y = x.match(/^(\\d+)_(\\d+)/);\n            return ((y) ? {\n                requester: y[1],\n                type: y[2]\n            } : undefined);\n        },\n        _parseIDToInts: function(x) {\n            var y = (x ? this._parseID(x) : undefined), z;\n            if ((y && y.requester)) {\n                z = parseInt(y.requester, 10);\n                if (isNaN(z)) {\n                    z = undefined;\n                };\n            }\n        ;\n            var aa;\n            if ((y && y.type)) {\n                aa = parseInt(y.type, 10);\n                if (isNaN(aa)) {\n                    aa = undefined;\n                };\n            }\n        ;\n            return {\n                requester: z,\n                type: aa\n            };\n        },\n        _handleLink: function(x, event) {\n            var y = p.byClass(x, \"jewelItemNew\");\n            if (((y && p.byClass(y, \"fbRequestList\")) && p.byClass(y, \"beeperEnabled\"))) {\n                var z = this._parseID(y.id);\n                (z && this._markSeenCallback(z.requester, z.type));\n                g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                });\n                k.removeClass(y, \"jewelItemNew\");\n            }\n        ;\n            return true;\n        },\n        _handleScroll: function() {\n            var x = l.scry(this._scrollableWrap, \".uiMorePager\");\n            if ((!x || ((t(\"fbRequestsJewelManualPager\") && (x.length < 2))))) {\n                return\n            };\n            var y = x.pop();\n            if (y) {\n                var z = r.getElementPosition(y, \"viewport\").y;\n                if ((z > 0)) {\n                    k.addClass(p.byClass(this._scrollableWrap, \"uiScrollableArea\"), \"contentAfter\");\n                };\n                var aa = l.find(y, \"a\");\n                if (!aa) {\n                    return\n                };\n                var ba = r.getElementPosition(aa, \"viewport\").y;\n                if ((ba == this._lastLinkPosition)) {\n                    return\n                };\n                var ca = (r.getElementPosition(this._scrollableWrap, \"viewport\").y + r.getElementDimensions(this._scrollableWrap).y);\n                if ((((ba - 300) < ca) && (ba > 0))) {\n                    this._lastLinkPosition = ba;\n                    var da = aa.getAttribute(\"ajaxify\");\n                    if (da) {\n                        new h(da).setRelativeTo(aa).setStatusElement(p.byClass(aa, \"stat_elem\")).send();\n                    }\n                     else n.getInstance(\"jewel\").showMore();\n                ;\n                }\n            ;\n            }\n        ;\n        },\n        _addRequest: function(x, y) {\n            if (!y) {\n                return\n            };\n            var z = y.obj.from, aa = y.obj.suggester, ba = this._parseIDToInts(this._requestList[z]).type, ca = ((ba === 19) && !aa);\n            if ((!ca && ((ba || this.jewel.isOpen())))) {\n                return\n            };\n            if (t(\"fbRequestsJewelLoading\")) {\n                new h().setURI(\"/ajax/requests/loader/\").send();\n            }\n             else {\n                var da = this._onMarkupCallback.bind(this, z, !!aa), ea = {\n                    from: z\n                };\n                if (aa) {\n                    ea.suggester = aa;\n                };\n                new h().setURI(\"/ajax/friends/jewel/request_markup\").setData(ea).setHandler(da).send();\n            }\n        ;\n        },\n        _onMarkupCallback: function(x, y, z) {\n            var aa = z.getPayload();\n            if (!aa) {\n                return\n            };\n            var ba = this._requestList[x], ca = this._parseIDToInts(ba).type;\n            if (((ca === 19) && !y)) {\n                var da = (ba && t(ba));\n                (da && l.replace(da, aa.markup));\n            }\n             else {\n                var ea = l.scry(this.jewelFlyout, \".fbRequestList .uiList\")[0];\n                if (!ea) {\n                    return\n                };\n                l.prependContent(ea, aa.markup);\n                var fa = {\n                    jewel: \"requests\",\n                    count: ++this.countNew\n                };\n                g.inform(\"jewel/count-updated\", fa);\n                ++this._requestCount;\n                this._conditionShowEmptyMessage();\n            }\n        ;\n            this._requestList[x] = aa.item_id;\n        },\n        _removeOldRequest: function(x, y) {\n            if (((!y || this.jewel.isOpen()) || (t(\"fbRequestsJewelLoading\") !== null))) {\n                return\n            };\n            var z = this._requestList[y.obj.from], aa = (z && t(z));\n            if (aa) {\n                (k.hasClass(aa, \"jewelItemNew\") && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                }));\n                if (!k.hasClass(aa, \"jewelItemResponded\")) {\n                    l.remove(aa);\n                    delete this._requestList[y.obj.from];\n                    --this._requestCount;\n                    this._conditionShowEmptyMessage();\n                }\n            ;\n            }\n        ;\n        },\n        pageInCollapsedRequests: function() {\n            var x = t(\"fbRequestsJewelManualPager\");\n            if (x) {\n                var y = l.scry(x, \".uiMorePagerPrimary\")[0];\n                if ((y.style && (y.style.display != \"none\"))) {\n                    setTimeout(function() {\n                        y.click();\n                    }, 100);\n                };\n            }\n        ;\n        },\n        _markRead: function() {\n            this.jewel.markSeen();\n            this._clearNewItems();\n        },\n        _markSeenCallback: function(x, y) {\n            var z = l.scry(this.jewelFlyout, \"li\");\n            new i(\"/ajax/gigaboxx/endpoint/UpdateLastSeenTime.php\", {\n                folder: this.folder,\n                first_item: z[0].id\n            }).send();\n            new h().setURI(\"/ajax/friends/jewel/predicted_count_logging\").setData({\n                ego_predicted_count: this.egoPredictedCount,\n                pending_count: this.pendingCount,\n                unseen_timestamp: this.egoUnseenTimestamp,\n                action_context: this.actionContext,\n                should_log_ego_click: this.shouldLogEgoClick\n            }).send();\n            var aa = (((typeof x != \"undefined\") && (typeof y != \"undefined\")) ? {\n                requester: x,\n                type: y\n            } : {\n            });\n            (this.doNewMarkRead && new i(\"/ajax/requests/mark_read/\", aa).send());\n        },\n        _markSeenFromMessage: function(x, y) {\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"requests\",\n                count: 0\n            });\n        },\n        _removeRequest: function(x, y) {\n            var z = y.obj.item_id;\n            if (z) {\n                var aa = t(z), ba = (aa && k.hasClass(aa, \"jewelItemNew\"));\n                (aa ? l.remove(aa) : (ba && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })));\n            }\n        ;\n        },\n        _clearNewItems: function(x, y) {\n            l.scry(this.jewel.root, \"li.jewelItemNew\").forEach(function(z) {\n                k.removeClass(z, \"jewelItemNew\");\n            });\n        },\n        _updateCount: function(x, y) {\n            this.countNew = y.count;\n            k.conditionClass(this.jewelFlyout, \"beeperUnread\", (this.countNew > 0));\n            k.conditionClass(this.jewelFlyoutCase, \"showRequests\", (this.countNew > 0));\n            if (this.newCountSpan) {\n                var z = ((this.countNew == 1) ? v._(\"{num} NEW REQUEST\", {\n                    num: this.countNew\n                }) : v._(\"{num} NEW REQUESTS\", {\n                    num: this.countNew\n                }));\n                l.setContent(this.newCountSpan, z);\n            }\n        ;\n        },\n        _conditionShowEmptyMessage: function() {\n            l.scry(this.jewelFlyout, \"li.empty\").forEach(function(x) {\n                k.conditionShow(x, (this._requestCount <= 0));\n            }.bind(this));\n        },\n        _openHandler: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableArea\")[0];\n            if (t(\"fbRequestsJewelLoading\")) {\n                var y = Date.now();\n                if (((this.openTimestamp + 5000) < y)) {\n                    this.openTimestamp = y;\n                    new h().setURI(\"/ajax/requests/loader/\").setData({\n                        log_impressions: true\n                    }).send();\n                }\n            ;\n            }\n             else {\n                var z = Object.keys(this._requestList);\n                if ((z.length > 0)) {\n                    new h().setURI(\"/friends/requests/log_impressions\").setData({\n                        ids: z.join(\",\"),\n                        ref: \"jewel\"\n                    }).send();\n                };\n            }\n        ;\n            (x && q.poke(x));\n        }\n    });\n    e.exports = w;\n});\n__d(\"legacy:RequestsJewel\", [\"RequestsJewel\",], function(a, b, c, d) {\n    a.RequestsJewel = b(\"RequestsJewel\");\n}, 3);\n__d(\"JewelX\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"HTML\",\"Keys\",\"TabIsolation\",\"Toggler\",\"copyProperties\",\"emptyFunction\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"TabIsolation\"), o = b(\"Toggler\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"reportData\"), s = function(t, u) {\n        ((t && u) && this.init(t, u));\n    };\n    p(s, {\n        _instancesByName: {\n        },\n        _resizeListener: null\n    });\n    p(s.prototype, i, {\n        init: function(t, u) {\n            this.name = u.name;\n            this.root = t;\n            this.countNew = 0;\n            this.initialCount = 0;\n            this.escHandler = null;\n            s._instancesByName[this.name] = this;\n            var v = k.find(t, \".jewelFlyout\"), w = new n(v);\n            o.listen(\"show\", this.root, function(x) {\n                this._logFirstClick();\n                (this.hasNew() && this.markSeen());\n                this.reset();\n                this.inform(\"opened\");\n                h.inform(\"layer_shown\", {\n                    type: \"Jewel\"\n                });\n                w.enable();\n                this.setupEvents();\n            }.bind(this));\n            o.listen(\"hide\", this.root, function(x, y) {\n                (this.hasNew() && this.markSeen());\n                this.reset();\n                this.inform(\"closed\");\n                h.inform(\"layer_hidden\", {\n                    type: \"Jewel\"\n                });\n                w.disable();\n                this.removeEvents();\n            }.bind(this));\n            h.subscribe(\"jewel/count-updated\", function(x, y) {\n                ((y.jewel == this.name) && this.update(y));\n            }.bind(this));\n            h.subscribe(\"jewel/count-initial\", function(x, y) {\n                ((y.jewel == this.name) && this.setInitial(y));\n            }.bind(this));\n            h.subscribe(\"jewel/reset\", function(x, y) {\n                ((y.jewel == this.name) && this.reset());\n            }.bind(this));\n            s._resizeListener = (s._resizeListener || (function() {\n                var x = null;\n                return g.listen(window, \"resize\", function() {\n                    clearTimeout(x);\n                    x = h.inform.bind(h, \"jewel/resize\").defer(100, false);\n                });\n            })());\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        hasNew: function() {\n            return j.hasClass(this.root, \"hasNew\");\n        },\n        isOpen: function() {\n            return j.hasClass(this.root, \"openToggler\");\n        },\n        reset: function() {\n            j.removeClass(this.root, \"hasNew\");\n        },\n        setContent: function(t) {\n            var u = k.find(this.root, \"ul.jewelItemList\");\n            k.setContent(u, l(t));\n        },\n        update: function(t) {\n            this.countNew = t.count;\n            var u = k.find(this.root, \"span.jewelCount span\");\n            k.setContent(u, this.countNew);\n            var v = (isNaN(this.countNew) || (this.countNew > 0));\n            j.conditionClass(this.root, \"hasNew\", v);\n            if (v) {\n                var w = ((\"\" + this.countNew)).length;\n                j.conditionClass(this.root, \"hasCountSmall\", (w === 1));\n                j.conditionClass(this.root, \"hasCountMedium\", (w === 2));\n                j.conditionClass(this.root, \"hasCountLarge\", (w > 2));\n            }\n        ;\n            this.inform(\"updated\", t);\n        },\n        setInitial: function(t) {\n            this.initialCount = t;\n        },\n        setupEvents: function() {\n            this.escHandler = g.listen(document.documentElement, \"keydown\", function(t) {\n                if (((t.keyCode === m.ESC) && this.isOpen())) {\n                    o.hide(this.root);\n                };\n            }.bind(this));\n        },\n        removeEvents: function() {\n            if (this.escHandler) {\n                this.escHandler.remove();\n            };\n        },\n        markSeen: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: this.name,\n                count: 0\n            }, h.BEHAVIOR_STATE);\n            this.inform(\"marked-seen\");\n        },\n        _logFirstClick: function() {\n            this._logFirstClick = q;\n            r(\"jewel_click\", {\n                gt: {\n                    count: this.countNew,\n                    initial: this.initialCount,\n                    jewel: this.name\n                }\n            });\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryJewelCountControl\", [\"Arbiter\",\"DOM\",\"MercuryThreadlistConstants\",\"copyProperties\",\"shield\",\"tx\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"MercuryThreadlistConstants\"), j = b(\"copyProperties\"), k = b(\"shield\"), l = b(\"tx\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreadInformer\").get(), o = b(\"MercuryUnseenState\").get(), p, q, r, s = function(u) {\n        if ((u || r.isOpen())) {\n            o.markAsSeen();\n        };\n    }, t = function(u, v) {\n        p = u;\n        q = h.find(p, \"#mercurymessagesCountValue\");\n        r = v;\n        this.render();\n        m.subscribe(\"model-update-completed\", function(w, x) {\n            s(false);\n        });\n        n.subscribe(\"unseen-updated\", this.render.bind(this));\n        r.subscribe(\"marked-seen\", k(s, this, true));\n    };\n    j(t.prototype, {\n        render: function() {\n            var u = \"\";\n            if (o.exceedsMaxCount()) {\n                u = l._(\"{count}+\", {\n                    count: i.MAX_UNSEEN_COUNT\n                });\n            }\n             else u = o.getUnseenCount().toString();\n        ;\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"mercurymessages\",\n                count: u\n            }, g.BEHAVIOR_STATE);\n        }\n    });\n    e.exports = t;\n});\n__d(\"MercuryJewelThreadlistControl\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryChatUtils\",\"MercuryConfig\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"JSXDOM\",\"MercuryAPIArgsSource\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryOrderedThreadlist\",\"Parent\",\"MercuryJewelTemplates\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"Tooltip\",\"MercuryUnreadState\",\"copyProperties\",\"csx\",\"cx\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryChatUtils\"), j = b(\"MercuryConfig\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"JSLogger\"), o = b(\"JSXDOM\"), p = b(\"MercuryAPIArgsSource\"), q = b(\"MercuryThreadlistConstants\"), r = b(\"MessagingTag\"), s = b(\"MercuryOrderedThreadlist\").get(), t = b(\"Parent\"), u = b(\"MercuryJewelTemplates\"), v = b(\"MercuryThreadInformer\").get(), w = b(\"MercuryThreadMetadataRenderer\").get(), x = b(\"MercuryThreads\").get(), y = b(\"Tooltip\"), z = b(\"MercuryUnreadState\").get(), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"throttle\"), ea = b(\"tx\"), fa = n.create(\"mercury_jewel\");\n    function ga(na, oa) {\n        this._contentArea = (l.scry(na, \".scrollable\")[0] || na);\n        this._contentElement = l.find(this._contentArea, \".jewelContent\");\n        this._loadingElement = l.find(this._contentArea, \".jewelLoading\");\n        this._loadMoreButton = l.find(this._contentArea, \".-cx-PRIVATE-fbMercuryJewel__morebutton\");\n        this._loadMoreLink = l.find(this._contentArea, \"a.-cx-PRIVATE-fbMercuryJewel__morelink\");\n        this._currentFolder = r.INBOX;\n        this._jewelFolderLinks = [];\n        this._jewelFolderLinks[r.INBOX] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxfolder\");\n        this._jewelFolderLinks[r.OTHER] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherfolder\");\n        this._jewelFolderCounts = [];\n        this._jewelFolderCounts[r.INBOX] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxunread\");\n        this._jewelFolderCounts[r.OTHER] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherunread\");\n        la.bind(this)();\n        m.listen(this._jewelFolderLinks[r.INBOX], \"click\", ka.bind(this, r.INBOX));\n        m.listen(this._jewelFolderLinks[r.OTHER], \"click\", ka.bind(this, r.OTHER));\n        this._curCount = [];\n        this._curCount[r.INBOX] = (q.JEWEL_THREAD_COUNT + 1);\n        this._curCount[r.OTHER] = (q.JEWEL_THREAD_COUNT + 1);\n        this._isFolderLoaded = [];\n        this._isFolderLoaded[r.INBOX] = false;\n        this._isFolderLoaded[r.OTHER] = false;\n        this._folderIsLoading = [];\n        this._folderIsLoading[r.INBOX] = false;\n        this._folderIsLoading[r.OTHER] = false;\n        v.subscribe(\"threadlist-updated\", this.render.bind(this));\n        v.subscribe(\"unread-updated\", la.bind(this));\n        this.render();\n        fa.bump((\"opened_threadlist_\" + this._currentFolder));\n        m.listen(this._contentArea, \"scroll\", da(ha, 50, this));\n        m.listen(this._loadMoreLink, \"click\", this.renderMoreThreads.bind(this));\n    };\n    aa(ga, {\n        EVENT_THREADS_LOADED: \"threads-loaded\",\n        EVENT_THREADS_RENDERED: \"threads-rendered\"\n    });\n    aa(ga.prototype, h);\n    aa(ga.prototype, {\n        render: function() {\n            l.empty(this._contentElement);\n            k.show(this._loadingElement);\n            k.hide(this._loadMoreButton);\n            var na = l.create(\"div\");\n            l.appendContent(this._contentElement, na);\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, this._curCount[this._currentFolder], this._currentFolder, this.renderThreads.bind(this, na), true);\n        },\n        renderThreads: function(na, oa) {\n            this.inform(ga.EVENT_THREADS_LOADED);\n            if (oa.length) {\n                oa.forEach(function(pa) {\n                    var qa = u[\":fb:mercury:jewel:threadlist-row\"].build();\n                    x.getThreadMeta(pa, function(ra) {\n                        w.renderCoreThreadlist(ra, qa, this.renderSingleThread.bind(this), {\n                            show_unread_count: true\n                        });\n                    }.bind(this));\n                    l.appendContent(na, qa.getRoot());\n                }.bind(this));\n            }\n             else l.setContent(this._contentElement, this.renderEmptyThreadlist());\n        ;\n            k.hide(this._loadingElement);\n            k.conditionShow(this._loadMoreButton, !this._isFolderLoaded[this._currentFolder]);\n            this.inform(ga.EVENT_THREADS_RENDERED);\n        },\n        renderSingleThread: function(na, oa) {\n            var pa = (oa.unread_count > 0);\n            if (pa) {\n                k.addClass(na.getRoot(), \"jewelItemNew\");\n            };\n            if (j.MessagesJewelToggleReadGK) {\n                var qa = o.div({\n                    className: \"x_div\"\n                }), ra = o.div({\n                    className: \"-cx-PRIVATE-fbReadToggle__active\"\n                }), sa = \"Mark as Unread\";\n                if (pa) {\n                    sa = \"Mark as Read\";\n                };\n                y.set(ra, sa, \"above\", \"right\");\n                m.listen(ra, \"click\", function(event) {\n                    x.changeThreadReadStatus(oa.thread_id, (oa.unread_count > 0));\n                    return false;\n                });\n                qa.appendChild(ra);\n                na.getNode(\"link\").appendChild(qa);\n            }\n        ;\n            if ((j.MessagesJewelOpenInChat && i.canOpenChatTab(oa))) {\n                m.listen(na.getRoot(), \"click\", function(event) {\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: oa.thread_id\n                    });\n                });\n            }\n             else w.renderTitanLink(oa.thread_id, na.getNode(\"link\"), null, this._currentFolder);\n        ;\n            m.listen(na.getRoot(), \"mouseover\", function(event) {\n                var ta = na.getRoot();\n                if (!t.byClass(ta, \"notifNegativeBase\")) {\n                    k.addClass(ta, \"selected\");\n                };\n            });\n            m.listen(na.getRoot(), \"mouseout\", function(event) {\n                k.removeClass(na.getRoot(), \"selected\");\n            });\n        },\n        renderMoreThreads: function() {\n            k.addClass(this._loadMoreButton, \"async_saving\");\n            this._folderIsLoading[this._currentFolder] = true;\n            var na = (this._curCount[this._currentFolder] + q.JEWEL_MORE_COUNT);\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, (na + 1), this._currentFolder, ja.bind(this, na, this._currentFolder), true, p.JEWEL);\n        },\n        renderEmptyThreadlist: function() {\n            return l.create(\"li\", {\n                className: \"empty\"\n            }, \"No messages\");\n        }\n    });\n    function ha() {\n        if (((!this._isFolderLoaded[this._currentFolder] && !this._folderIsLoading[this._currentFolder]) && ia.bind(this)())) {\n            this.renderMoreThreads();\n        };\n    };\n    function ia() {\n        return ((this._contentArea.scrollTop + this._contentArea.clientHeight) >= (this._contentArea.scrollHeight - 1));\n    };\n    function ja(na, oa, pa) {\n        this._curCount[oa] = na;\n        if ((!this._isFolderLoaded[oa] && (pa.length < (this._curCount[oa] + 1)))) {\n            this._isFolderLoaded[oa] = true;\n        };\n        this._folderIsLoading[oa] = false;\n        k.removeClass(this._loadMoreButton, \"async_saving\");\n        this.render();\n    };\n    function ka(na) {\n        if ((this._currentFolder != na)) {\n            fa.bump((\"opened_threadlist_\" + na));\n            k.addClass(this._jewelFolderLinks[na], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            k.removeClass(this._jewelFolderLinks[this._currentFolder], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            this._currentFolder = na;\n            this.render();\n        }\n    ;\n    };\n    function la() {\n        ma.bind(this)(r.INBOX);\n        ma.bind(this)(r.OTHER);\n    };\n    function ma(na) {\n        var oa;\n        if (z.exceedsMaxCount(na)) {\n            oa = q.MAX_UNREAD_COUNT;\n        }\n         else oa = z.getUnreadCount(na);\n    ;\n        var pa = this._jewelFolderCounts[na];\n        if ((oa > 0)) {\n            if ((oa == q.MAX_UNREAD_COUNT)) {\n                oa += \"+\";\n            };\n            l.setContent(pa, ea._(\"({unread_count})\", {\n                unread_count: oa\n            }));\n        }\n         else l.setContent(pa, \"\");\n    ;\n    };\n    e.exports = ga;\n});\n__d(\"MercuryJewel\", [\"MercuryChannelHandler\",\"MercuryJewelCountControl\",\"DOM\",\"MercuryJewelThreadlistControl\",\"MercuryServerRequests\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"MercuryChannelHandler\");\n    var g = b(\"MercuryJewelCountControl\"), h = b(\"DOM\"), i = b(\"MercuryJewelThreadlistControl\"), j = b(\"MercuryServerRequests\").get(), k = b(\"userAction\"), l = false;\n    function m(q, r, s, t) {\n        j.handleUpdate(t);\n        var u = new g(r, s), v = h.find(q, \"#MercuryJewelThreadList\");\n        if ((s.getRoot() && s.isOpen())) {\n            n.call(this, v, q);\n        }\n         else s.subscribe(\"opened\", n.bind(this, v, q));\n    ;\n    };\n    e.exports = m;\n    function n(q, r) {\n        this._ua = k(\"messages\").uai(\"click\", \"jewel\");\n        this._listenForLoad = this._listenForRender = true;\n        if (!l) {\n            var s = new i(q, r);\n            s.subscribe(i.EVENT_THREADS_LOADED, o.bind(this));\n            s.subscribe(i.EVENT_THREADS_RENDERED, p.bind(this));\n            l = true;\n        }\n    ;\n    };\n    function o() {\n        if (this._listenForLoad) {\n            this._ua.add_event(\"loaded\");\n            this._listenForLoad = false;\n        }\n    ;\n    };\n    function p() {\n        if (this._listenForRender) {\n            this._ua.add_event(\"rendered\");\n            this._listenForRender = false;\n        }\n    ;\n    };\n});\n__d(\"MessagingEvents\", [\"Arbiter\",\"ChannelConstants\",\"arrayContains\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"isEmpty\"), l = {\n    }, m = new g();\n    function n(o) {\n        if (!k(l)) {\n            return\n        };\n        for (var p in o) {\n            m.inform((\"count/\" + p), o[p]);;\n        };\n    };\n    m.subscribe(\"mark-as-read\", function(o, p) {\n        (((p.tids || p.chat_ids) || [])).forEach(function(q) {\n            q = (\"\" + q);\n            if (!((q in l))) {\n                l[q] = true;\n                var r = function() {\n                    m.unsubscribe(s);\n                    clearTimeout(t);\n                    delete l[q];\n                }, s = m.subscribe(\"read\", function(u, v) {\n                    if ((i(((v.tids || [])), q) || i(((v.chat_ids || [])), q))) {\n                        r();\n                    };\n                }), t = r.defer(60000);\n            }\n        ;\n        });\n    });\n    g.subscribe(h.getArbiterType(\"messaging\"), function(o, p) {\n        var q = j({\n        }, p.obj), event = (q.event || \"\");\n        delete q.type;\n        delete q.event;\n        m.inform(event, q);\n        if ((\"unread_counts\" in q)) {\n            var r = q.unread_counts;\n            n({\n                unread: r.inbox,\n                other_unseen: r.other\n            });\n        }\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"inbox\"), function(o, p) {\n        var q = j(p.obj);\n        delete q.type;\n        n(q);\n    });\n    a.MessagingEvents = e.exports = m;\n}, 3);\n__d(\"TitanLeftNav\", [\"CounterDisplay\",\"MessagingEvents\",], function(a, b, c, d, e, f) {\n    var g = b(\"CounterDisplay\"), h = b(\"MessagingEvents\"), i = {\n        initialize: function() {\n            h.subscribe(\"count/other_unseen\", function(j, k) {\n                g.setCount(\"other_unseen\", k);\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"AccessibleMenu\", [\"Event\",\"CSS\",\"DOM\",\"Keys\",\"TabbableElements\",\"Toggler\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"Toggler\"), m, n, o;\n    function p() {\n        var x = i.scry(m, \"a[rel=\\\"toggle\\\"]\")[0];\n        (x && x.focus());\n        l.getInstance(m).hide();\n    };\n    function q(x) {\n        if (!x) {\n            return false\n        };\n        h.removeClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"false\");\n    };\n    function r(x) {\n        if (!x) {\n            return false\n        };\n        h.addClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"true\");\n        var y = k.find(x);\n        if (y[0]) {\n            y[0].focus();\n        };\n    };\n    function s(x) {\n        var y = i.scry(m, \".selected\")[0], z = (n.indexOf(y) + x), aa = n[z];\n        if (!aa) {\n            return false\n        };\n        q(y);\n        r(aa);\n    };\n    function t(x) {\n        if ((!l.isShown() || (l.getActive() !== m))) {\n            return true\n        };\n        var y = g.getKeyCode(x);\n        switch (y) {\n          case j.TAB:\n            s((x.shiftKey ? -1 : 1));\n            g.prevent(x);\n            break;\n          case j.ESC:\n            p();\n            g.prevent(x);\n            break;\n          case j.UP:\n        \n          case j.DOWN:\n            s(((y === j.UP) ? -1 : 1));\n            g.prevent(x);\n            break;\n        };\n    };\n    function u(x, y) {\n        m = y.getActive();\n        n = i.scry(m, \"[role=\\\"menuitem\\\"]\");\n        if (!o) {\n            o = g.listen(document.documentElement, \"keydown\", t);\n        };\n    };\n    function v() {\n        if ((l.getActive() == m)) {\n            q(i.scry(m, \".selected\")[0]);\n        };\n    };\n    var w = {\n        init: function(x) {\n            l.listen(\"show\", x, u);\n            l.listen(\"hide\", x, v);\n        }\n    };\n    e.exports = w;\n});\n__d(\"UserNoOp\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\"), i = function() {\n    \n    };\n    g(i.prototype, {\n        add_event: h.thatReturnsThis,\n        add_data: h.thatReturnsThis,\n        uai: h.thatReturnsThis,\n        uai_fallback: h.thatReturnsThis\n    });\n    e.exports = i;\n});\n__d(\"isEmail\", [], function(a, b, c, d, e, f) {\n    var g = /^[\\w!#\\$%&'\\*\\+\\/\\=\\?\\^`\\{\\|\\}~\\-]+(:?\\.[\\w!#\\$%&`\\*\\+\\/\\=\\?\\^`\\{\\|\\}~\\-]+)*@(?:[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?$/i;\n    function h(i) {\n        return g.test(i);\n    };\n    e.exports = h;\n});\n__d(\"NegativeNotif\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Parent\",\"Tooltip\",\"NotifXList\",\"$\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"Event\"), m = b(\"Parent\"), n = b(\"Tooltip\"), o = b(\"NotifXList\"), p = b(\"$\"), q = b(\"clickRefAction\"), r = b(\"copyProperties\"), s = b(\"userAction\");\n    function t(u, v) {\n        r(this, v);\n        this.owner = u;\n        this.xLink = k.find(this.obj, \".notif_x\");\n        this.confirmingMsg = k.find(this.obj, \".confirmingMsg\");\n        this.mainLink = k.find(this.obj, \".notifMainLink\");\n        this.userXClicked = false;\n        this.userUnsubscribed = false;\n        l.listen(this.xLink, \"click\", this.xClick.bind(this));\n        if ((i.hasClass(this.obj, \"first_receipt\") && i.hasClass(p(\"jewelContainer\"), \"notifGentleAppReceipt\"))) {\n            this.gentleFirstReceiptHoverEventHandler = l.listen(this.obj, \"mouseover\", this.gentleFirstReceiptNotifHover.bind(this));\n        };\n    };\n    r(t.prototype, {\n        FADE_AWAY_DURATION: 2500,\n        X_OUT_DURATION: 100,\n        X_OUT_DURATION_SHORT: 2,\n        GENTLE_FRUI_MIN_HOVER_DURATION: 500,\n        GENTLE_FRUI_FADE_DURATION_FAST: 200,\n        GENTLE_FRUI_FADE_DURATION_SLOW: 2500,\n        GENTLE_FRUI_DELAY_FADE_TIME: 60000,\n        xClick: function(event) {\n            this._activateX();\n            var u = this.xLink.getAttribute(\"data-gt\"), v = (u ? {\n                gt: JSON.parse(u)\n            } : {\n            });\n            s(\"xbutton\", this.xLink, event).uai(\"click\");\n            q(\"click\", this.xLink, event, null, v);\n            return false;\n        },\n        gentleFirstReceiptNotifHover: function(event) {\n            event.stop();\n            var u = k.find(this.obj, \".first_receipt_no_button\"), v = j.get(u, \"notif_fr_prompt\");\n            n.set(u, v, \"above\", \"center\");\n            n.show(u);\n            this._gentleFirstReceiptTooltipFadeIn();\n            if (!this.gentleFirstReceiptUnhoverEventHandler) {\n                this.hoverTime = new Date();\n                this.gentleFirstReceiptUnhoverEventHandler = l.listen(document.documentElement, \"mouseover\", this.gentleFirstReceiptNotifUnhover.bind(this));\n            }\n        ;\n            if (!this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler = l.listen(u, \"click\", this.gentleFirstReceiptNoClick.bind(this));\n            };\n        },\n        gentleFirstReceiptNotifUnhover: function(event) {\n            if ((m.byClass(event.getTarget(), \"uiContextualLayer\") || m.byClass(event.getTarget(), \"uiScrollableAreaTrack\"))) {\n                return false\n            };\n            var u = new Date();\n            if ((this.hoverTime && ((u - this.hoverTime) < this.GENTLE_FRUI_MIN_HOVER_DURATION))) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n                this.gentleFirstReceiptUnhoverEventHandler = null;\n                this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n                return;\n            }\n        ;\n            this._removeGentleFirstReceiptListeners();\n            this._gentleFirstReceiptTooltipFadeAway();\n            this._gentleFirstReceiptXButtonFadeAway();\n            var v = this;\n            setTimeout(function() {\n                v._gentleFirstReceiptUIFadeAway();\n            }, this.GENTLE_FRUI_DELAY_FADE_TIME);\n            this._sendFirstReceiptYesToServer();\n        },\n        gentleFirstReceiptNoClick: function(event) {\n            this._removeGentleFirstReceiptListeners();\n        },\n        restore: function() {\n            if (o.newNotifExist(this.id)) {\n                o.resumeInsert(this.id);\n            }\n             else o.removeNotif(this.id);\n        ;\n            this._confirmingMsgFadeAway(this.confirmingMsg);\n            this._notifMainLinkShowUp(this.mainLink);\n            this._buttonShowUp(this.xLink);\n            this._adjustContainer(this.obj);\n        },\n        reset: function() {\n            if ((this.userXClicked && !this.userUnsubscribed)) {\n                this.userXClicked = false;\n                this.restore();\n            }\n        ;\n        },\n        onTurnedOff: function() {\n            this.userUnsubscribed = true;\n            i.hide(this.confirmingMsg);\n            this._notifMainLinkShowUp(k.find(this.obj, \".confirmedMsg\"));\n            this._adjustContainer(this.obj);\n        },\n        onUndid: function() {\n            this.userXClicked = false;\n            this.userUnsubscribed = false;\n            this.restore();\n            i.show(this.confirmingMsg);\n            this._notifMainLinkFadeAway(k.find(this.obj, \".confirmedMsg\"));\n            k.remove(k.find(this.obj, \".confirmedMsg\"));\n        },\n        onMarkedSpam: function() {\n            k.remove(k.find(this.obj, \".confirmedMsg\"));\n            this._fadeAway(k.find(this.obj, \".spamMsg\"));\n        },\n        onFirstReceiptYes: function() {\n            this._hideFirstReceiptDiv();\n            this._fadeAway(k.find(this.obj, \".firstConfirmedMsg\"));\n        },\n        onFirstReceiptNo: function() {\n            this._hideFirstReceiptDiv();\n            i.hide(this.confirmingMsg);\n            this._activateX();\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"turn_off\",\n                notification_id: this.id\n            }).send();\n        },\n        _sendFirstReceiptYesToServer: function() {\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"first_receipt_yes\",\n                notification_id: this.id\n            }).send();\n        },\n        _gentleFirstReceiptTooltipFadeIn: function() {\n            if (this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return\n            };\n            var u = k.find(document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\");\n            new g(u).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = true;\n        },\n        _gentleFirstReceiptTooltipFadeAway: function() {\n            if (!this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return\n            };\n            var u = k.find(document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\"), v = m.byClass(u, \"uiLayer\"), w = v.cloneNode(true);\n            k.insertAfter(v, w);\n            new g(w).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).ondone(function() {\n                k.remove(w);\n            }).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n        },\n        _gentleFirstReceiptXButtonFadeAway: function() {\n            var u = k.find(this.obj, \".first_receipt_no_button\");\n            new g(u).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).hide().go();\n            i.addClass(this.obj, \"show_original_x\");\n        },\n        _gentleFirstReceiptUIFadeAway: function() {\n            var u = this.obj;\n            this.new_label = k.find(this.obj, \".notif_new_label\");\n            new g(this.new_label).to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).ondone(function() {\n                i.removeClass(u, \"first_receipt\");\n            }).go();\n            if (!i.hasClass(this.obj, \"jewelItemNew\")) {\n                new g(this.obj).from(\"backgroundColor\", \"#ECEFF5\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).go();\n            };\n        },\n        _removeGentleFirstReceiptListeners: function() {\n            if (this.gentleFirstReceiptHoverEventHandler) {\n                this.gentleFirstReceiptHoverEventHandler.remove();\n            };\n            if (this.gentleFirstReceiptUnhoverEventHandler) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n            };\n            if (this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler.remove();\n            };\n        },\n        _activateX: function() {\n            i.addClass(this.obj, \"forPushSafety\");\n            this.userXClicked = true;\n            o.userXClick(this.id);\n            this._notifMainLinkFadeAway(this.mainLink);\n            this._buttonFadeAway(this.xLink);\n            if (i.shown(this.confirmingMsg)) {\n                this._confirmingMsgShowUp(this.confirmingMsg);\n            };\n            this._adjustContainer(this.obj);\n        },\n        _hideFirstReceiptDiv: function() {\n            i.removeClass(this.obj, \"first_receipt\");\n            i.hide(k.find(this.obj, \".first_receipt_div\"));\n        },\n        _fadeAway: function(u) {\n            new g(u).from(\"backgroundColor\", \"#FFF9D7\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.FADE_AWAY_DURATION).checkpoint().to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION).go();\n        },\n        _adjustContainer: function(u) {\n            new g(u).by(\"height\", \"0px\").duration(this.X_OUT_DURATION).checkpoint().by(\"height\", \"0px\").duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"height\", \"auto\").duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"4px\").to(\"paddingBottom\", \"4px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _confirmingMsgShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"10px\").to(\"paddingBottom\", \"10px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _confirmingMsgFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _buttonShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _buttonFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        }\n    });\n    e.exports = t;\n});\n__d(\"NotificationCounter\", [\"Arbiter\",\"DocumentTitle\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = {\n        messages: 0,\n        notifications: 0,\n        requests: 0\n    }, k = {\n        init: function(l) {\n            g.subscribe(\"update_title\", this._handleUpdate.bind(this));\n            g.subscribe(\"jewel/count-updated\", this._handleCountUpdate.bind(this));\n        },\n        getCount: function() {\n            var l = 0;\n            for (var m in j) {\n                var n = Number(j[m]);\n                if (((typeof j[m] == \"string\") && isNaN(n))) {\n                    return j[m]\n                };\n                if ((isNaN(n) || (n < 0))) {\n                    i.create(\"jewels\").error(\"bad_count\", {\n                        jewel: m,\n                        count: j[m]\n                    });\n                    continue;\n                }\n            ;\n                l += n;\n            };\n            return l;\n        },\n        updateTitle: function() {\n            var l = this.getCount(), m = h.get();\n            m = (l ? (((\"(\" + l) + \") \") + m) : m);\n            h.set(m, true);\n        },\n        _handleCountUpdate: function(l, m) {\n            j[m.jewel] = m.count;\n            this.updateTitle();\n        },\n        _handleUpdate: function(l, m) {\n            this.updateTitle();\n        }\n    };\n    e.exports = k;\n});\n__d(\"NotificationList\", [\"Animation\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DoublyLinkedListMap\",\"HTML\",\"NotificationURI\",\"Tooltip\",\"Event\",\"$\",\"copyProperties\",\"cx\",\"csx\",\"ge\",\"isEmpty\",\"tx\",\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DoublyLinkedListMap\"), l = b(\"HTML\"), m = b(\"NotificationURI\"), n = b(\"Tooltip\"), o = b(\"Event\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"ge\"), u = b(\"isEmpty\"), v = b(\"tx\"), w = b(\"hasArrayNature\"), x = \"0\", y = \"1\", z = \"2\";\n    function aa(da) {\n        return ((da == y) || (da == z));\n    };\n    function ba(da) {\n        return (da == y);\n    };\n    function ca(da, ea) {\n        this._list = new k();\n        this._filter_func = null;\n        this.unseenCount = 0;\n        this.contentRoot = da;\n        this.noItemsElement = null;\n        this.ITEM_TAG = \"li\";\n        this.ITEM_CLASS = \"notification\";\n        this.NO_ITEMS_ID = \"jewelNoNotifications\";\n        this.NO_ITEMS_CLASS = \"empty\";\n        this.compare = (ea.compare || this.compare);\n        this.shouldBlockAnimation = (ea.shouldBlockAnimation || null);\n        this.unseenVsUnread = (ea.unseenVsUnread || false);\n        this.markReadSignalServer = ea.markReadSignalServer;\n        this.animations = {\n        };\n    };\n    q(ca, {\n        ITEM_UNREAD_CLASS: \"jewelItemNew\",\n        MARK_READ_TYPE: \"mark_read\",\n        UNREAD_COUNT_CHANGE_TYPE: \"unread_count_change\",\n        INSERTION_TYPE: \"insert\",\n        REMOVAL_TYPE: \"remove\",\n        getIdFromDom: function(da) {\n            return da.getAttribute(\"id\").replace(\"notification_\", \"\");\n        },\n        localizeUrls: function(da) {\n            j.scry(da, \"a\").forEach(function(ea) {\n                ea.href = m.localize(ea.href);\n            });\n        }\n    });\n    q(ca.prototype, h, {\n        FADE_DURATION: 250,\n        RESIZE_DURATION: 200,\n        _getField: function(da, ea) {\n            var fa = this._list.get(da);\n            return (fa && fa[ea]);\n        },\n        getDomObj: function(da) {\n            return this._getField(da, \"obj\");\n        },\n        fromDom: function() {\n            var da = ((this.ITEM_TAG + \".\") + this.ITEM_CLASS), ea = j.scry(this.contentRoot, da);\n            for (var fa = 0; (fa < ea.length); ++fa) {\n                var ga = ea[fa], ha = ca.getIdFromDom(ga);\n                this.insert(ha, ga.getAttribute(\"data-notiftime\"), null);\n            };\n        },\n        compare: function(da, ea) {\n            return ((da.time < ea.time) || (((da.time === ea.time) && (da.id < ea.id))));\n        },\n        insert: function(da, ea, fa, ga, ha, ia) {\n            var ja = y, ka = 0, la = this._list.exists(da), ma = (ia && this._list.exists(ia)), na = null, oa;\n            if ((la || ma)) {\n                if (!((ga && fa))) {\n                    return false;\n                }\n                 else {\n                    if (this._filter_func) {\n                        oa = {\n                            notif_id: da,\n                            notif_time: ea,\n                            notif_markup: fa,\n                            replace: ga,\n                            ignoreUnread: ha,\n                            notif_alt_id: ia\n                        };\n                        if (this._filter_func(oa)) {\n                            return false\n                        };\n                    }\n                ;\n                    ja = this._getField(da, \"readness\");\n                    ka = this._getField(da, \"time\");\n                    if ((ka > ea)) {\n                        return false\n                    };\n                    na = (la ? da : ia);\n                    this._remove(na);\n                }\n            \n            };\n            var pa = (((fa && l(fa).getRootNode())) || p((\"notification_\" + da))), qa = Math.max(ea, ka), ra = pa.getAttribute(\"data-readness\");\n            if ((!this.unseenVsUnread && (z == ra))) {\n                ra = x;\n            };\n            oa = {\n                id: da,\n                obj: pa,\n                time: qa,\n                readness: ra,\n                app_id: pa.getAttribute(\"data-appid\")\n            };\n            this._insert(oa);\n            this._setUpReadStateToggle(da, pa);\n            ca.localizeUrls(pa);\n            (this.noItemsElement && i.hide(this.noItemsElement));\n            if (ba(ra)) {\n                ((ha && !aa(ja)) && this.markRead([da,]));\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n            var sa = ((!na || (ka < qa)) || (((ra && !ja) && !ha)));\n            this.inform(ca.INSERTION_TYPE, {\n                id: da,\n                is_new: sa,\n                obj: pa,\n                replaced_id: na,\n                time: qa\n            });\n            return true;\n        },\n        _setReadStateToggleReadness: function(da, ea) {\n            var fa;\n            if (ea) {\n                fa = (this.unseenVsUnread ? \"Mark as Read\" : \"Unread\");\n            }\n             else fa = \"Read\";\n        ;\n            if (!((ea && this.unseenVsUnread))) {\n                i.removeClass(da, \"-cx-PRIVATE-fbReadToggle__active\");\n                i.addClass(da, \"-cx-PRIVATE-fbReadToggle__inactive\");\n            }\n        ;\n            n.set(da, fa, \"above\", \"center\");\n        },\n        _setUpReadStateToggle: function(da, ea) {\n            var fa = this.isUnreadId(da), ga = j.scry(ea, \".-cx-PRIVATE-fbReadToggle__active\")[0];\n            if (!ga) {\n                return\n            };\n            this._setReadStateToggleReadness(ga, fa);\n            var ha = function(event) {\n                if ((this.unseenVsUnread && this.isUnreadId(da))) {\n                    this.markReadSignalServer([da,]);\n                };\n                o.kill(event);\n                return false;\n            };\n            o.listen(ga, \"click\", ha.bind(this));\n        },\n        showNoNotifications: function() {\n            if ((null == this.noItemsElement)) {\n                this.noItemsElement = t(this.NO_ITEMS_ID);\n            };\n            if ((null == this.noItemsElement)) {\n                this.noItemsElement = j.create(this.ITEM_TAG, {\n                    id: this.NO_ITEMS_ID,\n                    className: this.NO_ITEMS_CLASS\n                }, \"No new notifications\");\n                j.appendContent(this.contentRoot, this.noItemsElement);\n            }\n        ;\n            i.show(this.noItemsElement);\n        },\n        _insert: function(da) {\n            this._list.remove(da.id);\n            var ea = null;\n            this._list.find(function(ga) {\n                var ha = this.compare(ga, da);\n                (!ha && (ea = ga.id));\n                return ha;\n            }.bind(this));\n            var fa = this.getDomObj(ea);\n            if (fa) {\n                this._list.insertAfter(da.id, da, ea);\n                j.insertAfter(fa, da.obj);\n            }\n             else {\n                this._list.prepend(da.id, da);\n                j.prependContent(this.contentRoot, da.obj);\n            }\n        ;\n        },\n        _remove: function(da) {\n            var ea = this._getField(da, \"obj\");\n            if (!ea) {\n                return false\n            };\n            this.inform(ca.REMOVAL_TYPE, {\n                id: da\n            });\n            this._list.remove(da);\n            j.remove(ea);\n            (this.isEmpty() && this.showNoNotifications());\n            return true;\n        },\n        getUnreadIds: function() {\n            return this._list.reduce(function(da, ea) {\n                (aa(da.readness) && ea.push(da.id));\n                return ea;\n            }, []);\n        },\n        getUnseenIds: function() {\n            return this._list.reduce(function(da, ea) {\n                (ba(da.readness) && ea.push(da.id));\n                return ea;\n            }, []);\n        },\n        getIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ea.push(da.id);\n                return ea;\n            }, []);\n        },\n        isUnreadId: function(da) {\n            var ea = this.getDomObj(da);\n            return (aa(this._getField(da, \"readness\")) || ((ea && i.hasClass(ea, ca.ITEM_UNREAD_CLASS))));\n        },\n        isUnseenId: function(da) {\n            return ba(this._getField(da, \"readness\"));\n        },\n        markRead: function(da, ea) {\n            da = (da ? da.filter(this.isUnreadId.bind(this)) : this.getUnreadIds());\n            var fa = false;\n            for (var ga = 0; (ga < da.length); ga++) {\n                var ha = this._list.get(da[ga]);\n                if (ha) {\n                    if (this._setReadness(da[ga], x)) {\n                        fa = true;\n                    };\n                    if (ea) {\n                        this._markReadInDom(da[ga], ha.obj);\n                    }\n                     else this.animateMarkRead(ha.obj);\n                ;\n                }\n            ;\n            };\n            if (fa) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        },\n        markSeen: function(da) {\n            if (!w(da)) {\n                return\n            };\n            if (!this.unseenVsUnread) {\n                this.markRead(da);\n                return;\n            }\n        ;\n            da = da.filter(this.isUnseenId.bind(this));\n            var ea = false;\n            for (var fa = 0; (fa < da.length); fa++) {\n                if (this._setReadness(da[fa], z)) {\n                    ea = true;\n                };\n            };\n            if (ea) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        },\n        _setReadness: function(da, ea) {\n            var fa = this._list.get(da);\n            if ((!fa || (fa.readness == ea))) {\n                return false\n            };\n            if (((fa.readness == x) && (ea == z))) {\n                return false\n            };\n            fa.readness = ea;\n            fa.obj.setAttribute(\"data-readness\", ea);\n            return true;\n        },\n        _markReadInDom: function(da, ea) {\n            if (!this.isUnreadId(da)) {\n                return\n            };\n            var fa = p(ea);\n            if (fa) {\n                this.stopAnimation(da);\n                i.removeClass(fa, ca.ITEM_UNREAD_CLASS);\n                var ga = j.scry(fa, \".read_toggle\")[0];\n                (ga && this._setReadStateToggleReadness(ga, false));\n            }\n        ;\n        },\n        animateMarkRead: function(da) {\n            if (!i.hasClass(da, ca.ITEM_UNREAD_CLASS)) {\n                return\n            };\n            var ea = ca.getIdFromDom(da), fa = this._markReadInDom.bind(this, ea, da);\n            if (i.hasClass(da, \"fbJewelBeep\")) {\n                fa();\n                return;\n            }\n        ;\n            if ((this.shouldBlockAnimation && this.shouldBlockAnimation(da))) {\n                return\n            };\n            fa.defer(10000);\n        },\n        stopAnimation: function(da) {\n            ((da in this.animations) && this.animations[da].stop());\n            delete this.animations[da];\n            return true;\n        },\n        insertMany: function(da, ea) {\n            if (((\"object\" == typeof da) && !u(da))) {\n                for (var fa in da) {\n                    var ga = da[fa];\n                    this.insert(fa, ga.time, ga.markup, true, ea, (ga.alt_id || null));\n                };\n                (this.noItemsElement && i.hide(this.noItemsElement));\n            }\n             else (this.isEmpty() && this.showNoNotifications());\n        ;\n        },\n        isEmpty: function() {\n            return this._list.isEmpty();\n        },\n        getEarliestNotifTime: function() {\n            return (this._list.isEmpty() ? 0 : Math.min.apply(null, this.getIds().map(function(da) {\n                return this._getField(da, \"time\");\n            }.bind(this))));\n        },\n        setFilterFn: function(da) {\n            this._filter_func = da;\n        },\n        toggleNotifsSimilarTo: function(da, ea, fa) {\n            var ga = this._getField(da, \"app_id\");\n            if (ga) {\n                var ha = this.getIds();\n                for (var ia = 0; (ia < ha.length); ++ia) {\n                    if ((ga == this._getField(ha[ia], \"app_id\"))) {\n                        var ja = this.getDomObj(ha[ia]);\n                        if ((da != ha[ia])) {\n                            (ea ? this._hideWithAnimation(ja) : this._showWithAnimation(ja));\n                        };\n                        var ka = j.scry(ja, \".first_receipt_div\");\n                        if ((ka.length == 1)) {\n                            if (fa) {\n                                i.hide(ka[0]);\n                                i.removeClass(ja, \"first_receipt\");\n                            }\n                             else {\n                                i.show(ka[0]);\n                                i.addClass(ja, \"first_receipt\");\n                            }\n                        \n                        };\n                    }\n                ;\n                };\n            }\n        ;\n        },\n        _hideWithAnimation: function(da) {\n            new g(da).to(\"opacity\", \"0\").blind().duration(this.FADE_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.RESIZE_DURATION).go();\n        },\n        _showWithAnimation: function(da) {\n            new g(da).to(\"height\", \"auto\").to(\"paddingTop\", \"auto\").to(\"paddingBottom\", \"auto\").blind().show().duration(this.RESIZE_DURATION).checkpoint().to(\"opacity\", \"1\").blind().duration(this.FADE_DURATION).go();\n        }\n    });\n    e.exports = ca;\n});\n__d(\"Notifications\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Env\",\"Event\",\"JSLogger\",\"NegativeNotif\",\"NotificationCounter\",\"NotificationList\",\"NotifXList\",\"Parent\",\"Poller\",\"ScrollableArea\",\"Style\",\"SystemEvents\",\"Toggler\",\"URI\",\"UserActivity\",\"UserNoOp\",\"Vector\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"hasArrayNature\",\"isEmpty\",\"shield\",\"throttle\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncSignal\"), k = b(\"Bootloader\"), l = b(\"ChannelConstants\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Env\"), p = b(\"Event\"), q = b(\"JSLogger\"), r = b(\"NegativeNotif\"), s = b(\"NotificationCounter\"), t = b(\"NotificationList\"), u = b(\"NotifXList\"), v = b(\"Parent\"), w = b(\"Poller\"), x = b(\"ScrollableArea\"), y = b(\"Style\"), z = b(\"SystemEvents\"), aa = b(\"Toggler\"), ba = b(\"URI\"), ca = b(\"UserActivity\"), da = b(\"UserNoOp\"), ea = b(\"Vector\"), fa = b(\"$\"), ga = b(\"copyProperties\"), ha = b(\"emptyFunction\"), ia = b(\"ge\"), ja = b(\"hasArrayNature\"), ka = b(\"isEmpty\"), la = b(\"shield\"), ma = b(\"throttle\"), na = b(\"userAction\");\n    function oa(pa) {\n        this.updateTime = (pa.updateTime || Date.now());\n        this.update_period = (pa.updatePeriod || 60000);\n        this.latest_notif_time = (pa.latestNotif || 0);\n        this.latest_read_notif_time = (pa.latestReadNotif || 0);\n        this.cache_version = (pa.cacheVersion || 0);\n        this.notifReceivedType = (pa.notifReceivedType || \"notification\");\n        this.wrapperID = (pa.wrapperID || \"notificationsWrapper\");\n        this.contentID = (pa.contentID || \"jewelNotifs\");\n        this.shouldLogImpressions = (pa.shouldLogImpressions || false);\n        this.allowDesktopNotifications = (pa.allowDesktopNotifications || false);\n        this.logAutoShutOffImpression = true;\n        this.useInfiniteScroll = (pa.useInfiniteScroll || false);\n        this.unseenVsUnread = (pa.unseenVsUnread || false);\n        this.scrollableAreaNode = null;\n        this.firstReceiptMap = {\n        };\n        this.user = o.user;\n        this.queuedNotifications = [];\n        this.timeElement = \"small.time\";\n        this.ua = new da();\n        this._init();\n    };\n    ga(oa.prototype, {\n        TIME_TRAVEL: \"time_travel\",\n        ONLINE: \"online\",\n        SCROLL_OFF_TINY: \"scroll_off_tiny\",\n        INACTIVE_REFRESH: \"inactive_refresh\",\n        _init: function() {\n            this.cookieName = (\"notifications_\" + this.user);\n            this.updateCheckCount = 0;\n            this.fetchListeners = [];\n            this.currentFetchRequest = null;\n            this.wrapper = ia(this.wrapperID);\n            this.content = ia(this.contentID);\n            this.jewelFlyout = ia(\"fbNotificationsFlyout\");\n            this.footer = n.find(this.jewelFlyout, \".jewelFooter\");\n            this.loadingIndicator = ia((this.contentID + \"_loading_indicator\"));\n            this.NOTIF_JEWEL_REF = \"notif_jewel\";\n            this.notifLogger = q.create(\"notifications\");\n            s.init();\n            this.alertList = new t(this.content, this._getListParams());\n            this._updateCount();\n            ((a.MinNotifications && a.MinNotifications.fetchSent()) && (this.fetch = ha));\n            h.subscribe(l.getArbiterType(this.notifReceivedType), this._handleNotificationMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_read\"), this._handleNotificationsReadMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_seen\"), this._handleNotificationsSeenMsg.bind(this));\n            h.subscribe(\"jewel/resize\", la(this._hideOverflow, this));\n            this.alertList.subscribe(t.UNREAD_COUNT_CHANGE_TYPE, this._updateCount.bind(this));\n            this._poller = new w({\n                interval: this.update_period,\n                setupRequest: this._update.bind(this),\n                clearOnQuicklingEvents: false,\n                dontStart: true\n            });\n            this._poller.start.bind(this._poller).defer(this.update_period, false);\n            if (this.wrapper) {\n                this.countSpan = n.find(this.wrapper, \"span.jewelCount span\");\n            };\n            this.initializeEvents();\n            this.fromDom();\n            if (this.useInfiniteScroll) {\n                this._autoLoadNotifIndex = 1;\n                this._truncate = false;\n                this.alertList.subscribe(t.INSERTION_TYPE, this._handleInsert.bind(this));\n            }\n        ;\n        },\n        _getListParams: function() {\n            return {\n                shouldBlockAnimation: function(pa) {\n                    return this.isNotifJewelOpen();\n                }.bind(this),\n                unseenVsUnread: this.unseenVsUnread,\n                markReadSignalServer: this.markRead.bind(this).curry(true)\n            };\n        },\n        fromDom: function() {\n            this.alertList.fromDom();\n            (((a.MinNotifications && a.MinNotifications.fetched()) && this.alertList.isEmpty()) && this.alertList.showNoNotifications());\n        },\n        initializeEvents: function() {\n            var pa = this.alertList.ITEM_TAG, qa = null;\n            p.listen(this.content, {\n                mouseover: function(event) {\n                    var ta = event.getTarget();\n                    qa = v.byTag(ta, pa);\n                    if ((qa && (ta != qa))) {\n                        if (v.byClass(qa, \"notifNegativeBase\")) {\n                            m.addClass(qa, \"notifHover\");\n                        }\n                         else m.addClass(qa, \"selected\");\n                    \n                    };\n                },\n                mouseout: function(event) {\n                    (qa && m.removeClass(qa, \"selected\"));\n                    (qa && m.removeClass(qa, \"notifHover\"));\n                    qa = null;\n                },\n                mousedown: this.onContentMouseDown.bind(this)\n            });\n            p.listen(this.wrapper, \"mouseover\", this.onMouseOver.bind(this));\n            aa.listen(\"show\", this.wrapper, this.onClick.bind(this));\n            aa.listen(\"hide\", this.wrapper, this.onHide.bind(this));\n            (this.shouldLogImpressions && aa.listen(\"show\", this.wrapper, this._logImpression.bind(this)));\n            var ra = function(ta) {\n                this._poller.request();\n                this.notifLogger.bump(ta);\n            }.bind(this);\n            z.subscribe(z.TIME_TRAVEL, ra.curry(this.TIME_TRAVEL));\n            z.subscribe(z.ONLINE, function(ta, ua) {\n                (ua && ra(this.ONLINE));\n            });\n            var sa = ((1000 * 60) * 60);\n            ca.subscribe(function(ta, ua) {\n                (((ua.idleness > sa)) && ra(this.INACTIVE_REFRESH));\n            }.bind(this));\n            this.negativeNotifs = {\n            };\n            this._initNotifNegativeFeedback();\n            if (this.useInfiniteScroll) {\n                this._setupScroll();\n                this._initializeScrollEvents();\n                this._updateScrollDataStructures.bind(this).defer();\n                this._hideOverflow();\n            }\n        ;\n        },\n        _setupScroll: function() {\n            this._scrollArea = n.scry(this.jewelFlyout, \"div.uiScrollableAreaWrap\")[0];\n            this._morePagerLink = n.find(this.jewelFlyout, \".notifMorePager a\");\n            this._morePager = (v.byClass(this._morePagerLink, \"notifMorePager\") || this._morePagerLink);\n            this._infiniteScrollNotif = null;\n            this.afterFirstFetch = false;\n            this.animate = false;\n            if ((a.MinNotifications && a.MinNotifications.fetched())) {\n                this.afterFirstFetch = true;\n                m.show(this._morePager);\n            }\n        ;\n        },\n        _initializeScrollEvents: function() {\n            p.listen(this._scrollArea, \"scroll\", ma(this._handleScroll.bind(this)));\n            p.listen(this._morePagerLink, \"success\", function(pa) {\n                this.fetchHandler(pa.getData().response);\n            }.bind(this));\n        },\n        _updateScrollDataStructures: function() {\n            var pa = this.alertList.getIds(), qa = Math.max(0, (pa.length - this._autoLoadNotifIndex));\n            this._infiniteScrollNotif = this.alertList.getDomObj(pa[qa]);\n            this._annotateMorePagerURI();\n        },\n        _annotateMorePagerURI: function() {\n            this._morePagerLink.setAttribute(\"ajaxify\", new ba(this._morePagerLink.getAttribute(\"ajaxify\")).addQueryData({\n                earliest_time: this.alertList.getEarliestNotifTime()\n            }));\n        },\n        onContentMouseDown: function(event) {\n            var pa = v.byTag(event.getTarget(), this.alertList.ITEM_TAG), qa = (pa && t.getIdFromDom(pa));\n            if ((qa && this.alertList.isUnreadId(qa))) {\n                this.markRead(true, [qa,]);\n            };\n        },\n        onMouseOver: function(event) {\n            if (m.hasClass(event.getTarget(), \"jewelButton\")) {\n                this.ua = na(\"notifs\", event.target, event, {\n                    mode: \"DEDUP\"\n                }).uai(\"mouseover\", \"jewel\").add_event(\"hover\");\n            };\n            this.fetch();\n        },\n        onClick: function() {\n            ((a.ArbiterMonitor && (this.fetch != ha)) && h.registerCallback(ha, [\"notifs/fetched\",]));\n            this.ua.add_event(\"show\");\n            this.fetch();\n            this.markRead(true);\n            this._hideOverflow();\n            if (this.scrollableAreaNode) {\n                var pa = x.getInstance(this.scrollableAreaNode);\n                (pa && pa.poke());\n            }\n        ;\n        },\n        onHide: function() {\n            this.animate = false;\n            (this.animation && this.animation.stop());\n            this.ua.add_event(\"hide\");\n            this.markRead(true);\n            this._dequeueNotifications();\n        },\n        _dequeueNotifications: function() {\n            this.queuedNotifications.forEach(function(pa) {\n                this._displayNotification(pa.type, pa.data);\n            }, this);\n            this.queuedNotifications.length = 0;\n        },\n        _handleScroll: function() {\n            if (this._checkInfiniteScroll()) {\n                this._autoLoadNotifIndex = 5;\n                this._sendFetchRequest(this._morePager);\n            }\n        ;\n        },\n        _handleInsert: function(pa, qa) {\n            if (qa.is_new) {\n                this._newDataFromInsert = true;\n            };\n            this._updateScrollDataStructures();\n        },\n        _checkInfiniteScroll: function() {\n            if ((this._infiniteScrollNotif && this._scrollArea)) {\n                var pa = ea.getElementPosition(this._infiniteScrollNotif).y, qa = (ea.getElementPosition(this._scrollArea).y + ea.getElementDimensions(this._scrollArea).y);\n                return (pa < qa);\n            }\n        ;\n            return false;\n        },\n        _initNotifNegativeFeedback: function() {\n            u.init(this);\n            this.alertList.setFilterFn(u.filterStoreClicked);\n            aa.listen(\"hide\", fa(this.wrapperID), function() {\n                for (var pa in this.negativeNotifs) {\n                    if (pa) {\n                        ((this.negativeNotifs[pa] instanceof r) && this.negativeNotifs[pa].reset());\n                    };\n                };\n            }.bind(this));\n            h.subscribe(\"notif/negativeCancel\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].restore());\n            }.bind(this));\n            h.subscribe(\"notif/negativeConfirmed\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onTurnedOff());\n                this.alertList.toggleNotifsSimilarTo(qa.id, true, true);\n                this._hideOverflow();\n                this._handleScroll();\n            }.bind(this));\n            h.subscribe(\"notif/negativeUndid\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onUndid());\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n                this._hideOverflow();\n            }.bind(this));\n            h.subscribe(\"notif/negativeMarkedSpam\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onMarkedSpam());\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptYes\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptYes());\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptNo\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptNo());\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            this.alertList.subscribe(t.INSERTION_TYPE, function(pa, qa) {\n                this._updateFirstReceipt(qa);\n                var ra = n.scry(qa.obj, \".notif_x\");\n                if ((ra.length == 1)) {\n                    this.negativeNotifs[qa.id] = new r(this, qa);\n                };\n            }.bind(this));\n        },\n        _sendIDs: function(pa, qa, ra) {\n            var sa = (ra || {\n            });\n            for (var ta = 0; (ta < pa.length); ++ta) {\n                sa[((\"alert_ids[\" + ta) + \"]\")] = pa[ta];;\n            };\n            new j(ba(qa).getQualifiedURI().toString(), sa).send();\n        },\n        _waitForFetch: function(pa) {\n            return (this.currentFetchRequest && this.fetchListeners.push(pa.bind(this)));\n        },\n        _logImpression: function() {\n            var pa = this.alertList.getIds();\n            if (((pa.length === 0) && this._waitForFetch(this._logImpression))) {\n                return\n            };\n            this.logImpressionIds(pa, this.NOTIF_JEWEL_REF);\n        },\n        logImpressionIds: function(pa, qa) {\n            (this.shouldLogImpressions && this._sendIDs(pa, \"/ajax/notifications/impression.php\", {\n                ref: qa\n            }));\n        },\n        markRead: function(pa, qa) {\n            var ra = !ja(qa);\n            qa = (ra ? this.alertList.getUnseenIds() : qa.filter(this.alertList.isUnreadId.bind(this.alertList)));\n            if (qa.length) {\n                (pa && this._sendIDs(qa, \"/ajax/notifications/mark_read.php\", {\n                    seen: (ra ? 1 : 0)\n                }));\n                if ((ia(\"jewelNoticeMessage\") && this.logAutoShutOffImpression)) {\n                    new j(\"/ajax/notifications/auto_shutoff_seen.php\").send();\n                    this.logAutoShutOffImpression = false;\n                }\n            ;\n                var sa = pa;\n                (ra ? this.alertList.markSeen(qa) : this.alertList.markRead(qa, sa));\n            }\n        ;\n            (ra && this._waitForFetch(this.markRead.bind(this, pa)));\n        },\n        markAllRead: function() {\n            var pa = this.alertList.getUnreadIds();\n            this.markRead(true, pa);\n        },\n        _updateErrorHandler: function(pa) {\n        \n        },\n        _updateURI: \"/ajax/presence/update.php\",\n        _update: function(pa) {\n            pa.setHandler(this._handleUpdate.bind(this)).setOption(\"suppressErrorAlerts\", true).setErrorHandler(this._updateErrorHandler.bind(this)).setData({\n                notif_latest: this.latest_notif_time,\n                notif_latest_read: this.latest_read_notif_time\n            }).setURI(this._updateURI).setAllowCrossPageTransition(true);\n        },\n        _handleUpdate: function(pa) {\n            var qa = pa.payload.notifications;\n            if (!qa.no_change) {\n                this.updateTime = pa.payload.time;\n                this.latest_notif_time = qa.latest_notif;\n                this.latest_read_notif_time = qa.latest_read_notif;\n                this._updateDisplay();\n                this.alertList.insertMany(qa.notifications);\n            }\n        ;\n        },\n        _updateDisplay: function() {\n            if (!this.content) {\n                return\n            };\n            this._updateCount();\n        },\n        _updateCount: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: \"notifications\",\n                count: this.alertList.unseenCount\n            }, h.BEHAVIOR_STATE);\n            this._hideOverflow();\n        },\n        fetch: function(pa) {\n            this._sendFetchRequest(pa);\n        },\n        _getFetchQueryData: function() {\n            var pa = {\n                time: this.latest_notif_time,\n                user: this.user,\n                version: this.cache_version,\n                locale: o.locale\n            };\n            if (this.useInfiniteScroll) {\n                pa.earliest_time = this.alertList.getEarliestNotifTime();\n            };\n            return pa;\n        },\n        _sendFetchRequest: function(pa) {\n            if (this.useInfiniteScroll) {\n                this._infiniteScrollNotif = null;\n                this._newDataFromInsert = false;\n                this._truncate = true;\n            }\n        ;\n            var qa = ba(\"/ajax/notifications/get.php\"), ra = (pa || this.loadingIndicator);\n            if (this.currentFetchRequest) {\n                return true\n            };\n            this.ua.add_event(\"fetch\");\n            qa.setQueryData(this._getFetchQueryData());\n            this.currentFetchRequest = new i().setURI(qa).setStatusElement(ra).setMethod(\"GET\").setReadOnly(true).setTimeoutHandler(30000, this.fetchErrorHandler.bind(this)).setHandler(this.fetchHandler.bind(this)).setErrorHandler(this.fetchErrorHandler.bind(this)).setAllowCrossPageTransition(true);\n            (!this.currentFetchRequest.send() && this.fetchErrorHandler());\n            return true;\n        },\n        fetchErrorHandler: function(pa) {\n            this.currentFetchRequest = null;\n            this.ua.add_event(\"fetch_error\");\n            (this.loadingIndicator && m.hide(this.loadingIndicator));\n            (this.useInfiniteScroll && this._updateScrollDataStructures());\n        },\n        fetchHandler: function(pa) {\n            this.ua.add_event(\"fetch_success\");\n            var qa = pa.getPayload();\n            this.alertList.insertMany(qa.notifications, true);\n            (this.loadingIndicator && m.hide(this.loadingIndicator));\n            this.loadingIndicator = null;\n            this.currentFetchRequest = null;\n            this.fetch = ha;\n            if (this.fetchListeners) {\n                for (var ra = 0; (ra < this.fetchListeners.length); ra++) {\n                    this.fetchListeners[ra]();;\n                };\n                this.fetchListeners = [];\n            }\n        ;\n            (a.ArbiterMonitor && h.inform(\"notifs/fetched\", \"\", h.BEHAVIOR_STATE));\n            var sa = qa.generated, ta = Math.round((Date.now() / 1000));\n            if (((ta - sa) > 15)) {\n                sa = ta;\n            };\n            k.loadModules([\"LiveTimer\",], function(ua) {\n                ua.restart(sa);\n                ua.startLoop(0);\n            });\n            if (this.useInfiniteScroll) {\n                if ((ka(qa.notifications) || !this._newDataFromInsert)) {\n                    this._noMoreNotifications();\n                }\n                 else m.show(this._morePager);\n            ;\n                this._updateScrollDataStructures();\n                if ((this.isNotifJewelOpen() && this.afterFirstFetch)) {\n                    this.animate = true;\n                };\n                this.afterFirstFetch = true;\n            }\n        ;\n            this._hideOverflow();\n        },\n        _noMoreNotifications: function() {\n            m.hide(this._morePager);\n            this.useInfiniteScroll = false;\n        },\n        _mergeNotification: function(pa, qa, ra, sa) {\n            var ta = !this.alertList.isUnreadId(pa);\n            this.alertList.insert(pa, qa, ra, true, null, (sa || null));\n            this.latest_notif_time = 0;\n            if (ta) {\n                this._updateCount();\n            };\n            var ua = this.alertList.getDomObj(pa);\n            if (ua) {\n                k.loadModules([\"LiveTimer\",], function(va) {\n                    va.addTimeStamps(ua);\n                });\n            };\n        },\n        _handleNotificationMsg: function(pa, qa) {\n            if (this.isNotifJewelOpen()) {\n                var ra = {\n                    type: pa,\n                    data: qa\n                };\n                this.queuedNotifications.push(ra);\n            }\n             else this._displayNotification(pa, qa);\n        ;\n        },\n        _displayNotification: function(pa, qa) {\n            var ra = qa.obj;\n            if ((typeof this.useDesktopNotifications == \"undefined\")) {\n                this.useDesktopNotifications = ((this.allowDesktopNotifications && window.webkitNotifications) && (window.webkitNotifications.checkPermission() === 0));\n            };\n            if (this.useDesktopNotifications) {\n                k.loadModules([\"DesktopNotifications\",], function(sa) {\n                    sa.addNotification(ra.alert_id);\n                });\n            };\n            if (ra.markup) {\n                this._mergeNotification(ra.alert_id, ra.time, ra.markup, (ra.alt_id || null));\n            }\n             else this._poller.request();\n        ;\n        },\n        _handleNotificationsReadMsg: function(pa, qa) {\n            var ra = qa.obj;\n            this.markRead(false, ra.alert_ids);\n        },\n        _handleNotificationsSeenMsg: function(pa, qa) {\n            if (!this.unseenVsUnread) {\n                this._handleNotificationsReadMsg(pa, qa);\n                return;\n            }\n        ;\n            var ra = qa.obj;\n            this.alertList.markSeen(ra.alert_ids);\n        },\n        _hideOverflow: function() {\n            if (!this.isNotifJewelOpen()) {\n                return\n            };\n            var pa = n.scry(fa(\"fbNotificationsList\"), \".notification\");\n            this.scrollableAreaNode = (this.scrollableAreaNode || n.scry(this.jewelFlyout, \".uiScrollableArea\")[0]);\n            var qa = 20, ra = (m.hasClass(document.documentElement, \"tinyViewport\") && !m.hasClass(document.body, \"fixedBody\"));\n            if ((!pa.length || ra)) {\n                y.set(this.scrollableAreaNode, \"height\", \"100%\");\n                this.notifLogger.rate(this.SCROLL_OFF_TINY, ra);\n                return;\n            }\n        ;\n            var sa = (this.scrollableAreaNode || pa[0]), ta = (((ea.getViewportDimensions().y - ea.getElementPosition(sa, \"viewport\").y) - ea.getElementDimensions(this.footer).y) - 5), ua = ta, va = 0;\n            for (; ((va < pa.length) && (ua > 0)); ++va) {\n                if (m.shown(pa[va])) {\n                    ua -= ea.getElementDimensions(pa[va]).y;\n                };\n            };\n            var wa = 530, xa = Math.min(wa, (ta - Math.max(ua, 0)));\n            if (((ua >= 0) && (xa < wa))) {\n                if (!this.useInfiniteScroll) {\n                    xa = \"100%\";\n                }\n                 else {\n                    if ((this._truncate && (pa.length >= 5))) {\n                        xa -= qa;\n                    };\n                    xa += \"px\";\n                }\n            ;\n            }\n             else xa += \"px\";\n        ;\n            if (((this.useInfiniteScroll && this.animate) && (xa != \"100%\"))) {\n                (this.animation && this.animation.stop());\n                this.animation = new g(this.scrollableAreaNode).to(\"height\", xa).duration(200).go();\n            }\n             else {\n                var ya = x.getInstance(this.scrollableAreaNode);\n                (ya && ya.showScrollbar.bind(ya).defer());\n                y.set(this.scrollableAreaNode, \"height\", xa);\n            }\n        ;\n        },\n        _updateFirstReceipt: function(pa) {\n            var qa = pa.obj.getAttribute(\"data-appid\"), ra = n.scry(pa.obj, \".first_receipt_div\");\n            if ((qa && (ra.length == 1))) {\n                if (this.firstReceiptMap[qa]) {\n                    if (((pa.id != this.firstReceiptMap[qa].id) && (this.firstReceiptMap[qa].time > pa.time))) {\n                        return\n                    };\n                    m.removeClass(this.firstReceiptMap[qa].obj, \"first_receipt\");\n                }\n            ;\n                this.firstReceiptMap[qa] = pa;\n                m.addClass(pa.obj, \"first_receipt\");\n            }\n        ;\n        },\n        isNotifJewelOpen: function() {\n            var pa = aa.getInstance(this.wrapper).getActive();\n            return (((pa === this.wrapper) && m.hasClass(pa, \"openToggler\")));\n        }\n    });\n    e.exports = oa;\n});\n__d(\"legacy:original-notifications-jewel\", [\"Notifications\",], function(a, b, c, d) {\n    a.Notifications = b(\"Notifications\");\n}, 3);\n__d(\"legacy:onvisible\", [\"OnVisible\",], function(a, b, c, d) {\n    a.OnVisible = b(\"OnVisible\");\n}, 3);\n__d(\"PagesVoiceBar\", [\"$\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"ChannelConstants\",\"DOM\",\"PageTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"ChannelConstants\"), l = b(\"DOM\"), m = b(\"PageTransitions\"), n = \"PagesVoiceBar/toggle\", o = \"PagesVoiceBar/initialized\", p = \"PagesVoiceBar/switchVoice\", q = \"page_transition\", r = \"pages_voice_bar_sync\", s = null, t = null, u = false, v = false;\n    function w() {\n        v = !v;\n        j.conditionClass(document.body, \"hasVoiceBar\", v);\n    };\n    function x(da, ea) {\n        new i(\"/ajax/pages/switch_voice.php\").setData(ea).setHandler(function(fa) {\n            ba();\n        }).send();\n    };\n    function y() {\n        s = null;\n    };\n    function z(da, ea) {\n        if ((ea.obj.profile_id && (ea.obj.profile_id == s))) {\n            ba();\n        };\n    };\n    function aa(da) {\n        h.subscribe(o, da);\n    };\n    function ba() {\n        m.getNextURI().go();\n    };\n    var ca = {\n        initVoiceBar: function() {\n            if (u) {\n                return\n            };\n            t = g(\"pagesVoiceBarContent\");\n            v = j.hasClass(document.body, \"hasVoiceBar\");\n            h.subscribe(n, w);\n            h.subscribe(p, x);\n            h.subscribe(q, y);\n            h.subscribe(k.getArbiterType(r), z);\n            u = true;\n            h.inform(o, null, h.BEHAVIOR_STATE);\n        },\n        update: function(da, ea) {\n            aa(function() {\n                s = ea;\n                l.setContent(t, da);\n            });\n        }\n    };\n    e.exports = ca;\n});\n__d(\"PrivacyLiteFlyout\", [\"Event\",\"function-extensions\",\"$\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Ease\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"Toggler\",\"copyProperties\",\"cx\",\"csx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"$\"), i = b(\"Animation\"), j = b(\"Arbiter\"), k = b(\"ArbiterMixin\"), l = b(\"AsyncRequest\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Ease\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Style\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"csx\"), w = b(\"ge\"), x = \"PrivacyLiteFlyout/expandingSection\", y = {\n    }, z = {\n    };\n    function aa() {\n        switch (window.location.pathname) {\n          case \"/\":\n        \n          case \"/home.php\":\n        \n          case \"/index.php\":\n            return true;\n          default:\n            return false;\n        };\n    };\n    function ba(ka) {\n        var la = \".-cx-PUBLIC-PrivacyLiteFlyoutNav__label\";\n        return (!p.byClass(ka, \"hasSmurfbar\") && n.scry(h(\"blueBar\"), la).length);\n    };\n    function ca(ka, la, ma) {\n        var na = (la ? 0 : ka.offsetHeight);\n        r.set(ka, \"height\", (na + \"px\"));\n        r.set(ka, \"overflow\", \"hidden\");\n        m.show(ka);\n        var oa = (la ? ka.scrollHeight : 0), pa = n.getID(ka);\n        (y[pa] && y[pa].stop());\n        y[pa] = new i(ka).to(\"height\", oa).ondone(function() {\n            y[pa] = null;\n            r.set(ka, \"height\", \"\");\n            r.set(ka, \"overflow\", \"\");\n            (oa || m.hide(ka));\n            ma();\n        }).duration((Math.abs((oa - na)) * 1.5)).ease(o.sineOut).go();\n    };\n    function da(ka) {\n        return new l().setURI(ka).send();\n    };\n    function ea() {\n        return da(\"/ajax/privacy/privacy_lite/increment_masher_tip_count\");\n    };\n    function fa() {\n        return da(\"/ajax/privacy/privacy_lite/dismiss_masher_tip\");\n    };\n    var ga = null, ha = false, ia = false, ja = t({\n        loadBody: function(ka) {\n            if ((!ha && w(\"fbPrivacyLiteFlyoutLoading\"))) {\n                ha = true;\n                if (!ka) {\n                    ka = false;\n                };\n                new l(\"/ajax/privacy/privacy_lite/loader\").setData({\n                    from_megaphone: ka\n                }).send();\n            }\n        ;\n        },\n        renderBody: function(ka) {\n            var la = w(\"fbPrivacyLiteFlyoutLoading\");\n            if (la) {\n                n.replace(la, ka);\n                ja.inform(\"load\", null, j.BEHAVIOR_STATE);\n            }\n        ;\n        },\n        hideCleanup: function(ka) {\n            j.inform(x);\n            var la = n.scry(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\").forEach(function(ma) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n            });\n        },\n        registerFlyoutToggler: function(ka, la) {\n            ga = la;\n            var ma = s.createInstance(ka);\n            ma.setSticky(false);\n            s.listen([\"show\",\"hide\",], la, function(na) {\n                ja.inform(na);\n                ia = (na === \"show\");\n                if (!ia) {\n                    ja.hideCleanup(ka);\n                    ma.hide();\n                    j.inform(\"layer_hidden\", {\n                        type: \"PrivacyShortcutsFlyout\"\n                    });\n                }\n                 else j.inform(\"layer_shown\", {\n                    type: \"PrivacyShortcutsFlyout\"\n                });\n            ;\n            });\n        },\n        registerFinalReminderFlyout: function(ka) {\n            if ((ia || !aa())) {\n                return\n            };\n            var la = n.find(ka.getRoot(), \".-cx-PRIVATE-PrivacyLiteFinalReminder__okay\"), ma = ka.getContext();\n            if (ba(ma)) {\n                ka.setOffsetY(-5);\n            };\n            ja.subscribe(\"show\", function() {\n                ka.hide();\n            });\n            var na = g.listen(la, \"click\", function() {\n                ka.hide();\n                da(\"/ajax/privacy/privacy_lite/dismiss_rollout_reminder\");\n                na.remove();\n            });\n            da(\"/ajax/privacy/privacy_lite/increment_rollout_reminder\");\n            ka.show();\n        },\n        isFlyoutVisible: function() {\n            return (ga && (s.getActive() === ga));\n        },\n        exists: function() {\n            return !!n.scry(document.body, \".-cx-PUBLIC-PrivacyLiteFlyoutNav__button\")[0];\n        },\n        setFlyoutVisible: function(ka) {\n            (ka ? s.show(ga) : s.hide(ga));\n        },\n        showSection: function(ka) {\n            var la = z[ka], ma = la.chevron, na = la.sublist_container;\n            j.inform(x, ma);\n            if ((ja.inform(\"expand\", ka) !== false)) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.addClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(na, true, function() {\n                    ja.inform(\"expanded\", ka);\n                });\n            }\n        ;\n        },\n        hideSection: function(ka, la, ma) {\n            var na = z[ka], oa = na.chevron, pa = na.sublist_container;\n            if ((ma === oa)) {\n                return\n            };\n            if ((ja.inform(\"collapse\", ka) !== false)) {\n                m.addClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.removeClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(pa, false, function() {\n                    ja.inform(\"collapsed\", ka);\n                });\n            }\n        ;\n        },\n        toggleSection: function(ka) {\n            var la = z[ka].chevron;\n            s.getInstance(la).hide();\n            if (m.hasClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\")) {\n                ja.showSection(ka);\n                new l(\"/ajax/privacy/privacy_lite/log_section_expand\").setData({\n                    section: ka\n                }).send();\n            }\n             else ja.hideSection(ka);\n        ;\n        },\n        registerSection: function(ka, la) {\n            z[ka] = la;\n            j.subscribe(x, ja.hideSection.curry(ka));\n            g.listen(la.section_block, \"click\", ja.toggleSection.curry(ka));\n        },\n        registerInlineHelpOnAudienceChange: function(ka, la, ma) {\n            q.subscribe(\"select\", function(na, oa) {\n                if ((oa.selector != ka)) {\n                    return\n                };\n                m.addClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n                if (ma) {\n                    new l(\"/ajax/privacy/privacy_lite/kill_intro\").send();\n                };\n            });\n        },\n        registerInlineHelpXOutOnClick: function(ka, la) {\n            g.listen(ka, \"click\", m.addClass.curry(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__reallygone\"));\n        },\n        registerBlockUnhideOnFocus: function(ka, la) {\n            g.listen(ka, \"focus\", m.show.curry(la));\n        },\n        registerMessageFilterSettingOnClick: function(ka, la) {\n            var ma = n.find(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__filterradio\");\n            g.listen(ka, \"click\", function() {\n                if (ma.checked) {\n                    new l(\"/ajax/mercury/change_filtering_type.php\").setData({\n                        filtering_type: la,\n                        source: \"privacy_lite\"\n                    }).send();\n                };\n            });\n        },\n        registerGraphSearchPrivacyReminder: function(ka, la) {\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                da(\"/ajax/privacy/privacy_lite/dismiss_gs_privacy_reminder\");\n            });\n        },\n        registerMasher: function(ka, la) {\n            var ma = false;\n            j.subscribe(x, function(na, oa) {\n                var pa = n.scry(p.byTag(oa, \"li\"), \".-cx-PRIVATE-PrivacyLiteFlyoutNav__notice\").length;\n                if ((ma || !pa)) {\n                    return\n                };\n                ma = Boolean(ea());\n            });\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                fa();\n            });\n        }\n    }, k);\n    e.exports = ja;\n});\n__d(\"PrivacyLiteFlyoutHelp\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"ContextualHelpSearchController\",\"CSS\",\"DOM\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ContextualHelpSearchController\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q, r;\n    function s(t, u, v, w, x) {\n        this._width = 315;\n        r = l.find(u, \"input\");\n        var y = l.create(\"div\");\n        this.init(t, r, y, v, w);\n        q = m.byClass(u, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__root\");\n        g.listen(x, \"click\", this._hideSearch.bind(this));\n        h.subscribe(\"PrivacyLiteFlyout/expandingSection\", this._hideSearch.bind(this));\n        var z = l.scry(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchlink\")[0];\n        (z && g.listen(z, \"click\", function() {\n            k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n            r.focus();\n            if (!this.suggestedResults) {\n                new i(\"/ajax/privacy/privacy_lite/help_suggestions\").setHandler(function(aa) {\n                    var ba = aa.getPayload().searchSuggestions, ca = l.find(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchsuggestions\");\n                    l.setContent(ca, ba);\n                    k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__hassearchsuggestions\");\n                }.bind(this)).send();\n            };\n        }.bind(this)));\n    };\n    n(s.prototype, new j(), {\n        source: \"privacy_shortcuts\",\n        _hideSearch: function() {\n            this.clearResults();\n            k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n        },\n        show: function(t) {\n            if ((t === this.topics_area)) {\n                k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                return;\n            }\n             else if ((t === this.loader)) {\n                k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                k.hide(this.results_area);\n            }\n             else k.hide(this.loader);\n            \n        ;\n            k.show(t);\n        }\n    });\n    e.exports = s;\n});\n__d(\"LayerSlowlyFadeOnShow\", [\"Class\",\"LayerFadeOnShow\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LayerFadeOnShow\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n    g.extend(j, h);\n    j.prototype._getDuration = i.thatReturns(500);\n    e.exports = j;\n});\n__d(\"PrivacyLiteNUXController\", [\"AsyncRequest\",\"CSS\",\"Event\",\"LayerSlowlyFadeOnShow\",\"Locale\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"PrivacyLiteFlyout\",\"Toggler\",\"$\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"Event\"), j = b(\"LayerSlowlyFadeOnShow\"), k = b(\"Locale\"), l = b(\"ModalMask\"), m = b(\"PageTransitions\"), n = b(\"Parent\"), o = b(\"PrivacyLiteFlyout\"), p = b(\"Toggler\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"cx\"), t = \"-cx-PUBLIC-fbPrivacyLiteMegaphone__openedfrommegaphone\", u = \"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide\", v = [], w = {\n        bootload: function() {\n        \n        },\n        init: function(y) {\n            if (!w.initialized) {\n                r(this, {\n                    dialog: y.dialog,\n                    sectionID: y.sectionID,\n                    subsectionID: y.subsectionID,\n                    initialized: true,\n                    tourStarted: false\n                });\n            };\n            if (y.showOnExpand) {\n                w._attachFlyoutListener();\n            }\n             else w._detachFlyoutListener();\n        ;\n        },\n        startTourFromAnywhere: function() {\n            w._startTour(false);\n        },\n        startTourFromMegaphone: function() {\n            w._startTour(true);\n        },\n        _startTour: function(y) {\n            if (w.tourStarted) {\n                return\n            };\n            w.tourStarted = true;\n            w._detachFlyoutListener();\n            new g(\"/ajax/privacy/privacy_lite/log_nux_imp\").setData({\n                from_megaphone: y\n            }).send();\n            l.show();\n            h.conditionClass(w.dialog.getRoot(), t, y);\n            if (!y) {\n                w._maskListener = i.listen(q(\"modalMaskOverlay\"), \"click\", w._cleanup);\n            };\n            p.setSticky(true);\n            setTimeout(w._showFlyout);\n            m.registerHandler(function() {\n                w._cleanup();\n                o.setFlyoutVisible(false);\n            }, 10);\n        },\n        _showFlyout: function() {\n            o.loadBody(true);\n            o.setFlyoutVisible(true);\n            w._initDialog();\n            x(\"load\", w._showTour);\n        },\n        _showTour: function() {\n            o.showSection(w.sectionID);\n            x(\"expanded\", function(y, z) {\n                if ((z === w.sectionID)) {\n                    w.dialog.setContext(q(w.subsectionID)).setOffsetY(20).show();\n                };\n            });\n            x([\"collapse\",\"hide\",], w._cleanup);\n        },\n        _initDialog: function() {\n            var y = w.dialog.getRoot(), z = w.dialog.getContent();\n            h.addClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogroot\");\n            h.conditionClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__rtl\", k.isRTL());\n            h.addClass(z, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogcontent\");\n            w.dialog.enableBehavior(j);\n            i.listen(y, \"click\", function(event) {\n                if (n.byClass(event.getTarget(), u)) {\n                    w._cleanup();\n                };\n            });\n        },\n        _attachFlyoutListener: function() {\n            if (!w.flyoutSubscription) {\n                if (o.isFlyoutVisible()) {\n                    w.startTourFromAnywhere();\n                }\n                 else w.flyoutSubscription = o.subscribe(\"show\", w.startTourFromAnywhere);\n            \n            };\n        },\n        _detachFlyoutListener: function() {\n            if (w.flyoutSubscription) {\n                w.flyoutSubscription.unsubscribe();\n                w.flyoutSubscription = null;\n            }\n        ;\n        },\n        _cleanup: function() {\n            if (!w.tourStarted) {\n                return\n            };\n            w.tourStarted = false;\n            p.setSticky(false);\n            l.hide();\n            w.dialog.hide();\n            while (v.length) {\n                v.pop().unsubscribe();;\n            };\n            if (w._maskListener) {\n                w._maskListener.remove();\n                w._maskListener = null;\n            }\n        ;\n        }\n    };\n    function x(y, z) {\n        v.push(o.subscribe(y, z));\n    };\n    e.exports = w;\n});\n__d(\"ViewasChromeBar\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Focus\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"ModalMask\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"cx\"), q = b(\"csx\"), r = \"ViewasChromeBar/initialized\", s = null, t = false;\n    function u(x) {\n        h.subscribe(r, x);\n    };\n    function v(x) {\n        j.addClass(x, \"-cx-PRIVATE-ViewasChromeBar__specificselectormode\");\n        var y = k.find(x, \".-cx-PRIVATE-ViewasChromeBar__userselector\");\n        l.set(k.find(y, \".textInput\"));\n    };\n    var w = {\n        initChromeBar: function(x) {\n            if (t) {\n                return\n            };\n            s = x;\n            t = true;\n            h.inform(r, null, h.BEHAVIOR_STATE);\n        },\n        update: function(x, y) {\n            u(function() {\n                k.setContent(s, x);\n                if (y) {\n                    new i(\"/ajax/privacy/glasgow/viewas_bar_flyout_open\").send();\n                };\n            });\n        },\n        registerSpecificModeOnClick: function(x) {\n            g.listen(x, \"click\", v.curry(o.byClass(x, \"-cx-PRIVATE-ViewasChromeBar__text\")));\n        },\n        registerFlyoutModalMask: function() {\n            m.show();\n            n.registerHandler(m.hide, 10);\n        }\n    };\n    e.exports = w;\n});\n__d(\"BingScalingCommon\", [], function(a, b, c, d, e, f) {\n    var g = {\n        integrateWebsuggestions: function(h, i, j, k, l) {\n            var m = [], n = (i ? m : []), o = [], p = 0, q = 0, r = j;\n            k = Math.floor((j * k));\n            for (var s = 0; (s < h.length); s++) {\n                var t = h[s];\n                if (((t.type === \"websuggestion\") && !t.isSeeMore)) {\n                    if (((((r > 0) && (p < k))) || (((p > 0) && (p < l))))) {\n                        n.push(t);\n                        p++;\n                        r--;\n                    }\n                     else if ((r > 0)) {\n                        o.push(t);\n                    }\n                ;\n                }\n                 else {\n                    if (((r <= 0) && !i)) {\n                        continue;\n                    };\n                    m.push(t);\n                    q++;\n                    r--;\n                }\n            ;\n            };\n            if (((r > 0) && (o.length > 0))) {\n                n = n.concat(o.slice(0, r));\n            };\n            if (!i) {\n                return m.concat(n)\n            };\n            return n;\n        }\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchSponsoredUtils\", [], function(a, b, c, d, e, f) {\n    function g(o) {\n        return (o.selected_target_id != o.s_target);\n    };\n    function h(o, p) {\n        return Math.min(p.maxNumberAds, ((p.maxNumberRemovedResults + p.maxNumberResultsAndAds) - o));\n    };\n    function i(o, p) {\n        var q = {\n        };\n        for (var r = (o.length - 1); (r >= 0); --r) {\n            var s = o[r];\n            q[s] = s;\n            if (p.hasOwnProperty(s)) {\n                p[s].forEach(function(t) {\n                    q[t] = s;\n                });\n            };\n        };\n        return q;\n    };\n    function j(o, p, q) {\n        for (var r = p; (r < o.length); r++) {\n            (o[r].setDebugString && o[r].setDebugString(q));;\n        };\n    };\n    function k(o, p) {\n        return (p.indexOf(String(o)) != -1);\n    };\n    function l(o, p, q, r) {\n        if (n.isSelfPromoted(o)) {\n            return false\n        };\n        if (((q + p.length) < r.maxNumberResultsAndAds)) {\n            return false\n        };\n        return true;\n    };\n    function m(o, p, q, r) {\n        var s = o[(o.length - 1)];\n        if (p.hasOwnProperty(s)) {\n            return false\n        };\n        if ((s == q)) {\n            return false\n        };\n        if ((s == r)) {\n            return false\n        };\n        return true;\n    };\n    var n = {\n        isSelfPromoted: function(o) {\n            return (o.uid == o.s_target);\n        },\n        prepareAndSortAds: function(o, p, q) {\n            if (!p) {\n                return []\n            };\n            var r = [], s = o.length, t = {\n            };\n            for (var u = 0; (u < s); u++) {\n                var v = o[u];\n                t[v.uid] = true;\n                if (v.s_categories) {\n                    v.s_categories.forEach(function(z) {\n                        t[z] = true;\n                    });\n                };\n            };\n            for (var w in t) {\n                if (p[w]) {\n                    for (var x in p[w]) {\n                        var y = p[w][x];\n                        if ((q && q.hasOwnProperty(y.uid))) {\n                            continue;\n                        };\n                        r.push(y);\n                    }\n                };\n            };\n            r.sort(function(z, aa) {\n                return (aa.s_value - z.s_value);\n            });\n            return r;\n        },\n        selectAds: function(o, p, q, r, s) {\n            var t = [], u = {\n            }, v = {\n            }, w = {\n            }, x = 0, y = h(o.length, r), z = i(o, p);\n            for (var aa = 0; (aa < q.length); aa++) {\n                if ((t.length >= y)) {\n                    j(q, aa, ((\"filtered: \" + y) + \" ads already selected\"));\n                    break;\n                }\n            ;\n                var ba = q[aa], ca = (z[ba.s_target] || ba.s_target);\n                ba.selected_target_id = ca;\n                if (!k(ca, o)) {\n                    (ba.setDebugString && ba.setDebugString(((((\"filtered: targeted organic \" + ca) + \" does not exist. \") + \"promoted id \") + ba.uid)));\n                    continue;\n                }\n            ;\n                if ((l(ba, o, x, r) && !m(o, v, ca, s))) {\n                    (ba.setDebugString && ba.setDebugString(\"filtered: last organic need but cannot be removed\"));\n                    continue;\n                }\n            ;\n                if ((!n.isSelfPromoted(ba) && (o.indexOf(String(ba.uid)) != -1))) {\n                    (ba.setDebugString && ba.setDebugString((((\"filtered: organic \" + ba.uid) + \" targets another organic \") + ca)));\n                    continue;\n                }\n            ;\n                if (u.hasOwnProperty(ba.s_account)) {\n                    (ba.setDebugString && ba.setDebugString(((\"filtered: ad account \" + ba.s_account) + \" already selected\")));\n                    continue;\n                }\n            ;\n                if (w.hasOwnProperty(ba.uid)) {\n                    (ba.setDebugString && ba.setDebugString(((\"filtered: ad promoted id \" + ba.uid) + \" already selected\")));\n                    continue;\n                }\n            ;\n                (ba.setDebugString && ba.setDebugString(\"selected\"));\n                t.push(ba);\n                u[ba.s_account] = true;\n                v[ca] = true;\n                w[ba.uid] = true;\n                if (!n.isSelfPromoted(ba)) {\n                    ++x;\n                    if (((x + o.length) > r.maxNumberResultsAndAds)) {\n                        o.pop();\n                    };\n                }\n            ;\n            };\n            return t;\n        },\n        hasTopResult: function(o, p, q) {\n            if ((o == null)) {\n                return false\n            };\n            if ((o.type == \"user\")) {\n                return false\n            };\n            if ((o.type == \"grammar\")) {\n                return false\n            };\n            if ((o.score > q.v0)) {\n                return true\n            };\n            if ((o.s_value > q.v3)) {\n                return true\n            };\n            if ((o.s_value > p.s_value)) {\n                return true\n            };\n            var r = (g(p) ? q.v4 : ((o.bootstrapped ? q.v1 : q.v2)));\n            if ((r < p.s_value)) {\n                return false\n            };\n            return true;\n        },\n        setOrganicECPM: function(o, p) {\n            if ((o == null)) {\n                return\n            };\n            for (var q = 0; (q < p.length); q++) {\n                if (o.hasOwnProperty(p[q].uid)) {\n                    p[q].s_value = o[p[q].uid];\n                };\n            };\n            return;\n        },\n        buildResultIndices: function(o) {\n            var p = {\n            }, q = o.length;\n            for (var r = 0; (r < q); r++) {\n                p[o[r].uid] = r;;\n            };\n            return p;\n        },\n        getTopAdPosition: function(o, p, q) {\n            if ((o.length < 1)) {\n                return null\n            };\n            if ((p.length < 1)) {\n                return null\n            };\n            if ((((o[0].type == \"user\")) || ((o[0].type == \"grammar\")))) {\n                for (var r = 1; (r < o.length); ++r) {\n                    if ((o[r].type != o[0].type)) {\n                        return r\n                    };\n                };\n                return o.length;\n            }\n        ;\n            if (n.hasTopResult(o[0], p[0], q)) {\n                return 1\n            };\n            return 0;\n        }\n    };\n    e.exports = n;\n});\n__d(\"TypeaheadSearchSponsored\", [\"Event\",\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"TypeaheadSearchSponsoredUtils\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"URI\"), l = b(\"copyProperties\"), m = b(\"TypeaheadSearchSponsoredUtils\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n    o.prototype.enable = function() {\n        this._data = this._typeahead.getData();\n        this._dataSubscriptions = [this._data.subscribe(\"beginFetchHandler\", function(p, q) {\n            var r = q.response.getPayload();\n            if (r.s_entries) {\n                this._sponsoredEntries = (this._sponsoredEntries || {\n                });\n                var s = r.s_entries.length;\n                for (var t = 0; (t < s); t++) {\n                    var u = new o.Ad();\n                    l(u, r.s_entries[t]);\n                    var v = u.s_target;\n                    if (!this._sponsoredEntries[v]) {\n                        this._sponsoredEntries[v] = {\n                        };\n                    };\n                    this._sponsoredEntries[v][u.uid] = u;\n                };\n                if (r.s_bootstrap_id) {\n                    this._sBootstrapID = r.s_bootstrap_id;\n                };\n                if (r.organic_s_value) {\n                    this._organicECPM = l(this._organicECPM, r.organic_s_value);\n                };\n            }\n        ;\n        }.bind(this)),];\n        if (o.auctionOptions.bootstrap) {\n            this._dataSubscriptions.push(this._data.subscribe(\"onload\", function(p, q) {\n                var r = l(this.bootstrapData, {\n                    no_cache: 1,\n                    options: [\"sponsored\",]\n                });\n                this.fetch(this.bootstrapEndpoint, r, {\n                    type: \"sponsored\"\n                });\n            }.bind(this._data)));\n        };\n        this._view = this._typeahead.getView();\n        this._viewSubscriptions = [this._view.subscribe(\"finalResultsReordering\", function(p, q) {\n            o.query = q.value;\n            m.setOrganicECPM(this._organicECPM, q.results);\n            var r = o.getOriginalOrganics(q.results);\n            o.setAuctionOptions({\n                maxNumberResultsAndAds: Math.max(q.results.length, (((this._data && this._data._maxResults)) || o.auctionOptions.maxNumberResultsAndAds))\n            });\n            var s = this.runAuction(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities, o.auctionOptions), t = m.prepareAndSortAds(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities), u = t.map(function(y) {\n                return y.s_token;\n            }), v = [];\n            for (var w = 0; (w < s.length); w++) {\n                var x = s[w];\n                if (x.s_token) {\n                    v.push({\n                        position: w,\n                        is_self: x.is_self\n                    });\n                };\n            };\n            this._view.inform(\"recordAfterReorder\", {\n                organic: r,\n                tokens: u,\n                position_data: v,\n                s_bootstrap_id: this._sBootstrapID,\n                options: o.auctionOptions,\n                variant: o.auctionOptions.rerankingStrategy\n            });\n            q.results = s;\n            this._data.inform(\"recordAuctionState\", {\n                organic: r,\n                auctionOptions: o.auctionOptions,\n                event_data: q\n            });\n        }.bind(this)),this._view.subscribe(\"highlight\", function(p, q) {\n            if (this._view.content) {\n                j.scry(this._view.content, \"a.report\").forEach(i.hide);\n            };\n            if (((!q.element || !q.selected) || !q.selected.s_token)) {\n                return\n            };\n            var r = j.scry(q.element, \"a.report\");\n            if (r.length) {\n                i.show(r[0]);\n            }\n             else j.appendContent(q.element, this._createHideAdLink(q.selected));\n        ;\n        }.bind(this)),];\n        this._globalSubscriptions = [h.subscribe(\"TypeaheadSearchSponsored/hideAdResult\", function(p, q) {\n            this._hiddenSponsoredEntities = (this._hiddenSponsoredEntities || {\n            });\n            this._hiddenSponsoredEntities[q.uid] = true;\n            this._hideReasonDialog = q.reason_dialog;\n            this._forceRefreshResults();\n        }.bind(this)),h.subscribe(\"TypeaheadSearchSponsored/undoHideAdResult\", function(p, q) {\n            if (this._hiddenSponsoredEntities) {\n                delete this._hiddenSponsoredEntities[q.uid];\n            };\n            if (this._hideReasonDialog) {\n                this._hideReasonDialog.hide();\n                this._hideReasonDialog = null;\n            }\n        ;\n            this._forceRefreshResults();\n        }.bind(this)),];\n    };\n    o.prototype.disable = function() {\n        this._dataSubscriptions.forEach(this._data.unsubscribe.bind(this._data));\n        this._dataSubscriptions = null;\n        this._viewSubscriptions.forEach(this._view.unsubscribe.bind(this._view));\n        this._viewSubscriptions = null;\n        this._globalSubscriptions.forEach(h.unsubscribe.bind(h));\n        this._globalSubscriptions = null;\n        this._data = null;\n        this._view = null;\n        this._sponsoredEntries = null;\n    };\n    o.prototype.runAuction = function(p, q, r, s) {\n        if ((p.length === 0)) {\n            return p\n        };\n        p = o.initResults(p);\n        if (!q) {\n            return p\n        };\n        var t = m.prepareAndSortAds(p, q, r);\n        if (this._typeahead) {\n            var u = this._typeahead.getData();\n            u.inform(\"recordAuctionState\", {\n                sorted_ads: t\n            });\n        }\n    ;\n        var v = {\n        }, w = p.map(function(ba) {\n            if (ba.s_categories) {\n                v[ba.uid] = ba.s_categories;\n            };\n            return String(ba.uid);\n        }), x = m.selectAds(w, v, t, s);\n        if ((x.length === 0)) {\n            return p\n        };\n        if (m.hasTopResult(p[0], x[0], s)) {\n            o.setTopResult(p);\n        };\n        var y = 0;\n        for (var z = 0; (z < x.length); ++z) {\n            if (!m.isSelfPromoted(x[z])) {\n                y++;\n            };\n        };\n        p.length = Math.min(p.length, (s.maxNumberResultsAndAds - y));\n        var aa = o.rerankAds(p, x, s);\n        return aa;\n    };\n    o.prototype._forceRefreshResults = function() {\n        if ((this._data && this._data.value)) {\n            this._data.respond(this._data.value, this._data.buildUids(this._data.value));\n        };\n    };\n    o.prototype._createHideAdLink = function(p) {\n        var q = new k(\"/ajax/emu/end.php\").addQueryData({\n            eid: p.s_token,\n            f: 0,\n            ui: (\"typeahead_\" + p.s_token.replace(\".\", \"_\")),\n            en: \"fad_hide\",\n            ed: \"true\",\n            a: 1\n        }).toString(), r = {\n            className: \"report\",\n            rel: \"dialog-post\",\n            href: \"#\",\n            ajaxify: q,\n            title: \"Hide the ad\"\n        }, s = j.create(\"a\", r);\n        g.listen(s, \"mouseover\", function(event) {\n            this._view.index = -1;\n            this._view.highlight(-1, false);\n            event.kill();\n        }.bind(this));\n        return s;\n    };\n    o.auctionOptions = {\n    };\n    o.query = null;\n    o.getOriginalOrganics = function(p) {\n        return p.map(function(q) {\n            return {\n                uid: q.uid,\n                text: q.text,\n                type: o.getRealType(q),\n                source: (q.bootstrapped ? 1 : 0),\n                index: q.index,\n                s_value: (q.s_value || 0),\n                s_categories: (q.s_categories || []),\n                score: q.score\n            };\n        });\n    };\n    o.setTopResult = function(p) {\n        p[0].renderTypeOverride = true;\n        p[0].orig_render_type = p[0].render_type;\n        p[0].render_type = \"tophit\";\n    };\n    o.finalizeAd = function(p, q, r) {\n        var s = \"Sponsored\";\n        p.rankType = ((p.rankType || p.render_type) || p.type);\n        if (m.isSelfPromoted(p)) {\n            q.s_token = p.s_token;\n            q.message = p.s_message;\n            if ((r.rerankingStrategy === 0)) {\n                q.subtextOverride = (q.subtext ? ((q.subtext + \" \\u00b7 \") + s) : s);\n            };\n            if (p.path) {\n                q.pathOverride = true;\n                q.orig_path = q.path;\n                q.path = p.path;\n            }\n        ;\n            q.is_self = true;\n        }\n         else {\n            p.message = p.s_message;\n            p.subtextOverride = null;\n            if ((r.rerankingStrategy === 0)) {\n                p.subtextOverride = (p.subtext ? ((p.subtext + \" \\u00b7 \") + s) : s);\n            };\n            if (r.debug) {\n                if ((!p.subtextOverride && p.subtext)) {\n                    p.subtextOverride = p.subtext;\n                };\n                if (p.subtextOverride) {\n                    p.subtextOverride += ((\" \\u00b7 (Debug: \" + q.text) + \")\");\n                }\n                 else p.subtextOverride = ((\"(Debug: \" + q.text) + \")\");\n            ;\n            }\n        ;\n            p.type = q.type;\n            p.render_type = q.render_type;\n            p.is_self = false;\n        }\n    ;\n    };\n    o.promoteSelfPromotedResultToTop = function(p, q, r, s) {\n        var t = p[q];\n        if ((q < r)) {\n            var u = \"Sponsored\";\n            t.subtextOverride = (t.subtext ? ((t.subtext + \" \\u00b7 \") + u) : u);\n            return;\n        }\n    ;\n        if ((q > r)) {\n            p.splice(r, 0, p.splice(q, 1)[0]);\n        };\n        t = p[r];\n        t.renderTypeOverride = true;\n        t.orig_render_type = t.render_type;\n        t.render_type = \"ownsection\";\n    };\n    o.insertAdToTop = function(p, q, r, s) {\n        p.splice(r, 0, q);\n        q.render_type = \"ownsection\";\n    };\n    o.rerankMethod5 = function(p, q, r) {\n        if ((r.rerankingStrategy != 5)) {\n            return\n        };\n        var s = m.getTopAdPosition(p, q, r), t = m.buildResultIndices(p);\n        for (var u = (q.length - 1); (u >= 0); u--) {\n            var v = q[u], w = t[v.selected_target_id], x = p[w];\n            o.finalizeAd(v, x, r);\n            if (m.isSelfPromoted(v)) {\n                o.promoteSelfPromotedResultToTop(p, w, s, r);\n            }\n             else o.insertAdToTop(p, v, s, r);\n        ;\n            t = m.buildResultIndices(p);\n        };\n    };\n    o.rerankAds = function(p, q, r) {\n        switch (r.rerankingStrategy) {\n          case 5:\n            o.rerankMethod5(p, q, r);\n            break;\n          default:\n            break;\n        };\n        p.length = Math.min(p.length, r.maxNumberResultsAndAds);\n        return p;\n    };\n    o.initResults = function(p) {\n        var q = p.length;\n        for (var r = 0; (r < q); r++) {\n            var s = p[r];\n            s.is_self = null;\n            s.s_token = null;\n            s.message = null;\n            s.subtextOverride = null;\n            if (s.pathOverride) {\n                s.path = s.orig_path;\n                s.pathOverride = false;\n            }\n        ;\n            if (s.renderTypeOverride) {\n                s.render_type = s.orig_render_type;\n                s.renderTypeOverride = false;\n            }\n        ;\n            s.rankType = ((s.rankType || s.render_type) || s.type);\n        };\n        return p;\n    };\n    o.setAuctionOptions = function(p) {\n        l(o.auctionOptions, p);\n    };\n    o.getRealType = function(p) {\n        if (p.renderTypeOverride) {\n            return (p.orig_render_type || p.type)\n        };\n        return (p.render_type || p.type);\n    };\n    o.hideAdResult = function(p, q) {\n        h.inform(\"TypeaheadSearchSponsored/hideAdResult\", {\n            uid: p,\n            reason_dialog: q\n        });\n    };\n    o.undoHideAdResult = function(p) {\n        h.inform(\"TypeaheadSearchSponsored/undoHideAdResult\", {\n            uid: p\n        });\n    };\n    o.Ad = function() {\n    \n    };\n    l(o.prototype, {\n        _dataSubscriptions: null,\n        _viewSubscriptions: null,\n        _globalSubscriptions: null,\n        _data: null,\n        _view: null,\n        _sponsoredEntries: null,\n        _hiddenSponsoredEntities: null,\n        _hideReasonDialog: null,\n        _sBootstrapID: null,\n        _organicECPM: null\n    });\n    e.exports = o;\n});\n__d(\"legacy:SearchSponsoredTypeaheadBehavior\", [\"TypeaheadSearchSponsored\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchSponsored\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.searchSponsored = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:TypeaheadSearchSponsored\", [\"TypeaheadSearchSponsored\",], function(a, b, c, d) {\n    a.TypeaheadSearchSponsored = b(\"TypeaheadSearchSponsored\");\n}, 3);\n__d(\"SearchDataSource\", [\"Event\",\"Arbiter\",\"AsyncResponse\",\"DataSource\",\"HashtagSearchResultUtils\",\"copyProperties\",\"createArrayFrom\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncResponse\"), j = b(\"DataSource\"), k = b(\"HashtagSearchResultUtils\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"BingScalingCommon\"), o = ((j === null) ? null : j.prototype);\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = j;\n    function p(q) {\n        this._token = (q.token || \"\");\n        this._lazyonload = ((q.lazyonload === false) ? false : true);\n        this._extraTypes = q.extraTypes;\n        this._buckets = q.buckets;\n        this._noMultiFetch = (q.noMultiFetch || false);\n        this._maxWebSuggToCountFetchMore = (q.maxWebSuggToCountFetchMore || 0);\n        var r = (q.maxResults || 8);\n        j.call(this, q);\n        this._numResults = {\n            min: 3,\n            max: r\n        };\n        this.recordingRoute = (q.recordingRoute || \"non_banzai\");\n        this._enabledHashtag = (q.enabledHashtag || false);\n        this.logBackendQueriesWindow = (q.logBackendQueriesWindow || 25);\n        this._minWebSugg = (q.minWebSugg || 2);\n        this._queryToWebSuggState = {\n        };\n        this._genTime = q.genTime;\n    };\n    p.prototype.init = function() {\n        o.init.call(this);\n        this._leanPayload = null;\n        this._bootstrapRequestsPending = 0;\n        this._criticalOnly = true;\n        this._updateMaxResults();\n        g.listen(window, \"resize\", this._updateMaxResults.bind(this));\n        this.complexChars = new RegExp(\"[\\uff66-\\uffdd\\u4e00-\\u9fcc\\u3400-\\u4dbf]\");\n    };\n    p.prototype.dirty = function() {\n        o.dirty.call(this);\n        this._fetchOnUseRequests = [];\n    };\n    p.prototype.asyncErrorHandler = function(q) {\n        if (((window.Dialog && (window.Dialog.getCurrent() == null)) && (q.getError() == 1400003))) {\n            i.verboseErrorHandler(q);\n        };\n    };\n    p.prototype.fetch = function(q, r, s) {\n        s = (s || {\n        });\n        s.fetch_start = Date.now();\n        o.fetch.call(this, q, r, s);\n    };\n    p.prototype.fetchHandler = function(q, r) {\n        var s = q.getPayload(), t = l({\n            fetch_end: Date.now()\n        }, r), u = (t.value ? h.BEHAVIOR_EVENT : h.BEHAVIOR_PERSISTENT);\n        this.inform(\"beginFetchHandler\", {\n            response: q\n        });\n        if ((r.type == \"lean\")) {\n            this._leanPayload = s;\n            this._processLean();\n        }\n         else {\n            if (s.coeff2_ts) {\n                t.coeff2_ts = s.coeff2_ts;\n            };\n            var v = {\n                limit: ((typeof s.webSuggLimit !== \"undefined\") ? s.webSuggLimit : 6),\n                showOnTop: ((typeof s.webSuggOnTop !== \"undefined\") ? s.webSuggOnTop : false)\n            };\n            this._queryToWebSuggState[r.value] = v;\n            o.fetchHandler.call(this, q, r);\n            if ((r.bootstrap && !q.getRequest().getData().no_cache)) {\n                t.browserCacheHit = ((s.timestamp < this._genTime));\n            };\n            if (((r.bootstrap && !s.no_data) && (this._bootstrapRequestsPending > 0))) {\n                r.bootstrap = false;\n                --this._bootstrapRequestsPending;\n                (!this._bootstrapRequestsPending && this._bootstrapPostProcess());\n            }\n        ;\n            if (((s.no_data || s.stale) || (s.token !== this._token))) {\n                var w = l({\n                }, q.getRequest().getData());\n                if (w.lazy) {\n                    delete w.lazy;\n                    w.token = this._token;\n                    this._fetchOnUse(w, r);\n                }\n            ;\n            }\n        ;\n        }\n    ;\n        this.inform(\"endpointStats\", t, u);\n    };\n    p.prototype.respond = function(q, r, s) {\n        this.inform(\"respondValidUids\", r);\n        this.inform(\"reorderResults\", r);\n        var t = this.buildData(r, q);\n        t.forEach(function(u, v) {\n            u.origIndex = v;\n        });\n        this.inform(\"respond\", {\n            value: q,\n            results: t,\n            isAsync: !!s\n        });\n        return t;\n    };\n    p.prototype.buildData = function(q, r) {\n        if ((!q || (q.length === 0))) {\n            return []\n        };\n        var s = this.getWebSuggState(r), t = s.showOnTop, u = n.integrateWebsuggestions(q.map(this.getEntry.bind(this)), Boolean(t), this._maxResults, s.limit);\n        u.length = Math.min(u.length, this._maxResults);\n        return u;\n    };\n    p.prototype.getWebSuggState = function(q) {\n        while (q) {\n            var r = this._queryToWebSuggState[q];\n            if ((typeof r !== \"undefined\")) {\n                return r\n            };\n            q = q.slice(0, (q.length - 1));\n        };\n        return {\n            limit: 0,\n            showOnTop: false\n        };\n    };\n    p.prototype._isQueryTooShort = function(q) {\n        return ((q.length < this._minQueryLength) && !((this.complexChars && this.complexChars.test(q))));\n    };\n    p.prototype.shouldFetchMoreResults = function(q) {\n        var r = 0, s = 0;\n        q.forEach(function(t) {\n            if (((t.type !== \"websuggestion\") || (s++ < this._maxWebSuggToCountFetchMore))) {\n                r++;\n            };\n        }.bind(this));\n        return (r < this._maxResults);\n    };\n    p.prototype._bootstrapPostProcess = function() {\n        var q = {\n            time: Date.now()\n        };\n        this.inform(\"bootstrapped\", q, h.BEHAVIOR_PERSISTENT);\n        this._processLean();\n    };\n    p.prototype._processLean = function() {\n        if (this._leanPayload) {\n            var q, r = this._leanPayload.entries;\n            for (var s in r) {\n                q = this.getEntry(s);\n                (q && (q.index = r[s]));\n            };\n            this.setExclusions(this._leanPayload.blocked);\n            this._leanPayload = null;\n        }\n    ;\n    };\n    p.prototype._updateMaxResults = function() {\n        var q = (window.innerHeight || document.documentElement.clientHeight);\n        this.setMaxResults(Math.max(this._numResults.min, Math.min(this._numResults.max, Math.ceil((2 + ((((q - 370)) / 56)))))));\n    };\n    p.prototype._bootstrapFetch = function(q, r) {\n        var s = l(r, this.bootstrapData);\n        if ((this._criticalOnly && this._lazyonload)) {\n            s.lazy = 1;\n        };\n        this.fetch(this.bootstrapEndpoint, s, {\n            bootstrap: true,\n            type: q\n        });\n        ++this._bootstrapRequestsPending;\n    };\n    p.prototype._fetchOnUse = function(q, r) {\n        for (var s in this.bootstrapData) {\n            (!q.hasOwnProperty(s) && (q[s] = this.bootstrapData[s]));;\n        };\n        if (this._criticalOnly) {\n            this._fetchOnUseRequests.push({\n                args: q,\n                ctx: r\n            });\n        }\n         else this.fetch(this.bootstrapEndpoint, q, r);\n    ;\n    };\n    p.prototype._fetchLean = function() {\n        var q = {\n            no_cache: 1\n        };\n        q.options = m(q.options);\n        q.options.push(\"lean\");\n        this._fetchOnUse(q, {\n            type: \"lean\"\n        });\n    };\n    p.prototype.bootstrap = function(q) {\n        if (!q) {\n            this._criticalOnly = false;\n            this._flushFetchOnUseRequests();\n        }\n    ;\n        if (this._bootstrapped) {\n            return\n        };\n        var r = {\n            filter: [\"event\",],\n            no_cache: 1\n        };\n        this._fetchOnUse(r, {\n            type: \"event\"\n        });\n        var s = [\"app\",\"page\",\"group\",\"friendlist\",];\n        s = s.concat((this._extraTypes || []));\n        if (this._noMultiFetch) {\n            s.push(\"user\");\n            this._bootstrapFetch(\"user\", {\n                filter: s\n            });\n        }\n         else {\n            this._bootstrapFetch(\"other\", {\n                filter: s\n            });\n            if (this._buckets) {\n                for (var t = 0; (t < this._buckets.length); ++t) {\n                    var u = {\n                        filter: [\"user\",],\n                        buckets: this._buckets[t]\n                    };\n                    this._bootstrapFetch(\"user\", u);\n                };\n            }\n             else this._bootstrapFetch(\"user\", {\n                filter: [\"user\",]\n            });\n        ;\n        }\n    ;\n        this._fetchLean();\n        this._bootstrapped = true;\n    };\n    p.prototype._flushFetchOnUseRequests = function() {\n        var q = this._fetchOnUseRequests.length;\n        for (var r = 0; (r < q); ++r) {\n            var s = this._fetchOnUseRequests[r];\n            this.fetch(this.bootstrapEndpoint, s.args, s.ctx);\n        };\n        if ((q > 0)) {\n            this.inform(\"extra_bootstrap\", {\n                time: Date.now()\n            }, h.BEHAVIOR_PERSISTENT);\n        };\n        this._fetchOnUseRequests = [];\n    };\n    p.prototype.onLoad = function(q, r) {\n        this.inform(\"onload\", {\n            time: Date.now()\n        }, h.BEHAVIOR_PERSISTENT);\n        if (q) {\n            this.bootstrap.bind(this, r).defer();\n        };\n    };\n    p.prototype.mergeUids = function(q, r, s, t) {\n        var u = this.getDynamicHashtagResult(t);\n        if (((t && u) && (r.indexOf(u) <= 0))) {\n            r.unshift(u);\n        };\n        var v = (s[0] ? this.getEntry(s[0]) : null), w = (r[0] ? this.getEntry(r[0]) : null), x = (((v && v.replace_results)) ? v : null);\n        x = ((((!x && w) && w.replace_results)) ? w : x);\n        var y = o.mergeUids.call(this, q, r, s, t);\n        if (x) {\n            this.inform(\"backend_topreplace\", {\n            });\n            return this.deduplicateByKey([x.uid,].concat(y));\n        }\n    ;\n        return y;\n    };\n    p.prototype.getTextToIndexFromFields = function(q, r) {\n        var s = [], t = (q.tokenVersion === \"v2\");\n        for (var u = 0; (u < r.length); ++u) {\n            if ((t && (((r[u] === \"text\") || (r[u] === \"alias\"))))) {\n                continue;\n            };\n            var v = q[r[u]];\n            if (v) {\n                s.push((v.join ? v.join(\" \") : v));\n            };\n        };\n        return s.join(\" \");\n    };\n    p.prototype.getDynamicHashtagResult = function(q) {\n        if ((!q || !this._enabledHashtag)) {\n            return\n        };\n        var r = k.getHashtagFromQuery(q);\n        if (!r) {\n            return\n        };\n        var s = (\"hashtag:\" + r), t = this.getEntry(s);\n        if (!t) {\n            this.processEntries([k.makeTypeaheadResult(r),], q);\n        };\n        return s;\n    };\n    e.exports = p;\n});\n__d(\"legacy:SearchDataSource\", [\"SearchDataSource\",], function(a, b, c, d) {\n    a.SearchDataSource = b(\"SearchDataSource\");\n}, 3);\n__d(\"SearchTypeaheadCore\", [\"Event\",\"function-extensions\",\"Arbiter\",\"Class\",\"DOM\",\"Input\",\"Parent\",\"TypeaheadCore\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DOM\"), k = b(\"Input\"), l = b(\"Parent\"), m = b(\"TypeaheadCore\"), n = b(\"copyProperties\"), o = ((m === null) ? null : m.prototype);\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = m;\n    function p(q) {\n        m.call(this, q);\n    };\n    p.prototype.init = function(q, r, s) {\n        o.init.call(this, q, r, s);\n        var t = l.byTag(s, \"form\"), u = this.reset.bind(this);\n        h.subscribe(\"pre_page_transition\", function(event, w) {\n            var x = /^\\/search/, y = x.test(w.from.path), z = x.test(w.to.path);\n            if ((y && !z)) {\n                u.defer();\n            };\n        });\n        if (t) {\n            var v = j.find(t, \"input.search_sid_input\");\n            g.listen(t, \"submit\", function() {\n                if ((this.data && this.data.queryData)) {\n                    v.value = this.data.queryData.sid;\n                };\n                u.defer();\n            }.bind(this), g.Priority.URGENT);\n        }\n    ;\n    };\n    p.prototype.select = function() {\n        this.reset();\n        this.element.focus();\n        (function() {\n            this.element.blur();\n        }).bind(this).defer();\n    };\n    p.prototype.handleTab = function(event) {\n        var q = this.view.getQuerySuggestion(this.value);\n        if (q) {\n            k.setValue(this.element, q);\n            this.checkValue();\n            event.kill();\n        }\n         else o.handleTab.call(this, event);\n    ;\n    };\n    p.prototype.getSearchType = function() {\n        return \"regular\";\n    };\n    e.exports = p;\n});\n__d(\"legacy:SearchTypeaheadCore\", [\"SearchTypeaheadCore\",], function(a, b, c, d) {\n    a.SearchTypeaheadCore = b(\"SearchTypeaheadCore\");\n}, 3);\n__d(\"SearchTypeaheadView\", [\"Arbiter\",\"ContextualTypeaheadView\",\"ContextualLayerUpdateOnScroll\",\"copyProperties\",\"DOM\",\"goURI\",\"MusicConstants\",\"MusicEvents\",\"tx\",\"URI\",\"isEmail\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ContextualTypeaheadView\"), i = b(\"ContextualLayerUpdateOnScroll\"), j = b(\"copyProperties\"), k = b(\"DOM\"), l = b(\"goURI\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"tx\"), p = b(\"URI\"), q = b(\"isEmail\"), r = b(\"fbt\"), s = ((h === null) ? null : h.prototype);\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = h;\n    function t(v, w) {\n        h.call(this, v, w);\n    };\n    t.prototype.initializeLayer = function() {\n        s.initializeLayer.call(this);\n        this.layer.setOffsetY(-1);\n        this.layer.enableBehavior(i);\n    };\n    t.prototype.ignoreClick = function(event) {\n        event.prevent();\n    };\n    t.prototype.render = function(v, w, x) {\n        if (this._bucketize) {\n            w = u(w);\n        };\n        var y = {\n            results: w,\n            value: v\n        };\n        this.inform(\"finalResultsReordering\", y);\n        return s.render.call(this, v, y.results, x);\n    };\n    t.prototype.disableBucketization = function() {\n        this._bucketize = false;\n    };\n    t.prototype.buildBuckets = function(v, w) {\n        var x = w.length, y = 0, z;\n        for (z = 0; (z < x); ++z) {\n            if ((w[z].type == \"user\")) {\n                y++;\n            };\n        };\n        this._redirectToUsersResultsPage = (this.showFilterResults && (y === x));\n        this.setWebSuggLoggingParams(v, w);\n        if (this._bucketize) {\n            w = s.buildBuckets.call(this, v, w);\n        };\n        if ((v && this._shouldShowSeeMore)) {\n            w.push(this.buildSeeMore(v, x));\n            if ((q(v) && ((y < 1)))) {\n                w.push(this.buildInvite(v));\n            };\n        }\n    ;\n        return w;\n    };\n    t.prototype.buildSeeMore = function(v, w) {\n        var x = this.getSeeMoreText(v, w), y = ((w == 1) ? \"Displaying top result\" : o._(\"Displaying top {number} results\", {\n            number: w\n        })), z = k.create(\"li\", {\n            className: \"calltoaction\"\n        }, [k.create(\"a\", {\n            href: this.getSeeMoreEndpoint(v),\n            rel: \"ignore\"\n        }, [k.create(\"span\", {\n            className: \"text\"\n        }, [k.create(\"span\", {\n            className: \"seeMore\"\n        }, [x,k.create(\"span\", {\n            className: \"arrow\"\n        }),]),k.create(\"span\", {\n            className: \"subtext\"\n        }, [y,]),]),]),]);\n        z.setAttribute(\"aria-label\", x);\n        return {\n            uid: \"search\",\n            node: z,\n            search: true\n        };\n    };\n    t.prototype.getSeeMoreText = function(v, w) {\n        if (this.showKeywordResultsPage) {\n            return r._(\"Search for {query}\", [r.param(\"query\", v),])\n        };\n        if ((w <= 0)) {\n            return o._(\"See results for {query}\", {\n                query: v\n            })\n        };\n        if (this._redirectToUsersResultsPage) {\n            return r._(\"Filter results for {query}\", [r.param(\"query\", v),])\n        };\n        return o._(\"See more results for {query}\", {\n            query: v\n        });\n    };\n    t.prototype.buildInvite = function(v) {\n        var w = o._(\"Invite {query} to Facebook\", {\n            query: v\n        }), x = k.create(\"li\", {\n            className: \"calltoaction\"\n        }, [k.create(\"a\", {\n            href: this.getInviteEndpoint(v),\n            rel: \"ignore\"\n        }, [k.create(\"span\", {\n            className: \"text\"\n        }, [k.create(\"span\", {\n            className: \"invite\"\n        }, [w,]),]),]),]);\n        x.setAttribute(\"aria-label\", w);\n        return {\n            uid: \"invite\",\n            node: x,\n            search: true\n        };\n    };\n    t.prototype.searchPageQueryData = function(v) {\n        return j({\n            q: v\n        }, (this.queryData || {\n        }));\n    };\n    t.prototype.searchPageTypeData = function() {\n        return (this._redirectToUsersResultsPage ? {\n            type: \"users\"\n        } : {\n        });\n    };\n    t.prototype.select = function(v) {\n        var w = this.index, x = this.results[w];\n        if ((!x || (x.type == \"header\"))) {\n            return\n        };\n        var y = this.items[w], z = k.scry(y, \"a\")[0];\n        if (x.song) {\n            if (z) {\n                n.inform(m.MUSIC_BUTTON.ACTIVATE, z);\n            };\n            (v && this.inform(\"highlight\", {\n                index: w,\n                selected: x\n            }));\n        }\n         else {\n            s.select.call(this, v);\n            if ((z && z.href)) {\n                if ((z.target == \"_blank\")) {\n                    window.open(z.href);\n                }\n                 else l(z.href);\n            \n            };\n        }\n    ;\n    };\n    t.prototype.setSid = function(v) {\n        this.queryData.tas = v;\n    };\n    t.prototype.getSeeMoreEndpoint = function(v) {\n        return p(this.seeMoreEndpoint).addQueryData(this.searchPageQueryData(v)).addQueryData(this.searchPageTypeData()).toString();\n    };\n    t.prototype.getInviteEndpoint = function(v) {\n        return p(\"/invite.php\").addQueryData({\n            email_list: v\n        });\n    };\n    t.prototype.show = function() {\n        if (!this.isVisible()) {\n            g.inform(\"layer_shown\", {\n                type: \"SearchTypeahead\"\n            });\n            s.show.call(this);\n        }\n    ;\n    };\n    t.prototype.hide = function() {\n        if (this.isVisible()) {\n            g.inform(\"layer_hidden\", {\n                type: \"SearchTypeahead\"\n            });\n            s.hide.call(this);\n        }\n    ;\n    };\n    t.prototype.getQuerySuggestion = function(v) {\n        var w = this.results[this.index], x = ((w && (w.type != \"header\")) ? w.text.toLowerCase() : \"\");\n        return ((x == v.toLowerCase()) ? \"\" : x);\n    };\n    t.prototype.setWebSuggLoggingParams = function(v, w) {\n        var x = 0, y = 0;\n        for (var z = 0; (z < w.length); z++) {\n            if ((w[z].type === \"websuggestion\")) {\n                if ((y === 0)) {\n                    y = (z + 1);\n                };\n                var aa = (((\"FR\" + ((z - x))) + \"AS\") + x), ba = (z + 1);\n                w[z].path += (((((\"&wssk=\" + aa) + \"&wssp=\") + ba) + \"&wspq=\") + encodeURIComponent(v));\n                w[z].path += (\"&wssrc=\" + w[z].websuggestion_source);\n                x++;\n            }\n        ;\n        };\n        var ca = (((((((\"&wssc=\" + w.length) + \"-\") + v.length) + \"&wsbp=\") + x) + \"-\") + y);\n        for (z = 0; (z < w.length); z++) {\n            if ((w[z].type === \"websuggestion\")) {\n                w[z].path += ca;\n            };\n        };\n    };\n    function u(v) {\n        var w, x, y, z, aa = [], ba = {\n        };\n        x = v.length;\n        for (w = 0; (w < x); w++) {\n            y = v[w];\n            z = (y.render_type || y.type);\n            if (!ba.hasOwnProperty(z)) {\n                ba[z] = aa.length;\n                aa.push([]);\n            }\n        ;\n            aa[ba[z]].push(y);\n        };\n        var ca = [];\n        x = aa.length;\n        for (w = 0; (w < x); ++w) {\n            y = aa[w][0];\n            z = (y.render_type || y.type);\n            ca = ca.concat(aa[w]);\n        };\n        return ca;\n    };\n    j(t.prototype, {\n        _shouldShowSeeMore: true,\n        _bucketize: true,\n        queryData: {\n            init: \"quick\"\n        }\n    });\n    e.exports = t;\n});\n__d(\"legacy:SearchTypeaheadView\", [\"SearchTypeaheadView\",], function(a, b, c, d) {\n    a.SearchTypeaheadView = b(\"SearchTypeaheadView\");\n}, 3);\n__d(\"legacy:Typeahead\", [\"Typeahead\",], function(a, b, c, d) {\n    a.Typeahead = b(\"Typeahead\");\n}, 3);\n__d(\"SearchTypeaheadRecorder\", [\"Event\",\"AsyncRequest\",\"Banzai\",\"Keys\",\"TypeaheadUtil\",\"Vector\",\"ge\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"Banzai\"), j = b(\"Keys\"), k = b(\"TypeaheadUtil\"), l = b(\"Vector\"), m = b(\"ge\"), n = b(\"clickRefAction\"), o = b(\"copyProperties\"), p = b(\"userAction\");\n    function q(s) {\n        this.init(s);\n        this.initEvents();\n    };\n    q.prototype.init = function(s) {\n        this.core = s.getCore();\n        this.data = s.getData();\n        this.view = s.getView();\n        this.element = this.core.getElement();\n        this.initTime = Date.now();\n        this._onloadTime = 0;\n        this._extraRecorder = [];\n        var t = m(\"search_first_focus\");\n        this.initStartTime = (t && t.value);\n        this.bootstrapStats = {\n            bootstrapped: 0\n        };\n        this._reset();\n    };\n    q.prototype._reset = function() {\n        this.stats = {\n        };\n        this.avgStats = {\n        };\n        this.appendStats = {\n        };\n        this._backspacing = false;\n        this.backendQueries = [];\n        this._topreplace = false;\n        this._inflightRequests = {\n        };\n        this._reorderInfo = null;\n        var s = Math.random().toString();\n        this.data.setQueryData({\n            sid: s\n        });\n        this.view.setSid(s);\n        this.recordStat(\"sid\", s);\n    };\n    q.prototype.initEvents = function() {\n        this.core.subscribe(\"focus\", function(event) {\n            if (!this.stats.session_start_time) {\n                this.recordStat(\"session_start_time\", Date.now());\n            };\n        }.bind(this));\n        this.core.subscribe(\"blur\", function(event) {\n            var s = Date.now();\n            for (var t in this._inflightRequests) {\n                var u = this._inflightRequests[t], v = (s - u);\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", v);\n            };\n            this.recordStat(\"session_end_time\", s);\n            this.submit();\n        }.bind(this));\n        this.view.subscribe(\"select\", function(s, t) {\n            this.recordSelectInfo(t);\n        }.bind(this));\n        this.view.subscribe(\"render\", function(s, t) {\n            this.recordRender(t);\n        }.bind(this));\n        this.view.subscribe(\"recordAfterReorder\", function(s, t) {\n            this._reorderInfo = o(this._reorderInfo, t);\n        }.bind(this));\n        this.data.subscribe(\"activity\", function(s, t) {\n            this.recordStat(\"pending_request\", t.activity);\n        }.bind(this));\n        this.data.subscribe(\"respondValidUids\", function(s, t) {\n            this.validUids = t.slice(0);\n        }.bind(this));\n        this.data.subscribe(\"beforeQuery\", function(s, t) {\n            if (!t.value) {\n                this.query = \"\";\n                this.results = [];\n                return;\n            }\n        ;\n            if (!this.stats.first_query_time) {\n                this.recordStat(\"first_query_time\", Date.now());\n            };\n            this.query = t.value;\n            this.recordCountStat(\"num_queries\");\n        }.bind(this));\n        this.data.subscribe(\"queryEndpoint\", function(s, t) {\n            this.recordCountStat(\"num_search_ajax_requests\");\n            this.recordAvgStat(\"endpoint_query_length\", t.value.length);\n            this._inflightRequests[t.value] = Date.now();\n        }.bind(this));\n        this.data.subscribe(\"onload\", function(s, t) {\n            this._onloadTime = t.time;\n        }.bind(this));\n        this.data.subscribe(\"bootstrapped\", function(s, t) {\n            this.bootstrapStats.endTime = t.time;\n            this.bootstrapStats.bootstrapped = 1;\n        }.bind(this));\n        this.core.subscribe(\"recordFunction\", function(s, t) {\n            this._extraRecorder.push(t);\n        }.bind(this));\n        this.data.subscribe(\"endpointStats\", function(s, t) {\n            var u = (t.fetch_end - t.fetch_start);\n            if (t.value) {\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", u);\n            }\n             else this.bootstrapStats[t.type] = u;\n        ;\n            if (t.coeff2_ts) {\n                this.bootstrapStats.coeff2_ts = t.coeff2_ts;\n            };\n            if ((typeof t.browserCacheHit != \"undefined\")) {\n                this.recordCountStat((t.browserCacheHit ? \"bootstrap_cachehits\" : \"bootstrap_cachemisses\"));\n            };\n            if (this._inflightRequests[t.value]) {\n                delete this._inflightRequests[t.value];\n            };\n        }.bind(this));\n        this.data.subscribe(\"query\", function(s, t) {\n            this.recordAvgStat(\"num_results_from_cache\", t.results.length);\n        }.bind(this));\n        this.data.subscribe(\"backend_topreplace\", function(s, t) {\n            if ((false === this._topreplace)) {\n                this.recordStat(\"backend_topreplace\", 1);\n                this._topreplace = true;\n            }\n        ;\n        }.bind(this));\n        g.listen(this.element, \"keydown\", function(event) {\n            if ((g.getKeyCode(event) == j.BACKSPACE)) {\n                if ((!this._backspacing && this.query)) {\n                    this._backspacing = true;\n                    this.recordAppendStat(\"before_backspace_queries\", this.query);\n                }\n            ;\n            }\n             else this._backspacing = false;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"beforeFetch\", function(s, t) {\n            var u = t.request.data.value;\n            if (!u) {\n                return\n            };\n            this.backendQueries.push(u);\n        }.bind(this));\n    };\n    q.prototype.recordStat = function(s, t) {\n        this.stats[s] = t;\n    };\n    q.prototype.recordCountStat = function(s) {\n        var t = this.stats[s];\n        this.stats[s] = (t ? (t + 1) : 1);\n    };\n    q.prototype.recordAvgStat = function(s, t) {\n        if (this.avgStats[s]) {\n            this.avgStats[s][0] += t;\n            ++this.avgStats[s][1];\n        }\n         else this.avgStats[s] = [t,1,];\n    ;\n    };\n    q.prototype.recordAppendStat = function(s, t) {\n        if (!this.appendStats.hasOwnProperty(s)) {\n            this.appendStats[s] = [];\n        };\n        this.appendStats[s].push(t);\n    };\n    q.prototype.recordRender = function(s) {\n        this.results = s.filter(function(u) {\n            return ((((u.uid != \"search\") && (u.type != \"disabled_result\")) && (u.type != \"header\")));\n        }).map(function(u) {\n            return o(null, u);\n        });\n        var t = l.getViewportDimensions();\n        this.recordStat(\"window_size_width\", t.x);\n        this.recordStat(\"window_size_height\", t.y);\n        if (((this.results.length > 0) && !this.stats.first_result_time)) {\n            this.recordStat(\"first_result_time\", Date.now());\n        };\n    };\n    q.prototype.recordSelectInfo = function(s) {\n        var t = s.selected, u = s.index;\n        if ((t.groupIndex !== undefined)) {\n            u = ((s.index - t.groupIndex) - 1);\n        };\n        var v = {\n            href: t.path\n        }, w = (t.dataGT ? {\n            gt: JSON.parse(t.dataGT)\n        } : {\n        });\n        n(\"click\", v, null, null, w);\n        p(\"search\").uai(\"click\");\n        if ((t.uid == \"search\")) {\n            this.recordStat(\"selected_search\", 1);\n        }\n         else if ((t.uid == \"invite\")) {\n            this.recordStat(\"selected_invite\", 1);\n        }\n         else {\n            var x = ((t.rankType || t.render_type) || t.type), y = (((x == \"friend\") ? \"user\" : x));\n            this.recordStat((\"selected_\" + y), 1);\n            this.recordStat(\"selected_position\", u);\n            this.recordStat(\"selected_type\", x);\n            this.recordStat(\"selected_name_length\", t.text.length);\n            this.recordStat(\"selected_id\", t.uid);\n            this.recordStat(\"selected_degree\", (t.bootstrapped ? 1 : 2));\n            var z = k.parse(this.data.getTextToIndex(t)).tokens, aa = r(z, this.query);\n            if (aa) {\n                this.recordStat(\"matched_terms\", aa);\n            };\n        }\n        \n    ;\n        var ba = {\n        };\n        this._extraRecorder.forEach(function(ca) {\n            ca(s, this.results, ba);\n        }.bind(this));\n        this.recordStat(\"extra_select_info\", JSON.stringify(ba));\n        if ((t.type === \"websuggestion\")) {\n            this.recordStat(\"selected_memcached_websuggestion\", t.fromMemcache);\n            this.recordStat(\"selected_websuggestion_source\", t.websuggestion_source);\n        }\n    ;\n        this.recordStat(\"selected_with_mouse\", (s.clicked ? 1 : 0));\n    };\n    q.prototype._dataToSubmit = function() {\n        this.recordStat(\"candidate_results\", this.buildResults());\n        this.recordStat(\"query\", this.query);\n        this.recordStat(\"init_time\", this.initTime);\n        if (this.initStartTime) {\n            this.recordStat(\"init_start_time\", this.initStartTime);\n            this.recordStat(\"onload_time\", this._onloadTime);\n            this.initStartTime = 0;\n        }\n    ;\n        this.recordStat(\"bootstrapped\", this.bootstrapStats.bootstrapped);\n        if (this.bootstrapStats.endTime) {\n            this.recordStat(\"bootstrapped_time\", this.bootstrapStats.endTime);\n            this.recordStat(\"user_bootstrap_ms\", this.bootstrapStats.user);\n            this.recordStat(\"other_bootstrap_ms\", this.bootstrapStats.other);\n            this.bootstrapStats.endTime = 0;\n        }\n    ;\n        this.recordStat(\"coeff2_ts\", this.bootstrapStats.coeff2_ts);\n        this.recordStat(\"max_results\", this.data._maxResults);\n        if ((this.backendQueries.length > 0)) {\n            if ((this.backendQueries.length > this.data.logBackendQueriesWindow)) {\n                this.backendQueries = this.backendQueries.slice((this.backendQueries.length - this.data.logBackendQueriesWindow));\n            };\n            this.recordStat(\"backend_queries\", this.backendQueries);\n        }\n    ;\n        if (this._reorderInfo) {\n            var s = this._reorderInfo;\n            s.organic.forEach(function(x) {\n                delete x.text;\n            });\n            this.recordStat(\"s_count\", s.position_data.length);\n            this.recordStat(\"s_bootstrap_id\", s.s_bootstrap_id);\n            this.recordStat(\"s_organic_results\", JSON.stringify(s.organic));\n            this.recordStat(\"s_candidate_tokens\", JSON.stringify(s.tokens));\n            this.recordStat(\"s_positions\", JSON.stringify(s.position_data));\n            this.recordStat(\"s_options\", JSON.stringify(s.options));\n            this.recordStat(\"s_variant\", JSON.stringify(s.variant));\n        }\n    ;\n        var t = this.stats;\n        for (var u in this.avgStats) {\n            var v = this.avgStats[u];\n            t[u] = (v[0] / v[1]);\n        };\n        for (var w in this.appendStats) {\n            t[w] = JSON.stringify(this.appendStats[w]);;\n        };\n        return t;\n    };\n    q.prototype.buildResults = function() {\n        var s = ((this.results || [])).map(function(t, u) {\n            var v = k.parse(this.data.getTextToIndex(t)).tokens, w = ((t.rankType || t.render_type) || t.type), x = (t.bootstrapped ? 1 : 0), y = (t.s_token || \"\"), z = (r(v, this.query) || this.query), aa = t.index_rank, ba = t.match_type, ca = t.prefix_match, da = t.prefix_length;\n            if ((typeof t.groupIndex == \"number\")) {\n                return [t.groupIndex,t.indexInGroup,t.uid,w,x,y,z,aa,ba,ca,da,t.origIndex,]\n            };\n            return [0,u,t.uid,w,x,y,z,aa,ba,ca,da,t.origIndex,];\n        }.bind(this));\n        return JSON.stringify(s);\n    };\n    q.prototype.submit = function() {\n        var s = this._dataToSubmit();\n        switch (this.data.recordingRoute) {\n          case \"double_recording\":\n            if ((Math.random() > 114675)) {\n                s.recorded_first = \"legacy\";\n                setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n            }\n             else {\n                s.recorded_first = \"banzai\";\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n                setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n            }\n        ;\n            break;\n          case \"random_recording\":\n            if ((Math.random() > 114999)) {\n                this.submitThroughAsyncRequest(s);\n            }\n             else i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n        ;\n            break;\n          case \"banzai_basic\":\n            i.post(this._banzaiRoute, s);\n            break;\n          case \"banzai_vital\":\n            i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n            break;\n          default:\n            this.submitThroughAsyncRequest(s);\n        };\n        this._reset();\n    };\n    q.prototype.submitThroughAsyncRequest = function(s) {\n        if ((Object.keys(s).length > 0)) {\n            new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                stats: s\n            }).setOption(\"handleErrorAfterUnload\", true).setErrorHandler(function(t) {\n                s.retry = true;\n                new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                    stats: s\n                }).setOption(\"asynchronous\", false).send();\n            }.bind(this)).send();\n        };\n    };\n    var r = function(s, t) {\n        var u = k.parse(t);\n        if ((u.flatValue[(u.flatValue.length - 1)] === \" \")) {\n            return u.flatValue\n        };\n        var v = u.tokens[(u.tokens.length - 1)], w = {\n        };\n        s.forEach(function(ba) {\n            w[ba] = (((w[ba] || 0)) + 1);\n        });\n        var x = {\n        }, y = u.tokens.slice(0, (u.tokens.length - 1));\n        y.forEach(function(ba) {\n            x[ba] = (((x[ba] || 0)) + 1);\n        });\n        for (var z = 0; (z < s.length); ++z) {\n            var aa = s[z];\n            if (((aa.indexOf(v) === 0) && (((w[aa] - ((x[aa] || 0))) > 0)))) {\n                y.push(aa);\n                return y.join(\" \");\n            }\n        ;\n        };\n        return undefined;\n    };\n    o(q.prototype, {\n        _endPoint: \"/ajax/typeahead/record_metrics.php\",\n        _banzaiRoute: \"search\"\n    });\n    e.exports = q;\n});\n__d(\"TypeaheadSearchRecorderBasic\", [\"SearchTypeaheadRecorder\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"SearchTypeaheadRecorder\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this._typeahead = k;\n    };\n    j.prototype.enable = function() {\n        new g(this._typeahead);\n    };\n    h(j.prototype, {\n        disable: i\n    });\n    e.exports = j;\n});\n__d(\"legacy:SearchRecorderBasicTypeaheadBehavior\", [\"TypeaheadSearchRecorderBasic\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchRecorderBasic\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.searchRecorderBasic = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"SearchTypeaheadRenderer\", [\"Badge\",\"DOM\",\"Env\",\"MusicButtonManager\",\"TypeaheadFacepile\",\"TypeaheadUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"MusicButtonManager\"), k = b(\"TypeaheadFacepile\"), l = b(\"TypeaheadUtil\");\n    function m(n, o) {\n        var p = [], q = (n.photos || n.photo);\n        if (q) {\n            if ((q instanceof Array)) {\n                q = k.render(q);\n            }\n             else q = h.create(\"img\", {\n                alt: \"\",\n                src: q\n            });\n        ;\n            p.push(q);\n            if (n.song) {\n                p.push(h.create(\"span\", {\n                    className: \"playButton\"\n                }));\n                p.push(h.create(\"span\", {\n                    className: \"playLoader\"\n                }));\n            }\n        ;\n        }\n    ;\n        var r;\n        if (n.text) {\n            var s = n.alias, t = this.value, u = n.text;\n            r = [u,];\n            if (((s && l.isQueryMatch(t, s)) && !l.isQueryMatch(t, u))) {\n                r.push(h.create(\"span\", {\n                    className: \"alias\"\n                }, [(\" \\u00b7 \" + s),]));\n            };\n            if (n.verified) {\n                r.push(g(\"xsmall\"));\n            };\n            p.push(h.create(\"span\", {\n                className: \"text\"\n            }, r));\n        }\n    ;\n        if (n.category) {\n            var v = [n.category,];\n            if (n.is_external) {\n                v.push(h.create(\"span\", {\n                    className: \"arrow\"\n                }));\n            };\n            var w = (n.message ? \"preCategory\" : \"category\");\n            p.push(h.create(\"span\", {\n                className: w\n            }, v));\n        }\n    ;\n        if (n.message) {\n            p.push(h.create(\"span\", {\n                className: \"category\"\n            }, [n.message,]));\n        };\n        var x = (n.subtextOverride || n.subtext);\n        if (x) {\n            p.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [x,]));\n        };\n        var y = ((n.classNames || n.type) || \"\"), z = (n.is_external ? \"_blank\" : \"\"), aa = ((!n.song && n.path) || \"\");\n        if (aa) {\n            if (!(/^https?\\:\\/\\//).test(aa)) {\n                aa = (i.www_base + aa.substr(1));\n            };\n            aa += ((((aa.indexOf(\"?\") > 0) ? \"&\" : \"?\")) + \"ref=ts&fref=ts\");\n        }\n    ;\n        var ba = h.create(\"a\", {\n            href: aa,\n            rel: \"ignore\",\n            target: z\n        }, p);\n        if (n.song) {\n            ba.id = (\"mb_\" + (((Math.random() * 1000000) | 0)));\n            j.addButton.curry(n.song.provider, ba.id, n.song.url, n.song.context, n.song.media_type).defer();\n            ba.onclick = this.ignoreClick;\n        }\n    ;\n        var ca = h.create(\"li\", {\n            className: y\n        }, [ba,]);\n        if (n.text) {\n            ca.setAttribute(\"aria-label\", n.text);\n        };\n        return ca;\n    };\n    m.className = \"search\";\n    e.exports = m;\n});\n__d(\"legacy:SearchTypeaheadRenderer\", [\"SearchTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    };\n    a.TypeaheadRenderers.search = b(\"SearchTypeaheadRenderer\");\n}, 3);\nvoid (0);\n__d(\"TypeaheadSearchFilter\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n    i.prototype.enable = function() {\n        var j = this._typeahead, k = j.getView().seeMoreEndpoint;\n        this._subscriptions = [g.subscribe(\"search/typeahead/updateFilter\", function(l, m) {\n            if ((m.filter_type == \"web\")) {\n                j.getView().queryData.form = \"FBKBFR\";\n            };\n            j.getView().queryData.type = m.filter_type;\n        }),g.subscribe(\"search/typeahead/updateSeeMoreEndpoint\", function(l, m) {\n            j.getView().seeMoreEndpoint = m;\n        }),g.subscribe(\"page_transition\", function(l, m) {\n            if (j.getView().queryData.form) {\n                delete j.getView().queryData.form;\n            };\n            delete j.getView().queryData.type;\n            j.getView().seeMoreEndpoint = k;\n        }, g.SUBSCRIBE_NEW),];\n    };\n    i.prototype.disable = function() {\n        this._subscriptions.forEach(function(j) {\n            j.unsubscribe();\n        });\n        this._subscriptions = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:SearchFilterTypeaheadBehavior\", [\"TypeaheadSearchFilter\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchFilter\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.initFilters = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypeaheadDetectQueryLocale\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this._typeahead = h;\n        this._data = h.getData();\n        this._queryCache = {\n            \"\": this._data.queryCache,\n            ja_JP: {\n            },\n            zh_TW: {\n            }\n        };\n    };\n    g.prototype.enable = function() {\n        this._previousLocale = \"\";\n        this._reset = this._typeahead.subscribe(\"reset\", this._swapQueryCache.bind(this, \"\"));\n        this._beforeQuery = this._data.subscribe(\"beforeQuery\", function(h, i) {\n            var j = i.value;\n            if ((j === \"\")) {\n                this._swapQueryCache(\"\");\n                return;\n            }\n        ;\n            var k = null, l = j.charCodeAt((j.length - 1));\n            if (((12352 <= l) && (l <= 12543))) {\n                k = \"ja_JP\";\n            }\n             else if (((12544 <= l) && (l <= 12735))) {\n                k = \"zh_TW\";\n            }\n        ;\n            this._swapQueryCache(k);\n        }.bind(this));\n    };\n    g.prototype.disable = function() {\n        this._swapQueryCache(\"\");\n        this._data.unsubscribe(this._beforeQuery);\n        this._typeahead.ubsubscribe(this._reset);\n    };\n    g.prototype._swapQueryCache = function(h) {\n        if (((h === null) || (h === this._previousLocale))) {\n            return\n        };\n        this._data.queryCache = this._queryCache[h];\n        this._data.setQueryData({\n            query_locale: h\n        });\n        this._previousLocale = h;\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadDisableBucketization\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i(j) {\n        this._typeahead = j;\n    };\n    i.prototype.enable = function() {\n        this._typeahead.getView().disableBucketization();\n        this._typeahead.getData().inform(\"recordFunction\", function(j, k, l) {\n            l.bucketization_disabled = 1;\n        });\n    };\n    g(i.prototype, {\n        disable: h.thatReturns\n    });\n    e.exports = i;\n});\n__d(\"TypeaheadExcludeBootstrapFromQueryCache\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this._data = h.getData();\n    };\n    g.prototype.enable = function() {\n        this._buildingQueryCache = false;\n        this._buildQueryCache = this._data.subscribe(\"buildQueryCache\", function() {\n            this._buildingQueryCache = true;\n        }.bind(this));\n        this._mergeUids = this._data.subscribe(\"mergeUids\", function(h, i) {\n            if (this._buildingQueryCache) {\n                i.local_uids.splice(0, i.local_uids.length);\n            };\n        }.bind(this));\n        this._fetchComplete = this._data.subscribe(\"fetchComplete\", function() {\n            this._buildingQueryCache = false;\n        }.bind(this));\n    };\n    g.prototype.disable = function() {\n        this._data.unsubscribe(this._buildQueryCache);\n        this._data.unsubscribe(this._mergeUids);\n        this._data.unsubscribe(this._fetchComplete);\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchBrowseUpsell\", [\"Arbiter\",\"CSS\",\"DOM\",\"Event\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = \"TypeaheadSearchBrowseUpsell/form\";\n    function n(o) {\n        this._typeahead = o;\n        this._form = null;\n        g.subscribe(m, this._registerForm.bind(this));\n    };\n    n.prototype._registerForm = function(o, p) {\n        this._form = p.cloneNode(true);\n        i.scry(this._form, \"button\").forEach(function(q) {\n            h.removeClass(q, \"selected\");\n        });\n        j.listen(this._form, \"success\", function() {\n            this._typeahead.view.hide();\n            h.addClass(this._form, \"browseSuccess\");\n        }.bind(this));\n    };\n    n.prototype.addUpsell = function(o) {\n        if (this._form) {\n            var p = i.create(\"li\", {\n                className: \"browseUpsell\"\n            }, this._form);\n            o.push({\n                type: \"disabled_result\",\n                uid: \"upsell\",\n                node: p\n            });\n        }\n    ;\n    };\n    n.prototype.decorateSeeMore = function(o) {\n        var p = o[(o.length - 1)];\n        if ((p && (p.uid === \"search\"))) {\n            h.addClass(p.node, \"browseMore\");\n        };\n    };\n    n.prototype.showUpsell = function() {\n        var o = this._typeahead.view;\n        return (o._shouldShowSeeMore && !h.hasClass(o.element, \"typeaheadViewLoading\"));\n    };\n    n.prototype.enable = function() {\n        this._typeahead.subscribe(\"beforeRender\", function(o, p) {\n            var q = p.results.length;\n            if ((q && this.showUpsell())) {\n                this.decorateSeeMore(p.results);\n                this.addUpsell(p.results);\n            }\n        ;\n        }.bind(this));\n    };\n    n.registerForm = function(o) {\n        g.inform(m, o, g.BEHAVIOR_STATE);\n    };\n    k(n.prototype, {\n        disable: l\n    });\n    e.exports = n;\n});\n__d(\"TypeaheadRegulateMemorializedUsers\", [\"copyProperties\",\"TypeaheadUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"TypeaheadUtil\");\n    function i(j) {\n        this._typeahead = j;\n    };\n    g(i.prototype, {\n        _filterRegistry: null,\n        _filter: function(j, k) {\n            if (((j.type !== \"user\") || !j.memorialized)) {\n                return true\n            };\n            var l = h.parse(j.text).tokens;\n            if (((l.length === 1) && h.isExactMatch(k, j.text))) {\n                return true\n            };\n            var m = this._typeahead.getData().getTextToIndex(j), n = h.parse(k).tokens;\n            return (((n.length > 1) && h.isQueryMatch(k, m)));\n        },\n        enable: function() {\n            this._filterRegistry = this._typeahead.getData().addFilter(this._filter.bind(this));\n        },\n        disable: function() {\n            this._filterRegistry.remove();\n            this._filterRegistry = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:RegulateMemorializedUsersTypeaheadBehavior\", [\"TypeaheadRegulateMemorializedUsers\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadRegulateMemorializedUsers\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.regulateMemorializedUsers = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);");
// 8809
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s48bc6385ad36661d437816c45525368eecdb65f2");
// 8810
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"hfrQl\",]);\n}\n;\n;\n__d(\"FriendBrowserCheckboxController\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"Form\",\"OnVisible\",\"$\",\"bind\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Form\"), l = b(\"OnVisible\"), m = b(\"$\"), n = b(\"bind\"), o = b(\"copyProperties\"), p = b(\"ge\");\n    function q() {\n    \n    };\n;\n    o(q, {\n        instances: {\n        },\n        getInstance: function(r) {\n            return this.instances[r];\n        }\n    });\n    o(q.prototype, {\n        init: function(r, s, t, u) {\n            q.instances[r] = this;\n            this._id = r;\n            this._simplified = t;\n            this._infiniteScroll = u;\n            this._form = s;\n            this._contentGrid = i.JSBNG__find(s, \".friendBrowserCheckboxContentGrid\");\n            this._loadingIndicator = i.JSBNG__find(s, \".friendBrowsingCheckboxContentLoadingIndicator\");\n            this._checkboxResults = i.JSBNG__find(s, \".friendBrowserCheckboxResults\");\n            this._contentPager = i.JSBNG__find(s, \".friendBrowserCheckboxContentPager\");\n            this.numGetNewRequests = 0;\n            this.queuedRequests = {\n            };\n            j.listen(this._form, \"submit\", this.onFormSubmit.bind(this));\n        },\n        addTypeahead: function(r, s) {\n            r.subscribe(\"select\", this.onHubSelect.bind(this, r, s));\n            if (this._simplified) {\n                r.subscribe(\"unselect\", this.onHubSelect.bind(this, r, s));\n            }\n        ;\n        ;\n        },\n        onFormSubmit: function() {\n            this.getNew(true);\n            return false;\n        },\n        addSelector: function(r) {\n            r.subscribe(\"change\", this.getNew.bind(this, false));\n        },\n        onHubSelect: function(r, s, JSBNG__event, t) {\n            if (this._simplified) {\n                this.getNew(true);\n                return;\n            }\n        ;\n        ;\n            if (!((((JSBNG__event == \"select\")) && t.selected))) {\n                return;\n            }\n        ;\n        ;\n            var u = this.buildNewCheckbox(s, t.selected.text, t.selected.uid), v = i.JSBNG__find(this._form, ((\".checkboxes_\" + s)));\n            i.appendContent(v.firstChild, u);\n            var w = i.scry(r.getElement(), \"input[type=\\\"button\\\"]\");\n            if (((w && w[0]))) {\n                w[0].click();\n            }\n        ;\n        ;\n            this.getNew(true);\n        },\n        buildNewCheckbox: function(r, s, t) {\n            var u = ((((r + \"_ids_\")) + t)), v = ((r + \"_ids[]\")), w = i.create(\"input\", {\n                id: u,\n                type: \"checkbox\",\n                value: t,\n                JSBNG__name: v,\n                checked: true\n            });\n            j.listen(w, \"click\", n(this, \"getNew\", false));\n            var x = i.create(\"td\", null, w);\n            h.addClass(x, \"vTop\");\n            h.addClass(x, \"hLeft\");\n            var y = i.create(\"label\", null, s), z = i.create(\"td\", null, y);\n            h.addClass(z, \"vMid\");\n            h.addClass(z, \"hLeft\");\n            var aa = i.create(\"tr\");\n            aa.appendChild(x);\n            aa.appendChild(z);\n            return aa;\n        },\n        showMore: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (!r) {\n                return false;\n            }\n        ;\n        ;\n            if (h.hasClass(r, \"async_saving\")) {\n                return false;\n            }\n        ;\n        ;\n            var s = this.numGetNewRequests, t = k.serialize(this._form);\n            t.show_more = true;\n            var u = new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(v) {\n                this.showMoreHandler(v, s);\n            })).setStatusElement(r).send();\n        },\n        showMoreHandler: function(r, s) {\n            if (((s == this.numGetNewRequests))) {\n                var t = r.payload;\n                i.appendContent(this._contentGrid, t.results);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        ;\n        },\n        getNew: function(r) {\n            this.numGetNewRequests++;\n            var s = this.numGetNewRequests;\n            h.addClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n            if (p(\"friendBrowserCI\")) {\n                h.addClass(m(\"friendBrowserCI\"), \"friendBrowserCheckboxContentOnload\");\n            }\n        ;\n        ;\n            h.show(this._loadingIndicator);\n            var t = k.serialize(this._form);\n            t.used_typeahead = r;\n            new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(u) {\n                this.getNewHandler(u, s);\n            })).send();\n        },\n        getNewHandler: function(r, s) {\n            if (((s == this.numGetNewRequests))) {\n                var t = r.payload;\n                i.setContent(this._contentGrid, t.results);\n                h.removeClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n                if (p(\"friendBrowserCI\")) {\n                    h.hide(m(\"friendBrowserCI\"));\n                }\n            ;\n            ;\n                h.hide(this._loadingIndicator);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        ;\n        },\n        updatePagerAndExtraData: function(r, s) {\n            i.setContent(this._contentPager, r);\n            if (this._infiniteScroll) {\n                this.setupOnVisible();\n            }\n        ;\n        ;\n            i.replace(this._form.elements.extra_data, s);\n        },\n        setupOnVisible: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (((r && ((this._id != \"jewel\"))))) {\n                ((this._onVisible && this._onVisible.remove()));\n                this._onVisible = new l(r, n(this, \"showMore\"), false, 1000);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = q;\n});\n__d(\"legacy:friend-browser-checkbox-js\", [\"FriendBrowserCheckboxController\",], function(a, b, c, d) {\n    a.FriendBrowserCheckboxController = b(\"FriendBrowserCheckboxController\");\n}, 3);\n__d(\"FacebarResultStoreUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        processEntityResult: function(h, i, j, k) {\n            var l = {\n                semantic: i.toString(),\n                structure: [{\n                    type: ((\"ent:\" + h)),\n                    text: j,\n                    uid: i\n                },],\n                type: ((((\"{\" + h)) + \"}\")),\n                cost: k,\n                cache_id_length: 0,\n                bolding: []\n            };\n            l.tuid = JSON.stringify({\n                semantic: l.semantic,\n                structure: l.structure\n            });\n            return l;\n        }\n    };\n    e.exports = g;\n});\n__d(\"HashtagParser\", [\"URLMatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"URLMatcher\"), h = 100, i = 30, j = /@\\[([0-9]+):([0-9]+):((?:[^\\\\\\]]*(?:\\\\.)*)*)\\]/g;\n    function k() {\n        var da = ((((((((((((((((((((((((((((((((\"\\u00c0-\\u00d6\" + \"\\u00d8-\\u00f6\")) + \"\\u00f8-\\u00ff\")) + \"\\u0100-\\u024f\")) + \"\\u0253-\\u0254\")) + \"\\u0256-\\u0257\")) + \"\\u0259\")) + \"\\u025b\")) + \"\\u0263\")) + \"\\u0268\")) + \"\\u026f\")) + \"\\u0272\")) + \"\\u0289\")) + \"\\u028b\")) + \"\\u02bb\")) + \"\\u0300-\\u036f\")) + \"\\u1e00-\\u1eff\")), ea = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\"\\u0400-\\u04ff\" + \"\\u0500-\\u0527\")) + \"\\u2de0-\\u2dff\")) + \"\\ua640-\\ua69f\")) + \"\\u0591-\\u05bf\")) + \"\\u05c1-\\u05c2\")) + \"\\u05c4-\\u05c5\")) + \"\\u05c7\")) + \"\\u05d0-\\u05ea\")) + \"\\u05f0-\\u05f4\")) + \"\\ufb12-\\ufb28\")) + \"\\ufb2a-\\ufb36\")) + \"\\ufb38-\\ufb3c\")) + \"\\ufb3e\")) + \"\\ufb40-\\ufb41\")) + \"\\ufb43-\\ufb44\")) + \"\\ufb46-\\ufb4f\")) + \"\\u0610-\\u061a\")) + \"\\u0620-\\u065f\")) + \"\\u066e-\\u06d3\")) + \"\\u06d5-\\u06dc\")) + \"\\u06de-\\u06e8\")) + \"\\u06ea-\\u06ef\")) + \"\\u06fa-\\u06fc\")) + \"\\u06ff\")) + \"\\u0750-\\u077f\")) + \"\\u08a0\")) + \"\\u08a2-\\u08ac\")) + \"\\u08e4-\\u08fe\")) + \"\\ufb50-\\ufbb1\")) + \"\\ufbd3-\\ufd3d\")) + \"\\ufd50-\\ufd8f\")) + \"\\ufd92-\\ufdc7\")) + \"\\ufdf0-\\ufdfb\")) + \"\\ufe70-\\ufe74\")) + \"\\ufe76-\\ufefc\")) + \"\\u200c-\\u200c\")) + \"\\u0e01-\\u0e3a\")) + \"\\u0e40-\\u0e4e\")) + \"\\u1100-\\u11ff\")) + \"\\u3130-\\u3185\")) + \"\\ua960-\\ua97f\")) + \"\\uac00-\\ud7af\")) + \"\\ud7b0-\\ud7ff\")) + \"\\uffa1-\\uffdc\")), fa = String.fromCharCode, ga = ((((((((((((((((((((((((((((((((\"\\u30a1-\\u30fa\\u30fc-\\u30fe\" + \"\\uff66-\\uff9f\")) + \"\\uff10-\\uff19\\uff21-\\uff3a\")) + \"\\uff41-\\uff5a\")) + \"\\u3041-\\u3096\\u3099-\\u309e\")) + \"\\u3400-\\u4dbf\")) + \"\\u4e00-\\u9fff\")) + fa(173824))) + \"-\")) + fa(177983))) + fa(177984))) + \"-\")) + fa(178207))) + fa(194560))) + \"-\")) + fa(195103))) + \"\\u3003\\u3005\\u303b\")), ha = ((((da + ea)) + ga)), ia = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\"A-Za-z\\u00aa\\u00b5\\u00ba\\u00c0-\\u00d6\\u00d8-\\u00f6\" + \"\\u00f8-\\u0241\\u0250-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ee\\u037a\\u0386\")) + \"\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03ce\\u03d0-\\u03f5\\u03f7-\\u0481\")) + \"\\u048a-\\u04ce\\u04d0-\\u04f9\\u0500-\\u050f\\u0531-\\u0556\\u0559\\u0561-\\u0587\")) + \"\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0621-\\u063a\\u0640-\\u064a\\u066e-\\u066f\")) + \"\\u0671-\\u06d3\\u06d5\\u06e5-\\u06e6\\u06ee-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\")) + \"\\u0712-\\u072f\\u074d-\\u076d\\u0780-\\u07a5\\u07b1\\u0904-\\u0939\\u093d\\u0950\")) + \"\\u0958-\\u0961\\u097d\\u0985-\\u098c\\u098f-\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\")) + \"\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc-\\u09dd\\u09df-\\u09e1\\u09f0-\\u09f1\")) + \"\\u0a05-\\u0a0a\\u0a0f-\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32-\\u0a33\")) + \"\\u0a35-\\u0a36\\u0a38-\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\")) + \"\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2-\\u0ab3\\u0ab5-\\u0ab9\\u0abd\")) + \"\\u0ad0\\u0ae0-\\u0ae1\\u0b05-\\u0b0c\\u0b0f-\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\")) + \"\\u0b32-\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c-\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\")) + \"\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99-\\u0b9a\\u0b9c\\u0b9e-\\u0b9f\")) + \"\\u0ba3-\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0c05-\\u0c0c\\u0c0e-\\u0c10\")) + \"\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c60-\\u0c61\\u0c85-\\u0c8c\")) + \"\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\")) + \"\\u0ce0-\\u0ce1\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d28\\u0d2a-\\u0d39\")) + \"\\u0d60-\\u0d61\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\")) + \"\\u0e01-\\u0e30\\u0e32-\\u0e33\\u0e40-\\u0e46\\u0e81-\\u0e82\\u0e84\\u0e87-\\u0e88\")) + \"\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\")) + \"\\u0eaa-\\u0eab\\u0ead-\\u0eb0\\u0eb2-\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\")) + \"\\u0edc-\\u0edd\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6a\\u0f88-\\u0f8b\\u1000-\\u1021\")) + \"\\u1023-\\u1027\\u1029-\\u102a\\u1050-\\u1055\\u10a0-\\u10c5\\u10d0-\\u10fa\\u10fc\")) + \"\\u1100-\\u1159\\u115f-\\u11a2\\u11a8-\\u11f9\\u1200-\\u1248\\u124a-\\u124d\")) + \"\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\")) + \"\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\")) + \"\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\")) + \"\\u166f-\\u1676\\u1681-\\u169a\\u16a0-\\u16ea\\u1700-\\u170c\\u170e-\\u1711\")) + \"\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\")) + \"\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\")) + \"\\u1980-\\u19a9\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1d00-\\u1dbf\\u1e00-\\u1e9b\")) + \"\\u1ea0-\\u1ef9\\u1f00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\")) + \"\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\")) + \"\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\")) + \"\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u2094\\u2102\\u2107\")) + \"\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\")) + \"\\u212f-\\u2131\\u2133-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u2c00-\\u2c2e\")) + \"\\u2c30-\\u2c5e\\u2c80-\\u2ce4\\u2d00-\\u2d25\\u2d30-\\u2d65\\u2d6f\\u2d80-\\u2d96\")) + \"\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\")) + \"\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3006\\u3031-\\u3035\")) + \"\\u303b-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\")) + \"\\u3105-\\u312c\\u3131-\\u318e\\u31a0-\\u31b7\\u31f0-\\u31ff\\u3400-\\u4db5\")) + \"\\u4e00-\\u9fbb\\ua000-\\ua48c\\ua800-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\")) + \"\\ua80c-\\ua822\\uac00-\\ud7a3\\uf900-\\ufa2d\\ufa30-\\ufa6a\\ufa70-\\ufad9\")) + \"\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\")) + \"\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\")) + \"\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\")) + \"\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\")) + \"\\uffda-\\uffdc\")), ja = ((((((((((((((((((((((((((((((((((((((((\"\\u0300-\\u036f\\u0483-\\u0486\\u0591-\\u05b9\\u05bb-\\u05bd\\u05bf\" + \"\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u0610-\\u0615\\u064b-\\u065e\\u0670\")) + \"\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\")) + \"\\u07a6-\\u07b0\\u0901-\\u0903\\u093c\\u093e-\\u094d\\u0951-\\u0954\\u0962-\\u0963\")) + \"\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7-\\u09c8\\u09cb-\\u09cd\\u09d7\")) + \"\\u09e2-\\u09e3\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\")) + \"\\u0a70-\\u0a71\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\")) + \"\\u0ae2-\\u0ae3\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b43\\u0b47-\\u0b48\\u0b4b-\\u0b4d\")) + \"\\u0b56-\\u0b57\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\")) + \"\\u0c01-\\u0c03\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56\")) + \"\\u0c82-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5-\\u0cd6\")) + \"\\u0d02-\\u0d03\\u0d3e-\\u0d43\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d82-\\u0d83\")) + \"\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2-\\u0df3\\u0e31\\u0e34-\\u0e3a\")) + \"\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\")) + \"\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f3f\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f90-\\u0f97\")) + \"\\u0f99-\\u0fbc\\u0fc6\\u102c-\\u1032\\u1036-\\u1039\\u1056-\\u1059\\u135f\")) + \"\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17b6-\\u17d3\\u17dd\")) + \"\\u180b-\\u180d\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u19b0-\\u19c0\\u19c8-\\u19c9\")) + \"\\u1a17-\\u1a1b\\u1dc0-\\u1dc3\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20eb\\u302a-\\u302f\")) + \"\\u3099-\\u309a\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ufb1e\\ufe00-\\ufe0f\")) + \"\\ufe20-\\ufe23\")), ka = ((((((((\"0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u0966-\\u096f\\u09e6-\\u09ef\" + \"\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\")) + \"\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\")) + \"\\u1040-\\u1049\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\")) + \"\\uff10-\\uff19\")), la = ((((ia + ja)) + ha)), ma = ((ka + \"_\")), na = ((la + ma)), oa = ((((\"[\" + la)) + \"]\")), pa = ((((\"[\" + na)) + \"]\")), qa = ((((\"^|$|[^&\" + na)) + \"]\")), ra = \"[#\\\\uFF03]\", sa = ((((((((((((((((((\"(\" + qa)) + \")(\")) + ra)) + \")(\")) + pa)) + \"*\")) + oa)) + pa)) + \"*)\"));\n        return new RegExp(sa, \"ig\");\n    };\n;\n    function l(da) {\n        var ea = y(da), fa = 0, ga = 0;\n        return n(da).map(function(ha) {\n            while (((fa < ea.length))) {\n                var ia = ea[fa], ja = ((ia.offset - ga));\n                if (((ja < ha.offset))) {\n                    ga += ((ia.token.length - ia.JSBNG__name.length));\n                    fa++;\n                }\n                 else break;\n            ;\n            ;\n            };\n        ;\n            return {\n                marker: ha.marker,\n                tag: ha.hashtag,\n                rawOffset: ((ha.offset + ga)),\n                offset: ha.offset\n            };\n        });\n    };\n;\n    function m(da) {\n        return o(da, t(da));\n    };\n;\n    function n(da) {\n        var ea = aa(da);\n        return o(ea, p(da, ea));\n    };\n;\n    function o(da, ea) {\n        return r(da).slice(0, i).filter(function(fa) {\n            var ga = v(fa.offset, fa.hashtag.length, ea);\n            return ((!ga && ((fa.hashtag.length <= h))));\n        });\n    };\n;\n    function p(da, ea) {\n        return u(s(da), t(ea));\n    };\n;\n    var q = k();\n    function r(da) {\n        var ea = [];\n        da.replace(q, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                marker: ha,\n                hashtag: ia,\n                offset: ((ja + ga.length))\n            });\n        });\n        return ea;\n    };\n;\n    function s(da) {\n        return ba(da).map(function(ea) {\n            return [ea.offset,ea.JSBNG__name.length,];\n        });\n    };\n;\n    function t(da) {\n        var ea = [], fa, ga = 0;\n        while ((fa = g.permissiveMatch(da))) {\n            var ha = da.indexOf(fa);\n            ea.push([((ga + ha)),fa.length,]);\n            da = da.substring(((ha + fa.length)));\n            ga += ((ha + fa.length));\n        };\n    ;\n        return ea;\n    };\n;\n    function u(da, ea) {\n        var fa = [], ga = 0, ha = 0, ia = 0;\n        while (((((ga < da.length)) && ((ha < ea.length))))) {\n            if (((da[ga][0] > ea[ha][0]))) {\n                fa[ia++] = ea[ha++];\n            }\n             else fa[ia++] = da[ga++];\n        ;\n        ;\n        };\n    ;\n        return fa.concat(da.slice(ga), ea.slice(ha));\n    };\n;\n    function v(da, ea, fa) {\n        if (!fa) {\n            return false;\n        }\n    ;\n    ;\n        var ga = x(fa, da);\n        return ((w(da, ea, fa, ga) || w(da, ea, fa, ((ga + 1)))));\n    };\n;\n    function w(da, ea, fa, ga) {\n        if (!fa[ga]) {\n            return false;\n        }\n    ;\n    ;\n        var ha = fa[ga][0], ia = fa[ga][1];\n        return !((((((((da + ea)) - 1)) < ha)) || ((da > ((((ha + ia)) - 1))))));\n    };\n;\n    function x(da, ea) {\n        var fa = 0, ga = ((da.length - 1));\n        while (((fa <= ga))) {\n            var ha = Math.floor(((((fa + ga)) / 2))), ia = da[ha][0];\n            if (((ia == ea))) {\n                return ha;\n            }\n             else if (((ia < ea))) {\n                fa = ((ha + 1));\n            }\n             else ga = ((ha - 1));\n            \n        ;\n        ;\n        };\n    ;\n        return ga;\n    };\n;\n    function y(da) {\n        var ea = [];\n        da.replace(j, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                token: fa,\n                id: ga,\n                type: ha,\n                JSBNG__name: ia,\n                offset: ja\n            });\n        });\n        return ea;\n    };\n;\n    function z(da) {\n        return ((da ? da.replace(/\\\\([^\\\\])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\") : null));\n    };\n;\n    function aa(da) {\n        return da.replace(j, function(ea, fa, ga, ha, ia) {\n            return z(ha);\n        });\n    };\n;\n    function ba(da) {\n        var ea = 0, fa = 0;\n        return y(da).map(function(ga) {\n            var ha = da.indexOf(ga.token, fa);\n            fa = ((ha + 1));\n            ha -= ea;\n            var ia = z(ga.JSBNG__name);\n            ea += ((ga.token.length - ia.length));\n            if (((ha >= 0))) {\n                return {\n                    id: ga.id,\n                    JSBNG__name: ia,\n                    type: ga.type,\n                    offset: ha\n                };\n            }\n        ;\n        ;\n        });\n    };\n;\n    var ca = {\n    };\n    ca.parse = l;\n    ca.parseWithoutMentions = m;\n    e.exports = ca;\n});\n__d(\"HashtagSearchResultUtils\", [\"FacebarResultStoreUtils\",\"HashtagParser\",\"HashtagSearchResultConfig\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarResultStoreUtils\"), h = b(\"HashtagParser\"), i = b(\"HashtagSearchResultConfig\"), j = b(\"URI\"), k = {\n        getHashtagFromQuery: function(l) {\n            var m = h.parse(l);\n            if (((((m && ((m.length === 1)))) && ((m[0].offset === 0))))) {\n                return m[0].tag;\n            }\n        ;\n        ;\n            return false;\n        },\n        makeTypeaheadResult: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j(((\"/hashtag/\" + l))).toString(),\n                photo: i.image_url,\n                rankType: null,\n                replace_results: ((i.boost_result ? true : false)),\n                scaled_score: 1,\n                score: 0,\n                text: ((\"#\" + l)),\n                type: \"hashtag_exact\",\n                uid: ((\"hashtag:\" + l))\n            };\n        },\n        makeFacebarEntry: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j(((\"/hashtag/\" + l))).toString(),\n                photo: i.image_url,\n                replace_results: ((i.boost_result ? true : false)),\n                text: ((\"#\" + l)),\n                type: \"hashtag_exact\",\n                uid: ((\"hashtag:\" + l))\n            };\n        },\n        makeFacebarResult: function(l) {\n            var m = g.processEntityResult(\"hashtag_exact\", ((\"hashtag:\" + l)), ((\"#\" + l)), i.hashtag_cost);\n            m.parse = {\n                display: [{\n                    type: \"ent:hashtag_exact\",\n                    uid: ((\"hashtag:\" + l))\n                },],\n                remTokens: [],\n                suffix: \"\",\n                unmatch: []\n            };\n            return m;\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualHelpSearchController\", [\"JSBNG__Event\",\"AsyncRequest\",\"DOM\",\"CSS\",\"Focus\",\"Input\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"CSS\"), k = b(\"Focus\"), l = b(\"Input\"), m = b(\"copyProperties\"), n = 400;\n    function o() {\n        this._token = null;\n        this._timerID = 0;\n        this._lastQuery = null;\n        this.typing_listener = null;\n        this.clear_listener = null;\n        this.async_request = null;\n    };\n;\n    m(o.prototype, {\n        init: function(p, q, r, s, t) {\n            this.loader = p;\n            this.search_box = q;\n            this.topics_area = r;\n            this.results_area = s;\n            this.clear_button = t;\n            this.typing_listener = g.listen(this.search_box, \"keyup\", this.setTimer.bind(this));\n            this.clear_listener = g.listen(this.clear_button, \"click\", this.clearResults.bind(this));\n            k.set(this.search_box);\n        },\n        source: \"contextual_help\",\n        clearResults: function() {\n            this.show(this.topics_area);\n            this._lastQuery = \"\";\n            l.reset(this.search_box);\n            k.set(this.search_box);\n            if (((this.async_request !== null))) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        ;\n            j.addClass(this.clear_button, \"hidden_elem\");\n        },\n        update: function() {\n            var p = l.getValue(this.search_box);\n            if (((p === this._lastQuery))) {\n                return;\n            }\n        ;\n        ;\n            this._lastQuery = p;\n            if (((p === \"\"))) {\n                this.clearResults();\n                return;\n            }\n        ;\n        ;\n            this.show(this.loader);\n            var q = {\n                query: p,\n                width: ((this._width || n)),\n                source: this.source\n            };\n            this.async_request = new h(\"/help/ajax/search/\").setData(q).setHandler(function(r) {\n                this._update(r);\n            }.bind(this));\n            this.async_request.send();\n        },\n        _update: function(p) {\n            this.async_request = null;\n            var q = p.getPayload().results;\n            i.setContent(this.results_area, q);\n            this.show(this.results_area);\n            if (((l.getValue(this.search_box) === \"\"))) {\n                this.clearResults();\n            }\n             else j.removeClass(this.clear_button, \"hidden_elem\");\n        ;\n        ;\n        },\n        setTimer: function() {\n            if (((this._timerID !== 0))) {\n                JSBNG__clearTimeout(this._timerID);\n            }\n        ;\n        ;\n            this._timerID = JSBNG__setTimeout(this.update.bind(this), 300);\n            if (((this.async_request != null))) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        ;\n        },\n        show: function(p) {\n            var q = [this.loader,this.topics_area,this.results_area,];\n            for (var r = 0; ((r < q.length)); r++) {\n                j.addClass(q[r], \"hidden_elem\");\n            ;\n            };\n        ;\n            j.removeClass(p, \"hidden_elem\");\n        }\n    });\n    e.exports = o;\n});\n__d(\"RequestsJewel\", [\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ChannelConstants\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"FriendBrowserCheckboxController\",\"LinkController\",\"Parent\",\"ScrollableArea\",\"Vector\",\"copyProperties\",\"ge\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"FriendBrowserCheckboxController\"), o = b(\"LinkController\"), p = b(\"Parent\"), q = b(\"ScrollableArea\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"shield\"), v = b(\"tx\");\n    function w() {\n    \n    };\n;\n    s(w, {\n        instance: null,\n        getInstance: function() {\n            return this.instance;\n        }\n    });\n    s(w.prototype, {\n        init: function(x, y, z) {\n            w.instance = this;\n            this.countNew = 0;\n            this.jewel = x;\n            this.jewelFlyoutCase = x.getRoot();\n            this.jewelFlyout = t(\"fbRequestsFlyout\");\n            this.newCountSpan = t(\"newRequestCount\");\n            this.folder = y;\n            this.doNewMarkRead = z;\n            this.openTimestamp = 0;\n            this._requestList = {\n            };\n            this._requestCount = 0;\n            this.egoPredictedCount = 0;\n            this.pendingCount = 0;\n            this.shouldLogEgoClick = false;\n            this.shouldClearPredictionAssocOnClick = false;\n            var aa = t(\"requestsMarkReadButton\");\n            if (aa) {\n                m.listen(aa, \"click\", u(this._markRead, this));\n            }\n        ;\n        ;\n            this.jewel.subscribe(\"marked-seen\", u(this._markSeenCallback, this));\n            this.jewel.subscribe(\"JSBNG__closed\", u(this._clearNewItems, this));\n            this.jewel.subscribe(\"updated\", this._updateCount.bind(this));\n            this.jewel.subscribe(\"opened\", this._openHandler.bind(this));\n            o.registerHandler(this._handleLink.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_add\"), this._addRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_remove_old\"), this._removeOldRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"friend_requests_seen\"), this._markSeenFromMessage.bind(this));\n            g.subscribe(\"jewel/ego_predicted_count\", function(ba, ca) {\n                this.egoPredictedCount = ca.ego_predicted_count;\n                this.pendingCount = ca.pending_count;\n                this.egoUnseenTimestamp = ca.unseen_timestamp;\n                this.shouldLogEgoClick = ca.should_log_ego_click;\n                this.actionContext = ca.action_context;\n            }.bind(this));\n            m.listen(this.jewelFlyout, \"submit\", function(ba) {\n                var ca = p.byClass(ba.getTarget(), \"objectListItem\");\n                if (ca) {\n                    k.removeClass(ca, \"jewelItemNew\");\n                    k.addClass(ca, \"jewelItemResponded\");\n                    this.pageInCollapsedRequests();\n                }\n            ;\n            ;\n            }.bind(this));\n            this.setupScroll();\n            return this;\n        },\n        setupScroll: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableAreaWrap\")[0];\n            if (x) {\n                this._scrollableWrap = x;\n                this._lastLinkPosition = 0;\n                this._scrollListener = m.listen(x, \"JSBNG__scroll\", this._handleScroll.bind(this), m.Priority._BUBBLE);\n            }\n        ;\n        ;\n        },\n        fromDom: function() {\n            l.scry(this.jewelFlyout, \".jewelItemList li.objectListItem\").forEach(function(x) {\n                var y = x.getAttribute(\"id\");\n                if (y) {\n                    var z = this._parseIDToInts(y);\n                    if (z.requester) {\n                        this._requestList[z.requester] = y;\n                    }\n                ;\n                ;\n                    ++this._requestCount;\n                }\n            ;\n            ;\n            }.bind(this));\n            this._conditionShowEmptyMessage();\n        },\n        _parseID: function(x) {\n            var y = x.match(/^(\\d+)_(\\d+)/);\n            return (((y) ? {\n                requester: y[1],\n                type: y[2]\n            } : undefined));\n        },\n        _parseIDToInts: function(x) {\n            var y = ((x ? this._parseID(x) : undefined)), z;\n            if (((y && y.requester))) {\n                z = parseInt(y.requester, 10);\n                if (isNaN(z)) {\n                    z = undefined;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var aa;\n            if (((y && y.type))) {\n                aa = parseInt(y.type, 10);\n                if (isNaN(aa)) {\n                    aa = undefined;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return {\n                requester: z,\n                type: aa\n            };\n        },\n        _handleLink: function(x, JSBNG__event) {\n            var y = p.byClass(x, \"jewelItemNew\");\n            if (((((y && p.byClass(y, \"fbRequestList\"))) && p.byClass(y, \"beeperEnabled\")))) {\n                var z = this._parseID(y.id);\n                ((z && this._markSeenCallback(z.requester, z.type)));\n                g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                });\n                k.removeClass(y, \"jewelItemNew\");\n            }\n        ;\n        ;\n            return true;\n        },\n        _handleScroll: function() {\n            var x = l.scry(this._scrollableWrap, \".uiMorePager\");\n            if (((!x || ((t(\"fbRequestsJewelManualPager\") && ((x.length < 2))))))) {\n                return;\n            }\n        ;\n        ;\n            var y = x.pop();\n            if (y) {\n                var z = r.getElementPosition(y, \"viewport\").y;\n                if (((z > 0))) {\n                    k.addClass(p.byClass(this._scrollableWrap, \"uiScrollableArea\"), \"contentAfter\");\n                }\n            ;\n            ;\n                var aa = l.JSBNG__find(y, \"a\");\n                if (!aa) {\n                    return;\n                }\n            ;\n            ;\n                var ba = r.getElementPosition(aa, \"viewport\").y;\n                if (((ba == this._lastLinkPosition))) {\n                    return;\n                }\n            ;\n            ;\n                var ca = ((r.getElementPosition(this._scrollableWrap, \"viewport\").y + r.getElementDimensions(this._scrollableWrap).y));\n                if (((((((ba - 300)) < ca)) && ((ba > 0))))) {\n                    this._lastLinkPosition = ba;\n                    var da = aa.getAttribute(\"ajaxify\");\n                    if (da) {\n                        new h(da).setRelativeTo(aa).setStatusElement(p.byClass(aa, \"stat_elem\")).send();\n                    }\n                     else n.getInstance(\"jewel\").showMore();\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _addRequest: function(x, y) {\n            if (!y) {\n                return;\n            }\n        ;\n        ;\n            var z = y.obj.from, aa = y.obj.suggester, ba = this._parseIDToInts(this._requestList[z]).type, ca = ((((ba === 19)) && !aa));\n            if (((!ca && ((ba || this.jewel.isOpen()))))) {\n                return;\n            }\n        ;\n        ;\n            if (t(\"fbRequestsJewelLoading\")) {\n                new h().setURI(\"/ajax/requests/loader/\").send();\n            }\n             else {\n                var da = this._onMarkupCallback.bind(this, z, !!aa), ea = {\n                    from: z\n                };\n                if (aa) {\n                    ea.suggester = aa;\n                }\n            ;\n            ;\n                new h().setURI(\"/ajax/friends/jewel/request_markup\").setData(ea).setHandler(da).send();\n            }\n        ;\n        ;\n        },\n        _onMarkupCallback: function(x, y, z) {\n            var aa = z.getPayload();\n            if (!aa) {\n                return;\n            }\n        ;\n        ;\n            var ba = this._requestList[x], ca = this._parseIDToInts(ba).type;\n            if (((((ca === 19)) && !y))) {\n                var da = ((ba && t(ba)));\n                ((da && l.replace(da, aa.markup)));\n            }\n             else {\n                var ea = l.scry(this.jewelFlyout, \".fbRequestList .uiList\")[0];\n                if (!ea) {\n                    return;\n                }\n            ;\n            ;\n                l.prependContent(ea, aa.markup);\n                var fa = {\n                    jewel: \"requests\",\n                    count: ++this.countNew\n                };\n                g.inform(\"jewel/count-updated\", fa);\n                ++this._requestCount;\n                this._conditionShowEmptyMessage();\n            }\n        ;\n        ;\n            this._requestList[x] = aa.item_id;\n        },\n        _removeOldRequest: function(x, y) {\n            if (((((!y || this.jewel.isOpen())) || ((t(\"fbRequestsJewelLoading\") !== null))))) {\n                return;\n            }\n        ;\n        ;\n            var z = this._requestList[y.obj.from], aa = ((z && t(z)));\n            if (aa) {\n                ((k.hasClass(aa, \"jewelItemNew\") && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })));\n                if (!k.hasClass(aa, \"jewelItemResponded\")) {\n                    l.remove(aa);\n                    delete this._requestList[y.obj.from];\n                    --this._requestCount;\n                    this._conditionShowEmptyMessage();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        pageInCollapsedRequests: function() {\n            var x = t(\"fbRequestsJewelManualPager\");\n            if (x) {\n                var y = l.scry(x, \".uiMorePagerPrimary\")[0];\n                if (((y.style && ((y.style.display != \"none\"))))) {\n                    JSBNG__setTimeout(function() {\n                        y.click();\n                    }, 100);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _markRead: function() {\n            this.jewel.markSeen();\n            this._clearNewItems();\n        },\n        _markSeenCallback: function(x, y) {\n            var z = l.scry(this.jewelFlyout, \"li\");\n            new i(\"/ajax/gigaboxx/endpoint/UpdateLastSeenTime.php\", {\n                folder: this.folder,\n                first_item: z[0].id\n            }).send();\n            new h().setURI(\"/ajax/friends/jewel/predicted_count_logging\").setData({\n                ego_predicted_count: this.egoPredictedCount,\n                pending_count: this.pendingCount,\n                unseen_timestamp: this.egoUnseenTimestamp,\n                action_context: this.actionContext,\n                should_log_ego_click: this.shouldLogEgoClick\n            }).send();\n            var aa = ((((((typeof x != \"undefined\")) && ((typeof y != \"undefined\")))) ? {\n                requester: x,\n                type: y\n            } : {\n            }));\n            ((this.doNewMarkRead && new i(\"/ajax/requests/mark_read/\", aa).send()));\n        },\n        _markSeenFromMessage: function(x, y) {\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"requests\",\n                count: 0\n            });\n        },\n        _removeRequest: function(x, y) {\n            var z = y.obj.item_id;\n            if (z) {\n                var aa = t(z), ba = ((aa && k.hasClass(aa, \"jewelItemNew\")));\n                ((aa ? l.remove(aa) : ((ba && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })))));\n            }\n        ;\n        ;\n        },\n        _clearNewItems: function(x, y) {\n            l.scry(this.jewel.root, \"li.jewelItemNew\").forEach(function(z) {\n                k.removeClass(z, \"jewelItemNew\");\n            });\n        },\n        _updateCount: function(x, y) {\n            this.countNew = y.count;\n            k.conditionClass(this.jewelFlyout, \"beeperUnread\", ((this.countNew > 0)));\n            k.conditionClass(this.jewelFlyoutCase, \"showRequests\", ((this.countNew > 0)));\n            if (this.newCountSpan) {\n                var z = ((((this.countNew == 1)) ? v._(\"{num} NEW REQUEST\", {\n                    num: this.countNew\n                }) : v._(\"{num} NEW REQUESTS\", {\n                    num: this.countNew\n                })));\n                l.setContent(this.newCountSpan, z);\n            }\n        ;\n        ;\n        },\n        _conditionShowEmptyMessage: function() {\n            l.scry(this.jewelFlyout, \"li.empty\").forEach(function(x) {\n                k.conditionShow(x, ((this._requestCount <= 0)));\n            }.bind(this));\n        },\n        _openHandler: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableArea\")[0];\n            if (t(\"fbRequestsJewelLoading\")) {\n                var y = JSBNG__Date.now();\n                if (((((this.openTimestamp + 5000)) < y))) {\n                    this.openTimestamp = y;\n                    new h().setURI(\"/ajax/requests/loader/\").setData({\n                        log_impressions: true\n                    }).send();\n                }\n            ;\n            ;\n            }\n             else {\n                var z = Object.keys(this._requestList);\n                if (((z.length > 0))) {\n                    new h().setURI(\"/friends/requests/log_impressions\").setData({\n                        ids: z.join(\",\"),\n                        ref: \"jewel\"\n                    }).send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((x && q.poke(x)));\n        }\n    });\n    e.exports = w;\n});\n__d(\"legacy:RequestsJewel\", [\"RequestsJewel\",], function(a, b, c, d) {\n    a.RequestsJewel = b(\"RequestsJewel\");\n}, 3);\n__d(\"JewelX\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"HTML\",\"Keys\",\"TabIsolation\",\"Toggler\",\"copyProperties\",\"emptyFunction\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"TabIsolation\"), o = b(\"Toggler\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"reportData\"), s = function(t, u) {\n        ((((t && u)) && this.init(t, u)));\n    };\n    p(s, {\n        _instancesByName: {\n        },\n        _resizeListener: null\n    });\n    p(s.prototype, i, {\n        init: function(t, u) {\n            this.JSBNG__name = u.JSBNG__name;\n            this.root = t;\n            this.countNew = 0;\n            this.initialCount = 0;\n            this.escHandler = null;\n            s._instancesByName[this.JSBNG__name] = this;\n            var v = k.JSBNG__find(t, \".jewelFlyout\"), w = new n(v);\n            o.listen(\"show\", this.root, function(x) {\n                this._logFirstClick();\n                ((this.hasNew() && this.markSeen()));\n                this.reset();\n                this.inform(\"opened\");\n                h.inform(\"layer_shown\", {\n                    type: \"Jewel\"\n                });\n                w.enable();\n                this.setupEvents();\n            }.bind(this));\n            o.listen(\"hide\", this.root, function(x, y) {\n                ((this.hasNew() && this.markSeen()));\n                this.reset();\n                this.inform(\"JSBNG__closed\");\n                h.inform(\"layer_hidden\", {\n                    type: \"Jewel\"\n                });\n                w.disable();\n                this.removeEvents();\n            }.bind(this));\n            h.subscribe(\"jewel/count-updated\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.update(y)));\n            }.bind(this));\n            h.subscribe(\"jewel/count-initial\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.setInitial(y)));\n            }.bind(this));\n            h.subscribe(\"jewel/reset\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.reset()));\n            }.bind(this));\n            s._resizeListener = ((s._resizeListener || (function() {\n                var x = null;\n                return g.listen(window, \"resize\", function() {\n                    JSBNG__clearTimeout(x);\n                    x = h.inform.bind(h, \"jewel/resize\").defer(100, false);\n                });\n            })()));\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        hasNew: function() {\n            return j.hasClass(this.root, \"hasNew\");\n        },\n        isOpen: function() {\n            return j.hasClass(this.root, \"openToggler\");\n        },\n        reset: function() {\n            j.removeClass(this.root, \"hasNew\");\n        },\n        setContent: function(t) {\n            var u = k.JSBNG__find(this.root, \"ul.jewelItemList\");\n            k.setContent(u, l(t));\n        },\n        update: function(t) {\n            this.countNew = t.count;\n            var u = k.JSBNG__find(this.root, \"span.jewelCount span\");\n            k.setContent(u, this.countNew);\n            var v = ((isNaN(this.countNew) || ((this.countNew > 0))));\n            j.conditionClass(this.root, \"hasNew\", v);\n            if (v) {\n                var w = ((\"\" + this.countNew)).length;\n                j.conditionClass(this.root, \"hasCountSmall\", ((w === 1)));\n                j.conditionClass(this.root, \"hasCountMedium\", ((w === 2)));\n                j.conditionClass(this.root, \"hasCountLarge\", ((w > 2)));\n            }\n        ;\n        ;\n            this.inform(\"updated\", t);\n        },\n        setInitial: function(t) {\n            this.initialCount = t;\n        },\n        setupEvents: function() {\n            this.escHandler = g.listen(JSBNG__document.documentElement, \"keydown\", function(t) {\n                if (((((t.keyCode === m.ESC)) && this.isOpen()))) {\n                    o.hide(this.root);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        removeEvents: function() {\n            if (this.escHandler) {\n                this.escHandler.remove();\n            }\n        ;\n        ;\n        },\n        markSeen: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: this.JSBNG__name,\n                count: 0\n            }, h.BEHAVIOR_STATE);\n            this.inform(\"marked-seen\");\n        },\n        _logFirstClick: function() {\n            this._logFirstClick = q;\n            r(\"jewel_click\", {\n                gt: {\n                    count: this.countNew,\n                    initial: this.initialCount,\n                    jewel: this.JSBNG__name\n                }\n            });\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryJewelCountControl\", [\"Arbiter\",\"DOM\",\"MercuryThreadlistConstants\",\"copyProperties\",\"shield\",\"tx\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"MercuryThreadlistConstants\"), j = b(\"copyProperties\"), k = b(\"shield\"), l = b(\"tx\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreadInformer\").get(), o = b(\"MercuryUnseenState\").get(), p, q, r, s = function(u) {\n        if (((u || r.isOpen()))) {\n            o.markAsSeen();\n        }\n    ;\n    ;\n    }, t = function(u, v) {\n        p = u;\n        q = h.JSBNG__find(p, \"#mercurymessagesCountValue\");\n        r = v;\n        this.render();\n        m.subscribe(\"model-update-completed\", function(w, x) {\n            s(false);\n        });\n        n.subscribe(\"unseen-updated\", this.render.bind(this));\n        r.subscribe(\"marked-seen\", k(s, this, true));\n    };\n    j(t.prototype, {\n        render: function() {\n            var u = \"\";\n            if (o.exceedsMaxCount()) {\n                u = l._(\"{count}+\", {\n                    count: i.MAX_UNSEEN_COUNT\n                });\n            }\n             else u = o.getUnseenCount().toString();\n        ;\n        ;\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"mercurymessages\",\n                count: u\n            }, g.BEHAVIOR_STATE);\n        }\n    });\n    e.exports = t;\n});\n__d(\"MercuryJewelThreadlistControl\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryChatUtils\",\"MercuryConfig\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"JSXDOM\",\"MercuryAPIArgsSource\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryOrderedThreadlist\",\"Parent\",\"MercuryJewelTemplates\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"Tooltip\",\"MercuryUnreadState\",\"copyProperties\",\"csx\",\"cx\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryChatUtils\"), j = b(\"MercuryConfig\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"JSLogger\"), o = b(\"JSXDOM\"), p = b(\"MercuryAPIArgsSource\"), q = b(\"MercuryThreadlistConstants\"), r = b(\"MessagingTag\"), s = b(\"MercuryOrderedThreadlist\").get(), t = b(\"Parent\"), u = b(\"MercuryJewelTemplates\"), v = b(\"MercuryThreadInformer\").get(), w = b(\"MercuryThreadMetadataRenderer\").get(), x = b(\"MercuryThreads\").get(), y = b(\"Tooltip\"), z = b(\"MercuryUnreadState\").get(), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"throttle\"), ea = b(\"tx\"), fa = n.create(\"mercury_jewel\");\n    function ga(na, oa) {\n        this._contentArea = ((l.scry(na, \".scrollable\")[0] || na));\n        this._contentElement = l.JSBNG__find(this._contentArea, \".jewelContent\");\n        this._loadingElement = l.JSBNG__find(this._contentArea, \".jewelLoading\");\n        this._loadMoreButton = l.JSBNG__find(this._contentArea, \".-cx-PRIVATE-fbMercuryJewel__morebutton\");\n        this._loadMoreLink = l.JSBNG__find(this._contentArea, \"a.-cx-PRIVATE-fbMercuryJewel__morelink\");\n        this._currentFolder = r.INBOX;\n        this._jewelFolderLinks = [];\n        this._jewelFolderLinks[r.INBOX] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxfolder\");\n        this._jewelFolderLinks[r.OTHER] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherfolder\");\n        this._jewelFolderCounts = [];\n        this._jewelFolderCounts[r.INBOX] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxunread\");\n        this._jewelFolderCounts[r.OTHER] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherunread\");\n        la.bind(this)();\n        m.listen(this._jewelFolderLinks[r.INBOX], \"click\", ka.bind(this, r.INBOX));\n        m.listen(this._jewelFolderLinks[r.OTHER], \"click\", ka.bind(this, r.OTHER));\n        this._curCount = [];\n        this._curCount[r.INBOX] = ((q.JEWEL_THREAD_COUNT + 1));\n        this._curCount[r.OTHER] = ((q.JEWEL_THREAD_COUNT + 1));\n        this._isFolderLoaded = [];\n        this._isFolderLoaded[r.INBOX] = false;\n        this._isFolderLoaded[r.OTHER] = false;\n        this._folderIsLoading = [];\n        this._folderIsLoading[r.INBOX] = false;\n        this._folderIsLoading[r.OTHER] = false;\n        v.subscribe(\"threadlist-updated\", this.render.bind(this));\n        v.subscribe(\"unread-updated\", la.bind(this));\n        this.render();\n        fa.bump(((\"opened_threadlist_\" + this._currentFolder)));\n        m.listen(this._contentArea, \"JSBNG__scroll\", da(ha, 50, this));\n        m.listen(this._loadMoreLink, \"click\", this.renderMoreThreads.bind(this));\n    };\n;\n    aa(ga, {\n        EVENT_THREADS_LOADED: \"threads-loaded\",\n        EVENT_THREADS_RENDERED: \"threads-rendered\"\n    });\n    aa(ga.prototype, h);\n    aa(ga.prototype, {\n        render: function() {\n            l.empty(this._contentElement);\n            k.show(this._loadingElement);\n            k.hide(this._loadMoreButton);\n            var na = l.create(\"div\");\n            l.appendContent(this._contentElement, na);\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, this._curCount[this._currentFolder], this._currentFolder, this.renderThreads.bind(this, na), true);\n        },\n        renderThreads: function(na, oa) {\n            this.inform(ga.EVENT_THREADS_LOADED);\n            if (oa.length) {\n                oa.forEach(function(pa) {\n                    var qa = u[\":fb:mercury:jewel:threadlist-row\"].build();\n                    x.getThreadMeta(pa, function(ra) {\n                        w.renderCoreThreadlist(ra, qa, this.renderSingleThread.bind(this), {\n                            show_unread_count: true\n                        });\n                    }.bind(this));\n                    l.appendContent(na, qa.getRoot());\n                }.bind(this));\n            }\n             else l.setContent(this._contentElement, this.renderEmptyThreadlist());\n        ;\n        ;\n            k.hide(this._loadingElement);\n            k.conditionShow(this._loadMoreButton, !this._isFolderLoaded[this._currentFolder]);\n            this.inform(ga.EVENT_THREADS_RENDERED);\n        },\n        renderSingleThread: function(na, oa) {\n            var pa = ((oa.unread_count > 0));\n            if (pa) {\n                k.addClass(na.getRoot(), \"jewelItemNew\");\n            }\n        ;\n        ;\n            if (j.MessagesJewelToggleReadGK) {\n                var qa = o.div({\n                    className: \"x_div\"\n                }), ra = o.div({\n                    className: \"-cx-PRIVATE-fbReadToggle__active\"\n                }), sa = \"Mark as Unread\";\n                if (pa) {\n                    sa = \"Mark as Read\";\n                }\n            ;\n            ;\n                y.set(ra, sa, \"above\", \"right\");\n                m.listen(ra, \"click\", function(JSBNG__event) {\n                    x.changeThreadReadStatus(oa.thread_id, ((oa.unread_count > 0)));\n                    return false;\n                });\n                qa.appendChild(ra);\n                na.getNode(\"link\").appendChild(qa);\n            }\n        ;\n        ;\n            if (((j.MessagesJewelOpenInChat && i.canOpenChatTab(oa)))) {\n                m.listen(na.getRoot(), \"click\", function(JSBNG__event) {\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: oa.thread_id\n                    });\n                });\n            }\n             else w.renderTitanLink(oa.thread_id, na.getNode(\"link\"), null, this._currentFolder);\n        ;\n        ;\n            m.listen(na.getRoot(), \"mouseover\", function(JSBNG__event) {\n                var ta = na.getRoot();\n                if (!t.byClass(ta, \"notifNegativeBase\")) {\n                    k.addClass(ta, \"selected\");\n                }\n            ;\n            ;\n            });\n            m.listen(na.getRoot(), \"mouseout\", function(JSBNG__event) {\n                k.removeClass(na.getRoot(), \"selected\");\n            });\n        },\n        renderMoreThreads: function() {\n            k.addClass(this._loadMoreButton, \"async_saving\");\n            this._folderIsLoading[this._currentFolder] = true;\n            var na = ((this._curCount[this._currentFolder] + q.JEWEL_MORE_COUNT));\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, ((na + 1)), this._currentFolder, ja.bind(this, na, this._currentFolder), true, p.JEWEL);\n        },\n        renderEmptyThreadlist: function() {\n            return l.create(\"li\", {\n                className: \"empty\"\n            }, \"No messages\");\n        }\n    });\n    function ha() {\n        if (((((!this._isFolderLoaded[this._currentFolder] && !this._folderIsLoading[this._currentFolder])) && ia.bind(this)()))) {\n            this.renderMoreThreads();\n        }\n    ;\n    ;\n    };\n;\n    function ia() {\n        return ((((this._contentArea.scrollTop + this._contentArea.clientHeight)) >= ((this._contentArea.scrollHeight - 1))));\n    };\n;\n    function ja(na, oa, pa) {\n        this._curCount[oa] = na;\n        if (((!this._isFolderLoaded[oa] && ((pa.length < ((this._curCount[oa] + 1))))))) {\n            this._isFolderLoaded[oa] = true;\n        }\n    ;\n    ;\n        this._folderIsLoading[oa] = false;\n        k.removeClass(this._loadMoreButton, \"async_saving\");\n        this.render();\n    };\n;\n    function ka(na) {\n        if (((this._currentFolder != na))) {\n            fa.bump(((\"opened_threadlist_\" + na)));\n            k.addClass(this._jewelFolderLinks[na], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            k.removeClass(this._jewelFolderLinks[this._currentFolder], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            this._currentFolder = na;\n            this.render();\n        }\n    ;\n    ;\n    };\n;\n    function la() {\n        ma.bind(this)(r.INBOX);\n        ma.bind(this)(r.OTHER);\n    };\n;\n    function ma(na) {\n        var oa;\n        if (z.exceedsMaxCount(na)) {\n            oa = q.MAX_UNREAD_COUNT;\n        }\n         else oa = z.getUnreadCount(na);\n    ;\n    ;\n        var pa = this._jewelFolderCounts[na];\n        if (((oa > 0))) {\n            if (((oa == q.MAX_UNREAD_COUNT))) {\n                oa += \"+\";\n            }\n        ;\n        ;\n            l.setContent(pa, ea._(\"({unread_count})\", {\n                unread_count: oa\n            }));\n        }\n         else l.setContent(pa, \"\");\n    ;\n    ;\n    };\n;\n    e.exports = ga;\n});\n__d(\"MercuryJewel\", [\"MercuryChannelHandler\",\"MercuryJewelCountControl\",\"DOM\",\"MercuryJewelThreadlistControl\",\"MercuryServerRequests\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"MercuryChannelHandler\");\n    var g = b(\"MercuryJewelCountControl\"), h = b(\"DOM\"), i = b(\"MercuryJewelThreadlistControl\"), j = b(\"MercuryServerRequests\").get(), k = b(\"userAction\"), l = false;\n    function m(q, r, s, t) {\n        j.handleUpdate(t);\n        var u = new g(r, s), v = h.JSBNG__find(q, \"#MercuryJewelThreadList\");\n        if (((s.getRoot() && s.isOpen()))) {\n            n.call(this, v, q);\n        }\n         else s.subscribe(\"opened\", n.bind(this, v, q));\n    ;\n    ;\n    };\n;\n    e.exports = m;\n    function n(q, r) {\n        this._ua = k(\"messages\").uai(\"click\", \"jewel\");\n        this._listenForLoad = this._listenForRender = true;\n        if (!l) {\n            var s = new i(q, r);\n            s.subscribe(i.EVENT_THREADS_LOADED, o.bind(this));\n            s.subscribe(i.EVENT_THREADS_RENDERED, p.bind(this));\n            l = true;\n        }\n    ;\n    ;\n    };\n;\n    function o() {\n        if (this._listenForLoad) {\n            this._ua.add_event(\"loaded\");\n            this._listenForLoad = false;\n        }\n    ;\n    ;\n    };\n;\n    function p() {\n        if (this._listenForRender) {\n            this._ua.add_event(\"rendered\");\n            this._listenForRender = false;\n        }\n    ;\n    ;\n    };\n;\n});\n__d(\"MessagingEvents\", [\"Arbiter\",\"ChannelConstants\",\"arrayContains\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"isEmpty\"), l = {\n    }, m = new g();\n    function n(o) {\n        if (!k(l)) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin180keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin180i = (0);\n            var p;\n            for (; (fin180i < fin180keys.length); (fin180i++)) {\n                ((p) = (fin180keys[fin180i]));\n                {\n                    m.inform(((\"count/\" + p)), o[p]);\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    m.subscribe(\"mark-as-read\", function(o, p) {\n        ((((p.tids || p.chat_ids)) || [])).forEach(function(q) {\n            q = ((\"\" + q));\n            if (!((q in l))) {\n                l[q] = true;\n                var r = function() {\n                    m.unsubscribe(s);\n                    JSBNG__clearTimeout(t);\n                    delete l[q];\n                }, s = m.subscribe(\"read\", function(u, v) {\n                    if (((i(((v.tids || [])), q) || i(((v.chat_ids || [])), q)))) {\n                        r();\n                    }\n                ;\n                ;\n                }), t = r.defer(60000);\n            }\n        ;\n        ;\n        });\n    });\n    g.subscribe(h.getArbiterType(\"messaging\"), function(o, p) {\n        var q = j({\n        }, p.obj), JSBNG__event = ((q.JSBNG__event || \"\"));\n        delete q.type;\n        delete q.JSBNG__event;\n        m.inform(JSBNG__event, q);\n        if (((\"unread_counts\" in q))) {\n            var r = q.unread_counts;\n            n({\n                unread: r.inbox,\n                other_unseen: r.other\n            });\n        }\n    ;\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"inbox\"), function(o, p) {\n        var q = j(p.obj);\n        delete q.type;\n        n(q);\n    });\n    a.MessagingEvents = e.exports = m;\n}, 3);\n__d(\"TitanLeftNav\", [\"CounterDisplay\",\"MessagingEvents\",], function(a, b, c, d, e, f) {\n    var g = b(\"CounterDisplay\"), h = b(\"MessagingEvents\"), i = {\n        initialize: function() {\n            h.subscribe(\"count/other_unseen\", function(j, k) {\n                g.setCount(\"other_unseen\", k);\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"AccessibleMenu\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"Keys\",\"TabbableElements\",\"Toggler\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"Toggler\"), m, n, o;\n    function p() {\n        var x = i.scry(m, \"a[rel=\\\"toggle\\\"]\")[0];\n        ((x && x.JSBNG__focus()));\n        l.getInstance(m).hide();\n    };\n;\n    function q(x) {\n        if (!x) {\n            return false;\n        }\n    ;\n    ;\n        h.removeClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"false\");\n    };\n;\n    function r(x) {\n        if (!x) {\n            return false;\n        }\n    ;\n    ;\n        h.addClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"true\");\n        var y = k.JSBNG__find(x);\n        if (y[0]) {\n            y[0].JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function s(x) {\n        var y = i.scry(m, \".selected\")[0], z = ((n.indexOf(y) + x)), aa = n[z];\n        if (!aa) {\n            return false;\n        }\n    ;\n    ;\n        q(y);\n        r(aa);\n    };\n;\n    function t(x) {\n        if (((!l.isShown() || ((l.getActive() !== m))))) {\n            return true;\n        }\n    ;\n    ;\n        var y = g.getKeyCode(x);\n        switch (y) {\n          case j.TAB:\n            s(((x.shiftKey ? -1 : 1)));\n            g.prevent(x);\n            break;\n          case j.ESC:\n            p();\n            g.prevent(x);\n            break;\n          case j.UP:\n        \n          case j.DOWN:\n            s(((((y === j.UP)) ? -1 : 1)));\n            g.prevent(x);\n            break;\n        };\n    ;\n    };\n;\n    function u(x, y) {\n        m = y.getActive();\n        n = i.scry(m, \"[role=\\\"menuitem\\\"]\");\n        if (!o) {\n            o = g.listen(JSBNG__document.documentElement, \"keydown\", t);\n        }\n    ;\n    ;\n    };\n;\n    function v() {\n        if (((l.getActive() == m))) {\n            q(i.scry(m, \".selected\")[0]);\n        }\n    ;\n    ;\n    };\n;\n    var w = {\n        init: function(x) {\n            l.listen(\"show\", x, u);\n            l.listen(\"hide\", x, v);\n        }\n    };\n    e.exports = w;\n});\n__d(\"UserNoOp\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\"), i = function() {\n    \n    };\n    g(i.prototype, {\n        add_event: h.thatReturnsThis,\n        add_data: h.thatReturnsThis,\n        uai: h.thatReturnsThis,\n        uai_fallback: h.thatReturnsThis\n    });\n    e.exports = i;\n});\n__d(\"isEmail\", [], function(a, b, c, d, e, f) {\n    var g = /^[\\w!#\\$%&'\\*\\+\\/\\=\\?\\^`\\{\\|\\}~\\-]+(:?\\.[\\w!#\\$%&`\\*\\+\\/\\=\\?\\^`\\{\\|\\}~\\-]+)*@(?:[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?$/i;\n    function h(i) {\n        return g.test(i);\n    };\n;\n    e.exports = h;\n});\n__d(\"NegativeNotif\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Tooltip\",\"NotifXList\",\"$\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"JSBNG__Event\"), m = b(\"Parent\"), n = b(\"Tooltip\"), o = b(\"NotifXList\"), p = b(\"$\"), q = b(\"clickRefAction\"), r = b(\"copyProperties\"), s = b(\"userAction\");\n    function t(u, v) {\n        r(this, v);\n        this.owner = u;\n        this.xLink = k.JSBNG__find(this.obj, \".notif_x\");\n        this.confirmingMsg = k.JSBNG__find(this.obj, \".confirmingMsg\");\n        this.mainLink = k.JSBNG__find(this.obj, \".notifMainLink\");\n        this.userXClicked = false;\n        this.userUnsubscribed = false;\n        l.listen(this.xLink, \"click\", this.xClick.bind(this));\n        if (((i.hasClass(this.obj, \"first_receipt\") && i.hasClass(p(\"jewelContainer\"), \"notifGentleAppReceipt\")))) {\n            this.gentleFirstReceiptHoverEventHandler = l.listen(this.obj, \"mouseover\", this.gentleFirstReceiptNotifHover.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    r(t.prototype, {\n        FADE_AWAY_DURATION: 2500,\n        X_OUT_DURATION: 100,\n        X_OUT_DURATION_SHORT: 2,\n        GENTLE_FRUI_MIN_HOVER_DURATION: 500,\n        GENTLE_FRUI_FADE_DURATION_FAST: 200,\n        GENTLE_FRUI_FADE_DURATION_SLOW: 2500,\n        GENTLE_FRUI_DELAY_FADE_TIME: 60000,\n        xClick: function(JSBNG__event) {\n            this._activateX();\n            var u = this.xLink.getAttribute(\"data-gt\"), v = ((u ? {\n                gt: JSON.parse(u)\n            } : {\n            }));\n            s(\"xbutton\", this.xLink, JSBNG__event).uai(\"click\");\n            q(\"click\", this.xLink, JSBNG__event, null, v);\n            return false;\n        },\n        gentleFirstReceiptNotifHover: function(JSBNG__event) {\n            JSBNG__event.JSBNG__stop();\n            var u = k.JSBNG__find(this.obj, \".first_receipt_no_button\"), v = j.get(u, \"notif_fr_prompt\");\n            n.set(u, v, \"above\", \"center\");\n            n.show(u);\n            this._gentleFirstReceiptTooltipFadeIn();\n            if (!this.gentleFirstReceiptUnhoverEventHandler) {\n                this.hoverTime = new JSBNG__Date();\n                this.gentleFirstReceiptUnhoverEventHandler = l.listen(JSBNG__document.documentElement, \"mouseover\", this.gentleFirstReceiptNotifUnhover.bind(this));\n            }\n        ;\n        ;\n            if (!this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler = l.listen(u, \"click\", this.gentleFirstReceiptNoClick.bind(this));\n            }\n        ;\n        ;\n        },\n        gentleFirstReceiptNotifUnhover: function(JSBNG__event) {\n            if (((m.byClass(JSBNG__event.getTarget(), \"uiContextualLayer\") || m.byClass(JSBNG__event.getTarget(), \"uiScrollableAreaTrack\")))) {\n                return false;\n            }\n        ;\n        ;\n            var u = new JSBNG__Date();\n            if (((this.hoverTime && ((((u - this.hoverTime)) < this.GENTLE_FRUI_MIN_HOVER_DURATION))))) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n                this.gentleFirstReceiptUnhoverEventHandler = null;\n                this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n                return;\n            }\n        ;\n        ;\n            this._removeGentleFirstReceiptListeners();\n            this._gentleFirstReceiptTooltipFadeAway();\n            this._gentleFirstReceiptXButtonFadeAway();\n            var v = this;\n            JSBNG__setTimeout(function() {\n                v._gentleFirstReceiptUIFadeAway();\n            }, this.GENTLE_FRUI_DELAY_FADE_TIME);\n            this._sendFirstReceiptYesToServer();\n        },\n        gentleFirstReceiptNoClick: function(JSBNG__event) {\n            this._removeGentleFirstReceiptListeners();\n        },\n        restore: function() {\n            if (o.newNotifExist(this.id)) {\n                o.resumeInsert(this.id);\n            }\n             else o.removeNotif(this.id);\n        ;\n        ;\n            this._confirmingMsgFadeAway(this.confirmingMsg);\n            this._notifMainLinkShowUp(this.mainLink);\n            this._buttonShowUp(this.xLink);\n            this._adjustContainer(this.obj);\n        },\n        reset: function() {\n            if (((this.userXClicked && !this.userUnsubscribed))) {\n                this.userXClicked = false;\n                this.restore();\n            }\n        ;\n        ;\n        },\n        onTurnedOff: function() {\n            this.userUnsubscribed = true;\n            i.hide(this.confirmingMsg);\n            this._notifMainLinkShowUp(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            this._adjustContainer(this.obj);\n        },\n        onUndid: function() {\n            this.userXClicked = false;\n            this.userUnsubscribed = false;\n            this.restore();\n            i.show(this.confirmingMsg);\n            this._notifMainLinkFadeAway(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            k.remove(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n        },\n        onMarkedSpam: function() {\n            k.remove(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            this._fadeAway(k.JSBNG__find(this.obj, \".spamMsg\"));\n        },\n        onFirstReceiptYes: function() {\n            this._hideFirstReceiptDiv();\n            this._fadeAway(k.JSBNG__find(this.obj, \".firstConfirmedMsg\"));\n        },\n        onFirstReceiptNo: function() {\n            this._hideFirstReceiptDiv();\n            i.hide(this.confirmingMsg);\n            this._activateX();\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"turn_off\",\n                notification_id: this.id\n            }).send();\n        },\n        _sendFirstReceiptYesToServer: function() {\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"first_receipt_yes\",\n                notification_id: this.id\n            }).send();\n        },\n        _gentleFirstReceiptTooltipFadeIn: function() {\n            if (this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return;\n            }\n        ;\n        ;\n            var u = k.JSBNG__find(JSBNG__document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\");\n            new g(u).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = true;\n        },\n        _gentleFirstReceiptTooltipFadeAway: function() {\n            if (!this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return;\n            }\n        ;\n        ;\n            var u = k.JSBNG__find(JSBNG__document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\"), v = m.byClass(u, \"uiLayer\"), w = v.cloneNode(true);\n            k.insertAfter(v, w);\n            new g(w).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).ondone(function() {\n                k.remove(w);\n            }).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n        },\n        _gentleFirstReceiptXButtonFadeAway: function() {\n            var u = k.JSBNG__find(this.obj, \".first_receipt_no_button\");\n            new g(u).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).hide().go();\n            i.addClass(this.obj, \"show_original_x\");\n        },\n        _gentleFirstReceiptUIFadeAway: function() {\n            var u = this.obj;\n            this.new_label = k.JSBNG__find(this.obj, \".notif_new_label\");\n            new g(this.new_label).to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).ondone(function() {\n                i.removeClass(u, \"first_receipt\");\n            }).go();\n            if (!i.hasClass(this.obj, \"jewelItemNew\")) {\n                new g(this.obj).from(\"backgroundColor\", \"#ECEFF5\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).go();\n            }\n        ;\n        ;\n        },\n        _removeGentleFirstReceiptListeners: function() {\n            if (this.gentleFirstReceiptHoverEventHandler) {\n                this.gentleFirstReceiptHoverEventHandler.remove();\n            }\n        ;\n        ;\n            if (this.gentleFirstReceiptUnhoverEventHandler) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n            }\n        ;\n        ;\n            if (this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler.remove();\n            }\n        ;\n        ;\n        },\n        _activateX: function() {\n            i.addClass(this.obj, \"forPushSafety\");\n            this.userXClicked = true;\n            o.userXClick(this.id);\n            this._notifMainLinkFadeAway(this.mainLink);\n            this._buttonFadeAway(this.xLink);\n            if (i.shown(this.confirmingMsg)) {\n                this._confirmingMsgShowUp(this.confirmingMsg);\n            }\n        ;\n        ;\n            this._adjustContainer(this.obj);\n        },\n        _hideFirstReceiptDiv: function() {\n            i.removeClass(this.obj, \"first_receipt\");\n            i.hide(k.JSBNG__find(this.obj, \".first_receipt_div\"));\n        },\n        _fadeAway: function(u) {\n            new g(u).from(\"backgroundColor\", \"#FFF9D7\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.FADE_AWAY_DURATION).checkpoint().to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION).go();\n        },\n        _adjustContainer: function(u) {\n            new g(u).by(\"height\", \"0px\").duration(this.X_OUT_DURATION).checkpoint().by(\"height\", \"0px\").duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"height\", \"auto\").duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"4px\").to(\"paddingBottom\", \"4px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _confirmingMsgShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"10px\").to(\"paddingBottom\", \"10px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _confirmingMsgFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _buttonShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _buttonFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        }\n    });\n    e.exports = t;\n});\n__d(\"NotificationCounter\", [\"Arbiter\",\"DocumentTitle\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = {\n        messages: 0,\n        notifications: 0,\n        requests: 0\n    }, k = {\n        init: function(l) {\n            g.subscribe(\"update_title\", this._handleUpdate.bind(this));\n            g.subscribe(\"jewel/count-updated\", this._handleCountUpdate.bind(this));\n        },\n        getCount: function() {\n            var l = 0;\n            {\n                var fin181keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin181i = (0);\n                var m;\n                for (; (fin181i < fin181keys.length); (fin181i++)) {\n                    ((m) = (fin181keys[fin181i]));\n                    {\n                        var n = Number(j[m]);\n                        if (((((typeof j[m] == \"string\")) && isNaN(n)))) {\n                            return j[m];\n                        }\n                    ;\n                    ;\n                        if (((isNaN(n) || ((n < 0))))) {\n                            i.create(\"jewels\").error(\"bad_count\", {\n                                jewel: m,\n                                count: j[m]\n                            });\n                            continue;\n                        }\n                    ;\n                    ;\n                        l += n;\n                    };\n                };\n            };\n        ;\n            return l;\n        },\n        updateTitle: function() {\n            var l = this.getCount(), m = h.get();\n            m = ((l ? ((((((\"(\" + l)) + \") \")) + m)) : m));\n            h.set(m, true);\n        },\n        _handleCountUpdate: function(l, m) {\n            j[m.jewel] = m.count;\n            this.updateTitle();\n        },\n        _handleUpdate: function(l, m) {\n            this.updateTitle();\n        }\n    };\n    e.exports = k;\n});\n__d(\"NotificationList\", [\"Animation\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DoublyLinkedListMap\",\"HTML\",\"NotificationURI\",\"Tooltip\",\"JSBNG__Event\",\"$\",\"copyProperties\",\"cx\",\"csx\",\"ge\",\"isEmpty\",\"tx\",\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DoublyLinkedListMap\"), l = b(\"HTML\"), m = b(\"NotificationURI\"), n = b(\"Tooltip\"), o = b(\"JSBNG__Event\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"ge\"), u = b(\"isEmpty\"), v = b(\"tx\"), w = b(\"hasArrayNature\"), x = \"0\", y = \"1\", z = \"2\";\n    function aa(da) {\n        return ((((da == y)) || ((da == z))));\n    };\n;\n    function ba(da) {\n        return ((da == y));\n    };\n;\n    function ca(da, ea) {\n        this._list = new k();\n        this._filter_func = null;\n        this.unseenCount = 0;\n        this.contentRoot = da;\n        this.noItemsElement = null;\n        this.ITEM_TAG = \"li\";\n        this.ITEM_CLASS = \"notification\";\n        this.NO_ITEMS_ID = \"jewelNoNotifications\";\n        this.NO_ITEMS_CLASS = \"empty\";\n        this.compare = ((ea.compare || this.compare));\n        this.shouldBlockAnimation = ((ea.shouldBlockAnimation || null));\n        this.unseenVsUnread = ((ea.unseenVsUnread || false));\n        this.markReadSignalServer = ea.markReadSignalServer;\n        this.animations = {\n        };\n    };\n;\n    q(ca, {\n        ITEM_UNREAD_CLASS: \"jewelItemNew\",\n        MARK_READ_TYPE: \"mark_read\",\n        UNREAD_COUNT_CHANGE_TYPE: \"unread_count_change\",\n        INSERTION_TYPE: \"insert\",\n        REMOVAL_TYPE: \"remove\",\n        getIdFromDom: function(da) {\n            return da.getAttribute(\"id\").replace(\"notification_\", \"\");\n        },\n        localizeUrls: function(da) {\n            j.scry(da, \"a\").forEach(function(ea) {\n                ea.href = m.localize(ea.href);\n            });\n        }\n    });\n    q(ca.prototype, h, {\n        FADE_DURATION: 250,\n        RESIZE_DURATION: 200,\n        _getField: function(da, ea) {\n            var fa = this._list.get(da);\n            return ((fa && fa[ea]));\n        },\n        getDomObj: function(da) {\n            return this._getField(da, \"obj\");\n        },\n        fromDom: function() {\n            var da = ((((this.ITEM_TAG + \".\")) + this.ITEM_CLASS)), ea = j.scry(this.contentRoot, da);\n            for (var fa = 0; ((fa < ea.length)); ++fa) {\n                var ga = ea[fa], ha = ca.getIdFromDom(ga);\n                this.insert(ha, ga.getAttribute(\"data-notiftime\"), null);\n            };\n        ;\n        },\n        compare: function(da, ea) {\n            return ((((da.time < ea.time)) || ((((da.time === ea.time)) && ((da.id < ea.id))))));\n        },\n        insert: function(da, ea, fa, ga, ha, ia) {\n            var ja = y, ka = 0, la = this._list.exists(da), ma = ((ia && this._list.exists(ia))), na = null, oa;\n            if (((la || ma))) {\n                if (!((ga && fa))) {\n                    return false;\n                }\n                 else {\n                    if (this._filter_func) {\n                        oa = {\n                            notif_id: da,\n                            notif_time: ea,\n                            notif_markup: fa,\n                            replace: ga,\n                            ignoreUnread: ha,\n                            notif_alt_id: ia\n                        };\n                        if (this._filter_func(oa)) {\n                            return false;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ja = this._getField(da, \"readness\");\n                    ka = this._getField(da, \"time\");\n                    if (((ka > ea))) {\n                        return false;\n                    }\n                ;\n                ;\n                    na = ((la ? da : ia));\n                    this._remove(na);\n                }\n            ;\n            }\n        ;\n        ;\n            var pa = ((((fa && l(fa).getRootNode())) || p(((\"notification_\" + da))))), qa = Math.max(ea, ka), ra = pa.getAttribute(\"data-readness\");\n            if (((!this.unseenVsUnread && ((z == ra))))) {\n                ra = x;\n            }\n        ;\n        ;\n            oa = {\n                id: da,\n                obj: pa,\n                time: qa,\n                readness: ra,\n                app_id: pa.getAttribute(\"data-appid\")\n            };\n            this._insert(oa);\n            this._setUpReadStateToggle(da, pa);\n            ca.localizeUrls(pa);\n            ((this.noItemsElement && i.hide(this.noItemsElement)));\n            if (ba(ra)) {\n                ((((ha && !aa(ja))) && this.markRead([da,])));\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n            var sa = ((((!na || ((ka < qa)))) || ((((ra && !ja)) && !ha))));\n            this.inform(ca.INSERTION_TYPE, {\n                id: da,\n                is_new: sa,\n                obj: pa,\n                replaced_id: na,\n                time: qa\n            });\n            return true;\n        },\n        _setReadStateToggleReadness: function(da, ea) {\n            var fa;\n            if (ea) {\n                fa = ((this.unseenVsUnread ? \"Mark as Read\" : \"Unread\"));\n            }\n             else fa = \"Read\";\n        ;\n        ;\n            if (!((ea && this.unseenVsUnread))) {\n                i.removeClass(da, \"-cx-PRIVATE-fbReadToggle__active\");\n                i.addClass(da, \"-cx-PRIVATE-fbReadToggle__inactive\");\n            }\n        ;\n        ;\n            n.set(da, fa, \"above\", \"center\");\n        },\n        _setUpReadStateToggle: function(da, ea) {\n            var fa = this.isUnreadId(da), ga = j.scry(ea, \".-cx-PRIVATE-fbReadToggle__active\")[0];\n            if (!ga) {\n                return;\n            }\n        ;\n        ;\n            this._setReadStateToggleReadness(ga, fa);\n            var ha = function(JSBNG__event) {\n                if (((this.unseenVsUnread && this.isUnreadId(da)))) {\n                    this.markReadSignalServer([da,]);\n                }\n            ;\n            ;\n                o.kill(JSBNG__event);\n                return false;\n            };\n            o.listen(ga, \"click\", ha.bind(this));\n        },\n        showNoNotifications: function() {\n            if (((null == this.noItemsElement))) {\n                this.noItemsElement = t(this.NO_ITEMS_ID);\n            }\n        ;\n        ;\n            if (((null == this.noItemsElement))) {\n                this.noItemsElement = j.create(this.ITEM_TAG, {\n                    id: this.NO_ITEMS_ID,\n                    className: this.NO_ITEMS_CLASS\n                }, \"No new notifications\");\n                j.appendContent(this.contentRoot, this.noItemsElement);\n            }\n        ;\n        ;\n            i.show(this.noItemsElement);\n        },\n        _insert: function(da) {\n            this._list.remove(da.id);\n            var ea = null;\n            this._list.JSBNG__find(function(ga) {\n                var ha = this.compare(ga, da);\n                ((!ha && (ea = ga.id)));\n                return ha;\n            }.bind(this));\n            var fa = this.getDomObj(ea);\n            if (fa) {\n                this._list.insertAfter(da.id, da, ea);\n                j.insertAfter(fa, da.obj);\n            }\n             else {\n                this._list.prepend(da.id, da);\n                j.prependContent(this.contentRoot, da.obj);\n            }\n        ;\n        ;\n        },\n        _remove: function(da) {\n            var ea = this._getField(da, \"obj\");\n            if (!ea) {\n                return false;\n            }\n        ;\n        ;\n            this.inform(ca.REMOVAL_TYPE, {\n                id: da\n            });\n            this._list.remove(da);\n            j.remove(ea);\n            ((this.isEmpty() && this.showNoNotifications()));\n            return true;\n        },\n        getUnreadIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ((aa(da.readness) && ea.push(da.id)));\n                return ea;\n            }, []);\n        },\n        getUnseenIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ((ba(da.readness) && ea.push(da.id)));\n                return ea;\n            }, []);\n        },\n        getIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ea.push(da.id);\n                return ea;\n            }, []);\n        },\n        isUnreadId: function(da) {\n            var ea = this.getDomObj(da);\n            return ((aa(this._getField(da, \"readness\")) || ((ea && i.hasClass(ea, ca.ITEM_UNREAD_CLASS)))));\n        },\n        isUnseenId: function(da) {\n            return ba(this._getField(da, \"readness\"));\n        },\n        markRead: function(da, ea) {\n            da = ((da ? da.filter(this.isUnreadId.bind(this)) : this.getUnreadIds()));\n            var fa = false;\n            for (var ga = 0; ((ga < da.length)); ga++) {\n                var ha = this._list.get(da[ga]);\n                if (ha) {\n                    if (this._setReadness(da[ga], x)) {\n                        fa = true;\n                    }\n                ;\n                ;\n                    if (ea) {\n                        this._markReadInDom(da[ga], ha.obj);\n                    }\n                     else this.animateMarkRead(ha.obj);\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            if (fa) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n        },\n        markSeen: function(da) {\n            if (!w(da)) {\n                return;\n            }\n        ;\n        ;\n            if (!this.unseenVsUnread) {\n                this.markRead(da);\n                return;\n            }\n        ;\n        ;\n            da = da.filter(this.isUnseenId.bind(this));\n            var ea = false;\n            for (var fa = 0; ((fa < da.length)); fa++) {\n                if (this._setReadness(da[fa], z)) {\n                    ea = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (ea) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n        },\n        _setReadness: function(da, ea) {\n            var fa = this._list.get(da);\n            if (((!fa || ((fa.readness == ea))))) {\n                return false;\n            }\n        ;\n        ;\n            if (((((fa.readness == x)) && ((ea == z))))) {\n                return false;\n            }\n        ;\n        ;\n            fa.readness = ea;\n            fa.obj.setAttribute(\"data-readness\", ea);\n            return true;\n        },\n        _markReadInDom: function(da, ea) {\n            if (!this.isUnreadId(da)) {\n                return;\n            }\n        ;\n        ;\n            var fa = p(ea);\n            if (fa) {\n                this.stopAnimation(da);\n                i.removeClass(fa, ca.ITEM_UNREAD_CLASS);\n                var ga = j.scry(fa, \".read_toggle\")[0];\n                ((ga && this._setReadStateToggleReadness(ga, false)));\n            }\n        ;\n        ;\n        },\n        animateMarkRead: function(da) {\n            if (!i.hasClass(da, ca.ITEM_UNREAD_CLASS)) {\n                return;\n            }\n        ;\n        ;\n            var ea = ca.getIdFromDom(da), fa = this._markReadInDom.bind(this, ea, da);\n            if (i.hasClass(da, \"fbJewelBeep\")) {\n                fa();\n                return;\n            }\n        ;\n        ;\n            if (((this.shouldBlockAnimation && this.shouldBlockAnimation(da)))) {\n                return;\n            }\n        ;\n        ;\n            fa.defer(10000);\n        },\n        stopAnimation: function(da) {\n            ((((da in this.animations)) && this.animations[da].JSBNG__stop()));\n            delete this.animations[da];\n            return true;\n        },\n        insertMany: function(da, ea) {\n            if (((((\"object\" == typeof da)) && !u(da)))) {\n                {\n                    var fin182keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin182i = (0);\n                    var fa;\n                    for (; (fin182i < fin182keys.length); (fin182i++)) {\n                        ((fa) = (fin182keys[fin182i]));\n                        {\n                            var ga = da[fa];\n                            this.insert(fa, ga.time, ga.markup, true, ea, ((ga.alt_id || null)));\n                        };\n                    };\n                };\n            ;\n                ((this.noItemsElement && i.hide(this.noItemsElement)));\n            }\n             else ((this.isEmpty() && this.showNoNotifications()));\n        ;\n        ;\n        },\n        isEmpty: function() {\n            return this._list.isEmpty();\n        },\n        getEarliestNotifTime: function() {\n            return ((this._list.isEmpty() ? 0 : Math.min.apply(null, this.getIds().map(function(da) {\n                return this._getField(da, \"time\");\n            }.bind(this)))));\n        },\n        setFilterFn: function(da) {\n            this._filter_func = da;\n        },\n        toggleNotifsSimilarTo: function(da, ea, fa) {\n            var ga = this._getField(da, \"app_id\");\n            if (ga) {\n                var ha = this.getIds();\n                for (var ia = 0; ((ia < ha.length)); ++ia) {\n                    if (((ga == this._getField(ha[ia], \"app_id\")))) {\n                        var ja = this.getDomObj(ha[ia]);\n                        if (((da != ha[ia]))) {\n                            ((ea ? this._hideWithAnimation(ja) : this._showWithAnimation(ja)));\n                        }\n                    ;\n                    ;\n                        var ka = j.scry(ja, \".first_receipt_div\");\n                        if (((ka.length == 1))) {\n                            if (fa) {\n                                i.hide(ka[0]);\n                                i.removeClass(ja, \"first_receipt\");\n                            }\n                             else {\n                                i.show(ka[0]);\n                                i.addClass(ja, \"first_receipt\");\n                            }\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        _hideWithAnimation: function(da) {\n            new g(da).to(\"opacity\", \"0\").blind().duration(this.FADE_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.RESIZE_DURATION).go();\n        },\n        _showWithAnimation: function(da) {\n            new g(da).to(\"height\", \"auto\").to(\"paddingTop\", \"auto\").to(\"paddingBottom\", \"auto\").blind().show().duration(this.RESIZE_DURATION).checkpoint().to(\"opacity\", \"1\").blind().duration(this.FADE_DURATION).go();\n        }\n    });\n    e.exports = ca;\n});\n__d(\"Notifications\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Env\",\"JSBNG__Event\",\"JSLogger\",\"NegativeNotif\",\"NotificationCounter\",\"NotificationList\",\"NotifXList\",\"Parent\",\"Poller\",\"ScrollableArea\",\"Style\",\"SystemEvents\",\"Toggler\",\"URI\",\"UserActivity\",\"UserNoOp\",\"Vector\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"hasArrayNature\",\"isEmpty\",\"shield\",\"throttle\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncSignal\"), k = b(\"Bootloader\"), l = b(\"ChannelConstants\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Env\"), p = b(\"JSBNG__Event\"), q = b(\"JSLogger\"), r = b(\"NegativeNotif\"), s = b(\"NotificationCounter\"), t = b(\"NotificationList\"), u = b(\"NotifXList\"), v = b(\"Parent\"), w = b(\"Poller\"), x = b(\"ScrollableArea\"), y = b(\"Style\"), z = b(\"SystemEvents\"), aa = b(\"Toggler\"), ba = b(\"URI\"), ca = b(\"UserActivity\"), da = b(\"UserNoOp\"), ea = b(\"Vector\"), fa = b(\"$\"), ga = b(\"copyProperties\"), ha = b(\"emptyFunction\"), ia = b(\"ge\"), ja = b(\"hasArrayNature\"), ka = b(\"isEmpty\"), la = b(\"shield\"), ma = b(\"throttle\"), na = b(\"userAction\");\n    function oa(pa) {\n        this.updateTime = ((pa.updateTime || JSBNG__Date.now()));\n        this.update_period = ((pa.updatePeriod || 60000));\n        this.latest_notif_time = ((pa.latestNotif || 0));\n        this.latest_read_notif_time = ((pa.latestReadNotif || 0));\n        this.cache_version = ((pa.cacheVersion || 0));\n        this.notifReceivedType = ((pa.notifReceivedType || \"notification\"));\n        this.wrapperID = ((pa.wrapperID || \"notificationsWrapper\"));\n        this.contentID = ((pa.contentID || \"jewelNotifs\"));\n        this.shouldLogImpressions = ((pa.shouldLogImpressions || false));\n        this.allowDesktopNotifications = ((pa.allowDesktopNotifications || false));\n        this.logAutoShutOffImpression = true;\n        this.useInfiniteScroll = ((pa.useInfiniteScroll || false));\n        this.unseenVsUnread = ((pa.unseenVsUnread || false));\n        this.scrollableAreaNode = null;\n        this.firstReceiptMap = {\n        };\n        this.user = o.user;\n        this.queuedNotifications = [];\n        this.timeElement = \"small.time\";\n        this.ua = new da();\n        this._init();\n    };\n;\n    ga(oa.prototype, {\n        TIME_TRAVEL: \"time_travel\",\n        ONLINE: \"online\",\n        SCROLL_OFF_TINY: \"scroll_off_tiny\",\n        INACTIVE_REFRESH: \"inactive_refresh\",\n        _init: function() {\n            this.cookieName = ((\"notifications_\" + this.user));\n            this.updateCheckCount = 0;\n            this.fetchListeners = [];\n            this.currentFetchRequest = null;\n            this.wrapper = ia(this.wrapperID);\n            this.JSBNG__content = ia(this.contentID);\n            this.jewelFlyout = ia(\"fbNotificationsFlyout\");\n            this.footer = n.JSBNG__find(this.jewelFlyout, \".jewelFooter\");\n            this.loadingIndicator = ia(((this.contentID + \"_loading_indicator\")));\n            this.NOTIF_JEWEL_REF = \"notif_jewel\";\n            this.notifLogger = q.create(\"notifications\");\n            s.init();\n            this.alertList = new t(this.JSBNG__content, this._getListParams());\n            this._updateCount();\n            ((((a.MinNotifications && a.MinNotifications.fetchSent())) && (this.fetch = ha)));\n            h.subscribe(l.getArbiterType(this.notifReceivedType), this._handleNotificationMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_read\"), this._handleNotificationsReadMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_seen\"), this._handleNotificationsSeenMsg.bind(this));\n            h.subscribe(\"jewel/resize\", la(this._hideOverflow, this));\n            this.alertList.subscribe(t.UNREAD_COUNT_CHANGE_TYPE, this._updateCount.bind(this));\n            this._poller = new w({\n                interval: this.update_period,\n                setupRequest: this._update.bind(this),\n                clearOnQuicklingEvents: false,\n                dontStart: true\n            });\n            this._poller.start.bind(this._poller).defer(this.update_period, false);\n            if (this.wrapper) {\n                this.countSpan = n.JSBNG__find(this.wrapper, \"span.jewelCount span\");\n            }\n        ;\n        ;\n            this.initializeEvents();\n            this.fromDom();\n            if (this.useInfiniteScroll) {\n                this._autoLoadNotifIndex = 1;\n                this._truncate = false;\n                this.alertList.subscribe(t.INSERTION_TYPE, this._handleInsert.bind(this));\n            }\n        ;\n        ;\n        },\n        _getListParams: function() {\n            return {\n                shouldBlockAnimation: function(pa) {\n                    return this.isNotifJewelOpen();\n                }.bind(this),\n                unseenVsUnread: this.unseenVsUnread,\n                markReadSignalServer: this.markRead.bind(this).curry(true)\n            };\n        },\n        fromDom: function() {\n            this.alertList.fromDom();\n            ((((((a.MinNotifications && a.MinNotifications.fetched())) && this.alertList.isEmpty())) && this.alertList.showNoNotifications()));\n        },\n        initializeEvents: function() {\n            var pa = this.alertList.ITEM_TAG, qa = null;\n            p.listen(this.JSBNG__content, {\n                mouseover: function(JSBNG__event) {\n                    var ta = JSBNG__event.getTarget();\n                    qa = v.byTag(ta, pa);\n                    if (((qa && ((ta != qa))))) {\n                        if (v.byClass(qa, \"notifNegativeBase\")) {\n                            m.addClass(qa, \"notifHover\");\n                        }\n                         else m.addClass(qa, \"selected\");\n                    ;\n                    }\n                ;\n                ;\n                },\n                mouseout: function(JSBNG__event) {\n                    ((qa && m.removeClass(qa, \"selected\")));\n                    ((qa && m.removeClass(qa, \"notifHover\")));\n                    qa = null;\n                },\n                mousedown: this.onContentMouseDown.bind(this)\n            });\n            p.listen(this.wrapper, \"mouseover\", this.onMouseOver.bind(this));\n            aa.listen(\"show\", this.wrapper, this.onClick.bind(this));\n            aa.listen(\"hide\", this.wrapper, this.onHide.bind(this));\n            ((this.shouldLogImpressions && aa.listen(\"show\", this.wrapper, this._logImpression.bind(this))));\n            var ra = function(ta) {\n                this._poller.request();\n                this.notifLogger.bump(ta);\n            }.bind(this);\n            z.subscribe(z.TIME_TRAVEL, ra.curry(this.TIME_TRAVEL));\n            z.subscribe(z.ONLINE, function(ta, ua) {\n                ((ua && ra(this.ONLINE)));\n            });\n            var sa = ((((1000 * 60)) * 60));\n            ca.subscribe(function(ta, ua) {\n                ((((ua.idleness > sa)) && ra(this.INACTIVE_REFRESH)));\n            }.bind(this));\n            this.negativeNotifs = {\n            };\n            this._initNotifNegativeFeedback();\n            if (this.useInfiniteScroll) {\n                this._setupScroll();\n                this._initializeScrollEvents();\n                this._updateScrollDataStructures.bind(this).defer();\n                this._hideOverflow();\n            }\n        ;\n        ;\n        },\n        _setupScroll: function() {\n            this._scrollArea = n.scry(this.jewelFlyout, \"div.uiScrollableAreaWrap\")[0];\n            this._morePagerLink = n.JSBNG__find(this.jewelFlyout, \".notifMorePager a\");\n            this._morePager = ((v.byClass(this._morePagerLink, \"notifMorePager\") || this._morePagerLink));\n            this._infiniteScrollNotif = null;\n            this.afterFirstFetch = false;\n            this.animate = false;\n            if (((a.MinNotifications && a.MinNotifications.fetched()))) {\n                this.afterFirstFetch = true;\n                m.show(this._morePager);\n            }\n        ;\n        ;\n        },\n        _initializeScrollEvents: function() {\n            p.listen(this._scrollArea, \"JSBNG__scroll\", ma(this._handleScroll.bind(this)));\n            p.listen(this._morePagerLink, \"success\", function(pa) {\n                this.fetchHandler(pa.getData().response);\n            }.bind(this));\n        },\n        _updateScrollDataStructures: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s48bc6385ad36661d437816c45525368eecdb65f2_257), function() {\n            var pa = this.alertList.getIds(), qa = Math.max(0, ((pa.length - this._autoLoadNotifIndex)));\n            this._infiniteScrollNotif = this.alertList.getDomObj(pa[qa]);\n            this._annotateMorePagerURI();\n        })),\n        _annotateMorePagerURI: function() {\n            this._morePagerLink.setAttribute(\"ajaxify\", new ba(this._morePagerLink.getAttribute(\"ajaxify\")).addQueryData({\n                earliest_time: this.alertList.getEarliestNotifTime()\n            }));\n        },\n        onContentMouseDown: function(JSBNG__event) {\n            var pa = v.byTag(JSBNG__event.getTarget(), this.alertList.ITEM_TAG), qa = ((pa && t.getIdFromDom(pa)));\n            if (((qa && this.alertList.isUnreadId(qa)))) {\n                this.markRead(true, [qa,]);\n            }\n        ;\n        ;\n        },\n        onMouseOver: function(JSBNG__event) {\n            if (m.hasClass(JSBNG__event.getTarget(), \"jewelButton\")) {\n                this.ua = na(\"notifs\", JSBNG__event.target, JSBNG__event, {\n                    mode: \"DEDUP\"\n                }).uai(\"mouseover\", \"jewel\").add_event(\"hover\");\n            }\n        ;\n        ;\n            this.fetch();\n        },\n        onClick: function() {\n            ((((a.ArbiterMonitor && ((this.fetch != ha)))) && h.registerCallback(ha, [\"notifs/fetched\",])));\n            this.ua.add_event(\"show\");\n            this.fetch();\n            this.markRead(true);\n            this._hideOverflow();\n            if (this.scrollableAreaNode) {\n                var pa = x.getInstance(this.scrollableAreaNode);\n                ((pa && pa.poke()));\n            }\n        ;\n        ;\n        },\n        onHide: function() {\n            this.animate = false;\n            ((this.animation && this.animation.JSBNG__stop()));\n            this.ua.add_event(\"hide\");\n            this.markRead(true);\n            this._dequeueNotifications();\n        },\n        _dequeueNotifications: function() {\n            this.queuedNotifications.forEach(function(pa) {\n                this._displayNotification(pa.type, pa.data);\n            }, this);\n            this.queuedNotifications.length = 0;\n        },\n        _handleScroll: function() {\n            if (this._checkInfiniteScroll()) {\n                this._autoLoadNotifIndex = 5;\n                this._sendFetchRequest(this._morePager);\n            }\n        ;\n        ;\n        },\n        _handleInsert: function(pa, qa) {\n            if (qa.is_new) {\n                this._newDataFromInsert = true;\n            }\n        ;\n        ;\n            this._updateScrollDataStructures();\n        },\n        _checkInfiniteScroll: function() {\n            if (((this._infiniteScrollNotif && this._scrollArea))) {\n                var pa = ea.getElementPosition(this._infiniteScrollNotif).y, qa = ((ea.getElementPosition(this._scrollArea).y + ea.getElementDimensions(this._scrollArea).y));\n                return ((pa < qa));\n            }\n        ;\n        ;\n            return false;\n        },\n        _initNotifNegativeFeedback: function() {\n            u.init(this);\n            this.alertList.setFilterFn(u.filterStoreClicked);\n            aa.listen(\"hide\", fa(this.wrapperID), function() {\n                {\n                    var fin183keys = ((window.top.JSBNG_Replay.forInKeys)((this.negativeNotifs))), fin183i = (0);\n                    var pa;\n                    for (; (fin183i < fin183keys.length); (fin183i++)) {\n                        ((pa) = (fin183keys[fin183i]));\n                        {\n                            if (pa) {\n                                ((((this.negativeNotifs[pa] instanceof r)) && this.negativeNotifs[pa].reset()));\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }.bind(this));\n            h.subscribe(\"notif/negativeCancel\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].restore()));\n            }.bind(this));\n            h.subscribe(\"notif/negativeConfirmed\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onTurnedOff()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, true, true);\n                this._hideOverflow();\n                this._handleScroll();\n            }.bind(this));\n            h.subscribe(\"notif/negativeUndid\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onUndid()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n                this._hideOverflow();\n            }.bind(this));\n            h.subscribe(\"notif/negativeMarkedSpam\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onMarkedSpam()));\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptYes\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptYes()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptNo\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptNo()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            this.alertList.subscribe(t.INSERTION_TYPE, function(pa, qa) {\n                this._updateFirstReceipt(qa);\n                var ra = n.scry(qa.obj, \".notif_x\");\n                if (((ra.length == 1))) {\n                    this.negativeNotifs[qa.id] = new r(this, qa);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _sendIDs: function(pa, qa, ra) {\n            var sa = ((ra || {\n            }));\n            for (var ta = 0; ((ta < pa.length)); ++ta) {\n                sa[((((\"alert_ids[\" + ta)) + \"]\"))] = pa[ta];\n            ;\n            };\n        ;\n            new j(ba(qa).getQualifiedURI().toString(), sa).send();\n        },\n        _waitForFetch: function(pa) {\n            return ((this.currentFetchRequest && this.fetchListeners.push(pa.bind(this))));\n        },\n        _logImpression: function() {\n            var pa = this.alertList.getIds();\n            if (((((pa.length === 0)) && this._waitForFetch(this._logImpression)))) {\n                return;\n            }\n        ;\n        ;\n            this.logImpressionIds(pa, this.NOTIF_JEWEL_REF);\n        },\n        logImpressionIds: function(pa, qa) {\n            ((this.shouldLogImpressions && this._sendIDs(pa, \"/ajax/notifications/impression.php\", {\n                ref: qa\n            })));\n        },\n        markRead: function(pa, qa) {\n            var ra = !ja(qa);\n            qa = ((ra ? this.alertList.getUnseenIds() : qa.filter(this.alertList.isUnreadId.bind(this.alertList))));\n            if (qa.length) {\n                ((pa && this._sendIDs(qa, \"/ajax/notifications/mark_read.php\", {\n                    seen: ((ra ? 1 : 0))\n                })));\n                if (((ia(\"jewelNoticeMessage\") && this.logAutoShutOffImpression))) {\n                    new j(\"/ajax/notifications/auto_shutoff_seen.php\").send();\n                    this.logAutoShutOffImpression = false;\n                }\n            ;\n            ;\n                var sa = pa;\n                ((ra ? this.alertList.markSeen(qa) : this.alertList.markRead(qa, sa)));\n            }\n        ;\n        ;\n            ((ra && this._waitForFetch(this.markRead.bind(this, pa))));\n        },\n        markAllRead: function() {\n            var pa = this.alertList.getUnreadIds();\n            this.markRead(true, pa);\n        },\n        _updateErrorHandler: function(pa) {\n        \n        },\n        _updateURI: \"/ajax/presence/update.php\",\n        _update: function(pa) {\n            pa.setHandler(this._handleUpdate.bind(this)).setOption(\"suppressErrorAlerts\", true).setErrorHandler(this._updateErrorHandler.bind(this)).setData({\n                notif_latest: this.latest_notif_time,\n                notif_latest_read: this.latest_read_notif_time\n            }).setURI(this._updateURI).setAllowCrossPageTransition(true);\n        },\n        _handleUpdate: function(pa) {\n            var qa = pa.payload.notifications;\n            if (!qa.no_change) {\n                this.updateTime = pa.payload.time;\n                this.latest_notif_time = qa.latest_notif;\n                this.latest_read_notif_time = qa.latest_read_notif;\n                this._updateDisplay();\n                this.alertList.insertMany(qa.notifications);\n            }\n        ;\n        ;\n        },\n        _updateDisplay: function() {\n            if (!this.JSBNG__content) {\n                return;\n            }\n        ;\n        ;\n            this._updateCount();\n        },\n        _updateCount: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: \"notifications\",\n                count: this.alertList.unseenCount\n            }, h.BEHAVIOR_STATE);\n            this._hideOverflow();\n        },\n        fetch: function(pa) {\n            this._sendFetchRequest(pa);\n        },\n        _getFetchQueryData: function() {\n            var pa = {\n                time: this.latest_notif_time,\n                user: this.user,\n                version: this.cache_version,\n                locale: o.locale\n            };\n            if (this.useInfiniteScroll) {\n                pa.earliest_time = this.alertList.getEarliestNotifTime();\n            }\n        ;\n        ;\n            return pa;\n        },\n        _sendFetchRequest: function(pa) {\n            if (this.useInfiniteScroll) {\n                this._infiniteScrollNotif = null;\n                this._newDataFromInsert = false;\n                this._truncate = true;\n            }\n        ;\n        ;\n            var qa = ba(\"/ajax/notifications/get.php\"), ra = ((pa || this.loadingIndicator));\n            if (this.currentFetchRequest) {\n                return true;\n            }\n        ;\n        ;\n            this.ua.add_event(\"fetch\");\n            qa.setQueryData(this._getFetchQueryData());\n            this.currentFetchRequest = new i().setURI(qa).setStatusElement(ra).setMethod(\"GET\").setReadOnly(true).setTimeoutHandler(30000, this.fetchErrorHandler.bind(this)).setHandler(this.fetchHandler.bind(this)).setErrorHandler(this.fetchErrorHandler.bind(this)).setAllowCrossPageTransition(true);\n            ((!this.currentFetchRequest.send() && this.fetchErrorHandler()));\n            return true;\n        },\n        fetchErrorHandler: function(pa) {\n            this.currentFetchRequest = null;\n            this.ua.add_event(\"fetch_error\");\n            ((this.loadingIndicator && m.hide(this.loadingIndicator)));\n            ((this.useInfiniteScroll && this._updateScrollDataStructures()));\n        },\n        fetchHandler: function(pa) {\n            this.ua.add_event(\"fetch_success\");\n            var qa = pa.getPayload();\n            this.alertList.insertMany(qa.notifications, true);\n            ((this.loadingIndicator && m.hide(this.loadingIndicator)));\n            this.loadingIndicator = null;\n            this.currentFetchRequest = null;\n            this.fetch = ha;\n            if (this.fetchListeners) {\n                for (var ra = 0; ((ra < this.fetchListeners.length)); ra++) {\n                    this.fetchListeners[ra]();\n                ;\n                };\n            ;\n                this.fetchListeners = [];\n            }\n        ;\n        ;\n            ((a.ArbiterMonitor && h.inform(\"notifs/fetched\", \"\", h.BEHAVIOR_STATE)));\n            var sa = qa.generated, ta = Math.round(((JSBNG__Date.now() / 1000)));\n            if (((((ta - sa)) > 15))) {\n                sa = ta;\n            }\n        ;\n        ;\n            k.loadModules([\"LiveTimer\",], function(ua) {\n                ua.restart(sa);\n                ua.startLoop(0);\n            });\n            if (this.useInfiniteScroll) {\n                if (((ka(qa.notifications) || !this._newDataFromInsert))) {\n                    this._noMoreNotifications();\n                }\n                 else m.show(this._morePager);\n            ;\n            ;\n                this._updateScrollDataStructures();\n                if (((this.isNotifJewelOpen() && this.afterFirstFetch))) {\n                    this.animate = true;\n                }\n            ;\n            ;\n                this.afterFirstFetch = true;\n            }\n        ;\n        ;\n            this._hideOverflow();\n        },\n        _noMoreNotifications: function() {\n            m.hide(this._morePager);\n            this.useInfiniteScroll = false;\n        },\n        _mergeNotification: function(pa, qa, ra, sa) {\n            var ta = !this.alertList.isUnreadId(pa);\n            this.alertList.insert(pa, qa, ra, true, null, ((sa || null)));\n            this.latest_notif_time = 0;\n            if (ta) {\n                this._updateCount();\n            }\n        ;\n        ;\n            var ua = this.alertList.getDomObj(pa);\n            if (ua) {\n                k.loadModules([\"LiveTimer\",], function(va) {\n                    va.addTimeStamps(ua);\n                });\n            }\n        ;\n        ;\n        },\n        _handleNotificationMsg: function(pa, qa) {\n            if (this.isNotifJewelOpen()) {\n                var ra = {\n                    type: pa,\n                    data: qa\n                };\n                this.queuedNotifications.push(ra);\n            }\n             else this._displayNotification(pa, qa);\n        ;\n        ;\n        },\n        _displayNotification: function(pa, qa) {\n            var ra = qa.obj;\n            if (((typeof this.useDesktopNotifications == \"undefined\"))) {\n                this.useDesktopNotifications = ((((this.allowDesktopNotifications && window.JSBNG__webkitNotifications)) && ((window.JSBNG__webkitNotifications.checkPermission() === 0))));\n            }\n        ;\n        ;\n            if (this.useDesktopNotifications) {\n                k.loadModules([\"DesktopNotifications\",], function(sa) {\n                    sa.addNotification(ra.alert_id);\n                });\n            }\n        ;\n        ;\n            if (ra.markup) {\n                this._mergeNotification(ra.alert_id, ra.time, ra.markup, ((ra.alt_id || null)));\n            }\n             else this._poller.request();\n        ;\n        ;\n        },\n        _handleNotificationsReadMsg: function(pa, qa) {\n            var ra = qa.obj;\n            this.markRead(false, ra.alert_ids);\n        },\n        _handleNotificationsSeenMsg: function(pa, qa) {\n            if (!this.unseenVsUnread) {\n                this._handleNotificationsReadMsg(pa, qa);\n                return;\n            }\n        ;\n        ;\n            var ra = qa.obj;\n            this.alertList.markSeen(ra.alert_ids);\n        },\n        _hideOverflow: function() {\n            if (!this.isNotifJewelOpen()) {\n                return;\n            }\n        ;\n        ;\n            var pa = n.scry(fa(\"fbNotificationsList\"), \".notification\");\n            this.scrollableAreaNode = ((this.scrollableAreaNode || n.scry(this.jewelFlyout, \".uiScrollableArea\")[0]));\n            var qa = 20, ra = ((m.hasClass(JSBNG__document.documentElement, \"tinyViewport\") && !m.hasClass(JSBNG__document.body, \"fixedBody\")));\n            if (((!pa.length || ra))) {\n                y.set(this.scrollableAreaNode, \"height\", \"100%\");\n                this.notifLogger.rate(this.SCROLL_OFF_TINY, ra);\n                return;\n            }\n        ;\n        ;\n            var sa = ((this.scrollableAreaNode || pa[0])), ta = ((((((ea.getViewportDimensions().y - ea.getElementPosition(sa, \"viewport\").y)) - ea.getElementDimensions(this.footer).y)) - 5)), ua = ta, va = 0;\n            for (; ((((va < pa.length)) && ((ua > 0)))); ++va) {\n                if (m.shown(pa[va])) {\n                    ua -= ea.getElementDimensions(pa[va]).y;\n                }\n            ;\n            ;\n            };\n        ;\n            var wa = 530, xa = Math.min(wa, ((ta - Math.max(ua, 0))));\n            if (((((ua >= 0)) && ((xa < wa))))) {\n                if (!this.useInfiniteScroll) {\n                    xa = \"100%\";\n                }\n                 else {\n                    if (((this._truncate && ((pa.length >= 5))))) {\n                        xa -= qa;\n                    }\n                ;\n                ;\n                    xa += \"px\";\n                }\n            ;\n            ;\n            }\n             else xa += \"px\";\n        ;\n        ;\n            if (((((this.useInfiniteScroll && this.animate)) && ((xa != \"100%\"))))) {\n                ((this.animation && this.animation.JSBNG__stop()));\n                this.animation = new g(this.scrollableAreaNode).to(\"height\", xa).duration(200).go();\n            }\n             else {\n                var ya = x.getInstance(this.scrollableAreaNode);\n                ((ya && ya.showScrollbar.bind(ya).defer()));\n                y.set(this.scrollableAreaNode, \"height\", xa);\n            }\n        ;\n        ;\n        },\n        _updateFirstReceipt: function(pa) {\n            var qa = pa.obj.getAttribute(\"data-appid\"), ra = n.scry(pa.obj, \".first_receipt_div\");\n            if (((qa && ((ra.length == 1))))) {\n                if (this.firstReceiptMap[qa]) {\n                    if (((((pa.id != this.firstReceiptMap[qa].id)) && ((this.firstReceiptMap[qa].time > pa.time))))) {\n                        return;\n                    }\n                ;\n                ;\n                    m.removeClass(this.firstReceiptMap[qa].obj, \"first_receipt\");\n                }\n            ;\n            ;\n                this.firstReceiptMap[qa] = pa;\n                m.addClass(pa.obj, \"first_receipt\");\n            }\n        ;\n        ;\n        },\n        isNotifJewelOpen: function() {\n            var pa = aa.getInstance(this.wrapper).getActive();\n            return ((((pa === this.wrapper)) && m.hasClass(pa, \"openToggler\")));\n        }\n    });\n    e.exports = oa;\n});\n__d(\"legacy:original-notifications-jewel\", [\"Notifications\",], function(a, b, c, d) {\n    a.Notifications = b(\"Notifications\");\n}, 3);\n__d(\"legacy:onvisible\", [\"OnVisible\",], function(a, b, c, d) {\n    a.OnVisible = b(\"OnVisible\");\n}, 3);\n__d(\"PagesVoiceBar\", [\"$\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"ChannelConstants\",\"DOM\",\"PageTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"ChannelConstants\"), l = b(\"DOM\"), m = b(\"PageTransitions\"), n = \"PagesVoiceBar/toggle\", o = \"PagesVoiceBar/initialized\", p = \"PagesVoiceBar/switchVoice\", q = \"page_transition\", r = \"pages_voice_bar_sync\", s = null, t = null, u = false, v = false;\n    function w() {\n        v = !v;\n        j.conditionClass(JSBNG__document.body, \"hasVoiceBar\", v);\n    };\n;\n    function x(da, ea) {\n        new i(\"/ajax/pages/switch_voice.php\").setData(ea).setHandler(function(fa) {\n            ba();\n        }).send();\n    };\n;\n    function y() {\n        s = null;\n    };\n;\n    function z(da, ea) {\n        if (((ea.obj.profile_id && ((ea.obj.profile_id == s))))) {\n            ba();\n        }\n    ;\n    ;\n    };\n;\n    function aa(da) {\n        h.subscribe(o, da);\n    };\n;\n    function ba() {\n        m.getNextURI().go();\n    };\n;\n    var ca = {\n        initVoiceBar: function() {\n            if (u) {\n                return;\n            }\n        ;\n        ;\n            t = g(\"pagesVoiceBarContent\");\n            v = j.hasClass(JSBNG__document.body, \"hasVoiceBar\");\n            h.subscribe(n, w);\n            h.subscribe(p, x);\n            h.subscribe(q, y);\n            h.subscribe(k.getArbiterType(r), z);\n            u = true;\n            h.inform(o, null, h.BEHAVIOR_STATE);\n        },\n        update: function(da, ea) {\n            aa(function() {\n                s = ea;\n                l.setContent(t, da);\n            });\n        }\n    };\n    e.exports = ca;\n});\n__d(\"PrivacyLiteFlyout\", [\"JSBNG__Event\",\"function-extensions\",\"$\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Ease\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"Toggler\",\"copyProperties\",\"cx\",\"csx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"$\"), i = b(\"Animation\"), j = b(\"Arbiter\"), k = b(\"ArbiterMixin\"), l = b(\"AsyncRequest\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Ease\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Style\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"csx\"), w = b(\"ge\"), x = \"PrivacyLiteFlyout/expandingSection\", y = {\n    }, z = {\n    };\n    function aa() {\n        switch (window.JSBNG__location.pathname) {\n          case \"/\":\n        \n          case \"/home.php\":\n        \n          case \"/index.php\":\n            return true;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    function ba(ka) {\n        var la = \".-cx-PUBLIC-PrivacyLiteFlyoutNav__label\";\n        return ((!p.byClass(ka, \"hasSmurfbar\") && n.scry(h(\"blueBar\"), la).length));\n    };\n;\n    function ca(ka, la, ma) {\n        var na = ((la ? 0 : ka.offsetHeight));\n        r.set(ka, \"height\", ((na + \"px\")));\n        r.set(ka, \"overflow\", \"hidden\");\n        m.show(ka);\n        var oa = ((la ? ka.scrollHeight : 0)), pa = n.getID(ka);\n        ((y[pa] && y[pa].JSBNG__stop()));\n        y[pa] = new i(ka).to(\"height\", oa).ondone(function() {\n            y[pa] = null;\n            r.set(ka, \"height\", \"\");\n            r.set(ka, \"overflow\", \"\");\n            ((oa || m.hide(ka)));\n            ma();\n        }).duration(((Math.abs(((oa - na))) * 1.5))).ease(o.sineOut).go();\n    };\n;\n    function da(ka) {\n        return new l().setURI(ka).send();\n    };\n;\n    function ea() {\n        return da(\"/ajax/privacy/privacy_lite/increment_masher_tip_count\");\n    };\n;\n    function fa() {\n        return da(\"/ajax/privacy/privacy_lite/dismiss_masher_tip\");\n    };\n;\n    var ga = null, ha = false, ia = false, ja = t({\n        loadBody: function(ka) {\n            if (((!ha && w(\"fbPrivacyLiteFlyoutLoading\")))) {\n                ha = true;\n                if (!ka) {\n                    ka = false;\n                }\n            ;\n            ;\n                new l(\"/ajax/privacy/privacy_lite/loader\").setData({\n                    from_megaphone: ka\n                }).send();\n            }\n        ;\n        ;\n        },\n        renderBody: function(ka) {\n            var la = w(\"fbPrivacyLiteFlyoutLoading\");\n            if (la) {\n                n.replace(la, ka);\n                ja.inform(\"load\", null, j.BEHAVIOR_STATE);\n            }\n        ;\n        ;\n        },\n        hideCleanup: function(ka) {\n            j.inform(x);\n            var la = n.scry(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\").forEach(function(ma) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n            });\n        },\n        registerFlyoutToggler: function(ka, la) {\n            ga = la;\n            var ma = s.createInstance(ka);\n            ma.setSticky(false);\n            s.listen([\"show\",\"hide\",], la, function(na) {\n                ja.inform(na);\n                ia = ((na === \"show\"));\n                if (!ia) {\n                    ja.hideCleanup(ka);\n                    ma.hide();\n                    j.inform(\"layer_hidden\", {\n                        type: \"PrivacyShortcutsFlyout\"\n                    });\n                }\n                 else j.inform(\"layer_shown\", {\n                    type: \"PrivacyShortcutsFlyout\"\n                });\n            ;\n            ;\n            });\n        },\n        registerFinalReminderFlyout: function(ka) {\n            if (((ia || !aa()))) {\n                return;\n            }\n        ;\n        ;\n            var la = n.JSBNG__find(ka.getRoot(), \".-cx-PRIVATE-PrivacyLiteFinalReminder__okay\"), ma = ka.getContext();\n            if (ba(ma)) {\n                ka.setOffsetY(-5);\n            }\n        ;\n        ;\n            ja.subscribe(\"show\", function() {\n                ka.hide();\n            });\n            var na = g.listen(la, \"click\", function() {\n                ka.hide();\n                da(\"/ajax/privacy/privacy_lite/dismiss_rollout_reminder\");\n                na.remove();\n            });\n            da(\"/ajax/privacy/privacy_lite/increment_rollout_reminder\");\n            ka.show();\n        },\n        isFlyoutVisible: function() {\n            return ((ga && ((s.getActive() === ga))));\n        },\n        exists: function() {\n            return !!n.scry(JSBNG__document.body, \".-cx-PUBLIC-PrivacyLiteFlyoutNav__button\")[0];\n        },\n        setFlyoutVisible: function(ka) {\n            ((ka ? s.show(ga) : s.hide(ga)));\n        },\n        showSection: function(ka) {\n            var la = z[ka], ma = la.chevron, na = la.sublist_container;\n            j.inform(x, ma);\n            if (((ja.inform(\"expand\", ka) !== false))) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.addClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(na, true, function() {\n                    ja.inform(\"expanded\", ka);\n                });\n            }\n        ;\n        ;\n        },\n        hideSection: function(ka, la, ma) {\n            var na = z[ka], oa = na.chevron, pa = na.sublist_container;\n            if (((ma === oa))) {\n                return;\n            }\n        ;\n        ;\n            if (((ja.inform(\"collapse\", ka) !== false))) {\n                m.addClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.removeClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(pa, false, function() {\n                    ja.inform(\"collapsed\", ka);\n                });\n            }\n        ;\n        ;\n        },\n        toggleSection: function(ka) {\n            var la = z[ka].chevron;\n            s.getInstance(la).hide();\n            if (m.hasClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\")) {\n                ja.showSection(ka);\n                new l(\"/ajax/privacy/privacy_lite/log_section_expand\").setData({\n                    section: ka\n                }).send();\n            }\n             else ja.hideSection(ka);\n        ;\n        ;\n        },\n        registerSection: function(ka, la) {\n            z[ka] = la;\n            j.subscribe(x, ja.hideSection.curry(ka));\n            g.listen(la.section_block, \"click\", ja.toggleSection.curry(ka));\n        },\n        registerInlineHelpOnAudienceChange: function(ka, la, ma) {\n            q.subscribe(\"select\", function(na, oa) {\n                if (((oa.selector != ka))) {\n                    return;\n                }\n            ;\n            ;\n                m.addClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n                if (ma) {\n                    new l(\"/ajax/privacy/privacy_lite/kill_intro\").send();\n                }\n            ;\n            ;\n            });\n        },\n        registerInlineHelpXOutOnClick: function(ka, la) {\n            g.listen(ka, \"click\", m.addClass.curry(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__reallygone\"));\n        },\n        registerBlockUnhideOnFocus: function(ka, la) {\n            g.listen(ka, \"JSBNG__focus\", m.show.curry(la));\n        },\n        registerMessageFilterSettingOnClick: function(ka, la) {\n            var ma = n.JSBNG__find(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__filterradio\");\n            g.listen(ka, \"click\", function() {\n                if (ma.checked) {\n                    new l(\"/ajax/mercury/change_filtering_type.php\").setData({\n                        filtering_type: la,\n                        source: \"privacy_lite\"\n                    }).send();\n                }\n            ;\n            ;\n            });\n        },\n        registerGraphSearchPrivacyReminder: function(ka, la) {\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                da(\"/ajax/privacy/privacy_lite/dismiss_gs_privacy_reminder\");\n            });\n        },\n        registerMasher: function(ka, la) {\n            var ma = false;\n            j.subscribe(x, function(na, oa) {\n                var pa = n.scry(p.byTag(oa, \"li\"), \".-cx-PRIVATE-PrivacyLiteFlyoutNav__notice\").length;\n                if (((ma || !pa))) {\n                    return;\n                }\n            ;\n            ;\n                ma = Boolean(ea());\n            });\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                fa();\n            });\n        }\n    }, k);\n    e.exports = ja;\n});\n__d(\"PrivacyLiteFlyoutHelp\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"ContextualHelpSearchController\",\"CSS\",\"DOM\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ContextualHelpSearchController\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q, r;\n    function s(t, u, v, w, x) {\n        this._width = 315;\n        r = l.JSBNG__find(u, \"input\");\n        var y = l.create(\"div\");\n        this.init(t, r, y, v, w);\n        q = m.byClass(u, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__root\");\n        g.listen(x, \"click\", this._hideSearch.bind(this));\n        h.subscribe(\"PrivacyLiteFlyout/expandingSection\", this._hideSearch.bind(this));\n        var z = l.scry(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchlink\")[0];\n        ((z && g.listen(z, \"click\", function() {\n            k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n            r.JSBNG__focus();\n            if (!this.suggestedResults) {\n                new i(\"/ajax/privacy/privacy_lite/help_suggestions\").setHandler(function(aa) {\n                    var ba = aa.getPayload().searchSuggestions, ca = l.JSBNG__find(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchsuggestions\");\n                    l.setContent(ca, ba);\n                    k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__hassearchsuggestions\");\n                }.bind(this)).send();\n            }\n        ;\n        ;\n        }.bind(this))));\n    };\n;\n    n(s.prototype, new j(), {\n        source: \"privacy_shortcuts\",\n        _hideSearch: function() {\n            this.clearResults();\n            k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n        },\n        show: function(t) {\n            if (((t === this.topics_area))) {\n                k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                return;\n            }\n             else if (((t === this.loader))) {\n                k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                k.hide(this.results_area);\n            }\n             else k.hide(this.loader);\n            \n        ;\n        ;\n            k.show(t);\n        }\n    });\n    e.exports = s;\n});\n__d(\"LayerSlowlyFadeOnShow\", [\"Class\",\"LayerFadeOnShow\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LayerFadeOnShow\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n;\n    g.extend(j, h);\n    j.prototype._getDuration = i.thatReturns(500);\n    e.exports = j;\n});\n__d(\"PrivacyLiteNUXController\", [\"AsyncRequest\",\"CSS\",\"JSBNG__Event\",\"LayerSlowlyFadeOnShow\",\"Locale\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"PrivacyLiteFlyout\",\"Toggler\",\"$\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"JSBNG__Event\"), j = b(\"LayerSlowlyFadeOnShow\"), k = b(\"Locale\"), l = b(\"ModalMask\"), m = b(\"PageTransitions\"), n = b(\"Parent\"), o = b(\"PrivacyLiteFlyout\"), p = b(\"Toggler\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"cx\"), t = \"-cx-PUBLIC-fbPrivacyLiteMegaphone__openedfrommegaphone\", u = \"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide\", v = [], w = {\n        bootload: function() {\n        \n        },\n        init: function(y) {\n            if (!w.initialized) {\n                r(this, {\n                    dialog: y.dialog,\n                    sectionID: y.sectionID,\n                    subsectionID: y.subsectionID,\n                    initialized: true,\n                    tourStarted: false\n                });\n            }\n        ;\n        ;\n            if (y.showOnExpand) {\n                w._attachFlyoutListener();\n            }\n             else w._detachFlyoutListener();\n        ;\n        ;\n        },\n        startTourFromAnywhere: function() {\n            w._startTour(false);\n        },\n        startTourFromMegaphone: function() {\n            w._startTour(true);\n        },\n        _startTour: function(y) {\n            if (w.tourStarted) {\n                return;\n            }\n        ;\n        ;\n            w.tourStarted = true;\n            w._detachFlyoutListener();\n            new g(\"/ajax/privacy/privacy_lite/log_nux_imp\").setData({\n                from_megaphone: y\n            }).send();\n            l.show();\n            h.conditionClass(w.dialog.getRoot(), t, y);\n            if (!y) {\n                w._maskListener = i.listen(q(\"modalMaskOverlay\"), \"click\", w._cleanup);\n            }\n        ;\n        ;\n            p.setSticky(true);\n            JSBNG__setTimeout(w._showFlyout);\n            m.registerHandler(function() {\n                w._cleanup();\n                o.setFlyoutVisible(false);\n            }, 10);\n        },\n        _showFlyout: function() {\n            o.loadBody(true);\n            o.setFlyoutVisible(true);\n            w._initDialog();\n            x(\"load\", w._showTour);\n        },\n        _showTour: function() {\n            o.showSection(w.sectionID);\n            x(\"expanded\", function(y, z) {\n                if (((z === w.sectionID))) {\n                    w.dialog.setContext(q(w.subsectionID)).setOffsetY(20).show();\n                }\n            ;\n            ;\n            });\n            x([\"collapse\",\"hide\",], w._cleanup);\n        },\n        _initDialog: function() {\n            var y = w.dialog.getRoot(), z = w.dialog.getContent();\n            h.addClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogroot\");\n            h.conditionClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__rtl\", k.isRTL());\n            h.addClass(z, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogcontent\");\n            w.dialog.enableBehavior(j);\n            i.listen(y, \"click\", function(JSBNG__event) {\n                if (n.byClass(JSBNG__event.getTarget(), u)) {\n                    w._cleanup();\n                }\n            ;\n            ;\n            });\n        },\n        _attachFlyoutListener: function() {\n            if (!w.flyoutSubscription) {\n                if (o.isFlyoutVisible()) {\n                    w.startTourFromAnywhere();\n                }\n                 else w.flyoutSubscription = o.subscribe(\"show\", w.startTourFromAnywhere);\n            ;\n            }\n        ;\n        ;\n        },\n        _detachFlyoutListener: function() {\n            if (w.flyoutSubscription) {\n                w.flyoutSubscription.unsubscribe();\n                w.flyoutSubscription = null;\n            }\n        ;\n        ;\n        },\n        _cleanup: function() {\n            if (!w.tourStarted) {\n                return;\n            }\n        ;\n        ;\n            w.tourStarted = false;\n            p.setSticky(false);\n            l.hide();\n            w.dialog.hide();\n            while (v.length) {\n                v.pop().unsubscribe();\n            ;\n            };\n        ;\n            if (w._maskListener) {\n                w._maskListener.remove();\n                w._maskListener = null;\n            }\n        ;\n        ;\n        }\n    };\n    function x(y, z) {\n        v.push(o.subscribe(y, z));\n    };\n;\n    e.exports = w;\n});\n__d(\"ViewasChromeBar\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Focus\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"ModalMask\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"cx\"), q = b(\"csx\"), r = \"ViewasChromeBar/initialized\", s = null, t = false;\n    function u(x) {\n        h.subscribe(r, x);\n    };\n;\n    function v(x) {\n        j.addClass(x, \"-cx-PRIVATE-ViewasChromeBar__specificselectormode\");\n        var y = k.JSBNG__find(x, \".-cx-PRIVATE-ViewasChromeBar__userselector\");\n        l.set(k.JSBNG__find(y, \".textInput\"));\n    };\n;\n    var w = {\n        initChromeBar: function(x) {\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            s = x;\n            t = true;\n            h.inform(r, null, h.BEHAVIOR_STATE);\n        },\n        update: function(x, y) {\n            u(function() {\n                k.setContent(s, x);\n                if (y) {\n                    new i(\"/ajax/privacy/glasgow/viewas_bar_flyout_open\").send();\n                }\n            ;\n            ;\n            });\n        },\n        registerSpecificModeOnClick: function(x) {\n            g.listen(x, \"click\", v.curry(o.byClass(x, \"-cx-PRIVATE-ViewasChromeBar__text\")));\n        },\n        registerFlyoutModalMask: function() {\n            m.show();\n            n.registerHandler(m.hide, 10);\n        }\n    };\n    e.exports = w;\n});\n__d(\"BingScalingCommon\", [], function(a, b, c, d, e, f) {\n    var g = {\n        integrateWebsuggestions: function(h, i, j, k, l) {\n            var m = [], n = ((i ? m : [])), o = [], p = 0, q = 0, r = j;\n            k = Math.floor(((j * k)));\n            for (var s = 0; ((s < h.length)); s++) {\n                var t = h[s];\n                if (((((t.type === \"websuggestion\")) && !t.isSeeMore))) {\n                    if (((((((r > 0)) && ((p < k)))) || ((((p > 0)) && ((p < l))))))) {\n                        n.push(t);\n                        p++;\n                        r--;\n                    }\n                     else if (((r > 0))) {\n                        o.push(t);\n                    }\n                    \n                ;\n                ;\n                }\n                 else {\n                    if (((((r <= 0)) && !i))) {\n                        continue;\n                    }\n                ;\n                ;\n                    m.push(t);\n                    q++;\n                    r--;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((((r > 0)) && ((o.length > 0))))) {\n                n = n.concat(o.slice(0, r));\n            }\n        ;\n        ;\n            if (!i) {\n                return m.concat(n);\n            }\n        ;\n        ;\n            return n;\n        }\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchSponsoredUtils\", [], function(a, b, c, d, e, f) {\n    function g(o) {\n        return ((o.selected_target_id != o.s_target));\n    };\n;\n    function h(o, p) {\n        return Math.min(p.maxNumberAds, ((((p.maxNumberRemovedResults + p.maxNumberResultsAndAds)) - o)));\n    };\n;\n    function i(o, p) {\n        var q = {\n        };\n        for (var r = ((o.length - 1)); ((r >= 0)); --r) {\n            var s = o[r];\n            q[s] = s;\n            if (p.hasOwnProperty(s)) {\n                p[s].forEach(function(t) {\n                    q[t] = s;\n                });\n            }\n        ;\n        ;\n        };\n    ;\n        return q;\n    };\n;\n    function j(o, p, q) {\n        for (var r = p; ((r < o.length)); r++) {\n            ((o[r].setDebugString && o[r].setDebugString(q)));\n        ;\n        };\n    ;\n    };\n;\n    function k(o, p) {\n        return ((p.indexOf(String(o)) != -1));\n    };\n;\n    function l(o, p, q, r) {\n        if (n.isSelfPromoted(o)) {\n            return false;\n        }\n    ;\n    ;\n        if (((((q + p.length)) < r.maxNumberResultsAndAds))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function m(o, p, q, r) {\n        var s = o[((o.length - 1))];\n        if (p.hasOwnProperty(s)) {\n            return false;\n        }\n    ;\n    ;\n        if (((s == q))) {\n            return false;\n        }\n    ;\n    ;\n        if (((s == r))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    var n = {\n        isSelfPromoted: function(o) {\n            return ((o.uid == o.s_target));\n        },\n        prepareAndSortAds: function(o, p, q) {\n            if (!p) {\n                return [];\n            }\n        ;\n        ;\n            var r = [], s = o.length, t = {\n            };\n            for (var u = 0; ((u < s)); u++) {\n                var v = o[u];\n                t[v.uid] = true;\n                if (v.s_categories) {\n                    v.s_categories.forEach(function(z) {\n                        t[z] = true;\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin184keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin184i = (0);\n                var w;\n                for (; (fin184i < fin184keys.length); (fin184i++)) {\n                    ((w) = (fin184keys[fin184i]));\n                    {\n                        if (p[w]) {\n                            {\n                                var fin185keys = ((window.top.JSBNG_Replay.forInKeys)((p[w]))), fin185i = (0);\n                                var x;\n                                for (; (fin185i < fin185keys.length); (fin185i++)) {\n                                    ((x) = (fin185keys[fin185i]));\n                                    {\n                                        var y = p[w][x];\n                                        if (((q && q.hasOwnProperty(y.uid)))) {\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                        r.push(y);\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            r.sort(function(z, aa) {\n                return ((aa.s_value - z.s_value));\n            });\n            return r;\n        },\n        selectAds: function(o, p, q, r, s) {\n            var t = [], u = {\n            }, v = {\n            }, w = {\n            }, x = 0, y = h(o.length, r), z = i(o, p);\n            for (var aa = 0; ((aa < q.length)); aa++) {\n                if (((t.length >= y))) {\n                    j(q, aa, ((((\"filtered: \" + y)) + \" ads already selected\")));\n                    break;\n                }\n            ;\n            ;\n                var ba = q[aa], ca = ((z[ba.s_target] || ba.s_target));\n                ba.selected_target_id = ca;\n                if (!k(ca, o)) {\n                    ((ba.setDebugString && ba.setDebugString(((((((((\"filtered: targeted organic \" + ca)) + \" does not exist. \")) + \"promoted id \")) + ba.uid)))));\n                    continue;\n                }\n            ;\n            ;\n                if (((l(ba, o, x, r) && !m(o, v, ca, s)))) {\n                    ((ba.setDebugString && ba.setDebugString(\"filtered: last organic need but cannot be removed\")));\n                    continue;\n                }\n            ;\n            ;\n                if (((!n.isSelfPromoted(ba) && ((o.indexOf(String(ba.uid)) != -1))))) {\n                    ((ba.setDebugString && ba.setDebugString(((((((\"filtered: organic \" + ba.uid)) + \" targets another organic \")) + ca)))));\n                    continue;\n                }\n            ;\n            ;\n                if (u.hasOwnProperty(ba.s_account)) {\n                    ((ba.setDebugString && ba.setDebugString(((((\"filtered: ad account \" + ba.s_account)) + \" already selected\")))));\n                    continue;\n                }\n            ;\n            ;\n                if (w.hasOwnProperty(ba.uid)) {\n                    ((ba.setDebugString && ba.setDebugString(((((\"filtered: ad promoted id \" + ba.uid)) + \" already selected\")))));\n                    continue;\n                }\n            ;\n            ;\n                ((ba.setDebugString && ba.setDebugString(\"selected\")));\n                t.push(ba);\n                u[ba.s_account] = true;\n                v[ca] = true;\n                w[ba.uid] = true;\n                if (!n.isSelfPromoted(ba)) {\n                    ++x;\n                    if (((((x + o.length)) > r.maxNumberResultsAndAds))) {\n                        o.pop();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return t;\n        },\n        hasTopResult: function(o, p, q) {\n            if (((o == null))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.type == \"user\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.type == \"grammar\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.score > q.v0))) {\n                return true;\n            }\n        ;\n        ;\n            if (((o.s_value > q.v3))) {\n                return true;\n            }\n        ;\n        ;\n            if (((o.s_value > p.s_value))) {\n                return true;\n            }\n        ;\n        ;\n            var r = ((g(p) ? q.v4 : ((o.bootstrapped ? q.v1 : q.v2))));\n            if (((r < p.s_value))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        setOrganicECPM: function(o, p) {\n            if (((o == null))) {\n                return;\n            }\n        ;\n        ;\n            for (var q = 0; ((q < p.length)); q++) {\n                if (o.hasOwnProperty(p[q].uid)) {\n                    p[q].s_value = o[p[q].uid];\n                }\n            ;\n            ;\n            };\n        ;\n            return;\n        },\n        buildResultIndices: function(o) {\n            var p = {\n            }, q = o.length;\n            for (var r = 0; ((r < q)); r++) {\n                p[o[r].uid] = r;\n            ;\n            };\n        ;\n            return p;\n        },\n        getTopAdPosition: function(o, p, q) {\n            if (((o.length < 1))) {\n                return null;\n            }\n        ;\n        ;\n            if (((p.length < 1))) {\n                return null;\n            }\n        ;\n        ;\n            if (((((o[0].type == \"user\")) || ((o[0].type == \"grammar\"))))) {\n                for (var r = 1; ((r < o.length)); ++r) {\n                    if (((o[r].type != o[0].type))) {\n                        return r;\n                    }\n                ;\n                ;\n                };\n            ;\n                return o.length;\n            }\n        ;\n        ;\n            if (n.hasTopResult(o[0], p[0], q)) {\n                return 1;\n            }\n        ;\n        ;\n            return 0;\n        }\n    };\n    e.exports = n;\n});\n__d(\"TypeaheadSearchSponsored\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"TypeaheadSearchSponsoredUtils\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"URI\"), l = b(\"copyProperties\"), m = b(\"TypeaheadSearchSponsoredUtils\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n;\n    o.prototype.enable = function() {\n        this._data = this._typeahead.getData();\n        this._dataSubscriptions = [this._data.subscribe(\"beginFetchHandler\", function(p, q) {\n            var r = q.response.getPayload();\n            if (r.s_entries) {\n                this._sponsoredEntries = ((this._sponsoredEntries || {\n                }));\n                var s = r.s_entries.length;\n                for (var t = 0; ((t < s)); t++) {\n                    var u = new o.Ad();\n                    l(u, r.s_entries[t]);\n                    var v = u.s_target;\n                    if (!this._sponsoredEntries[v]) {\n                        this._sponsoredEntries[v] = {\n                        };\n                    }\n                ;\n                ;\n                    this._sponsoredEntries[v][u.uid] = u;\n                };\n            ;\n                if (r.s_bootstrap_id) {\n                    this._sBootstrapID = r.s_bootstrap_id;\n                }\n            ;\n            ;\n                if (r.organic_s_value) {\n                    this._organicECPM = l(this._organicECPM, r.organic_s_value);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),];\n        if (o.auctionOptions.bootstrap) {\n            this._dataSubscriptions.push(this._data.subscribe(\"JSBNG__onload\", function(p, q) {\n                var r = l(this.bootstrapData, {\n                    no_cache: 1,\n                    options: [\"sponsored\",]\n                });\n                this.fetch(this.bootstrapEndpoint, r, {\n                    type: \"sponsored\"\n                });\n            }.bind(this._data)));\n        }\n    ;\n    ;\n        this._view = this._typeahead.getView();\n        this._viewSubscriptions = [this._view.subscribe(\"finalResultsReordering\", function(p, q) {\n            o.query = q.value;\n            m.setOrganicECPM(this._organicECPM, q.results);\n            var r = o.getOriginalOrganics(q.results);\n            o.setAuctionOptions({\n                maxNumberResultsAndAds: Math.max(q.results.length, ((((this._data && this._data._maxResults)) || o.auctionOptions.maxNumberResultsAndAds)))\n            });\n            var s = this.runAuction(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities, o.auctionOptions), t = m.prepareAndSortAds(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities), u = t.map(function(y) {\n                return y.s_token;\n            }), v = [];\n            for (var w = 0; ((w < s.length)); w++) {\n                var x = s[w];\n                if (x.s_token) {\n                    v.push({\n                        position: w,\n                        is_self: x.is_self\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            this._view.inform(\"recordAfterReorder\", {\n                organic: r,\n                tokens: u,\n                position_data: v,\n                s_bootstrap_id: this._sBootstrapID,\n                options: o.auctionOptions,\n                variant: o.auctionOptions.rerankingStrategy\n            });\n            q.results = s;\n            this._data.inform(\"recordAuctionState\", {\n                organic: r,\n                auctionOptions: o.auctionOptions,\n                event_data: q\n            });\n        }.bind(this)),this._view.subscribe(\"highlight\", function(p, q) {\n            if (this._view.JSBNG__content) {\n                j.scry(this._view.JSBNG__content, \"a.report\").forEach(i.hide);\n            }\n        ;\n        ;\n            if (((((!q.element || !q.selected)) || !q.selected.s_token))) {\n                return;\n            }\n        ;\n        ;\n            var r = j.scry(q.element, \"a.report\");\n            if (r.length) {\n                i.show(r[0]);\n            }\n             else j.appendContent(q.element, this._createHideAdLink(q.selected));\n        ;\n        ;\n        }.bind(this)),];\n        this._globalSubscriptions = [h.subscribe(\"TypeaheadSearchSponsored/hideAdResult\", function(p, q) {\n            this._hiddenSponsoredEntities = ((this._hiddenSponsoredEntities || {\n            }));\n            this._hiddenSponsoredEntities[q.uid] = true;\n            this._hideReasonDialog = q.reason_dialog;\n            this._forceRefreshResults();\n        }.bind(this)),h.subscribe(\"TypeaheadSearchSponsored/undoHideAdResult\", function(p, q) {\n            if (this._hiddenSponsoredEntities) {\n                delete this._hiddenSponsoredEntities[q.uid];\n            }\n        ;\n        ;\n            if (this._hideReasonDialog) {\n                this._hideReasonDialog.hide();\n                this._hideReasonDialog = null;\n            }\n        ;\n        ;\n            this._forceRefreshResults();\n        }.bind(this)),];\n    };\n    o.prototype.disable = function() {\n        this._dataSubscriptions.forEach(this._data.unsubscribe.bind(this._data));\n        this._dataSubscriptions = null;\n        this._viewSubscriptions.forEach(this._view.unsubscribe.bind(this._view));\n        this._viewSubscriptions = null;\n        this._globalSubscriptions.forEach(h.unsubscribe.bind(h));\n        this._globalSubscriptions = null;\n        this._data = null;\n        this._view = null;\n        this._sponsoredEntries = null;\n    };\n    o.prototype.runAuction = function(p, q, r, s) {\n        if (((p.length === 0))) {\n            return p;\n        }\n    ;\n    ;\n        p = o.initResults(p);\n        if (!q) {\n            return p;\n        }\n    ;\n    ;\n        var t = m.prepareAndSortAds(p, q, r);\n        if (this._typeahead) {\n            var u = this._typeahead.getData();\n            u.inform(\"recordAuctionState\", {\n                sorted_ads: t\n            });\n        }\n    ;\n    ;\n        var v = {\n        }, w = p.map(function(ba) {\n            if (ba.s_categories) {\n                v[ba.uid] = ba.s_categories;\n            }\n        ;\n        ;\n            return String(ba.uid);\n        }), x = m.selectAds(w, v, t, s);\n        if (((x.length === 0))) {\n            return p;\n        }\n    ;\n    ;\n        if (m.hasTopResult(p[0], x[0], s)) {\n            o.setTopResult(p);\n        }\n    ;\n    ;\n        var y = 0;\n        for (var z = 0; ((z < x.length)); ++z) {\n            if (!m.isSelfPromoted(x[z])) {\n                y++;\n            }\n        ;\n        ;\n        };\n    ;\n        p.length = Math.min(p.length, ((s.maxNumberResultsAndAds - y)));\n        var aa = o.rerankAds(p, x, s);\n        return aa;\n    };\n    o.prototype._forceRefreshResults = function() {\n        if (((this._data && this._data.value))) {\n            this._data.respond(this._data.value, this._data.buildUids(this._data.value));\n        }\n    ;\n    ;\n    };\n    o.prototype._createHideAdLink = function(p) {\n        var q = new k(\"/ajax/emu/end.php\").addQueryData({\n            eid: p.s_token,\n            f: 0,\n            ui: ((\"typeahead_\" + p.s_token.replace(\".\", \"_\"))),\n            en: \"fad_hide\",\n            ed: \"true\",\n            a: 1\n        }).toString(), r = {\n            className: \"report\",\n            rel: \"dialog-post\",\n            href: \"#\",\n            ajaxify: q,\n            title: \"Hide the ad\"\n        }, s = j.create(\"a\", r);\n        g.listen(s, \"mouseover\", function(JSBNG__event) {\n            this._view.index = -1;\n            this._view.highlight(-1, false);\n            JSBNG__event.kill();\n        }.bind(this));\n        return s;\n    };\n    o.auctionOptions = {\n    };\n    o.query = null;\n    o.getOriginalOrganics = function(p) {\n        return p.map(function(q) {\n            return {\n                uid: q.uid,\n                text: q.text,\n                type: o.getRealType(q),\n                source: ((q.bootstrapped ? 1 : 0)),\n                index: q.index,\n                s_value: ((q.s_value || 0)),\n                s_categories: ((q.s_categories || [])),\n                score: q.score\n            };\n        });\n    };\n    o.setTopResult = function(p) {\n        p[0].renderTypeOverride = true;\n        p[0].orig_render_type = p[0].render_type;\n        p[0].render_type = \"tophit\";\n    };\n    o.finalizeAd = function(p, q, r) {\n        var s = \"Sponsored\";\n        p.rankType = ((((p.rankType || p.render_type)) || p.type));\n        if (m.isSelfPromoted(p)) {\n            q.s_token = p.s_token;\n            q.message = p.s_message;\n            if (((r.rerankingStrategy === 0))) {\n                q.subtextOverride = ((q.subtext ? ((((q.subtext + \" \\u00b7 \")) + s)) : s));\n            }\n        ;\n        ;\n            if (p.path) {\n                q.pathOverride = true;\n                q.orig_path = q.path;\n                q.path = p.path;\n            }\n        ;\n        ;\n            q.is_self = true;\n        }\n         else {\n            p.message = p.s_message;\n            p.subtextOverride = null;\n            if (((r.rerankingStrategy === 0))) {\n                p.subtextOverride = ((p.subtext ? ((((p.subtext + \" \\u00b7 \")) + s)) : s));\n            }\n        ;\n        ;\n            if (r.debug) {\n                if (((!p.subtextOverride && p.subtext))) {\n                    p.subtextOverride = p.subtext;\n                }\n            ;\n            ;\n                if (p.subtextOverride) {\n                    p.subtextOverride += ((((\" \\u00b7 (Debug: \" + q.text)) + \")\"));\n                }\n                 else p.subtextOverride = ((((\"(Debug: \" + q.text)) + \")\"));\n            ;\n            ;\n            }\n        ;\n        ;\n            p.type = q.type;\n            p.render_type = q.render_type;\n            p.is_self = false;\n        }\n    ;\n    ;\n    };\n    o.promoteSelfPromotedResultToTop = function(p, q, r, s) {\n        var t = p[q];\n        if (((q < r))) {\n            var u = \"Sponsored\";\n            t.subtextOverride = ((t.subtext ? ((((t.subtext + \" \\u00b7 \")) + u)) : u));\n            return;\n        }\n    ;\n    ;\n        if (((q > r))) {\n            p.splice(r, 0, p.splice(q, 1)[0]);\n        }\n    ;\n    ;\n        t = p[r];\n        t.renderTypeOverride = true;\n        t.orig_render_type = t.render_type;\n        t.render_type = \"ownsection\";\n    };\n    o.insertAdToTop = function(p, q, r, s) {\n        p.splice(r, 0, q);\n        q.render_type = \"ownsection\";\n    };\n    o.rerankMethod5 = function(p, q, r) {\n        if (((r.rerankingStrategy != 5))) {\n            return;\n        }\n    ;\n    ;\n        var s = m.getTopAdPosition(p, q, r), t = m.buildResultIndices(p);\n        for (var u = ((q.length - 1)); ((u >= 0)); u--) {\n            var v = q[u], w = t[v.selected_target_id], x = p[w];\n            o.finalizeAd(v, x, r);\n            if (m.isSelfPromoted(v)) {\n                o.promoteSelfPromotedResultToTop(p, w, s, r);\n            }\n             else o.insertAdToTop(p, v, s, r);\n        ;\n        ;\n            t = m.buildResultIndices(p);\n        };\n    ;\n    };\n    o.rerankAds = function(p, q, r) {\n        switch (r.rerankingStrategy) {\n          case 5:\n            o.rerankMethod5(p, q, r);\n            break;\n          default:\n            break;\n        };\n    ;\n        p.length = Math.min(p.length, r.maxNumberResultsAndAds);\n        return p;\n    };\n    o.initResults = function(p) {\n        var q = p.length;\n        for (var r = 0; ((r < q)); r++) {\n            var s = p[r];\n            s.is_self = null;\n            s.s_token = null;\n            s.message = null;\n            s.subtextOverride = null;\n            if (s.pathOverride) {\n                s.path = s.orig_path;\n                s.pathOverride = false;\n            }\n        ;\n        ;\n            if (s.renderTypeOverride) {\n                s.render_type = s.orig_render_type;\n                s.renderTypeOverride = false;\n            }\n        ;\n        ;\n            s.rankType = ((((s.rankType || s.render_type)) || s.type));\n        };\n    ;\n        return p;\n    };\n    o.setAuctionOptions = function(p) {\n        l(o.auctionOptions, p);\n    };\n    o.getRealType = function(p) {\n        if (p.renderTypeOverride) {\n            return ((p.orig_render_type || p.type));\n        }\n    ;\n    ;\n        return ((p.render_type || p.type));\n    };\n    o.hideAdResult = function(p, q) {\n        h.inform(\"TypeaheadSearchSponsored/hideAdResult\", {\n            uid: p,\n            reason_dialog: q\n        });\n    };\n    o.undoHideAdResult = function(p) {\n        h.inform(\"TypeaheadSearchSponsored/undoHideAdResult\", {\n            uid: p\n        });\n    };\n    o.Ad = function() {\n    \n    };\n    l(o.prototype, {\n        _dataSubscriptions: null,\n        _viewSubscriptions: null,\n        _globalSubscriptions: null,\n        _data: null,\n        _view: null,\n        _sponsoredEntries: null,\n        _hiddenSponsoredEntities: null,\n        _hideReasonDialog: null,\n        _sBootstrapID: null,\n        _organicECPM: null\n    });\n    e.exports = o;\n});\n__d(\"legacy:SearchSponsoredTypeaheadBehavior\", [\"TypeaheadSearchSponsored\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchSponsored\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.searchSponsored = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:TypeaheadSearchSponsored\", [\"TypeaheadSearchSponsored\",], function(a, b, c, d) {\n    a.TypeaheadSearchSponsored = b(\"TypeaheadSearchSponsored\");\n}, 3);\n__d(\"SearchDataSource\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncResponse\",\"DataSource\",\"HashtagSearchResultUtils\",\"copyProperties\",\"createArrayFrom\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncResponse\"), j = b(\"DataSource\"), k = b(\"HashtagSearchResultUtils\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"BingScalingCommon\"), o = ((((j === null)) ? null : j.prototype));\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = j;\n    function p(q) {\n        this._token = ((q.token || \"\"));\n        this._lazyonload = ((((q.lazyonload === false)) ? false : true));\n        this._extraTypes = q.extraTypes;\n        this._buckets = q.buckets;\n        this._noMultiFetch = ((q.noMultiFetch || false));\n        this._maxWebSuggToCountFetchMore = ((q.maxWebSuggToCountFetchMore || 0));\n        var r = ((q.maxResults || 8));\n        j.call(this, q);\n        this._numResults = {\n            min: 3,\n            max: r\n        };\n        this.recordingRoute = ((q.recordingRoute || \"non_banzai\"));\n        this._enabledHashtag = ((q.enabledHashtag || false));\n        this.logBackendQueriesWindow = ((q.logBackendQueriesWindow || 25));\n        this._minWebSugg = ((q.minWebSugg || 2));\n        this._queryToWebSuggState = {\n        };\n        this._genTime = q.genTime;\n    };\n;\n    p.prototype.init = function() {\n        o.init.call(this);\n        this._leanPayload = null;\n        this._bootstrapRequestsPending = 0;\n        this._criticalOnly = true;\n        this._updateMaxResults();\n        g.listen(window, \"resize\", this._updateMaxResults.bind(this));\n        this.complexChars = new RegExp(\"[\\uff66-\\uffdd\\u4e00-\\u9fcc\\u3400-\\u4dbf]\");\n    };\n    p.prototype.dirty = function() {\n        o.dirty.call(this);\n        this._fetchOnUseRequests = [];\n    };\n    p.prototype.asyncErrorHandler = function(q) {\n        if (((((window.Dialog && ((window.Dialog.getCurrent() == null)))) && ((q.getError() == 1400003))))) {\n            i.verboseErrorHandler(q);\n        }\n    ;\n    ;\n    };\n    p.prototype.fetch = function(q, r, s) {\n        s = ((s || {\n        }));\n        s.fetch_start = JSBNG__Date.now();\n        o.fetch.call(this, q, r, s);\n    };\n    p.prototype.fetchHandler = function(q, r) {\n        var s = q.getPayload(), t = l({\n            fetch_end: JSBNG__Date.now()\n        }, r), u = ((t.value ? h.BEHAVIOR_EVENT : h.BEHAVIOR_PERSISTENT));\n        this.inform(\"beginFetchHandler\", {\n            response: q\n        });\n        if (((r.type == \"lean\"))) {\n            this._leanPayload = s;\n            this._processLean();\n        }\n         else {\n            if (s.coeff2_ts) {\n                t.coeff2_ts = s.coeff2_ts;\n            }\n        ;\n        ;\n            var v = {\n                limit: ((((typeof s.webSuggLimit !== \"undefined\")) ? s.webSuggLimit : 6)),\n                showOnTop: ((((typeof s.webSuggOnTop !== \"undefined\")) ? s.webSuggOnTop : false))\n            };\n            this._queryToWebSuggState[r.value] = v;\n            o.fetchHandler.call(this, q, r);\n            if (((r.bootstrap && !q.getRequest().getData().no_cache))) {\n                t.browserCacheHit = ((s.timestamp < this._genTime));\n            }\n        ;\n        ;\n            if (((((r.bootstrap && !s.no_data)) && ((this._bootstrapRequestsPending > 0))))) {\n                r.bootstrap = false;\n                --this._bootstrapRequestsPending;\n                ((!this._bootstrapRequestsPending && this._bootstrapPostProcess()));\n            }\n        ;\n        ;\n            if (((((s.no_data || s.stale)) || ((s.token !== this._token))))) {\n                var w = l({\n                }, q.getRequest().getData());\n                if (w.lazy) {\n                    delete w.lazy;\n                    w.token = this._token;\n                    this._fetchOnUse(w, r);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this.inform(\"endpointStats\", t, u);\n    };\n    p.prototype.respond = function(q, r, s) {\n        this.inform(\"respondValidUids\", r);\n        this.inform(\"reorderResults\", r);\n        var t = this.buildData(r, q);\n        t.forEach(function(u, v) {\n            u.origIndex = v;\n        });\n        this.inform(\"respond\", {\n            value: q,\n            results: t,\n            isAsync: !!s\n        });\n        return t;\n    };\n    p.prototype.buildData = function(q, r) {\n        if (((!q || ((q.length === 0))))) {\n            return [];\n        }\n    ;\n    ;\n        var s = this.getWebSuggState(r), t = s.showOnTop, u = n.integrateWebsuggestions(q.map(this.getEntry.bind(this)), Boolean(t), this._maxResults, s.limit);\n        u.length = Math.min(u.length, this._maxResults);\n        return u;\n    };\n    p.prototype.getWebSuggState = function(q) {\n        while (q) {\n            var r = this._queryToWebSuggState[q];\n            if (((typeof r !== \"undefined\"))) {\n                return r;\n            }\n        ;\n        ;\n            q = q.slice(0, ((q.length - 1)));\n        };\n    ;\n        return {\n            limit: 0,\n            showOnTop: false\n        };\n    };\n    p.prototype._isQueryTooShort = function(q) {\n        return ((((q.length < this._minQueryLength)) && !((this.complexChars && this.complexChars.test(q)))));\n    };\n    p.prototype.shouldFetchMoreResults = function(q) {\n        var r = 0, s = 0;\n        q.forEach(function(t) {\n            if (((((t.type !== \"websuggestion\")) || ((s++ < this._maxWebSuggToCountFetchMore))))) {\n                r++;\n            }\n        ;\n        ;\n        }.bind(this));\n        return ((r < this._maxResults));\n    };\n    p.prototype._bootstrapPostProcess = function() {\n        var q = {\n            time: JSBNG__Date.now()\n        };\n        this.inform(\"bootstrapped\", q, h.BEHAVIOR_PERSISTENT);\n        this._processLean();\n    };\n    p.prototype._processLean = function() {\n        if (this._leanPayload) {\n            var q, r = this._leanPayload.entries;\n            {\n                var fin186keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin186i = (0);\n                var s;\n                for (; (fin186i < fin186keys.length); (fin186i++)) {\n                    ((s) = (fin186keys[fin186i]));\n                    {\n                        q = this.getEntry(s);\n                        ((q && (q.index = r[s])));\n                    };\n                };\n            };\n        ;\n            this.setExclusions(this._leanPayload.blocked);\n            this._leanPayload = null;\n        }\n    ;\n    ;\n    };\n    p.prototype._updateMaxResults = function() {\n        var q = ((window.JSBNG__innerHeight || JSBNG__document.documentElement.clientHeight));\n        this.setMaxResults(Math.max(this._numResults.min, Math.min(this._numResults.max, Math.ceil(((2 + ((((q - 370)) / 56))))))));\n    };\n    p.prototype._bootstrapFetch = function(q, r) {\n        var s = l(r, this.bootstrapData);\n        if (((this._criticalOnly && this._lazyonload))) {\n            s.lazy = 1;\n        }\n    ;\n    ;\n        this.fetch(this.bootstrapEndpoint, s, {\n            bootstrap: true,\n            type: q\n        });\n        ++this._bootstrapRequestsPending;\n    };\n    p.prototype._fetchOnUse = function(q, r) {\n        {\n            var fin187keys = ((window.top.JSBNG_Replay.forInKeys)((this.bootstrapData))), fin187i = (0);\n            var s;\n            for (; (fin187i < fin187keys.length); (fin187i++)) {\n                ((s) = (fin187keys[fin187i]));\n                {\n                    ((!q.hasOwnProperty(s) && (q[s] = this.bootstrapData[s])));\n                ;\n                };\n            };\n        };\n    ;\n        if (this._criticalOnly) {\n            this._fetchOnUseRequests.push({\n                args: q,\n                ctx: r\n            });\n        }\n         else this.fetch(this.bootstrapEndpoint, q, r);\n    ;\n    ;\n    };\n    p.prototype._fetchLean = function() {\n        var q = {\n            no_cache: 1\n        };\n        q.options = m(q.options);\n        q.options.push(\"lean\");\n        this._fetchOnUse(q, {\n            type: \"lean\"\n        });\n    };\n    p.prototype.bootstrap = function(q) {\n        if (!q) {\n            this._criticalOnly = false;\n            this._flushFetchOnUseRequests();\n        }\n    ;\n    ;\n        if (this._bootstrapped) {\n            return;\n        }\n    ;\n    ;\n        var r = {\n            filter: [\"JSBNG__event\",],\n            no_cache: 1\n        };\n        this._fetchOnUse(r, {\n            type: \"JSBNG__event\"\n        });\n        var s = [\"app\",\"page\",\"group\",\"friendlist\",];\n        s = s.concat(((this._extraTypes || [])));\n        if (this._noMultiFetch) {\n            s.push(\"user\");\n            this._bootstrapFetch(\"user\", {\n                filter: s\n            });\n        }\n         else {\n            this._bootstrapFetch(\"other\", {\n                filter: s\n            });\n            if (this._buckets) {\n                for (var t = 0; ((t < this._buckets.length)); ++t) {\n                    var u = {\n                        filter: [\"user\",],\n                        buckets: this._buckets[t]\n                    };\n                    this._bootstrapFetch(\"user\", u);\n                };\n            ;\n            }\n             else this._bootstrapFetch(\"user\", {\n                filter: [\"user\",]\n            });\n        ;\n        ;\n        }\n    ;\n    ;\n        this._fetchLean();\n        this._bootstrapped = true;\n    };\n    p.prototype._flushFetchOnUseRequests = function() {\n        var q = this._fetchOnUseRequests.length;\n        for (var r = 0; ((r < q)); ++r) {\n            var s = this._fetchOnUseRequests[r];\n            this.fetch(this.bootstrapEndpoint, s.args, s.ctx);\n        };\n    ;\n        if (((q > 0))) {\n            this.inform(\"extra_bootstrap\", {\n                time: JSBNG__Date.now()\n            }, h.BEHAVIOR_PERSISTENT);\n        }\n    ;\n    ;\n        this._fetchOnUseRequests = [];\n    };\n    p.prototype.onLoad = function(q, r) {\n        this.inform(\"JSBNG__onload\", {\n            time: JSBNG__Date.now()\n        }, h.BEHAVIOR_PERSISTENT);\n        if (q) {\n            this.bootstrap.bind(this, r).defer();\n        }\n    ;\n    ;\n    };\n    p.prototype.mergeUids = function(q, r, s, t) {\n        var u = this.getDynamicHashtagResult(t);\n        if (((((t && u)) && ((r.indexOf(u) <= 0))))) {\n            r.unshift(u);\n        }\n    ;\n    ;\n        var v = ((s[0] ? this.getEntry(s[0]) : null)), w = ((r[0] ? this.getEntry(r[0]) : null)), x = ((((v && v.replace_results)) ? v : null));\n        x = ((((((!x && w)) && w.replace_results)) ? w : x));\n        var y = o.mergeUids.call(this, q, r, s, t);\n        if (x) {\n            this.inform(\"backend_topreplace\", {\n            });\n            return this.deduplicateByKey([x.uid,].concat(y));\n        }\n    ;\n    ;\n        return y;\n    };\n    p.prototype.getTextToIndexFromFields = function(q, r) {\n        var s = [], t = ((q.tokenVersion === \"v2\"));\n        for (var u = 0; ((u < r.length)); ++u) {\n            if (((t && ((((r[u] === \"text\")) || ((r[u] === \"alias\"))))))) {\n                continue;\n            }\n        ;\n        ;\n            var v = q[r[u]];\n            if (v) {\n                s.push(((v.join ? v.join(\" \") : v)));\n            }\n        ;\n        ;\n        };\n    ;\n        return s.join(\" \");\n    };\n    p.prototype.getDynamicHashtagResult = function(q) {\n        if (((!q || !this._enabledHashtag))) {\n            return;\n        }\n    ;\n    ;\n        var r = k.getHashtagFromQuery(q);\n        if (!r) {\n            return;\n        }\n    ;\n    ;\n        var s = ((\"hashtag:\" + r)), t = this.getEntry(s);\n        if (!t) {\n            this.processEntries([k.makeTypeaheadResult(r),], q);\n        }\n    ;\n    ;\n        return s;\n    };\n    e.exports = p;\n});\n__d(\"legacy:SearchDataSource\", [\"SearchDataSource\",], function(a, b, c, d) {\n    a.SearchDataSource = b(\"SearchDataSource\");\n}, 3);\n__d(\"SearchTypeaheadCore\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"Class\",\"DOM\",\"Input\",\"Parent\",\"TypeaheadCore\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DOM\"), k = b(\"Input\"), l = b(\"Parent\"), m = b(\"TypeaheadCore\"), n = b(\"copyProperties\"), o = ((((m === null)) ? null : m.prototype));\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = m;\n    function p(q) {\n        m.call(this, q);\n    };\n;\n    p.prototype.init = function(q, r, s) {\n        o.init.call(this, q, r, s);\n        var t = l.byTag(s, \"form\"), u = this.reset.bind(this);\n        h.subscribe(\"pre_page_transition\", function(JSBNG__event, w) {\n            var x = /^\\/search/, y = x.test(w.from.path), z = x.test(w.to.path);\n            if (((y && !z))) {\n                u.defer();\n            }\n        ;\n        ;\n        });\n        if (t) {\n            var v = j.JSBNG__find(t, \"input.search_sid_input\");\n            g.listen(t, \"submit\", function() {\n                if (((this.data && this.data.queryData))) {\n                    v.value = this.data.queryData.sid;\n                }\n            ;\n            ;\n                u.defer();\n            }.bind(this), g.Priority.URGENT);\n        }\n    ;\n    ;\n    };\n    p.prototype.select = function() {\n        this.reset();\n        this.element.JSBNG__focus();\n        (function() {\n            this.element.JSBNG__blur();\n        }).bind(this).defer();\n    };\n    p.prototype.handleTab = function(JSBNG__event) {\n        var q = this.view.getQuerySuggestion(this.value);\n        if (q) {\n            k.setValue(this.element, q);\n            this.checkValue();\n            JSBNG__event.kill();\n        }\n         else o.handleTab.call(this, JSBNG__event);\n    ;\n    ;\n    };\n    p.prototype.getSearchType = function() {\n        return \"regular\";\n    };\n    e.exports = p;\n});\n__d(\"legacy:SearchTypeaheadCore\", [\"SearchTypeaheadCore\",], function(a, b, c, d) {\n    a.SearchTypeaheadCore = b(\"SearchTypeaheadCore\");\n}, 3);\n__d(\"SearchTypeaheadView\", [\"Arbiter\",\"ContextualTypeaheadView\",\"ContextualLayerUpdateOnScroll\",\"copyProperties\",\"DOM\",\"goURI\",\"MusicConstants\",\"MusicEvents\",\"tx\",\"URI\",\"isEmail\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ContextualTypeaheadView\"), i = b(\"ContextualLayerUpdateOnScroll\"), j = b(\"copyProperties\"), k = b(\"DOM\"), l = b(\"goURI\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"tx\"), p = b(\"URI\"), q = b(\"isEmail\"), r = b(\"fbt\"), s = ((((h === null)) ? null : h.prototype));\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = h;\n    function t(v, w) {\n        h.call(this, v, w);\n    };\n;\n    t.prototype.initializeLayer = function() {\n        s.initializeLayer.call(this);\n        this.layer.setOffsetY(-1);\n        this.layer.enableBehavior(i);\n    };\n    t.prototype.ignoreClick = function(JSBNG__event) {\n        JSBNG__event.prevent();\n    };\n    t.prototype.render = function(v, w, x) {\n        if (this._bucketize) {\n            w = u(w);\n        }\n    ;\n    ;\n        var y = {\n            results: w,\n            value: v\n        };\n        this.inform(\"finalResultsReordering\", y);\n        return s.render.call(this, v, y.results, x);\n    };\n    t.prototype.disableBucketization = function() {\n        this._bucketize = false;\n    };\n    t.prototype.buildBuckets = function(v, w) {\n        var x = w.length, y = 0, z;\n        for (z = 0; ((z < x)); ++z) {\n            if (((w[z].type == \"user\"))) {\n                y++;\n            }\n        ;\n        ;\n        };\n    ;\n        this._redirectToUsersResultsPage = ((this.showFilterResults && ((y === x))));\n        this.setWebSuggLoggingParams(v, w);\n        if (this._bucketize) {\n            w = s.buildBuckets.call(this, v, w);\n        }\n    ;\n    ;\n        if (((v && this._shouldShowSeeMore))) {\n            w.push(this.buildSeeMore(v, x));\n            if (((q(v) && ((y < 1))))) {\n                w.push(this.buildInvite(v));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return w;\n    };\n    t.prototype.buildSeeMore = function(v, w) {\n        var x = this.getSeeMoreText(v, w), y = ((((w == 1)) ? \"Displaying top result\" : o._(\"Displaying top {number} results\", {\n            number: w\n        }))), z = k.create(\"li\", {\n            className: \"calltoaction\"\n        }, [k.create(\"a\", {\n            href: this.getSeeMoreEndpoint(v),\n            rel: \"ignore\"\n        }, [k.create(\"span\", {\n            className: \"text\"\n        }, [k.create(\"span\", {\n            className: \"seeMore\"\n        }, [x,k.create(\"span\", {\n            className: \"arrow\"\n        }),]),k.create(\"span\", {\n            className: \"subtext\"\n        }, [y,]),]),]),]);\n        z.setAttribute(\"aria-label\", x);\n        return {\n            uid: \"search\",\n            node: z,\n            search: true\n        };\n    };\n    t.prototype.getSeeMoreText = function(v, w) {\n        if (this.showKeywordResultsPage) {\n            return r._(\"Search for {query}\", [r.param(\"query\", v),]);\n        }\n    ;\n    ;\n        if (((w <= 0))) {\n            return o._(\"See results for {query}\", {\n                query: v\n            });\n        }\n    ;\n    ;\n        if (this._redirectToUsersResultsPage) {\n            return r._(\"Filter results for {query}\", [r.param(\"query\", v),]);\n        }\n    ;\n    ;\n        return o._(\"See more results for {query}\", {\n            query: v\n        });\n    };\n    t.prototype.buildInvite = function(v) {\n        var w = o._(\"Invite {query} to Facebook\", {\n            query: v\n        }), x = k.create(\"li\", {\n            className: \"calltoaction\"\n        }, [k.create(\"a\", {\n            href: this.getInviteEndpoint(v),\n            rel: \"ignore\"\n        }, [k.create(\"span\", {\n            className: \"text\"\n        }, [k.create(\"span\", {\n            className: \"invite\"\n        }, [w,]),]),]),]);\n        x.setAttribute(\"aria-label\", w);\n        return {\n            uid: \"invite\",\n            node: x,\n            search: true\n        };\n    };\n    t.prototype.searchPageQueryData = function(v) {\n        return j({\n            q: v\n        }, ((this.queryData || {\n        })));\n    };\n    t.prototype.searchPageTypeData = function() {\n        return ((this._redirectToUsersResultsPage ? {\n            type: \"users\"\n        } : {\n        }));\n    };\n    t.prototype.select = function(v) {\n        var w = this.index, x = this.results[w];\n        if (((!x || ((x.type == \"header\"))))) {\n            return;\n        }\n    ;\n    ;\n        var y = this.items[w], z = k.scry(y, \"a\")[0];\n        if (x.song) {\n            if (z) {\n                n.inform(m.MUSIC_BUTTON.ACTIVATE, z);\n            }\n        ;\n        ;\n            ((v && this.inform(\"highlight\", {\n                index: w,\n                selected: x\n            })));\n        }\n         else {\n            s.select.call(this, v);\n            if (((z && z.href))) {\n                if (((z.target == \"_blank\"))) {\n                    window.open(z.href);\n                }\n                 else l(z.href);\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    t.prototype.setSid = function(v) {\n        this.queryData.tas = v;\n    };\n    t.prototype.getSeeMoreEndpoint = function(v) {\n        return p(this.seeMoreEndpoint).addQueryData(this.searchPageQueryData(v)).addQueryData(this.searchPageTypeData()).toString();\n    };\n    t.prototype.getInviteEndpoint = function(v) {\n        return p(\"/invite.php\").addQueryData({\n            email_list: v\n        });\n    };\n    t.prototype.show = function() {\n        if (!this.isVisible()) {\n            g.inform(\"layer_shown\", {\n                type: \"SearchTypeahead\"\n            });\n            s.show.call(this);\n        }\n    ;\n    ;\n    };\n    t.prototype.hide = function() {\n        if (this.isVisible()) {\n            g.inform(\"layer_hidden\", {\n                type: \"SearchTypeahead\"\n            });\n            s.hide.call(this);\n        }\n    ;\n    ;\n    };\n    t.prototype.getQuerySuggestion = function(v) {\n        var w = this.results[this.index], x = ((((w && ((w.type != \"header\")))) ? w.text.toLowerCase() : \"\"));\n        return ((((x == v.toLowerCase())) ? \"\" : x));\n    };\n    t.prototype.setWebSuggLoggingParams = function(v, w) {\n        var x = 0, y = 0;\n        for (var z = 0; ((z < w.length)); z++) {\n            if (((w[z].type === \"websuggestion\"))) {\n                if (((y === 0))) {\n                    y = ((z + 1));\n                }\n            ;\n            ;\n                var aa = ((((((\"FR\" + ((z - x)))) + \"AS\")) + x)), ba = ((z + 1));\n                w[z].path += ((((((((((\"&wssk=\" + aa)) + \"&wssp=\")) + ba)) + \"&wspq=\")) + encodeURIComponent(v)));\n                w[z].path += ((\"&wssrc=\" + w[z].websuggestion_source));\n                x++;\n            }\n        ;\n        ;\n        };\n    ;\n        var ca = ((((((((((((((\"&wssc=\" + w.length)) + \"-\")) + v.length)) + \"&wsbp=\")) + x)) + \"-\")) + y));\n        for (z = 0; ((z < w.length)); z++) {\n            if (((w[z].type === \"websuggestion\"))) {\n                w[z].path += ca;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n    function u(v) {\n        var w, x, y, z, aa = [], ba = {\n        };\n        x = v.length;\n        for (w = 0; ((w < x)); w++) {\n            y = v[w];\n            z = ((y.render_type || y.type));\n            if (!ba.hasOwnProperty(z)) {\n                ba[z] = aa.length;\n                aa.push([]);\n            }\n        ;\n        ;\n            aa[ba[z]].push(y);\n        };\n    ;\n        var ca = [];\n        x = aa.length;\n        for (w = 0; ((w < x)); ++w) {\n            y = aa[w][0];\n            z = ((y.render_type || y.type));\n            ca = ca.concat(aa[w]);\n        };\n    ;\n        return ca;\n    };\n;\n    j(t.prototype, {\n        _shouldShowSeeMore: true,\n        _bucketize: true,\n        queryData: {\n            init: \"quick\"\n        }\n    });\n    e.exports = t;\n});\n__d(\"legacy:SearchTypeaheadView\", [\"SearchTypeaheadView\",], function(a, b, c, d) {\n    a.SearchTypeaheadView = b(\"SearchTypeaheadView\");\n}, 3);\n__d(\"legacy:Typeahead\", [\"Typeahead\",], function(a, b, c, d) {\n    a.Typeahead = b(\"Typeahead\");\n}, 3);\n__d(\"SearchTypeaheadRecorder\", [\"JSBNG__Event\",\"AsyncRequest\",\"Banzai\",\"Keys\",\"TypeaheadUtil\",\"Vector\",\"ge\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"Banzai\"), j = b(\"Keys\"), k = b(\"TypeaheadUtil\"), l = b(\"Vector\"), m = b(\"ge\"), n = b(\"clickRefAction\"), o = b(\"copyProperties\"), p = b(\"userAction\");\n    function q(s) {\n        this.init(s);\n        this.initEvents();\n    };\n;\n    q.prototype.init = function(s) {\n        this.core = s.getCore();\n        this.data = s.getData();\n        this.view = s.getView();\n        this.element = this.core.getElement();\n        this.initTime = JSBNG__Date.now();\n        this._onloadTime = 0;\n        this._extraRecorder = [];\n        var t = m(\"search_first_focus\");\n        this.initStartTime = ((t && t.value));\n        this.bootstrapStats = {\n            bootstrapped: 0\n        };\n        this._reset();\n    };\n    q.prototype._reset = function() {\n        this.stats = {\n        };\n        this.avgStats = {\n        };\n        this.appendStats = {\n        };\n        this._backspacing = false;\n        this.backendQueries = [];\n        this._topreplace = false;\n        this._inflightRequests = {\n        };\n        this._reorderInfo = null;\n        var s = Math.JSBNG__random().toString();\n        this.data.setQueryData({\n            sid: s\n        });\n        this.view.setSid(s);\n        this.recordStat(\"sid\", s);\n    };\n    q.prototype.initEvents = function() {\n        this.core.subscribe(\"JSBNG__focus\", function(JSBNG__event) {\n            if (!this.stats.session_start_time) {\n                this.recordStat(\"session_start_time\", JSBNG__Date.now());\n            }\n        ;\n        ;\n        }.bind(this));\n        this.core.subscribe(\"JSBNG__blur\", function(JSBNG__event) {\n            var s = JSBNG__Date.now();\n            {\n                var fin188keys = ((window.top.JSBNG_Replay.forInKeys)((this._inflightRequests))), fin188i = (0);\n                var t;\n                for (; (fin188i < fin188keys.length); (fin188i++)) {\n                    ((t) = (fin188keys[fin188i]));\n                    {\n                        var u = this._inflightRequests[t], v = ((s - u));\n                        this.recordAvgStat(\"search_endpoint_ms_from_js\", v);\n                    };\n                };\n            };\n        ;\n            this.recordStat(\"session_end_time\", s);\n            this.submit();\n        }.bind(this));\n        this.view.subscribe(\"select\", function(s, t) {\n            this.recordSelectInfo(t);\n        }.bind(this));\n        this.view.subscribe(\"render\", function(s, t) {\n            this.recordRender(t);\n        }.bind(this));\n        this.view.subscribe(\"recordAfterReorder\", function(s, t) {\n            this._reorderInfo = o(this._reorderInfo, t);\n        }.bind(this));\n        this.data.subscribe(\"activity\", function(s, t) {\n            this.recordStat(\"pending_request\", t.activity);\n        }.bind(this));\n        this.data.subscribe(\"respondValidUids\", function(s, t) {\n            this.validUids = t.slice(0);\n        }.bind(this));\n        this.data.subscribe(\"beforeQuery\", function(s, t) {\n            if (!t.value) {\n                this.query = \"\";\n                this.results = [];\n                return;\n            }\n        ;\n        ;\n            if (!this.stats.first_query_time) {\n                this.recordStat(\"first_query_time\", JSBNG__Date.now());\n            }\n        ;\n        ;\n            this.query = t.value;\n            this.recordCountStat(\"num_queries\");\n        }.bind(this));\n        this.data.subscribe(\"queryEndpoint\", function(s, t) {\n            this.recordCountStat(\"num_search_ajax_requests\");\n            this.recordAvgStat(\"endpoint_query_length\", t.value.length);\n            this._inflightRequests[t.value] = JSBNG__Date.now();\n        }.bind(this));\n        this.data.subscribe(\"JSBNG__onload\", function(s, t) {\n            this._onloadTime = t.time;\n        }.bind(this));\n        this.data.subscribe(\"bootstrapped\", function(s, t) {\n            this.bootstrapStats.endTime = t.time;\n            this.bootstrapStats.bootstrapped = 1;\n        }.bind(this));\n        this.core.subscribe(\"recordFunction\", function(s, t) {\n            this._extraRecorder.push(t);\n        }.bind(this));\n        this.data.subscribe(\"endpointStats\", function(s, t) {\n            var u = ((t.fetch_end - t.fetch_start));\n            if (t.value) {\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", u);\n            }\n             else this.bootstrapStats[t.type] = u;\n        ;\n        ;\n            if (t.coeff2_ts) {\n                this.bootstrapStats.coeff2_ts = t.coeff2_ts;\n            }\n        ;\n        ;\n            if (((typeof t.browserCacheHit != \"undefined\"))) {\n                this.recordCountStat(((t.browserCacheHit ? \"bootstrap_cachehits\" : \"bootstrap_cachemisses\")));\n            }\n        ;\n        ;\n            if (this._inflightRequests[t.value]) {\n                delete this._inflightRequests[t.value];\n            }\n        ;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"query\", function(s, t) {\n            this.recordAvgStat(\"num_results_from_cache\", t.results.length);\n        }.bind(this));\n        this.data.subscribe(\"backend_topreplace\", function(s, t) {\n            if (((false === this._topreplace))) {\n                this.recordStat(\"backend_topreplace\", 1);\n                this._topreplace = true;\n            }\n        ;\n        ;\n        }.bind(this));\n        g.listen(this.element, \"keydown\", function(JSBNG__event) {\n            if (((g.getKeyCode(JSBNG__event) == j.BACKSPACE))) {\n                if (((!this._backspacing && this.query))) {\n                    this._backspacing = true;\n                    this.recordAppendStat(\"before_backspace_queries\", this.query);\n                }\n            ;\n            ;\n            }\n             else this._backspacing = false;\n        ;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"beforeFetch\", function(s, t) {\n            var u = t.request.data.value;\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            this.backendQueries.push(u);\n        }.bind(this));\n    };\n    q.prototype.recordStat = function(s, t) {\n        this.stats[s] = t;\n    };\n    q.prototype.recordCountStat = function(s) {\n        var t = this.stats[s];\n        this.stats[s] = ((t ? ((t + 1)) : 1));\n    };\n    q.prototype.recordAvgStat = function(s, t) {\n        if (this.avgStats[s]) {\n            this.avgStats[s][0] += t;\n            ++this.avgStats[s][1];\n        }\n         else this.avgStats[s] = [t,1,];\n    ;\n    ;\n    };\n    q.prototype.recordAppendStat = function(s, t) {\n        if (!this.appendStats.hasOwnProperty(s)) {\n            this.appendStats[s] = [];\n        }\n    ;\n    ;\n        this.appendStats[s].push(t);\n    };\n    q.prototype.recordRender = function(s) {\n        this.results = s.filter(function(u) {\n            return ((((((u.uid != \"search\")) && ((u.type != \"disabled_result\")))) && ((u.type != \"header\"))));\n        }).map(function(u) {\n            return o(null, u);\n        });\n        var t = l.getViewportDimensions();\n        this.recordStat(\"window_size_width\", t.x);\n        this.recordStat(\"window_size_height\", t.y);\n        if (((((this.results.length > 0)) && !this.stats.first_result_time))) {\n            this.recordStat(\"first_result_time\", JSBNG__Date.now());\n        }\n    ;\n    ;\n    };\n    q.prototype.recordSelectInfo = function(s) {\n        var t = s.selected, u = s.index;\n        if (((t.groupIndex !== undefined))) {\n            u = ((((s.index - t.groupIndex)) - 1));\n        }\n    ;\n    ;\n        var v = {\n            href: t.path\n        }, w = ((t.dataGT ? {\n            gt: JSON.parse(t.dataGT)\n        } : {\n        }));\n        n(\"click\", v, null, null, w);\n        p(\"search\").uai(\"click\");\n        if (((t.uid == \"search\"))) {\n            this.recordStat(\"selected_search\", 1);\n        }\n         else if (((t.uid == \"invite\"))) {\n            this.recordStat(\"selected_invite\", 1);\n        }\n         else {\n            var x = ((((t.rankType || t.render_type)) || t.type)), y = ((((x == \"friend\")) ? \"user\" : x));\n            this.recordStat(((\"selected_\" + y)), 1);\n            this.recordStat(\"selected_position\", u);\n            this.recordStat(\"selected_type\", x);\n            this.recordStat(\"selected_name_length\", t.text.length);\n            this.recordStat(\"selected_id\", t.uid);\n            this.recordStat(\"selected_degree\", ((t.bootstrapped ? 1 : 2)));\n            var z = k.parse(this.data.getTextToIndex(t)).tokens, aa = r(z, this.query);\n            if (aa) {\n                this.recordStat(\"matched_terms\", aa);\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        var ba = {\n        };\n        this._extraRecorder.forEach(function(ca) {\n            ca(s, this.results, ba);\n        }.bind(this));\n        this.recordStat(\"extra_select_info\", JSON.stringify(ba));\n        if (((t.type === \"websuggestion\"))) {\n            this.recordStat(\"selected_memcached_websuggestion\", t.fromMemcache);\n            this.recordStat(\"selected_websuggestion_source\", t.websuggestion_source);\n        }\n    ;\n    ;\n        this.recordStat(\"selected_with_mouse\", ((s.clicked ? 1 : 0)));\n    };\n    q.prototype._dataToSubmit = function() {\n        this.recordStat(\"candidate_results\", this.buildResults());\n        this.recordStat(\"query\", this.query);\n        this.recordStat(\"init_time\", this.initTime);\n        if (this.initStartTime) {\n            this.recordStat(\"init_start_time\", this.initStartTime);\n            this.recordStat(\"onload_time\", this._onloadTime);\n            this.initStartTime = 0;\n        }\n    ;\n    ;\n        this.recordStat(\"bootstrapped\", this.bootstrapStats.bootstrapped);\n        if (this.bootstrapStats.endTime) {\n            this.recordStat(\"bootstrapped_time\", this.bootstrapStats.endTime);\n            this.recordStat(\"user_bootstrap_ms\", this.bootstrapStats.user);\n            this.recordStat(\"other_bootstrap_ms\", this.bootstrapStats.other);\n            this.bootstrapStats.endTime = 0;\n        }\n    ;\n    ;\n        this.recordStat(\"coeff2_ts\", this.bootstrapStats.coeff2_ts);\n        this.recordStat(\"max_results\", this.data._maxResults);\n        if (((this.backendQueries.length > 0))) {\n            if (((this.backendQueries.length > this.data.logBackendQueriesWindow))) {\n                this.backendQueries = this.backendQueries.slice(((this.backendQueries.length - this.data.logBackendQueriesWindow)));\n            }\n        ;\n        ;\n            this.recordStat(\"backend_queries\", this.backendQueries);\n        }\n    ;\n    ;\n        if (this._reorderInfo) {\n            var s = this._reorderInfo;\n            s.organic.forEach(function(x) {\n                delete x.text;\n            });\n            this.recordStat(\"s_count\", s.position_data.length);\n            this.recordStat(\"s_bootstrap_id\", s.s_bootstrap_id);\n            this.recordStat(\"s_organic_results\", JSON.stringify(s.organic));\n            this.recordStat(\"s_candidate_tokens\", JSON.stringify(s.tokens));\n            this.recordStat(\"s_positions\", JSON.stringify(s.position_data));\n            this.recordStat(\"s_options\", JSON.stringify(s.options));\n            this.recordStat(\"s_variant\", JSON.stringify(s.variant));\n        }\n    ;\n    ;\n        var t = this.stats;\n        {\n            var fin189keys = ((window.top.JSBNG_Replay.forInKeys)((this.avgStats))), fin189i = (0);\n            var u;\n            for (; (fin189i < fin189keys.length); (fin189i++)) {\n                ((u) = (fin189keys[fin189i]));\n                {\n                    var v = this.avgStats[u];\n                    t[u] = ((v[0] / v[1]));\n                };\n            };\n        };\n    ;\n        {\n            var fin190keys = ((window.top.JSBNG_Replay.forInKeys)((this.appendStats))), fin190i = (0);\n            var w;\n            for (; (fin190i < fin190keys.length); (fin190i++)) {\n                ((w) = (fin190keys[fin190i]));\n                {\n                    t[w] = JSON.stringify(this.appendStats[w]);\n                ;\n                };\n            };\n        };\n    ;\n        return t;\n    };\n    q.prototype.buildResults = function() {\n        var s = ((this.results || [])).map(function(t, u) {\n            var v = k.parse(this.data.getTextToIndex(t)).tokens, w = ((((t.rankType || t.render_type)) || t.type)), x = ((t.bootstrapped ? 1 : 0)), y = ((t.s_token || \"\")), z = ((r(v, this.query) || this.query)), aa = t.index_rank, ba = t.match_type, ca = t.prefix_match, da = t.prefix_length;\n            if (((typeof t.groupIndex == \"number\"))) {\n                return [t.groupIndex,t.indexInGroup,t.uid,w,x,y,z,aa,ba,ca,da,t.origIndex,];\n            }\n        ;\n        ;\n            return [0,u,t.uid,w,x,y,z,aa,ba,ca,da,t.origIndex,];\n        }.bind(this));\n        return JSON.stringify(s);\n    };\n    q.prototype.submit = function() {\n        var s = this._dataToSubmit();\n        switch (this.data.recordingRoute) {\n          case \"double_recording\":\n            if (((Math.JSBNG__random() > 114675))) {\n                s.recorded_first = \"legacy\";\n                JSBNG__setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n            }\n             else {\n                s.recorded_first = \"banzai\";\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n                JSBNG__setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n            }\n        ;\n        ;\n            break;\n          case \"random_recording\":\n            if (((Math.JSBNG__random() > 114999))) {\n                this.submitThroughAsyncRequest(s);\n            }\n             else i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n        ;\n        ;\n            break;\n          case \"banzai_basic\":\n            i.post(this._banzaiRoute, s);\n            break;\n          case \"banzai_vital\":\n            i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n            break;\n          default:\n            this.submitThroughAsyncRequest(s);\n        };\n    ;\n        this._reset();\n    };\n    q.prototype.submitThroughAsyncRequest = function(s) {\n        if (((Object.keys(s).length > 0))) {\n            new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                stats: s\n            }).setOption(\"handleErrorAfterUnload\", true).setErrorHandler(function(t) {\n                s.retry = true;\n                new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                    stats: s\n                }).setOption(\"asynchronous\", false).send();\n            }.bind(this)).send();\n        }\n    ;\n    ;\n    };\n    var r = function(s, t) {\n        var u = k.parse(t);\n        if (((u.flatValue[((u.flatValue.length - 1))] === \" \"))) {\n            return u.flatValue;\n        }\n    ;\n    ;\n        var v = u.tokens[((u.tokens.length - 1))], w = {\n        };\n        s.forEach(function(ba) {\n            w[ba] = ((((w[ba] || 0)) + 1));\n        });\n        var x = {\n        }, y = u.tokens.slice(0, ((u.tokens.length - 1)));\n        y.forEach(function(ba) {\n            x[ba] = ((((x[ba] || 0)) + 1));\n        });\n        for (var z = 0; ((z < s.length)); ++z) {\n            var aa = s[z];\n            if (((((aa.indexOf(v) === 0)) && ((((w[aa] - ((x[aa] || 0)))) > 0))))) {\n                y.push(aa);\n                return y.join(\" \");\n            }\n        ;\n        ;\n        };\n    ;\n        return undefined;\n    };\n    o(q.prototype, {\n        _endPoint: \"/ajax/typeahead/record_metrics.php\",\n        _banzaiRoute: \"search\"\n    });\n    e.exports = q;\n});\n__d(\"TypeaheadSearchRecorderBasic\", [\"SearchTypeaheadRecorder\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"SearchTypeaheadRecorder\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this._typeahead = k;\n    };\n;\n    j.prototype.enable = function() {\n        new g(this._typeahead);\n    };\n    h(j.prototype, {\n        disable: i\n    });\n    e.exports = j;\n});\n__d(\"legacy:SearchRecorderBasicTypeaheadBehavior\", [\"TypeaheadSearchRecorderBasic\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchRecorderBasic\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.searchRecorderBasic = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"SearchTypeaheadRenderer\", [\"Badge\",\"DOM\",\"Env\",\"MusicButtonManager\",\"TypeaheadFacepile\",\"TypeaheadUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"MusicButtonManager\"), k = b(\"TypeaheadFacepile\"), l = b(\"TypeaheadUtil\");\n    function m(n, o) {\n        var p = [], q = ((n.photos || n.photo));\n        if (q) {\n            if (((q instanceof Array))) {\n                q = k.render(q);\n            }\n             else q = h.create(\"img\", {\n                alt: \"\",\n                src: q\n            });\n        ;\n        ;\n            p.push(q);\n            if (n.song) {\n                p.push(h.create(\"span\", {\n                    className: \"playButton\"\n                }));\n                p.push(h.create(\"span\", {\n                    className: \"playLoader\"\n                }));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var r;\n        if (n.text) {\n            var s = n.alias, t = this.value, u = n.text;\n            r = [u,];\n            if (((((s && l.isQueryMatch(t, s))) && !l.isQueryMatch(t, u)))) {\n                r.push(h.create(\"span\", {\n                    className: \"alias\"\n                }, [((\" \\u00b7 \" + s)),]));\n            }\n        ;\n        ;\n            if (n.verified) {\n                r.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            p.push(h.create(\"span\", {\n                className: \"text\"\n            }, r));\n        }\n    ;\n    ;\n        if (n.category) {\n            var v = [n.category,];\n            if (n.is_external) {\n                v.push(h.create(\"span\", {\n                    className: \"arrow\"\n                }));\n            }\n        ;\n        ;\n            var w = ((n.message ? \"preCategory\" : \"category\"));\n            p.push(h.create(\"span\", {\n                className: w\n            }, v));\n        }\n    ;\n    ;\n        if (n.message) {\n            p.push(h.create(\"span\", {\n                className: \"category\"\n            }, [n.message,]));\n        }\n    ;\n    ;\n        var x = ((n.subtextOverride || n.subtext));\n        if (x) {\n            p.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [x,]));\n        }\n    ;\n    ;\n        var y = ((((n.classNames || n.type)) || \"\")), z = ((n.is_external ? \"_blank\" : \"\")), aa = ((((!n.song && n.path)) || \"\"));\n        if (aa) {\n            if (!(/^https?\\:\\/\\//).test(aa)) {\n                aa = ((i.www_base + aa.substr(1)));\n            }\n        ;\n        ;\n            aa += ((((((aa.indexOf(\"?\") > 0)) ? \"&\" : \"?\")) + \"ref=ts&fref=ts\"));\n        }\n    ;\n    ;\n        var ba = h.create(\"a\", {\n            href: aa,\n            rel: \"ignore\",\n            target: z\n        }, p);\n        if (n.song) {\n            ba.id = ((\"mb_\" + ((((Math.JSBNG__random() * 1000000)) | 0))));\n            j.addButton.curry(n.song.provider, ba.id, n.song.url, n.song.context, n.song.media_type).defer();\n            ba.JSBNG__onclick = this.ignoreClick;\n        }\n    ;\n    ;\n        var ca = h.create(\"li\", {\n            className: y\n        }, [ba,]);\n        if (n.text) {\n            ca.setAttribute(\"aria-label\", n.text);\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    m.className = \"search\";\n    e.exports = m;\n});\n__d(\"legacy:SearchTypeaheadRenderer\", [\"SearchTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    }\n;\n;\n    a.TypeaheadRenderers.search = b(\"SearchTypeaheadRenderer\");\n}, 3);\nvoid (0);\n__d(\"TypeaheadSearchFilter\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        var j = this._typeahead, k = j.getView().seeMoreEndpoint;\n        this._subscriptions = [g.subscribe(\"search/typeahead/updateFilter\", function(l, m) {\n            if (((m.filter_type == \"web\"))) {\n                j.getView().queryData.form = \"FBKBFR\";\n            }\n        ;\n        ;\n            j.getView().queryData.type = m.filter_type;\n        }),g.subscribe(\"search/typeahead/updateSeeMoreEndpoint\", function(l, m) {\n            j.getView().seeMoreEndpoint = m;\n        }),g.subscribe(\"page_transition\", function(l, m) {\n            if (j.getView().queryData.form) {\n                delete j.getView().queryData.form;\n            }\n        ;\n        ;\n            delete j.getView().queryData.type;\n            j.getView().seeMoreEndpoint = k;\n        }, g.SUBSCRIBE_NEW),];\n    };\n    i.prototype.disable = function() {\n        this._subscriptions.forEach(function(j) {\n            j.unsubscribe();\n        });\n        this._subscriptions = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:SearchFilterTypeaheadBehavior\", [\"TypeaheadSearchFilter\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchFilter\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.initFilters = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypeaheadDetectQueryLocale\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this._typeahead = h;\n        this._data = h.getData();\n        this._queryCache = {\n            \"\": this._data.queryCache,\n            ja_JP: {\n            },\n            zh_TW: {\n            }\n        };\n    };\n;\n    g.prototype.enable = function() {\n        this._previousLocale = \"\";\n        this._reset = this._typeahead.subscribe(\"reset\", this._swapQueryCache.bind(this, \"\"));\n        this._beforeQuery = this._data.subscribe(\"beforeQuery\", function(h, i) {\n            var j = i.value;\n            if (((j === \"\"))) {\n                this._swapQueryCache(\"\");\n                return;\n            }\n        ;\n        ;\n            var k = null, l = j.charCodeAt(((j.length - 1)));\n            if (((((12352 <= l)) && ((l <= 12543))))) {\n                k = \"ja_JP\";\n            }\n             else if (((((12544 <= l)) && ((l <= 12735))))) {\n                k = \"zh_TW\";\n            }\n            \n        ;\n        ;\n            this._swapQueryCache(k);\n        }.bind(this));\n    };\n    g.prototype.disable = function() {\n        this._swapQueryCache(\"\");\n        this._data.unsubscribe(this._beforeQuery);\n        this._typeahead.ubsubscribe(this._reset);\n    };\n    g.prototype._swapQueryCache = function(h) {\n        if (((((h === null)) || ((h === this._previousLocale))))) {\n            return;\n        }\n    ;\n    ;\n        this._data.queryCache = this._queryCache[h];\n        this._data.setQueryData({\n            query_locale: h\n        });\n        this._previousLocale = h;\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadDisableBucketization\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        this._typeahead.getView().disableBucketization();\n        this._typeahead.getData().inform(\"recordFunction\", function(j, k, l) {\n            l.bucketization_disabled = 1;\n        });\n    };\n    g(i.prototype, {\n        disable: h.thatReturns\n    });\n    e.exports = i;\n});\n__d(\"TypeaheadExcludeBootstrapFromQueryCache\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this._data = h.getData();\n    };\n;\n    g.prototype.enable = function() {\n        this._buildingQueryCache = false;\n        this._buildQueryCache = this._data.subscribe(\"buildQueryCache\", function() {\n            this._buildingQueryCache = true;\n        }.bind(this));\n        this._mergeUids = this._data.subscribe(\"mergeUids\", function(h, i) {\n            if (this._buildingQueryCache) {\n                i.local_uids.splice(0, i.local_uids.length);\n            }\n        ;\n        ;\n        }.bind(this));\n        this._fetchComplete = this._data.subscribe(\"fetchComplete\", function() {\n            this._buildingQueryCache = false;\n        }.bind(this));\n    };\n    g.prototype.disable = function() {\n        this._data.unsubscribe(this._buildQueryCache);\n        this._data.unsubscribe(this._mergeUids);\n        this._data.unsubscribe(this._fetchComplete);\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchBrowseUpsell\", [\"Arbiter\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = \"TypeaheadSearchBrowseUpsell/form\";\n    function n(o) {\n        this._typeahead = o;\n        this._form = null;\n        g.subscribe(m, this._registerForm.bind(this));\n    };\n;\n    n.prototype._registerForm = function(o, p) {\n        this._form = p.cloneNode(true);\n        i.scry(this._form, \"button\").forEach(function(q) {\n            h.removeClass(q, \"selected\");\n        });\n        j.listen(this._form, \"success\", function() {\n            this._typeahead.view.hide();\n            h.addClass(this._form, \"browseSuccess\");\n        }.bind(this));\n    };\n    n.prototype.addUpsell = function(o) {\n        if (this._form) {\n            var p = i.create(\"li\", {\n                className: \"browseUpsell\"\n            }, this._form);\n            o.push({\n                type: \"disabled_result\",\n                uid: \"upsell\",\n                node: p\n            });\n        }\n    ;\n    ;\n    };\n    n.prototype.decorateSeeMore = function(o) {\n        var p = o[((o.length - 1))];\n        if (((p && ((p.uid === \"search\"))))) {\n            h.addClass(p.node, \"browseMore\");\n        }\n    ;\n    ;\n    };\n    n.prototype.showUpsell = function() {\n        var o = this._typeahead.view;\n        return ((o._shouldShowSeeMore && !h.hasClass(o.element, \"typeaheadViewLoading\")));\n    };\n    n.prototype.enable = function() {\n        this._typeahead.subscribe(\"beforeRender\", function(o, p) {\n            var q = p.results.length;\n            if (((q && this.showUpsell()))) {\n                this.decorateSeeMore(p.results);\n                this.addUpsell(p.results);\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n    n.registerForm = function(o) {\n        g.inform(m, o, g.BEHAVIOR_STATE);\n    };\n    k(n.prototype, {\n        disable: l\n    });\n    e.exports = n;\n});\n__d(\"TypeaheadRegulateMemorializedUsers\", [\"copyProperties\",\"TypeaheadUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"TypeaheadUtil\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    g(i.prototype, {\n        _filterRegistry: null,\n        _filter: function(j, k) {\n            if (((((j.type !== \"user\")) || !j.memorialized))) {\n                return true;\n            }\n        ;\n        ;\n            var l = h.parse(j.text).tokens;\n            if (((((l.length === 1)) && h.isExactMatch(k, j.text)))) {\n                return true;\n            }\n        ;\n        ;\n            var m = this._typeahead.getData().getTextToIndex(j), n = h.parse(k).tokens;\n            return ((((n.length > 1)) && h.isQueryMatch(k, m)));\n        },\n        enable: function() {\n            this._filterRegistry = this._typeahead.getData().addFilter(this._filter.bind(this));\n        },\n        disable: function() {\n            this._filterRegistry.remove();\n            this._filterRegistry = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:RegulateMemorializedUsersTypeaheadBehavior\", [\"TypeaheadRegulateMemorializedUsers\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadRegulateMemorializedUsers\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.regulateMemorializedUsers = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);");
// 9144
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o86,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/6eKGrbO_7ck.js",o88);
// undefined
o86 = null;
// undefined
o88 = null;
// 9148
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"C6rJk\",]);\n}\n;\n__d(\"NotifXList\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = null;\n    function i(p) {\n        if (!p) {\n            throw new Error(\"You have to init NotifXList with a non-null owner\")\n        };\n        h = p;\n    };\n    function j(p) {\n        g[p] = null;\n    };\n    function k(p, q) {\n        if (!q) {\n            throw new Error(\"You have to add a non-null data to xList\")\n        };\n        g[p] = q;\n    };\n    function l(p) {\n        var q = ((undefined !== g[p.notif_id])), r = ((p.notif_alt_id && (undefined !== g[p.notif_alt_id])));\n        if ((q || r)) {\n            k((q ? p.notif_id : p.notif_alt_id), p);\n            return true;\n        }\n    ;\n        return false;\n    };\n    function m(p) {\n        return (null != g[p]);\n    };\n    function n(p) {\n        if (m(p)) {\n            var q = g[p];\n            o(p);\n            h.alertList.insert(q.notif_id, q.notif_time, q.notif_markup, q.replace, q.ignoreUnread, q.notif_alt_id);\n        }\n    ;\n    };\n    function o(p) {\n        delete g[p];\n    };\n    e.exports = {\n        init: i,\n        userXClick: j,\n        filterStoreClicked: l,\n        newNotifExist: m,\n        resumeInsert: n,\n        removeNotif: o\n    };\n});");
// 9149
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sd0e0e320aa683436cafcda743d8b77745ad99691");
// 9150
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"C6rJk\",]);\n}\n;\n;\n__d(\"NotifXList\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = null;\n    function i(p) {\n        if (!p) {\n            throw new Error(\"You have to init NotifXList with a non-null owner\");\n        }\n    ;\n    ;\n        h = p;\n    };\n;\n    function j(p) {\n        g[p] = null;\n    };\n;\n    function k(p, q) {\n        if (!q) {\n            throw new Error(\"You have to add a non-null data to xList\");\n        }\n    ;\n    ;\n        g[p] = q;\n    };\n;\n    function l(p) {\n        var q = ((undefined !== g[p.notif_id])), r = ((p.notif_alt_id && ((undefined !== g[p.notif_alt_id]))));\n        if (((q || r))) {\n            k(((q ? p.notif_id : p.notif_alt_id)), p);\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function m(p) {\n        return ((null != g[p]));\n    };\n;\n    function n(p) {\n        if (m(p)) {\n            var q = g[p];\n            o(p);\n            h.alertList.insert(q.notif_id, q.notif_time, q.notif_markup, q.replace, q.ignoreUnread, q.notif_alt_id);\n        }\n    ;\n    ;\n    };\n;\n    function o(p) {\n        delete g[p];\n    };\n;\n    e.exports = {\n        init: i,\n        userXClick: j,\n        filterStoreClicked: l,\n        newNotifExist: m,\n        resumeInsert: n,\n        removeNotif: o\n    };\n});");
// 9160
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o89,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js",o90);
// undefined
o89 = null;
// undefined
o90 = null;
// 9859
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"jsIYP\",]);\n}\n;\n__d(\"AdsCurrency\", [\"AdsCurrencyConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrencyConfig\").currencies;\n    function h(m) {\n        if (g[m]) {\n            return g[m][0]\n        };\n        return null;\n    };\n    function i(m) {\n        if (g[m]) {\n            return g[m][1]\n        };\n        return null;\n    };\n    function j(m) {\n        if (g[m]) {\n            return (1 * g[m][2])\n        };\n        return 1;\n    };\n    var k = [];\n    for (var l in g) {\n        if (g.hasOwnProperty(l)) {\n            k.push(l);\n        };\n    };\n    f.getFormat = h;\n    f.getSymbol = i;\n    f.getOffset = j;\n    f.currencyMapKeys = k;\n});\n__d(\"ads-lib-formatters\", [\"AdsCurrency\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrency\"), h = \"USD\";\n    function i(t, u, v) {\n        t = (t || \"\");\n        v = (v || \"\");\n        u = ((typeof u === \"undefined\") ? t.length : u);\n        return ((t.length > u) ? ((t.substr(0, (u - v.length)) + v)) : t);\n    };\n    function j(t, u) {\n        if (((u === undefined) || (u === null))) {\n            u = \"\";\n        };\n        return function(v) {\n            return (!v ? u : i(v, t, \"...\"));\n        };\n    };\n    function k(t, u, v, w) {\n        if ((t === \"N/A\")) {\n            return t\n        };\n        t = (t || 0);\n        v = (v || \"\");\n        w = (w || \".\");\n        t = ((u !== null) ? l(t, u) : (t + \"\"));\n        var x = t.split(\".\"), y = x[0], z = x[1], aa = \"\", ba = /(\\d)(\\d\\d\\d)($|\\D)/, ca = ((\"$1\" + v) + \"$2$3\");\n        while (((aa = y.replace(ba, ca)) != y)) {\n            y = aa;;\n        };\n        var da = y;\n        if (z) {\n            da += (w + z);\n        };\n        return da;\n    };\n    function l(t, u) {\n        var v = Math.pow(10, u);\n        t = ((Math.round((t * v)) / v) + \"\");\n        if (!u) {\n            return t\n        };\n        var w = t.indexOf(\".\"), x = 0;\n        if ((w == -1)) {\n            t += \".\";\n            x = u;\n        }\n         else x = (u - (((t.length - w) - 1)));\n    ;\n        for (var y = 0, z = x; (y < z); y++) {\n            t += \"0\";;\n        };\n        return t;\n    };\n    function m(t) {\n        return function(u) {\n            return k(u, (t || 0), \",\", \".\");\n        };\n    };\n    function n(t, u) {\n        var v = ((u === false) ? 1 : 100);\n        return function(w) {\n            return (k((w * v), (t || 0), \",\", \".\") + \"%\");\n        };\n    };\n    var o = {\n    };\n    function p(t, u, v) {\n        if ((t === undefined)) {\n            t = 2;\n        };\n        if ((v === undefined)) {\n            v = false;\n        };\n        u = (u || h);\n        var w = ((((u + \"-\") + t) + \"-\") + v);\n        if (!o[w]) {\n            var x = (g.getFormat(u) || g.getFormat(h)), y = (g.getSymbol(u) || g.getSymbol(h)), z = (g.getOffset(u) || g.getOffset(h));\n            x = x.replace(\"{symbol}\", y);\n            o[w] = function(aa) {\n                if (v) {\n                    aa = (aa / z);\n                };\n                if (!((aa + \"\")).match(/^\\-?[\\d\\.,]*$/)) {\n                    return \"N/A\"\n                };\n                var ba = k(aa, t, \",\", \".\");\n                return x.replace(\"{amount}\", ba);\n            };\n        }\n    ;\n        return o[w];\n    };\n    function q(t) {\n        t = ((t + \"\")).trim().replace(/^[^\\d]*\\-/, \"\\u0002\");\n        if (!(((/^\\u0002?(\\d+,\\d*){2,}$/.test(t)) || (/^\\u0002?(\\d+\\.\\d*){2,}$/.test(t))))) {\n            t = t.replace(/[\\.,](\\d*\\D*)$/, \"\\u0001$1\");\n        };\n        t = t.replace(/[^0-9\\u0001\\u0002]/g, \"\").replace(\"\\u0001\", \".\").replace(\"\\u0002\", \"-\");\n        return (+t || 0);\n    };\n    function r() {\n        return function(t) {\n            return (k(t, 0, \",\", \".\") + \"%\");\n        };\n    };\n    function s(t) {\n        var u = t.currency(), v = ((t.offset() == 100) ? 2 : 0);\n        return p(v, u);\n    };\n    f.createTextTruncator = j;\n    f.chopString = i;\n    f.parseNumber = q;\n    f.formatNumber = k;\n    f.createNumberFormatter = m;\n    f.createPercentFormatter = n;\n    f.createMoneyFormatter = p;\n    f.createMoneyFormatterForAccount = s;\n    f.createInflationFormatter = r;\n});\n__d(\"ComposerXDatepickerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbTimelineBackdatedComposer__datepickericonselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n    e.exports = i;\n});\n__d(\"legacy:dom-html\", [\"HTML\",], function(a, b, c, d) {\n    a.HTML = b(\"HTML\");\n}, 3);\n__d(\"ScrollingPager\", [\"Arbiter\",\"copyProperties\",\"CSS\",\"OnVisible\",\"UIPagelet\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"OnVisible\"), k = b(\"UIPagelet\"), l = b(\"$\"), m = b(\"ge\"), n = {\n    };\n    function o(p, q, r, s) {\n        this.scroll_loader_id = p;\n        this.pagelet_src = q;\n        this.data = r;\n        this.options = (s || {\n        });\n        if (this.options.target_id) {\n            this.target_id = this.options.target_id;\n            this.options.append = true;\n        }\n         else this.target_id = p;\n    ;\n        this.scroll_area_id = this.options.scroll_area_id;\n        this.handler = null;\n    };\n    h(o, {\n        REGISTERED: \"ScrollingPager/registered\",\n        getInstance: function(p) {\n            return n[p];\n        }\n    });\n    h(o.prototype, {\n        setBuffer: function(p) {\n            this.options.buffer = p;\n            (this.onvisible && this.onvisible.setBuffer(p));\n        },\n        getBuffer: function() {\n            return this.options.buffer;\n        },\n        register: function() {\n            this.onvisible = new j(l(this.scroll_loader_id), this.getHandler(), false, this.options.buffer, false, m(this.scroll_area_id));\n            n[this.scroll_loader_id] = this;\n            g.inform(o.REGISTERED, {\n                id: this.scroll_loader_id\n            });\n        },\n        getInstance: function(p) {\n            return n[p];\n        },\n        getHandler: function() {\n            if (this.handler) {\n                return this.handler\n            };\n            function p(q) {\n                var r = m(this.scroll_loader_id);\n                if (!r) {\n                    this.onvisible.remove();\n                    return;\n                }\n            ;\n                i.addClass(r.firstChild, \"async_saving\");\n                var s = this.options.handler;\n                this.options.handler = function() {\n                    g.inform(\"ScrollingPager/loadingComplete\");\n                    (s && s.apply(null, arguments));\n                };\n                if (q) {\n                    this.data.pager_fired_on_init = true;\n                };\n                k.loadFromEndpoint(this.pagelet_src, this.target_id, this.data, this.options);\n            };\n            return p.bind(this);\n        },\n        setHandler: function(p) {\n            this.handler = p;\n        },\n        removeOnVisible: function() {\n            this.onvisible.remove();\n        },\n        checkBuffer: function() {\n            (this.onvisible && this.onvisible.checkBuffer());\n        }\n    });\n    e.exports = o;\n});\n__d(\"StickyController\", [\"Event\",\"CSS\",\"Style\",\"Vector\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"queryThenMutateDOM\");\n    function m(n, o, p, q) {\n        this._element = n;\n        this._marginTop = o;\n        this._onchange = p;\n        this._proxy = (q || n.parentNode);\n        this._boundQueryOnScroll = this._queryOnScroll.bind(this);\n        this._boundMutateOnScroll = this._mutateOnScroll.bind(this);\n    };\n    k(m.prototype, {\n        handleScroll: function() {\n            l(this._boundQueryOnScroll, this._boundMutateOnScroll);\n        },\n        _queryOnScroll: function() {\n            this._shouldFix = (j.getElementPosition(this._proxy, \"viewport\").y <= this._marginTop);\n        },\n        _mutateOnScroll: function() {\n            var n = this._shouldFix;\n            if ((this.isFixed() !== n)) {\n                i.set(this._element, \"top\", (n ? (this._marginTop + \"px\") : \"\"));\n                h.conditionClass(this._element, \"fixed_elem\", n);\n                (this._onchange && this._onchange(n));\n            }\n        ;\n        },\n        start: function() {\n            if (this._event) {\n                return\n            };\n            this._event = g.listen(window, \"scroll\", this.handleScroll.bind(this));\n            this.handleScroll.bind(this).defer();\n        },\n        stop: function() {\n            (this._event && this._event.remove());\n            this._event = null;\n        },\n        isFixed: function() {\n            return h.hasClass(this._element, \"fixed_elem\");\n        }\n    });\n    e.exports = m;\n});\n__d(\"tidyEvent\", [\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = [];\n    function i() {\n        while (h.length) {\n            var k = h.shift();\n            if (k.remove) {\n                (k._handler && k.remove());\n            }\n             else (k && k.unsubscribe());\n        ;\n        };\n    };\n    function j(k) {\n        if (!h.length) {\n            g.onLeave(i);\n        };\n        if (Array.isArray(k)) {\n            h = h.concat(k);\n        }\n         else h.push(k);\n    ;\n        return k;\n    };\n    e.exports = j;\n});\n__d(\"TriggerablePageletLoader\", [\"function-extensions\",\"CSS\",\"Event\",\"OnVisible\",\"Run\",\"UIPagelet\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"CSS\"), h = b(\"Event\"), i = b(\"OnVisible\"), j = b(\"Run\"), k = b(\"UIPagelet\"), l = b(\"copyProperties\"), m = [];\n    function n(p) {\n        if (!m[p]) {\n            return\n        };\n        (m[p].__trigger && m[p].__trigger.remove());\n        delete m[p];\n    };\n    function o(p, q) {\n        this._disabledTriggerKeys = [];\n        this._pageletConfig = p;\n        this._loaded = false;\n        this._loading = false;\n        this._triggerKeys = [];\n        if (q) {\n            q.forEach(this.addTrigger.bind(this));\n        };\n        j.onLeave(this.destroy.bind(this));\n    };\n    l(o, {\n        removeTrigger: function(p) {\n            for (var q in m) {\n                if ((m[q] && (m[q].node === p))) {\n                    n(q);\n                };\n            };\n        },\n        TRIGGER_CLICK: \"click\",\n        TRIGGER_ONVISIBLE: \"onvisible\",\n        TRIGGER_NOW: \"now\"\n    });\n    l(o.prototype, {\n        addTrigger: function(p) {\n            p.__trigger = this._createTrigger(p);\n            m.push(p);\n            this._triggerKeys.push((m.length - 1));\n        },\n        destroy: function() {\n            this.removeTriggers();\n            if (this._pageletRequest) {\n                this._pageletRequest.cancel();\n                this._pageletRequest = null;\n                this._loading = false;\n                this._loaded = false;\n            }\n        ;\n        },\n        disableTriggers: function() {\n            this._triggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger.remove();\n                    this._disabledTriggerKeys.push(p);\n                }\n            ;\n            }.bind(this));\n        },\n        enableTriggers: function() {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            this._disabledTriggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger = this._createTrigger(m[p]);\n                };\n            }.bind(this));\n            this._disabledTriggerKeys.length = 0;\n        },\n        _createTrigger: function(p) {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            var q = this.onTrigger.bind(this, p);\n            switch (p.type) {\n              case o.TRIGGER_CLICK:\n                return h.listen(p.node, \"click\", function(r) {\n                    r.prevent();\n                    q();\n                });\n              case o.TRIGGER_ONVISIBLE:\n                return new i(p.node, q, p.onVisibleStrict, p.onVisibleBuffer);\n              case o.TRIGGER_NOW:\n                return q();\n              default:\n            \n            };\n        },\n        load: function(p) {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            this._loading = true;\n            this._loaded = false;\n            g.addClass(this._pageletConfig.node, \"async_saving\");\n            if ((p && p.node)) {\n                g.addClass(p.node, \"async_saving\");\n            };\n            var q = (this._pageletConfig.options || {\n            });\n            q.displayCallback = this.onLoad.bind(this, p);\n            if ((q.crossPage === undefined)) {\n                q.crossPage = true;\n            };\n            this._pageletRequest = k.loadFromEndpoint(this._pageletConfig.controller, this._pageletConfig.node, this._pageletConfig.data, q);\n        },\n        onLoad: function(p, q) {\n            this._loaded = true;\n            this._pageletRequest = null;\n            g.removeClass(this._pageletConfig.node, \"async_saving\");\n            if ((p && p.node)) {\n                g.removeClass(p.node, \"async_saving\");\n            };\n            if (this._pageletConfig.displayCallback) {\n                this._pageletConfig.displayCallback(q);\n            }\n             else q();\n        ;\n        },\n        onTrigger: function(p) {\n            (p.callback && p.callback(p));\n            if ((!this._loaded && !this._loading)) {\n                this.load(p);\n            };\n        },\n        removeTriggers: function(p) {\n            this._triggerKeys.forEach(function(q) {\n                if ((m[q] && ((!p || (m[q].type === p))))) {\n                    n(q);\n                };\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"MedleyPageletRequestData\", [\"Arbiter\",\"TidyArbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TidyArbiter\"), i = {\n    }, j = {\n        get: function() {\n            return i;\n        },\n        set: function(k) {\n            i = k;\n            h.inform(\"Medley/requestDataSet\", null, g.BEHAVIOR_STATE);\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineSection\", [\"Arbiter\",\"DOMScroll\",\"DoublyLinkedListMap\",\"Run\",\"TidyArbiterMixin\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMScroll\"), i = b(\"DoublyLinkedListMap\"), j = b(\"Run\"), k = b(\"TidyArbiterMixin\"), l = b(\"copyProperties\"), m = b(\"ge\"), n = null;\n    function o() {\n        n = null;\n    };\n    function p(q, r, s) {\n        this.id = q;\n        this.label = s;\n        this.nodeID = r;\n        this._parentSection = null;\n        this.childSections = new i();\n        this._isLoaded = false;\n        p.inform.bind(p, (\"sectionInitialized/\" + q), {\n            section: this\n        }, g.BEHAVIOR_STATE).defer();\n    };\n    l(p, k, {\n        callWithSection: function(q, r) {\n            this.subscribe((\"sectionInitialized/\" + q), function(s, t) {\n                r(t.section);\n            });\n        },\n        setActiveSectionID: function(q) {\n            (!n && j.onLeave(o));\n            n = q;\n        }\n    });\n    l(p.prototype, {\n        appendSection: function(q) {\n            this.childSections.append(q.id, q);\n            q._parentSection = this;\n        },\n        freeze: function() {\n            this.freezeChildren();\n        },\n        freezeChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                (!q.isActive() && q.freeze());\n                q = q.getNext();\n            };\n        },\n        getNext: function() {\n            return (this._parentSection && this._parentSection.childSections.getNext(this.id));\n        },\n        getPrev: function() {\n            return (this._parentSection && this._parentSection.childSections.getPrev(this.id));\n        },\n        isActive: function() {\n            var q = this;\n            while (q) {\n                if ((q.id === n)) {\n                    return true\n                };\n                q = q._parentSection;\n            };\n            return false;\n        },\n        isLoaded: function() {\n            return this._isLoaded;\n        },\n        setIsLoaded: function(q) {\n            this._isLoaded = q;\n            return this;\n        },\n        scrollTo: function() {\n            if (!m(this.nodeID)) {\n                return\n            };\n            h.scrollTo(this.getNode(), true, false, false, h.scrollTo.bind(this).curry(this.getNode(), 0));\n        },\n        thaw: function() {\n            this.thawChildren();\n        },\n        thawChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                q.thaw();\n                q = q.getNext();\n            };\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineDynamicSection\", [\"Class\",\"DOM\",\"TimelineSection\",\"copyProperties\",\"cx\",\"ge\",\"TimelineDynamicSectionConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"TimelineSection\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"ge\"), m = b(\"TimelineDynamicSectionConfig\");\n    function n(o, p, q) {\n        this._controller = p;\n        this._data = null;\n        this._node = null;\n        this._triggerLoader = null;\n        this.parent.construct(this, o, o, q);\n    };\n    g.extend(n, i);\n    j(n.prototype, {\n        _createNode: function() {\n            return h.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineMedley__sectionwrapper\",\n                id: this.nodeID\n            }, [m.throbber.cloneNode(true),]);\n        },\n        getNode: function() {\n            if (!this._node) {\n                this._node = (l(this.nodeID) || this._createNode());\n            };\n            return this._node;\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineAppCollection\", [\"function-extensions\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"Event\",\"MedleyPageletRequestData\",\"NumberFormatConfig\",\"PageTransitions\",\"Parent\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineDynamicSection\",\"TimelineSection\",\"TriggerablePageletLoader\",\"TimelineDynamicSectionConfig\",\"copyProperties\",\"csx\",\"cx\",\"ads-lib-formatters\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Event\"), l = b(\"MedleyPageletRequestData\"), m = b(\"NumberFormatConfig\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"TidyArbiter\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineDynamicSection\"), t = b(\"TimelineSection\"), u = b(\"TriggerablePageletLoader\"), v = b(\"TimelineDynamicSectionConfig\"), w = b(\"copyProperties\"), x = b(\"csx\"), y = b(\"cx\"), z = b(\"ads-lib-formatters\"), aa = b(\"ge\"), ba = 500, ca = 8;\n    function da(ha) {\n        var ia = aa(ga.getIDByToken(ha));\n        if (!ia) {\n            return\n        };\n        return i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0];\n    };\n    function ea(ha, ia) {\n        ((ia && !ia.isDefaultRequested()) && ia.prevent());\n        var ja = ha._parentSection, ka = ja._parentSection;\n        t.setActiveSectionID(ja.id);\n        ja.setActiveCollection(ha);\n        if ((ja._sk === ka._sk)) {\n            if (!h.hasClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\")) {\n                h.addClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                ka.freezeChildren();\n            }\n        ;\n            (ha._isFullyLoaded && ka.addSectionTeasers());\n        }\n    ;\n        if ((!ka.isMedleyView() && (ja._sk === ka._sk))) {\n            var la = ha.href;\n            n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), la);\n        }\n    ;\n    };\n    function fa(ha, ia) {\n        ia.data.overview = (ha._parentSection._sk !== ha._parentSection._parentSection._sk);\n        ia.data.cursor = null;\n        ea(ha);\n    };\n    function ga(ha, ia, ja, ka, la, ma) {\n        this._contentLoader = null;\n        this._isFrozen = false;\n        this._isFullyLoaded = false;\n        this._cursor = 0;\n        this._tabNode = ja;\n        this._tabCount = ((ka > 0) ? ka : 0);\n        this._token = ha;\n        this._ftid = null;\n        this.auxContent = null;\n        this.curationContent = null;\n        this._order = la;\n        this.href = ma;\n        this._sortContent = null;\n        this.refreshCount();\n        this.parent.construct(this, ga.getIDByToken(ha), ia);\n        if (!ja) {\n            return\n        };\n        if (aa(this.nodeID)) {\n            k.listen(ja, \"click\", ea.curry(this));\n        }\n         else this.createTriggerLoader.bind(this).defer();\n    ;\n    };\n    g.extend(ga, s);\n    w(ga, r, {\n        NEW_ITEM: \"TimelineAppCollection/newItem\",\n        ADDING_PLACEHOLDER: \"TimelineAppCollection/addingPlaceholder\",\n        addPlaceholderToCollection: function(ha, ia, ja) {\n            ja = ((typeof ja !== \"undefined\") ? ja : {\n            });\n            if (!ja.suppressCount) {\n                this.incrementCount(ga.getIDByToken(ha));\n            };\n            t.callWithSection(ga.getIDByToken(ha), function(ka) {\n                var la = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemtitle\")[0].cloneNode(true), ma = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemimage .img\")[0], na = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\")[0], oa = (na && na.getAttribute(\"data-obj\"));\n                if ((!la || !oa)) {\n                    return\n                };\n                ka.inform(ga.ADDING_PLACEHOLDER);\n                var pa = da(ha);\n                if (!pa) {\n                    return\n                };\n                var qa = i.scry(pa, ((\"[data-obj=\\\"\" + oa) + \"\\\"]\"))[0], ra = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__placeholderimage\"\n                });\n                if (ma) {\n                    p.set(ra, \"background-image\", ((\"url(\" + ma.src) + \")\"));\n                };\n                var sa = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__itemimage\"\n                }, [ra,]), ta = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__content\"\n                }, [la,]), ua = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\"\n                }, [sa,ta,]), va = i.create(\"li\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__item\",\n                    id: (\"collectionItemPlaceholder\" + oa)\n                }, [ua,]);\n                if ((qa && ja.replaceExistingElement)) {\n                    i.replace(qa.parentNode, va);\n                }\n                 else {\n                    if (qa) {\n                        i.remove(qa.parentNode);\n                    }\n                     else if ((ka.isOverview() && (pa.children.length >= ca))) {\n                        h.addClass(pa.children[(ca - 1)], \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n                    }\n                ;\n                    i.prependContent(pa, va);\n                }\n            ;\n            });\n        },\n        replaceItem: function(ha, ia, ja) {\n            var ka = o.byClass(ha, \"-cx-PUBLIC-fbTimelineCollectionGrid__root\"), la = i.scry(ka, ((\"div[data-obj=\\\"\" + ia) + \"\\\"]\"))[0];\n            if (la) {\n                ga.inform(ga.NEW_ITEM, {\n                    grid: ka,\n                    newItem: ja\n                });\n                i.replace(la.parentNode, ja);\n            }\n        ;\n        },\n        addItemToCollection: function(ha, ia, ja) {\n            var ka = aa(ja);\n            if (!ka) {\n                return\n            };\n            var la = i.scry(ka, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0], ma = la.parentNode.nextSibling;\n            if ((ma && h.hasClass(ma, \"-cx-PRIVATE-fbTimelineMedleyPager__root\"))) {\n                i.remove(la.lastChild);\n            };\n            this.inform(ga.NEW_ITEM, {\n                grid: la,\n                newItem: ha\n            });\n            var na = aa((\"collectionItemPlaceholder\" + ia));\n            if (na) {\n                i.replace(na, ha);\n                return;\n            }\n        ;\n            i.prependContent(la, ha);\n        },\n        createFromArray: function(ha) {\n            return ha.map(function(ia) {\n                return new ga(ia.token, ia.controller, ia.tab_node, ia.tab_count, ia.order, ia.href);\n            });\n        },\n        decrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                if ((ia._tabCount > 0)) {\n                    ia._tabCount--;\n                    ia.refreshCount();\n                    ia.flashCountIf();\n                }\n            ;\n            });\n        },\n        enableContentLoader: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.addContentLoader(ia, ja);\n            });\n        },\n        getIDByToken: function(ha) {\n            return (\"pagelet_timeline_app_collection_\" + ha);\n        },\n        incrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._tabCount++;\n                ia.refreshCount();\n                ia.flashCountIf();\n            });\n        },\n        registerAuxContent: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.registerAuxContent(ia);\n            });\n        },\n        registerAddCurationContent: function(ha, ia, ja, ka) {\n            t.callWithSection(ha, function(la) {\n                la.registerAddCurationContent(ia, ja, ka);\n            });\n        },\n        registerSortContent: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.registerSortContent(ia, ja);\n            });\n        },\n        setLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia.setIsLoaded(true);\n                ia._parentSection.inform(\"loaded\", ia);\n                ia._parentSection.unsetMinHeight();\n            });\n        },\n        setFullyLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._isFullyLoaded = true;\n                var ja = ia._parentSection;\n                ((ja._sk === ja._parentSection._sk) && ja._parentSection.addSectionTeasers());\n            });\n        },\n        setFTID: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.setFTID(ia);\n            });\n        },\n        switchToNullStateCurationContent: function(ha) {\n            t.callWithSection(ga.getIDByToken(ha), function(ia) {\n                ia.nullStateCurationContent();\n            });\n        }\n    });\n    w(ga.prototype, r, {\n        addContentLoader: function(ha, ia) {\n            this._cursor = ia;\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ja = {\n                    node: ha\n                };\n                if (h.hasClass(ha, \"-cx-PRIVATE-fbTimelineMedleyPager__root\")) {\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else if (this._isFrozen) {\n                    i.remove(ha);\n                    ja.node = v.pager.cloneNode(true);\n                    i.appendContent(this.getNode(), ja.node);\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else {\n                    ja.onVisibleBuffer = ba;\n                    ja.onVisibleStrict = true;\n                    ja.type = u.TRIGGER_ONVISIBLE;\n                }\n                \n            ;\n                if ((ja.type === u.TRIGGER_CLICK)) {\n                    ja.callback = t.setActiveSectionID.curry(this.id);\n                };\n                var ka = w({\n                    displayCallback: function(la) {\n                        i.remove(ja.node);\n                        la();\n                    },\n                    options: {\n                        append: true\n                    }\n                }, this.getDefaultPageletConfig());\n                ka.data.overview = this.isOverview();\n                this._triggerLoader = null;\n                this._contentLoader = new u(ka, [ja,]);\n            }.bind(this));\n        },\n        _createNode: function() {\n            var ha = this.parent._createNode();\n            ha.setAttribute(\"aria-role\", \"tabpanel\");\n            return ha;\n        },\n        createTriggerLoader: function() {\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ha = this.getDefaultPageletConfig(), ia = {\n                    callback: fa.curry(this, ha),\n                    node: this._tabNode,\n                    type: u.TRIGGER_CLICK\n                };\n                this._triggerLoader = new u(ha, [ia,]);\n            }.bind(this));\n        },\n        disableContentLoader: function() {\n            (this._contentLoader && this._contentLoader.disableTriggers());\n        },\n        enableContentLoader: function() {\n            var ha = (this._triggerLoader || this._contentLoader);\n            (ha && ha.enableTriggers());\n        },\n        freeze: function() {\n            this._isFrozen = true;\n            if ((!this._contentLoader || this._contentLoader._loading)) {\n                return\n            };\n            this._contentLoader.removeTriggers(u.TRIGGER_ONVISIBLE);\n            var ha = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            if (!ha.length) {\n                var ia = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\")[0];\n                (ia.length && this.addContentLoader(ia, this._cursor));\n            }\n        ;\n        },\n        getCount: function() {\n            return this._tabCount;\n        },\n        getDefaultPageletConfig: function() {\n            return {\n                controller: this._controller,\n                data: w({\n                    collection_token: this._token,\n                    cursor: this._cursor\n                }, l.get(), {\n                    ftid: this._ftid,\n                    order: this._order\n                }, {\n                    sk: this._parentSection._sk\n                }),\n                node: this.getNode()\n            };\n        },\n        getMedleySiteKey: function() {\n            return this._parentSection._parentSection._sk;\n        },\n        flashCountIf: function() {\n            if ((this._parentSection.getActiveCollection() != this)) {\n                h.addClass(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\");\n                setTimeout(h.removeClass.curry(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\"), 800);\n            }\n        ;\n        },\n        isOverview: function() {\n            return (this._parentSection._sk != this._parentSection._parentSection._sk);\n        },\n        registerAuxContent: function(ha) {\n            this.auxContent = ha;\n            if ((ha.nodeType == 11)) {\n                this.auxContent = i.create(\"span\", null, ha);\n            };\n            if ((this._parentSection._activeCollection !== this)) {\n                h.hide(this.auxContent);\n            };\n            this._parentSection.addAuxContent(this.auxContent);\n        },\n        registerAddCurationContent: function(ha, ia, ja) {\n            if (this.curationContent) {\n                return\n            };\n            this.curationContent = (((ha.nodeType == 11)) ? i.create(\"span\", null, ha) : ha);\n            this.curationContentState = ia;\n            this._parentSection.addCurationContent(this.curationContent, this, ja);\n        },\n        nullStateCurationContent: function() {\n            this._parentSection.nullStateCurationContent();\n        },\n        registerSortContent: function(ha, ia) {\n            (this._sortContent && i.remove(this._sortContent));\n            this._sortContent = ha;\n            ia.subscribeOnce(\"change\", function(ja, ka) {\n                i.setContent(i.find(ha, \".-cx-PRIVATE-fbTimelineCollectionSorting__menulabel\"), ka.label);\n                this._sort(ka.value);\n            }.bind(this));\n        },\n        refreshCount: function() {\n            if (!this._tabNode) {\n                return\n            };\n            var ha = j.find(this._tabNode, \".-cx-PRIVATE-fbTimelineAppSection__tabcount\");\n            if ((this._tabCount > 0)) {\n                i.setContent(ha, z.formatNumber(this._tabCount, 0, m.numberDelimiter, \"\"));\n            }\n             else i.setContent(ha, \"\");\n        ;\n        },\n        _resetContent: function() {\n            (this._contentLoader && this._contentLoader.destroy());\n            i.remove(this.getNode());\n            this._node = null;\n            i.appendContent(j.find(this._parentSection.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), this.getNode());\n            this.addContentLoader(j.find(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\"), 0);\n        },\n        setFTID: function(ha) {\n            this._ftid = ha;\n        },\n        _sort: function(ha) {\n            this._order = ha;\n            this._resetContent();\n            var ia = this._parentSection, ja = ia._parentSection;\n            if ((!ja.isMedleyView() && (ia._sk === ja._sk))) {\n                var ka = n.getCurrentURI();\n                ka.addQueryData({\n                    order: this._order\n                });\n                n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), ka);\n            }\n        ;\n        },\n        thaw: function() {\n            this._isFrozen = false;\n        },\n        getToken: function() {\n            return this._token;\n        }\n    });\n    e.exports = ga;\n});\n__d(\"TimelineCommentsLoader\", [\"Event\",\"CommentPrelude\",\"CSS\",\"DOM\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"emptyFunction\"), m = {\n        init: function() {\n            m.init = l;\n            g.listen(document.body, \"click\", function(n) {\n                var o = k.byClass(n.getTarget(), \"fbTimelineFeedbackCommentLoader\");\n                if (o) {\n                    n.kill();\n                    h.click(o, false);\n                    var p = k.byTag(o, \"form\"), q = j.scry(p, \"li.uiUfiViewAll input\");\n                    if (!q.length) {\n                        q = j.scry(p, \"li.fbUfiViewPrevious input\");\n                    };\n                    if (!q.length) {\n                        q = j.scry(p, \"a.UFIPagerLink\");\n                    };\n                    q[0].click();\n                    i.show(j.find(p, \"li.uiUfiComments\"));\n                    i.removeClass(o, \"fbTimelineFeedbackCommentLoader\");\n                }\n            ;\n            });\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DS_HEIGHT: \"timeline-unit-height\",\n        DS_LOADED: \"timeline-capsule-loaded\",\n        DS_SIDEORG: \"timeline-unit-sideorg\",\n        DS_TAILBALANCE: \"timeline-capsule-tailbalance\",\n        DS_COLUMN_HEIGHT_DIFFERENTIAL: \"timeline-column-diff-height\",\n        FIXED_SIDE_LEFT: \"left\",\n        FIXED_SIDE_RIGHT: \"right\",\n        FIXED_SIDE_BOTH: \"both\",\n        FIXED_SIDE_NONE: \"none\",\n        SCROLL_TO_OFFSET: 30,\n        SUBSECTION_SCROLL_TO_OFFSET: 90,\n        SCRUBBER_DEFAULT_OFFSET: 38,\n        SECTION_LOADING: \"TimelineConstants/sectionLoading\",\n        SECTION_LOADED: \"TimelineConstants/sectionLoaded\",\n        SECTION_FULLY_LOADED: \"TimelineConstants/sectionFullyLoaded\",\n        SECTION_REGISTERED: \"TimelineConstants/sectionRegistered\"\n    };\n    e.exports = g;\n});\n__d(\"TimelineLegacySections\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        get: function(i) {\n            return g[i];\n        },\n        getAll: function() {\n            return g;\n        },\n        remove: function(i) {\n            delete g[i];\n        },\n        removeAll: function() {\n            g = {\n            };\n        },\n        set: function(i, j) {\n            g[i] = j;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        TIMELINE_KEY: \"timeline\",\n        WALL_KEY: \"wall\",\n        parseURI: function(i) {\n            i = g(i);\n            var j = i.getQueryData(), k = i.getPath(), l = k.split(\"/\").slice(1);\n            if (((l[0] == \"people\") || (l[0] == \"pages\"))) {\n                l = l.slice(2);\n            };\n            var m = ((j.sk || l[1]) || h.TIMELINE_KEY);\n            if ((m == h.WALL_KEY)) {\n                m = h.TIMELINE_KEY;\n            };\n            var n = null, o = null;\n            if ((m == h.TIMELINE_KEY)) {\n                o = (parseInt(l[2], 10) || null);\n                n = (parseInt(l[3], 10) || null);\n            }\n        ;\n            return {\n                path: k,\n                id: (j.id || l[0]),\n                key: m,\n                viewas: (j.viewas ? j.viewas : 0),\n                filter: (j.filter ? j.filter : null),\n                year: o,\n                month: n,\n                friendship: !!j.and\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineController\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOMQuery\",\"Run\",\"ScrollingPager\",\"TidyArbiter\",\"TimelineConstants\",\"TimelineLegacySections\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"copyProperties\",\"ge\",\"tidyEvent\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOMQuery\"), l = b(\"Run\"), m = b(\"ScrollingPager\"), n = b(\"TidyArbiter\"), o = b(\"TimelineConstants\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineURI\"), r = b(\"Vector\"), s = b(\"ViewportBounds\"), t = b(\"$\"), u = b(\"copyProperties\"), v = b(\"ge\"), w = b(\"tidyEvent\"), x = b(\"queryThenMutateDOM\"), y = 358, z = 48, aa = 740, ba = 1285, ca = null, da = false, ea, fa, ga, ha = {\n    }, ia = {\n    }, ja = [], ka = null, la = null, ma = false, na = false, oa = 0, pa = false, qa = false, ra = false, sa = {\n    }, ta = false;\n    function ua() {\n        (ka && ka.remove());\n        ka = null;\n    };\n    function va(hb, ib, jb) {\n        jb = (jb || []);\n        if (ha[hb]) {\n            return ha[hb][ib].apply(ha[hb], jb)\n        };\n        ia[hb] = (ia[hb] || {\n        });\n        ia[hb][ib] = jb;\n        return false;\n    };\n    function wa() {\n        if (!(((pa || ra) || qa))) {\n            ua();\n            return;\n        }\n    ;\n        var hb = r.getScrollPosition();\n        pa = (pa && ab(v(\"rightCol\"), hb, \"paddingTop\", true));\n        qa = (qa && ab(t(\"pagelet_above_header_timeline\"), hb, \"top\"));\n        ra = (ra && ab(t(\"blueBar\"), hb, \"paddingTop\"));\n    };\n    var xa = 0;\n    function ya() {\n        xa = r.getScrollPosition();\n    };\n    function za() {\n        x(ya, function() {\n            var hb = ((oa === 0) || (xa.y >= oa));\n            va(gb.STICKY_HEADER, \"toggle\", [hb,]);\n            va(gb.CONTENT, \"checkCurrentSectionChange\");\n        }, \"TimelineController/scrollListener\");\n    };\n    function ab(hb, ib, jb, kb) {\n        if (!hb) {\n            ua();\n            return;\n        }\n    ;\n        if ((ib.y <= 0)) {\n            bb(hb, jb);\n            return false;\n        }\n         else {\n            var lb = (kb && gb.getCurrentScrubber());\n            if ((lb && i.hasClass(lb.getRoot(), \"fixed_elem\"))) {\n                bb(hb, jb);\n                return false;\n            }\n             else {\n                var mb = (parseInt(hb.style[jb], 10) || 0);\n                if ((ib.y < mb)) {\n                    i.addClass(hb, \"timeline_fixed\");\n                    hb.style[jb] = (ib.y + \"px\");\n                }\n                 else i.removeClass(hb, \"timeline_fixed\");\n            ;\n            }\n        ;\n        }\n    ;\n        return true;\n    };\n    function bb(hb, ib) {\n        hb.style[ib] = \"0px\";\n        i.removeClass(hb, \"timeline_fixed\");\n    };\n    function cb() {\n        x(gb.shouldShowWideAds, function() {\n            va(gb.ADS, \"adjustAdsType\", [ma,]);\n            va(gb.ADS, \"adjustAdsToFit\");\n            va(gb.CONTENT, \"adjustContentPadding\");\n            va(gb.STICKY_HEADER_NAV, \"adjustMenuHeights\");\n        }, \"TimelineController/resize\");\n    };\n    function db(hb, ib) {\n        if ((hb == \"sidebar/initialized\")) {\n            ta = true;\n        };\n        va(gb.ADS, \"adjustAdsType\", [gb.shouldShowWideAds(),]);\n    };\n    function eb(hb, ib) {\n        var jb = v(\"rightCol\");\n        if (jb) {\n            jb.style.paddingTop = (ib + \"px\");\n            pa = true;\n        }\n    ;\n        var kb = t(\"pagelet_above_header_timeline\");\n        if (kb.firstChild) {\n            t(\"above_header_timeline_placeholder\").style.height = (kb.offsetHeight + \"px\");\n            kb.style.top = (ib + \"px\");\n            qa = true;\n        }\n    ;\n        var lb = document.documentElement;\n        ra = ((lb.clientHeight < 400) || (lb.clientWidth < lb.scrollWidth));\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = (ib + \"px\");\n        };\n        ka = g.listen(window, \"scroll\", wa);\n        h.inform(\"reflow\");\n    };\n    function fb() {\n        while (ja.length) {\n            ja.pop().remove();;\n        };\n        for (var hb in ha) {\n            (ha[hb].reset && ha[hb].reset());;\n        };\n        ua();\n        ga.unsubscribe();\n        ga = null;\n        ca = null;\n        ea = null;\n        ha = {\n        };\n        ia = {\n        };\n        la = null;\n        na = false;\n        oa = 0;\n        qa = false;\n        if (pa) {\n            var ib = v(\"rightCol\");\n            if (ib) {\n                ib.style.paddingTop = \"\";\n                i.removeClass(ib, \"timeline_fixed\");\n            }\n        ;\n        }\n    ;\n        pa = false;\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = \"\";\n            i.removeClass(t(\"blueBar\"), \"timeline_fixed\");\n        }\n    ;\n        ra = false;\n        ta = false;\n        da = false;\n        j.purge(o.DS_HEIGHT);\n        j.purge(o.DS_LOADED);\n        j.purge(o.DS_SIDEORG);\n        j.purge(o.DS_TAILBALANCE);\n        j.purge(o.DS_COLUMN_HEIGHT_DIFFERENTIAL);\n    };\n    var gb = {\n        NAV: \"nav\",\n        STICKY_HEADER: \"sticky_header\",\n        STICKY_HEADER_NAV: \"sticky_header_nav\",\n        SCRUBBER: \"scrubber\",\n        CONTENT: \"content\",\n        ADS: \"ads\",\n        LOGGING: \"logging\",\n        init: function(hb, ib, jb) {\n            if (da) {\n                return\n            };\n            if ((ib == q.WALL_KEY)) {\n                ib = q.TIMELINE_KEY;\n            };\n            da = true;\n            ea = hb;\n            fa = jb.has_fixed_ads;\n            na = jb.one_column_minimal;\n            sa = {\n                allactivity: true,\n                approve: true\n            };\n            if (!na) {\n                u(sa, {\n                    games: true,\n                    map: true,\n                    music: true,\n                    video: true\n                });\n            };\n            sa[q.TIMELINE_KEY] = true;\n            va(gb.CONTENT, \"adjustContentPadding\");\n            ja.push(g.listen(window, \"scroll\", za), g.listen(window, \"resize\", cb));\n            ga = h.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], db);\n            w(n.subscribe(\"TimelineCover/coverCollapsed\", eb));\n            l.onLeave(fb);\n            gb.registerCurrentKey(ib);\n        },\n        setAdsTracking: function(hb) {\n            va(gb.ADS, \"start\", [hb,]);\n        },\n        pageHasScrubber: function(hb) {\n            return ((!hb || ((!na && hb.match(/^(og_)?app_/)))) || ((hb in sa)));\n        },\n        fixedAds: function() {\n            return fa;\n        },\n        registerCurrentKey: function(hb) {\n            ca = hb;\n            la = (((hb !== \"map\") && (r.getViewportDimensions().y < aa)) && gb.pageHasScrubber(hb));\n            la = (la || t(\"blueBar\").offsetTop);\n            va(gb.ADS, \"setShortMode\", [la,]);\n            va(gb.ADS, \"updateCurrentKey\", [hb,]);\n            oa = ((hb == q.TIMELINE_KEY) ? (y - z) : 0);\n        },\n        getCurrentKey: function() {\n            return ca;\n        },\n        getCurrentScrubber: function() {\n            return ha[gb.SCRUBBER];\n        },\n        getCurrentStickyHeaderNav: function() {\n            return ha[gb.STICKY_HEADER_NAV];\n        },\n        scrubberHasLoaded: function(hb) {\n            i.conditionClass(hb.getRoot(), \"fixed_elem\", !la);\n            va(gb.ADS, \"registerScrubber\", [hb,]);\n        },\n        scrubberHasChangedState: function() {\n            va(gb.ADS, \"adjustAdsToFit\");\n        },\n        scrubberWasClicked: function(hb) {\n            va(gb.LOGGING, \"logScrubberClick\", [hb,]);\n        },\n        stickyHeaderNavWasClicked: function(hb) {\n            va(gb.LOGGING, \"logStickyHeaderNavClick\", [hb,]);\n        },\n        sectionHasChanged: function(hb, ib) {\n            va(gb.STICKY_HEADER_NAV, \"updateSection\", [hb,ib,]);\n            va(gb.SCRUBBER, \"updateSection\", [hb,ib,]);\n            va(gb.ADS, \"loadAdsIfEnoughTimePassed\");\n            va(gb.LOGGING, \"logSectionChange\", [hb,ib,]);\n        },\n        navigateToSection: function(hb) {\n            va(gb.CONTENT, \"navigateToSection\", [hb,]);\n        },\n        shouldShowWideAds: function() {\n            if (!ta) {\n                ma = false;\n            }\n             else {\n                var hb = ((ba + s.getRight()) + s.getLeft());\n                ma = (r.getViewportDimensions().x >= hb);\n            }\n        ;\n            return ma;\n        },\n        sidebarInitialized: function() {\n            return ta;\n        },\n        adjustStickyHeaderWidth: function() {\n            va(gb.STICKY_HEADER, \"adjustWidth\");\n        },\n        isOneColumnMinimal: function() {\n            return na;\n        },\n        register: function(hb, ib) {\n            ha[hb] = ib;\n            if (ia[hb]) {\n                for (var jb in ia[hb]) {\n                    va(hb, jb, ia[hb][jb]);;\n                };\n                delete ia[hb];\n            }\n        ;\n        },\n        adjustScrollingPagerBuffer: function(hb, ib) {\n            var jb = j.get(o.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib);\n            if (!jb) {\n                return\n            };\n            var kb = m.getInstance(hb);\n            (kb && kb.setBuffer((kb.getBuffer() + Math.abs(jb))));\n        },\n        runOnceWhenSectionFullyLoaded: function(hb, ib, jb) {\n            var kb = p.get(ib);\n            if (kb) {\n                var lb = false;\n                k.scry(kb.node, \".fbTimelineCapsule\").forEach(function(nb) {\n                    if ((!lb && (parseInt(j.get(o.DS_LOADED, nb.id), 10) >= parseInt(jb, 10)))) {\n                        hb();\n                        lb = true;\n                    }\n                ;\n                });\n                if (lb) {\n                    return\n                };\n            }\n        ;\n            var mb = h.subscribe(o.SECTION_FULLY_LOADED, function(nb, ob) {\n                if (((ob.scrubberKey === ib) && (ob.pageIndex === jb))) {\n                    hb();\n                    mb.unsubscribe();\n                }\n            ;\n            });\n        }\n    };\n    e.exports = gb;\n});\n__d(\"TimelineDrag\", [\"Event\",\"ArbiterMixin\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"Locale\"), j = b(\"Style\"), k = b(\"Vector\"), l = b(\"copyProperties\");\n    function m(n, o, p) {\n        p = (p || {\n        });\n        this._listenOn = p.listenOn;\n        this._offsetInput = o;\n        this._defaultOffset = p.default_offset;\n        this._killClicks = p.killClicks;\n        this._vertical = true;\n        this._RTLXSwitch = false;\n        this.setPicture(n, p);\n    };\n    l(m.prototype, h, {\n        setPicture: function(n, o) {\n            if (!n) {\n                return false\n            };\n            o = (o || {\n            });\n            this._picture = n;\n            this._defaultOffset = o.default_offset;\n            if (o.offsetInput) {\n                this._offsetInput = o.offsetInput;\n            };\n            if ((o.vertical !== undefined)) {\n                this._vertical = o.vertical;\n            };\n            if (o.height) {\n                this._containerHeight = o.height;\n            };\n            if (o.width) {\n                this._containerWidth = o.width;\n            };\n            if (this._vertical) {\n                this._offsetType = \"top\";\n                this._eventCoord = \"y\";\n            }\n             else {\n                this._RTLXSwitch = i.isRTL();\n                this._offsetType = \"left\";\n                this._eventCoord = \"x\";\n            }\n        ;\n            if (this._picture.complete) {\n                this._initialLoad();\n            }\n             else this._loadListener = g.listen(this._picture, \"load\", function() {\n                this._loadListener.remove();\n                this._initialLoad();\n            }.bind(this));\n        ;\n        },\n        destroy: function() {\n            this._stopDrag();\n            this._saveOffset();\n            (this._mousedown && this._mousedown.remove());\n            (this._onclick && this._onclick.remove());\n            (this._loadListener && this._loadListener.remove());\n        },\n        _initialLoad: function() {\n            var n = (this._listenOn ? this._listenOn : this._picture);\n            (this._mousedown && this._mousedown.remove());\n            this._mousedown = g.listen(n, \"mousedown\", this._onMouseDown.bind(this));\n            if (this._vertical) {\n                this._maxOffset = (this._containerHeight - this._picture.offsetHeight);\n            }\n             else this._maxOffset = (this._containerWidth - this._picture.offsetWidth);\n        ;\n            if ((this._defaultOffset !== undefined)) {\n                this._setOffset(this._defaultOffset);\n            };\n            (this._onclick && this._onclick.remove());\n            if (this._killClicks) {\n                this._onclick = g.listen(n, \"click\", this._onClick.bind(this));\n            };\n            this._saveOffset();\n        },\n        _onClick: function(event) {\n            event.kill();\n        },\n        _onMouseDown: function(event) {\n            var n = (parseInt(j.get(this._picture, this._offsetType), 10) || 0);\n            this._pictureStartDragOffset = (n - k.getEventPosition(event)[this._eventCoord]);\n            this._startDrag();\n            event.kill();\n        },\n        _startDrag: function() {\n            if (!this._dragStarted) {\n                this.inform(\"startdrag\", this);\n                this._dragTokens = [g.listen(document.documentElement, \"mouseup\", this._onMouseUp.bind(this)),g.listen(document.documentElement, \"mousemove\", this._onMouseMove.bind(this)),];\n                this._dragStarted = true;\n            }\n        ;\n        },\n        _saveOffset: function() {\n            var n = parseInt(j.get(this._picture, this._offsetType), 10);\n            if (this._RTLXSwitch) {\n                this._offsetInput.value = ((n + this._containerWidth) - this._picture.offsetWidth);\n            }\n             else this._offsetInput.value = n;\n        ;\n        },\n        _stopDrag: function() {\n            if (this._dragStarted) {\n                this.inform(\"stopdrag\", this);\n                this._dragStarted = false;\n                this._dragTokens.forEach(function(n) {\n                    n.remove();\n                });\n                this._saveOffset();\n            }\n        ;\n        },\n        _onMouseUp: function(event) {\n            this._stopDrag();\n            event.kill();\n        },\n        _setOffset: function(n) {\n            if (this._RTLXSwitch) {\n                n = Math.max(0, Math.min(n, -this._maxOffset));\n            }\n             else n = Math.min(0, Math.max(n, this._maxOffset));\n        ;\n            j.set(this._picture, this._offsetType, (n + \"px\"));\n        },\n        _onMouseMove: function(event) {\n            this._setOffset((this._pictureStartDragOffset + k.getEventPosition(event)[this._eventCoord]));\n            event.kill();\n        }\n    });\n    e.exports = m;\n});\n__d(\"TimelineCover\", [\"Arbiter\",\"Button\",\"CSS\",\"DOM\",\"HTML\",\"Parent\",\"DOMScroll\",\"TimelineController\",\"TimelineDrag\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Button\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"HTML\"), l = b(\"Parent\"), m = b(\"DOMScroll\"), n = b(\"TimelineController\"), o = b(\"TimelineDrag\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"ge\");\n    function v(w, x, y) {\n        this.root = r(\"fbProfileCover\");\n        if ((typeof x === \"object\")) {\n            this._coverHeight = x.cover_height;\n            this._coverWidth = x.cover_width;\n            this.previewing = x.previewing;\n            this._isLegacy = false;\n        }\n         else {\n            this._isLegacy = true;\n            this._coverHeight = x;\n            this.previewing = y;\n        }\n    ;\n        this._parentSection = l.byClass(this.root, \"fbTimelineSection\");\n        this.cover = j.find(this.root, \".cover\");\n        v.instance = this;\n        this.editing = false;\n        if (!this._parentSection) {\n            this._parentSection = l.byClass(this.root, \"fbEventHeader\");\n        };\n        if (this.previewing) {\n            this.editMode();\n            this.updateCoverImage(this.previewing);\n        }\n    ;\n    };\n    v.instance = null;\n    v.getInstance = function() {\n        return v.instance;\n    };\n    s(v.prototype, {\n        showLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.addClass(w, \"opaquedLoading\");\n            };\n        },\n        hideLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.removeClass(w, \"opaquedLoading\");\n            };\n        },\n        isCoverImageVerticalFlow: function(w) {\n            return !(w.style.height);\n        },\n        editMode: function() {\n            h.setEnabled(j.find(this.root, \"button.cancelButton\"), true);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), true);\n            this.hideLoadingIndicator();\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = j.scry(this._coverImage, \".coverWrap\")[0];\n            if (w) {\n                var x = j.find(w, \".coverPhotoImg\");\n                this._originalIsVertical = this.isCoverImageVerticalFlow(x);\n                this._originalOffset = p.get(x, (this._originalIsVertical ? \"top\" : \"left\"));\n            }\n        ;\n            i.addClass(this._parentSection, \"fbEditCover\");\n            m.scrollTo(this.root);\n            if (this.previewing) {\n                j.remove(this._coverImage);\n                i.show(this._coverImage);\n            }\n        ;\n            var y = j.scry(this._coverImage, \".coverPhotoImg\")[0];\n            if (y) {\n                this._createDragger();\n            };\n            this.editing = true;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"open\"\n            });\n        },\n        _exitEditMode: function() {\n            if (this._timelineDrag) {\n                this._timelineDrag.destroy();\n                this._timelineDrag = null;\n            }\n        ;\n            j.find(this.root, \"input.hiddenPhotoID\").value = null;\n            j.find(this.root, \"input.hiddenVideoID\").value = null;\n            h.setEnabled(j.find(this.root, \"button.cancelButton\"), false);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), false);\n            i.removeClass(this._parentSection, \"fbEditCover\");\n            this.hideLoadingIndicator();\n            this.previewing = false;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"closed\"\n            });\n        },\n        _createDragger: function(w) {\n            var x;\n            if (this._isLegacy) {\n                x = j.find(this.root, \"input.photoOffsetInput\");\n                this._originalIsVertical = true;\n            }\n             else {\n                var y = ((w === undefined) ? this._originalIsVertical : w);\n                x = (y ? j.find(this.root, \"input.photoOffsetYInput\") : j.find(this.root, \"input.photoOffsetXInput\"));\n            }\n        ;\n            this._timelineDrag = new o(j.find(this.root, \".coverImage .coverPhotoImg\"), x, {\n                height: this._coverHeight,\n                width: this._coverWidth,\n                listenOn: this.cover,\n                vertical: y,\n                killClicks: true\n            });\n        },\n        updateCoverImage: function(w, x, y) {\n            this.videoID = y;\n            if (x) {\n                this.editMode();\n            };\n            j.find(this.root, \"input.hiddenPhotoID\").value = w;\n            j.find(this.root, \"input.hiddenVideoID\").value = (y || null);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), true);\n            if (x) {\n                j.replace(j.find(this.root, \".coverImage\"), k(x));\n            };\n            var z = j.find(j.find(this.root, \".coverImage\"), \".coverPhotoImg\"), aa = this.isCoverImageVerticalFlow(z), ba;\n            if (this._isLegacy) {\n                ba = j.find(this.root, \"input.photoOffsetInput\");\n            }\n             else ba = (aa ? j.find(this.root, \"input.photoOffsetYInput\") : j.find(this.root, \"input.photoOffsetXInput\"));\n        ;\n            if (this._timelineDrag) {\n                this._timelineDrag.setPicture(z, {\n                    offsetInput: ba,\n                    vertical: aa\n                });\n            }\n             else this._createDragger(aa);\n        ;\n        },\n        cancelUpdate: function() {\n            j.remove(j.scry(this.root, \".coverImage\")[0]);\n            j.prependContent(this.cover, this._coverImage);\n            if ((this._originalOffset !== undefined)) {\n                p.set(j.find(this._coverImage, \".coverPhotoImg\"), (this._originalIsVertical ? \"top\" : \"left\"), this._originalOffset);\n            };\n            this._exitEditMode();\n        },\n        saveComplete: function() {\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = l.byClass(this.root, \"fbTimelineTopSectionBase\");\n            (w && i.removeClass(w, \"-cx-PRIVATE-fbTimelineLightHeader__nocover\"));\n            this._exitEditMode();\n        },\n        isInEditMode: function() {\n            return this.editing;\n        }\n    });\n    e.exports = v;\n});\n__d(\"TimelineCapsule\", [\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"Parent\",\"TimelineConstants\",\"TimelineLegacySections\",\"UserAgent\",\"Vector\",\"$\",\"createArrayFrom\",\"csx\",\"isEmpty\",\"queryThenMutateDOM\",\"requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DOMScroll\"), m = b(\"Parent\"), n = b(\"TimelineConstants\"), o = b(\"TimelineLegacySections\"), p = b(\"UserAgent\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"createArrayFrom\"), t = b(\"csx\"), u = b(\"isEmpty\"), v = b(\"queryThenMutateDOM\"), w = b(\"requestAnimationFrame\"), x = (function() {\n        var y = 45, z = 15, aa = \"use\", ba = \"update\", ca = {\n        }, da = {\n        };\n        function ea(ra) {\n            return h.hasClass(ra, \"fbTimelineBalancer\");\n        };\n        function fa(ra) {\n            return ra.getAttribute(\"data-spine\");\n        };\n        function ga(ra) {\n            return h.hasClass(ra, \"placeholderUnit\");\n        };\n        function ha(ra, sa) {\n            if (sa) {\n                return ((i.get(n.DS_SIDEORG, ra.id) || ra.getAttribute(\"data-side\")))\n            };\n            return ra.getAttribute(\"data-side\");\n        };\n        var ia = function(ra, sa) {\n            if ((p.ie() <= 6)) {\n                ia = function(ta, ua) {\n                    i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                    ta.setAttribute(\"data-side\", ua);\n                    h.removeClass(ta, \"leftColumn\");\n                    h.removeClass(ta, \"rightColumn\");\n                    h.addClass(ta, ((ua == \"l\") ? \"leftColumn\" : \"rightColumn\"));\n                };\n            }\n             else ia = function(ta, ua) {\n                i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                ta.setAttribute(\"data-side\", ua);\n            };\n        ;\n            ia(ra, sa);\n        };\n        function ja(ra) {\n            return ra.getAttribute(\"data-size\");\n        };\n        function ka(ra) {\n            if (((h.hasClass(ra, \"fbTimelineOneColumn\") && ra.prevSibling) && h.hasClass(ra.prevSibling, \"fbTimelineOneColumn\"))) {\n                return (z * 2)\n            };\n            if (h.hasClass(ra, \"fbTimelineIndeterminateContent\")) {\n                return 0\n            };\n            return z;\n        };\n        function la(ra, sa) {\n            var ta = 0;\n            if ((h.shown(ra) && !h.hasClass(ra, \"placeholderUnit\"))) {\n                if ((sa === aa)) {\n                    ta = i.get(n.DS_HEIGHT, ra.id, null);\n                    if ((ta === null)) {\n                        ta = ra.getAttribute(\"data-calculatedheight\");\n                    };\n                }\n                 else ta = (ra.offsetHeight + ka(ra));\n            \n            };\n            if (((sa === aa) && (ta === null))) {\n                ta = 300;\n            };\n            i.set(n.DS_HEIGHT, ra.id, parseInt(ta, 10));\n        };\n        function ma(ra) {\n            var sa = i.get(n.DS_HEIGHT, ra.id, null);\n            return sa;\n        };\n        function na(ra, sa) {\n            if ((ja(sa) == \"2\")) {\n                return 0;\n            }\n             else if ((ha(sa) == \"r\")) {\n                return (ra + ma(sa));\n            }\n             else return (ra - ma(sa))\n            \n        ;\n        };\n        function oa(ra) {\n            k.scry(ra, \".-cx-PUBLIC-timelineOneColMin__endmarker\").forEach(function(sa) {\n                var ta = sa.getAttribute(\"data-endmarker\"), ua = sa.getAttribute(\"data-pageindex\"), va = function() {\n                    if (!sa.parentNode) {\n                        return\n                    };\n                    i.set(n.DS_LOADED, ra.id, ua);\n                    j.remove(sa);\n                    g.inform(n.SECTION_FULLY_LOADED, {\n                        scrubberKey: ta,\n                        pageIndex: ua,\n                        capsuleID: ra.id,\n                        childCount: ra.childNodes.length\n                    });\n                };\n                if (o.get(ta)) {\n                    va();\n                }\n                 else var wa = g.subscribe(n.SECTION_REGISTERED, function(xa, ya) {\n                    if ((ya.scrubberKey === ta)) {\n                        va();\n                        wa.unsubscribe();\n                    }\n                ;\n                })\n            ;\n            });\n            g.inform(\"TimelineCapsule/balanced\", {\n                capsule: ra\n            });\n        };\n        function pa(ra) {\n            if (u(ca[ra.id])) {\n                return\n            };\n            var sa = (ea(ra) ? ra.firstChild : ra), ta = sa.childNodes.length, ua = {\n            }, va = {\n            }, wa, xa = z, ya = z, za, ab = [];\n            for (var bb = 0; (bb < ta); bb++) {\n                wa = sa.childNodes[bb];\n                if (h.hasClass(wa, \"fbTimelineUnit\")) {\n                    za = k.scry(wa, \"div.timelineUnitContainer\")[0];\n                    if (za) {\n                        va[wa.id] = za.getAttribute(\"data-time\");\n                    };\n                    if ((!ga(wa) && h.shown(wa))) {\n                        if ((ja(wa) == \"2\")) {\n                            ua[wa.id] = Math.max(xa, ya);\n                            xa = ya = (ua[wa.id] + ma(wa));\n                        }\n                         else if ((ha(wa) == \"r\")) {\n                            ua[wa.id] = ya;\n                            ya += ma(wa);\n                        }\n                         else {\n                            ua[wa.id] = xa;\n                            xa += ma(wa);\n                        }\n                        \n                    ;\n                        if (((ha(wa, true) == \"l\") || (ja(wa) == \"2\"))) {\n                            ab.push(wa.id);\n                        };\n                    }\n                ;\n                }\n            ;\n            };\n            for (bb = 0; (bb < (ab.length - 1)); ++bb) {\n                var cb = ab[bb], db = ab[(bb + 1)], eb = (ua[cb] + y), fb = ua[db];\n                for (var gb in ca[ra.id]) {\n                    if ((eb > fb)) {\n                        break;\n                    };\n                    var hb = ca[ra.id][gb];\n                    if (h.shown(hb)) {\n                        continue;\n                    };\n                    if (((va[gb] <= va[cb]) && (va[gb] > va[db]))) {\n                        hb.style.top = (eb + \"px\");\n                        eb += y;\n                        h.show(hb);\n                    }\n                ;\n                };\n            };\n        };\n        function qa(ra, sa) {\n            var ta = m.byAttribute(ra, \"data-size\");\n            if (ta) {\n                if (h.hasClass(ra.parentNode, \"timelineReportContent\")) {\n                    sa(ra);\n                }\n                 else sa(ta);\n            ;\n                x.balanceCapsule(m.byClass(ta, \"fbTimelineCapsule\"));\n            }\n        ;\n        };\n        return {\n            removeUnit: function(ra) {\n                qa(ra, function(sa) {\n                    j.remove(sa);\n                });\n            },\n            hideUnit: function(ra) {\n                qa(ra, function(sa) {\n                    h.addClass(sa, \"fbTimelineColumnHidden\");\n                });\n            },\n            undoHideUnit: function(ra, sa) {\n                j.remove(m.byClass(sa, \"hiddenText\"));\n                qa(ra, function(ta) {\n                    h.removeClass(ta, \"fbTimelineColumnHidden\");\n                });\n            },\n            unplacehold: function(ra) {\n                var sa = r(ra);\n                sa.style.top = null;\n                h.removeClass(sa, \"visiblePlaceholder\");\n                h.removeClass(sa, \"placeholder\");\n                var ta = m.byClass(sa, \"fbTimelineCapsule\");\n                delete ca[ta.id][ra];\n                x.balanceCapsule(ta);\n            },\n            scrollToCapsule: function(ra) {\n                if (!da.hasOwnProperty(ra.id)) {\n                    var sa = q.getElementPosition(ra.parentNode);\n                    l.scrollTo(new q(q.getScrollPosition().x, (sa.y - n.SUBSECTION_SCROLL_TO_OFFSET), \"document\"));\n                    da[ra.id] = true;\n                }\n            ;\n            },\n            balanceCapsuleFromChild: function(ra, sa) {\n                x.balanceCapsule(m.byClass(ra, \"fbTimelineCapsule\"), sa);\n            },\n            balanceCapsuleDeferred: function(ra, sa) {\n                x.balanceCapsule.curry(ra, sa).defer();\n            },\n            balanceCapsule: function(ra, sa) {\n                if ((!ra || !ra.childNodes)) {\n                    return\n                };\n                var ta = 0, ua, va = document.createDocumentFragment(), wa = [], xa = [], ya = [], za = false, ab = (sa && sa.heights_action);\n                if ((sa && sa.tail_balance)) {\n                    i.set(n.DS_TAILBALANCE, ra.id, sa.tail_balance);\n                };\n                if (((ab !== ba) && ((p.chrome() || p.webkit())))) {\n                    h.toggleClass(ra, \"webkitFix\");\n                };\n                for (var bb = 0; (bb < ra.childNodes.length); bb++) {\n                    ua = ra.childNodes[bb];\n                    if (fa(ua)) {\n                        continue;\n                    }\n                     else if (ea(ua)) {\n                        s(ua.firstChild.childNodes).forEach(function(jb) {\n                            la(jb, ab);\n                        });\n                        continue;\n                    }\n                    \n                ;\n                    la(ua, ab);\n                    if ((ha(ua, true) == \"r\")) {\n                        xa.push(ua);\n                    }\n                     else wa.push(ua);\n                ;\n                    ya.push(ua);\n                    if ((ja(ua) != \"2\")) {\n                        if (((((ta > 0) && (ha(ua) == \"r\"))) || (((ta < 0) && (ha(ua) == \"l\"))))) {\n                            za = true;\n                        }\n                    };\n                    ta = na(ta, ua);\n                };\n                var cb = [], db = [], eb = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    var kb = s(jb.firstChild.childNodes);\n                    if (jb.getAttribute(\"data-nonunits\")) {\n                        eb = eb.concat(kb);\n                    }\n                     else if ((ha(jb) == \"left\")) {\n                        cb = cb.concat(kb);\n                    }\n                     else if ((ha(jb) == \"right\")) {\n                        db = db.concat(kb);\n                    }\n                    \n                ;\n                });\n                if (za) {\n                    ra.style.minHeight = ra.offsetHeight;\n                    wa.forEach(function(jb) {\n                        if ((ja(jb) != \"2\")) {\n                            ia(jb, \"l\");\n                        };\n                    });\n                    xa.forEach(function(jb) {\n                        if ((ja(jb) != \"2\")) {\n                            ia(jb, \"r\");\n                        };\n                    });\n                    var fb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, wa));\n                    fb.setAttribute(\"data-side\", \"left\");\n                    j.prependContent(ra, fb);\n                    cb = wa.concat(cb);\n                    var gb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, xa));\n                    gb.setAttribute(\"data-side\", \"right\");\n                    j.prependContent(ra, gb);\n                    db = xa.concat(db);\n                    ta = 0;\n                }\n            ;\n                while (eb.length) {\n                    va.appendChild(eb.shift());;\n                };\n                while (((((ta >= 0) && cb.length)) || (((ta < 0) && db.length)))) {\n                    if ((ta >= 0)) {\n                        ua = cb.shift();\n                    }\n                     else ua = db.shift();\n                ;\n                    va.appendChild(ua);\n                    ta = na(ta, ua);\n                };\n                ra.appendChild(va);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    if (!jb.firstChild.childNodes.length) {\n                        j.remove(jb);\n                    };\n                });\n                var hb = (((sa && sa.tail_balance)) || i.get(n.DS_TAILBALANCE, ra.id));\n                if (hb) {\n                    ta = x.tailBalance(ra, ta, hb);\n                };\n                if (za) {\n                    ya.forEach(function(jb) {\n                        if ((jb.parentNode !== ra)) {\n                            ra.appendChild(jb);\n                            ta = na(ta, jb);\n                        }\n                    ;\n                    });\n                    ra.style.minHeight = null;\n                }\n            ;\n                var ib = m.byClass(ra, \"fbTimelineSection\");\n                if (ib) {\n                    i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib.id, ta);\n                };\n                ca[ra.id] = {\n                };\n                k.scry(ra, \"li.placeholderUnit\").forEach(function(jb) {\n                    ca[ra.id][jb.id] = jb;\n                });\n                pa(ra);\n                oa(ra);\n                if ((ab === aa)) {\n                    sa.heights_action = ba;\n                    w(function() {\n                        w(x.balanceCapsule.curry(ra, sa));\n                    });\n                }\n            ;\n            },\n            tailBalance: function(ra, sa, ta) {\n                if (!ra) {\n                    return sa\n                };\n                var ua = [], va = [], wa = [], xa = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    var ab = s(za.firstChild.childNodes);\n                    if (za.getAttribute(\"data-nonunits\")) {\n                        xa = xa.concat(ab);\n                    }\n                     else if ((ha(za) == \"left\")) {\n                        va = va.concat(ab);\n                    }\n                     else if ((ha(za) == \"right\")) {\n                        wa = wa.concat(ab);\n                    }\n                    \n                ;\n                    ua = ua.concat(ab);\n                });\n                if (((((ta == n.FIXED_SIDE_RIGHT) && va.length)) || (((ta == n.FIXED_SIDE_LEFT) && wa.length)))) {\n                    return sa\n                };\n                var ya = document.createDocumentFragment();\n                if (ua) {\n                    while (ua.length) {\n                        if ((ta != n.FIXED_SIDE_NONE)) {\n                            if ((ja(ua[0]) != \"2\")) {\n                                if ((sa >= 0)) {\n                                    ia(ua[0], \"l\");\n                                }\n                                 else ia(ua[0], \"r\");\n                            \n                            }\n                        };\n                        sa = na(sa, ua[0]);\n                        ya.appendChild(ua.shift());\n                    }\n                };\n                ra.appendChild(ya);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    if (!za.firstChild.childNodes.length) {\n                        j.remove(za);\n                    };\n                });\n                return sa;\n            },\n            loadTwoColumnUnits: function(ra) {\n                var sa = r(ra);\n                v(function() {\n                    var ta = m.byClass(sa, \"fbTimelineSection\");\n                    if (ta) {\n                        var ua = k.find(sa, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\"), va = k.find(sa, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\"), wa = (va.offsetHeight - ua.offsetHeight);\n                        i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ta.id, wa);\n                    }\n                ;\n                }, oa.curry(sa));\n            }\n        };\n    })();\n    e.exports = (a.TimelineCapsule || x);\n});\n__d(\"TimelineCapsuleUtilities\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = {\n        setFirstUnit: function(i) {\n            var j = true;\n            for (var k = 0; (k < i.childNodes.length); ++k) {\n                var l = i.childNodes[k];\n                if ((l.id.indexOf(\"tl_unit_\") === 0)) {\n                    if (j) {\n                        j = false;\n                        g.addClass(l, \"firstUnit\");\n                    }\n                     else {\n                        g.removeClass(l, \"firstUnit\");\n                        break;\n                    }\n                \n                };\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineUnitSelector\", [\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Parent\"), i = {\n        getUnitsWithTime: function(j) {\n            return g.scry(j, \"div.timelineUnitContainer\").filter(function(k) {\n                return (((h.byClass(k, \"fbTimelineCapsule\") === j) && k.getAttribute(\"data-time\")));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"TimelineComposerUtilities\", [\"Event\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineUnitSelector\",\"Vector\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"TimelineUnitSelector\"), o = b(\"Vector\"), p = b(\"cx\"), q = b(\"csx\"), r = (86400 * 31), s = 86400000, t = {\n        listenToSetEstimatedDate: function(u, v) {\n            return h.subscribe(\"ComposerXTimelineTagger/init\", function(w, x) {\n                if (l.contains(u, x.datePickerElement)) {\n                    t.setEstimatedDate(x.datePickerInstance, v());\n                    x.composerTimelineTagger.switchToTagger(\"date\");\n                }\n            ;\n            });\n        },\n        listenToSetEstimatedDateOld: function(u, v) {\n            return h.subscribe(\"TimelineBackdatedComposerTagger/initialized\", function(event, w) {\n                if ((w.composer === u)) {\n                    w.date_picker.subscribe(\"initialized\", function(x, y) {\n                        t.setEstimatedDate(y, v());\n                    });\n                };\n            });\n        },\n        listenToPublish: function(u, v) {\n            if (u.root) {\n                u = u.root;\n            };\n            return h.subscribe(\"composer/publish\", function(event, w) {\n                if ((w.composer_id === u.id)) {\n                    i.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                        x.publish(w);\n                        (v && v());\n                    });\n                };\n            });\n        },\n        listenToAnotherComposerOpen: function(u, v) {\n            return h.subscribe(\"composer/mutate\", function(w, x) {\n                if ((x !== u)) {\n                    v();\n                };\n            });\n        },\n        listenToCancel: function(u, v) {\n            return g.listen(u, \"click\", function(event) {\n                if (m.byClass(event.getTarget(), \"-cx-PRIVATE-fbTimelineComposer__cancelbutton\")) {\n                    v();\n                };\n            });\n        },\n        listenToCancelOld: function(u, v) {\n            return g.listen(u, \"click\", function(event) {\n                (m.byClass(event.getTarget(), \"cancelBtn\") && v());\n            });\n        },\n        hidePlaceIfAttachmentsTooTall: function(u) {\n            var v = l.find(u, \".-cx-PRIVATE-fbComposer__attachmentform\"), w = o.getElementDimensions(v).y;\n            if ((w > 50)) {\n                j.hide(l.find(v, \".-cx-PRIVATE-fbComposerAttachment__place\"));\n            };\n        },\n        hidePlaceIfAttachmentsTooTallOld: function(u) {\n            var v = k.find(u, \"ul.fbTimelineComposerAttachments\"), w = o.getElementDimensions(v).y;\n            if ((w > 50)) {\n                var x = m.byTag(k.scry(v, \"span.placeAttachment\")[0], \"li\");\n                (x && j.hide(x));\n            }\n        ;\n        },\n        setEstimatedDate: function(u, v) {\n            var w, x;\n            if ((v && j.hasClass(v, \"fbTimelineCapsule\"))) {\n                w = v.getAttribute(\"data-start\");\n                x = v.getAttribute(\"data-end\");\n                if ((w && x)) {\n                    var y = new Date((x * 1000)), z = new Date();\n                    if ((y > z)) {\n                        u.setDate(z.getFullYear(), (z.getMonth() + 1), z.getDate());\n                    }\n                     else if (((x - w) > (2 * r))) {\n                        u.setDate(y.getFullYear());\n                    }\n                     else u.setDate(y.getFullYear(), (y.getMonth() + 1));\n                    \n                ;\n                }\n            ;\n                return;\n            }\n        ;\n            var aa = m.byClass(v, \"fbTimelineCapsule\");\n            if (aa) {\n                w = aa.getAttribute(\"data-start\");\n                x = aa.getAttribute(\"data-end\");\n                var ba = o.getElementPosition(v).y, ca = [x,null,], da = [w,null,], ea = n.getUnitsWithTime(aa);\n                for (var fa = 0; (fa < ea.length); fa++) {\n                    var ga = ea[fa], ha = k.scry(ga.parentNode, \".spinePointer\")[0];\n                    if (!ha) {\n                        continue;\n                    };\n                    var ia = o.getElementPosition(ha).y;\n                    if ((ia <= ba)) {\n                        if ((!ca[1] || (ia > ca[1]))) {\n                            ca = [ga.getAttribute(\"data-time\"),ia,];\n                        };\n                    }\n                     else if ((!da[1] || (ia < da[1]))) {\n                        da = [ga.getAttribute(\"data-time\"),ia,];\n                    }\n                ;\n                };\n                if (((ca[0] !== null) && (da[0] !== null))) {\n                    var ja = (Math.round((((parseInt(ca[0], 10) + parseInt(da[0], 10))) / 2)) * 1000);\n                    ja = Math.min((new Date() - s), ja);\n                    u.setDateWithTimestamp(ja);\n                }\n            ;\n            }\n        ;\n        },\n        showMLEFlyout: function(u) {\n            var v = (k.scry(document, \"a.fbTimelineSpine\").length === 0), w = function(x) {\n                x.showMLEFlyout(u);\n            };\n            if (v) {\n                i.loadModules([\"TimelineSpinelessComposer\",], w);\n            }\n             else i.loadModules([\"TimelineComposer\",], w);\n        ;\n        }\n    };\n    e.exports = t;\n});\n__d(\"TimelineComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineCapsule\",\"TimelineCapsuleUtilities\",\"TimelineComposerUtilities\",\"$\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineCapsule\"), n = b(\"TimelineCapsuleUtilities\"), o = b(\"TimelineComposerUtilities\"), p = b(\"$\"), q = b(\"cx\"), r;\n    function s(x) {\n        if ((x.isScheduledPost || x.isOGPost)) {\n            return\n        };\n        if (!x.streamStory) {\n            window.location.reload();\n            return;\n        }\n    ;\n        if (x.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(z) {\n                z.publish(x);\n            });\n            return;\n        }\n    ;\n        var y = w.renderCapsuleBasedStory(r, x.streamStory);\n        g.inform(\"TimelineComposer/on_after_publish\", y, g.BEHAVIOR_PERSISTENT);\n    };\n    function t() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\");\n        return j.find(x, \".spinePointer\");\n    };\n    function u(x) {\n        var y = v();\n        i.show(y);\n        var z = x.subscribe(\"hide\", function() {\n            i.hide(y);\n            x.unsubscribe(z);\n        });\n    };\n    function v() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\"), y = j.scry(x, \"div.composerVeil\");\n        if ((y.length !== 1)) {\n            y = j.appendContent(x, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        };\n        return y[0];\n    };\n    var w = {\n        init: function(x) {\n            r = p(x);\n            var y = g.subscribe(\"composer/publish\", function(event, z) {\n                if ((z.composer_id === r.id)) {\n                    s(z);\n                };\n            });\n            l.onLeave(y.unsubscribe.bind(y));\n            if (i.hasClass(r, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                o.hidePlaceIfAttachmentsTooTall(r);\n            }\n             else o.hidePlaceIfAttachmentsTooTallOld(r);\n        ;\n        },\n        showMLEFlyout: function(x) {\n            x.setContext(t()).show();\n            u(x);\n        },\n        renderCapsuleBasedStory: function(x, y) {\n            var z = k.byClass(x, \"fbTimelineCapsule\");\n            if (!z) {\n                return\n            };\n            var aa = k.byClass(x, \"timelineUnitContainer\").parentNode;\n            if (aa.nextSibling.getAttribute(\"data-spine\")) {\n                aa = aa.nextSibling;\n            };\n            var ba = j.insertAfter(aa, y)[0];\n            h.loadModules([\"Animation\",], function(ca) {\n                new ca(ba.firstChild).from(\"backgroundColor\", \"#fff8dd\").to(\"backgroundColor\", \"#fff\").duration(2000).ease(ca.ease.both).go();\n            });\n            n.setFirstUnit(z);\n            m.balanceCapsule(z);\n            return ba;\n        }\n    };\n    e.exports = (a.TimelineComposer || w);\n});\n__d(\"TimelineSmartInsert\", [\"Run\",\"UserAgent\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = b(\"UserAgent\"), i = b(\"Vector\"), j = 100;\n    function k(q) {\n        if ((q === \"viewport\")) {\n            return i.getViewportDimensions().y\n        };\n        return q;\n    };\n    var l = false, m = false;\n    function n() {\n        if (m) {\n            return\n        };\n        g.onLeave(o);\n        m = true;\n    };\n    function o() {\n        l = false;\n        m = false;\n    };\n    var p = {\n        run: function(q, r, s) {\n            n();\n            if ((!l || (h.ie() <= 8))) {\n                r();\n                return;\n            }\n        ;\n            var t = q.offsetHeight;\n            r();\n            var u = q.offsetHeight, v = i.getScrollPosition().y, w = i.getElementPosition(q).y;\n            if ((((u !== t) && (w < v)) && ((w + t) < (v + k((s || j)))))) {\n                window.scrollBy(0, (u - t));\n            };\n        },\n        enable: function() {\n            l = true;\n        }\n    };\n    e.exports = p;\n});\n__d(\"TimelineContentLoader\", [\"Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMScroll\",\"OnVisible\",\"ScrollingPager\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"TimelineSmartInsert\",\"TimelineURI\",\"UIPagelet\",\"UserAgent\",\"Vector\",\"$\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"debounce\",\"ge\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMScroll\"), l = b(\"OnVisible\"), m = b(\"ScrollingPager\"), n = b(\"TimelineConstants\"), o = b(\"TimelineController\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineSmartInsert\"), r = b(\"TimelineURI\"), s = b(\"UIPagelet\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"$\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"createArrayFrom\"), z = b(\"csx\"), aa = b(\"debounce\"), ba = b(\"ge\"), ca = b(\"startsWith\"), da = b(\"tx\"), ea = b(\"userAction\"), fa = false, ga = false, ha, ia = null, ja = {\n    }, ka = [], la = [], ma = [], na = {\n    }, oa = {\n    }, pa = {\n    }, qa = {\n    }, ra = null, sa = null, ta = false, ua = null;\n    function va(eb, fb, gb, hb, ib) {\n        this.node = eb;\n        this.loaded = hb;\n        this.canScrollLoad = true;\n        this.canUnload = (fb != db.RECENT);\n        this.scrubberKey = fb;\n        this.historicUnitCount = ib;\n        this._pageletLoadData = gb;\n        this._expandPageletLoadData = {\n        };\n        this.rightColumnFinished = false;\n    };\n    x(va.prototype, {\n        load: function(eb, fb) {\n            if (this.loaded) {\n                return\n            };\n            var gb = this._pageletLoadData;\n            h.inform(n.SECTION_LOADING, {\n                data: gb,\n                scrubberKey: this.scrubberKey\n            });\n            this.loaded = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            var hb = \"ProfileTimelineSectionPagelet\", ib = (this.scrubberKey == db.WAY_BACK);\n            if (ib) {\n                hb = \"ProfileTimelineRemainingYearsPagelet\";\n            };\n            gb.time_cutoff = db.getTimeCutoff();\n            gb.highlight_unit_data = eb;\n            gb.parent_key = this.parentKey;\n            gb.force_no_friend_activity = ta;\n            i.addClass(this.node, \"fbTimelineSectionLoading\");\n            if (gb.combine_sections) {\n                i.addClass(this.node, \"combinedSections\");\n            };\n            if ((this.canUnload && ga)) {\n                var jb = this.node.firstChild.cloneNode(true);\n                i.hide(jb);\n                j.insertAfter(this.node, jb);\n            }\n             else this.canScrollLoad = false;\n        ;\n            var kb = null;\n            if ((fb && !mb)) {\n                var lb = this.node;\n                lb.style.minHeight = (window.innerHeight + \"px\");\n                kb = function() {\n                    lb.style.minHeight = null;\n                };\n            }\n        ;\n            var mb = (gb.combine_sections && ib);\n            pa[this.scrubberKey] = s.loadFromEndpoint(hb, (mb ? (gb.unit_container_id + \"_left\") : this.node.id), gb, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true,\n                append: mb,\n                finallyHandler: kb\n            });\n            cb(this.scrubberKey);\n        },\n        preload: function() {\n            i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            var eb = j.find(this.node, \"span.sectionLabel\");\n            if (eb.getAttribute(\"data-original-label\")) {\n                j.setContent(eb, eb.getAttribute(\"data-original-label\"));\n                eb.removeAttribute(\"data-original-label\");\n            }\n        ;\n        },\n        unload: function() {\n            if ((!this.loaded || !this.canUnload)) {\n                return\n            };\n            this.loaded = false;\n            (pa[this.scrubberKey] && pa[this.scrubberKey].cancel());\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            if ((this.node.nextSibling && i.hasClass(this.node.nextSibling, \"fbTimelineSection\"))) {\n                j.setContent(this.node, this.node.nextSibling);\n                i.show(this.node.firstChild);\n            }\n             else j.empty(this.node);\n        ;\n            this.deactivateScrollLoad();\n        },\n        activateScrollLoad: function() {\n            this.canScrollLoad = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            (oa[this.scrubberKey] && oa[this.scrubberKey].reset());\n        },\n        deactivateScrollLoad: function() {\n            if (!this.loaded) {\n                this.canScrollLoad = false;\n                i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n                i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n                (oa[this.scrubberKey] && oa[this.scrubberKey].remove());\n            }\n        ;\n        },\n        setExpandLoadData: function(eb) {\n            this._expandPageletLoadData = eb;\n            return this;\n        },\n        appendData: function(eb) {\n            x(this._pageleLoadData, eb);\n            return this;\n        },\n        expandSubSections: function() {\n            if (this.subSections.length) {\n                db.navigateToSection(this.subSections[0].scrubberKey);\n            };\n        },\n        expand: function(eb) {\n            if (!this.loaded) {\n                return\n            };\n            sa.add_event((\"expand_\" + this.scrubberKey));\n            var fb = j.find(this.node, \".fbTimelineSectionExpander\");\n            i.addClass(fb.firstChild, \"async_saving\");\n            (eb && i.addClass(eb, \"async_saving\"));\n            this._expandPageletLoadData.time_cutoff = db.getTimeCutoff();\n            db.navigateToSection(this.scrubberKey);\n            j.scry(this.node, \".fbTimelineCapsule\").forEach(j.remove);\n            this._expandPageletLoadData.new_expand = true;\n            (pa[this.scrubberKey] && pa[this.scrubberKey].cancel());\n            pa[this.scrubberKey] = s.loadFromEndpoint(\"ProfileTimelineSectionPagelet\", fb.id, this._expandPageletLoadData, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true\n            });\n        },\n        isPermalinkPeriod: function() {\n            return this._pageletLoadData.is_permalink_period;\n        }\n    });\n    function wa() {\n        if (fa) {\n            return\n        };\n        o.register(o.CONTENT, db);\n        sa = ea(\"timeline\").uai(\"init\", \"scrubber\", false);\n        fa = true;\n        if ((t.ie() <= 7)) {\n            ga = true;\n        };\n    };\n    var xa = aa(function(eb, fb, gb) {\n        var hb = p.get(eb).historicUnitCount;\n        fb -= hb;\n        gb -= 1;\n        if ((((hb == -1) || (gb <= 0)) || (fb < 0))) {\n            return\n        };\n        var ib = db.getNextSectionKey(eb);\n        if (ib) {\n            p.get(ib).load();\n            xa(ib, fb, gb);\n        }\n    ;\n    }, 500);\n    function ya(eb, fb, gb, hb) {\n        var ib = db.getNextSectionKey(fb);\n        if (ib) {\n            oa[ib] = new l(eb, za.curry(ib, eb), false, (gb || 1000));\n        }\n         else if ((fb !== db.WAY_BACK)) {\n            hb = (hb ? hb : 0);\n            if ((hb > 80)) {\n                return null\n            };\n            ya.curry(eb, fb, gb, (hb + 1)).defer(250);\n        }\n        \n    ;\n    };\n    function za(eb, fb) {\n        var gb = p.get(eb);\n        if ((gb && gb.canScrollLoad)) {\n            sa.add_event((\"scroll_load_\" + eb));\n            if (ga) {\n                gb.preload();\n            }\n             else {\n                gb.load();\n                if (ua) {\n                    xa(eb, ua.required_units, ua.max_parallelism);\n                };\n            }\n        ;\n            (fb && j.remove(fb));\n        }\n    ;\n    };\n    function ab() {\n        var eb, fb, gb = false;\n        for (var hb = 0; (hb < ka.length); hb++) {\n            var ib = ka[hb];\n            if (!ib) {\n                continue;\n            };\n            var jb = p.get(ib);\n            if ((jb && ((jb.canScrollLoad || jb.loaded)))) {\n                if (!jb.loaded) {\n                    i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n                    i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n                }\n            ;\n                if ((eb && fb)) {\n                    bb(eb, fb);\n                    if (gb) {\n                        eb.deactivateScrollLoad();\n                    };\n                    gb = true;\n                }\n            ;\n                eb = null;\n                fb = null;\n                continue;\n            }\n             else if (eb) {\n                fb = jb;\n                jb.deactivateScrollLoad();\n            }\n             else {\n                eb = jb;\n                if (gb) {\n                    jb.activateScrollLoad();\n                };\n            }\n            \n        ;\n            i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n        };\n    };\n    function bb(eb, fb) {\n        i.removeClass(fb.node, \"fbTimelineTimePeriodUnexpanded\");\n        i.addClass(fb.node, \"fbTimelineTimePeriodSuppressed\");\n        var gb = j.find(eb.node, \"span.sectionLabel\"), hb = j.find(fb.node, \"span.sectionLabel\");\n        if (!hb.getAttribute(\"data-original-label\")) {\n            hb.setAttribute(\"data-original-label\", j.getText(hb));\n        };\n        if (((gb.getAttribute(\"data-month\") && hb.getAttribute(\"data-month\")) && (gb.getAttribute(\"data-year\") == hb.getAttribute(\"data-year\")))) {\n            j.setContent(hb, da._(\"Show {month1} - {month2} {year}\", {\n                month1: hb.getAttribute(\"data-month\"),\n                month2: gb.getAttribute(\"data-month\"),\n                year: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else if ((gb.getAttribute(\"data-year\") !== hb.getAttribute(\"data-year\"))) {\n            j.setContent(hb, da._(\"Show {year1} - {year2}\", {\n                year1: hb.getAttribute(\"data-year\"),\n                year2: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else j.setContent(hb, da._(\"Show {year}\", {\n            year: hb.getAttribute(\"data-year\")\n        }));\n        \n    ;\n    };\n    function cb(eb) {\n        if (ga) {\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                };\n                if ((gb != eb)) {\n                    var hb = p.get(gb);\n                    if ((hb.loaded && hb.canUnload)) {\n                        hb.unload();\n                    };\n                }\n            ;\n            }\n        };\n        ab();\n    };\n    var db = {\n        WAY_BACK: \"way_back\",\n        RECENT: \"recent\",\n        HEADER_SCROLL_CUTOFF: 80,\n        CURRENT_SECTION_OFFSET: 150,\n        FOOTER_HEIGHT: 60,\n        registerTimePeriod: function(eb, fb, gb, hb, ib, jb, kb) {\n            wa();\n            if (w(ma, fb)) {\n                return\n            };\n            if (la) {\n                x(gb, la);\n            };\n            var lb = new va(eb, fb, gb, hb, kb);\n            if (!ib) {\n                ka[jb] = fb;\n                ja[fb] = true;\n            }\n             else {\n                lb.parentKey = ib;\n                p.get(ib).subSections = (p.get(ib).subSections || []);\n                p.get(ib).subSections[jb] = lb;\n            }\n        ;\n            p.set(fb, lb);\n            db.checkCurrentSectionChange();\n            h.inform(n.SECTION_REGISTERED, {\n                scrubberKey: fb\n            });\n        },\n        reset: function() {\n            for (var eb in oa) {\n                oa[eb].remove();;\n            };\n            for (var fb in pa) {\n                (pa[fb] && pa[fb].cancel());;\n            };\n            for (var gb in qa) {\n                qa[gb].unsubscribe();\n                delete qa[gb];\n            };\n            (ha && ha.unsubscribe());\n            ha = null;\n            p.removeAll();\n            ia = null;\n            ja = {\n            };\n            ka = [];\n            la = [];\n            ma = [];\n            na = {\n            };\n            oa = {\n            };\n            pa = {\n            };\n            ra = null;\n            sa = null;\n            ta = false;\n            fa = false;\n        },\n        checkCurrentSectionChange: function() {\n            var eb = db.getCurrentSection(), fb = (ia && ia.scrubberKey);\n            if (((eb && (eb.scrubberKey !== fb)) && !eb.isPermalinkPeriod())) {\n                ia = eb;\n                var gb = eb.scrubberKey, hb = eb.parentKey;\n                if (!hb) {\n                    hb = gb;\n                    gb = null;\n                }\n            ;\n                o.sectionHasChanged(hb, gb);\n            }\n        ;\n        },\n        setTimeCutoff: function(eb) {\n            ra = eb;\n        },\n        getTimeCutoff: function() {\n            return ra;\n        },\n        setParallelLoadConfig: function(eb) {\n            ua = eb;\n        },\n        getCurrentSection: function() {\n            var eb = {\n            }, fb = p.getAll();\n            for (var gb in fb) {\n                var hb = fb[gb];\n                if ((!hb.loaded || na[hb.scrubberKey])) {\n                    continue;\n                };\n                var ib = u.getElementPosition(hb.node, \"viewport\").y;\n                if ((hb.scrubberKey == \"recent\")) {\n                    ib--;\n                };\n                if ((ib < db.CURRENT_SECTION_OFFSET)) {\n                    eb[ib] = hb;\n                };\n            };\n            var jb = Math.max.apply(null, Object.keys(eb)), kb = (jb == -Infinity);\n            if (!kb) {\n                return eb[jb];\n            }\n             else if (ka[0]) {\n                return p.get(ka[0])\n            }\n        ;\n            return null;\n        },\n        capsuleForCurrentSection: function() {\n            var eb = db.getCurrentSection();\n            return (eb && j.scry(eb.node, \".fbTimelineCapsule\")[0]);\n        },\n        enableScrollLoad: function(eb, fb, gb, hb) {\n            eb = v(eb);\n            var ib = j.scry(eb.parentNode, \".fbTimelineCapsule\")[0];\n            if (!ib) {\n                return\n            };\n            if ((gb === null)) {\n                ya(eb, fb, hb);\n            }\n             else o.runOnceWhenSectionFullyLoaded(ya.curry(eb, fb, hb), fb, gb);\n        ;\n        },\n        enableScrollLoadOnClick: function(eb, fb, gb) {\n            eb = v(eb);\n            g.listen(eb, \"click\", function(hb) {\n                hb.prevent();\n                db.enableScrollLoad(eb, fb, null, gb);\n            });\n        },\n        expandSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expand();\n            });\n        },\n        expandSubSectionsOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expandSubSections();\n            });\n        },\n        getNextSectionKey: function(eb) {\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                if ((ka[fb] == eb)) {\n                    while (((fb < (ka.length - 1)) && !ka[(fb + 1)])) {\n                        fb++;;\n                    };\n                    return ka[(fb + 1)];\n                }\n            ;\n            };\n            var gb = p.get(eb);\n            if ((!gb || !gb.parentKey)) {\n                return\n            };\n            var hb = p.get(gb.parentKey);\n            if (!hb) {\n                return\n            };\n            for (var ib = 0; (ib < (hb.subSections.length - 1)); ib++) {\n                if ((hb.subSections[ib].scrubberKey == eb)) {\n                    return hb.subSections[(ib + 1)].scrubberKey\n                };\n            };\n        },\n        hideSection: function(eb) {\n            var fb = p.get(eb);\n            (fb && i.hide(j.find(fb.node, \".fbTimelineSection\")));\n            var gb = o.getCurrentScrubber();\n            if (gb) {\n                var hb = o.getCurrentScrubber().getNav(eb);\n                (hb && i.hide(hb));\n            }\n        ;\n            var ib = o.getCurrentStickyHeaderNav();\n            (ib && ib.removeTimePeriod(eb));\n            na[eb] = true;\n        },\n        loadSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).load();\n            });\n        },\n        removeSection: function(eb) {\n            for (var fb in ka) {\n                if ((ka[fb] == eb)) {\n                    ka[fb] = null;\n                    break;\n                }\n            ;\n            };\n            p.remove(eb);\n            delete ja[eb];\n            if ((eb in oa)) {\n                oa[eb].remove();\n                delete oa[eb];\n            }\n        ;\n            var gb = o.getCurrentStickyHeaderNav();\n            (gb && gb.removeTimePeriod(eb));\n            ma.push(eb);\n        },\n        removeSectionParent: function(eb) {\n            j.remove(v(eb).parentNode);\n        },\n        navigateToSection: function(eb, fb, gb) {\n            sa.add_event((\"nav_\" + eb));\n            fb = !!fb;\n            var hb = eb, ib = p.get(eb);\n            if (!ib) {\n                return\n            };\n            if (!ib.loaded) {\n                q.enable();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineShowOlderSections\").forEach(j.remove);\n            }\n        ;\n            if (!ja[eb]) {\n                ib.node.style.minHeight = (u.getViewportDimensions().y + \"px\");\n                var jb = h.subscribe(n.SECTION_FULLY_LOADED, function(rb, sb) {\n                    if ((sb.scrubberKey === eb)) {\n                        ib.node.style.minHeight = \"\";\n                        jb.unsubscribe();\n                    }\n                ;\n                });\n                hb = ib.parentKey;\n                var kb = p.get(hb).node;\n                if (!i.hasClass(kb, \"fbTimelineSectionExpanded\")) {\n                    k.scrollTo(kb, 0);\n                    i.addClass(kb, \"fbTimelineSectionExpanded\");\n                    j.scry(kb, \".fbTimelineCapsule\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineSectionExpandPager\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineContentHeader\").forEach(j.remove);\n                    j.scry(kb, \".-cx-PRIVATE-fbTimelineOneColumnHeader__header\").forEach(function(rb) {\n                        if (!rb.getAttribute(\"data-subsection\")) {\n                            j.remove(rb);\n                        };\n                    });\n                }\n            ;\n                var lb = db.getNextSectionKey(hb);\n                if ((lb && oa[lb])) {\n                    oa[lb].setBuffer(0);\n                };\n            }\n        ;\n            for (var mb = 0; (mb < ka.length); mb++) {\n                var nb = ka[mb];\n                if (!nb) {\n                    continue;\n                };\n                if ((nb == hb)) {\n                    break;\n                };\n                p.get(nb).deactivateScrollLoad();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineSectionExpandPager\").forEach(function(rb) {\n                    var sb = m.getInstance(rb.id);\n                    (sb && sb.removeOnVisible());\n                });\n            };\n            db.adjustContentPadding();\n            ib.load(gb, true);\n            ab();\n            var ob = u.getScrollPosition().x, pb = u.getElementPosition(ib.node).y;\n            if (!fb) {\n                var qb = (ja[eb] ? n.SCROLL_TO_OFFSET : n.SUBSECTION_SCROLL_TO_OFFSET);\n                k.scrollTo(new u(ob, (pb - qb), \"document\"), true, false, false, function() {\n                    var rb = u.getElementPosition(ib.node).y;\n                    k.scrollTo(new u(ob, (rb - qb), \"document\"), false);\n                    var sb = j.scry(ib.node, \"h3.uiHeaderTitle\")[0];\n                    if (sb) {\n                        sb.tabIndex = 0;\n                        sb.focus();\n                    }\n                ;\n                });\n            }\n        ;\n        },\n        adjustContentPadding: function() {\n            var eb = ba(\"timeline_tab_content\");\n            if (!eb) {\n                return\n            };\n            if (o.isOneColumnMinimal()) {\n                return\n            };\n            var fb = (o.getCurrentKey() || r.TIMELINE_KEY);\n            if ((fb !== r.TIMELINE_KEY)) {\n                return\n            };\n            var gb = (ka.length - 1), hb = p.get(ka[gb]);\n            eb.style.paddingBottom = ((hb && hb.loaded) ? null : ((((u.getViewportDimensions().y - db.CURRENT_SECTION_OFFSET) - db.HEADER_SCROLL_CUTOFF) - db.FOOTER_HEIGHT) + \"px\"));\n        },\n        adjustContentPaddingAfterLoad: function(eb, fb) {\n            o.runOnceWhenSectionFullyLoaded(db.adjustContentPadding, eb, fb);\n        },\n        appendContentAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(j.appendContent.curry(v(eb), fb), gb, \"0\");\n        },\n        markSectionAsLoaded: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                (ba(eb) && i.removeClass(v(eb).parentNode, \"fbTimelineSectionLoading\"));\n            }, fb, gb);\n        },\n        suppressSectionsAbove: function(eb) {\n            var fb, gb;\n            for (var hb = 0; (hb < ka.length); hb++) {\n                var ib = ka[hb];\n                if (!ib) {\n                    continue;\n                };\n                fb = p.get(ib).node;\n                gb = null;\n                if ((y(eb.parentNode.children).indexOf(eb) <= y(fb.parentNode.children).indexOf(fb))) {\n                    gb = ib;\n                    break;\n                }\n            ;\n                p.get(ib).deactivateScrollLoad();\n            };\n            if (gb) {\n                db.navigateToSection(gb, true);\n            };\n        },\n        forceNoFriendActivity: function() {\n            ta = true;\n        },\n        removeDupes: function(eb) {\n            var fb = ba(eb);\n            if (!fb) {\n                return\n            };\n            var gb = j.scry(fb, \"li.fbTimelineUnit\"), hb = {\n            };\n            for (var ib = 0; (ib < gb.length); ib++) {\n                var jb = gb[ib];\n                if ((jb.id && ca(jb.id, \"tl_unit_\"))) {\n                    var kb = jb.id.substring(8, jb.id.length), lb = (((jb.getAttribute(\"data-unit\") == \"ExperienceSummaryUnit\") ? jb.getAttribute(\"data-time\") : 1));\n                    if ((hb.hasOwnProperty(kb) && (hb[kb] == lb))) {\n                        jb.id = (\"dupe_unit_\" + Math.random());\n                        jb.className = \"hidden_elem\";\n                    }\n                     else hb[kb] = lb;\n                ;\n                }\n            ;\n            };\n        },\n        removeLoadingState: function(eb) {\n            (ba(eb) && i.removeClass(v(eb), \"fbTimelineSectionLoading\"));\n        },\n        setExpandLoadDataForSection: function(eb, fb) {\n            var gb = p.get(eb);\n            (gb && gb.setExpandLoadData(fb));\n        },\n        appendSectionDataForAllSections: function(eb) {\n            la = eb;\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                };\n                var hb = p.get(gb);\n                (hb && hb.appendData(eb));\n            };\n        },\n        updatePagerAfterLoad: function(eb, fb, gb, hb, ib) {\n            var jb = m.getInstance(eb.firstChild.id);\n            if (!jb) {\n                qa[eb.firstChild.id] = h.subscribe(m.REGISTERED, function(kb, lb) {\n                    qa[eb.firstChild.id].unsubscribe();\n                    delete qa[eb.firstChild.id];\n                    if ((lb.id === eb.firstChild.id)) {\n                        db.updatePagerAfterLoad(eb, fb, gb, hb, ib);\n                    };\n                });\n                return;\n            }\n        ;\n            o.runOnceWhenSectionFullyLoaded(function() {\n                i.removeClass(eb, \"fbTimelineHiddenPager\");\n                jb.checkBuffer();\n            }, gb, hb);\n            if (ib) {\n                o.runOnceWhenSectionFullyLoaded(o.adjustScrollingPagerBuffer.curry(eb.firstChild.id, fb), gb, hb);\n            };\n        },\n        showAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                var hb = ba(eb);\n                (hb && i.show(hb));\n            }, fb, gb);\n        },\n        repositionDialog: function(eb) {\n            h.subscribe(n.SECTION_LOADED, function() {\n                eb.updatePosition();\n            });\n        },\n        rightColumnFinished: function(eb) {\n            var fb = p.get(eb);\n            fb.rightColumnFinished = true;\n        },\n        registerUnrankedGroup: function(eb) {\n            g.listen(eb, \"click\", function(event) {\n                var fb = j.find(eb, \".unranked_group_placeholder\");\n                if ((event.getTarget() !== fb)) {\n                    return event.prevent()\n                };\n                j.remove(fb);\n                i.removeClass(j.find(eb, \".unranked_group_units\"), \"hidden_elem\");\n                return true;\n            });\n        }\n    };\n    e.exports = db;\n});\n__d(\"TimelineLogging\", [\"TimelineController\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"TimelineController\"), h = b(\"reportData\"), i = false, j = 0, k = null, l = null, m = {\n        init: function(n) {\n            if (i) {\n                return\n            };\n            j = n;\n            g.register(g.LOGGING, this);\n        },\n        reset: function() {\n            i = false;\n            j = 0;\n            k = null;\n        },\n        log: function(n, o) {\n            o.profile_id = j;\n            h(n, {\n                gt: o\n            });\n        },\n        logSectionChange: function(n, o) {\n            var p = {\n                timeline_section_change: 1,\n                key: n\n            };\n            if ((k && (n == k))) {\n                p.timeline_scrubber = 1;\n                k = null;\n            }\n        ;\n            if ((l && (n == l))) {\n                p.sticky_header_nav = 1;\n                l = null;\n            }\n        ;\n            m.log(\"timeline\", p);\n        },\n        logScrubberClick: function(n) {\n            k = n;\n        },\n        logStickyHeaderNavClick: function(n) {\n            l = n;\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineSideAds\", [\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"EgoAdsObjectSet\",\"Event\",\"StickyController\",\"TimelineConstants\",\"TimelineController\",\"UIPagelet\",\"URI\",\"Vector\",\"cx\",\"csx\",\"debounce\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"EgoAdsObjectSet\"), k = b(\"Event\"), l = b(\"StickyController\"), m = b(\"TimelineConstants\"), n = b(\"TimelineController\"), o = b(\"UIPagelet\"), p = b(\"URI\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"debounce\"), u = b(\"ge\"), v = 3, w = 4, x = 75, y = \"data-height\", z = 30000, aa = 0, ba = false, ca, da, ea, fa, ga, ha = new j(), ia, ja = false, ka, la = Infinity, ma = 5, na = false, oa, pa, qa, ra, sa, ta, ua = false, va = [], wa;\n    function xa(ub, vb, wb) {\n        var xb = 0;\n        if (vb) {\n            xb += vb.getHeight();\n        };\n        if ((!cb() && !xb)) {\n            return\n        };\n        ub -= xb;\n        var yb = 0;\n        for (var zb = 0; (zb < wb); zb++) {\n            yb += lb(zb);;\n        };\n        if (vb) {\n            if ((ub < yb)) {\n                ub += vb.fold((yb - ub));\n            }\n             else if ((ub > yb)) {\n                ub -= vb.unfold((ub - yb));\n            }\n        \n        };\n        return ub;\n    };\n    function ya() {\n        var ub = da.cloneNode(true);\n        ub.id = \"\";\n        var vb = new j();\n        vb.init(i.scry(ub, \"div.ego_unit\"));\n        var wb = true;\n        vb.forEach(function(xb) {\n            if (wb) {\n                wb = false;\n            }\n             else i.remove(xb);\n        ;\n        });\n        h.addClass(ub, \"fixed_elem\");\n        return ub;\n    };\n    function za() {\n        ga = undefined;\n        if (!n.pageHasScrubber(ia)) {\n            db(ma);\n            gb();\n        }\n         else if (pa) {\n            eb(da, false);\n            var ub = qa;\n            (qa && i.remove(qa));\n            qa = ya();\n            if (ub) {\n                rb();\n            };\n            db(((n.sidebarInitialized() && ja) ? w : v));\n            gb();\n            if (!ka) {\n                var vb = n.getCurrentScrubber();\n                if (vb) {\n                    qb(vb.getRoot(), vb.getOffset());\n                };\n            }\n        ;\n            (ka && ka.start());\n        }\n         else tb.adjustAdsToFit();\n        \n    ;\n    };\n    function ab() {\n        if (qa) {\n            i.remove(qa);\n            qa = null;\n        }\n    ;\n        if (ka) {\n            ka.stop();\n            ka = null;\n        }\n    ;\n        if (cb()) {\n            h.conditionClass(da, \"fixed_elem\", !pa);\n            h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__topaligned\", !n.pageHasScrubber(ia));\n        }\n         else h.conditionClass(da, \"fixed_elem\", (!pa && n.pageHasScrubber(ia)));\n    ;\n    };\n    function bb(ub) {\n        var vb = q.getViewportDimensions().y, wb = n.getCurrentScrubber(), xb = (wb ? wb.getOffset() : m.SCRUBBER_DEFAULT_OFFSET), yb = ((vb - xb) - x);\n        if ((wb || cb())) {\n            return xa(yb, wb, ub)\n        };\n    };\n    function cb() {\n        return n.fixedAds();\n    };\n    function db(ub) {\n        fa = Math.min(ub, ha.getCount());\n        ha.forEach(function(vb, wb) {\n            eb(vb, (wb >= fa));\n        });\n        eb(da, (fa === 0));\n    };\n    function eb(ub, vb) {\n        h.conditionClass(ub, \"-cx-PRIVATE-fbTimelineStyleAds__offscreen\", vb);\n        ub.setAttribute(\"aria-hidden\", (vb ? \"true\" : \"false\"));\n    };\n    function fb(ub) {\n        var vb = i.find(ha.getUnit(ub), \"div.-cx-PUBLIC-fbAdUnit__root\"), wb = vb.getAttribute(\"data-ad\");\n        return JSON.parse(wb).adid;\n    };\n    function gb() {\n        ib();\n        hb();\n    };\n    function hb() {\n        var ub;\n        if ((ga !== undefined)) {\n            ub = ha.getHoldoutAdIDsForSpace(ga, mb);\n        }\n         else ub = ha.getHoldoutAdIDsForNumAds(fa);\n    ;\n        if (ub) {\n            ub.forEach(jb);\n        };\n    };\n    function ib() {\n        if (!ra) {\n            return\n        };\n        for (var ub = (fa - 1); (ub >= 0); --ub) {\n            if (((ka && ka.isFixed()) && ((((ub !== 0)) || ((qa && !h.shown(qa))))))) {\n                continue;\n            };\n            var vb = fb(ub);\n            if (!ra[vb]) {\n                return\n            };\n            jb(vb);\n        };\n    };\n    function jb(ub) {\n        if (!ra[ub]) {\n            return\n        };\n        var vb = i.create(\"iframe\", {\n            src: p(\"/ai.php\").addQueryData({\n                aed: ra[ub]\n            }),\n            width: 0,\n            height: 0,\n            frameborder: 0,\n            scrolling: \"no\",\n            className: \"fbEmuTracking\"\n        });\n        vb.setAttribute(\"aria-hidden\", \"true\");\n        i.appendContent(da, vb);\n        delete ra[ub];\n    };\n    function kb(ub) {\n        var vb = 0;\n        while (((ub > 0) && (vb < ma))) {\n            ub -= lb(vb);\n            if ((ub >= 0)) {\n                vb++;\n            };\n        };\n        return vb;\n    };\n    function lb(ub) {\n        var vb = ha.getUnit(ub);\n        if (!vb) {\n            return 0\n        };\n        return mb(vb);\n    };\n    function mb(ub) {\n        if (!ub.getAttribute(y)) {\n            nb(ub);\n        };\n        return parseInt(ub.getAttribute(y), 10);\n    };\n    function nb(ub) {\n        ub.setAttribute(y, ub.offsetHeight);\n    };\n    function ob() {\n        for (var ub = 0; (ub < ha.getCount()); ub++) {\n            var vb = ha.getUnit(ub);\n            if (!vb) {\n                continue;\n            };\n            nb(vb);\n        };\n    };\n    function pb() {\n        var ub = i.scry(da, \"div.ego_unit\");\n        ha.init(ub);\n        var vb = ub.length;\n        if (!vb) {\n            return\n        };\n        h.addClass(ha.getUnit(0), \"ego_unit_no_top_border\");\n        na = vb;\n        za();\n        var wb = function(xb) {\n            nb(xb);\n            na = --vb;\n            tb.adjustAdsToFit();\n            if (!na) {\n                la = Date.now();\n            };\n        };\n        ub.forEach(function(xb) {\n            function yb() {\n                wb.curry(xb).defer();\n            };\n            var zb = i.scry(xb, \"img.img\")[0];\n            if (!zb) {\n                return\n            };\n            if (zb.complete) {\n                yb();\n            }\n             else k.listen(zb, {\n                load: yb,\n                error: yb,\n                abort: yb\n            });\n        ;\n        });\n    };\n    function qb(ub, vb) {\n        ka = new l(ub, vb, function(wb) {\n            if (wb) {\n                rb();\n            }\n             else {\n                i.remove(qa);\n                gb();\n            }\n        ;\n        });\n        if (qa) {\n            ka.start();\n        };\n    };\n    function rb() {\n        i.insertAfter(da, qa);\n        sb();\n    };\n    function sb() {\n        h.conditionShow(qa, ((lb(0) <= bb(1)) && !h.hasClass(document.documentElement, \"tinyViewport\")));\n    };\n    var tb = {\n        init: function(ub, vb, wb) {\n            if (ba) {\n                return\n            };\n            ma = wb.max_ads;\n            ca = wb.refresh_delay;\n            z = wb.refresh_threshold;\n            ba = true;\n            ea = vb;\n            da = ub;\n            tb.adjustAdsType(n.shouldShowWideAds());\n            sa = g.subscribe([\"UFI/CommentAddedActive\",\"UFI/CommentDeletedActive\",\"UFI/LikeActive\",\"Curation/Action\",\"ProfileBrowser/LoadMoreContent\",\"Ads/NewContentDisplayed\",], tb.loadAdsIfEnoughTimePassed);\n            ta = g.subscribe(\"TimelineSideAds/refresh\", tb.forceReloadAds);\n            wa = t(tb.loadAdsIfEnoughTimePassed, ca, this, true);\n            if (wb.mouse_move) {\n                va.push(k.listen(window, \"mousemove\", wa));\n                va.push(k.listen(window, \"scroll\", wa));\n                va.push(k.listen(window, \"resize\", wa));\n            }\n        ;\n            n.register(n.ADS, tb);\n        },\n        setShortMode: function(ub) {\n            pa = ub;\n        },\n        start: function(ub) {\n            ra = ub;\n            oa = null;\n            pb();\n        },\n        updateCurrentKey: function(ub) {\n            if ((ub == ia)) {\n                return\n            };\n            ia = ub;\n            ab();\n        },\n        loadAds: function(ub) {\n            if ((na || oa)) {\n                return\n            };\n            la = Infinity;\n            oa = o.loadFromEndpoint(\"WebEgoPane\", da.id, {\n                pid: 33,\n                data: [ea,(\"timeline_\" + ub),(pa ? w : ma),++aa,false,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        registerScrubber: function(ub) {\n            if (pa) {\n                qb(ub.getRoot(), ub.getOffset());\n            };\n            (!oa && tb.adjustAdsToFit());\n        },\n        loadAdsIfEnoughTimePassed: function() {\n            if (((((z && (((Date.now() - la) >= z))) && !h.hasClass(document.documentElement, \"tinyViewport\")) && ((!ka || ka.isFixed()))) && ((!ra || !ra[fb(0)])))) {\n                tb.loadAds(ia);\n            };\n            tb.adjustAdsToFit();\n        },\n        forceReloadAds: function() {\n            tb.loadAds(ia);\n        },\n        adjustAdsType: function(ub) {\n            if ((ub != ja)) {\n                h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub);\n                h.conditionClass(da, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub);\n                (qa && h.conditionClass(qa, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub));\n                (qa && h.conditionClass(qa, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub));\n                ja = ub;\n                ob();\n                tb.adjustAdsToFit();\n                var vb = u(\"rightColContent\");\n                if (vb) {\n                    h.conditionClass(vb, \"fbTimelineWideRightCol\", ub);\n                };\n            }\n        ;\n        },\n        adjustAdsToFit: function() {\n            if ((!da || ua)) {\n                return\n            };\n            ua = true;\n            var ub = (ja ? w : v);\n            if (pa) {\n                if ((ka && qa)) {\n                    ka.handleScroll();\n                    if (ka.isFixed()) {\n                        h.conditionShow(qa, ((lb(0) <= bb(1)) && !h.hasClass(document.documentElement, \"tinyViewport\")));\n                    }\n                     else db(ub);\n                ;\n                    gb();\n                }\n            ;\n            }\n             else {\n                var vb = bb(ub);\n                if ((typeof vb !== \"undefined\")) {\n                    ga = vb;\n                    db(kb(vb));\n                    if (!na) {\n                        gb();\n                    };\n                }\n            ;\n            }\n        ;\n            ua = false;\n        },\n        reset: function() {\n            (ka && ka.stop());\n            (oa && oa.cancel());\n            ha = new j();\n            ja = false;\n            da = null;\n            ka = null;\n            oa = null;\n            aa = 0;\n            na = null;\n            pa = null;\n            qa = null;\n            ia = null;\n            la = Infinity;\n            ba = false;\n            (sa && g.unsubscribe(sa));\n            sa = null;\n            (ta && g.unsubscribe(ta));\n            ta = null;\n            va.forEach(function(ub) {\n                ub.remove();\n            });\n            va = [];\n            (wa && wa.reset());\n        }\n    };\n    e.exports = (a.TimelineSideAds || tb);\n});\n__d(\"TimelineStickyHeader\", [\"Animation\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Style\",\"TimelineController\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"TimelineController\"), n = b(\"TimelineURI\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"$\"), r = b(\"ge\"), s = b(\"queryThenMutateDOM\"), t = 200, u = false, v = false, w, x, y, z, aa, ba, ca = {\n    }, da = {\n        VISIBLE: \"TimelineStickyHeader/visible\",\n        ADJUST_WIDTH: \"TimelineStickyHeader/adjustWidth\",\n        init: function(ea) {\n            if (u) {\n                return\n            };\n            u = true;\n            w = ea;\n            x = k.find(ea, \"div.name\");\n            y = k.find(ea, \"div.actions\");\n            v = j.hasClass(ea, \"fbTimelineStickyHeaderVisible\");\n            var fa = q(\"blueBar\"), ga, ha = false;\n            s(function() {\n                if (((fa.offsetTop && !r(\"page_admin_panel\")) && (m.getCurrentKey() !== n.TIMELINE_KEY))) {\n                    ga = o.getElementDimensions(fa).y;\n                    ha = true;\n                }\n            ;\n            }, function() {\n                if (ha) {\n                    i.loadModules([\"StickyController\",], function(ia) {\n                        new ia(ea, ga).start();\n                    });\n                }\n                 else j.addClass(ea, \"fixed_elem\");\n            ;\n                s(function() {\n                    aa = ea.offsetTop;\n                    ba = ea.scrollHeight;\n                }, function() {\n                    z = p.addTop(function() {\n                        return (v ? (aa + ba) : 0);\n                    });\n                }, \"TimelineStickyHeader/init\");\n                m.register(m.STICKY_HEADER, da);\n            }, \"TimelineStickyHeader/init\");\n        },\n        reset: function() {\n            u = false;\n            v = false;\n            w = null;\n            x = null;\n            y = null;\n            ca = {\n            };\n            z.remove();\n            z = null;\n        },\n        toggle: function(ea) {\n            if ((ea !== v)) {\n                var fa = (ea ? (aa - ba) : aa), ga = (ea ? aa : (aa - ba));\n                l.set(w, \"top\", (fa + \"px\"));\n                j.addClass(w, \"fbTimelineStickyHeaderAnimating\");\n                var ha = k.getID(w);\n                (ca[ha] && ca[ha].stop());\n                ca[ha] = new g(w).from(\"top\", fa).to(\"top\", ga).duration(t).ondone(function() {\n                    ca[ha] = null;\n                    j.conditionClass(w, \"fbTimelineStickyHeaderHidden\", !ea);\n                    w.setAttribute(\"aria-hidden\", (ea ? \"false\" : \"true\"));\n                    j.removeClass(w, \"fbTimelineStickyHeaderAnimating\");\n                    l.set(w, \"top\", \"\");\n                    h.inform(da.VISIBLE, ea);\n                }).go();\n                v = ea;\n            }\n        ;\n        },\n        adjustWidth: function() {\n            h.inform(da.ADJUST_WIDTH, x, h.BEHAVIOR_STATE);\n        },\n        getRoot: function() {\n            return w;\n        },\n        setActions: function(ea) {\n            if ((u && ea)) {\n                k.setContent(y, ea);\n                y = ea;\n            }\n        ;\n        }\n    };\n    e.exports = (a.TimelineStickyHeader || da);\n});\n__d(\"ButtonGroup\", [\"function-extensions\",\"copyProperties\",\"createArrayFrom\",\"CSS\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = \"firstItem\", m = \"lastItem\";\n    function n(s, t) {\n        var u = k.byClass(s, t);\n        if (!u) {\n            throw new Error(\"invalid use case\")\n        };\n        return u;\n    };\n    function o(s) {\n        return (i.shown(s) && h(s.childNodes).some(i.shown));\n    };\n    function p(s) {\n        var t, u, v;\n        h(s.childNodes).forEach(function(w) {\n            v = o(w);\n            i.removeClass(w, l);\n            i.removeClass(w, m);\n            i.conditionShow(w, v);\n            if (v) {\n                t = (t || w);\n                u = w;\n            }\n        ;\n        });\n        (t && i.addClass(t, l));\n        (u && i.addClass(u, m));\n        i.conditionShow(s, t);\n    };\n    function q(s, t) {\n        var u = n(t, \"uiButtonGroupItem\");\n        s(u);\n        p(u.parentNode);\n    };\n    function r(s) {\n        this._root = n(s, \"uiButtonGroup\");\n        j.set(this._root, \"ButtonGroup\", this);\n        p(this._root);\n    };\n    r.getInstance = function(s) {\n        var t = n(s, \"uiButtonGroup\"), u = j.get(t, \"ButtonGroup\");\n        return (u || new r(t));\n    };\n    g(r.prototype, {\n        hideItem: q.curry(i.hide),\n        showItem: q.curry(i.show),\n        toggleItem: q.curry(i.toggle)\n    });\n    e.exports = r;\n});\n__d(\"TimelineStickyHeaderNav\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ButtonGroup\",\"CSS\",\"DOM\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"SubscriptionsHandler\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"URI\",\"UserAgent\",\"Vector\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ButtonGroup\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"SelectorDeprecated\"), n = b(\"Style\"), o = b(\"SubscriptionsHandler\"), p = b(\"TimelineConstants\"), q = b(\"TimelineController\"), r = b(\"TimelineLegacySections\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"ge\"), w = b(\"tx\"), x = false, y, z, aa, ba, ca, da, ea, fa, ga, ha, ia, ja = {\n    }, ka = {\n    }, la = [], ma = false, na = [], oa = [], pa, qa = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function ra() {\n        var fb = m.getSelectorMenu(da);\n        pa.addSubscriptions(g.listen(fb, \"click\", sa), h.subscribe(p.SECTION_LOADED, wa));\n    };\n    function sa(event) {\n        var fb = l.byTag(event.getTarget(), \"a\");\n        if (fb) {\n            var gb = fb.getAttribute(\"data-key\");\n            q.stickyHeaderNavWasClicked(gb);\n            q.navigateToSection(gb);\n            event.prevent();\n        }\n    ;\n    };\n    function ta(fb, gb) {\n        var hb = m.getValue(gb);\n        if ((hb === \"allStories\")) {\n            r.get(fb).expandSubSections();\n        };\n        if ((hb !== \"activityLog\")) {\n            ua(gb);\n        };\n    };\n    function ua(fb) {\n        db(fb, \"highlights\");\n        db(fb, \"allStories\");\n        var gb = k.find(fb, \"li.separator\");\n        j.conditionShow(gb, gb.previousSibling);\n    };\n    function va(fb) {\n        if ((ga[fb] && !z.custom_subsection_menu)) {\n            ab(fb);\n        }\n         else xa();\n    ;\n        q.adjustStickyHeaderWidth();\n    };\n    function wa(fb, gb) {\n        var hb = gb.key;\n        if (ha[hb]) {\n            bb(hb);\n            va(hb);\n        }\n    ;\n    };\n    function xa() {\n        ba.hideItem(ea);\n    };\n    function ya(fb) {\n        var gb = fb.split(\"_\");\n        return qa[(gb.pop() - 1)];\n    };\n    function za(fb) {\n        var gb = fa[fb], hb = ga[fb];\n        if ((!gb && hb)) {\n            gb = fa[fb] = ea.cloneNode(true);\n            var ib = k.scry(gb, \"li.activityLog a\")[0];\n            if (ib) {\n                ib.href = s(ib.href).addQueryData({\n                    key: fb\n                });\n            };\n            var jb = q.getCurrentScrubber();\n            if (hb.length) {\n                j.show(k.find(gb, \"li.separator\"));\n            };\n            for (var kb = 0; (kb < hb.length); kb++) {\n                var lb = hb[kb].scrubberKey, mb = (jb ? jb.getLabelForSubnav(hb[kb].parentKey, lb) : mb = ya(lb));\n                if (mb) {\n                    cb(gb, {\n                        key: lb,\n                        label: mb\n                    });\n                };\n            };\n            pa.addSubscriptions(m.listen(gb, \"change\", ta.curry(fb, gb)), g.listen(gb, \"click\", sa));\n        }\n    ;\n        return gb;\n    };\n    function ab(fb) {\n        var gb = za(fb);\n        k.insertAfter(ea, gb);\n        j.hide(ea);\n        for (var hb in fa) {\n            var ib = fa[hb];\n            j.conditionShow(ib, (ib === gb));\n        };\n        ba.showItem(ea);\n    };\n    function bb(fb) {\n        ga[fb] = r.get(fb).subSections;\n    };\n    function cb(fb, gb) {\n        var hb = k.create(\"a\", {\n            href: \"#\",\n            rel: \"ignore\",\n            className: \"itemAnchor\",\n            tabIndex: 0\n        }, k.create(\"span\", {\n            className: \"itemLabel fsm\"\n        }, gb.label));\n        hb.setAttribute(\"data-key\", gb.key);\n        hb.setAttribute(\"aria-checked\", false);\n        var ib = k.create(\"li\", {\n            className: \"uiMenuItem uiMenuItemRadio uiSelectorOption\"\n        }, hb);\n        ib.setAttribute(\"data-label\", gb.label);\n        var jb = k.find(fb, \"ul.uiMenuInner\"), kb = k.create(\"option\", {\n            value: gb.key\n        }, gb.label), lb = k.find(fb, \"select\");\n        if ((gb.key === \"recent\")) {\n            k.prependContent(jb, ib);\n            k.insertAfter(lb.options[0], kb);\n        }\n         else {\n            k.appendContent(jb, ib);\n            k.appendContent(lb, kb);\n        }\n    ;\n    };\n    function db(fb, gb) {\n        var hb = k.scry(fb, \"li.uiMenuItem\");\n        if (!hb) {\n            return\n        };\n        for (var ib = 0; (ib < hb.length); ib++) {\n            var jb = hb[ib];\n            if ((j.hasClass(jb, gb) || (jb.firstChild.getAttribute(\"data-key\") == gb))) {\n                k.remove(jb);\n                break;\n            }\n        ;\n        };\n        var kb = k.find(fb, \"select\"), lb = k.scry(kb, \"option\");\n        for (ib = 0; (ib < lb.length); ib++) {\n            if ((lb[ib].value === gb)) {\n                k.remove(lb[ib]);\n                return;\n            }\n        ;\n        };\n    };\n    var eb = {\n        init: function(fb, gb) {\n            if (x) {\n                return\n            };\n            x = true;\n            y = fb;\n            z = (gb || {\n            });\n            ca = k.find(y, \"div.pageMenu\");\n            da = k.find(y, \"div.sectionMenu\");\n            ea = k.find(y, \"div.subsectionMenu\");\n            ia = k.find(ca, \"li.uiMenuSeparator\");\n            ba = i.getInstance(ca);\n            pa = new o();\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            eb.adjustMenuHeights();\n            ra();\n            q.register(q.STICKY_HEADER_NAV, eb);\n            oa.forEach(function(hb) {\n                hb();\n            });\n        },\n        reset: function() {\n            x = false;\n            z = {\n            };\n            la = [];\n            ja = {\n            };\n            ka = {\n            };\n            ma = false;\n            na = [];\n            y = null;\n            ca = null;\n            da = null;\n            ea = null;\n            ia = null;\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            pa.release();\n        },\n        addTimePeriod: function(fb) {\n            var gb = q.getCurrentScrubber();\n            if (!gb) {\n                return\n            };\n            var hb = gb.getLabelForNav(fb);\n            if (!hb) {\n                return\n            };\n            cb(da, {\n                key: fb,\n                label: hb\n            });\n            var ib = k.find(da, \"ul.uiMenuInner\");\n            if (((fb === \"recent\") || (ib.children.length < 2))) {\n                m.setSelected(da, fb, true);\n            };\n        },\n        updateSection: function(fb, gb) {\n            if (gb) {\n                var hb = za(fb);\n                if (hb) {\n                    m.setSelected(hb, gb);\n                    ua(hb);\n                }\n                 else aa = fb;\n            ;\n            }\n             else {\n                ha[fb] = true;\n                bb(fb);\n            }\n        ;\n            m.setSelected(da, fb, true);\n            va(fb);\n        },\n        adjustMenuHeights: function() {\n            if ((t.ie() <= 7)) {\n                return\n            };\n            [ca,da,].forEach(function(fb) {\n                var gb = \"\";\n                if (!j.hasClass(document.documentElement, \"tinyViewport\")) {\n                    gb = ((u.getViewportDimensions().y - u.getElementDimensions(v(\"blueBar\")).y) - 80);\n                    gb += \"px\";\n                }\n            ;\n                n.set(k.find(fb, \"ul.uiMenuInner\"), \"maxHeight\", gb);\n            });\n        },\n        initPageMenu: function(fb, gb) {\n            if (!x) {\n                oa.push(eb.initPageMenu.curry(fb, gb));\n                return;\n            }\n        ;\n            function hb(ib, jb) {\n                ib.forEach(function(kb) {\n                    var lb = ka[kb] = k.create(\"li\");\n                    j.hide(lb);\n                    (jb ? k.insertBefore(ia, lb) : k.appendContent(k.find(ca, \"ul.uiMenuInner\"), lb));\n                });\n            };\n            hb(fb, true);\n            hb(gb, false);\n            ja.info = k.scry(ca, \"li\")[0];\n            la = gb;\n            ma = true;\n            if (na.length) {\n                na.forEach(function(ib) {\n                    eb.registerPageMenuItem(ib.key, ib.item);\n                });\n            };\n        },\n        registerPageMenuItem: function(fb, gb) {\n            if (!ma) {\n                na.push({\n                    key: fb,\n                    item: gb\n                });\n                return;\n            }\n        ;\n            if (ka[fb]) {\n                k.replace(ka[fb], gb);\n                ja[fb] = gb;\n                delete ka[fb];\n                if ((la.indexOf(fb) >= 0)) {\n                    j.show(ia);\n                };\n            }\n        ;\n        },\n        removeTimePeriod: function(fb) {\n            db(da, fb);\n        }\n    };\n    e.exports = eb;\n});\n__d(\"TimelineSpinelessComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineComposer\",\"TimelineComposerUtilities\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineComposer\"), n = b(\"TimelineComposerUtilities\"), o = b(\"csx\"), p = b(\"cx\"), q;\n    function r(w) {\n        if ((w.isScheduledPost || w.isOGPost)) {\n            return\n        };\n        if (!w.streamStory) {\n            window.location.reload();\n            return;\n        }\n    ;\n        if (w.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                x.publish(w);\n            });\n            return;\n        }\n    ;\n        m.renderCapsuleBasedStory(q, w.streamStory);\n    };\n    function s() {\n        return j.find(k.byClass(q, \"fbTimelineComposerCapsule\"), \"div.-cx-PRIVATE-fbTimelineComposerAttachment__mleflyoutpointer\");\n    };\n    function t(w) {\n        var x = u();\n        i.show(x);\n        var y = w.subscribe(\"hide\", function() {\n            i.hide(x);\n            w.unsubscribe(y);\n        });\n    };\n    function u() {\n        var w = k.byClass(q, \"fbTimelineComposerCapsule\"), x = j.scry(w, \"div.composerVeil\");\n        if ((x.length !== 1)) {\n            x = j.appendContent(w, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        };\n        return x[0];\n    };\n    var v = {\n        init: function(w) {\n            q = w;\n            var x = g.subscribe(\"composer/publish\", function(event, y) {\n                if ((y.composer_id === q.id)) {\n                    r(y);\n                };\n            });\n            l.onLeave(x.unsubscribe.bind(x));\n            if (i.hasClass(q, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                n.hidePlaceIfAttachmentsTooTall(q);\n            }\n             else n.hidePlaceIfAttachmentsTooTallOld(q);\n        ;\n        },\n        showMLEFlyout: function(w) {\n            w.setContext(s()).show();\n            t(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"TimelineScrubber\", [\"Event\",\"CSS\",\"DOM\",\"Focus\",\"Keys\",\"Parent\",\"TimelineController\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Focus\"), k = b(\"Keys\"), l = b(\"Parent\"), m = b(\"TimelineController\"), n = b(\"Vector\"), o = b(\"copyProperties\");\n    function p(q) {\n        this._root = q;\n        this._navKeys = {\n        };\n        this._subNavKeys = {\n        };\n        this._rollups = {\n        };\n        this._rolledup = {\n        };\n        var r = q.childNodes;\n        this._currentNav = r[0];\n        for (var s = 0; (s < r.length); s++) {\n            var t = r[s].getAttribute(\"data-key\");\n            this._navKeys[t] = r[s];\n            var u = i.scry(r[s], \"ul\");\n            this._subNavKeys[t] = {\n            };\n            if (u.length) {\n                var v = u[0].childNodes;\n                for (var w = 0; (w < v.length); w++) {\n                    this._subNavKeys[t][v[w].getAttribute(\"data-key\")] = v[w];;\n                };\n            }\n        ;\n            var x = r[s].getAttribute(\"data-rollup\");\n            if (x) {\n                this._rollups[x] = (this._rollups[x] || []);\n                this._rollups[x].push(r[s]);\n            }\n        ;\n        };\n        this._clickListener = g.listen(this._root, \"click\", this._handleScrub.bind(this));\n        this._focusHandler = g.listen(this._root, \"keydown\", this._moveFocus.bind(this));\n        this._tabbableElement = i.scry(this._root, \"a\")[0];\n        h.show(this._root);\n        var y = (n.getViewportDimensions().y - this.SCRUBBER_NO_ADS_VERTICAL_BUFFER), z = this.getHeight();\n        if ((z > y)) {\n            this.fold((z - y));\n        };\n        m.register(m.SCRUBBER, this);\n        m.scrubberHasLoaded(this);\n    };\n    o(p.prototype, {\n        KEY_HEIGHT: 23,\n        SUBKEY_HEIGHT: 16,\n        OFFSET: 38,\n        SCRUBBER_NO_ADS_VERTICAL_BUFFER: 125,\n        reset: function() {\n            this._root = null;\n            this._navKeys = {\n            };\n            this._subNavKeys = {\n            };\n            this._rollups = {\n            };\n            this._rolledup = {\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNav: function(q) {\n            return this._navKeys[q];\n        },\n        getSubnav: function(q, r) {\n            return this._subNavKeys[q][r];\n        },\n        getHeight: function() {\n            return this._root.offsetHeight;\n        },\n        getLabelForNav: function(q) {\n            var r = this.getNav(q);\n            return (r && i.getText(i.scry(r, \"a\")[0]));\n        },\n        getLabelForSubnav: function(q, r) {\n            var s = this.getSubnav(q, r);\n            return (s && i.getText(i.scry(s, \"a\")[0]));\n        },\n        fold: function(q) {\n            return this._adjustFolding(q, true);\n        },\n        unfold: function(q) {\n            return this._adjustFolding(q, false);\n        },\n        getOffset: function() {\n            return ((this.OFFSET + ((h.hasClass(document.body, \"hasVoiceBar\") ? 26 : 0))) + ((h.hasClass(\"rightColContent\", \"pagesTimelineRightColumn\") ? 48 : 0)));\n        },\n        updateSection: function(q, r) {\n            if (!this._navKeys[q]) {\n                return\n            };\n            var s = this._navKeys[q].getAttribute(\"data-rollup\");\n            if ((this._currentRollup && (this._currentRollup != s))) {\n                h.removeClass(this._currentRollup, \"selected\");\n                h.removeClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                delete this._currentRollup;\n            }\n        ;\n            if ((s && this._rolledup[s])) {\n                var t = this._rolledup[s];\n                if (t.getAttribute(\"data-rollup\")) {\n                    this._currentRollup = t;\n                    h.addClass(this._currentRollup, \"selected\");\n                    h.addClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                }\n            ;\n            }\n        ;\n            (this._currentNav && h.removeClass(this._currentNav, \"selected\"));\n            (this._currentSubNav && h.removeClass(this._currentSubNav, \"selected\"));\n            this._currentNav = null;\n            this._currentSubNav = null;\n            if (this._navKeys[q]) {\n                this._currentNav = this._navKeys[q];\n                h.addClass(this._currentNav, \"selected\");\n                if ((this.decadesAreSelectable && this._navKeys[r])) {\n                    this._currentSubNav = this._navKeys[r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                 else if ((r && this._subNavKeys[q][r])) {\n                    this._currentSubNav = this._subNavKeys[q][r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                \n            ;\n            }\n        ;\n        },\n        _getRollupSize: function(q) {\n            var r = this._currentNav, s = (r && r.getAttribute(\"data-rollup\")), t = (this.KEY_HEIGHT * ((this._rollups[q].length - 1)));\n            if ((q == s)) {\n                t += (this.SUBKEY_HEIGHT * i.scry(r, \"li\").length);\n                t -= (this.SUBKEY_HEIGHT * ((this._rollups[q].length - 1)));\n            }\n        ;\n            return t;\n        },\n        _adjustFolding: function(q, r) {\n            var s = q, t = Object.keys(this._rollups);\n            while (((q > 0) && t.length)) {\n                var u = t[(r ? \"pop\" : \"shift\")]();\n                if ((!r == !this._rolledup[u])) {\n                    continue;\n                };\n                var v = this._getRollupSize(u);\n                if ((v <= 0)) {\n                    continue;\n                };\n                if ((!r && (v > q))) {\n                    break;\n                };\n                this[(r ? \"_collapseRollup\" : \"_expandRollup\")](u);\n                q -= v;\n            };\n            return (s - q);\n        },\n        _collapseRollup: function(q) {\n            var r = this._rollups[q];\n            if (((!r || (r.length < 2)) || this._rolledup[q])) {\n                return\n            };\n            var s = r[0].previousSibling, t = r[0], u = i.create(\"a\", {\n                href: t.firstChild.href,\n                rel: \"ignore\",\n                tabindex: \"-1\"\n            }, [q,]), v = i.create(\"ul\", {\n                className: \"clearfix\"\n            });\n            for (var w = 0; (w < r.length); w++) {\n                v.appendChild(r[w]);;\n            };\n            var x = i.create(\"li\", null, [u,v,]);\n            if (this.decadesAreSelectable) {\n                var y = r[(r.length - 1)], z = (t.getAttribute(\"data-key\") + y.getAttribute(\"data-key\"));\n                x.setAttribute(\"data-start\", y.getAttribute(\"data-start\"));\n                x.setAttribute(\"data-end\", t.getAttribute(\"data-end\"));\n                x.setAttribute(\"data-key\", z);\n                this._navKeys[z] = x;\n            }\n             else x.setAttribute(\"data-key\", t.getAttribute(\"data-key\"));\n        ;\n            x.setAttribute(\"data-rollup\", q);\n            if (s) {\n                i.insertAfter(s, x);\n            }\n             else i.prependContent(this._root, x);\n        ;\n            this._rolledup[q] = x;\n            this._checkSelection();\n            this._ensureFocusableElementIsVisible();\n        },\n        _expandRollup: function(q) {\n            if (!this._rolledup[q]) {\n                return\n            };\n            var r = this._rolledup[q], s = i.scry(r, \"ul\")[0], t = document.createDocumentFragment();\n            while (s.childNodes.length) {\n                t.appendChild(s.firstChild);;\n            };\n            i.replace(r, t);\n            this._rolledup[q] = false;\n            this._checkSelection();\n        },\n        _checkSelection: function() {\n            if (this._currentNav) {\n                var q = (this._currentSubNav && this._currentSubNav.getAttribute(\"data-key\"));\n                this.updateSection(this._currentNav.getAttribute(\"data-key\"), q);\n            }\n        ;\n        },\n        _handleScrub: function(event) {\n            var q = event.getModifiers();\n            if (((event.isMiddleClick() || q.access) || q.meta)) {\n                return true\n            };\n            var r = l.byTag(event.getTarget(), \"a\"), s = (r && l.byAttribute(r, \"data-key\"));\n            if (s) {\n                m.scrubberWasClicked(s.getAttribute(\"data-key\"));\n                m.navigateToSection(s.getAttribute(\"data-key\"));\n                return event.prevent();\n            }\n        ;\n        },\n        _ensureFocusableElementIsVisible: function() {\n            while (!((this._tabbableElement.offsetHeight || this._tabbableElement.offsetWidth))) {\n                this._tabbableElement.tabIndex = -1;\n                var q = l.byTag(l.byTag(this._tabbableElement, \"li\"), \"li\");\n                this._tabbableElement = i.scry(q, \"a\")[0];\n                this._tabbableElement.tabIndex = 0;\n            };\n        },\n        _moveFocus: function(event) {\n            if (event.getModifiers().any) {\n                return\n            };\n            var q = g.getKeyCode(event);\n            if (((q === k.UP) || (q === k.DOWN))) {\n                var r = i.scry(this._root, \"a\").filter(function(u) {\n                    return (u.offsetHeight || u.offsetWidth);\n                }), s = r.indexOf(this._tabbableElement);\n                if ((s != -1)) {\n                    var t = r[(s + (((q === k.UP) ? -1 : 1)))];\n                    if (t) {\n                        t.tabindex = 0;\n                        j.set(t);\n                        this._tabbableElement.tabindex = -1;\n                        this._tabbableElement = t;\n                        event.prevent();\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineMainScrubber\", [\"Arbiter\",\"Class\",\"CSS\",\"DOMQuery\",\"TimelineConstants\",\"TimelineController\",\"TimelineScrubber\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"TimelineConstants\"), l = b(\"TimelineController\"), m = b(\"TimelineScrubber\"), n = b(\"copyProperties\");\n    function o(p) {\n        this.parent.construct(this, p);\n        this._subscribe = g.subscribe(k.SECTION_LOADED, function(q, r) {\n            var s = this._navKeys[r.key], t = (s && j.scry(s, \"ul\")[0]);\n            if (t) {\n                i.addClass(t, \"loaded\");\n                l.scrubberHasChangedState();\n                if (r.hideSubSections) {\n                    i.hide(t);\n                };\n            }\n        ;\n        }.bind(this));\n    };\n    h.extend(o, m);\n    n(o.prototype, {\n        reset: function() {\n            this.parent.reset();\n            (this._subscribe && this._subscribe.unsubscribe());\n        }\n    });\n    e.exports = o;\n});\n__d(\"legacy:TimelineMainScrubber\", [\"TimelineMainScrubber\",], function(a, b, c, d) {\n    a.TimelineMainScrubber = b(\"TimelineMainScrubber\");\n}, 3);\n__d(\"legacy:TimelineCover\", [\"TimelineCover\",], function(a, b, c, d) {\n    a.TimelineCover = b(\"TimelineCover\");\n}, 3);\n__d(\"legacy:ui-scrolling-pager-js\", [\"ScrollingPager\",], function(a, b, c, d) {\n    a.ScrollingPager = b(\"ScrollingPager\");\n}, 3);\n__d(\"legacy:LegacyContextualDialog\", [\"LegacyContextualDialog\",], function(a, b, c, d) {\n    a.LegacyContextualDialog = b(\"LegacyContextualDialog\");\n}, 3);\n__d(\"ButtonGroupMonitor\", [\"ContextualDialog\",\"ContextualLayer\",\"CSS\",\"Layer\",\"Parent\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualDialog\"), h = b(\"ContextualLayer\"), i = b(\"CSS\"), j = b(\"Layer\"), k = b(\"Parent\"), l = b(\"SelectorDeprecated\");\n    function m(n) {\n        var o = (k.byClass(n, \"bg_stat_elem\") || k.byClass(n, \"uiButtonGroup\"));\n        (o && i.toggleClass(o, \"uiButtonGroupActive\"));\n    };\n    j.subscribe([\"hide\",\"show\",], function(n, o) {\n        if (((o instanceof h) || (o instanceof g))) {\n            m(o.getCausalElement());\n        };\n    });\n    l.subscribe([\"close\",\"open\",], function(n, o) {\n        m(o.selector);\n    });\n});\n__d(\"SubMenu\", [\"Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k() {\n    \n    };\n    i(k.prototype, {\n        _subMenu: null,\n        _mainMenu: null,\n        _forward: null,\n        _backward: null,\n        init: function(l, m, n, o) {\n            this._subMenu = l;\n            this._mainMenu = m;\n            this._forward = n;\n            this._backward = o;\n            h.subscribe(\"SubMenu/Reset\", this._goToMainMenu.bind(this));\n            g.listen(n, \"click\", this._goToSubMenu.bind(this));\n            g.listen(o, \"click\", this._goToMainMenu.bind(this));\n        },\n        initAsyncChildMenu: function(l) {\n            g.listen(this._forward, \"click\", function() {\n                this._goToSubMenu();\n                l.load();\n            }.bind(this));\n        },\n        _goToMainMenu: function() {\n            j.hide(this._subMenu);\n            j.show(this._mainMenu);\n        },\n        _goToSubMenu: function() {\n            j.hide(this._mainMenu);\n            j.show(this._subMenu);\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:ui-submenu\", [\"SubMenu\",], function(a, b, c, d) {\n    a.SubMenu = b(\"SubMenu\");\n}, 3);\n__d(\"AsyncMenu\", [\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k, l) {\n        this._uri = k;\n        this._elem = l;\n    };\n    h(j.prototype, {\n        _uri: null,\n        _elem: null,\n        load: function() {\n            this.load = i;\n            g.bootstrap(this._uri, this._elem);\n        }\n    });\n    e.exports = j;\n});");
// 9860
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s9ce0b595ad980639d9ed70acc708466540e41d57");
// 9861
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"jsIYP\",]);\n}\n;\n;\n__d(\"AdsCurrency\", [\"AdsCurrencyConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrencyConfig\").currencies;\n    function h(m) {\n        if (g[m]) {\n            return g[m][0];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function i(m) {\n        if (g[m]) {\n            return g[m][1];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function j(m) {\n        if (g[m]) {\n            return ((1 * g[m][2]));\n        }\n    ;\n    ;\n        return 1;\n    };\n;\n    var k = [];\n    {\n        var fin191keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin191i = (0);\n        var l;\n        for (; (fin191i < fin191keys.length); (fin191i++)) {\n            ((l) = (fin191keys[fin191i]));\n            {\n                if (g.hasOwnProperty(l)) {\n                    k.push(l);\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    f.getFormat = h;\n    f.getSymbol = i;\n    f.getOffset = j;\n    f.currencyMapKeys = k;\n});\n__d(\"ads-lib-formatters\", [\"AdsCurrency\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrency\"), h = \"USD\";\n    function i(t, u, v) {\n        t = ((t || \"\"));\n        v = ((v || \"\"));\n        u = ((((typeof u === \"undefined\")) ? t.length : u));\n        return ((((t.length > u)) ? ((t.substr(0, ((u - v.length))) + v)) : t));\n    };\n;\n    function j(t, u) {\n        if (((((u === undefined)) || ((u === null))))) {\n            u = \"\";\n        }\n    ;\n    ;\n        return function(v) {\n            return ((!v ? u : i(v, t, \"...\")));\n        };\n    };\n;\n    function k(t, u, v, w) {\n        if (((t === \"N/A\"))) {\n            return t;\n        }\n    ;\n    ;\n        t = ((t || 0));\n        v = ((v || \"\"));\n        w = ((w || \".\"));\n        t = ((((u !== null)) ? l(t, u) : ((t + \"\"))));\n        var x = t.split(\".\"), y = x[0], z = x[1], aa = \"\", ba = /(\\d)(\\d\\d\\d)($|\\D)/, ca = ((((\"$1\" + v)) + \"$2$3\"));\n        while ((((aa = y.replace(ba, ca)) != y))) {\n            y = aa;\n        ;\n        };\n    ;\n        var da = y;\n        if (z) {\n            da += ((w + z));\n        }\n    ;\n    ;\n        return da;\n    };\n;\n    function l(t, u) {\n        var v = Math.pow(10, u);\n        t = ((((Math.round(((t * v))) / v)) + \"\"));\n        if (!u) {\n            return t;\n        }\n    ;\n    ;\n        var w = t.indexOf(\".\"), x = 0;\n        if (((w == -1))) {\n            t += \".\";\n            x = u;\n        }\n         else x = ((u - ((((t.length - w)) - 1))));\n    ;\n    ;\n        for (var y = 0, z = x; ((y < z)); y++) {\n            t += \"0\";\n        ;\n        };\n    ;\n        return t;\n    };\n;\n    function m(t) {\n        return function(u) {\n            return k(u, ((t || 0)), \",\", \".\");\n        };\n    };\n;\n    function n(t, u) {\n        var v = ((((u === false)) ? 1 : 100));\n        return function(w) {\n            return ((k(((w * v)), ((t || 0)), \",\", \".\") + \"%\"));\n        };\n    };\n;\n    var o = {\n    };\n    function p(t, u, v) {\n        if (((t === undefined))) {\n            t = 2;\n        }\n    ;\n    ;\n        if (((v === undefined))) {\n            v = false;\n        }\n    ;\n    ;\n        u = ((u || h));\n        var w = ((((((((u + \"-\")) + t)) + \"-\")) + v));\n        if (!o[w]) {\n            var x = ((g.getFormat(u) || g.getFormat(h))), y = ((g.getSymbol(u) || g.getSymbol(h))), z = ((g.getOffset(u) || g.getOffset(h)));\n            x = x.replace(\"{symbol}\", y);\n            o[w] = function(aa) {\n                if (v) {\n                    aa = ((aa / z));\n                }\n            ;\n            ;\n                if (!((aa + \"\")).match(/^\\-?[\\d\\.,]*$/)) {\n                    return \"N/A\";\n                }\n            ;\n            ;\n                var ba = k(aa, t, \",\", \".\");\n                return x.replace(\"{amount}\", ba);\n            };\n        }\n    ;\n    ;\n        return o[w];\n    };\n;\n    function q(t) {\n        t = ((t + \"\")).trim().replace(/^[^\\d]*\\-/, \"\\u0002\");\n        if (!(((/^\\u0002?(\\d+,\\d*){2,}$/.test(t)) || (/^\\u0002?(\\d+\\.\\d*){2,}$/.test(t))))) {\n            t = t.replace(/[\\.,](\\d*\\D*)$/, \"\\u0001$1\");\n        }\n    ;\n    ;\n        t = t.replace(/[^0-9\\u0001\\u0002]/g, \"\").replace(\"\\u0001\", \".\").replace(\"\\u0002\", \"-\");\n        return ((+t || 0));\n    };\n;\n    function r() {\n        return function(t) {\n            return ((k(t, 0, \",\", \".\") + \"%\"));\n        };\n    };\n;\n    function s(t) {\n        var u = t.currency(), v = ((((t.offset() == 100)) ? 2 : 0));\n        return p(v, u);\n    };\n;\n    f.createTextTruncator = j;\n    f.chopString = i;\n    f.parseNumber = q;\n    f.formatNumber = k;\n    f.createNumberFormatter = m;\n    f.createPercentFormatter = n;\n    f.createMoneyFormatter = p;\n    f.createMoneyFormatterForAccount = s;\n    f.createInflationFormatter = r;\n});\n__d(\"ComposerXDatepickerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbTimelineBackdatedComposer__datepickericonselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n;\n    e.exports = i;\n});\n__d(\"legacy:dom-html\", [\"HTML\",], function(a, b, c, d) {\n    a.HTML = b(\"HTML\");\n}, 3);\n__d(\"ScrollingPager\", [\"Arbiter\",\"copyProperties\",\"CSS\",\"OnVisible\",\"UIPagelet\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"OnVisible\"), k = b(\"UIPagelet\"), l = b(\"$\"), m = b(\"ge\"), n = {\n    };\n    function o(p, q, r, s) {\n        this.scroll_loader_id = p;\n        this.pagelet_src = q;\n        this.data = r;\n        this.options = ((s || {\n        }));\n        if (this.options.target_id) {\n            this.target_id = this.options.target_id;\n            this.options.append = true;\n        }\n         else this.target_id = p;\n    ;\n    ;\n        this.scroll_area_id = this.options.scroll_area_id;\n        this.handler = null;\n    };\n;\n    h(o, {\n        REGISTERED: \"ScrollingPager/registered\",\n        getInstance: function(p) {\n            return n[p];\n        }\n    });\n    h(o.prototype, {\n        setBuffer: function(p) {\n            this.options.buffer = p;\n            ((this.onvisible && this.onvisible.setBuffer(p)));\n        },\n        getBuffer: function() {\n            return this.options.buffer;\n        },\n        register: function() {\n            this.onvisible = new j(l(this.scroll_loader_id), this.getHandler(), false, this.options.buffer, false, m(this.scroll_area_id));\n            n[this.scroll_loader_id] = this;\n            g.inform(o.REGISTERED, {\n                id: this.scroll_loader_id\n            });\n        },\n        getInstance: function(p) {\n            return n[p];\n        },\n        getHandler: function() {\n            if (this.handler) {\n                return this.handler;\n            }\n        ;\n        ;\n            function p(q) {\n                var r = m(this.scroll_loader_id);\n                if (!r) {\n                    this.onvisible.remove();\n                    return;\n                }\n            ;\n            ;\n                i.addClass(r.firstChild, \"async_saving\");\n                var s = this.options.handler;\n                this.options.handler = function() {\n                    g.inform(\"ScrollingPager/loadingComplete\");\n                    ((s && s.apply(null, arguments)));\n                };\n                if (q) {\n                    this.data.pager_fired_on_init = true;\n                }\n            ;\n            ;\n                k.loadFromEndpoint(this.pagelet_src, this.target_id, this.data, this.options);\n            };\n        ;\n            return p.bind(this);\n        },\n        setHandler: function(p) {\n            this.handler = p;\n        },\n        removeOnVisible: function() {\n            this.onvisible.remove();\n        },\n        checkBuffer: function() {\n            ((this.onvisible && this.onvisible.checkBuffer()));\n        }\n    });\n    e.exports = o;\n});\n__d(\"StickyController\", [\"JSBNG__Event\",\"CSS\",\"Style\",\"Vector\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"queryThenMutateDOM\");\n    function m(n, o, p, q) {\n        this._element = n;\n        this._marginTop = o;\n        this._onchange = p;\n        this._proxy = ((q || n.parentNode));\n        this._boundQueryOnScroll = this._queryOnScroll.bind(this);\n        this._boundMutateOnScroll = this._mutateOnScroll.bind(this);\n    };\n;\n    k(m.prototype, {\n        handleScroll: function() {\n            l(this._boundQueryOnScroll, this._boundMutateOnScroll);\n        },\n        _queryOnScroll: function() {\n            this._shouldFix = ((j.getElementPosition(this._proxy, \"viewport\").y <= this._marginTop));\n        },\n        _mutateOnScroll: function() {\n            var n = this._shouldFix;\n            if (((this.isFixed() !== n))) {\n                i.set(this._element, \"JSBNG__top\", ((n ? ((this._marginTop + \"px\")) : \"\")));\n                h.conditionClass(this._element, \"fixed_elem\", n);\n                ((this._onchange && this._onchange(n)));\n            }\n        ;\n        ;\n        },\n        start: function() {\n            if (this._event) {\n                return;\n            }\n        ;\n        ;\n            this._event = g.listen(window, \"JSBNG__scroll\", this.handleScroll.bind(this));\n            this.handleScroll.bind(this).defer();\n        },\n        JSBNG__stop: function() {\n            ((this._event && this._event.remove()));\n            this._event = null;\n        },\n        isFixed: function() {\n            return h.hasClass(this._element, \"fixed_elem\");\n        }\n    });\n    e.exports = m;\n});\n__d(\"tidyEvent\", [\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = [];\n    function i() {\n        while (h.length) {\n            var k = h.shift();\n            if (k.remove) {\n                ((k._handler && k.remove()));\n            }\n             else ((k && k.unsubscribe()));\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function j(k) {\n        if (!h.length) {\n            g.onLeave(i);\n        }\n    ;\n    ;\n        if (Array.isArray(k)) {\n            h = h.concat(k);\n        }\n         else h.push(k);\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = j;\n});\n__d(\"TriggerablePageletLoader\", [\"function-extensions\",\"CSS\",\"JSBNG__Event\",\"OnVisible\",\"Run\",\"UIPagelet\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"CSS\"), h = b(\"JSBNG__Event\"), i = b(\"OnVisible\"), j = b(\"Run\"), k = b(\"UIPagelet\"), l = b(\"copyProperties\"), m = [];\n    function n(p) {\n        if (!m[p]) {\n            return;\n        }\n    ;\n    ;\n        ((m[p].__trigger && m[p].__trigger.remove()));\n        delete m[p];\n    };\n;\n    function o(p, q) {\n        this._disabledTriggerKeys = [];\n        this._pageletConfig = p;\n        this._loaded = false;\n        this._loading = false;\n        this._triggerKeys = [];\n        if (q) {\n            q.forEach(this.addTrigger.bind(this));\n        }\n    ;\n    ;\n        j.onLeave(this.destroy.bind(this));\n    };\n;\n    l(o, {\n        removeTrigger: function(p) {\n            {\n                var fin192keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin192i = (0);\n                var q;\n                for (; (fin192i < fin192keys.length); (fin192i++)) {\n                    ((q) = (fin192keys[fin192i]));\n                    {\n                        if (((m[q] && ((m[q].node === p))))) {\n                            n(q);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        TRIGGER_CLICK: \"click\",\n        TRIGGER_ONVISIBLE: \"onvisible\",\n        TRIGGER_NOW: \"now\"\n    });\n    l(o.prototype, {\n        addTrigger: function(p) {\n            p.__trigger = this._createTrigger(p);\n            m.push(p);\n            this._triggerKeys.push(((m.length - 1)));\n        },\n        destroy: function() {\n            this.removeTriggers();\n            if (this._pageletRequest) {\n                this._pageletRequest.cancel();\n                this._pageletRequest = null;\n                this._loading = false;\n                this._loaded = false;\n            }\n        ;\n        ;\n        },\n        disableTriggers: function() {\n            this._triggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger.remove();\n                    this._disabledTriggerKeys.push(p);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        enableTriggers: function() {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._disabledTriggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger = this._createTrigger(m[p]);\n                }\n            ;\n            ;\n            }.bind(this));\n            this._disabledTriggerKeys.length = 0;\n        },\n        _createTrigger: function(p) {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            var q = this.onTrigger.bind(this, p);\n            switch (p.type) {\n              case o.TRIGGER_CLICK:\n                return h.listen(p.node, \"click\", function(r) {\n                    r.prevent();\n                    q();\n                });\n              case o.TRIGGER_ONVISIBLE:\n                return new i(p.node, q, p.onVisibleStrict, p.onVisibleBuffer);\n              case o.TRIGGER_NOW:\n                return q();\n              default:\n            \n            };\n        ;\n        },\n        load: function(p) {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._loading = true;\n            this._loaded = false;\n            g.addClass(this._pageletConfig.node, \"async_saving\");\n            if (((p && p.node))) {\n                g.addClass(p.node, \"async_saving\");\n            }\n        ;\n        ;\n            var q = ((this._pageletConfig.options || {\n            }));\n            q.displayCallback = this.onLoad.bind(this, p);\n            if (((q.crossPage === undefined))) {\n                q.crossPage = true;\n            }\n        ;\n        ;\n            this._pageletRequest = k.loadFromEndpoint(this._pageletConfig.controller, this._pageletConfig.node, this._pageletConfig.data, q);\n        },\n        onLoad: function(p, q) {\n            this._loaded = true;\n            this._pageletRequest = null;\n            g.removeClass(this._pageletConfig.node, \"async_saving\");\n            if (((p && p.node))) {\n                g.removeClass(p.node, \"async_saving\");\n            }\n        ;\n        ;\n            if (this._pageletConfig.displayCallback) {\n                this._pageletConfig.displayCallback(q);\n            }\n             else q();\n        ;\n        ;\n        },\n        onTrigger: function(p) {\n            ((p.callback && p.callback(p)));\n            if (((!this._loaded && !this._loading))) {\n                this.load(p);\n            }\n        ;\n        ;\n        },\n        removeTriggers: function(p) {\n            this._triggerKeys.forEach(function(q) {\n                if (((m[q] && ((!p || ((m[q].type === p))))))) {\n                    n(q);\n                }\n            ;\n            ;\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"MedleyPageletRequestData\", [\"Arbiter\",\"TidyArbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TidyArbiter\"), i = {\n    }, j = {\n        get: function() {\n            return i;\n        },\n        set: function(k) {\n            i = k;\n            h.inform(\"Medley/requestDataSet\", null, g.BEHAVIOR_STATE);\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineSection\", [\"Arbiter\",\"DOMScroll\",\"DoublyLinkedListMap\",\"Run\",\"TidyArbiterMixin\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMScroll\"), i = b(\"DoublyLinkedListMap\"), j = b(\"Run\"), k = b(\"TidyArbiterMixin\"), l = b(\"copyProperties\"), m = b(\"ge\"), n = null;\n    function o() {\n        n = null;\n    };\n;\n    function p(q, r, s) {\n        this.id = q;\n        this.label = s;\n        this.nodeID = r;\n        this._parentSection = null;\n        this.childSections = new i();\n        this._isLoaded = false;\n        p.inform.bind(p, ((\"sectionInitialized/\" + q)), {\n            section: this\n        }, g.BEHAVIOR_STATE).defer();\n    };\n;\n    l(p, k, {\n        callWithSection: function(q, r) {\n            this.subscribe(((\"sectionInitialized/\" + q)), function(s, t) {\n                r(t.section);\n            });\n        },\n        setActiveSectionID: function(q) {\n            ((!n && j.onLeave(o)));\n            n = q;\n        }\n    });\n    l(p.prototype, {\n        appendSection: function(q) {\n            this.childSections.append(q.id, q);\n            q._parentSection = this;\n        },\n        freeze: function() {\n            this.freezeChildren();\n        },\n        freezeChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                ((!q.isActive() && q.freeze()));\n                q = q.getNext();\n            };\n        ;\n        },\n        getNext: function() {\n            return ((this._parentSection && this._parentSection.childSections.getNext(this.id)));\n        },\n        getPrev: function() {\n            return ((this._parentSection && this._parentSection.childSections.getPrev(this.id)));\n        },\n        isActive: function() {\n            var q = this;\n            while (q) {\n                if (((q.id === n))) {\n                    return true;\n                }\n            ;\n            ;\n                q = q._parentSection;\n            };\n        ;\n            return false;\n        },\n        isLoaded: function() {\n            return this._isLoaded;\n        },\n        setIsLoaded: function(q) {\n            this._isLoaded = q;\n            return this;\n        },\n        JSBNG__scrollTo: function() {\n            if (!m(this.nodeID)) {\n                return;\n            }\n        ;\n        ;\n            h.JSBNG__scrollTo(this.getNode(), true, false, false, h.JSBNG__scrollTo.bind(this).curry(this.getNode(), 0));\n        },\n        thaw: function() {\n            this.thawChildren();\n        },\n        thawChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                q.thaw();\n                q = q.getNext();\n            };\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineDynamicSection\", [\"Class\",\"DOM\",\"TimelineSection\",\"copyProperties\",\"cx\",\"ge\",\"TimelineDynamicSectionConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"TimelineSection\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"ge\"), m = b(\"TimelineDynamicSectionConfig\");\n    function n(o, p, q) {\n        this._controller = p;\n        this._data = null;\n        this._node = null;\n        this._triggerLoader = null;\n        this.parent.construct(this, o, o, q);\n    };\n;\n    g.extend(n, i);\n    j(n.prototype, {\n        _createNode: function() {\n            return h.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineMedley__sectionwrapper\",\n                id: this.nodeID\n            }, [m.throbber.cloneNode(true),]);\n        },\n        getNode: function() {\n            if (!this._node) {\n                this._node = ((l(this.nodeID) || this._createNode()));\n            }\n        ;\n        ;\n            return this._node;\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineAppCollection\", [\"function-extensions\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"JSBNG__Event\",\"MedleyPageletRequestData\",\"NumberFormatConfig\",\"PageTransitions\",\"Parent\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineDynamicSection\",\"TimelineSection\",\"TriggerablePageletLoader\",\"TimelineDynamicSectionConfig\",\"copyProperties\",\"csx\",\"cx\",\"ads-lib-formatters\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"JSBNG__Event\"), l = b(\"MedleyPageletRequestData\"), m = b(\"NumberFormatConfig\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"TidyArbiter\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineDynamicSection\"), t = b(\"TimelineSection\"), u = b(\"TriggerablePageletLoader\"), v = b(\"TimelineDynamicSectionConfig\"), w = b(\"copyProperties\"), x = b(\"csx\"), y = b(\"cx\"), z = b(\"ads-lib-formatters\"), aa = b(\"ge\"), ba = 500, ca = 8;\n    function da(ha) {\n        var ia = aa(ga.getIDByToken(ha));\n        if (!ia) {\n            return;\n        }\n    ;\n    ;\n        return i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0];\n    };\n;\n    function ea(ha, ia) {\n        ((((ia && !ia.isDefaultRequested())) && ia.prevent()));\n        var ja = ha._parentSection, ka = ja._parentSection;\n        t.setActiveSectionID(ja.id);\n        ja.setActiveCollection(ha);\n        if (((ja._sk === ka._sk))) {\n            if (!h.hasClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\")) {\n                h.addClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                ka.freezeChildren();\n            }\n        ;\n        ;\n            ((ha._isFullyLoaded && ka.addSectionTeasers()));\n        }\n    ;\n    ;\n        if (((!ka.isMedleyView() && ((ja._sk === ka._sk))))) {\n            var la = ha.href;\n            n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), la);\n        }\n    ;\n    ;\n    };\n;\n    function fa(ha, ia) {\n        ia.data.overview = ((ha._parentSection._sk !== ha._parentSection._parentSection._sk));\n        ia.data.cursor = null;\n        ea(ha);\n    };\n;\n    function ga(ha, ia, ja, ka, la, ma) {\n        this._contentLoader = null;\n        this._isFrozen = false;\n        this._isFullyLoaded = false;\n        this._cursor = 0;\n        this._tabNode = ja;\n        this._tabCount = ((((ka > 0)) ? ka : 0));\n        this._token = ha;\n        this._ftid = null;\n        this.auxContent = null;\n        this.curationContent = null;\n        this._order = la;\n        this.href = ma;\n        this._sortContent = null;\n        this.refreshCount();\n        this.parent.construct(this, ga.getIDByToken(ha), ia);\n        if (!ja) {\n            return;\n        }\n    ;\n    ;\n        if (aa(this.nodeID)) {\n            k.listen(ja, \"click\", ea.curry(this));\n        }\n         else this.createTriggerLoader.bind(this).defer();\n    ;\n    ;\n    };\n;\n    g.extend(ga, s);\n    w(ga, r, {\n        NEW_ITEM: \"TimelineAppCollection/newItem\",\n        ADDING_PLACEHOLDER: \"TimelineAppCollection/addingPlaceholder\",\n        addPlaceholderToCollection: function(ha, ia, ja) {\n            ja = ((((typeof ja !== \"undefined\")) ? ja : {\n            }));\n            if (!ja.suppressCount) {\n                this.incrementCount(ga.getIDByToken(ha));\n            }\n        ;\n        ;\n            t.callWithSection(ga.getIDByToken(ha), function(ka) {\n                var la = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemtitle\")[0].cloneNode(true), ma = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemimage .img\")[0], na = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\")[0], oa = ((na && na.getAttribute(\"data-obj\")));\n                if (((!la || !oa))) {\n                    return;\n                }\n            ;\n            ;\n                ka.inform(ga.ADDING_PLACEHOLDER);\n                var pa = da(ha);\n                if (!pa) {\n                    return;\n                }\n            ;\n            ;\n                var qa = i.scry(pa, ((((\"[data-obj=\\\"\" + oa)) + \"\\\"]\")))[0], ra = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__placeholderimage\"\n                });\n                if (ma) {\n                    p.set(ra, \"background-image\", ((((\"url(\" + ma.src)) + \")\")));\n                }\n            ;\n            ;\n                var sa = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__itemimage\"\n                }, [ra,]), ta = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__content\"\n                }, [la,]), ua = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\"\n                }, [sa,ta,]), va = i.create(\"li\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__item\",\n                    id: ((\"collectionItemPlaceholder\" + oa))\n                }, [ua,]);\n                if (((qa && ja.replaceExistingElement))) {\n                    i.replace(qa.parentNode, va);\n                }\n                 else {\n                    if (qa) {\n                        i.remove(qa.parentNode);\n                    }\n                     else if (((ka.isOverview() && ((pa.children.length >= ca))))) {\n                        h.addClass(pa.children[((ca - 1))], \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n                    }\n                    \n                ;\n                ;\n                    i.prependContent(pa, va);\n                }\n            ;\n            ;\n            });\n        },\n        replaceItem: function(ha, ia, ja) {\n            var ka = o.byClass(ha, \"-cx-PUBLIC-fbTimelineCollectionGrid__root\"), la = i.scry(ka, ((((\"div[data-obj=\\\"\" + ia)) + \"\\\"]\")))[0];\n            if (la) {\n                ga.inform(ga.NEW_ITEM, {\n                    grid: ka,\n                    newItem: ja\n                });\n                i.replace(la.parentNode, ja);\n            }\n        ;\n        ;\n        },\n        addItemToCollection: function(ha, ia, ja) {\n            var ka = aa(ja);\n            if (!ka) {\n                return;\n            }\n        ;\n        ;\n            var la = i.scry(ka, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0], ma = la.parentNode.nextSibling;\n            if (((ma && h.hasClass(ma, \"-cx-PRIVATE-fbTimelineMedleyPager__root\")))) {\n                i.remove(la.lastChild);\n            }\n        ;\n        ;\n            this.inform(ga.NEW_ITEM, {\n                grid: la,\n                newItem: ha\n            });\n            var na = aa(((\"collectionItemPlaceholder\" + ia)));\n            if (na) {\n                i.replace(na, ha);\n                return;\n            }\n        ;\n        ;\n            i.prependContent(la, ha);\n        },\n        createFromArray: function(ha) {\n            return ha.map(function(ia) {\n                return new ga(ia.token, ia.controller, ia.tab_node, ia.tab_count, ia.order, ia.href);\n            });\n        },\n        decrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                if (((ia._tabCount > 0))) {\n                    ia._tabCount--;\n                    ia.refreshCount();\n                    ia.flashCountIf();\n                }\n            ;\n            ;\n            });\n        },\n        enableContentLoader: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.addContentLoader(ia, ja);\n            });\n        },\n        getIDByToken: function(ha) {\n            return ((\"pagelet_timeline_app_collection_\" + ha));\n        },\n        incrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._tabCount++;\n                ia.refreshCount();\n                ia.flashCountIf();\n            });\n        },\n        registerAuxContent: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.registerAuxContent(ia);\n            });\n        },\n        registerAddCurationContent: function(ha, ia, ja, ka) {\n            t.callWithSection(ha, function(la) {\n                la.registerAddCurationContent(ia, ja, ka);\n            });\n        },\n        registerSortContent: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.registerSortContent(ia, ja);\n            });\n        },\n        setLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia.setIsLoaded(true);\n                ia._parentSection.inform(\"loaded\", ia);\n                ia._parentSection.unsetMinHeight();\n            });\n        },\n        setFullyLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._isFullyLoaded = true;\n                var ja = ia._parentSection;\n                ((((ja._sk === ja._parentSection._sk)) && ja._parentSection.addSectionTeasers()));\n            });\n        },\n        setFTID: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.setFTID(ia);\n            });\n        },\n        switchToNullStateCurationContent: function(ha) {\n            t.callWithSection(ga.getIDByToken(ha), function(ia) {\n                ia.nullStateCurationContent();\n            });\n        }\n    });\n    w(ga.prototype, r, {\n        addContentLoader: function(ha, ia) {\n            this._cursor = ia;\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ja = {\n                    node: ha\n                };\n                if (h.hasClass(ha, \"-cx-PRIVATE-fbTimelineMedleyPager__root\")) {\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else if (this._isFrozen) {\n                    i.remove(ha);\n                    ja.node = v.pager.cloneNode(true);\n                    i.appendContent(this.getNode(), ja.node);\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else {\n                    ja.onVisibleBuffer = ba;\n                    ja.onVisibleStrict = true;\n                    ja.type = u.TRIGGER_ONVISIBLE;\n                }\n                \n            ;\n            ;\n                if (((ja.type === u.TRIGGER_CLICK))) {\n                    ja.callback = t.setActiveSectionID.curry(this.id);\n                }\n            ;\n            ;\n                var ka = w({\n                    displayCallback: function(la) {\n                        i.remove(ja.node);\n                        la();\n                    },\n                    options: {\n                        append: true\n                    }\n                }, this.getDefaultPageletConfig());\n                ka.data.overview = this.isOverview();\n                this._triggerLoader = null;\n                this._contentLoader = new u(ka, [ja,]);\n            }.bind(this));\n        },\n        _createNode: function() {\n            var ha = this.parent._createNode();\n            ha.setAttribute(\"aria-role\", \"tabpanel\");\n            return ha;\n        },\n        createTriggerLoader: function() {\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ha = this.getDefaultPageletConfig(), ia = {\n                    callback: fa.curry(this, ha),\n                    node: this._tabNode,\n                    type: u.TRIGGER_CLICK\n                };\n                this._triggerLoader = new u(ha, [ia,]);\n            }.bind(this));\n        },\n        disableContentLoader: function() {\n            ((this._contentLoader && this._contentLoader.disableTriggers()));\n        },\n        enableContentLoader: function() {\n            var ha = ((this._triggerLoader || this._contentLoader));\n            ((ha && ha.enableTriggers()));\n        },\n        freeze: function() {\n            this._isFrozen = true;\n            if (((!this._contentLoader || this._contentLoader._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._contentLoader.removeTriggers(u.TRIGGER_ONVISIBLE);\n            var ha = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            if (!ha.length) {\n                var ia = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\")[0];\n                ((ia.length && this.addContentLoader(ia, this._cursor)));\n            }\n        ;\n        ;\n        },\n        getCount: function() {\n            return this._tabCount;\n        },\n        getDefaultPageletConfig: function() {\n            return {\n                controller: this._controller,\n                data: w({\n                    collection_token: this._token,\n                    cursor: this._cursor\n                }, l.get(), {\n                    ftid: this._ftid,\n                    order: this._order\n                }, {\n                    sk: this._parentSection._sk\n                }),\n                node: this.getNode()\n            };\n        },\n        getMedleySiteKey: function() {\n            return this._parentSection._parentSection._sk;\n        },\n        flashCountIf: function() {\n            if (((this._parentSection.getActiveCollection() != this))) {\n                h.addClass(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\");\n                JSBNG__setTimeout(h.removeClass.curry(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\"), 800);\n            }\n        ;\n        ;\n        },\n        isOverview: function() {\n            return ((this._parentSection._sk != this._parentSection._parentSection._sk));\n        },\n        registerAuxContent: function(ha) {\n            this.auxContent = ha;\n            if (((ha.nodeType == 11))) {\n                this.auxContent = i.create(\"span\", null, ha);\n            }\n        ;\n        ;\n            if (((this._parentSection._activeCollection !== this))) {\n                h.hide(this.auxContent);\n            }\n        ;\n        ;\n            this._parentSection.addAuxContent(this.auxContent);\n        },\n        registerAddCurationContent: function(ha, ia, ja) {\n            if (this.curationContent) {\n                return;\n            }\n        ;\n        ;\n            this.curationContent = ((((ha.nodeType == 11)) ? i.create(\"span\", null, ha) : ha));\n            this.curationContentState = ia;\n            this._parentSection.addCurationContent(this.curationContent, this, ja);\n        },\n        nullStateCurationContent: function() {\n            this._parentSection.nullStateCurationContent();\n        },\n        registerSortContent: function(ha, ia) {\n            ((this._sortContent && i.remove(this._sortContent)));\n            this._sortContent = ha;\n            ia.subscribeOnce(\"change\", function(ja, ka) {\n                i.setContent(i.JSBNG__find(ha, \".-cx-PRIVATE-fbTimelineCollectionSorting__menulabel\"), ka.label);\n                this._sort(ka.value);\n            }.bind(this));\n        },\n        refreshCount: function() {\n            if (!this._tabNode) {\n                return;\n            }\n        ;\n        ;\n            var ha = j.JSBNG__find(this._tabNode, \".-cx-PRIVATE-fbTimelineAppSection__tabcount\");\n            if (((this._tabCount > 0))) {\n                i.setContent(ha, z.formatNumber(this._tabCount, 0, m.numberDelimiter, \"\"));\n            }\n             else i.setContent(ha, \"\");\n        ;\n        ;\n        },\n        _resetContent: function() {\n            ((this._contentLoader && this._contentLoader.destroy()));\n            i.remove(this.getNode());\n            this._node = null;\n            i.appendContent(j.JSBNG__find(this._parentSection.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), this.getNode());\n            this.addContentLoader(j.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\"), 0);\n        },\n        setFTID: function(ha) {\n            this._ftid = ha;\n        },\n        _sort: function(ha) {\n            this._order = ha;\n            this._resetContent();\n            var ia = this._parentSection, ja = ia._parentSection;\n            if (((!ja.isMedleyView() && ((ia._sk === ja._sk))))) {\n                var ka = n.getCurrentURI();\n                ka.addQueryData({\n                    order: this._order\n                });\n                n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), ka);\n            }\n        ;\n        ;\n        },\n        thaw: function() {\n            this._isFrozen = false;\n        },\n        getToken: function() {\n            return this._token;\n        }\n    });\n    e.exports = ga;\n});\n__d(\"TimelineCommentsLoader\", [\"JSBNG__Event\",\"CommentPrelude\",\"CSS\",\"DOM\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"emptyFunction\"), m = {\n        init: function() {\n            m.init = l;\n            g.listen(JSBNG__document.body, \"click\", function(n) {\n                var o = k.byClass(n.getTarget(), \"fbTimelineFeedbackCommentLoader\");\n                if (o) {\n                    n.kill();\n                    h.click(o, false);\n                    var p = k.byTag(o, \"form\"), q = j.scry(p, \"li.uiUfiViewAll input\");\n                    if (!q.length) {\n                        q = j.scry(p, \"li.fbUfiViewPrevious input\");\n                    }\n                ;\n                ;\n                    if (!q.length) {\n                        q = j.scry(p, \"a.UFIPagerLink\");\n                    }\n                ;\n                ;\n                    q[0].click();\n                    i.show(j.JSBNG__find(p, \"li.uiUfiComments\"));\n                    i.removeClass(o, \"fbTimelineFeedbackCommentLoader\");\n                }\n            ;\n            ;\n            });\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DS_HEIGHT: \"timeline-unit-height\",\n        DS_LOADED: \"timeline-capsule-loaded\",\n        DS_SIDEORG: \"timeline-unit-sideorg\",\n        DS_TAILBALANCE: \"timeline-capsule-tailbalance\",\n        DS_COLUMN_HEIGHT_DIFFERENTIAL: \"timeline-column-diff-height\",\n        FIXED_SIDE_LEFT: \"left\",\n        FIXED_SIDE_RIGHT: \"right\",\n        FIXED_SIDE_BOTH: \"both\",\n        FIXED_SIDE_NONE: \"none\",\n        SCROLL_TO_OFFSET: 30,\n        SUBSECTION_SCROLL_TO_OFFSET: 90,\n        SCRUBBER_DEFAULT_OFFSET: 38,\n        SECTION_LOADING: \"TimelineConstants/sectionLoading\",\n        SECTION_LOADED: \"TimelineConstants/sectionLoaded\",\n        SECTION_FULLY_LOADED: \"TimelineConstants/sectionFullyLoaded\",\n        SECTION_REGISTERED: \"TimelineConstants/sectionRegistered\"\n    };\n    e.exports = g;\n});\n__d(\"TimelineLegacySections\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        get: function(i) {\n            return g[i];\n        },\n        getAll: function() {\n            return g;\n        },\n        remove: function(i) {\n            delete g[i];\n        },\n        removeAll: function() {\n            g = {\n            };\n        },\n        set: function(i, j) {\n            g[i] = j;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        TIMELINE_KEY: \"timeline\",\n        WALL_KEY: \"wall\",\n        parseURI: function(i) {\n            i = g(i);\n            var j = i.getQueryData(), k = i.getPath(), l = k.split(\"/\").slice(1);\n            if (((((l[0] == \"people\")) || ((l[0] == \"pages\"))))) {\n                l = l.slice(2);\n            }\n        ;\n        ;\n            var m = ((((j.sk || l[1])) || h.TIMELINE_KEY));\n            if (((m == h.WALL_KEY))) {\n                m = h.TIMELINE_KEY;\n            }\n        ;\n        ;\n            var n = null, o = null;\n            if (((m == h.TIMELINE_KEY))) {\n                o = ((parseInt(l[2], 10) || null));\n                n = ((parseInt(l[3], 10) || null));\n            }\n        ;\n        ;\n            return {\n                path: k,\n                id: ((j.id || l[0])),\n                key: m,\n                viewas: ((j.viewas ? j.viewas : 0)),\n                filter: ((j.filter ? j.filter : null)),\n                year: o,\n                month: n,\n                friendship: !!j.and\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineController\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOMQuery\",\"Run\",\"ScrollingPager\",\"TidyArbiter\",\"TimelineConstants\",\"TimelineLegacySections\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"copyProperties\",\"ge\",\"tidyEvent\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOMQuery\"), l = b(\"Run\"), m = b(\"ScrollingPager\"), n = b(\"TidyArbiter\"), o = b(\"TimelineConstants\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineURI\"), r = b(\"Vector\"), s = b(\"ViewportBounds\"), t = b(\"$\"), u = b(\"copyProperties\"), v = b(\"ge\"), w = b(\"tidyEvent\"), x = b(\"queryThenMutateDOM\"), y = 358, z = 48, aa = 740, ba = 1285, ca = null, da = false, ea, fa, ga, ha = {\n    }, ia = {\n    }, ja = [], ka = null, la = null, ma = false, na = false, oa = 0, pa = false, qa = false, ra = false, sa = {\n    }, ta = false;\n    function ua() {\n        ((ka && ka.remove()));\n        ka = null;\n    };\n;\n    function va(hb, ib, jb) {\n        jb = ((jb || []));\n        if (ha[hb]) {\n            return ha[hb][ib].apply(ha[hb], jb);\n        }\n    ;\n    ;\n        ia[hb] = ((ia[hb] || {\n        }));\n        ia[hb][ib] = jb;\n        return false;\n    };\n;\n    function wa() {\n        if (!((((pa || ra)) || qa))) {\n            ua();\n            return;\n        }\n    ;\n    ;\n        var hb = r.getScrollPosition();\n        pa = ((pa && ab(v(\"rightCol\"), hb, \"paddingTop\", true)));\n        qa = ((qa && ab(t(\"pagelet_above_header_timeline\"), hb, \"JSBNG__top\")));\n        ra = ((ra && ab(t(\"blueBar\"), hb, \"paddingTop\")));\n    };\n;\n    var xa = 0;\n    function ya() {\n        xa = r.getScrollPosition();\n    };\n;\n    function za() {\n        x(ya, function() {\n            var hb = ((((oa === 0)) || ((xa.y >= oa))));\n            va(gb.STICKY_HEADER, \"toggle\", [hb,]);\n            va(gb.CONTENT, \"checkCurrentSectionChange\");\n        }, \"TimelineController/scrollListener\");\n    };\n;\n    function ab(hb, ib, jb, kb) {\n        if (!hb) {\n            ua();\n            return;\n        }\n    ;\n    ;\n        if (((ib.y <= 0))) {\n            bb(hb, jb);\n            return false;\n        }\n         else {\n            var lb = ((kb && gb.getCurrentScrubber()));\n            if (((lb && i.hasClass(lb.getRoot(), \"fixed_elem\")))) {\n                bb(hb, jb);\n                return false;\n            }\n             else {\n                var mb = ((parseInt(hb.style[jb], 10) || 0));\n                if (((ib.y < mb))) {\n                    i.addClass(hb, \"timeline_fixed\");\n                    hb.style[jb] = ((ib.y + \"px\"));\n                }\n                 else i.removeClass(hb, \"timeline_fixed\");\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function bb(hb, ib) {\n        hb.style[ib] = \"0px\";\n        i.removeClass(hb, \"timeline_fixed\");\n    };\n;\n    function cb() {\n        x(gb.shouldShowWideAds, function() {\n            va(gb.ADS, \"adjustAdsType\", [ma,]);\n            va(gb.ADS, \"adjustAdsToFit\");\n            va(gb.CONTENT, \"adjustContentPadding\");\n            va(gb.STICKY_HEADER_NAV, \"adjustMenuHeights\");\n        }, \"TimelineController/resize\");\n    };\n;\n    function db(hb, ib) {\n        if (((hb == \"sidebar/initialized\"))) {\n            ta = true;\n        }\n    ;\n    ;\n        va(gb.ADS, \"adjustAdsType\", [gb.shouldShowWideAds(),]);\n    };\n;\n    function eb(hb, ib) {\n        var jb = v(\"rightCol\");\n        if (jb) {\n            jb.style.paddingTop = ((ib + \"px\"));\n            pa = true;\n        }\n    ;\n    ;\n        var kb = t(\"pagelet_above_header_timeline\");\n        if (kb.firstChild) {\n            t(\"above_header_timeline_placeholder\").style.height = ((kb.offsetHeight + \"px\"));\n            kb.style.JSBNG__top = ((ib + \"px\"));\n            qa = true;\n        }\n    ;\n    ;\n        var lb = JSBNG__document.documentElement;\n        ra = ((((lb.clientHeight < 400)) || ((lb.clientWidth < lb.scrollWidth))));\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = ((ib + \"px\"));\n        }\n    ;\n    ;\n        ka = g.listen(window, \"JSBNG__scroll\", wa);\n        h.inform(\"reflow\");\n    };\n;\n    function fb() {\n        while (ja.length) {\n            ja.pop().remove();\n        ;\n        };\n    ;\n        {\n            var fin193keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin193i = (0);\n            var hb;\n            for (; (fin193i < fin193keys.length); (fin193i++)) {\n                ((hb) = (fin193keys[fin193i]));\n                {\n                    ((ha[hb].reset && ha[hb].reset()));\n                ;\n                };\n            };\n        };\n    ;\n        ua();\n        ga.unsubscribe();\n        ga = null;\n        ca = null;\n        ea = null;\n        ha = {\n        };\n        ia = {\n        };\n        la = null;\n        na = false;\n        oa = 0;\n        qa = false;\n        if (pa) {\n            var ib = v(\"rightCol\");\n            if (ib) {\n                ib.style.paddingTop = \"\";\n                i.removeClass(ib, \"timeline_fixed\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        pa = false;\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = \"\";\n            i.removeClass(t(\"blueBar\"), \"timeline_fixed\");\n        }\n    ;\n    ;\n        ra = false;\n        ta = false;\n        da = false;\n        j.purge(o.DS_HEIGHT);\n        j.purge(o.DS_LOADED);\n        j.purge(o.DS_SIDEORG);\n        j.purge(o.DS_TAILBALANCE);\n        j.purge(o.DS_COLUMN_HEIGHT_DIFFERENTIAL);\n    };\n;\n    var gb = {\n        NAV: \"nav\",\n        STICKY_HEADER: \"sticky_header\",\n        STICKY_HEADER_NAV: \"sticky_header_nav\",\n        SCRUBBER: \"scrubber\",\n        CONTENT: \"JSBNG__content\",\n        ADS: \"ads\",\n        LOGGING: \"logging\",\n        init: function(hb, ib, jb) {\n            if (da) {\n                return;\n            }\n        ;\n        ;\n            if (((ib == q.WALL_KEY))) {\n                ib = q.TIMELINE_KEY;\n            }\n        ;\n        ;\n            da = true;\n            ea = hb;\n            fa = jb.has_fixed_ads;\n            na = jb.one_column_minimal;\n            sa = {\n                allactivity: true,\n                approve: true\n            };\n            if (!na) {\n                u(sa, {\n                    games: true,\n                    map: true,\n                    music: true,\n                    video: true\n                });\n            }\n        ;\n        ;\n            sa[q.TIMELINE_KEY] = true;\n            va(gb.CONTENT, \"adjustContentPadding\");\n            ja.push(g.listen(window, \"JSBNG__scroll\", za), g.listen(window, \"resize\", cb));\n            ga = h.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], db);\n            w(n.subscribe(\"TimelineCover/coverCollapsed\", eb));\n            l.onLeave(fb);\n            gb.registerCurrentKey(ib);\n        },\n        setAdsTracking: function(hb) {\n            va(gb.ADS, \"start\", [hb,]);\n        },\n        pageHasScrubber: function(hb) {\n            return ((((!hb || ((!na && hb.match(/^(og_)?app_/))))) || ((hb in sa))));\n        },\n        fixedAds: function() {\n            return fa;\n        },\n        registerCurrentKey: function(hb) {\n            ca = hb;\n            la = ((((((hb !== \"map\")) && ((r.getViewportDimensions().y < aa)))) && gb.pageHasScrubber(hb)));\n            la = ((la || t(\"blueBar\").offsetTop));\n            va(gb.ADS, \"setShortMode\", [la,]);\n            va(gb.ADS, \"updateCurrentKey\", [hb,]);\n            oa = ((((hb == q.TIMELINE_KEY)) ? ((y - z)) : 0));\n        },\n        getCurrentKey: function() {\n            return ca;\n        },\n        getCurrentScrubber: function() {\n            return ha[gb.SCRUBBER];\n        },\n        getCurrentStickyHeaderNav: function() {\n            return ha[gb.STICKY_HEADER_NAV];\n        },\n        scrubberHasLoaded: function(hb) {\n            i.conditionClass(hb.getRoot(), \"fixed_elem\", !la);\n            va(gb.ADS, \"registerScrubber\", [hb,]);\n        },\n        scrubberHasChangedState: function() {\n            va(gb.ADS, \"adjustAdsToFit\");\n        },\n        scrubberWasClicked: function(hb) {\n            va(gb.LOGGING, \"logScrubberClick\", [hb,]);\n        },\n        stickyHeaderNavWasClicked: function(hb) {\n            va(gb.LOGGING, \"logStickyHeaderNavClick\", [hb,]);\n        },\n        sectionHasChanged: function(hb, ib) {\n            va(gb.STICKY_HEADER_NAV, \"updateSection\", [hb,ib,]);\n            va(gb.SCRUBBER, \"updateSection\", [hb,ib,]);\n            va(gb.ADS, \"loadAdsIfEnoughTimePassed\");\n            va(gb.LOGGING, \"logSectionChange\", [hb,ib,]);\n        },\n        navigateToSection: function(hb) {\n            va(gb.CONTENT, \"navigateToSection\", [hb,]);\n        },\n        shouldShowWideAds: function() {\n            if (!ta) {\n                ma = false;\n            }\n             else {\n                var hb = ((((ba + s.getRight())) + s.getLeft()));\n                ma = ((r.getViewportDimensions().x >= hb));\n            }\n        ;\n        ;\n            return ma;\n        },\n        sidebarInitialized: function() {\n            return ta;\n        },\n        adjustStickyHeaderWidth: function() {\n            va(gb.STICKY_HEADER, \"adjustWidth\");\n        },\n        isOneColumnMinimal: function() {\n            return na;\n        },\n        register: function(hb, ib) {\n            ha[hb] = ib;\n            if (ia[hb]) {\n                {\n                    var fin194keys = ((window.top.JSBNG_Replay.forInKeys)((ia[hb]))), fin194i = (0);\n                    var jb;\n                    for (; (fin194i < fin194keys.length); (fin194i++)) {\n                        ((jb) = (fin194keys[fin194i]));\n                        {\n                            va(hb, jb, ia[hb][jb]);\n                        ;\n                        };\n                    };\n                };\n            ;\n                delete ia[hb];\n            }\n        ;\n        ;\n        },\n        adjustScrollingPagerBuffer: function(hb, ib) {\n            var jb = j.get(o.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib);\n            if (!jb) {\n                return;\n            }\n        ;\n        ;\n            var kb = m.getInstance(hb);\n            ((kb && kb.setBuffer(((kb.getBuffer() + Math.abs(jb))))));\n        },\n        runOnceWhenSectionFullyLoaded: function(hb, ib, jb) {\n            var kb = p.get(ib);\n            if (kb) {\n                var lb = false;\n                k.scry(kb.node, \".fbTimelineCapsule\").forEach(function(nb) {\n                    if (((!lb && ((parseInt(j.get(o.DS_LOADED, nb.id), 10) >= parseInt(jb, 10)))))) {\n                        hb();\n                        lb = true;\n                    }\n                ;\n                ;\n                });\n                if (lb) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var mb = h.subscribe(o.SECTION_FULLY_LOADED, function(nb, ob) {\n                if (((((ob.scrubberKey === ib)) && ((ob.pageIndex === jb))))) {\n                    hb();\n                    mb.unsubscribe();\n                }\n            ;\n            ;\n            });\n        }\n    };\n    e.exports = gb;\n});\n__d(\"TimelineDrag\", [\"JSBNG__Event\",\"ArbiterMixin\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"Locale\"), j = b(\"Style\"), k = b(\"Vector\"), l = b(\"copyProperties\");\n    function m(n, o, p) {\n        p = ((p || {\n        }));\n        this._listenOn = p.listenOn;\n        this._offsetInput = o;\n        this._defaultOffset = p.default_offset;\n        this._killClicks = p.killClicks;\n        this._vertical = true;\n        this._RTLXSwitch = false;\n        this.setPicture(n, p);\n    };\n;\n    l(m.prototype, h, {\n        setPicture: function(n, o) {\n            if (!n) {\n                return false;\n            }\n        ;\n        ;\n            o = ((o || {\n            }));\n            this._picture = n;\n            this._defaultOffset = o.default_offset;\n            if (o.offsetInput) {\n                this._offsetInput = o.offsetInput;\n            }\n        ;\n        ;\n            if (((o.vertical !== undefined))) {\n                this._vertical = o.vertical;\n            }\n        ;\n        ;\n            if (o.height) {\n                this._containerHeight = o.height;\n            }\n        ;\n        ;\n            if (o.width) {\n                this._containerWidth = o.width;\n            }\n        ;\n        ;\n            if (this._vertical) {\n                this._offsetType = \"JSBNG__top\";\n                this._eventCoord = \"y\";\n            }\n             else {\n                this._RTLXSwitch = i.isRTL();\n                this._offsetType = \"left\";\n                this._eventCoord = \"x\";\n            }\n        ;\n        ;\n            if (this._picture.complete) {\n                this._initialLoad();\n            }\n             else this._loadListener = g.listen(this._picture, \"load\", function() {\n                this._loadListener.remove();\n                this._initialLoad();\n            }.bind(this));\n        ;\n        ;\n        },\n        destroy: function() {\n            this._stopDrag();\n            this._saveOffset();\n            ((this._mousedown && this._mousedown.remove()));\n            ((this._onclick && this._onclick.remove()));\n            ((this._loadListener && this._loadListener.remove()));\n        },\n        _initialLoad: function() {\n            var n = ((this._listenOn ? this._listenOn : this._picture));\n            ((this._mousedown && this._mousedown.remove()));\n            this._mousedown = g.listen(n, \"mousedown\", this._onMouseDown.bind(this));\n            if (this._vertical) {\n                this._maxOffset = ((this._containerHeight - this._picture.offsetHeight));\n            }\n             else this._maxOffset = ((this._containerWidth - this._picture.offsetWidth));\n        ;\n        ;\n            if (((this._defaultOffset !== undefined))) {\n                this._setOffset(this._defaultOffset);\n            }\n        ;\n        ;\n            ((this._onclick && this._onclick.remove()));\n            if (this._killClicks) {\n                this._onclick = g.listen(n, \"click\", this._onClick.bind(this));\n            }\n        ;\n        ;\n            this._saveOffset();\n        },\n        _onClick: function(JSBNG__event) {\n            JSBNG__event.kill();\n        },\n        _onMouseDown: function(JSBNG__event) {\n            var n = ((parseInt(j.get(this._picture, this._offsetType), 10) || 0));\n            this._pictureStartDragOffset = ((n - k.getEventPosition(JSBNG__event)[this._eventCoord]));\n            this._startDrag();\n            JSBNG__event.kill();\n        },\n        _startDrag: function() {\n            if (!this._dragStarted) {\n                this.inform(\"startdrag\", this);\n                this._dragTokens = [g.listen(JSBNG__document.documentElement, \"mouseup\", this._onMouseUp.bind(this)),g.listen(JSBNG__document.documentElement, \"mousemove\", this._onMouseMove.bind(this)),];\n                this._dragStarted = true;\n            }\n        ;\n        ;\n        },\n        _saveOffset: function() {\n            var n = parseInt(j.get(this._picture, this._offsetType), 10);\n            if (this._RTLXSwitch) {\n                this._offsetInput.value = ((((n + this._containerWidth)) - this._picture.offsetWidth));\n            }\n             else this._offsetInput.value = n;\n        ;\n        ;\n        },\n        _stopDrag: function() {\n            if (this._dragStarted) {\n                this.inform(\"stopdrag\", this);\n                this._dragStarted = false;\n                this._dragTokens.forEach(function(n) {\n                    n.remove();\n                });\n                this._saveOffset();\n            }\n        ;\n        ;\n        },\n        _onMouseUp: function(JSBNG__event) {\n            this._stopDrag();\n            JSBNG__event.kill();\n        },\n        _setOffset: function(n) {\n            if (this._RTLXSwitch) {\n                n = Math.max(0, Math.min(n, -this._maxOffset));\n            }\n             else n = Math.min(0, Math.max(n, this._maxOffset));\n        ;\n        ;\n            j.set(this._picture, this._offsetType, ((n + \"px\")));\n        },\n        _onMouseMove: function(JSBNG__event) {\n            this._setOffset(((this._pictureStartDragOffset + k.getEventPosition(JSBNG__event)[this._eventCoord])));\n            JSBNG__event.kill();\n        }\n    });\n    e.exports = m;\n});\n__d(\"TimelineCover\", [\"Arbiter\",\"Button\",\"CSS\",\"DOM\",\"HTML\",\"Parent\",\"DOMScroll\",\"TimelineController\",\"TimelineDrag\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Button\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"HTML\"), l = b(\"Parent\"), m = b(\"DOMScroll\"), n = b(\"TimelineController\"), o = b(\"TimelineDrag\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"ge\");\n    function v(w, x, y) {\n        this.root = r(\"fbProfileCover\");\n        if (((typeof x === \"object\"))) {\n            this._coverHeight = x.cover_height;\n            this._coverWidth = x.cover_width;\n            this.previewing = x.previewing;\n            this._isLegacy = false;\n        }\n         else {\n            this._isLegacy = true;\n            this._coverHeight = x;\n            this.previewing = y;\n        }\n    ;\n    ;\n        this._parentSection = l.byClass(this.root, \"fbTimelineSection\");\n        this.cover = j.JSBNG__find(this.root, \".cover\");\n        v.instance = this;\n        this.editing = false;\n        if (!this._parentSection) {\n            this._parentSection = l.byClass(this.root, \"fbEventHeader\");\n        }\n    ;\n    ;\n        if (this.previewing) {\n            this.editMode();\n            this.updateCoverImage(this.previewing);\n        }\n    ;\n    ;\n    };\n;\n    v.instance = null;\n    v.getInstance = function() {\n        return v.instance;\n    };\n    s(v.prototype, {\n        showLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.addClass(w, \"opaquedLoading\");\n            }\n        ;\n        ;\n        },\n        hideLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.removeClass(w, \"opaquedLoading\");\n            }\n        ;\n        ;\n        },\n        isCoverImageVerticalFlow: function(w) {\n            return !(w.style.height);\n        },\n        editMode: function() {\n            h.setEnabled(j.JSBNG__find(this.root, \"button.cancelButton\"), true);\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), true);\n            this.hideLoadingIndicator();\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = j.scry(this._coverImage, \".coverWrap\")[0];\n            if (w) {\n                var x = j.JSBNG__find(w, \".coverPhotoImg\");\n                this._originalIsVertical = this.isCoverImageVerticalFlow(x);\n                this._originalOffset = p.get(x, ((this._originalIsVertical ? \"JSBNG__top\" : \"left\")));\n            }\n        ;\n        ;\n            i.addClass(this._parentSection, \"fbEditCover\");\n            m.JSBNG__scrollTo(this.root);\n            if (this.previewing) {\n                j.remove(this._coverImage);\n                i.show(this._coverImage);\n            }\n        ;\n        ;\n            var y = j.scry(this._coverImage, \".coverPhotoImg\")[0];\n            if (y) {\n                this._createDragger();\n            }\n        ;\n        ;\n            this.editing = true;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"open\"\n            });\n        },\n        _exitEditMode: function() {\n            if (this._timelineDrag) {\n                this._timelineDrag.destroy();\n                this._timelineDrag = null;\n            }\n        ;\n        ;\n            j.JSBNG__find(this.root, \"input.hiddenPhotoID\").value = null;\n            j.JSBNG__find(this.root, \"input.hiddenVideoID\").value = null;\n            h.setEnabled(j.JSBNG__find(this.root, \"button.cancelButton\"), false);\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), false);\n            i.removeClass(this._parentSection, \"fbEditCover\");\n            this.hideLoadingIndicator();\n            this.previewing = false;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"JSBNG__closed\"\n            });\n        },\n        _createDragger: function(w) {\n            var x;\n            if (this._isLegacy) {\n                x = j.JSBNG__find(this.root, \"input.photoOffsetInput\");\n                this._originalIsVertical = true;\n            }\n             else {\n                var y = ((((w === undefined)) ? this._originalIsVertical : w));\n                x = ((y ? j.JSBNG__find(this.root, \"input.photoOffsetYInput\") : j.JSBNG__find(this.root, \"input.photoOffsetXInput\")));\n            }\n        ;\n        ;\n            this._timelineDrag = new o(j.JSBNG__find(this.root, \".coverImage .coverPhotoImg\"), x, {\n                height: this._coverHeight,\n                width: this._coverWidth,\n                listenOn: this.cover,\n                vertical: y,\n                killClicks: true\n            });\n        },\n        updateCoverImage: function(w, x, y) {\n            this.videoID = y;\n            if (x) {\n                this.editMode();\n            }\n        ;\n        ;\n            j.JSBNG__find(this.root, \"input.hiddenPhotoID\").value = w;\n            j.JSBNG__find(this.root, \"input.hiddenVideoID\").value = ((y || null));\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), true);\n            if (x) {\n                j.replace(j.JSBNG__find(this.root, \".coverImage\"), k(x));\n            }\n        ;\n        ;\n            var z = j.JSBNG__find(j.JSBNG__find(this.root, \".coverImage\"), \".coverPhotoImg\"), aa = this.isCoverImageVerticalFlow(z), ba;\n            if (this._isLegacy) {\n                ba = j.JSBNG__find(this.root, \"input.photoOffsetInput\");\n            }\n             else ba = ((aa ? j.JSBNG__find(this.root, \"input.photoOffsetYInput\") : j.JSBNG__find(this.root, \"input.photoOffsetXInput\")));\n        ;\n        ;\n            if (this._timelineDrag) {\n                this._timelineDrag.setPicture(z, {\n                    offsetInput: ba,\n                    vertical: aa\n                });\n            }\n             else this._createDragger(aa);\n        ;\n        ;\n        },\n        cancelUpdate: function() {\n            j.remove(j.scry(this.root, \".coverImage\")[0]);\n            j.prependContent(this.cover, this._coverImage);\n            if (((this._originalOffset !== undefined))) {\n                p.set(j.JSBNG__find(this._coverImage, \".coverPhotoImg\"), ((this._originalIsVertical ? \"JSBNG__top\" : \"left\")), this._originalOffset);\n            }\n        ;\n        ;\n            this._exitEditMode();\n        },\n        saveComplete: function() {\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = l.byClass(this.root, \"fbTimelineTopSectionBase\");\n            ((w && i.removeClass(w, \"-cx-PRIVATE-fbTimelineLightHeader__nocover\")));\n            this._exitEditMode();\n        },\n        isInEditMode: function() {\n            return this.editing;\n        }\n    });\n    e.exports = v;\n});\n__d(\"TimelineCapsule\", [\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"Parent\",\"TimelineConstants\",\"TimelineLegacySections\",\"UserAgent\",\"Vector\",\"$\",\"createArrayFrom\",\"csx\",\"isEmpty\",\"queryThenMutateDOM\",\"JSBNG__requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DOMScroll\"), m = b(\"Parent\"), n = b(\"TimelineConstants\"), o = b(\"TimelineLegacySections\"), p = b(\"UserAgent\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"createArrayFrom\"), t = b(\"csx\"), u = b(\"isEmpty\"), v = b(\"queryThenMutateDOM\"), w = b(\"JSBNG__requestAnimationFrame\"), x = (function() {\n        var y = 45, z = 15, aa = \"use\", ba = \"update\", ca = {\n        }, da = {\n        };\n        function ea(ra) {\n            return h.hasClass(ra, \"fbTimelineBalancer\");\n        };\n    ;\n        function fa(ra) {\n            return ra.getAttribute(\"data-spine\");\n        };\n    ;\n        function ga(ra) {\n            return h.hasClass(ra, \"placeholderUnit\");\n        };\n    ;\n        function ha(ra, sa) {\n            if (sa) {\n                return ((i.get(n.DS_SIDEORG, ra.id) || ra.getAttribute(\"data-side\")));\n            }\n        ;\n        ;\n            return ra.getAttribute(\"data-side\");\n        };\n    ;\n        var ia = function(ra, sa) {\n            if (((p.ie() <= 6))) {\n                ia = function(ta, ua) {\n                    i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                    ta.setAttribute(\"data-side\", ua);\n                    h.removeClass(ta, \"leftColumn\");\n                    h.removeClass(ta, \"rightColumn\");\n                    h.addClass(ta, ((((ua == \"l\")) ? \"leftColumn\" : \"rightColumn\")));\n                };\n            }\n             else ia = function(ta, ua) {\n                i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                ta.setAttribute(\"data-side\", ua);\n            };\n        ;\n        ;\n            ia(ra, sa);\n        };\n        function ja(ra) {\n            return ra.getAttribute(\"data-size\");\n        };\n    ;\n        function ka(ra) {\n            if (((((h.hasClass(ra, \"fbTimelineOneColumn\") && ra.prevSibling)) && h.hasClass(ra.prevSibling, \"fbTimelineOneColumn\")))) {\n                return ((z * 2));\n            }\n        ;\n        ;\n            if (h.hasClass(ra, \"fbTimelineIndeterminateContent\")) {\n                return 0;\n            }\n        ;\n        ;\n            return z;\n        };\n    ;\n        function la(ra, sa) {\n            var ta = 0;\n            if (((h.shown(ra) && !h.hasClass(ra, \"placeholderUnit\")))) {\n                if (((sa === aa))) {\n                    ta = i.get(n.DS_HEIGHT, ra.id, null);\n                    if (((ta === null))) {\n                        ta = ra.getAttribute(\"data-calculatedheight\");\n                    }\n                ;\n                ;\n                }\n                 else ta = ((ra.offsetHeight + ka(ra)));\n            ;\n            }\n        ;\n        ;\n            if (((((sa === aa)) && ((ta === null))))) {\n                ta = 300;\n            }\n        ;\n        ;\n            i.set(n.DS_HEIGHT, ra.id, parseInt(ta, 10));\n        };\n    ;\n        function ma(ra) {\n            var sa = i.get(n.DS_HEIGHT, ra.id, null);\n            return sa;\n        };\n    ;\n        function na(ra, sa) {\n            if (((ja(sa) == \"2\"))) {\n                return 0;\n            }\n             else if (((ha(sa) == \"r\"))) {\n                return ((ra + ma(sa)));\n            }\n             else return ((ra - ma(sa)))\n            \n        ;\n        };\n    ;\n        function oa(ra) {\n            k.scry(ra, \".-cx-PUBLIC-timelineOneColMin__endmarker\").forEach(function(sa) {\n                var ta = sa.getAttribute(\"data-endmarker\"), ua = sa.getAttribute(\"data-pageindex\"), va = function() {\n                    if (!sa.parentNode) {\n                        return;\n                    }\n                ;\n                ;\n                    i.set(n.DS_LOADED, ra.id, ua);\n                    j.remove(sa);\n                    g.inform(n.SECTION_FULLY_LOADED, {\n                        scrubberKey: ta,\n                        pageIndex: ua,\n                        capsuleID: ra.id,\n                        childCount: ra.childNodes.length\n                    });\n                };\n                if (o.get(ta)) {\n                    va();\n                }\n                 else var wa = g.subscribe(n.SECTION_REGISTERED, function(xa, ya) {\n                    if (((ya.scrubberKey === ta))) {\n                        va();\n                        wa.unsubscribe();\n                    }\n                ;\n                ;\n                })\n            ;\n            });\n            g.inform(\"TimelineCapsule/balanced\", {\n                capsule: ra\n            });\n        };\n    ;\n        function pa(ra) {\n            if (u(ca[ra.id])) {\n                return;\n            }\n        ;\n        ;\n            var sa = ((ea(ra) ? ra.firstChild : ra)), ta = sa.childNodes.length, ua = {\n            }, va = {\n            }, wa, xa = z, ya = z, za, ab = [];\n            for (var bb = 0; ((bb < ta)); bb++) {\n                wa = sa.childNodes[bb];\n                if (h.hasClass(wa, \"fbTimelineUnit\")) {\n                    za = k.scry(wa, \"div.timelineUnitContainer\")[0];\n                    if (za) {\n                        va[wa.id] = za.getAttribute(\"data-time\");\n                    }\n                ;\n                ;\n                    if (((!ga(wa) && h.shown(wa)))) {\n                        if (((ja(wa) == \"2\"))) {\n                            ua[wa.id] = Math.max(xa, ya);\n                            xa = ya = ((ua[wa.id] + ma(wa)));\n                        }\n                         else if (((ha(wa) == \"r\"))) {\n                            ua[wa.id] = ya;\n                            ya += ma(wa);\n                        }\n                         else {\n                            ua[wa.id] = xa;\n                            xa += ma(wa);\n                        }\n                        \n                    ;\n                    ;\n                        if (((((ha(wa, true) == \"l\")) || ((ja(wa) == \"2\"))))) {\n                            ab.push(wa.id);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            for (bb = 0; ((bb < ((ab.length - 1)))); ++bb) {\n                var cb = ab[bb], db = ab[((bb + 1))], eb = ((ua[cb] + y)), fb = ua[db];\n                {\n                    var fin195keys = ((window.top.JSBNG_Replay.forInKeys)((ca[ra.id]))), fin195i = (0);\n                    var gb;\n                    for (; (fin195i < fin195keys.length); (fin195i++)) {\n                        ((gb) = (fin195keys[fin195i]));\n                        {\n                            if (((eb > fb))) {\n                                break;\n                            }\n                        ;\n                        ;\n                            var hb = ca[ra.id][gb];\n                            if (h.shown(hb)) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            if (((((va[gb] <= va[cb])) && ((va[gb] > va[db]))))) {\n                                hb.style.JSBNG__top = ((eb + \"px\"));\n                                eb += y;\n                                h.show(hb);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n        };\n    ;\n        function qa(ra, sa) {\n            var ta = m.byAttribute(ra, \"data-size\");\n            if (ta) {\n                if (h.hasClass(ra.parentNode, \"timelineReportContent\")) {\n                    sa(ra);\n                }\n                 else sa(ta);\n            ;\n            ;\n                x.balanceCapsule(m.byClass(ta, \"fbTimelineCapsule\"));\n            }\n        ;\n        ;\n        };\n    ;\n        return {\n            removeUnit: function(ra) {\n                qa(ra, function(sa) {\n                    j.remove(sa);\n                });\n            },\n            hideUnit: function(ra) {\n                qa(ra, function(sa) {\n                    h.addClass(sa, \"fbTimelineColumnHidden\");\n                });\n            },\n            undoHideUnit: function(ra, sa) {\n                j.remove(m.byClass(sa, \"hiddenText\"));\n                qa(ra, function(ta) {\n                    h.removeClass(ta, \"fbTimelineColumnHidden\");\n                });\n            },\n            unplacehold: function(ra) {\n                var sa = r(ra);\n                sa.style.JSBNG__top = null;\n                h.removeClass(sa, \"visiblePlaceholder\");\n                h.removeClass(sa, \"placeholder\");\n                var ta = m.byClass(sa, \"fbTimelineCapsule\");\n                delete ca[ta.id][ra];\n                x.balanceCapsule(ta);\n            },\n            scrollToCapsule: function(ra) {\n                if (!da.hasOwnProperty(ra.id)) {\n                    var sa = q.getElementPosition(ra.parentNode);\n                    l.JSBNG__scrollTo(new q(q.getScrollPosition().x, ((sa.y - n.SUBSECTION_SCROLL_TO_OFFSET)), \"JSBNG__document\"));\n                    da[ra.id] = true;\n                }\n            ;\n            ;\n            },\n            balanceCapsuleFromChild: function(ra, sa) {\n                x.balanceCapsule(m.byClass(ra, \"fbTimelineCapsule\"), sa);\n            },\n            balanceCapsuleDeferred: function(ra, sa) {\n                x.balanceCapsule.curry(ra, sa).defer();\n            },\n            balanceCapsule: function(ra, sa) {\n                if (((!ra || !ra.childNodes))) {\n                    return;\n                }\n            ;\n            ;\n                var ta = 0, ua, va = JSBNG__document.createDocumentFragment(), wa = [], xa = [], ya = [], za = false, ab = ((sa && sa.heights_action));\n                if (((sa && sa.tail_balance))) {\n                    i.set(n.DS_TAILBALANCE, ra.id, sa.tail_balance);\n                }\n            ;\n            ;\n                if (((((ab !== ba)) && ((p.chrome() || p.webkit()))))) {\n                    h.toggleClass(ra, \"webkitFix\");\n                }\n            ;\n            ;\n                for (var bb = 0; ((bb < ra.childNodes.length)); bb++) {\n                    ua = ra.childNodes[bb];\n                    if (fa(ua)) {\n                        continue;\n                    }\n                     else if (ea(ua)) {\n                        s(ua.firstChild.childNodes).forEach(function(jb) {\n                            la(jb, ab);\n                        });\n                        continue;\n                    }\n                    \n                ;\n                ;\n                    la(ua, ab);\n                    if (((ha(ua, true) == \"r\"))) {\n                        xa.push(ua);\n                    }\n                     else wa.push(ua);\n                ;\n                ;\n                    ya.push(ua);\n                    if (((ja(ua) != \"2\"))) {\n                        if (((((((ta > 0)) && ((ha(ua) == \"r\")))) || ((((ta < 0)) && ((ha(ua) == \"l\"))))))) {\n                            za = true;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    ta = na(ta, ua);\n                };\n            ;\n                var cb = [], db = [], eb = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    var kb = s(jb.firstChild.childNodes);\n                    if (jb.getAttribute(\"data-nonunits\")) {\n                        eb = eb.concat(kb);\n                    }\n                     else if (((ha(jb) == \"left\"))) {\n                        cb = cb.concat(kb);\n                    }\n                     else if (((ha(jb) == \"right\"))) {\n                        db = db.concat(kb);\n                    }\n                    \n                    \n                ;\n                ;\n                });\n                if (za) {\n                    ra.style.minHeight = ra.offsetHeight;\n                    wa.forEach(function(jb) {\n                        if (((ja(jb) != \"2\"))) {\n                            ia(jb, \"l\");\n                        }\n                    ;\n                    ;\n                    });\n                    xa.forEach(function(jb) {\n                        if (((ja(jb) != \"2\"))) {\n                            ia(jb, \"r\");\n                        }\n                    ;\n                    ;\n                    });\n                    var fb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, wa));\n                    fb.setAttribute(\"data-side\", \"left\");\n                    j.prependContent(ra, fb);\n                    cb = wa.concat(cb);\n                    var gb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, xa));\n                    gb.setAttribute(\"data-side\", \"right\");\n                    j.prependContent(ra, gb);\n                    db = xa.concat(db);\n                    ta = 0;\n                }\n            ;\n            ;\n                while (eb.length) {\n                    va.appendChild(eb.shift());\n                ;\n                };\n            ;\n                while (((((((ta >= 0)) && cb.length)) || ((((ta < 0)) && db.length))))) {\n                    if (((ta >= 0))) {\n                        ua = cb.shift();\n                    }\n                     else ua = db.shift();\n                ;\n                ;\n                    va.appendChild(ua);\n                    ta = na(ta, ua);\n                };\n            ;\n                ra.appendChild(va);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    if (!jb.firstChild.childNodes.length) {\n                        j.remove(jb);\n                    }\n                ;\n                ;\n                });\n                var hb = ((((sa && sa.tail_balance)) || i.get(n.DS_TAILBALANCE, ra.id)));\n                if (hb) {\n                    ta = x.tailBalance(ra, ta, hb);\n                }\n            ;\n            ;\n                if (za) {\n                    ya.forEach(function(jb) {\n                        if (((jb.parentNode !== ra))) {\n                            ra.appendChild(jb);\n                            ta = na(ta, jb);\n                        }\n                    ;\n                    ;\n                    });\n                    ra.style.minHeight = null;\n                }\n            ;\n            ;\n                var ib = m.byClass(ra, \"fbTimelineSection\");\n                if (ib) {\n                    i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib.id, ta);\n                }\n            ;\n            ;\n                ca[ra.id] = {\n                };\n                k.scry(ra, \"li.placeholderUnit\").forEach(function(jb) {\n                    ca[ra.id][jb.id] = jb;\n                });\n                pa(ra);\n                oa(ra);\n                if (((ab === aa))) {\n                    sa.heights_action = ba;\n                    w(function() {\n                        w(x.balanceCapsule.curry(ra, sa));\n                    });\n                }\n            ;\n            ;\n            },\n            tailBalance: function(ra, sa, ta) {\n                if (!ra) {\n                    return sa;\n                }\n            ;\n            ;\n                var ua = [], va = [], wa = [], xa = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    var ab = s(za.firstChild.childNodes);\n                    if (za.getAttribute(\"data-nonunits\")) {\n                        xa = xa.concat(ab);\n                    }\n                     else if (((ha(za) == \"left\"))) {\n                        va = va.concat(ab);\n                    }\n                     else if (((ha(za) == \"right\"))) {\n                        wa = wa.concat(ab);\n                    }\n                    \n                    \n                ;\n                ;\n                    ua = ua.concat(ab);\n                });\n                if (((((((ta == n.FIXED_SIDE_RIGHT)) && va.length)) || ((((ta == n.FIXED_SIDE_LEFT)) && wa.length))))) {\n                    return sa;\n                }\n            ;\n            ;\n                var ya = JSBNG__document.createDocumentFragment();\n                if (ua) {\n                    while (ua.length) {\n                        if (((ta != n.FIXED_SIDE_NONE))) {\n                            if (((ja(ua[0]) != \"2\"))) {\n                                if (((sa >= 0))) {\n                                    ia(ua[0], \"l\");\n                                }\n                                 else ia(ua[0], \"r\");\n                            ;\n                            }\n                        ;\n                        }\n                    ;\n                    ;\n                        sa = na(sa, ua[0]);\n                        ya.appendChild(ua.shift());\n                    };\n                }\n            ;\n            ;\n                ra.appendChild(ya);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    if (!za.firstChild.childNodes.length) {\n                        j.remove(za);\n                    }\n                ;\n                ;\n                });\n                return sa;\n            },\n            loadTwoColumnUnits: function(ra) {\n                var sa = r(ra);\n                v(function() {\n                    var ta = m.byClass(sa, \"fbTimelineSection\");\n                    if (ta) {\n                        var ua = k.JSBNG__find(sa, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\"), va = k.JSBNG__find(sa, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\"), wa = ((va.offsetHeight - ua.offsetHeight));\n                        i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ta.id, wa);\n                    }\n                ;\n                ;\n                }, oa.curry(sa));\n            }\n        };\n    })();\n    e.exports = ((a.TimelineCapsule || x));\n});\n__d(\"TimelineCapsuleUtilities\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = {\n        setFirstUnit: function(i) {\n            var j = true;\n            for (var k = 0; ((k < i.childNodes.length)); ++k) {\n                var l = i.childNodes[k];\n                if (((l.id.indexOf(\"tl_unit_\") === 0))) {\n                    if (j) {\n                        j = false;\n                        g.addClass(l, \"firstUnit\");\n                    }\n                     else {\n                        g.removeClass(l, \"firstUnit\");\n                        break;\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineUnitSelector\", [\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Parent\"), i = {\n        getUnitsWithTime: function(j) {\n            return g.scry(j, \"div.timelineUnitContainer\").filter(function(k) {\n                return ((((h.byClass(k, \"fbTimelineCapsule\") === j)) && k.getAttribute(\"data-time\")));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"TimelineComposerUtilities\", [\"JSBNG__Event\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineUnitSelector\",\"Vector\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"TimelineUnitSelector\"), o = b(\"Vector\"), p = b(\"cx\"), q = b(\"csx\"), r = ((86400 * 31)), s = 86400000, t = {\n        listenToSetEstimatedDate: function(u, v) {\n            return h.subscribe(\"ComposerXTimelineTagger/init\", function(w, x) {\n                if (l.contains(u, x.datePickerElement)) {\n                    t.setEstimatedDate(x.datePickerInstance, v());\n                    x.composerTimelineTagger.switchToTagger(\"date\");\n                }\n            ;\n            ;\n            });\n        },\n        listenToSetEstimatedDateOld: function(u, v) {\n            return h.subscribe(\"TimelineBackdatedComposerTagger/initialized\", function(JSBNG__event, w) {\n                if (((w.composer === u))) {\n                    w.date_picker.subscribe(\"initialized\", function(x, y) {\n                        t.setEstimatedDate(y, v());\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        listenToPublish: function(u, v) {\n            if (u.root) {\n                u = u.root;\n            }\n        ;\n        ;\n            return h.subscribe(\"composer/publish\", function(JSBNG__event, w) {\n                if (((w.composer_id === u.id))) {\n                    i.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                        x.publish(w);\n                        ((v && v()));\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        listenToAnotherComposerOpen: function(u, v) {\n            return h.subscribe(\"composer/mutate\", function(w, x) {\n                if (((x !== u))) {\n                    v();\n                }\n            ;\n            ;\n            });\n        },\n        listenToCancel: function(u, v) {\n            return g.listen(u, \"click\", function(JSBNG__event) {\n                if (m.byClass(JSBNG__event.getTarget(), \"-cx-PRIVATE-fbTimelineComposer__cancelbutton\")) {\n                    v();\n                }\n            ;\n            ;\n            });\n        },\n        listenToCancelOld: function(u, v) {\n            return g.listen(u, \"click\", function(JSBNG__event) {\n                ((m.byClass(JSBNG__event.getTarget(), \"cancelBtn\") && v()));\n            });\n        },\n        hidePlaceIfAttachmentsTooTall: function(u) {\n            var v = l.JSBNG__find(u, \".-cx-PRIVATE-fbComposer__attachmentform\"), w = o.getElementDimensions(v).y;\n            if (((w > 50))) {\n                j.hide(l.JSBNG__find(v, \".-cx-PRIVATE-fbComposerAttachment__place\"));\n            }\n        ;\n        ;\n        },\n        hidePlaceIfAttachmentsTooTallOld: function(u) {\n            var v = k.JSBNG__find(u, \"ul.fbTimelineComposerAttachments\"), w = o.getElementDimensions(v).y;\n            if (((w > 50))) {\n                var x = m.byTag(k.scry(v, \"span.placeAttachment\")[0], \"li\");\n                ((x && j.hide(x)));\n            }\n        ;\n        ;\n        },\n        setEstimatedDate: function(u, v) {\n            var w, x;\n            if (((v && j.hasClass(v, \"fbTimelineCapsule\")))) {\n                w = v.getAttribute(\"data-start\");\n                x = v.getAttribute(\"data-end\");\n                if (((w && x))) {\n                    var y = new JSBNG__Date(((x * 1000))), z = new JSBNG__Date();\n                    if (((y > z))) {\n                        u.setDate(z.getFullYear(), ((z.getMonth() + 1)), z.getDate());\n                    }\n                     else if (((((x - w)) > ((2 * r))))) {\n                        u.setDate(y.getFullYear());\n                    }\n                     else u.setDate(y.getFullYear(), ((y.getMonth() + 1)));\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var aa = m.byClass(v, \"fbTimelineCapsule\");\n            if (aa) {\n                w = aa.getAttribute(\"data-start\");\n                x = aa.getAttribute(\"data-end\");\n                var ba = o.getElementPosition(v).y, ca = [x,null,], da = [w,null,], ea = n.getUnitsWithTime(aa);\n                for (var fa = 0; ((fa < ea.length)); fa++) {\n                    var ga = ea[fa], ha = k.scry(ga.parentNode, \".spinePointer\")[0];\n                    if (!ha) {\n                        continue;\n                    }\n                ;\n                ;\n                    var ia = o.getElementPosition(ha).y;\n                    if (((ia <= ba))) {\n                        if (((!ca[1] || ((ia > ca[1]))))) {\n                            ca = [ga.getAttribute(\"data-time\"),ia,];\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((!da[1] || ((ia < da[1]))))) {\n                        da = [ga.getAttribute(\"data-time\"),ia,];\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n                if (((((ca[0] !== null)) && ((da[0] !== null))))) {\n                    var ja = ((Math.round(((((parseInt(ca[0], 10) + parseInt(da[0], 10))) / 2))) * 1000));\n                    ja = Math.min(((new JSBNG__Date() - s)), ja);\n                    u.setDateWithTimestamp(ja);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        showMLEFlyout: function(u) {\n            var v = ((k.scry(JSBNG__document, \"a.fbTimelineSpine\").length === 0)), w = function(x) {\n                x.showMLEFlyout(u);\n            };\n            if (v) {\n                i.loadModules([\"TimelineSpinelessComposer\",], w);\n            }\n             else i.loadModules([\"TimelineComposer\",], w);\n        ;\n        ;\n        }\n    };\n    e.exports = t;\n});\n__d(\"TimelineComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineCapsule\",\"TimelineCapsuleUtilities\",\"TimelineComposerUtilities\",\"$\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineCapsule\"), n = b(\"TimelineCapsuleUtilities\"), o = b(\"TimelineComposerUtilities\"), p = b(\"$\"), q = b(\"cx\"), r;\n    function s(x) {\n        if (((x.isScheduledPost || x.isOGPost))) {\n            return;\n        }\n    ;\n    ;\n        if (!x.streamStory) {\n            window.JSBNG__location.reload();\n            return;\n        }\n    ;\n    ;\n        if (x.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(z) {\n                z.publish(x);\n            });\n            return;\n        }\n    ;\n    ;\n        var y = w.renderCapsuleBasedStory(r, x.streamStory);\n        g.inform(\"TimelineComposer/on_after_publish\", y, g.BEHAVIOR_PERSISTENT);\n    };\n;\n    function t() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\");\n        return j.JSBNG__find(x, \".spinePointer\");\n    };\n;\n    function u(x) {\n        var y = v();\n        i.show(y);\n        var z = x.subscribe(\"hide\", function() {\n            i.hide(y);\n            x.unsubscribe(z);\n        });\n    };\n;\n    function v() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\"), y = j.scry(x, \"div.composerVeil\");\n        if (((y.length !== 1))) {\n            y = j.appendContent(x, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        }\n    ;\n    ;\n        return y[0];\n    };\n;\n    var w = {\n        init: function(x) {\n            r = p(x);\n            var y = g.subscribe(\"composer/publish\", function(JSBNG__event, z) {\n                if (((z.composer_id === r.id))) {\n                    s(z);\n                }\n            ;\n            ;\n            });\n            l.onLeave(y.unsubscribe.bind(y));\n            if (i.hasClass(r, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                o.hidePlaceIfAttachmentsTooTall(r);\n            }\n             else o.hidePlaceIfAttachmentsTooTallOld(r);\n        ;\n        ;\n        },\n        showMLEFlyout: function(x) {\n            x.setContext(t()).show();\n            u(x);\n        },\n        renderCapsuleBasedStory: function(x, y) {\n            var z = k.byClass(x, \"fbTimelineCapsule\");\n            if (!z) {\n                return;\n            }\n        ;\n        ;\n            var aa = k.byClass(x, \"timelineUnitContainer\").parentNode;\n            if (aa.nextSibling.getAttribute(\"data-spine\")) {\n                aa = aa.nextSibling;\n            }\n        ;\n        ;\n            var ba = j.insertAfter(aa, y)[0];\n            h.loadModules([\"Animation\",], function(ca) {\n                new ca(ba.firstChild).from(\"backgroundColor\", \"#fff8dd\").to(\"backgroundColor\", \"#fff\").duration(2000).ease(ca.ease.both).go();\n            });\n            n.setFirstUnit(z);\n            m.balanceCapsule(z);\n            return ba;\n        }\n    };\n    e.exports = ((a.TimelineComposer || w));\n});\n__d(\"TimelineSmartInsert\", [\"Run\",\"UserAgent\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = b(\"UserAgent\"), i = b(\"Vector\"), j = 100;\n    function k(q) {\n        if (((q === \"viewport\"))) {\n            return i.getViewportDimensions().y;\n        }\n    ;\n    ;\n        return q;\n    };\n;\n    var l = false, m = false;\n    function n() {\n        if (m) {\n            return;\n        }\n    ;\n    ;\n        g.onLeave(o);\n        m = true;\n    };\n;\n    function o() {\n        l = false;\n        m = false;\n    };\n;\n    var p = {\n        run: function(q, r, s) {\n            n();\n            if (((!l || ((h.ie() <= 8))))) {\n                r();\n                return;\n            }\n        ;\n        ;\n            var t = q.offsetHeight;\n            r();\n            var u = q.offsetHeight, v = i.getScrollPosition().y, w = i.getElementPosition(q).y;\n            if (((((((u !== t)) && ((w < v)))) && ((((w + t)) < ((v + k(((s || j)))))))))) {\n                window.JSBNG__scrollBy(0, ((u - t)));\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            l = true;\n        }\n    };\n    e.exports = p;\n});\n__d(\"TimelineContentLoader\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMScroll\",\"OnVisible\",\"ScrollingPager\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"TimelineSmartInsert\",\"TimelineURI\",\"UIPagelet\",\"UserAgent\",\"Vector\",\"$\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"debounce\",\"ge\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMScroll\"), l = b(\"OnVisible\"), m = b(\"ScrollingPager\"), n = b(\"TimelineConstants\"), o = b(\"TimelineController\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineSmartInsert\"), r = b(\"TimelineURI\"), s = b(\"UIPagelet\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"$\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"createArrayFrom\"), z = b(\"csx\"), aa = b(\"debounce\"), ba = b(\"ge\"), ca = b(\"startsWith\"), da = b(\"tx\"), ea = b(\"userAction\"), fa = false, ga = false, ha, ia = null, ja = {\n    }, ka = [], la = [], ma = [], na = {\n    }, oa = {\n    }, pa = {\n    }, qa = {\n    }, ra = null, sa = null, ta = false, ua = null;\n    function va(eb, fb, gb, hb, ib) {\n        this.node = eb;\n        this.loaded = hb;\n        this.canScrollLoad = true;\n        this.canUnload = ((fb != db.RECENT));\n        this.scrubberKey = fb;\n        this.historicUnitCount = ib;\n        this._pageletLoadData = gb;\n        this._expandPageletLoadData = {\n        };\n        this.rightColumnFinished = false;\n    };\n;\n    x(va.prototype, {\n        load: function(eb, fb) {\n            if (this.loaded) {\n                return;\n            }\n        ;\n        ;\n            var gb = this._pageletLoadData;\n            h.inform(n.SECTION_LOADING, {\n                data: gb,\n                scrubberKey: this.scrubberKey\n            });\n            this.loaded = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            var hb = \"ProfileTimelineSectionPagelet\", ib = ((this.scrubberKey == db.WAY_BACK));\n            if (ib) {\n                hb = \"ProfileTimelineRemainingYearsPagelet\";\n            }\n        ;\n        ;\n            gb.time_cutoff = db.getTimeCutoff();\n            gb.highlight_unit_data = eb;\n            gb.parent_key = this.parentKey;\n            gb.force_no_friend_activity = ta;\n            i.addClass(this.node, \"fbTimelineSectionLoading\");\n            if (gb.combine_sections) {\n                i.addClass(this.node, \"combinedSections\");\n            }\n        ;\n        ;\n            if (((this.canUnload && ga))) {\n                var jb = this.node.firstChild.cloneNode(true);\n                i.hide(jb);\n                j.insertAfter(this.node, jb);\n            }\n             else this.canScrollLoad = false;\n        ;\n        ;\n            var kb = null;\n            if (((fb && !mb))) {\n                var lb = this.node;\n                lb.style.minHeight = ((window.JSBNG__innerHeight + \"px\"));\n                kb = function() {\n                    lb.style.minHeight = null;\n                };\n            }\n        ;\n        ;\n            var mb = ((gb.combine_sections && ib));\n            pa[this.scrubberKey] = s.loadFromEndpoint(hb, ((mb ? ((gb.unit_container_id + \"_left\")) : this.node.id)), gb, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true,\n                append: mb,\n                finallyHandler: kb\n            });\n            cb(this.scrubberKey);\n        },\n        preload: function() {\n            i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            var eb = j.JSBNG__find(this.node, \"span.sectionLabel\");\n            if (eb.getAttribute(\"data-original-label\")) {\n                j.setContent(eb, eb.getAttribute(\"data-original-label\"));\n                eb.removeAttribute(\"data-original-label\");\n            }\n        ;\n        ;\n        },\n        unload: function() {\n            if (((!this.loaded || !this.canUnload))) {\n                return;\n            }\n        ;\n        ;\n            this.loaded = false;\n            ((pa[this.scrubberKey] && pa[this.scrubberKey].cancel()));\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            if (((this.node.nextSibling && i.hasClass(this.node.nextSibling, \"fbTimelineSection\")))) {\n                j.setContent(this.node, this.node.nextSibling);\n                i.show(this.node.firstChild);\n            }\n             else j.empty(this.node);\n        ;\n        ;\n            this.deactivateScrollLoad();\n        },\n        activateScrollLoad: function() {\n            this.canScrollLoad = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            ((oa[this.scrubberKey] && oa[this.scrubberKey].reset()));\n        },\n        deactivateScrollLoad: function() {\n            if (!this.loaded) {\n                this.canScrollLoad = false;\n                i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n                i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n                ((oa[this.scrubberKey] && oa[this.scrubberKey].remove()));\n            }\n        ;\n        ;\n        },\n        setExpandLoadData: function(eb) {\n            this._expandPageletLoadData = eb;\n            return this;\n        },\n        appendData: function(eb) {\n            x(this._pageleLoadData, eb);\n            return this;\n        },\n        expandSubSections: function() {\n            if (this.subSections.length) {\n                db.navigateToSection(this.subSections[0].scrubberKey);\n            }\n        ;\n        ;\n        },\n        expand: function(eb) {\n            if (!this.loaded) {\n                return;\n            }\n        ;\n        ;\n            sa.add_event(((\"expand_\" + this.scrubberKey)));\n            var fb = j.JSBNG__find(this.node, \".fbTimelineSectionExpander\");\n            i.addClass(fb.firstChild, \"async_saving\");\n            ((eb && i.addClass(eb, \"async_saving\")));\n            this._expandPageletLoadData.time_cutoff = db.getTimeCutoff();\n            db.navigateToSection(this.scrubberKey);\n            j.scry(this.node, \".fbTimelineCapsule\").forEach(j.remove);\n            this._expandPageletLoadData.new_expand = true;\n            ((pa[this.scrubberKey] && pa[this.scrubberKey].cancel()));\n            pa[this.scrubberKey] = s.loadFromEndpoint(\"ProfileTimelineSectionPagelet\", fb.id, this._expandPageletLoadData, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true\n            });\n        },\n        isPermalinkPeriod: function() {\n            return this._pageletLoadData.is_permalink_period;\n        }\n    });\n    function wa() {\n        if (fa) {\n            return;\n        }\n    ;\n    ;\n        o.register(o.CONTENT, db);\n        sa = ea(\"timeline\").uai(\"init\", \"scrubber\", false);\n        fa = true;\n        if (((t.ie() <= 7))) {\n            ga = true;\n        }\n    ;\n    ;\n    };\n;\n    var xa = aa(function(eb, fb, gb) {\n        var hb = p.get(eb).historicUnitCount;\n        fb -= hb;\n        gb -= 1;\n        if (((((((hb == -1)) || ((gb <= 0)))) || ((fb < 0))))) {\n            return;\n        }\n    ;\n    ;\n        var ib = db.getNextSectionKey(eb);\n        if (ib) {\n            p.get(ib).load();\n            xa(ib, fb, gb);\n        }\n    ;\n    ;\n    }, 500);\n    function ya(eb, fb, gb, hb) {\n        var ib = db.getNextSectionKey(fb);\n        if (ib) {\n            oa[ib] = new l(eb, za.curry(ib, eb), false, ((gb || 1000)));\n        }\n         else if (((fb !== db.WAY_BACK))) {\n            hb = ((hb ? hb : 0));\n            if (((hb > 80))) {\n                return null;\n            }\n        ;\n        ;\n            ya.curry(eb, fb, gb, ((hb + 1))).defer(250);\n        }\n        \n    ;\n    ;\n    };\n;\n    function za(eb, fb) {\n        var gb = p.get(eb);\n        if (((gb && gb.canScrollLoad))) {\n            sa.add_event(((\"scroll_load_\" + eb)));\n            if (ga) {\n                gb.preload();\n            }\n             else {\n                gb.load();\n                if (ua) {\n                    xa(eb, ua.required_units, ua.max_parallelism);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((fb && j.remove(fb)));\n        }\n    ;\n    ;\n    };\n;\n    function ab() {\n        var eb, fb, gb = false;\n        for (var hb = 0; ((hb < ka.length)); hb++) {\n            var ib = ka[hb];\n            if (!ib) {\n                continue;\n            }\n        ;\n        ;\n            var jb = p.get(ib);\n            if (((jb && ((jb.canScrollLoad || jb.loaded))))) {\n                if (!jb.loaded) {\n                    i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n                    i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n                }\n            ;\n            ;\n                if (((eb && fb))) {\n                    bb(eb, fb);\n                    if (gb) {\n                        eb.deactivateScrollLoad();\n                    }\n                ;\n                ;\n                    gb = true;\n                }\n            ;\n            ;\n                eb = null;\n                fb = null;\n                continue;\n            }\n             else if (eb) {\n                fb = jb;\n                jb.deactivateScrollLoad();\n            }\n             else {\n                eb = jb;\n                if (gb) {\n                    jb.activateScrollLoad();\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n        };\n    ;\n    };\n;\n    function bb(eb, fb) {\n        i.removeClass(fb.node, \"fbTimelineTimePeriodUnexpanded\");\n        i.addClass(fb.node, \"fbTimelineTimePeriodSuppressed\");\n        var gb = j.JSBNG__find(eb.node, \"span.sectionLabel\"), hb = j.JSBNG__find(fb.node, \"span.sectionLabel\");\n        if (!hb.getAttribute(\"data-original-label\")) {\n            hb.setAttribute(\"data-original-label\", j.getText(hb));\n        }\n    ;\n    ;\n        if (((((gb.getAttribute(\"data-month\") && hb.getAttribute(\"data-month\"))) && ((gb.getAttribute(\"data-year\") == hb.getAttribute(\"data-year\")))))) {\n            j.setContent(hb, da._(\"Show {month1} - {month2} {year}\", {\n                month1: hb.getAttribute(\"data-month\"),\n                month2: gb.getAttribute(\"data-month\"),\n                year: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else if (((gb.getAttribute(\"data-year\") !== hb.getAttribute(\"data-year\")))) {\n            j.setContent(hb, da._(\"Show {year1} - {year2}\", {\n                year1: hb.getAttribute(\"data-year\"),\n                year2: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else j.setContent(hb, da._(\"Show {year}\", {\n            year: hb.getAttribute(\"data-year\")\n        }));\n        \n    ;\n    ;\n    };\n;\n    function cb(eb) {\n        if (ga) {\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                }\n            ;\n            ;\n                if (((gb != eb))) {\n                    var hb = p.get(gb);\n                    if (((hb.loaded && hb.canUnload))) {\n                        hb.unload();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        ab();\n    };\n;\n    var db = {\n        WAY_BACK: \"way_back\",\n        RECENT: \"recent\",\n        HEADER_SCROLL_CUTOFF: 80,\n        CURRENT_SECTION_OFFSET: 150,\n        FOOTER_HEIGHT: 60,\n        registerTimePeriod: function(eb, fb, gb, hb, ib, jb, kb) {\n            wa();\n            if (w(ma, fb)) {\n                return;\n            }\n        ;\n        ;\n            if (la) {\n                x(gb, la);\n            }\n        ;\n        ;\n            var lb = new va(eb, fb, gb, hb, kb);\n            if (!ib) {\n                ka[jb] = fb;\n                ja[fb] = true;\n            }\n             else {\n                lb.parentKey = ib;\n                p.get(ib).subSections = ((p.get(ib).subSections || []));\n                p.get(ib).subSections[jb] = lb;\n            }\n        ;\n        ;\n            p.set(fb, lb);\n            db.checkCurrentSectionChange();\n            h.inform(n.SECTION_REGISTERED, {\n                scrubberKey: fb\n            });\n        },\n        reset: function() {\n            {\n                var fin196keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin196i = (0);\n                var eb;\n                for (; (fin196i < fin196keys.length); (fin196i++)) {\n                    ((eb) = (fin196keys[fin196i]));\n                    {\n                        oa[eb].remove();\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin197keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin197i = (0);\n                var fb;\n                for (; (fin197i < fin197keys.length); (fin197i++)) {\n                    ((fb) = (fin197keys[fin197i]));\n                    {\n                        ((pa[fb] && pa[fb].cancel()));\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin198keys = ((window.top.JSBNG_Replay.forInKeys)((qa))), fin198i = (0);\n                var gb;\n                for (; (fin198i < fin198keys.length); (fin198i++)) {\n                    ((gb) = (fin198keys[fin198i]));\n                    {\n                        qa[gb].unsubscribe();\n                        delete qa[gb];\n                    };\n                };\n            };\n        ;\n            ((ha && ha.unsubscribe()));\n            ha = null;\n            p.removeAll();\n            ia = null;\n            ja = {\n            };\n            ka = [];\n            la = [];\n            ma = [];\n            na = {\n            };\n            oa = {\n            };\n            pa = {\n            };\n            ra = null;\n            sa = null;\n            ta = false;\n            fa = false;\n        },\n        checkCurrentSectionChange: function() {\n            var eb = db.getCurrentSection(), fb = ((ia && ia.scrubberKey));\n            if (((((eb && ((eb.scrubberKey !== fb)))) && !eb.isPermalinkPeriod()))) {\n                ia = eb;\n                var gb = eb.scrubberKey, hb = eb.parentKey;\n                if (!hb) {\n                    hb = gb;\n                    gb = null;\n                }\n            ;\n            ;\n                o.sectionHasChanged(hb, gb);\n            }\n        ;\n        ;\n        },\n        setTimeCutoff: function(eb) {\n            ra = eb;\n        },\n        getTimeCutoff: function() {\n            return ra;\n        },\n        setParallelLoadConfig: function(eb) {\n            ua = eb;\n        },\n        getCurrentSection: function() {\n            var eb = {\n            }, fb = p.getAll();\n            {\n                var fin199keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin199i = (0);\n                var gb;\n                for (; (fin199i < fin199keys.length); (fin199i++)) {\n                    ((gb) = (fin199keys[fin199i]));\n                    {\n                        var hb = fb[gb];\n                        if (((!hb.loaded || na[hb.scrubberKey]))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var ib = u.getElementPosition(hb.node, \"viewport\").y;\n                        if (((hb.scrubberKey == \"recent\"))) {\n                            ib--;\n                        }\n                    ;\n                    ;\n                        if (((ib < db.CURRENT_SECTION_OFFSET))) {\n                            eb[ib] = hb;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var jb = Math.max.apply(null, Object.keys(eb)), kb = ((jb == -Infinity));\n            if (!kb) {\n                return eb[jb];\n            }\n             else if (ka[0]) {\n                return p.get(ka[0]);\n            }\n            \n        ;\n        ;\n            return null;\n        },\n        capsuleForCurrentSection: function() {\n            var eb = db.getCurrentSection();\n            return ((eb && j.scry(eb.node, \".fbTimelineCapsule\")[0]));\n        },\n        enableScrollLoad: function(eb, fb, gb, hb) {\n            eb = v(eb);\n            var ib = j.scry(eb.parentNode, \".fbTimelineCapsule\")[0];\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            if (((gb === null))) {\n                ya(eb, fb, hb);\n            }\n             else o.runOnceWhenSectionFullyLoaded(ya.curry(eb, fb, hb), fb, gb);\n        ;\n        ;\n        },\n        enableScrollLoadOnClick: function(eb, fb, gb) {\n            eb = v(eb);\n            g.listen(eb, \"click\", function(hb) {\n                hb.prevent();\n                db.enableScrollLoad(eb, fb, null, gb);\n            });\n        },\n        expandSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expand();\n            });\n        },\n        expandSubSectionsOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expandSubSections();\n            });\n        },\n        getNextSectionKey: function(eb) {\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                if (((ka[fb] == eb))) {\n                    while (((((fb < ((ka.length - 1)))) && !ka[((fb + 1))]))) {\n                        fb++;\n                    ;\n                    };\n                ;\n                    return ka[((fb + 1))];\n                }\n            ;\n            ;\n            };\n        ;\n            var gb = p.get(eb);\n            if (((!gb || !gb.parentKey))) {\n                return;\n            }\n        ;\n        ;\n            var hb = p.get(gb.parentKey);\n            if (!hb) {\n                return;\n            }\n        ;\n        ;\n            for (var ib = 0; ((ib < ((hb.subSections.length - 1)))); ib++) {\n                if (((hb.subSections[ib].scrubberKey == eb))) {\n                    return hb.subSections[((ib + 1))].scrubberKey;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        hideSection: function(eb) {\n            var fb = p.get(eb);\n            ((fb && i.hide(j.JSBNG__find(fb.node, \".fbTimelineSection\"))));\n            var gb = o.getCurrentScrubber();\n            if (gb) {\n                var hb = o.getCurrentScrubber().getNav(eb);\n                ((hb && i.hide(hb)));\n            }\n        ;\n        ;\n            var ib = o.getCurrentStickyHeaderNav();\n            ((ib && ib.removeTimePeriod(eb)));\n            na[eb] = true;\n        },\n        loadSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).load();\n            });\n        },\n        removeSection: function(eb) {\n            {\n                var fin200keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin200i = (0);\n                var fb;\n                for (; (fin200i < fin200keys.length); (fin200i++)) {\n                    ((fb) = (fin200keys[fin200i]));\n                    {\n                        if (((ka[fb] == eb))) {\n                            ka[fb] = null;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            p.remove(eb);\n            delete ja[eb];\n            if (((eb in oa))) {\n                oa[eb].remove();\n                delete oa[eb];\n            }\n        ;\n        ;\n            var gb = o.getCurrentStickyHeaderNav();\n            ((gb && gb.removeTimePeriod(eb)));\n            ma.push(eb);\n        },\n        removeSectionParent: function(eb) {\n            j.remove(v(eb).parentNode);\n        },\n        navigateToSection: function(eb, fb, gb) {\n            sa.add_event(((\"nav_\" + eb)));\n            fb = !!fb;\n            var hb = eb, ib = p.get(eb);\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            if (!ib.loaded) {\n                q.enable();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineShowOlderSections\").forEach(j.remove);\n            }\n        ;\n        ;\n            if (!ja[eb]) {\n                ib.node.style.minHeight = ((u.getViewportDimensions().y + \"px\"));\n                var jb = h.subscribe(n.SECTION_FULLY_LOADED, function(rb, sb) {\n                    if (((sb.scrubberKey === eb))) {\n                        ib.node.style.minHeight = \"\";\n                        jb.unsubscribe();\n                    }\n                ;\n                ;\n                });\n                hb = ib.parentKey;\n                var kb = p.get(hb).node;\n                if (!i.hasClass(kb, \"fbTimelineSectionExpanded\")) {\n                    k.JSBNG__scrollTo(kb, 0);\n                    i.addClass(kb, \"fbTimelineSectionExpanded\");\n                    j.scry(kb, \".fbTimelineCapsule\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineSectionExpandPager\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineContentHeader\").forEach(j.remove);\n                    j.scry(kb, \".-cx-PRIVATE-fbTimelineOneColumnHeader__header\").forEach(function(rb) {\n                        if (!rb.getAttribute(\"data-subsection\")) {\n                            j.remove(rb);\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                var lb = db.getNextSectionKey(hb);\n                if (((lb && oa[lb]))) {\n                    oa[lb].setBuffer(0);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            for (var mb = 0; ((mb < ka.length)); mb++) {\n                var nb = ka[mb];\n                if (!nb) {\n                    continue;\n                }\n            ;\n            ;\n                if (((nb == hb))) {\n                    break;\n                }\n            ;\n            ;\n                p.get(nb).deactivateScrollLoad();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineSectionExpandPager\").forEach(function(rb) {\n                    var sb = m.getInstance(rb.id);\n                    ((sb && sb.removeOnVisible()));\n                });\n            };\n        ;\n            db.adjustContentPadding();\n            ib.load(gb, true);\n            ab();\n            var ob = u.getScrollPosition().x, pb = u.getElementPosition(ib.node).y;\n            if (!fb) {\n                var qb = ((ja[eb] ? n.SCROLL_TO_OFFSET : n.SUBSECTION_SCROLL_TO_OFFSET));\n                k.JSBNG__scrollTo(new u(ob, ((pb - qb)), \"JSBNG__document\"), true, false, false, function() {\n                    var rb = u.getElementPosition(ib.node).y;\n                    k.JSBNG__scrollTo(new u(ob, ((rb - qb)), \"JSBNG__document\"), false);\n                    var sb = j.scry(ib.node, \"h3.uiHeaderTitle\")[0];\n                    if (sb) {\n                        sb.tabIndex = 0;\n                        sb.JSBNG__focus();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        },\n        adjustContentPadding: function() {\n            var eb = ba(\"timeline_tab_content\");\n            if (!eb) {\n                return;\n            }\n        ;\n        ;\n            if (o.isOneColumnMinimal()) {\n                return;\n            }\n        ;\n        ;\n            var fb = ((o.getCurrentKey() || r.TIMELINE_KEY));\n            if (((fb !== r.TIMELINE_KEY))) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((ka.length - 1)), hb = p.get(ka[gb]);\n            eb.style.paddingBottom = ((((hb && hb.loaded)) ? null : ((((((((u.getViewportDimensions().y - db.CURRENT_SECTION_OFFSET)) - db.HEADER_SCROLL_CUTOFF)) - db.FOOTER_HEIGHT)) + \"px\"))));\n        },\n        adjustContentPaddingAfterLoad: function(eb, fb) {\n            o.runOnceWhenSectionFullyLoaded(db.adjustContentPadding, eb, fb);\n        },\n        appendContentAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(j.appendContent.curry(v(eb), fb), gb, \"0\");\n        },\n        markSectionAsLoaded: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                ((ba(eb) && i.removeClass(v(eb).parentNode, \"fbTimelineSectionLoading\")));\n            }, fb, gb);\n        },\n        suppressSectionsAbove: function(eb) {\n            var fb, gb;\n            for (var hb = 0; ((hb < ka.length)); hb++) {\n                var ib = ka[hb];\n                if (!ib) {\n                    continue;\n                }\n            ;\n            ;\n                fb = p.get(ib).node;\n                gb = null;\n                if (((y(eb.parentNode.children).indexOf(eb) <= y(fb.parentNode.children).indexOf(fb)))) {\n                    gb = ib;\n                    break;\n                }\n            ;\n            ;\n                p.get(ib).deactivateScrollLoad();\n            };\n        ;\n            if (gb) {\n                db.navigateToSection(gb, true);\n            }\n        ;\n        ;\n        },\n        forceNoFriendActivity: function() {\n            ta = true;\n        },\n        removeDupes: function(eb) {\n            var fb = ba(eb);\n            if (!fb) {\n                return;\n            }\n        ;\n        ;\n            var gb = j.scry(fb, \"li.fbTimelineUnit\"), hb = {\n            };\n            for (var ib = 0; ((ib < gb.length)); ib++) {\n                var jb = gb[ib];\n                if (((jb.id && ca(jb.id, \"tl_unit_\")))) {\n                    var kb = jb.id.substring(8, jb.id.length), lb = ((((jb.getAttribute(\"data-unit\") == \"ExperienceSummaryUnit\")) ? jb.getAttribute(\"data-time\") : 1));\n                    if (((hb.hasOwnProperty(kb) && ((hb[kb] == lb))))) {\n                        jb.id = ((\"dupe_unit_\" + Math.JSBNG__random()));\n                        jb.className = \"hidden_elem\";\n                    }\n                     else hb[kb] = lb;\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        removeLoadingState: function(eb) {\n            ((ba(eb) && i.removeClass(v(eb), \"fbTimelineSectionLoading\")));\n        },\n        setExpandLoadDataForSection: function(eb, fb) {\n            var gb = p.get(eb);\n            ((gb && gb.setExpandLoadData(fb)));\n        },\n        appendSectionDataForAllSections: function(eb) {\n            la = eb;\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                }\n            ;\n            ;\n                var hb = p.get(gb);\n                ((hb && hb.appendData(eb)));\n            };\n        ;\n        },\n        updatePagerAfterLoad: function(eb, fb, gb, hb, ib) {\n            var jb = m.getInstance(eb.firstChild.id);\n            if (!jb) {\n                qa[eb.firstChild.id] = h.subscribe(m.REGISTERED, function(kb, lb) {\n                    qa[eb.firstChild.id].unsubscribe();\n                    delete qa[eb.firstChild.id];\n                    if (((lb.id === eb.firstChild.id))) {\n                        db.updatePagerAfterLoad(eb, fb, gb, hb, ib);\n                    }\n                ;\n                ;\n                });\n                return;\n            }\n        ;\n        ;\n            o.runOnceWhenSectionFullyLoaded(function() {\n                i.removeClass(eb, \"fbTimelineHiddenPager\");\n                jb.checkBuffer();\n            }, gb, hb);\n            if (ib) {\n                o.runOnceWhenSectionFullyLoaded(o.adjustScrollingPagerBuffer.curry(eb.firstChild.id, fb), gb, hb);\n            }\n        ;\n        ;\n        },\n        showAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                var hb = ba(eb);\n                ((hb && i.show(hb)));\n            }, fb, gb);\n        },\n        repositionDialog: function(eb) {\n            h.subscribe(n.SECTION_LOADED, function() {\n                eb.updatePosition();\n            });\n        },\n        rightColumnFinished: function(eb) {\n            var fb = p.get(eb);\n            fb.rightColumnFinished = true;\n        },\n        registerUnrankedGroup: function(eb) {\n            g.listen(eb, \"click\", function(JSBNG__event) {\n                var fb = j.JSBNG__find(eb, \".unranked_group_placeholder\");\n                if (((JSBNG__event.getTarget() !== fb))) {\n                    return JSBNG__event.prevent();\n                }\n            ;\n            ;\n                j.remove(fb);\n                i.removeClass(j.JSBNG__find(eb, \".unranked_group_units\"), \"hidden_elem\");\n                return true;\n            });\n        }\n    };\n    e.exports = db;\n});\n__d(\"TimelineLogging\", [\"TimelineController\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"TimelineController\"), h = b(\"reportData\"), i = false, j = 0, k = null, l = null, m = {\n        init: function(n) {\n            if (i) {\n                return;\n            }\n        ;\n        ;\n            j = n;\n            g.register(g.LOGGING, this);\n        },\n        reset: function() {\n            i = false;\n            j = 0;\n            k = null;\n        },\n        log: function(n, o) {\n            o.profile_id = j;\n            h(n, {\n                gt: o\n            });\n        },\n        logSectionChange: function(n, o) {\n            var p = {\n                timeline_section_change: 1,\n                key: n\n            };\n            if (((k && ((n == k))))) {\n                p.timeline_scrubber = 1;\n                k = null;\n            }\n        ;\n        ;\n            if (((l && ((n == l))))) {\n                p.sticky_header_nav = 1;\n                l = null;\n            }\n        ;\n        ;\n            m.log(\"timeline\", p);\n        },\n        logScrubberClick: function(n) {\n            k = n;\n        },\n        logStickyHeaderNavClick: function(n) {\n            l = n;\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineSideAds\", [\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"EgoAdsObjectSet\",\"JSBNG__Event\",\"StickyController\",\"TimelineConstants\",\"TimelineController\",\"UIPagelet\",\"URI\",\"Vector\",\"cx\",\"csx\",\"debounce\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"EgoAdsObjectSet\"), k = b(\"JSBNG__Event\"), l = b(\"StickyController\"), m = b(\"TimelineConstants\"), n = b(\"TimelineController\"), o = b(\"UIPagelet\"), p = b(\"URI\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"debounce\"), u = b(\"ge\"), v = 3, w = 4, x = 75, y = \"data-height\", z = 30000, aa = 0, ba = false, ca, da, ea, fa, ga, ha = new j(), ia, ja = false, ka, la = Infinity, ma = 5, na = false, oa, pa, qa, ra, sa, ta, ua = false, va = [], wa;\n    function xa(ub, vb, wb) {\n        var xb = 0;\n        if (vb) {\n            xb += vb.getHeight();\n        }\n    ;\n    ;\n        if (((!cb() && !xb))) {\n            return;\n        }\n    ;\n    ;\n        ub -= xb;\n        var yb = 0;\n        for (var zb = 0; ((zb < wb)); zb++) {\n            yb += lb(zb);\n        ;\n        };\n    ;\n        if (vb) {\n            if (((ub < yb))) {\n                ub += vb.fold(((yb - ub)));\n            }\n             else if (((ub > yb))) {\n                ub -= vb.unfold(((ub - yb)));\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return ub;\n    };\n;\n    function ya() {\n        var ub = da.cloneNode(true);\n        ub.id = \"\";\n        var vb = new j();\n        vb.init(i.scry(ub, \"div.ego_unit\"));\n        var wb = true;\n        vb.forEach(function(xb) {\n            if (wb) {\n                wb = false;\n            }\n             else i.remove(xb);\n        ;\n        ;\n        });\n        h.addClass(ub, \"fixed_elem\");\n        return ub;\n    };\n;\n    function za() {\n        ga = undefined;\n        if (!n.pageHasScrubber(ia)) {\n            db(ma);\n            gb();\n        }\n         else if (pa) {\n            eb(da, false);\n            var ub = qa;\n            ((qa && i.remove(qa)));\n            qa = ya();\n            if (ub) {\n                rb();\n            }\n        ;\n        ;\n            db(((((n.sidebarInitialized() && ja)) ? w : v)));\n            gb();\n            if (!ka) {\n                var vb = n.getCurrentScrubber();\n                if (vb) {\n                    qb(vb.getRoot(), vb.getOffset());\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((ka && ka.start()));\n        }\n         else tb.adjustAdsToFit();\n        \n    ;\n    ;\n    };\n;\n    function ab() {\n        if (qa) {\n            i.remove(qa);\n            qa = null;\n        }\n    ;\n    ;\n        if (ka) {\n            ka.JSBNG__stop();\n            ka = null;\n        }\n    ;\n    ;\n        if (cb()) {\n            h.conditionClass(da, \"fixed_elem\", !pa);\n            h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__topaligned\", !n.pageHasScrubber(ia));\n        }\n         else h.conditionClass(da, \"fixed_elem\", ((!pa && n.pageHasScrubber(ia))));\n    ;\n    ;\n    };\n;\n    function bb(ub) {\n        var vb = q.getViewportDimensions().y, wb = n.getCurrentScrubber(), xb = ((wb ? wb.getOffset() : m.SCRUBBER_DEFAULT_OFFSET)), yb = ((((vb - xb)) - x));\n        if (((wb || cb()))) {\n            return xa(yb, wb, ub);\n        }\n    ;\n    ;\n    };\n;\n    function cb() {\n        return n.fixedAds();\n    };\n;\n    function db(ub) {\n        fa = Math.min(ub, ha.getCount());\n        ha.forEach(function(vb, wb) {\n            eb(vb, ((wb >= fa)));\n        });\n        eb(da, ((fa === 0)));\n    };\n;\n    function eb(ub, vb) {\n        h.conditionClass(ub, \"-cx-PRIVATE-fbTimelineStyleAds__offscreen\", vb);\n        ub.setAttribute(\"aria-hidden\", ((vb ? \"true\" : \"false\")));\n    };\n;\n    function fb(ub) {\n        var vb = i.JSBNG__find(ha.getUnit(ub), \"div.-cx-PUBLIC-fbAdUnit__root\"), wb = vb.getAttribute(\"data-ad\");\n        return JSON.parse(wb).adid;\n    };\n;\n    function gb() {\n        ib();\n        hb();\n    };\n;\n    function hb() {\n        var ub;\n        if (((ga !== undefined))) {\n            ub = ha.getHoldoutAdIDsForSpace(ga, mb);\n        }\n         else ub = ha.getHoldoutAdIDsForNumAds(fa);\n    ;\n    ;\n        if (ub) {\n            ub.forEach(jb);\n        }\n    ;\n    ;\n    };\n;\n    function ib() {\n        if (!ra) {\n            return;\n        }\n    ;\n    ;\n        for (var ub = ((fa - 1)); ((ub >= 0)); --ub) {\n            if (((((ka && ka.isFixed())) && ((((ub !== 0)) || ((qa && !h.shown(qa)))))))) {\n                continue;\n            }\n        ;\n        ;\n            var vb = fb(ub);\n            if (!ra[vb]) {\n                return;\n            }\n        ;\n        ;\n            jb(vb);\n        };\n    ;\n    };\n;\n    function jb(ub) {\n        if (!ra[ub]) {\n            return;\n        }\n    ;\n    ;\n        var vb = i.create(\"div\", {\n            src: p(\"/ai.php\").addQueryData({\n                aed: ra[ub]\n            }),\n            width: 0,\n            height: 0,\n            frameborder: 0,\n            scrolling: \"no\",\n            className: \"fbEmuTracking\"\n        });\n        vb.setAttribute(\"aria-hidden\", \"true\");\n        i.appendContent(da, vb);\n        delete ra[ub];\n    };\n;\n    function kb(ub) {\n        var vb = 0;\n        while (((((ub > 0)) && ((vb < ma))))) {\n            ub -= lb(vb);\n            if (((ub >= 0))) {\n                vb++;\n            }\n        ;\n        ;\n        };\n    ;\n        return vb;\n    };\n;\n    function lb(ub) {\n        var vb = ha.getUnit(ub);\n        if (!vb) {\n            return 0;\n        }\n    ;\n    ;\n        return mb(vb);\n    };\n;\n    function mb(ub) {\n        if (!ub.getAttribute(y)) {\n            nb(ub);\n        }\n    ;\n    ;\n        return parseInt(ub.getAttribute(y), 10);\n    };\n;\n    function nb(ub) {\n        ub.setAttribute(y, ub.offsetHeight);\n    };\n;\n    function ob() {\n        for (var ub = 0; ((ub < ha.getCount())); ub++) {\n            var vb = ha.getUnit(ub);\n            if (!vb) {\n                continue;\n            }\n        ;\n        ;\n            nb(vb);\n        };\n    ;\n    };\n;\n    function pb() {\n        var ub = i.scry(da, \"div.ego_unit\");\n        ha.init(ub);\n        var vb = ub.length;\n        if (!vb) {\n            return;\n        }\n    ;\n    ;\n        h.addClass(ha.getUnit(0), \"ego_unit_no_top_border\");\n        na = vb;\n        za();\n        var wb = function(xb) {\n            nb(xb);\n            na = --vb;\n            tb.adjustAdsToFit();\n            if (!na) {\n                la = JSBNG__Date.now();\n            }\n        ;\n        ;\n        };\n        ub.forEach(function(xb) {\n            function yb() {\n                wb.curry(xb).defer();\n            };\n        ;\n            var zb = i.scry(xb, \"img.img\")[0];\n            if (!zb) {\n                return;\n            }\n        ;\n        ;\n            if (zb.complete) {\n                yb();\n            }\n             else k.listen(zb, {\n                load: yb,\n                error: yb,\n                abort: yb\n            });\n        ;\n        ;\n        });\n    };\n;\n    function qb(ub, vb) {\n        ka = new l(ub, vb, function(wb) {\n            if (wb) {\n                rb();\n            }\n             else {\n                i.remove(qa);\n                gb();\n            }\n        ;\n        ;\n        });\n        if (qa) {\n            ka.start();\n        }\n    ;\n    ;\n    };\n;\n    function rb() {\n        i.insertAfter(da, qa);\n        sb();\n    };\n;\n    function sb() {\n        h.conditionShow(qa, ((((lb(0) <= bb(1))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))));\n    };\n;\n    var tb = {\n        init: function(ub, vb, wb) {\n            if (ba) {\n                return;\n            }\n        ;\n        ;\n            ma = wb.max_ads;\n            ca = wb.refresh_delay;\n            z = wb.refresh_threshold;\n            ba = true;\n            ea = vb;\n            da = ub;\n            tb.adjustAdsType(n.shouldShowWideAds());\n            sa = g.subscribe([\"UFI/CommentAddedActive\",\"UFI/CommentDeletedActive\",\"UFI/LikeActive\",\"Curation/Action\",\"ProfileBrowser/LoadMoreContent\",\"Ads/NewContentDisplayed\",], tb.loadAdsIfEnoughTimePassed);\n            ta = g.subscribe(\"TimelineSideAds/refresh\", tb.forceReloadAds);\n            wa = t(tb.loadAdsIfEnoughTimePassed, ca, this, true);\n            if (wb.mouse_move) {\n                va.push(k.listen(window, \"mousemove\", wa));\n                va.push(k.listen(window, \"JSBNG__scroll\", wa));\n                va.push(k.listen(window, \"resize\", wa));\n            }\n        ;\n        ;\n            n.register(n.ADS, tb);\n        },\n        setShortMode: function(ub) {\n            pa = ub;\n        },\n        start: function(ub) {\n            ra = ub;\n            oa = null;\n            pb();\n        },\n        updateCurrentKey: function(ub) {\n            if (((ub == ia))) {\n                return;\n            }\n        ;\n        ;\n            ia = ub;\n            ab();\n        },\n        loadAds: function(ub) {\n            if (((na || oa))) {\n                return;\n            }\n        ;\n        ;\n            la = Infinity;\n            oa = o.loadFromEndpoint(\"WebEgoPane\", da.id, {\n                pid: 33,\n                data: [ea,((\"timeline_\" + ub)),((pa ? w : ma)),++aa,false,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        registerScrubber: function(ub) {\n            if (pa) {\n                qb(ub.getRoot(), ub.getOffset());\n            }\n        ;\n        ;\n            ((!oa && tb.adjustAdsToFit()));\n        },\n        loadAdsIfEnoughTimePassed: function() {\n            if (((((((((z && ((((JSBNG__Date.now() - la)) >= z)))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))) && ((!ka || ka.isFixed())))) && ((!ra || !ra[fb(0)]))))) {\n                tb.loadAds(ia);\n            }\n        ;\n        ;\n            tb.adjustAdsToFit();\n        },\n        forceReloadAds: function() {\n            tb.loadAds(ia);\n        },\n        adjustAdsType: function(ub) {\n            if (((ub != ja))) {\n                h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub);\n                h.conditionClass(da, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub);\n                ((qa && h.conditionClass(qa, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub)));\n                ((qa && h.conditionClass(qa, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub)));\n                ja = ub;\n                ob();\n                tb.adjustAdsToFit();\n                var vb = u(\"rightColContent\");\n                if (vb) {\n                    h.conditionClass(vb, \"fbTimelineWideRightCol\", ub);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        adjustAdsToFit: function() {\n            if (((!da || ua))) {\n                return;\n            }\n        ;\n        ;\n            ua = true;\n            var ub = ((ja ? w : v));\n            if (pa) {\n                if (((ka && qa))) {\n                    ka.handleScroll();\n                    if (ka.isFixed()) {\n                        h.conditionShow(qa, ((((lb(0) <= bb(1))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))));\n                    }\n                     else db(ub);\n                ;\n                ;\n                    gb();\n                }\n            ;\n            ;\n            }\n             else {\n                var vb = bb(ub);\n                if (((typeof vb !== \"undefined\"))) {\n                    ga = vb;\n                    db(kb(vb));\n                    if (!na) {\n                        gb();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ua = false;\n        },\n        reset: function() {\n            ((ka && ka.JSBNG__stop()));\n            ((oa && oa.cancel()));\n            ha = new j();\n            ja = false;\n            da = null;\n            ka = null;\n            oa = null;\n            aa = 0;\n            na = null;\n            pa = null;\n            qa = null;\n            ia = null;\n            la = Infinity;\n            ba = false;\n            ((sa && g.unsubscribe(sa)));\n            sa = null;\n            ((ta && g.unsubscribe(ta)));\n            ta = null;\n            va.forEach(function(ub) {\n                ub.remove();\n            });\n            va = [];\n            ((wa && wa.reset()));\n        }\n    };\n    e.exports = ((a.TimelineSideAds || tb));\n});\n__d(\"TimelineStickyHeader\", [\"Animation\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Style\",\"TimelineController\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"TimelineController\"), n = b(\"TimelineURI\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"$\"), r = b(\"ge\"), s = b(\"queryThenMutateDOM\"), t = 200, u = false, v = false, w, x, y, z, aa, ba, ca = {\n    }, da = {\n        VISIBLE: \"TimelineStickyHeader/visible\",\n        ADJUST_WIDTH: \"TimelineStickyHeader/adjustWidth\",\n        init: function(ea) {\n            if (u) {\n                return;\n            }\n        ;\n        ;\n            u = true;\n            w = ea;\n            x = k.JSBNG__find(ea, \"div.JSBNG__name\");\n            y = k.JSBNG__find(ea, \"div.actions\");\n            v = j.hasClass(ea, \"fbTimelineStickyHeaderVisible\");\n            var fa = q(\"blueBar\"), ga, ha = false;\n            s(function() {\n                if (((((fa.offsetTop && !r(\"page_admin_panel\"))) && ((m.getCurrentKey() !== n.TIMELINE_KEY))))) {\n                    ga = o.getElementDimensions(fa).y;\n                    ha = true;\n                }\n            ;\n            ;\n            }, function() {\n                if (ha) {\n                    i.loadModules([\"StickyController\",], function(ia) {\n                        new ia(ea, ga).start();\n                    });\n                }\n                 else j.addClass(ea, \"fixed_elem\");\n            ;\n            ;\n                s(function() {\n                    aa = ea.offsetTop;\n                    ba = ea.scrollHeight;\n                }, function() {\n                    z = p.addTop(function() {\n                        return ((v ? ((aa + ba)) : 0));\n                    });\n                }, \"TimelineStickyHeader/init\");\n                m.register(m.STICKY_HEADER, da);\n            }, \"TimelineStickyHeader/init\");\n        },\n        reset: function() {\n            u = false;\n            v = false;\n            w = null;\n            x = null;\n            y = null;\n            ca = {\n            };\n            z.remove();\n            z = null;\n        },\n        toggle: function(ea) {\n            if (((ea !== v))) {\n                var fa = ((ea ? ((aa - ba)) : aa)), ga = ((ea ? aa : ((aa - ba))));\n                l.set(w, \"JSBNG__top\", ((fa + \"px\")));\n                j.addClass(w, \"fbTimelineStickyHeaderAnimating\");\n                var ha = k.getID(w);\n                ((ca[ha] && ca[ha].JSBNG__stop()));\n                ca[ha] = new g(w).from(\"JSBNG__top\", fa).to(\"JSBNG__top\", ga).duration(t).ondone(function() {\n                    ca[ha] = null;\n                    j.conditionClass(w, \"fbTimelineStickyHeaderHidden\", !ea);\n                    w.setAttribute(\"aria-hidden\", ((ea ? \"false\" : \"true\")));\n                    j.removeClass(w, \"fbTimelineStickyHeaderAnimating\");\n                    l.set(w, \"JSBNG__top\", \"\");\n                    h.inform(da.VISIBLE, ea);\n                }).go();\n                v = ea;\n            }\n        ;\n        ;\n        },\n        adjustWidth: function() {\n            h.inform(da.ADJUST_WIDTH, x, h.BEHAVIOR_STATE);\n        },\n        getRoot: function() {\n            return w;\n        },\n        setActions: function(ea) {\n            if (((u && ea))) {\n                k.setContent(y, ea);\n                y = ea;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ((a.TimelineStickyHeader || da));\n});\n__d(\"ButtonGroup\", [\"function-extensions\",\"copyProperties\",\"createArrayFrom\",\"CSS\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = \"firstItem\", m = \"lastItem\";\n    function n(s, t) {\n        var u = k.byClass(s, t);\n        if (!u) {\n            throw new Error(\"invalid use case\");\n        }\n    ;\n    ;\n        return u;\n    };\n;\n    function o(s) {\n        return ((i.shown(s) && h(s.childNodes).some(i.shown)));\n    };\n;\n    function p(s) {\n        var t, u, v;\n        h(s.childNodes).forEach(function(w) {\n            v = o(w);\n            i.removeClass(w, l);\n            i.removeClass(w, m);\n            i.conditionShow(w, v);\n            if (v) {\n                t = ((t || w));\n                u = w;\n            }\n        ;\n        ;\n        });\n        ((t && i.addClass(t, l)));\n        ((u && i.addClass(u, m)));\n        i.conditionShow(s, t);\n    };\n;\n    function q(s, t) {\n        var u = n(t, \"uiButtonGroupItem\");\n        s(u);\n        p(u.parentNode);\n    };\n;\n    function r(s) {\n        this._root = n(s, \"uiButtonGroup\");\n        j.set(this._root, \"ButtonGroup\", this);\n        p(this._root);\n    };\n;\n    r.getInstance = function(s) {\n        var t = n(s, \"uiButtonGroup\"), u = j.get(t, \"ButtonGroup\");\n        return ((u || new r(t)));\n    };\n    g(r.prototype, {\n        hideItem: q.curry(i.hide),\n        showItem: q.curry(i.show),\n        toggleItem: q.curry(i.toggle)\n    });\n    e.exports = r;\n});\n__d(\"TimelineStickyHeaderNav\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ButtonGroup\",\"CSS\",\"DOM\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"SubscriptionsHandler\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"URI\",\"UserAgent\",\"Vector\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ButtonGroup\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"SelectorDeprecated\"), n = b(\"Style\"), o = b(\"SubscriptionsHandler\"), p = b(\"TimelineConstants\"), q = b(\"TimelineController\"), r = b(\"TimelineLegacySections\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"ge\"), w = b(\"tx\"), x = false, y, z, aa, ba, ca, da, ea, fa, ga, ha, ia, ja = {\n    }, ka = {\n    }, la = [], ma = false, na = [], oa = [], pa, qa = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function ra() {\n        var fb = m.getSelectorMenu(da);\n        pa.addSubscriptions(g.listen(fb, \"click\", sa), h.subscribe(p.SECTION_LOADED, wa));\n    };\n;\n    function sa(JSBNG__event) {\n        var fb = l.byTag(JSBNG__event.getTarget(), \"a\");\n        if (fb) {\n            var gb = fb.getAttribute(\"data-key\");\n            q.stickyHeaderNavWasClicked(gb);\n            q.navigateToSection(gb);\n            JSBNG__event.prevent();\n        }\n    ;\n    ;\n    };\n;\n    function ta(fb, gb) {\n        var hb = m.getValue(gb);\n        if (((hb === \"allStories\"))) {\n            r.get(fb).expandSubSections();\n        }\n    ;\n    ;\n        if (((hb !== \"activityLog\"))) {\n            ua(gb);\n        }\n    ;\n    ;\n    };\n;\n    function ua(fb) {\n        db(fb, \"highlights\");\n        db(fb, \"allStories\");\n        var gb = k.JSBNG__find(fb, \"li.separator\");\n        j.conditionShow(gb, gb.previousSibling);\n    };\n;\n    function va(fb) {\n        if (((ga[fb] && !z.custom_subsection_menu))) {\n            ab(fb);\n        }\n         else xa();\n    ;\n    ;\n        q.adjustStickyHeaderWidth();\n    };\n;\n    function wa(fb, gb) {\n        var hb = gb.key;\n        if (ha[hb]) {\n            bb(hb);\n            va(hb);\n        }\n    ;\n    ;\n    };\n;\n    function xa() {\n        ba.hideItem(ea);\n    };\n;\n    function ya(fb) {\n        var gb = fb.split(\"_\");\n        return qa[((gb.pop() - 1))];\n    };\n;\n    function za(fb) {\n        var gb = fa[fb], hb = ga[fb];\n        if (((!gb && hb))) {\n            gb = fa[fb] = ea.cloneNode(true);\n            var ib = k.scry(gb, \"li.activityLog a\")[0];\n            if (ib) {\n                ib.href = s(ib.href).addQueryData({\n                    key: fb\n                });\n            }\n        ;\n        ;\n            var jb = q.getCurrentScrubber();\n            if (hb.length) {\n                j.show(k.JSBNG__find(gb, \"li.separator\"));\n            }\n        ;\n        ;\n            for (var kb = 0; ((kb < hb.length)); kb++) {\n                var lb = hb[kb].scrubberKey, mb = ((jb ? jb.getLabelForSubnav(hb[kb].parentKey, lb) : mb = ya(lb)));\n                if (mb) {\n                    cb(gb, {\n                        key: lb,\n                        label: mb\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            pa.addSubscriptions(m.listen(gb, \"change\", ta.curry(fb, gb)), g.listen(gb, \"click\", sa));\n        }\n    ;\n    ;\n        return gb;\n    };\n;\n    function ab(fb) {\n        var gb = za(fb);\n        k.insertAfter(ea, gb);\n        j.hide(ea);\n        {\n            var fin201keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin201i = (0);\n            var hb;\n            for (; (fin201i < fin201keys.length); (fin201i++)) {\n                ((hb) = (fin201keys[fin201i]));\n                {\n                    var ib = fa[hb];\n                    j.conditionShow(ib, ((ib === gb)));\n                };\n            };\n        };\n    ;\n        ba.showItem(ea);\n    };\n;\n    function bb(fb) {\n        ga[fb] = r.get(fb).subSections;\n    };\n;\n    function cb(fb, gb) {\n        var hb = k.create(\"a\", {\n            href: \"#\",\n            rel: \"ignore\",\n            className: \"itemAnchor\",\n            tabIndex: 0\n        }, k.create(\"span\", {\n            className: \"itemLabel fsm\"\n        }, gb.label));\n        hb.setAttribute(\"data-key\", gb.key);\n        hb.setAttribute(\"aria-checked\", false);\n        var ib = k.create(\"li\", {\n            className: \"uiMenuItem uiMenuItemRadio uiSelectorOption\"\n        }, hb);\n        ib.setAttribute(\"data-label\", gb.label);\n        var jb = k.JSBNG__find(fb, \"ul.uiMenuInner\"), kb = k.create(\"option\", {\n            value: gb.key\n        }, gb.label), lb = k.JSBNG__find(fb, \"select\");\n        if (((gb.key === \"recent\"))) {\n            k.prependContent(jb, ib);\n            k.insertAfter(lb.options[0], kb);\n        }\n         else {\n            k.appendContent(jb, ib);\n            k.appendContent(lb, kb);\n        }\n    ;\n    ;\n    };\n;\n    function db(fb, gb) {\n        var hb = k.scry(fb, \"li.uiMenuItem\");\n        if (!hb) {\n            return;\n        }\n    ;\n    ;\n        for (var ib = 0; ((ib < hb.length)); ib++) {\n            var jb = hb[ib];\n            if (((j.hasClass(jb, gb) || ((jb.firstChild.getAttribute(\"data-key\") == gb))))) {\n                k.remove(jb);\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        var kb = k.JSBNG__find(fb, \"select\"), lb = k.scry(kb, \"option\");\n        for (ib = 0; ((ib < lb.length)); ib++) {\n            if (((lb[ib].value === gb))) {\n                k.remove(lb[ib]);\n                return;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    var eb = {\n        init: function(fb, gb) {\n            if (x) {\n                return;\n            }\n        ;\n        ;\n            x = true;\n            y = fb;\n            z = ((gb || {\n            }));\n            ca = k.JSBNG__find(y, \"div.pageMenu\");\n            da = k.JSBNG__find(y, \"div.sectionMenu\");\n            ea = k.JSBNG__find(y, \"div.subsectionMenu\");\n            ia = k.JSBNG__find(ca, \"li.uiMenuSeparator\");\n            ba = i.getInstance(ca);\n            pa = new o();\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            eb.adjustMenuHeights();\n            ra();\n            q.register(q.STICKY_HEADER_NAV, eb);\n            oa.forEach(function(hb) {\n                hb();\n            });\n        },\n        reset: function() {\n            x = false;\n            z = {\n            };\n            la = [];\n            ja = {\n            };\n            ka = {\n            };\n            ma = false;\n            na = [];\n            y = null;\n            ca = null;\n            da = null;\n            ea = null;\n            ia = null;\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            pa.release();\n        },\n        addTimePeriod: function(fb) {\n            var gb = q.getCurrentScrubber();\n            if (!gb) {\n                return;\n            }\n        ;\n        ;\n            var hb = gb.getLabelForNav(fb);\n            if (!hb) {\n                return;\n            }\n        ;\n        ;\n            cb(da, {\n                key: fb,\n                label: hb\n            });\n            var ib = k.JSBNG__find(da, \"ul.uiMenuInner\");\n            if (((((fb === \"recent\")) || ((ib.children.length < 2))))) {\n                m.setSelected(da, fb, true);\n            }\n        ;\n        ;\n        },\n        updateSection: function(fb, gb) {\n            if (gb) {\n                var hb = za(fb);\n                if (hb) {\n                    m.setSelected(hb, gb);\n                    ua(hb);\n                }\n                 else aa = fb;\n            ;\n            ;\n            }\n             else {\n                ha[fb] = true;\n                bb(fb);\n            }\n        ;\n        ;\n            m.setSelected(da, fb, true);\n            va(fb);\n        },\n        adjustMenuHeights: function() {\n            if (((t.ie() <= 7))) {\n                return;\n            }\n        ;\n        ;\n            [ca,da,].forEach(function(fb) {\n                var gb = \"\";\n                if (!j.hasClass(JSBNG__document.documentElement, \"tinyViewport\")) {\n                    gb = ((((u.getViewportDimensions().y - u.getElementDimensions(v(\"blueBar\")).y)) - 80));\n                    gb += \"px\";\n                }\n            ;\n            ;\n                n.set(k.JSBNG__find(fb, \"ul.uiMenuInner\"), \"maxHeight\", gb);\n            });\n        },\n        initPageMenu: function(fb, gb) {\n            if (!x) {\n                oa.push(eb.initPageMenu.curry(fb, gb));\n                return;\n            }\n        ;\n        ;\n            function hb(ib, jb) {\n                ib.forEach(function(kb) {\n                    var lb = ka[kb] = k.create(\"li\");\n                    j.hide(lb);\n                    ((jb ? k.insertBefore(ia, lb) : k.appendContent(k.JSBNG__find(ca, \"ul.uiMenuInner\"), lb)));\n                });\n            };\n        ;\n            hb(fb, true);\n            hb(gb, false);\n            ja.info = k.scry(ca, \"li\")[0];\n            la = gb;\n            ma = true;\n            if (na.length) {\n                na.forEach(function(ib) {\n                    eb.registerPageMenuItem(ib.key, ib.item);\n                });\n            }\n        ;\n        ;\n        },\n        registerPageMenuItem: function(fb, gb) {\n            if (!ma) {\n                na.push({\n                    key: fb,\n                    item: gb\n                });\n                return;\n            }\n        ;\n        ;\n            if (ka[fb]) {\n                k.replace(ka[fb], gb);\n                ja[fb] = gb;\n                delete ka[fb];\n                if (((la.indexOf(fb) >= 0))) {\n                    j.show(ia);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        removeTimePeriod: function(fb) {\n            db(da, fb);\n        }\n    };\n    e.exports = eb;\n});\n__d(\"TimelineSpinelessComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineComposer\",\"TimelineComposerUtilities\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineComposer\"), n = b(\"TimelineComposerUtilities\"), o = b(\"csx\"), p = b(\"cx\"), q;\n    function r(w) {\n        if (((w.isScheduledPost || w.isOGPost))) {\n            return;\n        }\n    ;\n    ;\n        if (!w.streamStory) {\n            window.JSBNG__location.reload();\n            return;\n        }\n    ;\n    ;\n        if (w.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                x.publish(w);\n            });\n            return;\n        }\n    ;\n    ;\n        m.renderCapsuleBasedStory(q, w.streamStory);\n    };\n;\n    function s() {\n        return j.JSBNG__find(k.byClass(q, \"fbTimelineComposerCapsule\"), \"div.-cx-PRIVATE-fbTimelineComposerAttachment__mleflyoutpointer\");\n    };\n;\n    function t(w) {\n        var x = u();\n        i.show(x);\n        var y = w.subscribe(\"hide\", function() {\n            i.hide(x);\n            w.unsubscribe(y);\n        });\n    };\n;\n    function u() {\n        var w = k.byClass(q, \"fbTimelineComposerCapsule\"), x = j.scry(w, \"div.composerVeil\");\n        if (((x.length !== 1))) {\n            x = j.appendContent(w, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        }\n    ;\n    ;\n        return x[0];\n    };\n;\n    var v = {\n        init: function(w) {\n            q = w;\n            var x = g.subscribe(\"composer/publish\", function(JSBNG__event, y) {\n                if (((y.composer_id === q.id))) {\n                    r(y);\n                }\n            ;\n            ;\n            });\n            l.onLeave(x.unsubscribe.bind(x));\n            if (i.hasClass(q, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                n.hidePlaceIfAttachmentsTooTall(q);\n            }\n             else n.hidePlaceIfAttachmentsTooTallOld(q);\n        ;\n        ;\n        },\n        showMLEFlyout: function(w) {\n            w.setContext(s()).show();\n            t(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"TimelineScrubber\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"Focus\",\"Keys\",\"Parent\",\"TimelineController\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Focus\"), k = b(\"Keys\"), l = b(\"Parent\"), m = b(\"TimelineController\"), n = b(\"Vector\"), o = b(\"copyProperties\");\n    function p(q) {\n        this._root = q;\n        this._navKeys = {\n        };\n        this._subNavKeys = {\n        };\n        this._rollups = {\n        };\n        this._rolledup = {\n        };\n        var r = q.childNodes;\n        this._currentNav = r[0];\n        for (var s = 0; ((s < r.length)); s++) {\n            var t = r[s].getAttribute(\"data-key\");\n            this._navKeys[t] = r[s];\n            var u = i.scry(r[s], \"ul\");\n            this._subNavKeys[t] = {\n            };\n            if (u.length) {\n                var v = u[0].childNodes;\n                for (var w = 0; ((w < v.length)); w++) {\n                    this._subNavKeys[t][v[w].getAttribute(\"data-key\")] = v[w];\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var x = r[s].getAttribute(\"data-rollup\");\n            if (x) {\n                this._rollups[x] = ((this._rollups[x] || []));\n                this._rollups[x].push(r[s]);\n            }\n        ;\n        ;\n        };\n    ;\n        this._clickListener = g.listen(this._root, \"click\", this._handleScrub.bind(this));\n        this._focusHandler = g.listen(this._root, \"keydown\", this._moveFocus.bind(this));\n        this._tabbableElement = i.scry(this._root, \"a\")[0];\n        h.show(this._root);\n        var y = ((n.getViewportDimensions().y - this.SCRUBBER_NO_ADS_VERTICAL_BUFFER)), z = this.getHeight();\n        if (((z > y))) {\n            this.fold(((z - y)));\n        }\n    ;\n    ;\n        m.register(m.SCRUBBER, this);\n        m.scrubberHasLoaded(this);\n    };\n;\n    o(p.prototype, {\n        KEY_HEIGHT: 23,\n        SUBKEY_HEIGHT: 16,\n        OFFSET: 38,\n        SCRUBBER_NO_ADS_VERTICAL_BUFFER: 125,\n        reset: function() {\n            this._root = null;\n            this._navKeys = {\n            };\n            this._subNavKeys = {\n            };\n            this._rollups = {\n            };\n            this._rolledup = {\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNav: function(q) {\n            return this._navKeys[q];\n        },\n        getSubnav: function(q, r) {\n            return this._subNavKeys[q][r];\n        },\n        getHeight: function() {\n            return this._root.offsetHeight;\n        },\n        getLabelForNav: function(q) {\n            var r = this.getNav(q);\n            return ((r && i.getText(i.scry(r, \"a\")[0])));\n        },\n        getLabelForSubnav: function(q, r) {\n            var s = this.getSubnav(q, r);\n            return ((s && i.getText(i.scry(s, \"a\")[0])));\n        },\n        fold: function(q) {\n            return this._adjustFolding(q, true);\n        },\n        unfold: function(q) {\n            return this._adjustFolding(q, false);\n        },\n        getOffset: function() {\n            return ((((this.OFFSET + ((h.hasClass(JSBNG__document.body, \"hasVoiceBar\") ? 26 : 0)))) + ((h.hasClass(\"rightColContent\", \"pagesTimelineRightColumn\") ? 48 : 0))));\n        },\n        updateSection: function(q, r) {\n            if (!this._navKeys[q]) {\n                return;\n            }\n        ;\n        ;\n            var s = this._navKeys[q].getAttribute(\"data-rollup\");\n            if (((this._currentRollup && ((this._currentRollup != s))))) {\n                h.removeClass(this._currentRollup, \"selected\");\n                h.removeClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                delete this._currentRollup;\n            }\n        ;\n        ;\n            if (((s && this._rolledup[s]))) {\n                var t = this._rolledup[s];\n                if (t.getAttribute(\"data-rollup\")) {\n                    this._currentRollup = t;\n                    h.addClass(this._currentRollup, \"selected\");\n                    h.addClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((this._currentNav && h.removeClass(this._currentNav, \"selected\")));\n            ((this._currentSubNav && h.removeClass(this._currentSubNav, \"selected\")));\n            this._currentNav = null;\n            this._currentSubNav = null;\n            if (this._navKeys[q]) {\n                this._currentNav = this._navKeys[q];\n                h.addClass(this._currentNav, \"selected\");\n                if (((this.decadesAreSelectable && this._navKeys[r]))) {\n                    this._currentSubNav = this._navKeys[r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                 else if (((r && this._subNavKeys[q][r]))) {\n                    this._currentSubNav = this._subNavKeys[q][r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _getRollupSize: function(q) {\n            var r = this._currentNav, s = ((r && r.getAttribute(\"data-rollup\"))), t = ((this.KEY_HEIGHT * ((this._rollups[q].length - 1))));\n            if (((q == s))) {\n                t += ((this.SUBKEY_HEIGHT * i.scry(r, \"li\").length));\n                t -= ((this.SUBKEY_HEIGHT * ((this._rollups[q].length - 1))));\n            }\n        ;\n        ;\n            return t;\n        },\n        _adjustFolding: function(q, r) {\n            var s = q, t = Object.keys(this._rollups);\n            while (((((q > 0)) && t.length))) {\n                var u = t[((r ? \"pop\" : \"shift\"))]();\n                if (((!r == !this._rolledup[u]))) {\n                    continue;\n                }\n            ;\n            ;\n                var v = this._getRollupSize(u);\n                if (((v <= 0))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((!r && ((v > q))))) {\n                    break;\n                }\n            ;\n            ;\n                this[((r ? \"_collapseRollup\" : \"_expandRollup\"))](u);\n                q -= v;\n            };\n        ;\n            return ((s - q));\n        },\n        _collapseRollup: function(q) {\n            var r = this._rollups[q];\n            if (((((!r || ((r.length < 2)))) || this._rolledup[q]))) {\n                return;\n            }\n        ;\n        ;\n            var s = r[0].previousSibling, t = r[0], u = i.create(\"a\", {\n                href: t.firstChild.href,\n                rel: \"ignore\",\n                tabindex: \"-1\"\n            }, [q,]), v = i.create(\"ul\", {\n                className: \"clearfix\"\n            });\n            for (var w = 0; ((w < r.length)); w++) {\n                v.appendChild(r[w]);\n            ;\n            };\n        ;\n            var x = i.create(\"li\", null, [u,v,]);\n            if (this.decadesAreSelectable) {\n                var y = r[((r.length - 1))], z = ((t.getAttribute(\"data-key\") + y.getAttribute(\"data-key\")));\n                x.setAttribute(\"data-start\", y.getAttribute(\"data-start\"));\n                x.setAttribute(\"data-end\", t.getAttribute(\"data-end\"));\n                x.setAttribute(\"data-key\", z);\n                this._navKeys[z] = x;\n            }\n             else x.setAttribute(\"data-key\", t.getAttribute(\"data-key\"));\n        ;\n        ;\n            x.setAttribute(\"data-rollup\", q);\n            if (s) {\n                i.insertAfter(s, x);\n            }\n             else i.prependContent(this._root, x);\n        ;\n        ;\n            this._rolledup[q] = x;\n            this._checkSelection();\n            this._ensureFocusableElementIsVisible();\n        },\n        _expandRollup: function(q) {\n            if (!this._rolledup[q]) {\n                return;\n            }\n        ;\n        ;\n            var r = this._rolledup[q], s = i.scry(r, \"ul\")[0], t = JSBNG__document.createDocumentFragment();\n            while (s.childNodes.length) {\n                t.appendChild(s.firstChild);\n            ;\n            };\n        ;\n            i.replace(r, t);\n            this._rolledup[q] = false;\n            this._checkSelection();\n        },\n        _checkSelection: function() {\n            if (this._currentNav) {\n                var q = ((this._currentSubNav && this._currentSubNav.getAttribute(\"data-key\")));\n                this.updateSection(this._currentNav.getAttribute(\"data-key\"), q);\n            }\n        ;\n        ;\n        },\n        _handleScrub: function(JSBNG__event) {\n            var q = JSBNG__event.getModifiers();\n            if (((((JSBNG__event.isMiddleClick() || q.access)) || q.meta))) {\n                return true;\n            }\n        ;\n        ;\n            var r = l.byTag(JSBNG__event.getTarget(), \"a\"), s = ((r && l.byAttribute(r, \"data-key\")));\n            if (s) {\n                m.scrubberWasClicked(s.getAttribute(\"data-key\"));\n                m.navigateToSection(s.getAttribute(\"data-key\"));\n                return JSBNG__event.prevent();\n            }\n        ;\n        ;\n        },\n        _ensureFocusableElementIsVisible: function() {\n            while (!((this._tabbableElement.offsetHeight || this._tabbableElement.offsetWidth))) {\n                this._tabbableElement.tabIndex = -1;\n                var q = l.byTag(l.byTag(this._tabbableElement, \"li\"), \"li\");\n                this._tabbableElement = i.scry(q, \"a\")[0];\n                this._tabbableElement.tabIndex = 0;\n            };\n        ;\n        },\n        _moveFocus: function(JSBNG__event) {\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            var q = g.getKeyCode(JSBNG__event);\n            if (((((q === k.UP)) || ((q === k.DOWN))))) {\n                var r = i.scry(this._root, \"a\").filter(function(u) {\n                    return ((u.offsetHeight || u.offsetWidth));\n                }), s = r.indexOf(this._tabbableElement);\n                if (((s != -1))) {\n                    var t = r[((s + ((((q === k.UP)) ? -1 : 1))))];\n                    if (t) {\n                        t.tabindex = 0;\n                        j.set(t);\n                        this._tabbableElement.tabindex = -1;\n                        this._tabbableElement = t;\n                        JSBNG__event.prevent();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineMainScrubber\", [\"Arbiter\",\"Class\",\"CSS\",\"DOMQuery\",\"TimelineConstants\",\"TimelineController\",\"TimelineScrubber\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"TimelineConstants\"), l = b(\"TimelineController\"), m = b(\"TimelineScrubber\"), n = b(\"copyProperties\");\n    function o(p) {\n        this.parent.construct(this, p);\n        this._subscribe = g.subscribe(k.SECTION_LOADED, function(q, r) {\n            var s = this._navKeys[r.key], t = ((s && j.scry(s, \"ul\")[0]));\n            if (t) {\n                i.addClass(t, \"loaded\");\n                l.scrubberHasChangedState();\n                if (r.hideSubSections) {\n                    i.hide(t);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    h.extend(o, m);\n    n(o.prototype, {\n        reset: function() {\n            this.parent.reset();\n            ((this._subscribe && this._subscribe.unsubscribe()));\n        }\n    });\n    e.exports = o;\n});\n__d(\"legacy:TimelineMainScrubber\", [\"TimelineMainScrubber\",], function(a, b, c, d) {\n    a.TimelineMainScrubber = b(\"TimelineMainScrubber\");\n}, 3);\n__d(\"legacy:TimelineCover\", [\"TimelineCover\",], function(a, b, c, d) {\n    a.TimelineCover = b(\"TimelineCover\");\n}, 3);\n__d(\"legacy:ui-scrolling-pager-js\", [\"ScrollingPager\",], function(a, b, c, d) {\n    a.ScrollingPager = b(\"ScrollingPager\");\n}, 3);\n__d(\"legacy:LegacyContextualDialog\", [\"LegacyContextualDialog\",], function(a, b, c, d) {\n    a.LegacyContextualDialog = b(\"LegacyContextualDialog\");\n}, 3);\n__d(\"ButtonGroupMonitor\", [\"ContextualDialog\",\"ContextualLayer\",\"CSS\",\"Layer\",\"Parent\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualDialog\"), h = b(\"ContextualLayer\"), i = b(\"CSS\"), j = b(\"Layer\"), k = b(\"Parent\"), l = b(\"SelectorDeprecated\");\n    function m(n) {\n        var o = ((k.byClass(n, \"bg_stat_elem\") || k.byClass(n, \"uiButtonGroup\")));\n        ((o && i.toggleClass(o, \"uiButtonGroupActive\")));\n    };\n;\n    j.subscribe([\"hide\",\"show\",], function(n, o) {\n        if (((((o instanceof h)) || ((o instanceof g))))) {\n            m(o.getCausalElement());\n        }\n    ;\n    ;\n    });\n    l.subscribe([\"close\",\"open\",], function(n, o) {\n        m(o.selector);\n    });\n});\n__d(\"SubMenu\", [\"JSBNG__Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k() {\n    \n    };\n;\n    i(k.prototype, {\n        _subMenu: null,\n        _mainMenu: null,\n        _forward: null,\n        _backward: null,\n        init: function(l, m, n, o) {\n            this._subMenu = l;\n            this._mainMenu = m;\n            this._forward = n;\n            this._backward = o;\n            h.subscribe(\"SubMenu/Reset\", this._goToMainMenu.bind(this));\n            g.listen(n, \"click\", this._goToSubMenu.bind(this));\n            g.listen(o, \"click\", this._goToMainMenu.bind(this));\n        },\n        initAsyncChildMenu: function(l) {\n            g.listen(this._forward, \"click\", function() {\n                this._goToSubMenu();\n                l.load();\n            }.bind(this));\n        },\n        _goToMainMenu: function() {\n            j.hide(this._subMenu);\n            j.show(this._mainMenu);\n        },\n        _goToSubMenu: function() {\n            j.hide(this._mainMenu);\n            j.show(this._subMenu);\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:ui-submenu\", [\"SubMenu\",], function(a, b, c, d) {\n    a.SubMenu = b(\"SubMenu\");\n}, 3);\n__d(\"AsyncMenu\", [\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k, l) {\n        this._uri = k;\n        this._elem = l;\n    };\n;\n    h(j.prototype, {\n        _uri: null,\n        _elem: null,\n        load: function() {\n            this.load = i;\n            g.bootstrap(this._uri, this._elem);\n        }\n    });\n    e.exports = j;\n});");
// 10978
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o98,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/U4R9rWNhZti.js",o99);
// undefined
o98 = null;
// undefined
o99 = null;
// 11811
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"3SGVa\",]);\n}\n;\n__d(\"SubscriptionLevels\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ALL: \"162318810514679\",\n        DEFAULT: \"271670892858696\",\n        TOP: \"266156873403755\"\n    };\n    e.exports = g;\n});\n__d(\"EditSubscriptions\", [\"Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"MenuDeprecated\",\"Parent\",\"SubscriptionLevels\",\"arrayContains\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"Parent\"), n = b(\"SubscriptionLevels\"), o = b(\"arrayContains\"), p = b(\"cx\"), q = b(\"ge\"), r = 13, s = 45, t = [n.ALL,n.DEFAULT,n.TOP,], u = {\n    }, v = {\n    }, w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = {\n    }, da = {\n    }, ea = {\n    }, fa = \"/ajax/follow/follow_profile.php\", ga = \"/ajax/follow/unfollow_profile.php\", ha = \"/ajax/settings/notifications/notify_me.php\", ia = {\n    }, ja = {\n    }, ka = null, la = false;\n    function ma(jb) {\n        return o(t, jb);\n    };\n    function na(jb, kb, lb, mb) {\n        var nb = (m.byClass(mb, \"uiMenuItem\") || m.byClass(mb, \"-cx-PUBLIC-abstractMenuItem__root\"));\n        if ((!nb || !k.contains(jb, nb))) {\n            return;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSubscribeCheckbox\")) {\n            if (w[kb]) {\n                qa(jb, kb);\n            }\n             else pa(jb, kb);\n        ;\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuUnsubscribe\")) {\n            qa(jb, kb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSettingsItem\")) {\n            db(jb, true);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuGoBack\")) {\n            db(jb, false);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuItem\")) {\n            oa(jb, kb, lb, nb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuNotifyMeCheckbox\")) {\n            if (x[kb]) {\n                hb(jb, kb);\n            }\n             else gb(jb, kb);\n        ;\n            return false;\n        }\n        \n        \n        \n        \n        \n        \n    ;\n    };\n    function oa(jb, kb, lb, mb) {\n        if (j.hasClass(mb, \"SubscriptionMenuLevel\")) {\n            if (l.isItemChecked(mb)) {\n                return\n            };\n            bb(jb, kb, ua(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionMenuCategory\")) {\n            ya(kb, mb, !l.isItemChecked(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionAppStory\")) {\n            ab(kb, mb, !l.isItemChecked(mb), lb);\n        }\n        \n    ;\n    };\n    function pa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"FollowingUser\", lb);\n        new i().setURI(fa).setMethod(\"POST\").setData({\n            profile_id: kb,\n            location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"FollowUserFail\", lb)).send();\n    };\n    function qa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"UnfollowingUser\", lb);\n        new i().setURI(ga).setMethod(\"POST\").setData({\n            profile_id: kb,\n            location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"UnfollowUserFail\", lb)).send();\n    };\n    function ra(jb) {\n        if (j.hasClass(jb, \"followButtonFlyout\")) {\n            return r;\n        }\n         else return s\n    ;\n    };\n    function sa(jb, kb, lb) {\n        var mb = {\n            profile_id: jb,\n            level: ba[jb],\n            custom_categories: ca[jb],\n            location: lb\n        };\n        new i().setURI(\"/ajax/follow/manage_subscriptions.php\").setData(mb).send();\n    };\n    function ta(jb, kb) {\n        var lb = (ca[kb] || []), mb = l.getItems(jb);\n        mb.forEach(function(nb) {\n            if (j.hasClass(nb, \"SubscriptionMenuCategory\")) {\n                var ob = ua(nb);\n                if (o(lb, ob)) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            }\n             else if (j.hasClass(nb, \"SubscriptionAppStory\")) {\n                var pb = ua(nb);\n                if ((ja[kb] && ja[kb][pb])) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            }\n            \n        ;\n        });\n        bb(jb, kb, ba[kb], false);\n    };\n    function ua(jb) {\n        var kb = k.scry(jb, \"input\")[0];\n        return (kb && kb.value);\n    };\n    function va(jb) {\n        return k.find(jb, \"a.itemAnchor\");\n    };\n    function wa(jb) {\n        j.addClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", true);\n    };\n    function xa(jb) {\n        j.removeClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", false);\n    };\n    function ya(jb, kb, lb, mb, nb) {\n        if (lb) {\n            wa(kb);\n        }\n         else xa(kb);\n    ;\n        var ob = ua(kb);\n        if (ma(ob)) {\n            (lb && za(jb, ob));\n        }\n         else if (lb) {\n            if (!o(ca[jb], ob)) {\n                ca[jb].push(ob);\n            };\n        }\n         else {\n            var pb = ca[jb].indexOf(ob);\n            if ((pb !== -1)) {\n                ca[jb].splice(pb, 1);\n            };\n        }\n        \n    ;\n        if (mb) {\n            sa(jb, ob, nb);\n        };\n    };\n    function za(jb, kb) {\n        ba[jb] = kb;\n        h.inform(\"SubscriptionLevelUpdated\", {\n            profile_id: jb,\n            level: kb\n        });\n    };\n    function ab(jb, kb, lb, mb) {\n        var nb = \"/ajax/feed/filter_action/\", ob = ua(kb), pb = {\n            actor_id: jb,\n            app_id: ob\n        };\n        if (lb) {\n            wa(kb);\n            nb += \"resubscribe_user_app/\";\n            pb.action = \"resubscribe_user_app\";\n            if (!ja[jb]) {\n                ja[jb] = {\n                };\n            };\n            ja[jb][ob] = true;\n        }\n         else {\n            xa(kb);\n            nb += \"unsubscribe_user_app_checkbox/\";\n            pb.action = \"unsubscribe_user_app_checkbox\";\n            if (ja[jb]) {\n                ja[jb][ob] = false;\n            };\n        }\n    ;\n        new i().setURI(nb).setData(pb).send();\n    };\n    function bb(jb, kb, lb, mb, nb) {\n        var ob = k.scry(jb, \".SubscriptionMenuLevel\"), pb = null;\n        ob.forEach(function(qb) {\n            if ((ua(qb) == lb)) {\n                pb = qb;\n            }\n             else if (l.isItemChecked(qb)) {\n                ya(kb, qb, false, false);\n            }\n        ;\n        });\n        (pb && ya(kb, pb, true, mb, nb));\n    };\n    function cb(jb, kb, lb) {\n        w[kb] = lb;\n        j.conditionClass(jb, \"isUnsubscribed\", !lb);\n        var mb = k.scry(jb, \"li.SubscribeMenuSubscribeCheckbox\");\n        if ((mb.length !== 0)) {\n            var nb = mb[0];\n            if (lb) {\n                wa(nb);\n            }\n             else xa(nb);\n        ;\n        }\n    ;\n    };\n    function db(jb, kb) {\n        j.conditionClass(jb, \"subscriptionMenuOpen\", kb);\n    };\n    function eb(jb, kb, lb) {\n        var mb = k.find(jb, \".FriendListSubscriptionsMenu\"), nb = k.find(mb, \".uiMenuInner\");\n        if ((ka != null)) {\n            ka.forEach(function(ob) {\n                nb.removeChild(ob);\n            });\n        };\n        lb.forEach(function(ob) {\n            nb.appendChild(ob);\n        });\n        ka = lb;\n    };\n    h.subscribe(\"UnfollowUser\", function(jb, kb) {\n        if (da[kb.profile_id]) {\n            za(kb.profile_id, da[kb.profile_id]);\n            ca[kb.profile_id] = ea[kb.profile_id].slice();\n        }\n    ;\n    });\n    h.subscribe(\"UpdateSubscriptionLevel\", function(jb, kb) {\n        var lb = (kb.profile_id + \"\"), mb = (kb.level + \"\");\n        za(lb, mb);\n        var nb;\n        for (nb in u) {\n            if ((u[nb] === lb)) {\n                var ob = q(nb);\n                (ob && bb(ob, lb, mb, false));\n            }\n        ;\n        };\n    });\n    function fb(jb, kb, lb) {\n        x[kb] = lb;\n        var mb = (z[kb] && !la), nb = k.scry(jb, \"li.SubscribeMenuNotifyMeCheckbox\");\n        if ((nb.length !== 0)) {\n            var ob = nb[0];\n            j.conditionShow(ob, !mb);\n            j.conditionShow(k.find(jb, \"li.SubscribeMenuNotifyMeCheckboxSeparator\"), !mb);\n            if (lb) {\n                wa(ob);\n            }\n             else xa(ob);\n        ;\n        }\n    ;\n    };\n    function gb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"EnableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: true\n        }).setErrorHandler(h.inform.curry(\"EnableNotifsForUserFail\", lb)).send();\n    };\n    function hb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"DisableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: false\n        }).setErrorHandler(h.inform.curry(\"DisableNotifsForUserFail\", lb)).send();\n    };\n    var ib = {\n        init: function(jb, kb, lb) {\n            var mb = k.getID(jb);\n            if (!u[mb]) {\n                g.listen(jb, \"click\", function(nb) {\n                    return na(jb, u[mb], lb, nb.getTarget());\n                });\n            };\n            if (((lb === s) && ia[kb].length)) {\n                eb(jb, kb, ia[kb]);\n            };\n            if (ba[kb]) {\n                ta(jb, kb);\n            };\n            u[mb] = kb;\n            j.conditionClass(jb, \"NonFriendSubscriptionMenu\", !v[kb]);\n            j.conditionClass(jb, \"cannotSubscribe\", !y[kb]);\n            j.conditionClass(jb, \"noSubscriptionLevels\", (z[kb] && !aa[kb]));\n            j.conditionClass(jb, \"noSubscribeCheckbox\", (!v[kb] && !z[kb]));\n            cb(jb, kb, w[kb]);\n            fb(jb, kb, x[kb]);\n            h.subscribe([\"FollowUser\",\"FollowingUser\",\"UnfollowUserFail\",], function(nb, ob) {\n                cb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"UnfollowUser\",\"UnfollowingUser\",\"FollowUserFail\",], function(nb, ob) {\n                h.inform(\"SubMenu/Reset\");\n                cb(jb, kb, false);\n            }.bind(this));\n            h.subscribe([\"EnableNotifsForUser\",\"DisableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"DisableNotifsForUser\",\"EnableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, false);\n            }.bind(this));\n            h.subscribe(\"listeditor/friend_lists_changed\", function(nb, ob) {\n                if (ob.notify_state) {\n                    var pb = (ob.added_uid ? ob.added_uid : ob.removed_uid);\n                    fb(jb, pb, ob.notify_state.is_notified);\n                }\n            ;\n            }.bind(this));\n            db(jb, false);\n        },\n        getSubscriptions: function(jb) {\n            return {\n                level: ba[jb],\n                custom_categories: ca[jb]\n            };\n        },\n        setSubscriptions: function(jb, kb, lb, mb, nb, ob, pb, qb, rb, sb, tb, ub, vb) {\n            za(jb, (pb + \"\"));\n            v[jb] = kb;\n            w[jb] = lb;\n            y[jb] = mb;\n            z[jb] = nb;\n            aa[jb] = ob;\n            da[jb] = (rb + \"\");\n            ca[jb] = qb.map(String);\n            ea[jb] = sb.map(String);\n            ia[jb] = vb;\n            x[jb] = tb;\n            la = ub;\n        }\n    };\n    e.exports = (a.EditSubscriptions || ib);\n});\n__d(\"DynamicFriendListEducation\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"Dialog\",\"PageTransitions\",\"arrayContains\",\"createArrayFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"PageTransitions\"), l = b(\"arrayContains\"), m = b(\"createArrayFrom\"), n = b(\"removeFromArray\"), o, p, q, r, s, t;\n    function u() {\n        (q && q.hide());\n        (r && r.hide());\n    };\n    function v(y) {\n        n(p, y);\n        u();\n        s({\n            accept_tag_education: true\n        });\n    };\n    function w() {\n        u();\n        s({\n            nux_cancel: true\n        });\n    };\n    var x = {\n        init: function(y, z) {\n            o = y;\n            p = m(z).map(String);\n            k.registerHandler(function() {\n                u();\n                o = false;\n                s = undefined;\n                p = [];\n            });\n        },\n        showDialog: function(y, z, aa) {\n            if ((o && l(p, y))) {\n                u();\n                h.inform(\"DynamicFriendListEducation/dialogOpen\", {\n                    uid: z,\n                    flid: y\n                });\n                s = aa;\n                q = new j().setAsync(new i(\"/ajax/friends/lists/smart_list_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true)).setHandler(v.bind(this, y)).setCloseHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogClosed\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).setCancelHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogCancel\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).show();\n            }\n             else aa();\n        ;\n        },\n        showContextualDialog: function(y, z, aa, ba) {\n            if ((o && l(p, y))) {\n                u();\n                t = aa;\n                s = ba;\n                new i(\"/ajax/friends/lists/smart_list_contextual_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true).send();\n            }\n             else ba();\n        ;\n        },\n        setContextualDialog: function(y, z, aa, ba) {\n            r = y;\n            r.setContext(t);\n            r.show();\n            g.listen(z, \"click\", v.bind(this, ba));\n            g.listen(aa, \"click\", w);\n        }\n    };\n    e.exports = x;\n});\n__d(\"FriendStatus\", [\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"eachKeyVal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"eachKeyVal\");\n    function m(q, r, s) {\n        this.id = q;\n        this.update(r, s);\n    };\n    j(m.prototype, {\n        update: function(q, r) {\n            (q && (this.status = q));\n            if (r) {\n                this.lists = k(r).map(String);\n                this._informListChange();\n            }\n        ;\n        },\n        isComplete: function() {\n            return !!this.lists;\n        },\n        addToList: function(q) {\n            if ((this.lists && !i(this.lists, q))) {\n                this.lists.push(q);\n            };\n            this._informListChange();\n        },\n        removeFromList: function(q) {\n            if (this.lists) {\n                var r = this.lists.indexOf(q);\n                ((r !== -1) && this.lists.splice(r, 1));\n            }\n        ;\n            this._informListChange();\n        },\n        updateList: function(q, r) {\n            (r ? this.addToList(q) : this.removeFromList(q));\n        },\n        _informListChange: function() {\n            g.inform(\"FriendListMembershipChange\", {\n                uid: this.id,\n                lists: this.lists\n            });\n        }\n    });\n    j(m, {\n        ARE_FRIENDS: 1,\n        INCOMING_REQUEST: 2,\n        OUTGOING_REQUEST: 3,\n        CAN_REQUEST: 4\n    });\n    var n = {\n    }, o = {\n    };\n    function p(q, r, s) {\n        if (!n[s.uid]) {\n            n[s.uid] = new m(s.uid, q);\n        }\n         else n[s.uid].update(q);\n    ;\n        g.inform(\"FriendRequest/change\", {\n            uid: s.uid,\n            status: q\n        });\n    };\n    g.subscribe([\"FriendRequest/cancel\",\"FriendRequest/unfriend\",\"FriendRequest/sendFail\",], p.curry(m.CAN_REQUEST));\n    g.subscribe([\"FriendRequest/confirmFail\",], p.curry(m.INCOMING_REQUEST));\n    g.subscribe([\"FriendRequest/cancelFail\",\"FriendRequest/sent\",\"FriendRequest/sending\",], p.curry(m.OUTGOING_REQUEST));\n    g.subscribe([\"FriendRequest/confirm\",\"FriendRequest/confirming\",], p.curry(m.ARE_FRIENDS));\n    j(m, {\n        CLOSE_FRIENDS: null,\n        ACQUAINTANCES: null,\n        getFriend: function(q, r) {\n            if ((n[q] && n[q].isComplete())) {\n                r(n[q]);\n            }\n             else if (o[q]) {\n                o[q].push(r);\n            }\n             else {\n                o[q] = [r,];\n                new h().setURI(\"/ajax/friends/status.php\").setData({\n                    friend: q\n                }).setHandler(function(s) {\n                    var t = s.getPayload();\n                    m.initFriend.bind(m, q, t.status, t.lists).defer();\n                }).send();\n            }\n            \n        ;\n        },\n        initFriend: function(q, r, s) {\n            var t = (n[q] || new m(q));\n            t.update((t.status || r), (t.lists || s));\n            n[q] = t;\n            (o[q] && o[q].forEach(function(u) {\n                u(t);\n            }));\n            o[q] = null;\n        },\n        setSpecialLists: function(q) {\n            var r = (m.CLOSE_FRIENDS === null);\n            m.CLOSE_FRIENDS = (q.close + \"\");\n            m.ACQUAINTANCES = (q.acq + \"\");\n            if (r) {\n                l(n, function(s, t) {\n                    t._informListChange();\n                });\n            };\n        }\n    });\n    e.exports = m;\n});\n__d(\"FriendEditLists\", [\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOMQuery\",\"DynamicFriendListEducation\",\"EditSubscriptions\",\"FriendStatus\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"URI\",\"$\",\"arrayContains\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"DynamicFriendListEducation\"), l = b(\"EditSubscriptions\"), m = b(\"FriendStatus\"), n = b(\"MenuDeprecated\"), o = b(\"Parent\"), p = b(\"ScrollableArea\"), q = b(\"URI\"), r = b(\"$\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"ge\"), v = 5, w = {\n    }, x = \"/ajax/profile/removefriendconfirm.php\", y = \"/ajax/friends/requests/cancel.php\", z = \"/ajax/choose/\", aa = \"/profile.php\", ba = \"/ajax/report/social.php\", ca, da;\n    function ea(pa, qa, ra) {\n        var sa = w[pa.id], ta = function(ua) {\n            var va = {\n                action: (ra ? \"add_list\" : \"del_list\"),\n                to_friend: sa.id,\n                friendlists: [qa,],\n                source: ca\n            };\n            if (ua) {\n                t(va, ua);\n            };\n            sa.updateList(qa, ra);\n            var wa;\n            if ((ra && (qa == m.CLOSE_FRIENDS))) {\n                wa = ha(pa, m.ACQUAINTANCES);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.ACQUAINTANCES, false);\n                }\n            ;\n            }\n             else if ((ra && (qa == m.ACQUAINTANCES))) {\n                wa = ha(pa, m.CLOSE_FRIENDS);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.CLOSE_FRIENDS, false);\n                }\n            ;\n            }\n            \n        ;\n            var xa = {\n                flid: qa,\n                uid: sa.id\n            }, ya = (ra ? \"FriendListHovercard/add\" : \"FriendListHovercard/remove\");\n            g.inform(ya, xa);\n            new h().setURI(\"/ajax/add_friend/action.php\").setData(va).send();\n        };\n        if (ra) {\n            k.showDialog(qa, sa.id, ta);\n        }\n         else ta();\n    ;\n    };\n    function fa(pa) {\n        var qa = j.scry(pa, \"input\")[0];\n        return (qa && qa.value);\n    };\n    function ga(pa, qa, ra) {\n        var sa = {\n            uid: qa.id\n        };\n        new h().setURI(y).setMethod(\"POST\").setData({\n            friend: qa.id\n        }).setHandler(g.inform.bind(g, \"FriendRequest/cancel\", sa)).setErrorHandler(g.inform.bind(g, \"FriendRequest/cancelFail\", sa)).setStatusElement(ra).send();\n    };\n    function ha(pa, qa) {\n        var ra = n.getItems(pa);\n        for (var sa = 0; (sa < ra.length); sa++) {\n            if ((fa(ra[sa]) == qa)) {\n                return ra[sa]\n            };\n        };\n        return null;\n    };\n    function ia(pa, qa) {\n        var ra = n.getItems(pa);\n        ra.forEach(function(sa) {\n            var ta = fa(sa), ua = s(qa.lists, ta);\n            if ((n.isItemChecked(sa) !== ua)) {\n                n.toggleItem(sa);\n            };\n        });\n    };\n    function ja(pa) {\n        var qa = n.getItems(pa), ra = (!i.hasClass(pa, \"followButtonFlyout\") && !i.hasClass(pa, \"likeButtonFlyout\")), sa = [], ta = [], ua = 0, va = 0;\n        qa.forEach(function(ab) {\n            if (i.hasClass(ab, \"neverHide\")) {\n                i.removeClass(ab, \"underShowMore\");\n                ua++;\n            }\n             else if (n.isItemChecked(ab)) {\n                sa.push(ab);\n            }\n             else if (((i.hasClass(ab, \"neverShow\") || i.hasClass(ab, \"FriendListCreateTrigger\")) || ((!ra && i.hasClass(ab, \"friendOptionsOnly\"))))) {\n                i.addClass(ab, \"underShowMore\");\n                va++;\n            }\n             else ta.push(ab);\n            \n            \n        ;\n        });\n        var wa = (v - ua), xa = sa.concat(ta), ya = va;\n        xa.forEach(function(ab) {\n            if (i.hasClass(ab, \"ShowMoreItem\")) {\n                wa--;\n                return;\n            }\n        ;\n            if (wa) {\n                i.removeClass(ab, \"underShowMore\");\n                wa--;\n            }\n             else {\n                i.addClass(ab, \"underShowMore\");\n                ya = true;\n            }\n        ;\n        });\n        i.conditionClass(pa, \"hasMoreFriendListItems\", ya);\n        var za = j.scry(pa, \".FriendListMenuShowMore\");\n        za.forEach(function(ab) {\n            i.removeClass(ab, \"FriendListMenuShowMore\");\n        });\n    };\n    function ka(pa, qa) {\n        i.conditionClass(pa, \"FriendListMemorializedUser\", qa);\n    };\n    function la(pa, qa) {\n        i.conditionClass(pa, \"FriendListCannotSuggestFriends\", !qa);\n    };\n    function ma(pa, qa) {\n        var ra = j.scry(pa, \".FriendListUnfriend\")[0], sa = j.scry(pa, \".FriendListCancel\")[0], ta = j.scry(pa, \".FriendListSuggestFriends\")[0], ua = j.scry(pa, \".FriendListFriendship\")[0], va = j.scry(pa, \".FriendListReportBlock\")[0];\n        if (sa) {\n            i.conditionShow(sa, (qa.status == m.OUTGOING_REQUEST));\n        };\n        if (ra) {\n            i.conditionShow(ra, (qa.status == m.ARE_FRIENDS));\n            var wa = j.find(ra, \"a\");\n            wa.setAttribute(\"ajaxify\", q(x).addQueryData({\n                uid: qa.id,\n                unref: da\n            }).toString());\n        }\n         else i.conditionClass(pa, \"NoFriendListActionSeparator\", (!sa || (qa.status != m.OUTGOING_REQUEST)));\n    ;\n        if (ta) {\n            j.find(ta, \"a\").setAttribute(\"href\", q(z).addQueryData({\n                type: \"suggest_friends\",\n                newcomer: qa.id,\n                ref: \"profile_others_dropdown\"\n            }).toString());\n        };\n        if (ua) {\n            i.conditionShow(ua, (qa.status == m.ARE_FRIENDS));\n            j.find(ua, \"a\").setAttribute(\"href\", q(aa).addQueryData({\n                and: qa.id\n            }).toString());\n        }\n    ;\n        if (va) {\n            j.find(va, \"a\").setAttribute(\"ajaxify\", q(ba).addQueryData({\n                content_type: 0,\n                cid: qa.id,\n                rid: qa.id\n            }).toString());\n        };\n    };\n    function na(pa, qa) {\n        var ra = j.scry(pa, \"div.FriendListSubscriptionsMenu\");\n        if ((ra.length !== 0)) {\n            l.init(pa, qa, 45);\n        };\n    };\n    g.subscribe(\"FriendRequest/change\", function(pa, qa) {\n        for (var ra in w) {\n            var sa = u(ra), ta = w[ra];\n            if (((sa && ta) && (ta.id == qa.uid))) {\n                ia(sa, ta);\n                ma(sa, ta);\n                ja(sa);\n            }\n        ;\n        };\n    });\n    n.subscribe(\"select\", function(pa, qa) {\n        if ((i.hasClass(qa.item, \"ShowMoreItem\") && i.hasClass(qa.menu, \"FriendListMenu\"))) {\n            i.addClass(qa.menu, \"FriendListMenuShowMore\");\n            p.poke(qa.item);\n        }\n    ;\n    });\n    var oa = {\n        init: function(pa, qa, ra, sa, ta, ua) {\n            pa = r(pa);\n            ca = ra;\n            da = ua;\n            if (!w[pa.id]) {\n                n.subscribe(\"select\", function(va, wa) {\n                    if (j.contains(pa, wa.item)) {\n                        if (o.byClass(wa.item, \"FriendListItem\")) {\n                            n.toggleItem(wa.item);\n                            var xa = fa(wa.item);\n                            ea(pa, xa, n.isItemChecked(wa.item));\n                        }\n                         else if (o.byClass(wa.item, \"FriendListCancel\")) {\n                            ga(pa, w[pa.id], wa.item);\n                        }\n                         else if (o.byClass(wa.item, \"FriendListUnfriend\")) {\n                            g.inform(\"FriendEditLists/unfriend\");\n                        }\n                        \n                    \n                    };\n                });\n            };\n            i.addClass(pa, \"async_saving\");\n            m.getFriend(qa, function(va) {\n                ka(pa, sa);\n                la(pa, ta);\n                ia(pa, va);\n                ma(pa, va);\n                w[pa.id] = va;\n                ja(pa);\n                na(pa, qa);\n                i.removeClass(pa, \"async_saving\");\n            }.bind(this));\n        }\n    };\n    e.exports = (a.FriendEditLists || oa);\n});\n__d(\"FriendListFlyoutController\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"FriendEditLists\",\"FriendStatus\",\"Keys\",\"Layer\",\"LayerHideOnEscape\",\"LayerTabIsolation\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"Style\",\"TabbableElements\",\"UserAgent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Button\"), k = b(\"ContextualLayer\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMQuery\"), q = b(\"FriendEditLists\"), r = b(\"FriendStatus\"), s = b(\"Keys\"), t = b(\"Layer\"), u = b(\"LayerHideOnEscape\"), v = b(\"LayerTabIsolation\"), w = b(\"MenuDeprecated\"), x = b(\"Parent\"), y = b(\"ScrollableArea\"), z = b(\"Style\"), aa = b(\"TabbableElements\"), ba = b(\"UserAgent\"), ca = b(\"cx\"), da = b(\"emptyFunction\"), ea, fa, ga = null, ha = null, ia, ja, ka, la, ma, na, oa = 1500, pa, qa = [\"uiButtonConfirm\",\"uiButtonSpecial\",\"-cx-PRIVATE-uiButton__special\",\"-cx-PRIVATE-uiButton__confirm\",\"-cx-PRIVATE-xuiButton__special\",\"-cx-PRIVATE-xuiOverlayButton__root\",\"-cx-PRIVATE-xuiButton__confirm\",], ra = {\n        init: function(tb, ub) {\n            ra.init = da;\n            ea = tb;\n            ea.subscribe(\"mouseenter\", ab);\n            ea.subscribe(\"mouseleave\", ob);\n            ea.subscribe(\"hide\", cb);\n            ea.enableBehavior(v);\n            ea.enableBehavior(u);\n            pa = ub;\n            if (ga) {\n                o.setContent(ea.getContent(), [ga,ha,]);\n            };\n            var vb = function(wb) {\n                var xb = x.byClass(wb.getTarget(), \"enableFriendListFlyout\");\n                if (xb) {\n                    if ((ia === xb)) {\n                        clearTimeout(la);\n                    }\n                     else {\n                        (fa && qb());\n                        nb(xb);\n                    }\n                \n                };\n            };\n            g.listen(document.documentElement, {\n                mouseover: vb,\n                click: vb,\n                keydown: function(event) {\n                    var wb = event.getTarget();\n                    if (event.getModifiers().any) {\n                        return\n                    };\n                    if ((!fa || p.isNodeOfType(wb, [\"input\",\"textarea\",]))) {\n                        return\n                    };\n                    var xb = g.getKeyCode(event), yb;\n                    switch (xb) {\n                      case s.UP:\n                    \n                      case s.DOWN:\n                        var zb = za();\n                        yb = xa(zb);\n                        va(zb[(yb + (((xb === s.UP) ? -1 : 1)))]);\n                        return false;\n                      case s.SPACE:\n                        var ac = wa(wb);\n                        if (ac) {\n                            sa(ac);\n                            event.prevent();\n                        }\n                    ;\n                        break;\n                      default:\n                        var bc = String.fromCharCode(xb).toLowerCase(), cc = za();\n                        yb = xa(cc);\n                        var dc = yb, ec = cc.length;\n                        while ((((~yb && ((dc = (++dc % ec)) !== yb))) || ((!~yb && (++dc < ec))))) {\n                            var fc = w.getItemLabel(cc[dc]);\n                            if ((fc && (fc.charAt(0).toLowerCase() === bc))) {\n                                va(cc[dc]);\n                                return false;\n                            }\n                        ;\n                        };\n                    };\n                }\n            });\n            h.subscribe(\"FriendEditLists/unfriend\", qb);\n            h.subscribe(\"DynamicFriendListEducation/dialogOpen\", function() {\n                na = true;\n            });\n            h.subscribe(\"DynamicFriendListEducation/dialogClosed\", function() {\n                na = false;\n                ob();\n            });\n        },\n        initContent: function(tb) {\n            o.appendContent(document.body, tb);\n            db(tb);\n            (function() {\n                if (!ga) {\n                    ga = tb;\n                    (ea && o.setContent(ea.getContent(), [ga,ha,]));\n                    l.show(ga);\n                    g.listen(ga, \"click\", rb);\n                    (fa && kb(ia));\n                }\n                 else {\n                    o.remove(tb);\n                    tb = null;\n                }\n            ;\n            }).defer();\n        },\n        initNux: function(tb) {\n            if (ha) {\n                return\n            };\n            ha = tb;\n            (ea && o.setContent(ea.getContent(), [ga,ha,]));\n        },\n        show: function(tb) {\n            lb(tb);\n        },\n        hide: function(tb) {\n            ((tb === false) ? qb() : ob());\n        },\n        setActiveNode: function(tb) {\n            (fa && qb());\n            ia = tb;\n            ja = g.listen(tb, \"mouseleave\", function() {\n                ia = null;\n                (ja && ja.remove());\n            });\n        },\n        setCloseListener: function(tb, ub) {\n            m.set(tb, \"flfcloselistener\", ub);\n            if ((ia != tb)) {\n                m.set(tb, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            };\n        },\n        setCloseListenerTimeout: function(tb) {\n            oa = tb;\n        }\n    };\n    function sa(tb) {\n        (ba.firefox() && ua(tb).blur());\n        w.inform(\"select\", {\n            menu: ta(tb),\n            item: tb\n        });\n    };\n    function ta(tb) {\n        if (l.hasClass(tb, \"uiMenuContainer\")) {\n            return tb\n        };\n        return x.byClass(tb, \"uiMenu\");\n    };\n    function ua(tb) {\n        return p.find(tb, \"a.itemAnchor\");\n    };\n    function va(tb) {\n        if ((tb && ya(tb))) {\n            w._removeSelected(ea.getContent());\n            l.addClass(tb, \"selected\");\n            ua(tb).focus();\n        }\n    ;\n    };\n    function wa(tb) {\n        return x.byClass(tb, \"uiMenuItem\");\n    };\n    function xa(tb) {\n        if (document.activeElement) {\n            var ub = wa(document.activeElement);\n            return tb.indexOf(ub);\n        }\n    ;\n        return -1;\n    };\n    function ya(tb) {\n        return ((!l.hasClass(tb, \"disabled\") && (z.get(tb, \"display\") !== \"none\")) && (z.get(x.byClass(tb, \"uiMenu\"), \"display\") !== \"none\"));\n    };\n    function za() {\n        return w.getItems(ea.getContent()).filter(ya);\n    };\n    function ab() {\n        clearTimeout(la);\n    };\n    function bb(tb) {\n        for (var ub = 0; (ub < qa.length); ub++) {\n            if (l.hasClass(tb, qa[ub])) {\n                return false\n            };\n        };\n        return true;\n    };\n    function cb() {\n        if (ia) {\n            if (bb(ia)) {\n                l.removeClass(ia, \"-cx-PUBLIC-uiHoverButton__selected\");\n                if ((l.hasClass(ia, \"uiButton\") || l.hasClass(ia, \"-cx-PRIVATE-uiButton__root\"))) {\n                    l.removeClass(ia, \"selected\");\n                };\n            }\n        ;\n            if (m.get(ia, \"flfcloselistener\")) {\n                var tb = ia;\n                m.set(ia, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        }\n    ;\n        fa = false;\n        jb();\n        ia = null;\n    };\n    function db(tb) {\n        var ub = p.scry(tb, \"[tabindex=\\\"0\\\"]\");\n        ub.forEach(function(vb) {\n            vb.tabIndex = \"-1\";\n        });\n        (ub[0] && (ub[0].tabIndex = \"0\"));\n    };\n    function eb(tb) {\n        if ((p.isNodeOfType(tb, \"label\") && l.hasClass(tb, \"uiButton\"))) {\n            tb = j.getInputElement(tb);\n        };\n        return tb;\n    };\n    function fb(tb) {\n        return m.get(eb(tb), \"profileid\");\n    };\n    function gb(tb) {\n        return (m.get(eb(tb), \"memorialized\") === \"true\");\n    };\n    function hb(tb) {\n        return (m.get(eb(tb), \"cansuggestfriends\") === \"true\");\n    };\n    function ib(tb) {\n        return m.get(eb(tb), \"unref\");\n    };\n    function jb() {\n        (ja && ja.remove());\n        ja = null;\n        (ma && t.unsubscribe(ma));\n        ma = null;\n        (la && clearTimeout(la));\n        la = null;\n    };\n    function kb(tb) {\n        var ub = fb(tb), vb = gb(tb), wb = hb(tb), xb = m.get(tb, \"flloc\"), yb = ib(tb);\n        q.init(ga, ub, xb, vb, wb, yb);\n        l.conditionClass(ga, \"followButtonFlyout\", l.hasClass(tb, \"profileFollowButton\"));\n        l.conditionClass(ga, \"friendButtonFlyout\", ((l.hasClass(tb, \"FriendRequestFriends\") || l.hasClass(tb, \"FriendRequestIncoming\")) || l.hasClass(tb, \"FriendRequestOutgoing\")));\n        l.conditionClass(ga, \"likeButtonFlyout\", l.hasClass(tb, \"profileLikeButton\"));\n        var zb = p.scry(ga, \"div.uiScrollableArea\")[0];\n        (zb && y.poke(zb));\n        var ac = aa.find(ga)[0];\n        (ac && ac.focus());\n    };\n    function lb(tb) {\n        if ((!ea || fa)) {\n            return\n        };\n        ea.setContext(tb);\n        ea.setCausalElement(tb);\n        tb.setAttribute(\"aria-expanded\", \"true\");\n        if (bb(tb)) {\n            l.addClass(tb, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if ((l.hasClass(tb, \"uiButton\") || l.hasClass(tb, \"-cx-PRIVATE-uiButton__root\"))) {\n                l.addClass(tb, \"selected\");\n            };\n        }\n    ;\n        ea.show();\n        ia = tb;\n        fa = true;\n        var ub = null;\n        if (ga) {\n            ub = \"show\";\n            kb(tb);\n        }\n         else {\n            ub = \"init_show\";\n            new i().setURI(\"/ajax/friends/lists/flyout_content.php\").setStatusElement(ea.getContent()).send();\n        }\n    ;\n        jb();\n        ja = g.listen(tb, \"mouseleave\", ob);\n        ma = t.subscribe(\"show\", mb);\n        if (m.get(tb, \"flfcloselistener\")) {\n            clearTimeout(m.remove(tb, \"flfcloselistenertimeout\"));\n        };\n        var vb = fb(tb);\n        r.getFriend(vb, function(wb) {\n            if ((wb.status == r.ARE_FRIENDS)) {\n                new i().setURI(\"/ajax/friends/lists/flyout_log.php\").setData({\n                    target_id: fb(tb),\n                    unref: ib(tb),\n                    action: ub\n                }).send();\n            };\n            if (!ha) {\n                return\n            };\n            if ((wb.status == r.OUTGOING_REQUEST)) {\n                l.show(ha);\n                i.bootstrap(\"/ajax/friends/lists/nux_flyout.php\", null, true);\n            }\n             else l.hide(ha);\n        ;\n        });\n    };\n    function mb(tb, ub) {\n        if ((!((ub instanceof k)) || !p.contains(ia, ub.getContext()))) {\n            ob();\n        };\n    };\n    function nb(tb) {\n        ia = tb;\n        ka = lb.curry(tb).defer(pa);\n        ja = g.listen(tb, \"mouseleave\", function() {\n            clearTimeout(ka);\n            ia = null;\n            (ja && ja.remove());\n        });\n    };\n    function ob() {\n        la = qb.defer(150);\n    };\n    function pb() {\n        var tb = n.getCurrent(), ub = (tb && tb.getBody());\n        return !!((ub && p.scry(ub, \".friendListDialogTourCarousel\")[0]));\n    };\n    function qb() {\n        if ((na || pb())) {\n            return\n        };\n        ((ba.ie() < 8) && document.documentElement.focus());\n        if (ea) {\n            ea.hide();\n            var tb = ea.getCausalElement();\n            (tb && tb.setAttribute(\"aria-expanded\", \"false\"));\n        }\n    ;\n    };\n    function rb(event) {\n        var tb = x.byTag(event.getTarget(), \"a\");\n        if ((tb && l.hasClass(tb, \"FriendListActionItem\"))) {\n            ob();\n        };\n    };\n    function sb(tb) {\n        var ub = m.remove(tb, \"flfcloselistener\");\n        (ub && ub());\n    };\n    e.exports = (a.FriendListFlyoutController || ra);\n});\n__d(\"AddFriendButton\", [\"Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"collectDataAttributes\",\"CSS\",\"DOMQuery\",\"FriendListFlyoutController\",\"FriendStatus\",\"ge\",\"goURI\",\"Style\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncResponse\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"DOMQuery\"), o = b(\"FriendListFlyoutController\"), p = b(\"FriendStatus\"), q = b(\"ge\"), r = b(\"goURI\"), s = b(\"Style\"), t = b(\"URI\"), u = {\n        ERROR_ALREADY_ADDED: 1431005,\n        init: function(v, w, x, y, z, aa, ba, ca, da, ea, fa, ga) {\n            var ha = v.id, ia = null, ja = n.scry(v, \".addButton\")[0], ka = n.scry(v, \".addFriendText\")[0], la = n.scry(v, \".outgoingButton\")[0], ma = n.scry(v, \".incomingButton\")[0], na = n.scry(v, \".friendButton\")[0];\n            function oa(ua, va, wa) {\n                var xa = new t(ja.getAttribute(\"ajaxify\")), ya = l(v, [\"ft\",\"gt\",]);\n                new j().setURI(aa).setData({\n                    to_friend: w,\n                    action: ua,\n                    how_found: y,\n                    ref_param: z,\n                    link_data: ya,\n                    outgoing_id: la.id,\n                    xids: xa.getQueryData().xids,\n                    logging_location: ba,\n                    no_flyout_on_click: ca,\n                    ego_log_data: da,\n                    http_referer: fa\n                }).setErrorHandler(va).setServerDialogCancelHandler(wa).setRelativeTo(la).send();\n                if ((ga && (ua === \"add_friend\"))) {\n                    new j().setURI(\"/ajax/add_friend/chain_pymk.php\").send();\n                };\n            };\n            function pa(ua, va) {\n                if (ka) {\n                    m.hide(ka);\n                }\n                 else if (ja) {\n                    m.hide(ja);\n                }\n            ;\n                (la && m.hide(la));\n                (ma && m.hide(ma));\n                (na && m.hide(na));\n                if (ua) {\n                    m.show(ua);\n                };\n                if ((((\"Outgoing\" == va) && (ia != va)) && ea)) {\n                    new h(ua).from(\"backgroundColor\", \"#FFF8CC\").to(\"backgroundColor\", \"transparent\").from(\"borderColor\", \"#FFE222\").to(\"borderColor\", s.get(ua, \"borderLeftColor\")).duration(2000).go();\n                };\n                (ia && m.removeClass(v, (\"fStatus\" + ia)));\n                ia = va;\n                m.addClass(v, (\"fStatus\" + va));\n            };\n            function qa(ua) {\n                if (m.hasClass(ua, \"enableFriendListFlyout\")) {\n                    o.show(ua);\n                }\n                 else o.hide();\n            ;\n            };\n            var ra = i.subscribe(\"FriendRequest/change\", function(ua, va) {\n                ta();\n                if ((va.uid != w)) {\n                    return\n                };\n                switch (va.status) {\n                  case p.ARE_FRIENDS:\n                    return pa(na, \"Friends\");\n                  case p.INCOMING_REQUEST:\n                    return pa(ma, \"Incoming\");\n                  case p.OUTGOING_REQUEST:\n                    return pa(la, \"Outgoing\");\n                  case p.CAN_REQUEST:\n                    return pa((ka ? ka : ja), \"Requestable\");\n                };\n            }), sa;\n            if (x) {\n                sa = i.subscribe(\"FriendRequest/confirm\", function(ua, va) {\n                    ta();\n                    ((va.uid == w) && r(x));\n                });\n            };\n            (ja && g.listen(ja, \"click\", function() {\n                i.inform(\"FriendRequest/sending\", {\n                    uid: w\n                });\n                if (ca) {\n                    o.setActiveNode(la);\n                }\n                 else qa(la);\n            ;\n                oa(\"add_friend\", function(ua) {\n                    var va = ((ua.error == u.ERROR_ALREADY_ADDED) ? \"FriendRequest/sent\" : \"FriendRequest/sendFail\");\n                    i.inform(va, {\n                        uid: w\n                    });\n                    o.hide();\n                    k.defaultErrorHandler(ua);\n                }, function(ua) {\n                    i.inform(\"FriendRequest/sendFail\", {\n                        uid: w\n                    });\n                    o.hide();\n                });\n            }));\n            function ta() {\n                if (q(ha)) {\n                    return\n                };\n                (ra && ra.unsubscribe());\n                (sa && sa.unsubscribe());\n                ra = sa = null;\n            };\n        }\n    };\n    e.exports = u;\n});\n__d(\"FriendButtonIcon\", [\"Arbiter\",\"FriendStatus\",\"Button\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FriendStatus\"), i = b(\"Button\"), j = b(\"arrayContains\");\n    e.exports = {\n        register: function(k, l, m) {\n            g.subscribe(\"FriendListMembershipChange\", function(n, o) {\n                if ((o.uid == m)) {\n                    var p = j(o.lists, h.CLOSE_FRIENDS), q = j(o.lists, h.ACQUAINTANCES);\n                    if ((p && !q)) {\n                        i.setIcon(k, l.close);\n                    }\n                     else if ((q && !p)) {\n                        i.setIcon(k, l.acquaintance);\n                    }\n                     else i.setIcon(k, l.friend);\n                    \n                ;\n                }\n            ;\n            });\n        }\n    };\n});\n__d(\"PopoverMenuShowOnHover\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._popoverMenu = j;\n        this._listeners = [];\n    };\n    h(i.prototype, {\n        enable: function() {\n            this._attachMouseListeners(this._popoverMenu.getTriggerElem());\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", this._onSetMenu.bind(this));\n        },\n        disable: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            if (this._setMenuSubscription) {\n                this._setMenuSubscription.unsubscribe();\n                this._setMenuSubscription = null;\n            }\n        ;\n        },\n        _onSetMenu: function() {\n            this._attachMouseListeners(this._popoverMenu.getMenu().getRoot());\n        },\n        _attachMouseListeners: function(j) {\n            var k = this._popoverMenu.getPopover();\n            this._listeners.push(g.listen(j, \"mouseenter\", k.showLayer.bind(k)), g.listen(j, \"mouseleave\", k.hideLayer.bind(k)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"OGCollectionAddDialog\", [\"AsyncRequest\",\"DataStore\",\"DOMQuery\",\"Form\",\"MenuDeprecated\",\"URI\",\"collectDataAttributes\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Form\"), k = b(\"MenuDeprecated\"), l = b(\"URI\"), m = b(\"collectDataAttributes\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"tidyEvent\"), q = \"OGCollectionAddDialog\";\n    function r(s, t, u, v, w) {\n        this._dialog = s;\n        this._surface = t;\n        this._endpoint = l(v);\n        this._loadEditMenu = w.loadEditMenu;\n        this._listener = h.get(String(u), q);\n        this._audienceSelector = i.find(this._dialog.getContent(), \".audienceSelector\");\n        this._menu = i.find(this._dialog.getContent(), \".-cx-PRIVATE-fbOGCollectionAddMenu__menu\");\n        k.register(this._menu);\n        this._menuSubscriptionToken = k.subscribe(\"select\", this._onMenuClick.bind(this));\n        p([this._dialog.subscribe(\"show\", this._onDialogShow.bind(this)),this._dialog.subscribe(\"hide\", this._onDialogHide.bind(this)),]);\n        this._dialog.show();\n    };\n    n(r, {\n        INSTANCE_KEY: q\n    });\n    n(r.prototype, {\n        _onDialogShow: function() {\n            this._listener.onDialogShow(this._dialog);\n        },\n        _onDialogHide: function() {\n            this._destroy();\n        },\n        _onMenuClick: function(s, t) {\n            if ((t.menu !== this._menu)) {\n                return\n            };\n            var u = t.item;\n            this._listener.onMenuClick(u);\n            var v = i.find(u, \".-cx-PRIVATE-fbOGCollectionAddMenu__collectiontoken\"), w = v.getAttribute(\"value\");\n            this._submitRequest(w);\n        },\n        _submitRequest: function(s) {\n            this._endpoint.addQueryData({\n                collection_token: s\n            });\n            this._dialog.hide();\n            this._request = new g(this._endpoint).setData(n(j.serialize(this._audienceSelector), {\n                action: \"add\",\n                load_edit_menu: this._loadEditMenu,\n                surface: this._surface\n            }, m(this._dialog.getContext(), [\"ft\",]))).setHandler(function() {\n                this._listener.onAddSuccess();\n            }.bind(this));\n            this._request.send();\n        },\n        _destroy: function() {\n            this._listener.onDialogHide();\n            k.unsubscribe(this._menuSubscriptionToken);\n        }\n    });\n    e.exports = r;\n});\n__d(\"OGCollectionAddMenu\", [\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"Event\",\"OGCollectionAddDialog\",\"Parent\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Event\"), l = b(\"OGCollectionAddDialog\"), m = b(\"Parent\"), n = b(\"TidyArbiterMixin\"), o = b(\"copyProperties\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\");\n    function s(t, u, v, w, x, y) {\n        this._image = u;\n        this._container = v;\n        this._placeholder = w;\n        this._surface = x;\n        this._showPlaceholder = y.showPlaceholder;\n        this._rateControl = i.scry(this._container.parentNode, \".-cx-PRIVATE-fbOGCollectionRateDialog__wrapperlink\")[0];\n        s.inform(\"addButton\", {\n            button: this._image,\n            root: this._container\n        });\n        r(k.listen(this._container, \"click\", function(z) {\n            var aa = m.byClass(z.getTarget(), \"-cx-PUBLIC-fbOGCollectionAddMenu__hoverimg\");\n            if ((this.isDialogShowing() && aa)) {\n                z.kill();\n            };\n        }.bind(this)));\n        if ((this._surface === \"friend_timeline_lhc\")) {\n            this._handleAlwaysVisibleLHC();\n        };\n        h.set(String(t), l.INSTANCE_KEY, this);\n    };\n    o(s, n);\n    o(s.prototype, n, {\n        destroy: function() {\n            i.remove(this._container);\n            this._placeholder.destroy();\n        },\n        hide: function() {\n            g.hide(this._container);\n            this._placeholder.hide();\n        },\n        getParent: function() {\n            return this._container.parentNode;\n        },\n        insertMenuIntoDialog: function(t) {\n            this._placeholder.insertIntoDialog(t);\n        },\n        onMenuClick: function(t) {\n            var u = j.find(t, \".-cx-PRIVATE-fbOGCollectionAddMenu__showrate\");\n            this._showRate = (this._rateControl && u.getAttribute(\"value\"));\n            g.hide(this._image);\n            if (this._showRate) {\n                g.show(this._rateControl);\n                k.fire(this._rateControl, \"click\");\n            }\n             else if (this._showPlaceholder) {\n                g.show(this._placeholder.getIcon());\n            }\n        ;\n        },\n        onAddSuccess: function() {\n            if ((!this._showPlaceholder && !this._showRate)) {\n                this.inform(\"reload\");\n            };\n        },\n        onDialogShow: function(t) {\n            var u = j.find(t.getContent(), \".audienceSelector\");\n            g.addClass(this._image, \"openToggler\");\n            s.inform(\"menuOpened\", {\n                audienceSelector: u.parentNode\n            });\n            this._dialogShowing = true;\n        },\n        onDialogHide: function() {\n            g.removeClass(this._image, \"openToggler\");\n            this._dialogShowing = false;\n        },\n        isDialogShowing: function() {\n            return this._dialogShowing;\n        },\n        _handleAlwaysVisibleLHC: function() {\n            var t = m.byClass(this._container, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__container\"), u = m.byClass(t, \"-cx-PRIVATE-ogAppReport__root\");\n            if (g.hasClass(t, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\")) {\n                r([this._alwaysVisibleToken = k.listen(u, \"mouseenter\", function() {\n                    g.removeClass(t, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\");\n                    this._alwaysVisibleToken.remove();\n                }.bind(this)),]);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"TimelineAppSectionCuration\", [\"Animation\",\"AppSectionCurationState\",\"Arbiter\",\"AsyncSignal\",\"CSS\",\"DOM\",\"Ease\",\"Event\",\"OnVisible\",\"Parent\",\"Style\",\"TidyArbiterMixin\",\"TimelineSection\",\"copyProperties\",\"cx\",\"queryThenMutateDOM\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AppSectionCurationState\"), i = b(\"Arbiter\"), j = b(\"AsyncSignal\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Ease\"), n = b(\"Event\"), o = b(\"OnVisible\"), p = b(\"Parent\"), q = b(\"Style\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineSection\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"queryThenMutateDOM\"), w = b(\"tidyEvent\"), x = 0, y = {\n    }, z = {\n    };\n    function aa(fa, ga, ha) {\n        var ia, ja, ka = (((ga != h.hide)) && ((ha != h.hide)));\n        v(function() {\n            ja = fa.offsetHeight;\n            ia = ((ga === h.hide) ? 0 : fa.firstChild.offsetHeight);\n        }, function() {\n            q.set(fa, \"height\", (ja + \"px\"));\n            q.set(fa, \"overflow\", \"hidden\");\n            (ia && k.addClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\"));\n            o.checkBuffer.defer();\n            var la = l.getID(fa);\n            (z[la] && z[la].stop());\n            z[la] = new g(fa).to(\"height\", ia).ondone(function() {\n                delete z[la];\n                if (ia) {\n                    q.set(fa, \"overflow\", \"\");\n                    q.set(fa.parentNode, \"overflow\", \"\");\n                }\n            ;\n                (!ia && k.removeClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\"));\n                i.inform(\"reflow\");\n            }).duration((Math.abs((ia - ja)) * ((ka ? 5 : 1.5)))).ease(m.sineOut).go();\n        });\n    };\n    function ba(fa, ga) {\n        if (fa) {\n            k.show(ga);\n            k.hide(fa);\n        }\n    ;\n    };\n    function ca(fa, ga) {\n        if (fa) {\n            k.show(fa);\n            k.hide(ga);\n        }\n    ;\n    };\n    function da(fa, ga) {\n        s.callWithSection(fa, function(ha) {\n            new j(\"/ajax/timeline/collections/app_recs/\", {\n                collection_token: ha.getActiveCollection().getToken(),\n                event_type: ga\n            }).send();\n        });\n    };\n    var ea = t({\n        addSection: function(fa, ga, ha) {\n            y[fa] = {\n                appClickLogged: false,\n                buttons: ga,\n                content: ha,\n                id: fa,\n                state: h.hide\n            };\n            q.set(ha, \"height\", \"0px\");\n            q.set(ha, \"overflow\", \"hidden\");\n            k.show(ha);\n            for (var ia in ga) {\n                w([n.listen(ga[ia].hide_button, \"click\", ea.informState.curry(h.hide, fa)),n.listen(ga[ia].show_button, \"click\", ea.informState.curry(ia, fa)),]);;\n            };\n            ea.register(fa, function(ja, ka, la, ma) {\n                new o(ha, aa.curry(ha, ja, ma), true, x);\n                for (var na in ga) {\n                    ca(ga[na].show_button, ga[na].hide_button);;\n                };\n                if (ga[ja]) {\n                    ba(ga[ja].show_button, ga[ja].hide_button);\n                };\n            });\n        },\n        informState: function(fa, ga) {\n            if ((y[ga] && (y[ga].state !== fa))) {\n                if (((fa === h.showApps) && !y[ga].appClickLogged)) {\n                    y[ga].appClickLogged = true;\n                    da(ga, \"add_apps_click\");\n                }\n            ;\n                var ha = y[ga].state;\n                y[ga].state = fa;\n                ea.inform(fa, {\n                    obj: y[ga],\n                    oldState: ha\n                });\n            }\n        ;\n        },\n        linkContent: function(fa, ga, ha) {\n            var ia = y[fa].buttons[h.showApps].show_button;\n            k.show(p.byClass(ia, \"hidden_elem\"));\n            new o(ia, function() {\n                if ((Math.floor((Math.random() * 100)) === 0)) {\n                    da(fa, \"add_apps_imp\");\n                };\n            }, true, x);\n            ea.register(fa, function(ja, ka, la, ma) {\n                if ((ja == h.showItems)) {\n                    if ((ma == h.showApps)) {\n                        q.set(y[fa].content.parentNode, \"overflow\", \"hidden\");\n                    };\n                    k.show(ga);\n                    k.hide(ha);\n                }\n                 else if ((ja == h.showApps)) {\n                    k.hide(ga);\n                    k.show(ha);\n                }\n                \n            ;\n            });\n        },\n        register: function(fa, ga) {\n            var ha = ea.subscribe([h.hide,h.showItems,h.showApps,], function(ia, ja) {\n                if ((ja.obj.id === fa)) {\n                    ga(ia, ja.obj, ha, ja.oldState);\n                };\n            });\n        },\n        getSectionState: function(fa) {\n            if (y[fa]) {\n                return y[fa].state\n            };\n        }\n    }, r);\n    e.exports = ea;\n});\n__d(\"TimelineMonitor\", [\"Arbiter\",\"Event\",\"Run\",\"Vector\",\"ViewportBounds\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"queryThenMutateDOM\"), n = {\n    }, o = {\n    }, p = 0, q = [], r = null, s = false;\n    function t() {\n        n = {\n        };\n        o = {\n        };\n        p = 0;\n        q.length = 0;\n        (r && r.remove());\n        r = null;\n        s = false;\n    };\n    function u() {\n        if (!r) {\n            r = h.listen(window, \"scroll\", z);\n        };\n        if (!s) {\n            i.onLeave(t);\n            s = true;\n        }\n    ;\n        z();\n    };\n    var v = [], w = [];\n    function x() {\n        q.forEach(function(ea) {\n            var fa = aa.getSection(ea);\n            if ((fa && (fa !== o[ea.id]))) {\n                o[ea.id] = fa;\n                v.push({\n                    section: fa\n                });\n            }\n        ;\n        });\n        var ba = (k.getTop() + j.getScrollPosition().y);\n        for (var ca in n) {\n            var da = n[ca];\n            if (((((ba >= da.boundary) && (p <= da.boundary))) || (((ba <= da.boundary) && (p >= da.boundary))))) {\n                n[ca].fromAbove = (p < ba);\n                w.push(n[ca]);\n            }\n        ;\n        };\n        p = ba;\n    };\n    function y() {\n        v.forEach(function(ba) {\n            g.inform(aa.SECTION_CHANGE, ba);\n        });\n        w.forEach(function(ba) {\n            g.inform(aa.BOUNDARY_PASSED, ba);\n        });\n        v.length = 0;\n        w.length = 0;\n    };\n    function z() {\n        m(x, y, \"TimelineMonitor/scroll\");\n    };\n    var aa = {\n        BOUNDARY_PASSED: \"TimelineMonitor/boundary\",\n        SECTION_CHANGE: \"TimelineMonitor/change\",\n        getSection: function(ba) {\n            var ca = (k.getTop() + j.getScrollPosition().y), da = ba.childSections.getHead();\n            while (da) {\n                if ((l(da.nodeID) && (ca < (j.getElementPosition(da.getNode()).y + j.getElementDimensions(da.getNode()).y)))) {\n                    return da\n                };\n                da = da.getNext();\n            };\n        },\n        monitorBoundary: function(ba, ca) {\n            ca = (ca || ba);\n            if ((!n[ca] || (n[ca].boundary !== ba))) {\n                n[ca] = {\n                    boundary: ba,\n                    id: ca\n                };\n                u();\n            }\n        ;\n        },\n        monitorSection: function(ba) {\n            o[ba.id] = null;\n            q.push(ba);\n            u();\n            return aa.getSection(ba);\n        },\n        poke: function(ba) {\n            z();\n        }\n    };\n    e.exports = aa;\n});\n__d(\"TimelineAppSection\", [\"AppSectionCurationState\",\"Arbiter\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"JSLogger\",\"MedleyPageletRequestData\",\"PageletSet\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineAppCollection\",\"TimelineAppSectionCuration\",\"TimelineDynamicSection\",\"TimelineMonitor\",\"TimelineSection\",\"TimelineSmartInsert\",\"TriggerablePageletLoader\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"DOMScroll\"), n = b(\"JSLogger\"), o = b(\"MedleyPageletRequestData\"), p = b(\"PageletSet\"), q = b(\"Style\"), r = b(\"TidyArbiter\"), s = b(\"TidyArbiterMixin\"), t = b(\"TimelineAppCollection\"), u = b(\"TimelineAppSectionCuration\"), v = b(\"TimelineDynamicSection\"), w = b(\"TimelineMonitor\"), x = b(\"TimelineSection\"), y = b(\"TimelineSmartInsert\"), z = b(\"TriggerablePageletLoader\"), aa = b(\"ViewportBounds\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"ge\"), fa = b(\"tx\"), ga = 500, ha = 2, ia = 500, ja = 18, ka = \"-cx-PRIVATE-fbTimelineAppSection__tabscondensed\", la = \"-cx-PRIVATE-fbTimelineAppSection__activetab\", ma = k.create(\"div\", {\n        className: \"-cx-PRIVATE-fbTimelineAppSection__tabnub\"\n    });\n    function na() {\n        return k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdown\"\n        }, [k.create(\"a\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownlabel\",\n            href: \"#\"\n        }, \"More\"),k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\"\n        }),]);\n    };\n    var oa = n.create(\"collections\"), pa = {\n        notes: 295,\n        events: 345,\n        photos: 555,\n        app_quoraapp: 569,\n        friends: 603,\n        app_foodspotting: 621,\n        map: 621,\n        favorites: 645,\n        app_pinterestapp: 699,\n        app_instapp: 699,\n        books: 699,\n        movies: 699,\n        tv: 699,\n        music: 725\n    };\n    function qa(sa) {\n        return pa[sa.replace(\"pagelet_timeline_medley_\", \"\")];\n    };\n    function ra(sa, ta, ua, va) {\n        this.parent.construct(this, ra.getIDBySK(ta), sa, ua);\n        this._sk = ta;\n        this._title = va;\n    };\n    i.extend(ra, v);\n    ba(ra, {\n        createFromArray: function(sa) {\n            return sa.map(function(ta) {\n                return new ra(ta.controller, ta.sk, ta.label, ta.title);\n            });\n        },\n        getIDBySK: function(sa) {\n            return (\"pagelet_timeline_medley_\" + sa);\n        },\n        registerCollections: function(sa, ta, ua) {\n            x.callWithSection(ra.getIDBySK(sa), function(va) {\n                t.createFromArray(ta).forEach(va.appendSection.bind(va));\n                var wa = va.childSections.get(ua);\n                va.setActiveCollection(wa);\n                wa.setIsLoaded(true);\n            });\n        },\n        removeEmptyAppSection: function(sa) {\n            x.callWithSection(ra.getIDBySK(sa), function(ta) {\n                ta.remove();\n            });\n        }\n    }, s);\n    ba(ra.prototype, s, {\n        _createNode: function() {\n            var sa = this.parent._createNode();\n            sa.setAttribute(\"aria-labelledby\", (\"medley_header_\" + this._sk));\n            sa.setAttribute(\"aria-role\", \"region\");\n            k.prependContent(sa, k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__header\"\n            }, [this._title,k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__tabs\",\n                \"aria-role\": \"tablist\"\n            }),]));\n            this.resetMinHeight(sa);\n            return sa;\n        },\n        addAuxContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\")[0];\n            (ta && k.appendContent(ta, sa));\n            (this._activeCollection && this._checkTabDimensions(this._activeCollection));\n        },\n        nullStateCurationContent: function() {\n            if (!this._nullStateContent) {\n                return\n            };\n            var sa = l.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\");\n            k.replace(sa.firstChild, this._nullStateContent);\n        },\n        addCurationContent: function(sa, ta, ua) {\n            var va = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\")[0];\n            (va && k.appendContent(va, sa));\n            if (ua) {\n                this._nullStateContent = ua;\n            };\n            this._checkCurationContent(ta);\n        },\n        createTriggerLoader: function(sa) {\n            var ta = function(ua) {\n                this._parentSection._lastLoadedSection = this;\n                this.setIsLoaded(true);\n                y.enable();\n                y.run(this.getNode(), function() {\n                    ua();\n                    this.unsetMinHeight();\n                    w.poke(this._parentSection.id);\n                }.bind(this), \"viewport\");\n            }.bind(this);\n            r.subscribe(\"Medley/requestDataSet\", function() {\n                this._triggerLoader = new z({\n                    controller: this._controller,\n                    data: this.getData(),\n                    displayCallback: ta,\n                    options: {\n                        constHeight: true\n                    },\n                    node: this.getNode()\n                }, [{\n                    node: this.getNode(),\n                    onVisibleBuffer: ga,\n                    onVisibleStrict: true,\n                    type: (sa ? z.TRIGGER_NOW : z.TRIGGER_ONVISIBLE)\n                },]);\n            }.bind(this));\n        },\n        freeze: function() {\n            j.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            if ((ea(this.nodeID) && !this.isLoaded())) {\n                (this._triggerLoader && this._triggerLoader.disableTriggers());\n            };\n            this.freezeChildren();\n        },\n        getData: function() {\n            if (!this._data) {\n                this._data = ba({\n                    sk: this._sk\n                }, o.get(), {\n                    overview: (this._parentSection._sk !== this._sk)\n                });\n            };\n            return this._data;\n        },\n        getActiveCollection: function() {\n            return this._activeCollection;\n        },\n        remove: function() {\n            if (p.hasPagelet(this.id)) {\n                p.removePagelet(this.id);\n            };\n            k.remove(this.getNode());\n            this._parentSection.childSections.remove(this.id);\n        },\n        setActiveCollection: function(sa) {\n            if (((this._activeCollection === sa) || !sa._tabNode)) {\n                return\n            };\n            if (this._activeCollection) {\n                h.inform(\"TimelineSideAds/refresh\");\n                oa.log(\"change_collection\", {\n                    previous_collection: this._activeCollection.getToken(),\n                    new_collection: sa.getToken()\n                });\n                this.resetMinHeight();\n                this._activeCollection.disableContentLoader();\n                j.hide(this._activeCollection.getNode());\n                j.removeClass(this._activeCollection._tabNode, la);\n                k.scry(this._activeCollection._tabNode, \"div.-cx-PRIVATE-fbTimelineAppSection__tabnub\").forEach(k.remove);\n                k.appendContent(sa._tabNode, ma.cloneNode(true));\n                (this._activeCollection.auxContent && j.hide(this._activeCollection.auxContent));\n                (this._activeCollection.curationContent && j.hide(this._activeCollection.curationContent));\n                this._activeCollection._tabNode.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n            (sa.auxContent && j.show(sa.auxContent));\n            this._checkCurationContent(sa);\n            j.addClass(sa._tabNode, la);\n            this._checkTabDimensions(sa);\n            this._activeCollection = sa;\n            ra.inform(\"changeCollection\");\n            if (!ea(sa.nodeID)) {\n                k.appendContent(l.find(this.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), sa.getNode());\n            };\n            j.show(sa.getNode());\n            (sa.isLoaded() && this.unsetMinHeight());\n            sa._tabNode.setAttribute(\"aria-selected\", \"true\");\n            sa.enableContentLoader();\n        },\n        resetMinHeight: function(sa) {\n            (sa || (sa = this.getNode()));\n            var ta = (qa(this.id) || (sa.offsetHeight - ha));\n            ((ta > 0) && this._updateScrollAfterHeight(sa, ta));\n        },\n        scrollTo: function(sa, ta) {\n            var ua = aa.getElementPosition(this.getNode());\n            ua.y -= (sa || ja);\n            (ta && this._parentSection.toggleScrollLoad(false));\n            m.scrollTo(ua, ia, null, null, function() {\n                ua = aa.getElementPosition(this.getNode());\n                ua.y -= (sa || ja);\n                m.scrollTo(ua);\n                (ta && this._parentSection.toggleScrollLoad(true));\n            }.bind(this));\n        },\n        thaw: function() {\n            j.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            (this._triggerLoader && this._triggerLoader.enableTriggers());\n            this.thawChildren();\n        },\n        unsetMinHeight: function() {\n            this._updateScrollAfterHeight(this.getNode(), 0);\n        },\n        _updateScrollAfterHeight: function(sa, ta) {\n            q.set(sa, \"min-height\", (ta + \"px\"));\n            h.inform(\"reflow\");\n        },\n        _checkCurationContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcurationbutton\")[0];\n            if (ta) {\n                j.conditionShow(ta, sa.curationContent);\n                if (sa.curationContent) {\n                    j.show(sa.curationContent);\n                    if (sa.curationContentState) {\n                        u.informState(sa.curationContentState, this.id);\n                    };\n                }\n                 else u.informState(g.hide, this.id, g.showItems);\n            ;\n            }\n        ;\n        },\n        _getTabObj: function() {\n            if (!this._tabObj) {\n                this._tabObj = {\n                    aux: k.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\"),\n                    items: [],\n                    nav: k.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__navigation\"),\n                    tabs: k.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tabs\"),\n                    width: 0\n                };\n                j.addClass(this._tabObj.tabs, \"-cx-PRIVATE-fbTimelineAppSection__tabsloaded\");\n            }\n        ;\n            return this._tabObj;\n        },\n        _checkTabDimensions: function(sa) {\n            var ta = this._getTabObj(), ua = (ta.nav.offsetWidth - ta.aux.offsetWidth);\n            if ((ua >= ta.width)) {\n                if ((!ta.hidden && ((ua - ta.tabs.offsetWidth) >= 0))) {\n                    return\n                };\n                j.removeClass(ta.tabs, ka);\n            }\n        ;\n            if ((ta.hidden && (sa._tabNode.parentNode === ta.overflow))) {\n                k.prependContent(ta.overflow, ta.dropdown.previousSibling);\n                k.insertBefore(ta.dropdown, sa._tabNode);\n            }\n        ;\n            if ((((ua - ta.tabs.offsetWidth) >= 0) && !ta.hidden)) {\n                return\n            };\n            var va = ta.items.length;\n            if ((va && ta.hidden)) {\n                for (var wa = 0; (wa < va); wa++) {\n                    k.appendContent(ta.tabs, ta.items[wa]);;\n                };\n                k.remove(ta.dropdown);\n            }\n        ;\n            j.conditionClass(ta.tabs, ka, ((ua - ta.tabs.offsetWidth) < 0));\n            ta.width = ua;\n            ta.hidden = 0;\n            if (((ua - ta.tabs.offsetWidth) >= 0)) {\n                return\n            };\n            if (!ta.dropdown) {\n                ta.dropdown = na();\n                ta.overflow = k.find(ta.dropdown, \".-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\");\n                ta.items = k.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tab\");\n                va = ta.items.length;\n            }\n        ;\n            k.appendContent(ta.tabs, ta.dropdown);\n            var xa = 0;\n            for (wa = (va - 1); ((wa > 0) && (xa <= 0)); wa--) {\n                if ((ta.items[wa] !== sa._tabNode)) {\n                    k.prependContent(ta.overflow, ta.items[wa]);\n                    xa = (ua - ta.tabs.offsetWidth);\n                    ta.hidden++;\n                }\n            ;\n            };\n        }\n    });\n    e.exports = ra;\n});\n__d(\"TimelineCoverDisclaimer\", [\"Dialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\");\n    function h(i, j, k) {\n        if ((h.displayed === undefined)) {\n            h.displayed = true;\n        }\n         else return\n    ;\n        new g().setModal(true).setTitle(i).setBody(j).setButtonsMessage(k).setButtons(g.OK).show();\n    };\n    e.exports = h;\n});\n__d(\"legacy:TimelineCoverDisclaimer\", [\"TimelineCoverDisclaimer\",], function(a, b, c, d) {\n    a.TimelineCoverDisclaimer = b(\"TimelineCoverDisclaimer\");\n}, 3);\n__d(\"TimelineMedley\", [\"Class\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"PageTransitions\",\"TimelineAppSection\",\"TimelineDynamicSectionConfig\",\"TimelineMonitor\",\"TimelineSection\",\"URI\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMPosition\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"TimelineAppSection\"), n = b(\"TimelineDynamicSectionConfig\"), o = b(\"TimelineMonitor\"), p = b(\"TimelineSection\"), q = b(\"URI\"), r = b(\"ViewportBounds\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"ge\"), w = b(\"$\"), x = \"timeline-medley\", y = \"about\", z = 2, aa = false;\n    function ba(ea) {\n        var fa = (ea.getQueryData().sk || ea.getPath().split(\"/\")[2]);\n        return (n.skmapping[fa] || fa);\n    };\n    function ca(ea) {\n        if (ea.getQueryData().id) {\n            return ea.getQueryData.id\n        };\n        return ea.getPath().split(\"/\")[1];\n    };\n    function da(ea, fa, ga) {\n        this.parent.construct(this, x);\n        this.isOverview = (ea.length > 1);\n        n.breaker = ga.breaker;\n        m.createFromArray(ea).forEach(this.appendSection.bind(this));\n        o.monitorSection(this);\n        this._lastLoadedSection = this.childSections.get(m.getIDBySK(fa)).setIsLoaded(true);\n        p.setActiveSectionID(this._lastLoadedSection.id);\n        if ((aa && this.isMedleyView())) {\n            this.addSectionPlaceholders();\n        };\n        var ha = q.getNextURI();\n        this._vanity = ca(ha);\n        this._sk = ba(ha);\n        if (this.isOverview) {\n            l.registerHandler(this._transitionHandler.bind(this));\n        };\n    };\n    g.extend(da, p);\n    s(da, {\n        loadToSection: function(ea, fa) {\n            p.setActiveSectionID(ea);\n            p.callWithSection(x, function(ga) {\n                var ha = ga.childSections.getHead(), ia = 0;\n                while ((ha && (ha.id !== ea))) {\n                    ia++;\n                    ha = ha.getNext();\n                };\n                if (!ia) {\n                    return fa(ha)\n                };\n                ia--;\n                (ia && ga.addUpcomingSectionPlaceholders(ga.childSections.getHead(), ia));\n                ga.addSectionPlaceholder(ha, ha.getPrev(), true);\n                var ja = ha.subscribe(\"loaded\", function() {\n                    fa(ha);\n                    ja.unsubscribe();\n                });\n            });\n        },\n        scrollToSection: function(ea, fa, ga) {\n            p.callWithSection(ea, function(ha) {\n                ha.scrollTo(fa, ga);\n            });\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            p.callWithSection(x, function(fa) {\n                fa.toggleScrollLoad(ea);\n            });\n        }\n    });\n    s(da.prototype, {\n        addSectionTeasers: function() {\n            if (!this.isMedleyView()) {\n                h.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                this.thawChildren();\n                this.addSectionPlaceholders();\n                this.addSectionBreak();\n            }\n        ;\n        },\n        addUpcomingSectionPlaceholders: function(ea, fa) {\n            fa = (fa || z);\n            while (ea = ea.getNext()) {\n                if ((!this.addSectionPlaceholder(ea, ea.getPrev()) && (--fa <= 0))) {\n                    break;\n                };\n            };\n        },\n        addSectionPlaceholder: function(ea, fa, ga) {\n            if ((!ea.isLoaded() && v(ea.nodeID))) {\n                return false\n            };\n            if (!v(ea.nodeID)) {\n                i.insertAfter(fa.getNode(), ea.getNode());\n                ea.createTriggerLoader(ga);\n                return false;\n            }\n        ;\n            return true;\n        },\n        addSectionBreak: function() {\n            if (this._lastLoadedSection.getNext()) {\n                i.insertAfter(this.childSections.getHead().getNode(), n.breaker);\n            }\n             else i.remove(n.breaker);\n        ;\n        },\n        addSectionPlaceholders: function() {\n            this.addUpcomingSectionPlaceholders(this._lastLoadedSection);\n        },\n        getNode: function() {\n            return w(this.id);\n        },\n        isMedleyView: function() {\n            return (this._sk === y);\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            if (ea) {\n                this.thawChildren();\n                this.addSectionPlaceholders();\n            }\n             else this.freezeChildren();\n        ;\n        },\n        _transitionHandler: function(ea) {\n            if ((ca(ea) !== this._vanity)) {\n                return false\n            };\n            var fa = ba(ea);\n            if (!fa) {\n                return false\n            };\n            if ((fa === y)) {\n                return false;\n            }\n             else {\n                var ga = ea.getQueryData();\n                if (!ga.next_cursor) {\n                    return false\n                };\n                var ha = this.childSections.getHead();\n                while (ha) {\n                    if ((ha._sk === fa)) {\n                        if ((!ha._activeCollection && !k.scry(ha._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\")[0])) {\n                            return false\n                        };\n                        this._transitionToSection.bind(this, ha, ga).defer();\n                        return true;\n                    }\n                ;\n                    ha = ha.getNext();\n                };\n            }\n        ;\n            return false;\n        },\n        _transitionToSection: function(ea, fa) {\n            var ga = (j.getElementPosition(ea.getNode()).y - r.getTop());\n            i.scry(ea.getNode(), \".-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\").forEach(function(ja) {\n                h.removeClass(ja, \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n            });\n            this._sk = ea._sk;\n            p.setActiveSectionID(ea.id);\n            ea.thaw();\n            h.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n            this.freezeChildren();\n            var ha = k.find(ea._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            ea._activeCollection.addContentLoader(ha, fa.next_cursor);\n            ea._activeCollection._contentLoader.load({\n                node: ha\n            });\n            var ia = this.childSections.getHead();\n            while ((ia && (ia.id !== ea.id))) {\n                ia.remove();\n                ia = this.childSections.getHead();\n            };\n            p.inform(\"Medley/transitionToSection\", ea.id);\n            ea.scrollTo(((ga < 0) ? ga : 0));\n            l.transitionComplete();\n        }\n    });\n    e.exports = da;\n});\n__d(\"TimelineNavLight\", [\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineSection\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"Parent\"), k = b(\"TimelineSection\"), l = b(\"csx\"), m = b(\"cx\");\n    function n(o) {\n        var p = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__activeitem\")[0], q = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__item\"), r = j.byClass(o, \"-cx-PRIVATE-fbTimelineLightHeader__navwrapper\").offsetWidth, s = q[(q.length - 1)];\n        if (((s.offsetLeft + s.offsetWidth) > r)) {\n            g.addClass(o, \"-cx-PRIVATE-fbTimelineNavLight__navminimal\");\n        };\n        for (var t = (q.length - 1); (t > 1); t--) {\n            if (((q[t].offsetLeft + q[t].offsetWidth) > r)) {\n                h.remove(q[t]);\n            }\n             else break;\n        ;\n        };\n        var u = \"-cx-PUBLIC-fbTimelineLightHeader__loading\";\n        g.removeClass(j.byClass(o, u), u);\n        k.subscribe(\"Medley/transitionToSection\", function(v, w) {\n            if ((p && (w === p.getAttribute(\"data-medley-id\")))) {\n                return\n            };\n            (p && g.removeClass(p, \"-cx-PRIVATE-fbTimelineNavLight__activeitem\"));\n            for (var x = 0; (x < q.length); ++x) {\n                if ((q[x].getAttribute(\"data-medley-id\") === w)) {\n                    g.addClass(q[x], \"-cx-PRIVATE-fbTimelineNavLight__activeitem\");\n                    p = q[x];\n                    return;\n                }\n            ;\n            };\n        });\n    };\n    e.exports = n;\n});\n__d(\"TimelineOGCollectionAddSelector\", [\"AsyncRequest\",\"DOM\",\"Form\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DOM\"), i = b(\"Form\"), j = b(\"TidyArbiterMixin\"), k = b(\"copyProperties\"), l = b(\"csx\"), m = b(\"tidyEvent\");\n    function n(o, p, q, r) {\n        this._endpoint = q;\n        this._button = o;\n        this._buttonParent = o.parentNode;\n        this._audienceSelector = r;\n        var s = h.find(o, \".-cx-PUBLIC-fbTimelineAddSelector__menubutton\");\n        n.inform(\"addButton\", {\n            button: s,\n            root: this._buttonParent\n        });\n        m([p.getMenu().subscribe(\"rendered\", function(t, u) {\n            n.inform(\"menuOpened\", {\n                audienceSelector: r\n            });\n            h.appendContent(h.find(u, \".-cx-PUBLIC-abstractMenu__border\"), r);\n        }),p.subscribe(\"itemselected\", this._onChange.bind(this)),]);\n    };\n    k(n, j);\n    k(n.prototype, j, {\n        _onChange: function(o, p) {\n            var q = p.getValue(), r = (this.inform(\"addedToCollection\", q) || {\n            });\n            new g(this._endpoint).setData(k(i.serialize(this._audienceSelector), r, {\n                action: \"add\",\n                collection_token: q,\n                mechanism: \"add_selector\"\n            })).send();\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineCurationNUXController\", [\"AppSectionCurationState\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Event\",\"OGCollectionAddMenu\",\"TimelineOGCollectionAddSelector\",\"URI\",\"$\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"OGCollectionAddMenu\"), m = b(\"TimelineOGCollectionAddSelector\"), n = b(\"URI\"), o = b(\"$\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\"), s = 5, t = \"pagelet_timeline_medley_movies\", u = 165, v, w, x, y, z, aa, ba = [], ca = {\n        reports: 0,\n        about: 1,\n        section: 2,\n        section_privacy: 3,\n        add_button: 4,\n        privacy: 5,\n        0: \"reports\",\n        1: \"about\",\n        2: \"section\",\n        3: \"section_privacy\",\n        4: \"add_button\",\n        5: \"privacy\"\n    };\n    function da() {\n        ba.forEach(function(na) {\n            (na.button && na.button.setAttribute(\"data-hover\", \"tooltip\"));\n            (na.listener && na.listener.remove());\n        });\n        ba.length = 0;\n    };\n    function ea(na) {\n        if (z[na]) {\n            z[na].destroy();\n            delete z[na];\n            ((na === \"add_button\") && da());\n        }\n    ;\n        ((aa[na] && aa[na].parentNode) && j.remove(aa[na]));\n    };\n    function fa(na) {\n        if (!i.hasClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\")) {\n            i.addClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\");\n            d([\"Animation\",], function(oa) {\n                new oa(na).to(\"opacity\", 0).duration(300).ease(oa.ease.end).hide().go();\n            });\n        }\n    ;\n    };\n    function ga(na) {\n        ha(na);\n        var oa = (ca[na] + 1);\n        (oa && ia(ca[oa]));\n    };\n    function ha(na) {\n        new h(\"/ajax/timeline/collections/tour/curation/\").setAllowCrossPageTransition(true).setData({\n            step: na\n        }).send();\n        ea(na);\n    };\n    function ia(na) {\n        y = na;\n        switch (na) {\n          case \"reports\":\n            d([\"TimelineController\",], function(oa) {\n                oa.runOnceWhenSectionFullyLoaded(function() {\n                    ka(j.find(o(\"timeline_tab_content\"), \".-cx-PUBLIC-timelineOneColMin__rightcapsulecontainer\"), na);\n                }, \"recent\", \"0\");\n            });\n            break;\n          case \"about\":\n            v = j.scry(o(\"fbTimelineHeadline\"), \".-cx-PRIVATE-fbTimelineNavLight__item\")[1];\n            w = r(k.listen(v, \"click\", function() {\n                v = null;\n                w.remove();\n                y = \"section\";\n            }));\n            ka(v, na);\n            break;\n          case \"section\":\n            if (v) {\n                n(v.getAttribute(\"href\")).go();\n                v = null;\n                (w && w.remove());\n            }\n             else d([\"OnVisible\",\"TimelineMedley\",], function(oa, pa) {\n                j.appendContent(j.find(o(\"pagelet_timeline_main_column\"), \".-cx-PRIVATE-fbTimelineMedley__maincolumn\"), aa.section);\n                r(k.listen(aa.section, \"click\", function() {\n                    pa.scrollToSection(t, u, 1);\n                    fa(aa.section);\n                }));\n                pa.loadToSection(t, function() {\n                    ka(o(t), na);\n                    var qa = new oa(o(t), function() {\n                        fa(aa.section);\n                        qa.remove();\n                    }, false, -u);\n                });\n            });\n        ;\n            break;\n          case \"section_privacy\":\n            d([\"TimelineAppSectionCuration\",], function(oa) {\n                oa.informState(g.showItems, t);\n                ka(j.scry(o(t), \".audienceSelector\")[0], na);\n            });\n            break;\n          case \"privacy\":\n            k.fire(x, \"click\");\n            break;\n        };\n    };\n    function ja(na, oa) {\n        if (z.add_button) {\n            var pa = j.scry(oa, \"[data-hover]\")[0];\n            ba.push({\n                button: pa,\n                listener: r(k.listen(na, \"mouseenter\", function() {\n                    x = na;\n                    ka(na, \"add_button\");\n                }))\n            });\n            (pa && pa.removeAttribute(\"data-hover\"));\n        }\n    ;\n    };\n    function ka(na, oa) {\n        if (z[oa]) {\n            z[oa].setContext(na).setOffsetX(5).show();\n            if ((oa === \"privacy\")) {\n                ea(\"add_button\");\n            };\n        }\n    ;\n    };\n    function la(na, oa, pa) {\n        var qa = pa.getAttribute(\"data-action\");\n        if (((qa === \"next\") || (qa === \"done\"))) {\n            ga(na);\n        }\n         else ha(na);\n    ;\n    };\n    var ma = {\n        init: function(na) {\n            var oa = na.next_step, pa = ca[oa];\n            z = na.dialogs;\n            aa = (na.links ? na.links : []);\n            da();\n            if (((oa === \"section\") && (oa !== y))) {\n                ea(\"section\");\n                ea(\"section_privacy\");\n                pa += 2;\n                oa = ca[pa];\n            }\n        ;\n            for (var qa in z) {\n                r(z[qa].subscribe(\"button\", la.curry(qa)));;\n            };\n            if (z.add_button) {\n                var ra = (na.isViewingSelf ? m : l);\n                r([ra.subscribe(\"menuOpened\", function(sa, ta) {\n                    ka.curry(j.find(ta.audienceSelector, \".audienceSelector\"), \"privacy\").defer(s);\n                }),ra.subscribe(\"addButton\", function(sa, ta) {\n                    ja.curry(ta.button, ta.root).defer(s);\n                }),]);\n            }\n        ;\n            if ((na.isViewingSelf && (pa < ca.add_button))) {\n                ia(oa);\n            };\n        }\n    };\n    e.exports = ma;\n});\n__d(\"TimelineStickyRightColumn\", [\"Arbiter\",\"CSS\",\"DOMQuery\",\"Event\",\"PhotoSnowlift\",\"Run\",\"Style\",\"TimelineContentLoader\",\"Vector\",\"UserAgent\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOMQuery\"), j = b(\"Event\"), k = b(\"PhotoSnowlift\"), l = b(\"Run\"), m = b(\"Style\"), n = b(\"TimelineContentLoader\"), o = b(\"Vector\"), p = b(\"UserAgent\"), q = b(\"csx\"), r = b(\"queryThenMutateDOM\"), s = 100, t = 15, u = 15, v = 71, w = false, x = null, y = null, z, aa, ba, ca, da, ea, fa, ga;\n    function ha() {\n        if (k.getInstance().isOpen) {\n            return\n        };\n        z = n.getCurrentSection();\n        if ((!z || !z.rightColumnFinished)) {\n            return\n        };\n        var pa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\")[0], qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        aa = (pa ? pa.offsetHeight : 0);\n        ba = (qa ? qa.offsetHeight : 0);\n        ca = o.getViewportDimensions().y;\n        fa = (pa ? o.getElementPosition(pa).y : 0);\n        ga = (document.body.clientWidth < document.body.scrollWidth);\n    };\n    function ia() {\n        if (k.getInstance().isOpen) {\n            return\n        };\n        if ((y && (y !== z))) {\n            var pa = i.scry(y.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n            if (pa) {\n                ka(pa, \"\", \"\", \"\");\n            };\n        }\n    ;\n        var qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!qa) {\n            return\n        };\n        if (ga) {\n            ka(qa, \"\", \"\", \"\");\n            return;\n        }\n    ;\n        if ((!z || !z.rightColumnFinished)) {\n            return\n        };\n        ja(z);\n        y = (h.hasClass(qa, \"fixed_always\") ? z : null);\n    };\n    function ja(pa) {\n        if (((ba >= aa) || (aa <= ca))) {\n            return\n        };\n        ea = da;\n        da = o.getScrollPosition().y;\n        var qa, ra = i.scry(pa.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!ra) {\n            return\n        };\n        if ((da <= (fa - la()))) {\n            ka(ra, \"\", \"\", \"\");\n            return;\n        }\n    ;\n        if (((aa + fa) <= (da + Math.min((ba + la()), ((ca - u) - v))))) {\n            ka(ra, \"absolute\", \"\", (u + \"px\"));\n            return;\n        }\n    ;\n        if ((ba > ((ca - u) - la()))) {\n            if ((da < ea)) {\n                var sa = false;\n                if ((ra.style.position === \"absolute\")) {\n                    if (((ra.style.top !== \"\") && (((da + la()) - fa) <= parseInt(ra.style.top, 10)))) {\n                        sa = true;\n                    }\n                     else if (((ra.style.bottom !== \"\") && (da <= ((((fa + aa) - la())) - ba)))) {\n                        sa = true;\n                    }\n                \n                };\n                if (sa) {\n                    ka(ra, \"fixed\", (la() + \"px\"), \"\");\n                    return;\n                }\n                 else if (((ra.style.position === \"absolute\") && ra.style.top)) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if ((parseInt(ra.style.top, 10) >= la())) {\n                        return\n                    };\n                    qa = ((da - fa) - ((ba - ((ca - v)))));\n                    if (ea) {\n                        qa += (ea - da);\n                    };\n                    ka(ra, \"absolute\", (qa + \"px\"), \"\");\n                    return;\n                }\n                \n                \n            ;\n            }\n             else {\n                var ta = false;\n                if (((ra.style.position === \"absolute\") || (((ra.style.position === \"\") && !h.hasClass(ra, \"fixed_always\"))))) {\n                    qa = (ra.style.top ? parseInt(ra.style.top, 10) : 0);\n                    if (((da + ca) >= (((fa + qa) + ba) + v))) {\n                        ta = true;\n                    };\n                }\n            ;\n                if (ta) {\n                    qa = (((ca - ba) - u) - v);\n                    ka(ra, \"fixed\", (qa + \"px\"), \"\");\n                    return;\n                }\n                 else if ((da == ea)) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if ((parseInt(ra.style.top, 10) >= la())) {\n                        qa = ((da - fa) + la());\n                        if (ea) {\n                            qa += (ea - da);\n                        };\n                        ka(ra, \"absolute\", (qa + \"px\"), \"\");\n                        return;\n                    }\n                ;\n                }\n                 else if ((ra.style.position === \"absolute\")) {\n                    return\n                }\n                \n                \n            ;\n            }\n        ;\n        }\n         else ka(ra, \"fixed\", (la() + \"px\"), \"\");\n    ;\n    };\n    function ka(pa, qa, ra, sa) {\n        m.set(pa, \"bottom\", sa);\n        if ((qa === \"fixed\")) {\n            h.addClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", \"\");\n        }\n         else {\n            h.removeClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", qa);\n        }\n    ;\n        m.set(pa, \"top\", ra);\n        g.inform(\"reflow\");\n    };\n    function la() {\n        return (h.hasClass(document.documentElement, \"tinyViewport\") ? t : s);\n    };\n    function ma() {\n        r(ha, ia);\n    };\n    function na() {\n        w = false;\n        y = null;\n        while (x.length) {\n            x.pop().remove();;\n        };\n        x = null;\n    };\n    var oa = {\n        init: function() {\n            if ((w || (p.ie() < 8))) {\n                return\n            };\n            w = true;\n            x = [j.listen(window, \"scroll\", ma),j.listen(window, \"resize\", ma),];\n            l.onLeave(na);\n        },\n        adjust: function() {\n            if (w) {\n                ha();\n                ia();\n            }\n        ;\n        }\n    };\n    e.exports = oa;\n});");
// 11812
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s8e04a48ccc312c988243f89c4a039f9ea2026e4e");
// 11813
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"3SGVa\",]);\n}\n;\n;\n__d(\"SubscriptionLevels\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ALL: \"162318810514679\",\n        DEFAULT: \"271670892858696\",\n        TOP: \"266156873403755\"\n    };\n    e.exports = g;\n});\n__d(\"EditSubscriptions\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"MenuDeprecated\",\"Parent\",\"SubscriptionLevels\",\"arrayContains\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"Parent\"), n = b(\"SubscriptionLevels\"), o = b(\"arrayContains\"), p = b(\"cx\"), q = b(\"ge\"), r = 13, s = 45, t = [n.ALL,n.DEFAULT,n.TOP,], u = {\n    }, v = {\n    }, w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = {\n    }, da = {\n    }, ea = {\n    }, fa = \"/ajax/follow/follow_profile.php\", ga = \"/ajax/follow/unfollow_profile.php\", ha = \"/ajax/settings/notifications/notify_me.php\", ia = {\n    }, ja = {\n    }, ka = null, la = false;\n    function ma(jb) {\n        return o(t, jb);\n    };\n;\n    function na(jb, kb, lb, mb) {\n        var nb = ((m.byClass(mb, \"uiMenuItem\") || m.byClass(mb, \"-cx-PUBLIC-abstractMenuItem__root\")));\n        if (((!nb || !k.contains(jb, nb)))) {\n            return;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSubscribeCheckbox\")) {\n            if (w[kb]) {\n                qa(jb, kb);\n            }\n             else pa(jb, kb);\n        ;\n        ;\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuUnsubscribe\")) {\n            qa(jb, kb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSettingsItem\")) {\n            db(jb, true);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuGoBack\")) {\n            db(jb, false);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuItem\")) {\n            oa(jb, kb, lb, nb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuNotifyMeCheckbox\")) {\n            if (x[kb]) {\n                hb(jb, kb);\n            }\n             else gb(jb, kb);\n        ;\n        ;\n            return false;\n        }\n        \n        \n        \n        \n        \n        \n    ;\n    ;\n    };\n;\n    function oa(jb, kb, lb, mb) {\n        if (j.hasClass(mb, \"SubscriptionMenuLevel\")) {\n            if (l.isItemChecked(mb)) {\n                return;\n            }\n        ;\n        ;\n            bb(jb, kb, ua(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionMenuCategory\")) {\n            ya(kb, mb, !l.isItemChecked(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionAppStory\")) {\n            ab(kb, mb, !l.isItemChecked(mb), lb);\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    function pa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"FollowingUser\", lb);\n        new i().setURI(fa).setMethod(\"POST\").setData({\n            profile_id: kb,\n            JSBNG__location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"FollowUserFail\", lb)).send();\n    };\n;\n    function qa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"UnfollowingUser\", lb);\n        new i().setURI(ga).setMethod(\"POST\").setData({\n            profile_id: kb,\n            JSBNG__location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"UnfollowUserFail\", lb)).send();\n    };\n;\n    function ra(jb) {\n        if (j.hasClass(jb, \"followButtonFlyout\")) {\n            return r;\n        }\n         else return s\n    ;\n    };\n;\n    function sa(jb, kb, lb) {\n        var mb = {\n            profile_id: jb,\n            level: ba[jb],\n            custom_categories: ca[jb],\n            JSBNG__location: lb\n        };\n        new i().setURI(\"/ajax/follow/manage_subscriptions.php\").setData(mb).send();\n    };\n;\n    function ta(jb, kb) {\n        var lb = ((ca[kb] || [])), mb = l.getItems(jb);\n        mb.forEach(function(nb) {\n            if (j.hasClass(nb, \"SubscriptionMenuCategory\")) {\n                var ob = ua(nb);\n                if (o(lb, ob)) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            ;\n            }\n             else if (j.hasClass(nb, \"SubscriptionAppStory\")) {\n                var pb = ua(nb);\n                if (((ja[kb] && ja[kb][pb]))) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            ;\n            }\n            \n        ;\n        ;\n        });\n        bb(jb, kb, ba[kb], false);\n    };\n;\n    function ua(jb) {\n        var kb = k.scry(jb, \"input\")[0];\n        return ((kb && kb.value));\n    };\n;\n    function va(jb) {\n        return k.JSBNG__find(jb, \"a.itemAnchor\");\n    };\n;\n    function wa(jb) {\n        j.addClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", true);\n    };\n;\n    function xa(jb) {\n        j.removeClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", false);\n    };\n;\n    function ya(jb, kb, lb, mb, nb) {\n        if (lb) {\n            wa(kb);\n        }\n         else xa(kb);\n    ;\n    ;\n        var ob = ua(kb);\n        if (ma(ob)) {\n            ((lb && za(jb, ob)));\n        }\n         else if (lb) {\n            if (!o(ca[jb], ob)) {\n                ca[jb].push(ob);\n            }\n        ;\n        ;\n        }\n         else {\n            var pb = ca[jb].indexOf(ob);\n            if (((pb !== -1))) {\n                ca[jb].splice(pb, 1);\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        if (mb) {\n            sa(jb, ob, nb);\n        }\n    ;\n    ;\n    };\n;\n    function za(jb, kb) {\n        ba[jb] = kb;\n        h.inform(\"SubscriptionLevelUpdated\", {\n            profile_id: jb,\n            level: kb\n        });\n    };\n;\n    function ab(jb, kb, lb, mb) {\n        var nb = \"/ajax/feed/filter_action/\", ob = ua(kb), pb = {\n            actor_id: jb,\n            app_id: ob\n        };\n        if (lb) {\n            wa(kb);\n            nb += \"resubscribe_user_app/\";\n            pb.action = \"resubscribe_user_app\";\n            if (!ja[jb]) {\n                ja[jb] = {\n                };\n            }\n        ;\n        ;\n            ja[jb][ob] = true;\n        }\n         else {\n            xa(kb);\n            nb += \"unsubscribe_user_app_checkbox/\";\n            pb.action = \"unsubscribe_user_app_checkbox\";\n            if (ja[jb]) {\n                ja[jb][ob] = false;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        new i().setURI(nb).setData(pb).send();\n    };\n;\n    function bb(jb, kb, lb, mb, nb) {\n        var ob = k.scry(jb, \".SubscriptionMenuLevel\"), pb = null;\n        ob.forEach(function(qb) {\n            if (((ua(qb) == lb))) {\n                pb = qb;\n            }\n             else if (l.isItemChecked(qb)) {\n                ya(kb, qb, false, false);\n            }\n            \n        ;\n        ;\n        });\n        ((pb && ya(kb, pb, true, mb, nb)));\n    };\n;\n    function cb(jb, kb, lb) {\n        w[kb] = lb;\n        j.conditionClass(jb, \"isUnsubscribed\", !lb);\n        var mb = k.scry(jb, \"li.SubscribeMenuSubscribeCheckbox\");\n        if (((mb.length !== 0))) {\n            var nb = mb[0];\n            if (lb) {\n                wa(nb);\n            }\n             else xa(nb);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function db(jb, kb) {\n        j.conditionClass(jb, \"subscriptionMenuOpen\", kb);\n    };\n;\n    function eb(jb, kb, lb) {\n        var mb = k.JSBNG__find(jb, \".FriendListSubscriptionsMenu\"), nb = k.JSBNG__find(mb, \".uiMenuInner\");\n        if (((ka != null))) {\n            ka.forEach(function(ob) {\n                nb.removeChild(ob);\n            });\n        }\n    ;\n    ;\n        lb.forEach(function(ob) {\n            nb.appendChild(ob);\n        });\n        ka = lb;\n    };\n;\n    h.subscribe(\"UnfollowUser\", function(jb, kb) {\n        if (da[kb.profile_id]) {\n            za(kb.profile_id, da[kb.profile_id]);\n            ca[kb.profile_id] = ea[kb.profile_id].slice();\n        }\n    ;\n    ;\n    });\n    h.subscribe(\"UpdateSubscriptionLevel\", function(jb, kb) {\n        var lb = ((kb.profile_id + \"\")), mb = ((kb.level + \"\"));\n        za(lb, mb);\n        var nb;\n        {\n            var fin202keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin202i = (0);\n            (0);\n            for (; (fin202i < fin202keys.length); (fin202i++)) {\n                ((nb) = (fin202keys[fin202i]));\n                {\n                    if (((u[nb] === lb))) {\n                        var ob = q(nb);\n                        ((ob && bb(ob, lb, mb, false)));\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    function fb(jb, kb, lb) {\n        x[kb] = lb;\n        var mb = ((z[kb] && !la)), nb = k.scry(jb, \"li.SubscribeMenuNotifyMeCheckbox\");\n        if (((nb.length !== 0))) {\n            var ob = nb[0];\n            j.conditionShow(ob, !mb);\n            j.conditionShow(k.JSBNG__find(jb, \"li.SubscribeMenuNotifyMeCheckboxSeparator\"), !mb);\n            if (lb) {\n                wa(ob);\n            }\n             else xa(ob);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function gb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"EnableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: true\n        }).setErrorHandler(h.inform.curry(\"EnableNotifsForUserFail\", lb)).send();\n    };\n;\n    function hb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"DisableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: false\n        }).setErrorHandler(h.inform.curry(\"DisableNotifsForUserFail\", lb)).send();\n    };\n;\n    var ib = {\n        init: function(jb, kb, lb) {\n            var mb = k.getID(jb);\n            if (!u[mb]) {\n                g.listen(jb, \"click\", function(nb) {\n                    return na(jb, u[mb], lb, nb.getTarget());\n                });\n            }\n        ;\n        ;\n            if (((((lb === s)) && ia[kb].length))) {\n                eb(jb, kb, ia[kb]);\n            }\n        ;\n        ;\n            if (ba[kb]) {\n                ta(jb, kb);\n            }\n        ;\n        ;\n            u[mb] = kb;\n            j.conditionClass(jb, \"NonFriendSubscriptionMenu\", !v[kb]);\n            j.conditionClass(jb, \"cannotSubscribe\", !y[kb]);\n            j.conditionClass(jb, \"noSubscriptionLevels\", ((z[kb] && !aa[kb])));\n            j.conditionClass(jb, \"noSubscribeCheckbox\", ((!v[kb] && !z[kb])));\n            cb(jb, kb, w[kb]);\n            fb(jb, kb, x[kb]);\n            h.subscribe([\"FollowUser\",\"FollowingUser\",\"UnfollowUserFail\",], function(nb, ob) {\n                cb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"UnfollowUser\",\"UnfollowingUser\",\"FollowUserFail\",], function(nb, ob) {\n                h.inform(\"SubMenu/Reset\");\n                cb(jb, kb, false);\n            }.bind(this));\n            h.subscribe([\"EnableNotifsForUser\",\"DisableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"DisableNotifsForUser\",\"EnableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, false);\n            }.bind(this));\n            h.subscribe(\"listeditor/friend_lists_changed\", function(nb, ob) {\n                if (ob.notify_state) {\n                    var pb = ((ob.added_uid ? ob.added_uid : ob.removed_uid));\n                    fb(jb, pb, ob.notify_state.is_notified);\n                }\n            ;\n            ;\n            }.bind(this));\n            db(jb, false);\n        },\n        getSubscriptions: function(jb) {\n            return {\n                level: ba[jb],\n                custom_categories: ca[jb]\n            };\n        },\n        setSubscriptions: function(jb, kb, lb, mb, nb, ob, pb, qb, rb, sb, tb, ub, vb) {\n            za(jb, ((pb + \"\")));\n            v[jb] = kb;\n            w[jb] = lb;\n            y[jb] = mb;\n            z[jb] = nb;\n            aa[jb] = ob;\n            da[jb] = ((rb + \"\"));\n            ca[jb] = qb.map(String);\n            ea[jb] = sb.map(String);\n            ia[jb] = vb;\n            x[jb] = tb;\n            la = ub;\n        }\n    };\n    e.exports = ((a.EditSubscriptions || ib));\n});\n__d(\"DynamicFriendListEducation\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"Dialog\",\"PageTransitions\",\"arrayContains\",\"createArrayFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"PageTransitions\"), l = b(\"arrayContains\"), m = b(\"createArrayFrom\"), n = b(\"removeFromArray\"), o, p, q, r, s, t;\n    function u() {\n        ((q && q.hide()));\n        ((r && r.hide()));\n    };\n;\n    function v(y) {\n        n(p, y);\n        u();\n        s({\n            accept_tag_education: true\n        });\n    };\n;\n    function w() {\n        u();\n        s({\n            nux_cancel: true\n        });\n    };\n;\n    var x = {\n        init: function(y, z) {\n            o = y;\n            p = m(z).map(String);\n            k.registerHandler(function() {\n                u();\n                o = false;\n                s = undefined;\n                p = [];\n            });\n        },\n        showDialog: function(y, z, aa) {\n            if (((o && l(p, y)))) {\n                u();\n                h.inform(\"DynamicFriendListEducation/dialogOpen\", {\n                    uid: z,\n                    flid: y\n                });\n                s = aa;\n                q = new j().setAsync(new i(\"/ajax/friends/lists/smart_list_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true)).setHandler(v.bind(this, y)).setCloseHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogClosed\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).setCancelHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogCancel\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).show();\n            }\n             else aa();\n        ;\n        ;\n        },\n        showContextualDialog: function(y, z, aa, ba) {\n            if (((o && l(p, y)))) {\n                u();\n                t = aa;\n                s = ba;\n                new i(\"/ajax/friends/lists/smart_list_contextual_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true).send();\n            }\n             else ba();\n        ;\n        ;\n        },\n        setContextualDialog: function(y, z, aa, ba) {\n            r = y;\n            r.setContext(t);\n            r.show();\n            g.listen(z, \"click\", v.bind(this, ba));\n            g.listen(aa, \"click\", w);\n        }\n    };\n    e.exports = x;\n});\n__d(\"FriendStatus\", [\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"eachKeyVal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"eachKeyVal\");\n    function m(q, r, s) {\n        this.id = q;\n        this.update(r, s);\n    };\n;\n    j(m.prototype, {\n        update: function(q, r) {\n            ((q && (this.JSBNG__status = q)));\n            if (r) {\n                this.lists = k(r).map(String);\n                this._informListChange();\n            }\n        ;\n        ;\n        },\n        isComplete: function() {\n            return !!this.lists;\n        },\n        addToList: function(q) {\n            if (((this.lists && !i(this.lists, q)))) {\n                this.lists.push(q);\n            }\n        ;\n        ;\n            this._informListChange();\n        },\n        removeFromList: function(q) {\n            if (this.lists) {\n                var r = this.lists.indexOf(q);\n                ((((r !== -1)) && this.lists.splice(r, 1)));\n            }\n        ;\n        ;\n            this._informListChange();\n        },\n        updateList: function(q, r) {\n            ((r ? this.addToList(q) : this.removeFromList(q)));\n        },\n        _informListChange: function() {\n            g.inform(\"FriendListMembershipChange\", {\n                uid: this.id,\n                lists: this.lists\n            });\n        }\n    });\n    j(m, {\n        ARE_FRIENDS: 1,\n        INCOMING_REQUEST: 2,\n        OUTGOING_REQUEST: 3,\n        CAN_REQUEST: 4\n    });\n    var n = {\n    }, o = {\n    };\n    function p(q, r, s) {\n        if (!n[s.uid]) {\n            n[s.uid] = new m(s.uid, q);\n        }\n         else n[s.uid].update(q);\n    ;\n    ;\n        g.inform(\"FriendRequest/change\", {\n            uid: s.uid,\n            JSBNG__status: q\n        });\n    };\n;\n    g.subscribe([\"FriendRequest/cancel\",\"FriendRequest/unfriend\",\"FriendRequest/sendFail\",], p.curry(m.CAN_REQUEST));\n    g.subscribe([\"FriendRequest/confirmFail\",], p.curry(m.INCOMING_REQUEST));\n    g.subscribe([\"FriendRequest/cancelFail\",\"FriendRequest/sent\",\"FriendRequest/sending\",], p.curry(m.OUTGOING_REQUEST));\n    g.subscribe([\"FriendRequest/confirm\",\"FriendRequest/confirming\",], p.curry(m.ARE_FRIENDS));\n    j(m, {\n        CLOSE_FRIENDS: null,\n        ACQUAINTANCES: null,\n        getFriend: function(q, r) {\n            if (((n[q] && n[q].isComplete()))) {\n                r(n[q]);\n            }\n             else if (o[q]) {\n                o[q].push(r);\n            }\n             else {\n                o[q] = [r,];\n                new h().setURI(\"/ajax/friends/status.php\").setData({\n                    friend: q\n                }).setHandler(function(s) {\n                    var t = s.getPayload();\n                    m.initFriend.bind(m, q, t.JSBNG__status, t.lists).defer();\n                }).send();\n            }\n            \n        ;\n        ;\n        },\n        initFriend: function(q, r, s) {\n            var t = ((n[q] || new m(q)));\n            t.update(((t.JSBNG__status || r)), ((t.lists || s)));\n            n[q] = t;\n            ((o[q] && o[q].forEach(function(u) {\n                u(t);\n            })));\n            o[q] = null;\n        },\n        setSpecialLists: function(q) {\n            var r = ((m.CLOSE_FRIENDS === null));\n            m.CLOSE_FRIENDS = ((q.close + \"\"));\n            m.ACQUAINTANCES = ((q.acq + \"\"));\n            if (r) {\n                l(n, function(s, t) {\n                    t._informListChange();\n                });\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"FriendEditLists\", [\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOMQuery\",\"DynamicFriendListEducation\",\"EditSubscriptions\",\"FriendStatus\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"URI\",\"$\",\"arrayContains\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"DynamicFriendListEducation\"), l = b(\"EditSubscriptions\"), m = b(\"FriendStatus\"), n = b(\"MenuDeprecated\"), o = b(\"Parent\"), p = b(\"ScrollableArea\"), q = b(\"URI\"), r = b(\"$\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"ge\"), v = 5, w = {\n    }, x = \"/ajax/profile/removefriendconfirm.php\", y = \"/ajax/friends/requests/cancel.php\", z = \"/ajax/choose/\", aa = \"/profile.php\", ba = \"/ajax/report/social.php\", ca, da;\n    function ea(pa, qa, ra) {\n        var sa = w[pa.id], ta = function(ua) {\n            var va = {\n                action: ((ra ? \"add_list\" : \"del_list\")),\n                to_friend: sa.id,\n                friendlists: [qa,],\n                source: ca\n            };\n            if (ua) {\n                t(va, ua);\n            }\n        ;\n        ;\n            sa.updateList(qa, ra);\n            var wa;\n            if (((ra && ((qa == m.CLOSE_FRIENDS))))) {\n                wa = ha(pa, m.ACQUAINTANCES);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.ACQUAINTANCES, false);\n                }\n            ;\n            ;\n            }\n             else if (((ra && ((qa == m.ACQUAINTANCES))))) {\n                wa = ha(pa, m.CLOSE_FRIENDS);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.CLOSE_FRIENDS, false);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var xa = {\n                flid: qa,\n                uid: sa.id\n            }, ya = ((ra ? \"FriendListHovercard/add\" : \"FriendListHovercard/remove\"));\n            g.inform(ya, xa);\n            new h().setURI(\"/ajax/add_friend/action.php\").setData(va).send();\n        };\n        if (ra) {\n            k.showDialog(qa, sa.id, ta);\n        }\n         else ta();\n    ;\n    ;\n    };\n;\n    function fa(pa) {\n        var qa = j.scry(pa, \"input\")[0];\n        return ((qa && qa.value));\n    };\n;\n    function ga(pa, qa, ra) {\n        var sa = {\n            uid: qa.id\n        };\n        new h().setURI(y).setMethod(\"POST\").setData({\n            friend: qa.id\n        }).setHandler(g.inform.bind(g, \"FriendRequest/cancel\", sa)).setErrorHandler(g.inform.bind(g, \"FriendRequest/cancelFail\", sa)).setStatusElement(ra).send();\n    };\n;\n    function ha(pa, qa) {\n        var ra = n.getItems(pa);\n        for (var sa = 0; ((sa < ra.length)); sa++) {\n            if (((fa(ra[sa]) == qa))) {\n                return ra[sa];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function ia(pa, qa) {\n        var ra = n.getItems(pa);\n        ra.forEach(function(sa) {\n            var ta = fa(sa), ua = s(qa.lists, ta);\n            if (((n.isItemChecked(sa) !== ua))) {\n                n.toggleItem(sa);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ja(pa) {\n        var qa = n.getItems(pa), ra = ((!i.hasClass(pa, \"followButtonFlyout\") && !i.hasClass(pa, \"likeButtonFlyout\"))), sa = [], ta = [], ua = 0, va = 0;\n        qa.forEach(function(ab) {\n            if (i.hasClass(ab, \"neverHide\")) {\n                i.removeClass(ab, \"underShowMore\");\n                ua++;\n            }\n             else if (n.isItemChecked(ab)) {\n                sa.push(ab);\n            }\n             else if (((((i.hasClass(ab, \"neverShow\") || i.hasClass(ab, \"FriendListCreateTrigger\"))) || ((!ra && i.hasClass(ab, \"friendOptionsOnly\")))))) {\n                i.addClass(ab, \"underShowMore\");\n                va++;\n            }\n             else ta.push(ab);\n            \n            \n        ;\n        ;\n        });\n        var wa = ((v - ua)), xa = sa.concat(ta), ya = va;\n        xa.forEach(function(ab) {\n            if (i.hasClass(ab, \"ShowMoreItem\")) {\n                wa--;\n                return;\n            }\n        ;\n        ;\n            if (wa) {\n                i.removeClass(ab, \"underShowMore\");\n                wa--;\n            }\n             else {\n                i.addClass(ab, \"underShowMore\");\n                ya = true;\n            }\n        ;\n        ;\n        });\n        i.conditionClass(pa, \"hasMoreFriendListItems\", ya);\n        var za = j.scry(pa, \".FriendListMenuShowMore\");\n        za.forEach(function(ab) {\n            i.removeClass(ab, \"FriendListMenuShowMore\");\n        });\n    };\n;\n    function ka(pa, qa) {\n        i.conditionClass(pa, \"FriendListMemorializedUser\", qa);\n    };\n;\n    function la(pa, qa) {\n        i.conditionClass(pa, \"FriendListCannotSuggestFriends\", !qa);\n    };\n;\n    function ma(pa, qa) {\n        var ra = j.scry(pa, \".FriendListUnfriend\")[0], sa = j.scry(pa, \".FriendListCancel\")[0], ta = j.scry(pa, \".FriendListSuggestFriends\")[0], ua = j.scry(pa, \".FriendListFriendship\")[0], va = j.scry(pa, \".FriendListReportBlock\")[0];\n        if (sa) {\n            i.conditionShow(sa, ((qa.JSBNG__status == m.OUTGOING_REQUEST)));\n        }\n    ;\n    ;\n        if (ra) {\n            i.conditionShow(ra, ((qa.JSBNG__status == m.ARE_FRIENDS)));\n            var wa = j.JSBNG__find(ra, \"a\");\n            wa.setAttribute(\"ajaxify\", q(x).addQueryData({\n                uid: qa.id,\n                unref: da\n            }).toString());\n        }\n         else i.conditionClass(pa, \"NoFriendListActionSeparator\", ((!sa || ((qa.JSBNG__status != m.OUTGOING_REQUEST)))));\n    ;\n    ;\n        if (ta) {\n            j.JSBNG__find(ta, \"a\").setAttribute(\"href\", q(z).addQueryData({\n                type: \"suggest_friends\",\n                newcomer: qa.id,\n                ref: \"profile_others_dropdown\"\n            }).toString());\n        }\n    ;\n    ;\n        if (ua) {\n            i.conditionShow(ua, ((qa.JSBNG__status == m.ARE_FRIENDS)));\n            j.JSBNG__find(ua, \"a\").setAttribute(\"href\", q(aa).addQueryData({\n                and: qa.id\n            }).toString());\n        }\n    ;\n    ;\n        if (va) {\n            j.JSBNG__find(va, \"a\").setAttribute(\"ajaxify\", q(ba).addQueryData({\n                content_type: 0,\n                cid: qa.id,\n                rid: qa.id\n            }).toString());\n        }\n    ;\n    ;\n    };\n;\n    function na(pa, qa) {\n        var ra = j.scry(pa, \"div.FriendListSubscriptionsMenu\");\n        if (((ra.length !== 0))) {\n            l.init(pa, qa, 45);\n        }\n    ;\n    ;\n    };\n;\n    g.subscribe(\"FriendRequest/change\", function(pa, qa) {\n        {\n            var fin203keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin203i = (0);\n            var ra;\n            for (; (fin203i < fin203keys.length); (fin203i++)) {\n                ((ra) = (fin203keys[fin203i]));\n                {\n                    var sa = u(ra), ta = w[ra];\n                    if (((((sa && ta)) && ((ta.id == qa.uid))))) {\n                        ia(sa, ta);\n                        ma(sa, ta);\n                        ja(sa);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    n.subscribe(\"select\", function(pa, qa) {\n        if (((i.hasClass(qa.item, \"ShowMoreItem\") && i.hasClass(qa.menu, \"FriendListMenu\")))) {\n            i.addClass(qa.menu, \"FriendListMenuShowMore\");\n            p.poke(qa.item);\n        }\n    ;\n    ;\n    });\n    var oa = {\n        init: function(pa, qa, ra, sa, ta, ua) {\n            pa = r(pa);\n            ca = ra;\n            da = ua;\n            if (!w[pa.id]) {\n                n.subscribe(\"select\", function(va, wa) {\n                    if (j.contains(pa, wa.item)) {\n                        if (o.byClass(wa.item, \"FriendListItem\")) {\n                            n.toggleItem(wa.item);\n                            var xa = fa(wa.item);\n                            ea(pa, xa, n.isItemChecked(wa.item));\n                        }\n                         else if (o.byClass(wa.item, \"FriendListCancel\")) {\n                            ga(pa, w[pa.id], wa.item);\n                        }\n                         else if (o.byClass(wa.item, \"FriendListUnfriend\")) {\n                            g.inform(\"FriendEditLists/unfriend\");\n                        }\n                        \n                        \n                    ;\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            i.addClass(pa, \"async_saving\");\n            m.getFriend(qa, function(va) {\n                ka(pa, sa);\n                la(pa, ta);\n                ia(pa, va);\n                ma(pa, va);\n                w[pa.id] = va;\n                ja(pa);\n                na(pa, qa);\n                i.removeClass(pa, \"async_saving\");\n            }.bind(this));\n        }\n    };\n    e.exports = ((a.FriendEditLists || oa));\n});\n__d(\"FriendListFlyoutController\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"FriendEditLists\",\"FriendStatus\",\"Keys\",\"Layer\",\"LayerHideOnEscape\",\"LayerTabIsolation\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"Style\",\"TabbableElements\",\"UserAgent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Button\"), k = b(\"ContextualLayer\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMQuery\"), q = b(\"FriendEditLists\"), r = b(\"FriendStatus\"), s = b(\"Keys\"), t = b(\"Layer\"), u = b(\"LayerHideOnEscape\"), v = b(\"LayerTabIsolation\"), w = b(\"MenuDeprecated\"), x = b(\"Parent\"), y = b(\"ScrollableArea\"), z = b(\"Style\"), aa = b(\"TabbableElements\"), ba = b(\"UserAgent\"), ca = b(\"cx\"), da = b(\"emptyFunction\"), ea, fa, ga = null, ha = null, ia, ja, ka, la, ma, na, oa = 1500, pa, qa = [\"uiButtonConfirm\",\"uiButtonSpecial\",\"-cx-PRIVATE-uiButton__special\",\"-cx-PRIVATE-uiButton__confirm\",\"-cx-PRIVATE-xuiButton__special\",\"-cx-PRIVATE-xuiOverlayButton__root\",\"-cx-PRIVATE-xuiButton__confirm\",], ra = {\n        init: function(tb, ub) {\n            ra.init = da;\n            ea = tb;\n            ea.subscribe(\"mouseenter\", ab);\n            ea.subscribe(\"mouseleave\", ob);\n            ea.subscribe(\"hide\", cb);\n            ea.enableBehavior(v);\n            ea.enableBehavior(u);\n            pa = ub;\n            if (ga) {\n                o.setContent(ea.getContent(), [ga,ha,]);\n            }\n        ;\n        ;\n            var vb = function(wb) {\n                var xb = x.byClass(wb.getTarget(), \"enableFriendListFlyout\");\n                if (xb) {\n                    if (((ia === xb))) {\n                        JSBNG__clearTimeout(la);\n                    }\n                     else {\n                        ((fa && qb()));\n                        nb(xb);\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n            g.listen(JSBNG__document.documentElement, {\n                mouseover: vb,\n                click: vb,\n                keydown: function(JSBNG__event) {\n                    var wb = JSBNG__event.getTarget();\n                    if (JSBNG__event.getModifiers().any) {\n                        return;\n                    }\n                ;\n                ;\n                    if (((!fa || p.isNodeOfType(wb, [\"input\",\"textarea\",])))) {\n                        return;\n                    }\n                ;\n                ;\n                    var xb = g.getKeyCode(JSBNG__event), yb;\n                    switch (xb) {\n                      case s.UP:\n                    \n                      case s.DOWN:\n                        var zb = za();\n                        yb = xa(zb);\n                        va(zb[((yb + ((((xb === s.UP)) ? -1 : 1))))]);\n                        return false;\n                      case s.SPACE:\n                        var ac = wa(wb);\n                        if (ac) {\n                            sa(ac);\n                            JSBNG__event.prevent();\n                        }\n                    ;\n                    ;\n                        break;\n                      default:\n                        var bc = String.fromCharCode(xb).toLowerCase(), cc = za();\n                        yb = xa(cc);\n                        var dc = yb, ec = cc.length;\n                        while (((((~yb && (((dc = ((++dc % ec))) !== yb)))) || ((!~yb && ((++dc < ec))))))) {\n                            var fc = w.getItemLabel(cc[dc]);\n                            if (((fc && ((fc.charAt(0).toLowerCase() === bc))))) {\n                                va(cc[dc]);\n                                return false;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    };\n                ;\n                }\n            });\n            h.subscribe(\"FriendEditLists/unfriend\", qb);\n            h.subscribe(\"DynamicFriendListEducation/dialogOpen\", function() {\n                na = true;\n            });\n            h.subscribe(\"DynamicFriendListEducation/dialogClosed\", function() {\n                na = false;\n                ob();\n            });\n        },\n        initContent: function(tb) {\n            o.appendContent(JSBNG__document.body, tb);\n            db(tb);\n            (function() {\n                if (!ga) {\n                    ga = tb;\n                    ((ea && o.setContent(ea.getContent(), [ga,ha,])));\n                    l.show(ga);\n                    g.listen(ga, \"click\", rb);\n                    ((fa && kb(ia)));\n                }\n                 else {\n                    o.remove(tb);\n                    tb = null;\n                }\n            ;\n            ;\n            }).defer();\n        },\n        initNux: function(tb) {\n            if (ha) {\n                return;\n            }\n        ;\n        ;\n            ha = tb;\n            ((ea && o.setContent(ea.getContent(), [ga,ha,])));\n        },\n        show: function(tb) {\n            lb(tb);\n        },\n        hide: function(tb) {\n            ((((tb === false)) ? qb() : ob()));\n        },\n        setActiveNode: function(tb) {\n            ((fa && qb()));\n            ia = tb;\n            ja = g.listen(tb, \"mouseleave\", function() {\n                ia = null;\n                ((ja && ja.remove()));\n            });\n        },\n        setCloseListener: function(tb, ub) {\n            m.set(tb, \"flfcloselistener\", ub);\n            if (((ia != tb))) {\n                m.set(tb, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        ;\n        },\n        setCloseListenerTimeout: function(tb) {\n            oa = tb;\n        }\n    };\n    function sa(tb) {\n        ((ba.firefox() && ua(tb).JSBNG__blur()));\n        w.inform(\"select\", {\n            menu: ta(tb),\n            item: tb\n        });\n    };\n;\n    function ta(tb) {\n        if (l.hasClass(tb, \"uiMenuContainer\")) {\n            return tb;\n        }\n    ;\n    ;\n        return x.byClass(tb, \"uiMenu\");\n    };\n;\n    function ua(tb) {\n        return p.JSBNG__find(tb, \"a.itemAnchor\");\n    };\n;\n    function va(tb) {\n        if (((tb && ya(tb)))) {\n            w._removeSelected(ea.getContent());\n            l.addClass(tb, \"selected\");\n            ua(tb).JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function wa(tb) {\n        return x.byClass(tb, \"uiMenuItem\");\n    };\n;\n    function xa(tb) {\n        if (JSBNG__document.activeElement) {\n            var ub = wa(JSBNG__document.activeElement);\n            return tb.indexOf(ub);\n        }\n    ;\n    ;\n        return -1;\n    };\n;\n    function ya(tb) {\n        return ((((!l.hasClass(tb, \"disabled\") && ((z.get(tb, \"display\") !== \"none\")))) && ((z.get(x.byClass(tb, \"uiMenu\"), \"display\") !== \"none\"))));\n    };\n;\n    function za() {\n        return w.getItems(ea.getContent()).filter(ya);\n    };\n;\n    function ab() {\n        JSBNG__clearTimeout(la);\n    };\n;\n    function bb(tb) {\n        for (var ub = 0; ((ub < qa.length)); ub++) {\n            if (l.hasClass(tb, qa[ub])) {\n                return false;\n            }\n        ;\n        ;\n        };\n    ;\n        return true;\n    };\n;\n    function cb() {\n        if (ia) {\n            if (bb(ia)) {\n                l.removeClass(ia, \"-cx-PUBLIC-uiHoverButton__selected\");\n                if (((l.hasClass(ia, \"uiButton\") || l.hasClass(ia, \"-cx-PRIVATE-uiButton__root\")))) {\n                    l.removeClass(ia, \"selected\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (m.get(ia, \"flfcloselistener\")) {\n                var tb = ia;\n                m.set(ia, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        fa = false;\n        jb();\n        ia = null;\n    };\n;\n    function db(tb) {\n        var ub = p.scry(tb, \"[tabindex=\\\"0\\\"]\");\n        ub.forEach(function(vb) {\n            vb.tabIndex = \"-1\";\n        });\n        ((ub[0] && (ub[0].tabIndex = \"0\")));\n    };\n;\n    function eb(tb) {\n        if (((p.isNodeOfType(tb, \"label\") && l.hasClass(tb, \"uiButton\")))) {\n            tb = j.getInputElement(tb);\n        }\n    ;\n    ;\n        return tb;\n    };\n;\n    function fb(tb) {\n        return m.get(eb(tb), \"profileid\");\n    };\n;\n    function gb(tb) {\n        return ((m.get(eb(tb), \"memorialized\") === \"true\"));\n    };\n;\n    function hb(tb) {\n        return ((m.get(eb(tb), \"cansuggestfriends\") === \"true\"));\n    };\n;\n    function ib(tb) {\n        return m.get(eb(tb), \"unref\");\n    };\n;\n    function jb() {\n        ((ja && ja.remove()));\n        ja = null;\n        ((ma && t.unsubscribe(ma)));\n        ma = null;\n        ((la && JSBNG__clearTimeout(la)));\n        la = null;\n    };\n;\n    function kb(tb) {\n        var ub = fb(tb), vb = gb(tb), wb = hb(tb), xb = m.get(tb, \"flloc\"), yb = ib(tb);\n        q.init(ga, ub, xb, vb, wb, yb);\n        l.conditionClass(ga, \"followButtonFlyout\", l.hasClass(tb, \"profileFollowButton\"));\n        l.conditionClass(ga, \"friendButtonFlyout\", ((((l.hasClass(tb, \"FriendRequestFriends\") || l.hasClass(tb, \"FriendRequestIncoming\"))) || l.hasClass(tb, \"FriendRequestOutgoing\"))));\n        l.conditionClass(ga, \"likeButtonFlyout\", l.hasClass(tb, \"profileLikeButton\"));\n        var zb = p.scry(ga, \"div.uiScrollableArea\")[0];\n        ((zb && y.poke(zb)));\n        var ac = aa.JSBNG__find(ga)[0];\n        ((ac && ac.JSBNG__focus()));\n    };\n;\n    function lb(tb) {\n        if (((!ea || fa))) {\n            return;\n        }\n    ;\n    ;\n        ea.setContext(tb);\n        ea.setCausalElement(tb);\n        tb.setAttribute(\"aria-expanded\", \"true\");\n        if (bb(tb)) {\n            l.addClass(tb, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if (((l.hasClass(tb, \"uiButton\") || l.hasClass(tb, \"-cx-PRIVATE-uiButton__root\")))) {\n                l.addClass(tb, \"selected\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        ea.show();\n        ia = tb;\n        fa = true;\n        var ub = null;\n        if (ga) {\n            ub = \"show\";\n            kb(tb);\n        }\n         else {\n            ub = \"init_show\";\n            new i().setURI(\"/ajax/friends/lists/flyout_content.php\").setStatusElement(ea.getContent()).send();\n        }\n    ;\n    ;\n        jb();\n        ja = g.listen(tb, \"mouseleave\", ob);\n        ma = t.subscribe(\"show\", mb);\n        if (m.get(tb, \"flfcloselistener\")) {\n            JSBNG__clearTimeout(m.remove(tb, \"flfcloselistenertimeout\"));\n        }\n    ;\n    ;\n        var vb = fb(tb);\n        r.getFriend(vb, function(wb) {\n            if (((wb.JSBNG__status == r.ARE_FRIENDS))) {\n                new i().setURI(\"/ajax/friends/lists/flyout_log.php\").setData({\n                    target_id: fb(tb),\n                    unref: ib(tb),\n                    action: ub\n                }).send();\n            }\n        ;\n        ;\n            if (!ha) {\n                return;\n            }\n        ;\n        ;\n            if (((wb.JSBNG__status == r.OUTGOING_REQUEST))) {\n                l.show(ha);\n                i.bootstrap(\"/ajax/friends/lists/nux_flyout.php\", null, true);\n            }\n             else l.hide(ha);\n        ;\n        ;\n        });\n    };\n;\n    function mb(tb, ub) {\n        if (((!((ub instanceof k)) || !p.contains(ia, ub.getContext())))) {\n            ob();\n        }\n    ;\n    ;\n    };\n;\n    function nb(tb) {\n        ia = tb;\n        ka = lb.curry(tb).defer(pa);\n        ja = g.listen(tb, \"mouseleave\", function() {\n            JSBNG__clearTimeout(ka);\n            ia = null;\n            ((ja && ja.remove()));\n        });\n    };\n;\n    function ob() {\n        la = qb.defer(150);\n    };\n;\n    function pb() {\n        var tb = n.getCurrent(), ub = ((tb && tb.getBody()));\n        return !!((ub && p.scry(ub, \".friendListDialogTourCarousel\")[0]));\n    };\n;\n    function qb() {\n        if (((na || pb()))) {\n            return;\n        }\n    ;\n    ;\n        ((((ba.ie() < 8)) && JSBNG__document.documentElement.JSBNG__focus()));\n        if (ea) {\n            ea.hide();\n            var tb = ea.getCausalElement();\n            ((tb && tb.setAttribute(\"aria-expanded\", \"false\")));\n        }\n    ;\n    ;\n    };\n;\n    function rb(JSBNG__event) {\n        var tb = x.byTag(JSBNG__event.getTarget(), \"a\");\n        if (((tb && l.hasClass(tb, \"FriendListActionItem\")))) {\n            ob();\n        }\n    ;\n    ;\n    };\n;\n    function sb(tb) {\n        var ub = m.remove(tb, \"flfcloselistener\");\n        ((ub && ub()));\n    };\n;\n    e.exports = ((a.FriendListFlyoutController || ra));\n});\n__d(\"AddFriendButton\", [\"JSBNG__Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"collectDataAttributes\",\"CSS\",\"DOMQuery\",\"FriendListFlyoutController\",\"FriendStatus\",\"ge\",\"goURI\",\"Style\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncResponse\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"DOMQuery\"), o = b(\"FriendListFlyoutController\"), p = b(\"FriendStatus\"), q = b(\"ge\"), r = b(\"goURI\"), s = b(\"Style\"), t = b(\"URI\"), u = {\n        ERROR_ALREADY_ADDED: 1431005,\n        init: function(v, w, x, y, z, aa, ba, ca, da, ea, fa, ga) {\n            var ha = v.id, ia = null, ja = n.scry(v, \".addButton\")[0], ka = n.scry(v, \".addFriendText\")[0], la = n.scry(v, \".outgoingButton\")[0], ma = n.scry(v, \".incomingButton\")[0], na = n.scry(v, \".friendButton\")[0];\n            function oa(ua, va, wa) {\n                var xa = new t(ja.getAttribute(\"ajaxify\")), ya = l(v, [\"ft\",\"gt\",]);\n                new j().setURI(aa).setData({\n                    to_friend: w,\n                    action: ua,\n                    how_found: y,\n                    ref_param: z,\n                    link_data: ya,\n                    outgoing_id: la.id,\n                    xids: xa.getQueryData().xids,\n                    logging_location: ba,\n                    no_flyout_on_click: ca,\n                    ego_log_data: da,\n                    http_referer: fa\n                }).setErrorHandler(va).setServerDialogCancelHandler(wa).setRelativeTo(la).send();\n                if (((ga && ((ua === \"add_friend\"))))) {\n                    new j().setURI(\"/ajax/add_friend/chain_pymk.php\").send();\n                }\n            ;\n            ;\n            };\n        ;\n            function pa(ua, va) {\n                if (ka) {\n                    m.hide(ka);\n                }\n                 else if (ja) {\n                    m.hide(ja);\n                }\n                \n            ;\n            ;\n                ((la && m.hide(la)));\n                ((ma && m.hide(ma)));\n                ((na && m.hide(na)));\n                if (ua) {\n                    m.show(ua);\n                }\n            ;\n            ;\n                if (((((((\"Outgoing\" == va)) && ((ia != va)))) && ea))) {\n                    new h(ua).from(\"backgroundColor\", \"#FFF8CC\").to(\"backgroundColor\", \"transparent\").from(\"borderColor\", \"#FFE222\").to(\"borderColor\", s.get(ua, \"borderLeftColor\")).duration(2000).go();\n                }\n            ;\n            ;\n                ((ia && m.removeClass(v, ((\"fStatus\" + ia)))));\n                ia = va;\n                m.addClass(v, ((\"fStatus\" + va)));\n            };\n        ;\n            function qa(ua) {\n                if (m.hasClass(ua, \"enableFriendListFlyout\")) {\n                    o.show(ua);\n                }\n                 else o.hide();\n            ;\n            ;\n            };\n        ;\n            var ra = i.subscribe(\"FriendRequest/change\", function(ua, va) {\n                ta();\n                if (((va.uid != w))) {\n                    return;\n                }\n            ;\n            ;\n                switch (va.JSBNG__status) {\n                  case p.ARE_FRIENDS:\n                    return pa(na, \"Friends\");\n                  case p.INCOMING_REQUEST:\n                    return pa(ma, \"Incoming\");\n                  case p.OUTGOING_REQUEST:\n                    return pa(la, \"Outgoing\");\n                  case p.CAN_REQUEST:\n                    return pa(((ka ? ka : ja)), \"Requestable\");\n                };\n            ;\n            }), sa;\n            if (x) {\n                sa = i.subscribe(\"FriendRequest/confirm\", function(ua, va) {\n                    ta();\n                    ((((va.uid == w)) && r(x)));\n                });\n            }\n        ;\n        ;\n            ((ja && g.listen(ja, \"click\", function() {\n                i.inform(\"FriendRequest/sending\", {\n                    uid: w\n                });\n                if (ca) {\n                    o.setActiveNode(la);\n                }\n                 else qa(la);\n            ;\n            ;\n                oa(\"add_friend\", function(ua) {\n                    var va = ((((ua.error == u.ERROR_ALREADY_ADDED)) ? \"FriendRequest/sent\" : \"FriendRequest/sendFail\"));\n                    i.inform(va, {\n                        uid: w\n                    });\n                    o.hide();\n                    k.defaultErrorHandler(ua);\n                }, function(ua) {\n                    i.inform(\"FriendRequest/sendFail\", {\n                        uid: w\n                    });\n                    o.hide();\n                });\n            })));\n            function ta() {\n                if (q(ha)) {\n                    return;\n                }\n            ;\n            ;\n                ((ra && ra.unsubscribe()));\n                ((sa && sa.unsubscribe()));\n                ra = sa = null;\n            };\n        ;\n        }\n    };\n    e.exports = u;\n});\n__d(\"FriendButtonIcon\", [\"Arbiter\",\"FriendStatus\",\"Button\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FriendStatus\"), i = b(\"Button\"), j = b(\"arrayContains\");\n    e.exports = {\n        register: function(k, l, m) {\n            g.subscribe(\"FriendListMembershipChange\", function(n, o) {\n                if (((o.uid == m))) {\n                    var p = j(o.lists, h.CLOSE_FRIENDS), q = j(o.lists, h.ACQUAINTANCES);\n                    if (((p && !q))) {\n                        i.setIcon(k, l.close);\n                    }\n                     else if (((q && !p))) {\n                        i.setIcon(k, l.acquaintance);\n                    }\n                     else i.setIcon(k, l.friend);\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        }\n    };\n});\n__d(\"PopoverMenuShowOnHover\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._popoverMenu = j;\n        this._listeners = [];\n    };\n;\n    h(i.prototype, {\n        enable: function() {\n            this._attachMouseListeners(this._popoverMenu.getTriggerElem());\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", this._onSetMenu.bind(this));\n        },\n        disable: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            if (this._setMenuSubscription) {\n                this._setMenuSubscription.unsubscribe();\n                this._setMenuSubscription = null;\n            }\n        ;\n        ;\n        },\n        _onSetMenu: function() {\n            this._attachMouseListeners(this._popoverMenu.getMenu().getRoot());\n        },\n        _attachMouseListeners: function(j) {\n            var k = this._popoverMenu.getPopover();\n            this._listeners.push(g.listen(j, \"mouseenter\", k.showLayer.bind(k)), g.listen(j, \"mouseleave\", k.hideLayer.bind(k)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"OGCollectionAddDialog\", [\"AsyncRequest\",\"DataStore\",\"DOMQuery\",\"Form\",\"MenuDeprecated\",\"URI\",\"collectDataAttributes\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Form\"), k = b(\"MenuDeprecated\"), l = b(\"URI\"), m = b(\"collectDataAttributes\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"tidyEvent\"), q = \"OGCollectionAddDialog\";\n    function r(s, t, u, v, w) {\n        this._dialog = s;\n        this._surface = t;\n        this._endpoint = l(v);\n        this._loadEditMenu = w.loadEditMenu;\n        this._listener = h.get(String(u), q);\n        this._audienceSelector = i.JSBNG__find(this._dialog.getContent(), \".audienceSelector\");\n        this._menu = i.JSBNG__find(this._dialog.getContent(), \".-cx-PRIVATE-fbOGCollectionAddMenu__menu\");\n        k.register(this._menu);\n        this._menuSubscriptionToken = k.subscribe(\"select\", this._onMenuClick.bind(this));\n        p([this._dialog.subscribe(\"show\", this._onDialogShow.bind(this)),this._dialog.subscribe(\"hide\", this._onDialogHide.bind(this)),]);\n        this._dialog.show();\n    };\n;\n    n(r, {\n        INSTANCE_KEY: q\n    });\n    n(r.prototype, {\n        _onDialogShow: function() {\n            this._listener.onDialogShow(this._dialog);\n        },\n        _onDialogHide: function() {\n            this._destroy();\n        },\n        _onMenuClick: function(s, t) {\n            if (((t.menu !== this._menu))) {\n                return;\n            }\n        ;\n        ;\n            var u = t.item;\n            this._listener.onMenuClick(u);\n            var v = i.JSBNG__find(u, \".-cx-PRIVATE-fbOGCollectionAddMenu__collectiontoken\"), w = v.getAttribute(\"value\");\n            this._submitRequest(w);\n        },\n        _submitRequest: function(s) {\n            this._endpoint.addQueryData({\n                collection_token: s\n            });\n            this._dialog.hide();\n            this._request = new g(this._endpoint).setData(n(j.serialize(this._audienceSelector), {\n                action: \"add\",\n                load_edit_menu: this._loadEditMenu,\n                surface: this._surface\n            }, m(this._dialog.getContext(), [\"ft\",]))).setHandler(function() {\n                this._listener.onAddSuccess();\n            }.bind(this));\n            this._request.send();\n        },\n        _destroy: function() {\n            this._listener.onDialogHide();\n            k.unsubscribe(this._menuSubscriptionToken);\n        }\n    });\n    e.exports = r;\n});\n__d(\"OGCollectionAddMenu\", [\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"JSBNG__Event\",\"OGCollectionAddDialog\",\"Parent\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"JSBNG__Event\"), l = b(\"OGCollectionAddDialog\"), m = b(\"Parent\"), n = b(\"TidyArbiterMixin\"), o = b(\"copyProperties\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\");\n    function s(t, u, v, w, x, y) {\n        this._image = u;\n        this._container = v;\n        this._placeholder = w;\n        this._surface = x;\n        this._showPlaceholder = y.showPlaceholder;\n        this._rateControl = i.scry(this._container.parentNode, \".-cx-PRIVATE-fbOGCollectionRateDialog__wrapperlink\")[0];\n        s.inform(\"addButton\", {\n            button: this._image,\n            root: this._container\n        });\n        r(k.listen(this._container, \"click\", function(z) {\n            var aa = m.byClass(z.getTarget(), \"-cx-PUBLIC-fbOGCollectionAddMenu__hoverimg\");\n            if (((this.isDialogShowing() && aa))) {\n                z.kill();\n            }\n        ;\n        ;\n        }.bind(this)));\n        if (((this._surface === \"friend_timeline_lhc\"))) {\n            this._handleAlwaysVisibleLHC();\n        }\n    ;\n    ;\n        h.set(String(t), l.INSTANCE_KEY, this);\n    };\n;\n    o(s, n);\n    o(s.prototype, n, {\n        destroy: function() {\n            i.remove(this._container);\n            this._placeholder.destroy();\n        },\n        hide: function() {\n            g.hide(this._container);\n            this._placeholder.hide();\n        },\n        getParent: function() {\n            return this._container.parentNode;\n        },\n        insertMenuIntoDialog: function(t) {\n            this._placeholder.insertIntoDialog(t);\n        },\n        onMenuClick: function(t) {\n            var u = j.JSBNG__find(t, \".-cx-PRIVATE-fbOGCollectionAddMenu__showrate\");\n            this._showRate = ((this._rateControl && u.getAttribute(\"value\")));\n            g.hide(this._image);\n            if (this._showRate) {\n                g.show(this._rateControl);\n                k.fire(this._rateControl, \"click\");\n            }\n             else if (this._showPlaceholder) {\n                g.show(this._placeholder.getIcon());\n            }\n            \n        ;\n        ;\n        },\n        onAddSuccess: function() {\n            if (((!this._showPlaceholder && !this._showRate))) {\n                this.inform(\"reload\");\n            }\n        ;\n        ;\n        },\n        onDialogShow: function(t) {\n            var u = j.JSBNG__find(t.getContent(), \".audienceSelector\");\n            g.addClass(this._image, \"openToggler\");\n            s.inform(\"menuOpened\", {\n                audienceSelector: u.parentNode\n            });\n            this._dialogShowing = true;\n        },\n        onDialogHide: function() {\n            g.removeClass(this._image, \"openToggler\");\n            this._dialogShowing = false;\n        },\n        isDialogShowing: function() {\n            return this._dialogShowing;\n        },\n        _handleAlwaysVisibleLHC: function() {\n            var t = m.byClass(this._container, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__container\"), u = m.byClass(t, \"-cx-PRIVATE-ogAppReport__root\");\n            if (g.hasClass(t, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\")) {\n                r([this._alwaysVisibleToken = k.listen(u, \"mouseenter\", function() {\n                    g.removeClass(t, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\");\n                    this._alwaysVisibleToken.remove();\n                }.bind(this)),]);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"TimelineAppSectionCuration\", [\"Animation\",\"AppSectionCurationState\",\"Arbiter\",\"AsyncSignal\",\"CSS\",\"DOM\",\"Ease\",\"JSBNG__Event\",\"OnVisible\",\"Parent\",\"Style\",\"TidyArbiterMixin\",\"TimelineSection\",\"copyProperties\",\"cx\",\"queryThenMutateDOM\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AppSectionCurationState\"), i = b(\"Arbiter\"), j = b(\"AsyncSignal\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Ease\"), n = b(\"JSBNG__Event\"), o = b(\"OnVisible\"), p = b(\"Parent\"), q = b(\"Style\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineSection\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"queryThenMutateDOM\"), w = b(\"tidyEvent\"), x = 0, y = {\n    }, z = {\n    };\n    function aa(fa, ga, ha) {\n        var ia, ja, ka = ((((ga != h.hide)) && ((ha != h.hide))));\n        v(function() {\n            ja = fa.offsetHeight;\n            ia = ((((ga === h.hide)) ? 0 : fa.firstChild.offsetHeight));\n        }, function() {\n            q.set(fa, \"height\", ((ja + \"px\")));\n            q.set(fa, \"overflow\", \"hidden\");\n            ((ia && k.addClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\")));\n            o.checkBuffer.defer();\n            var la = l.getID(fa);\n            ((z[la] && z[la].JSBNG__stop()));\n            z[la] = new g(fa).to(\"height\", ia).ondone(function() {\n                delete z[la];\n                if (ia) {\n                    q.set(fa, \"overflow\", \"\");\n                    q.set(fa.parentNode, \"overflow\", \"\");\n                }\n            ;\n            ;\n                ((!ia && k.removeClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\")));\n                i.inform(\"reflow\");\n            }).duration(((Math.abs(((ia - ja))) * ((ka ? 5 : 1.5))))).ease(m.sineOut).go();\n        });\n    };\n;\n    function ba(fa, ga) {\n        if (fa) {\n            k.show(ga);\n            k.hide(fa);\n        }\n    ;\n    ;\n    };\n;\n    function ca(fa, ga) {\n        if (fa) {\n            k.show(fa);\n            k.hide(ga);\n        }\n    ;\n    ;\n    };\n;\n    function da(fa, ga) {\n        s.callWithSection(fa, function(ha) {\n            new j(\"/ajax/timeline/collections/app_recs/\", {\n                collection_token: ha.getActiveCollection().getToken(),\n                event_type: ga\n            }).send();\n        });\n    };\n;\n    var ea = t({\n        addSection: function(fa, ga, ha) {\n            y[fa] = {\n                appClickLogged: false,\n                buttons: ga,\n                JSBNG__content: ha,\n                id: fa,\n                state: h.hide\n            };\n            q.set(ha, \"height\", \"0px\");\n            q.set(ha, \"overflow\", \"hidden\");\n            k.show(ha);\n            {\n                var fin204keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin204i = (0);\n                var ia;\n                for (; (fin204i < fin204keys.length); (fin204i++)) {\n                    ((ia) = (fin204keys[fin204i]));\n                    {\n                        w([n.listen(ga[ia].hide_button, \"click\", ea.informState.curry(h.hide, fa)),n.listen(ga[ia].show_button, \"click\", ea.informState.curry(ia, fa)),]);\n                    ;\n                    };\n                };\n            };\n        ;\n            ea.register(fa, function(ja, ka, la, ma) {\n                new o(ha, aa.curry(ha, ja, ma), true, x);\n                {\n                    var fin205keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin205i = (0);\n                    var na;\n                    for (; (fin205i < fin205keys.length); (fin205i++)) {\n                        ((na) = (fin205keys[fin205i]));\n                        {\n                            ca(ga[na].show_button, ga[na].hide_button);\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (ga[ja]) {\n                    ba(ga[ja].show_button, ga[ja].hide_button);\n                }\n            ;\n            ;\n            });\n        },\n        informState: function(fa, ga) {\n            if (((y[ga] && ((y[ga].state !== fa))))) {\n                if (((((fa === h.showApps)) && !y[ga].appClickLogged))) {\n                    y[ga].appClickLogged = true;\n                    da(ga, \"add_apps_click\");\n                }\n            ;\n            ;\n                var ha = y[ga].state;\n                y[ga].state = fa;\n                ea.inform(fa, {\n                    obj: y[ga],\n                    oldState: ha\n                });\n            }\n        ;\n        ;\n        },\n        linkContent: function(fa, ga, ha) {\n            var ia = y[fa].buttons[h.showApps].show_button;\n            k.show(p.byClass(ia, \"hidden_elem\"));\n            new o(ia, function() {\n                if (((Math.floor(((Math.JSBNG__random() * 100))) === 0))) {\n                    da(fa, \"add_apps_imp\");\n                }\n            ;\n            ;\n            }, true, x);\n            ea.register(fa, function(ja, ka, la, ma) {\n                if (((ja == h.showItems))) {\n                    if (((ma == h.showApps))) {\n                        q.set(y[fa].JSBNG__content.parentNode, \"overflow\", \"hidden\");\n                    }\n                ;\n                ;\n                    k.show(ga);\n                    k.hide(ha);\n                }\n                 else if (((ja == h.showApps))) {\n                    k.hide(ga);\n                    k.show(ha);\n                }\n                \n            ;\n            ;\n            });\n        },\n        register: function(fa, ga) {\n            var ha = ea.subscribe([h.hide,h.showItems,h.showApps,], function(ia, ja) {\n                if (((ja.obj.id === fa))) {\n                    ga(ia, ja.obj, ha, ja.oldState);\n                }\n            ;\n            ;\n            });\n        },\n        getSectionState: function(fa) {\n            if (y[fa]) {\n                return y[fa].state;\n            }\n        ;\n        ;\n        }\n    }, r);\n    e.exports = ea;\n});\n__d(\"TimelineMonitor\", [\"Arbiter\",\"JSBNG__Event\",\"Run\",\"Vector\",\"ViewportBounds\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"queryThenMutateDOM\"), n = {\n    }, o = {\n    }, p = 0, q = [], r = null, s = false;\n    function t() {\n        n = {\n        };\n        o = {\n        };\n        p = 0;\n        q.length = 0;\n        ((r && r.remove()));\n        r = null;\n        s = false;\n    };\n;\n    function u() {\n        if (!r) {\n            r = h.listen(window, \"JSBNG__scroll\", z);\n        }\n    ;\n    ;\n        if (!s) {\n            i.onLeave(t);\n            s = true;\n        }\n    ;\n    ;\n        z();\n    };\n;\n    var v = [], w = [];\n    function x() {\n        q.forEach(function(ea) {\n            var fa = aa.getSection(ea);\n            if (((fa && ((fa !== o[ea.id]))))) {\n                o[ea.id] = fa;\n                v.push({\n                    section: fa\n                });\n            }\n        ;\n        ;\n        });\n        var ba = ((k.getTop() + j.getScrollPosition().y));\n        {\n            var fin206keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin206i = (0);\n            var ca;\n            for (; (fin206i < fin206keys.length); (fin206i++)) {\n                ((ca) = (fin206keys[fin206i]));\n                {\n                    var da = n[ca];\n                    if (((((((ba >= da.boundary)) && ((p <= da.boundary)))) || ((((ba <= da.boundary)) && ((p >= da.boundary))))))) {\n                        n[ca].fromAbove = ((p < ba));\n                        w.push(n[ca]);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        p = ba;\n    };\n;\n    function y() {\n        v.forEach(function(ba) {\n            g.inform(aa.SECTION_CHANGE, ba);\n        });\n        w.forEach(function(ba) {\n            g.inform(aa.BOUNDARY_PASSED, ba);\n        });\n        v.length = 0;\n        w.length = 0;\n    };\n;\n    function z() {\n        m(x, y, \"TimelineMonitor/scroll\");\n    };\n;\n    var aa = {\n        BOUNDARY_PASSED: \"TimelineMonitor/boundary\",\n        SECTION_CHANGE: \"TimelineMonitor/change\",\n        getSection: function(ba) {\n            var ca = ((k.getTop() + j.getScrollPosition().y)), da = ba.childSections.getHead();\n            while (da) {\n                if (((l(da.nodeID) && ((ca < ((j.getElementPosition(da.getNode()).y + j.getElementDimensions(da.getNode()).y))))))) {\n                    return da;\n                }\n            ;\n            ;\n                da = da.getNext();\n            };\n        ;\n        },\n        monitorBoundary: function(ba, ca) {\n            ca = ((ca || ba));\n            if (((!n[ca] || ((n[ca].boundary !== ba))))) {\n                n[ca] = {\n                    boundary: ba,\n                    id: ca\n                };\n                u();\n            }\n        ;\n        ;\n        },\n        monitorSection: function(ba) {\n            o[ba.id] = null;\n            q.push(ba);\n            u();\n            return aa.getSection(ba);\n        },\n        poke: function(ba) {\n            z();\n        }\n    };\n    e.exports = aa;\n});\n__d(\"TimelineAppSection\", [\"AppSectionCurationState\",\"Arbiter\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"JSLogger\",\"MedleyPageletRequestData\",\"PageletSet\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineAppCollection\",\"TimelineAppSectionCuration\",\"TimelineDynamicSection\",\"TimelineMonitor\",\"TimelineSection\",\"TimelineSmartInsert\",\"TriggerablePageletLoader\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"DOMScroll\"), n = b(\"JSLogger\"), o = b(\"MedleyPageletRequestData\"), p = b(\"PageletSet\"), q = b(\"Style\"), r = b(\"TidyArbiter\"), s = b(\"TidyArbiterMixin\"), t = b(\"TimelineAppCollection\"), u = b(\"TimelineAppSectionCuration\"), v = b(\"TimelineDynamicSection\"), w = b(\"TimelineMonitor\"), x = b(\"TimelineSection\"), y = b(\"TimelineSmartInsert\"), z = b(\"TriggerablePageletLoader\"), aa = b(\"ViewportBounds\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"ge\"), fa = b(\"tx\"), ga = 500, ha = 2, ia = 500, ja = 18, ka = \"-cx-PRIVATE-fbTimelineAppSection__tabscondensed\", la = \"-cx-PRIVATE-fbTimelineAppSection__activetab\", ma = k.create(\"div\", {\n        className: \"-cx-PRIVATE-fbTimelineAppSection__tabnub\"\n    });\n    function na() {\n        return k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdown\"\n        }, [k.create(\"a\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownlabel\",\n            href: \"#\"\n        }, \"More\"),k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\"\n        }),]);\n    };\n;\n    var oa = n.create(\"collections\"), pa = {\n        notes: 295,\n        events: 345,\n        photos: 555,\n        app_quoraapp: 569,\n        friends: 603,\n        app_foodspotting: 621,\n        map: 621,\n        favorites: 645,\n        app_pinterestapp: 699,\n        app_instapp: 699,\n        books: 699,\n        movies: 699,\n        tv: 699,\n        music: 725\n    };\n    function qa(sa) {\n        return pa[sa.replace(\"pagelet_timeline_medley_\", \"\")];\n    };\n;\n    function ra(sa, ta, ua, va) {\n        this.parent.construct(this, ra.getIDBySK(ta), sa, ua);\n        this._sk = ta;\n        this._title = va;\n    };\n;\n    i.extend(ra, v);\n    ba(ra, {\n        createFromArray: function(sa) {\n            return sa.map(function(ta) {\n                return new ra(ta.controller, ta.sk, ta.label, ta.title);\n            });\n        },\n        getIDBySK: function(sa) {\n            return ((\"pagelet_timeline_medley_\" + sa));\n        },\n        registerCollections: function(sa, ta, ua) {\n            x.callWithSection(ra.getIDBySK(sa), function(va) {\n                t.createFromArray(ta).forEach(va.appendSection.bind(va));\n                var wa = va.childSections.get(ua);\n                va.setActiveCollection(wa);\n                wa.setIsLoaded(true);\n            });\n        },\n        removeEmptyAppSection: function(sa) {\n            x.callWithSection(ra.getIDBySK(sa), function(ta) {\n                ta.remove();\n            });\n        }\n    }, s);\n    ba(ra.prototype, s, {\n        _createNode: function() {\n            var sa = this.parent._createNode();\n            sa.setAttribute(\"aria-labelledby\", ((\"medley_header_\" + this._sk)));\n            sa.setAttribute(\"aria-role\", \"region\");\n            k.prependContent(sa, k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__header\"\n            }, [this._title,k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__tabs\",\n                \"aria-role\": \"tablist\"\n            }),]));\n            this.resetMinHeight(sa);\n            return sa;\n        },\n        addAuxContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\")[0];\n            ((ta && k.appendContent(ta, sa)));\n            ((this._activeCollection && this._checkTabDimensions(this._activeCollection)));\n        },\n        nullStateCurationContent: function() {\n            if (!this._nullStateContent) {\n                return;\n            }\n        ;\n        ;\n            var sa = l.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\");\n            k.replace(sa.firstChild, this._nullStateContent);\n        },\n        addCurationContent: function(sa, ta, ua) {\n            var va = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\")[0];\n            ((va && k.appendContent(va, sa)));\n            if (ua) {\n                this._nullStateContent = ua;\n            }\n        ;\n        ;\n            this._checkCurationContent(ta);\n        },\n        createTriggerLoader: function(sa) {\n            var ta = function(ua) {\n                this._parentSection._lastLoadedSection = this;\n                this.setIsLoaded(true);\n                y.enable();\n                y.run(this.getNode(), function() {\n                    ua();\n                    this.unsetMinHeight();\n                    w.poke(this._parentSection.id);\n                }.bind(this), \"viewport\");\n            }.bind(this);\n            r.subscribe(\"Medley/requestDataSet\", function() {\n                this._triggerLoader = new z({\n                    controller: this._controller,\n                    data: this.getData(),\n                    displayCallback: ta,\n                    options: {\n                        constHeight: true\n                    },\n                    node: this.getNode()\n                }, [{\n                    node: this.getNode(),\n                    onVisibleBuffer: ga,\n                    onVisibleStrict: true,\n                    type: ((sa ? z.TRIGGER_NOW : z.TRIGGER_ONVISIBLE))\n                },]);\n            }.bind(this));\n        },\n        freeze: function() {\n            j.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            if (((ea(this.nodeID) && !this.isLoaded()))) {\n                ((this._triggerLoader && this._triggerLoader.disableTriggers()));\n            }\n        ;\n        ;\n            this.freezeChildren();\n        },\n        getData: function() {\n            if (!this._data) {\n                this._data = ba({\n                    sk: this._sk\n                }, o.get(), {\n                    overview: ((this._parentSection._sk !== this._sk))\n                });\n            }\n        ;\n        ;\n            return this._data;\n        },\n        getActiveCollection: function() {\n            return this._activeCollection;\n        },\n        remove: function() {\n            if (p.hasPagelet(this.id)) {\n                p.removePagelet(this.id);\n            }\n        ;\n        ;\n            k.remove(this.getNode());\n            this._parentSection.childSections.remove(this.id);\n        },\n        setActiveCollection: function(sa) {\n            if (((((this._activeCollection === sa)) || !sa._tabNode))) {\n                return;\n            }\n        ;\n        ;\n            if (this._activeCollection) {\n                h.inform(\"TimelineSideAds/refresh\");\n                oa.log(\"change_collection\", {\n                    previous_collection: this._activeCollection.getToken(),\n                    new_collection: sa.getToken()\n                });\n                this.resetMinHeight();\n                this._activeCollection.disableContentLoader();\n                j.hide(this._activeCollection.getNode());\n                j.removeClass(this._activeCollection._tabNode, la);\n                k.scry(this._activeCollection._tabNode, \"div.-cx-PRIVATE-fbTimelineAppSection__tabnub\").forEach(k.remove);\n                k.appendContent(sa._tabNode, ma.cloneNode(true));\n                ((this._activeCollection.auxContent && j.hide(this._activeCollection.auxContent)));\n                ((this._activeCollection.curationContent && j.hide(this._activeCollection.curationContent)));\n                this._activeCollection._tabNode.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n        ;\n            ((sa.auxContent && j.show(sa.auxContent)));\n            this._checkCurationContent(sa);\n            j.addClass(sa._tabNode, la);\n            this._checkTabDimensions(sa);\n            this._activeCollection = sa;\n            ra.inform(\"changeCollection\");\n            if (!ea(sa.nodeID)) {\n                k.appendContent(l.JSBNG__find(this.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), sa.getNode());\n            }\n        ;\n        ;\n            j.show(sa.getNode());\n            ((sa.isLoaded() && this.unsetMinHeight()));\n            sa._tabNode.setAttribute(\"aria-selected\", \"true\");\n            sa.enableContentLoader();\n        },\n        resetMinHeight: function(sa) {\n            ((sa || (sa = this.getNode())));\n            var ta = ((qa(this.id) || ((sa.offsetHeight - ha))));\n            ((((ta > 0)) && this._updateScrollAfterHeight(sa, ta)));\n        },\n        JSBNG__scrollTo: function(sa, ta) {\n            var ua = aa.getElementPosition(this.getNode());\n            ua.y -= ((sa || ja));\n            ((ta && this._parentSection.toggleScrollLoad(false)));\n            m.JSBNG__scrollTo(ua, ia, null, null, function() {\n                ua = aa.getElementPosition(this.getNode());\n                ua.y -= ((sa || ja));\n                m.JSBNG__scrollTo(ua);\n                ((ta && this._parentSection.toggleScrollLoad(true)));\n            }.bind(this));\n        },\n        thaw: function() {\n            j.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            ((this._triggerLoader && this._triggerLoader.enableTriggers()));\n            this.thawChildren();\n        },\n        unsetMinHeight: function() {\n            this._updateScrollAfterHeight(this.getNode(), 0);\n        },\n        _updateScrollAfterHeight: function(sa, ta) {\n            q.set(sa, \"min-height\", ((ta + \"px\")));\n            h.inform(\"reflow\");\n        },\n        _checkCurationContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcurationbutton\")[0];\n            if (ta) {\n                j.conditionShow(ta, sa.curationContent);\n                if (sa.curationContent) {\n                    j.show(sa.curationContent);\n                    if (sa.curationContentState) {\n                        u.informState(sa.curationContentState, this.id);\n                    }\n                ;\n                ;\n                }\n                 else u.informState(g.hide, this.id, g.showItems);\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _getTabObj: function() {\n            if (!this._tabObj) {\n                this._tabObj = {\n                    aux: k.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\"),\n                    items: [],\n                    nav: k.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__navigation\"),\n                    tabs: k.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tabs\"),\n                    width: 0\n                };\n                j.addClass(this._tabObj.tabs, \"-cx-PRIVATE-fbTimelineAppSection__tabsloaded\");\n            }\n        ;\n        ;\n            return this._tabObj;\n        },\n        _checkTabDimensions: function(sa) {\n            var ta = this._getTabObj(), ua = ((ta.nav.offsetWidth - ta.aux.offsetWidth));\n            if (((ua >= ta.width))) {\n                if (((!ta.hidden && ((((ua - ta.tabs.offsetWidth)) >= 0))))) {\n                    return;\n                }\n            ;\n            ;\n                j.removeClass(ta.tabs, ka);\n            }\n        ;\n        ;\n            if (((ta.hidden && ((sa._tabNode.parentNode === ta.overflow))))) {\n                k.prependContent(ta.overflow, ta.dropdown.previousSibling);\n                k.insertBefore(ta.dropdown, sa._tabNode);\n            }\n        ;\n        ;\n            if (((((((ua - ta.tabs.offsetWidth)) >= 0)) && !ta.hidden))) {\n                return;\n            }\n        ;\n        ;\n            var va = ta.items.length;\n            if (((va && ta.hidden))) {\n                for (var wa = 0; ((wa < va)); wa++) {\n                    k.appendContent(ta.tabs, ta.items[wa]);\n                ;\n                };\n            ;\n                k.remove(ta.dropdown);\n            }\n        ;\n        ;\n            j.conditionClass(ta.tabs, ka, ((((ua - ta.tabs.offsetWidth)) < 0)));\n            ta.width = ua;\n            ta.hidden = 0;\n            if (((((ua - ta.tabs.offsetWidth)) >= 0))) {\n                return;\n            }\n        ;\n        ;\n            if (!ta.dropdown) {\n                ta.dropdown = na();\n                ta.overflow = k.JSBNG__find(ta.dropdown, \".-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\");\n                ta.items = k.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tab\");\n                va = ta.items.length;\n            }\n        ;\n        ;\n            k.appendContent(ta.tabs, ta.dropdown);\n            var xa = 0;\n            for (wa = ((va - 1)); ((((wa > 0)) && ((xa <= 0)))); wa--) {\n                if (((ta.items[wa] !== sa._tabNode))) {\n                    k.prependContent(ta.overflow, ta.items[wa]);\n                    xa = ((ua - ta.tabs.offsetWidth));\n                    ta.hidden++;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    });\n    e.exports = ra;\n});\n__d(\"TimelineCoverDisclaimer\", [\"Dialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\");\n    function h(i, j, k) {\n        if (((h.displayed === undefined))) {\n            h.displayed = true;\n        }\n         else return\n    ;\n        new g().setModal(true).setTitle(i).setBody(j).setButtonsMessage(k).setButtons(g.OK).show();\n    };\n;\n    e.exports = h;\n});\n__d(\"legacy:TimelineCoverDisclaimer\", [\"TimelineCoverDisclaimer\",], function(a, b, c, d) {\n    a.TimelineCoverDisclaimer = b(\"TimelineCoverDisclaimer\");\n}, 3);\n__d(\"TimelineMedley\", [\"Class\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"PageTransitions\",\"TimelineAppSection\",\"TimelineDynamicSectionConfig\",\"TimelineMonitor\",\"TimelineSection\",\"URI\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMPosition\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"TimelineAppSection\"), n = b(\"TimelineDynamicSectionConfig\"), o = b(\"TimelineMonitor\"), p = b(\"TimelineSection\"), q = b(\"URI\"), r = b(\"ViewportBounds\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"ge\"), w = b(\"$\"), x = \"timeline-medley\", y = \"about\", z = 2, aa = false;\n    function ba(ea) {\n        var fa = ((ea.getQueryData().sk || ea.getPath().split(\"/\")[2]));\n        return ((n.skmapping[fa] || fa));\n    };\n;\n    function ca(ea) {\n        if (ea.getQueryData().id) {\n            return ea.getQueryData.id;\n        }\n    ;\n    ;\n        return ea.getPath().split(\"/\")[1];\n    };\n;\n    function da(ea, fa, ga) {\n        this.parent.construct(this, x);\n        this.isOverview = ((ea.length > 1));\n        n.breaker = ga.breaker;\n        m.createFromArray(ea).forEach(this.appendSection.bind(this));\n        o.monitorSection(this);\n        this._lastLoadedSection = this.childSections.get(m.getIDBySK(fa)).setIsLoaded(true);\n        p.setActiveSectionID(this._lastLoadedSection.id);\n        if (((aa && this.isMedleyView()))) {\n            this.addSectionPlaceholders();\n        }\n    ;\n    ;\n        var ha = q.getNextURI();\n        this._vanity = ca(ha);\n        this._sk = ba(ha);\n        if (this.isOverview) {\n            l.registerHandler(this._transitionHandler.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    g.extend(da, p);\n    s(da, {\n        loadToSection: function(ea, fa) {\n            p.setActiveSectionID(ea);\n            p.callWithSection(x, function(ga) {\n                var ha = ga.childSections.getHead(), ia = 0;\n                while (((ha && ((ha.id !== ea))))) {\n                    ia++;\n                    ha = ha.getNext();\n                };\n            ;\n                if (!ia) {\n                    return fa(ha);\n                }\n            ;\n            ;\n                ia--;\n                ((ia && ga.addUpcomingSectionPlaceholders(ga.childSections.getHead(), ia)));\n                ga.addSectionPlaceholder(ha, ha.getPrev(), true);\n                var ja = ha.subscribe(\"loaded\", function() {\n                    fa(ha);\n                    ja.unsubscribe();\n                });\n            });\n        },\n        scrollToSection: function(ea, fa, ga) {\n            p.callWithSection(ea, function(ha) {\n                ha.JSBNG__scrollTo(fa, ga);\n            });\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            p.callWithSection(x, function(fa) {\n                fa.toggleScrollLoad(ea);\n            });\n        }\n    });\n    s(da.prototype, {\n        addSectionTeasers: function() {\n            if (!this.isMedleyView()) {\n                h.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                this.thawChildren();\n                this.addSectionPlaceholders();\n                this.addSectionBreak();\n            }\n        ;\n        ;\n        },\n        addUpcomingSectionPlaceholders: function(ea, fa) {\n            fa = ((fa || z));\n            while (ea = ea.getNext()) {\n                if (((!this.addSectionPlaceholder(ea, ea.getPrev()) && ((--fa <= 0))))) {\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        addSectionPlaceholder: function(ea, fa, ga) {\n            if (((!ea.isLoaded() && v(ea.nodeID)))) {\n                return false;\n            }\n        ;\n        ;\n            if (!v(ea.nodeID)) {\n                i.insertAfter(fa.getNode(), ea.getNode());\n                ea.createTriggerLoader(ga);\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        addSectionBreak: function() {\n            if (this._lastLoadedSection.getNext()) {\n                i.insertAfter(this.childSections.getHead().getNode(), n.breaker);\n            }\n             else i.remove(n.breaker);\n        ;\n        ;\n        },\n        addSectionPlaceholders: function() {\n            this.addUpcomingSectionPlaceholders(this._lastLoadedSection);\n        },\n        getNode: function() {\n            return w(this.id);\n        },\n        isMedleyView: function() {\n            return ((this._sk === y));\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            if (ea) {\n                this.thawChildren();\n                this.addSectionPlaceholders();\n            }\n             else this.freezeChildren();\n        ;\n        ;\n        },\n        _transitionHandler: function(ea) {\n            if (((ca(ea) !== this._vanity))) {\n                return false;\n            }\n        ;\n        ;\n            var fa = ba(ea);\n            if (!fa) {\n                return false;\n            }\n        ;\n        ;\n            if (((fa === y))) {\n                return false;\n            }\n             else {\n                var ga = ea.getQueryData();\n                if (!ga.next_cursor) {\n                    return false;\n                }\n            ;\n            ;\n                var ha = this.childSections.getHead();\n                while (ha) {\n                    if (((ha._sk === fa))) {\n                        if (((!ha._activeCollection && !k.scry(ha._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\")[0]))) {\n                            return false;\n                        }\n                    ;\n                    ;\n                        this._transitionToSection.bind(this, ha, ga).defer();\n                        return true;\n                    }\n                ;\n                ;\n                    ha = ha.getNext();\n                };\n            ;\n            }\n        ;\n        ;\n            return false;\n        },\n        _transitionToSection: function(ea, fa) {\n            var ga = ((j.getElementPosition(ea.getNode()).y - r.getTop()));\n            i.scry(ea.getNode(), \".-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\").forEach(function(ja) {\n                h.removeClass(ja, \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n            });\n            this._sk = ea._sk;\n            p.setActiveSectionID(ea.id);\n            ea.thaw();\n            h.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n            this.freezeChildren();\n            var ha = k.JSBNG__find(ea._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            ea._activeCollection.addContentLoader(ha, fa.next_cursor);\n            ea._activeCollection._contentLoader.load({\n                node: ha\n            });\n            var ia = this.childSections.getHead();\n            while (((ia && ((ia.id !== ea.id))))) {\n                ia.remove();\n                ia = this.childSections.getHead();\n            };\n        ;\n            p.inform(\"Medley/transitionToSection\", ea.id);\n            ea.JSBNG__scrollTo(((((ga < 0)) ? ga : 0)));\n            l.transitionComplete();\n        }\n    });\n    e.exports = da;\n});\n__d(\"TimelineNavLight\", [\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineSection\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"Parent\"), k = b(\"TimelineSection\"), l = b(\"csx\"), m = b(\"cx\");\n    function n(o) {\n        var p = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__activeitem\")[0], q = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__item\"), r = j.byClass(o, \"-cx-PRIVATE-fbTimelineLightHeader__navwrapper\").offsetWidth, s = q[((q.length - 1))];\n        if (((((s.offsetLeft + s.offsetWidth)) > r))) {\n            g.addClass(o, \"-cx-PRIVATE-fbTimelineNavLight__navminimal\");\n        }\n    ;\n    ;\n        for (var t = ((q.length - 1)); ((t > 1)); t--) {\n            if (((((q[t].offsetLeft + q[t].offsetWidth)) > r))) {\n                h.remove(q[t]);\n            }\n             else break;\n        ;\n        ;\n        };\n    ;\n        var u = \"-cx-PUBLIC-fbTimelineLightHeader__loading\";\n        g.removeClass(j.byClass(o, u), u);\n        k.subscribe(\"Medley/transitionToSection\", function(v, w) {\n            if (((p && ((w === p.getAttribute(\"data-medley-id\")))))) {\n                return;\n            }\n        ;\n        ;\n            ((p && g.removeClass(p, \"-cx-PRIVATE-fbTimelineNavLight__activeitem\")));\n            for (var x = 0; ((x < q.length)); ++x) {\n                if (((q[x].getAttribute(\"data-medley-id\") === w))) {\n                    g.addClass(q[x], \"-cx-PRIVATE-fbTimelineNavLight__activeitem\");\n                    p = q[x];\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n        });\n    };\n;\n    e.exports = n;\n});\n__d(\"TimelineOGCollectionAddSelector\", [\"AsyncRequest\",\"DOM\",\"Form\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DOM\"), i = b(\"Form\"), j = b(\"TidyArbiterMixin\"), k = b(\"copyProperties\"), l = b(\"csx\"), m = b(\"tidyEvent\");\n    function n(o, p, q, r) {\n        this._endpoint = q;\n        this._button = o;\n        this._buttonParent = o.parentNode;\n        this._audienceSelector = r;\n        var s = h.JSBNG__find(o, \".-cx-PUBLIC-fbTimelineAddSelector__menubutton\");\n        n.inform(\"addButton\", {\n            button: s,\n            root: this._buttonParent\n        });\n        m([p.getMenu().subscribe(\"rendered\", function(t, u) {\n            n.inform(\"menuOpened\", {\n                audienceSelector: r\n            });\n            h.appendContent(h.JSBNG__find(u, \".-cx-PUBLIC-abstractMenu__border\"), r);\n        }),p.subscribe(\"itemselected\", this._onChange.bind(this)),]);\n    };\n;\n    k(n, j);\n    k(n.prototype, j, {\n        _onChange: function(o, p) {\n            var q = p.getValue(), r = ((this.inform(\"addedToCollection\", q) || {\n            }));\n            new g(this._endpoint).setData(k(i.serialize(this._audienceSelector), r, {\n                action: \"add\",\n                collection_token: q,\n                mechanism: \"add_selector\"\n            })).send();\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineCurationNUXController\", [\"AppSectionCurationState\",\"AsyncRequest\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"OGCollectionAddMenu\",\"TimelineOGCollectionAddSelector\",\"URI\",\"$\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"OGCollectionAddMenu\"), m = b(\"TimelineOGCollectionAddSelector\"), n = b(\"URI\"), o = b(\"$\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\"), s = 5, t = \"pagelet_timeline_medley_movies\", u = 165, v, w, x, y, z, aa, ba = [], ca = {\n        reports: 0,\n        about: 1,\n        section: 2,\n        section_privacy: 3,\n        add_button: 4,\n        privacy: 5,\n        0: \"reports\",\n        1: \"about\",\n        2: \"section\",\n        3: \"section_privacy\",\n        4: \"add_button\",\n        5: \"privacy\"\n    };\n    function da() {\n        ba.forEach(function(na) {\n            ((na.button && na.button.setAttribute(\"data-hover\", \"tooltip\")));\n            ((na.listener && na.listener.remove()));\n        });\n        ba.length = 0;\n    };\n;\n    function ea(na) {\n        if (z[na]) {\n            z[na].destroy();\n            delete z[na];\n            ((((na === \"add_button\")) && da()));\n        }\n    ;\n    ;\n        ((((aa[na] && aa[na].parentNode)) && j.remove(aa[na])));\n    };\n;\n    function fa(na) {\n        if (!i.hasClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\")) {\n            i.addClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\");\n            d([\"Animation\",], function(oa) {\n                new oa(na).to(\"opacity\", 0).duration(300).ease(oa.ease.end).hide().go();\n            });\n        }\n    ;\n    ;\n    };\n;\n    function ga(na) {\n        ha(na);\n        var oa = ((ca[na] + 1));\n        ((oa && ia(ca[oa])));\n    };\n;\n    function ha(na) {\n        new h(\"/ajax/timeline/collections/tour/curation/\").setAllowCrossPageTransition(true).setData({\n            step: na\n        }).send();\n        ea(na);\n    };\n;\n    function ia(na) {\n        y = na;\n        switch (na) {\n          case \"reports\":\n            d([\"TimelineController\",], function(oa) {\n                oa.runOnceWhenSectionFullyLoaded(function() {\n                    ka(j.JSBNG__find(o(\"timeline_tab_content\"), \".-cx-PUBLIC-timelineOneColMin__rightcapsulecontainer\"), na);\n                }, \"recent\", \"0\");\n            });\n            break;\n          case \"about\":\n            v = j.scry(o(\"fbTimelineHeadline\"), \".-cx-PRIVATE-fbTimelineNavLight__item\")[1];\n            w = r(k.listen(v, \"click\", function() {\n                v = null;\n                w.remove();\n                y = \"section\";\n            }));\n            ka(v, na);\n            break;\n          case \"section\":\n            if (v) {\n                n(v.getAttribute(\"href\")).go();\n                v = null;\n                ((w && w.remove()));\n            }\n             else d([\"OnVisible\",\"TimelineMedley\",], function(oa, pa) {\n                j.appendContent(j.JSBNG__find(o(\"pagelet_timeline_main_column\"), \".-cx-PRIVATE-fbTimelineMedley__maincolumn\"), aa.section);\n                r(k.listen(aa.section, \"click\", function() {\n                    pa.scrollToSection(t, u, 1);\n                    fa(aa.section);\n                }));\n                pa.loadToSection(t, function() {\n                    ka(o(t), na);\n                    var qa = new oa(o(t), function() {\n                        fa(aa.section);\n                        qa.remove();\n                    }, false, -u);\n                });\n            });\n        ;\n        ;\n            break;\n          case \"section_privacy\":\n            d([\"TimelineAppSectionCuration\",], function(oa) {\n                oa.informState(g.showItems, t);\n                ka(j.scry(o(t), \".audienceSelector\")[0], na);\n            });\n            break;\n          case \"privacy\":\n            k.fire(x, \"click\");\n            break;\n        };\n    ;\n    };\n;\n    function ja(na, oa) {\n        if (z.add_button) {\n            var pa = j.scry(oa, \"[data-hover]\")[0];\n            ba.push({\n                button: pa,\n                listener: r(k.listen(na, \"mouseenter\", function() {\n                    x = na;\n                    ka(na, \"add_button\");\n                }))\n            });\n            ((pa && pa.removeAttribute(\"data-hover\")));\n        }\n    ;\n    ;\n    };\n;\n    function ka(na, oa) {\n        if (z[oa]) {\n            z[oa].setContext(na).setOffsetX(5).show();\n            if (((oa === \"privacy\"))) {\n                ea(\"add_button\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function la(na, oa, pa) {\n        var qa = pa.getAttribute(\"data-action\");\n        if (((((qa === \"next\")) || ((qa === \"done\"))))) {\n            ga(na);\n        }\n         else ha(na);\n    ;\n    ;\n    };\n;\n    var ma = {\n        init: function(na) {\n            var oa = na.next_step, pa = ca[oa];\n            z = na.dialogs;\n            aa = ((na.links ? na.links : []));\n            da();\n            if (((((oa === \"section\")) && ((oa !== y))))) {\n                ea(\"section\");\n                ea(\"section_privacy\");\n                pa += 2;\n                oa = ca[pa];\n            }\n        ;\n        ;\n            {\n                var fin207keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin207i = (0);\n                var qa;\n                for (; (fin207i < fin207keys.length); (fin207i++)) {\n                    ((qa) = (fin207keys[fin207i]));\n                    {\n                        r(z[qa].subscribe(\"button\", la.curry(qa)));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (z.add_button) {\n                var ra = ((na.isViewingSelf ? m : l));\n                r([ra.subscribe(\"menuOpened\", function(sa, ta) {\n                    ka.curry(j.JSBNG__find(ta.audienceSelector, \".audienceSelector\"), \"privacy\").defer(s);\n                }),ra.subscribe(\"addButton\", function(sa, ta) {\n                    ja.curry(ta.button, ta.root).defer(s);\n                }),]);\n            }\n        ;\n        ;\n            if (((na.isViewingSelf && ((pa < ca.add_button))))) {\n                ia(oa);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ma;\n});\n__d(\"TimelineStickyRightColumn\", [\"Arbiter\",\"CSS\",\"DOMQuery\",\"JSBNG__Event\",\"PhotoSnowlift\",\"Run\",\"Style\",\"TimelineContentLoader\",\"Vector\",\"UserAgent\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOMQuery\"), j = b(\"JSBNG__Event\"), k = b(\"PhotoSnowlift\"), l = b(\"Run\"), m = b(\"Style\"), n = b(\"TimelineContentLoader\"), o = b(\"Vector\"), p = b(\"UserAgent\"), q = b(\"csx\"), r = b(\"queryThenMutateDOM\"), s = 100, t = 15, u = 15, v = 71, w = false, x = null, y = null, z, aa, ba, ca, da, ea, fa, ga;\n    function ha() {\n        if (k.getInstance().isOpen) {\n            return;\n        }\n    ;\n    ;\n        z = n.getCurrentSection();\n        if (((!z || !z.rightColumnFinished))) {\n            return;\n        }\n    ;\n    ;\n        var pa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\")[0], qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        aa = ((pa ? pa.offsetHeight : 0));\n        ba = ((qa ? qa.offsetHeight : 0));\n        ca = o.getViewportDimensions().y;\n        fa = ((pa ? o.getElementPosition(pa).y : 0));\n        ga = ((JSBNG__document.body.clientWidth < JSBNG__document.body.scrollWidth));\n    };\n;\n    function ia() {\n        if (k.getInstance().isOpen) {\n            return;\n        }\n    ;\n    ;\n        if (((y && ((y !== z))))) {\n            var pa = i.scry(y.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n            if (pa) {\n                ka(pa, \"\", \"\", \"\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!qa) {\n            return;\n        }\n    ;\n    ;\n        if (ga) {\n            ka(qa, \"\", \"\", \"\");\n            return;\n        }\n    ;\n    ;\n        if (((!z || !z.rightColumnFinished))) {\n            return;\n        }\n    ;\n    ;\n        ja(z);\n        y = ((h.hasClass(qa, \"fixed_always\") ? z : null));\n    };\n;\n    function ja(pa) {\n        if (((((ba >= aa)) || ((aa <= ca))))) {\n            return;\n        }\n    ;\n    ;\n        ea = da;\n        da = o.getScrollPosition().y;\n        var qa, ra = i.scry(pa.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!ra) {\n            return;\n        }\n    ;\n    ;\n        if (((da <= ((fa - la()))))) {\n            ka(ra, \"\", \"\", \"\");\n            return;\n        }\n    ;\n    ;\n        if (((((aa + fa)) <= ((da + Math.min(((ba + la())), ((((ca - u)) - v)))))))) {\n            ka(ra, \"absolute\", \"\", ((u + \"px\")));\n            return;\n        }\n    ;\n    ;\n        if (((ba > ((((ca - u)) - la()))))) {\n            if (((da < ea))) {\n                var sa = false;\n                if (((ra.style.position === \"absolute\"))) {\n                    if (((((ra.style.JSBNG__top !== \"\")) && ((((((da + la())) - fa)) <= parseInt(ra.style.JSBNG__top, 10)))))) {\n                        sa = true;\n                    }\n                     else if (((((ra.style.bottom !== \"\")) && ((da <= ((((((fa + aa)) - la())) - ba))))))) {\n                        sa = true;\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n                if (sa) {\n                    ka(ra, \"fixed\", ((la() + \"px\")), \"\");\n                    return;\n                }\n                 else if (((((ra.style.position === \"absolute\")) && ra.style.JSBNG__top))) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if (((parseInt(ra.style.JSBNG__top, 10) >= la()))) {\n                        return;\n                    }\n                ;\n                ;\n                    qa = ((((da - fa)) - ((ba - ((ca - v))))));\n                    if (ea) {\n                        qa += ((ea - da));\n                    }\n                ;\n                ;\n                    ka(ra, \"absolute\", ((qa + \"px\")), \"\");\n                    return;\n                }\n                \n                \n            ;\n            ;\n            }\n             else {\n                var ta = false;\n                if (((((ra.style.position === \"absolute\")) || ((((ra.style.position === \"\")) && !h.hasClass(ra, \"fixed_always\")))))) {\n                    qa = ((ra.style.JSBNG__top ? parseInt(ra.style.JSBNG__top, 10) : 0));\n                    if (((((da + ca)) >= ((((((fa + qa)) + ba)) + v))))) {\n                        ta = true;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (ta) {\n                    qa = ((((((ca - ba)) - u)) - v));\n                    ka(ra, \"fixed\", ((qa + \"px\")), \"\");\n                    return;\n                }\n                 else if (((da == ea))) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if (((parseInt(ra.style.JSBNG__top, 10) >= la()))) {\n                        qa = ((((da - fa)) + la()));\n                        if (ea) {\n                            qa += ((ea - da));\n                        }\n                    ;\n                    ;\n                        ka(ra, \"absolute\", ((qa + \"px\")), \"\");\n                        return;\n                    }\n                ;\n                ;\n                }\n                 else if (((ra.style.position === \"absolute\"))) {\n                    return;\n                }\n                \n                \n                \n            ;\n            ;\n            }\n        ;\n        ;\n        }\n         else ka(ra, \"fixed\", ((la() + \"px\")), \"\");\n    ;\n    ;\n    };\n;\n    function ka(pa, qa, ra, sa) {\n        m.set(pa, \"bottom\", sa);\n        if (((qa === \"fixed\"))) {\n            h.addClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", \"\");\n        }\n         else {\n            h.removeClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", qa);\n        }\n    ;\n    ;\n        m.set(pa, \"JSBNG__top\", ra);\n        g.inform(\"reflow\");\n    };\n;\n    function la() {\n        return ((h.hasClass(JSBNG__document.documentElement, \"tinyViewport\") ? t : s));\n    };\n;\n    function ma() {\n        r(ha, ia);\n    };\n;\n    function na() {\n        w = false;\n        y = null;\n        while (x.length) {\n            x.pop().remove();\n        ;\n        };\n    ;\n        x = null;\n    };\n;\n    var oa = {\n        init: function() {\n            if (((w || ((p.ie() < 8))))) {\n                return;\n            }\n        ;\n        ;\n            w = true;\n            x = [j.listen(window, \"JSBNG__scroll\", ma),j.listen(window, \"resize\", ma),];\n            l.onLeave(na);\n        },\n        adjust: function() {\n            if (w) {\n                ha();\n                ia();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = oa;\n});");
// 12140
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o84,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/4vE3iKZfu7u.js",o93);
// undefined
o84 = null;
// undefined
o93 = null;
// 12160
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"+h1d2\",]);\n}\n;\n__d(\"ImageUtils\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = {\n        hasLoaded: function(i) {\n            if ((i.naturalWidth !== undefined)) {\n                return (i.complete && (i.width !== 0));\n            }\n             else if ((((i.height == 20) && (i.width == 20)) && i.complete)) {\n                return false;\n            }\n             else if (((i.complete === undefined) && (g.webkit() < 500))) {\n                var j = new Image();\n                j.src = i.src;\n                return j.complete;\n            }\n            \n            \n        ;\n            return i.complete;\n        }\n    };\n    e.exports = h;\n});\n__d(\"PhotoEverstoreLogger\", [\"Event\",\"AsyncRequest\",\"copyProperties\",\"ImageUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"ImageUtils\"), k = {\n        BATCH_WINDOW_MS: 500,\n        storedLog: []\n    };\n    function l() {\n    \n    };\n    i(l, {\n        _log: function(n) {\n            k.storedLog.push(n);\n            if ((k.storedLog.length == 1)) {\n                setTimeout(m, k.BATCH_WINDOW_MS, false);\n            };\n        },\n        logImmediately: function(n) {\n            l._log(n);\n        },\n        registerForLogging: function(n) {\n            if (j.hasLoaded(n)) {\n                l._log(n.src);\n            }\n             else g.listen(n, \"load\", function(event) {\n                l._log(n.src);\n            });\n        ;\n        }\n    });\n    function m() {\n        var n = k.storedLog;\n        k.storedLog = [];\n        var o = JSON.stringify(n);\n        new h().setURI(\"/ajax/photos/logging/everstore_logging.php\").setData({\n            loggedUrls: o\n        }).setMethod(\"POST\").setOption(\"suppressErrorHandlerWarning\", true).setOption(\"suppressErrorAlerts\", true).send();\n    };\n    e.exports = l;\n});\n__d(\"PhotoSessionLog\", [\"AsyncRequest\",\"Run\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Run\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k() {\n    \n    };\n    j(k, {\n        UNKNOWN: 0,\n        ESC: 1,\n        X: 2,\n        OUTSIDE: 3,\n        UNLOAD: 4,\n        NAVIGATE: 5,\n        AGGREGATE: 6,\n        LEAVE: 7,\n        PERMALINK: 0,\n        SNOWLIFT: 6,\n        AGGREGATION_COUNT: 20,\n        set: null,\n        time: null,\n        views: 0,\n        fbidList: [],\n        details: {\n        },\n        width: 0,\n        height: 0,\n        first: false,\n        last: false,\n        logIds: false,\n        version: null,\n        source: null,\n        buttonLikes: 0,\n        pagingAction: \"\",\n        faceTagImpressions: 0,\n        cycle: false,\n        endOfRelevant: false,\n        relevantCount: 0,\n        initLogging: function(l) {\n            this.set = null;\n            this.time = new Date();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fullScreenViews = {\n            };\n            this.first = true;\n            this.last = false;\n            this.logIds = false;\n            this.version = l;\n            this.buttonLikes = 0;\n            this.pagingAction = \"\";\n            this.faceTagImpressions = 0;\n            this.cycle = false;\n            this.endOfRelevant = false;\n            this.relevantCount = 0;\n            if ((l === k.SNOWLIFT)) {\n                var m = i.getViewportDimensions();\n                this.width = m.x;\n                this.height = m.y;\n            }\n        ;\n        },\n        setLogFbids: function(l) {\n            this.logIds = l;\n        },\n        setPhotoSet: function(l) {\n            this.set = l;\n        },\n        addButtonLike: function() {\n            this.buttonLikes++;\n        },\n        setPagingAction: function(l) {\n            this.pagingAction = l;\n        },\n        addFaceTagImpression: function() {\n            this.faceTagImpressions++;\n        },\n        setCycle: function(l) {\n            this.cycle = l;\n        },\n        setEndOfRelevant: function(l) {\n            this.endOfRelevant = l;\n        },\n        setRelevantCount: function(l) {\n            this.relevantCount = l;\n        },\n        setEndMetrics: function(l) {\n            this.endMetrics = l;\n        },\n        setSource: function(l) {\n            this.source = l;\n        },\n        addPhotoView: function(l, m, n) {\n            if ((this.logIds && (this.views >= this.AGGREGATION_COUNT))) {\n                this.logPhotoViews(this.AGGREGATE);\n            };\n            this.views++;\n            if (l) {\n                this.fbidList.push([l.fbid,l.owner,Date.now(),]);\n            };\n            if (m) {\n                this.hiResLoads++;\n            };\n            if (n) {\n                this.fullScreenViews[l.fbid] = true;\n            };\n        },\n        logEnterFullScreen: function(l) {\n            this.fullScreenViews[l] = true;\n        },\n        addDetailData: function(l, m) {\n            if (!this.details[l]) {\n                this.details[l] = {\n                    t: m.num_tags,\n                    l: m.has_location,\n                    c: m.has_caption,\n                    cm: m.comment_count,\n                    lk: m.like_count,\n                    w: m.width,\n                    h: m.height,\n                    ad: \"{}\",\n                    p: this.pagingAction\n                };\n            };\n        },\n        updateAdData: function(l, m) {\n            if (this.details[l]) {\n                this.details[l].ad = JSON.stringify(m);\n            };\n        },\n        logPhotoViews: function(l) {\n            if (((!this.views) || (((this.version === k.SNOWLIFT) && (l == k.LEAVE))))) {\n                return\n            };\n            if ((l != this.AGGREGATE)) {\n                this.last = true;\n            };\n            var m = {\n                set: this.set,\n                time: (new Date() - this.time),\n                fbids: (this.logIds ? this.fbidList : []),\n                details: (this.logIds ? this.details : {\n                }),\n                first: this.first,\n                last: this.last,\n                close: (l ? l : this.UNKNOWN),\n                button_likes: this.buttonLikes,\n                version: this.version,\n                face_imp: this.faceTagImpressions,\n                endmetric: this.endMetrics,\n                cycle: this.cycle,\n                end_relev: this.endOfRelevant,\n                relev_count: this.relevantCount,\n                source: this.source\n            };\n            if ((this.version === k.SNOWLIFT)) {\n                var n = i.getViewportDimensions();\n                m.width = (n.x || this.width);\n                m.height = (n.y || this.height);\n                if ((this.hiResLoads > 0)) {\n                    m.hires_loads = this.hiResLoads;\n                };\n                if (this.last) {\n                    var o = Object.keys(this.fullScreenViews).length;\n                    if ((o > 0)) {\n                        m.fullscreen = o;\n                    };\n                }\n            ;\n            }\n        ;\n            new g().setURI(\"/ajax/photos/logging/session_logging.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", ((l != k.UNLOAD))).setOption(\"suppressErrorHandlerWarning\", true).setData(m).send();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fbidList = [];\n            this.details = {\n            };\n            this.first = false;\n            this.buttonLikes = 0;\n            if (this.last) {\n                this.set = null;\n                this.logIds = false;\n                this.fullScreenViews = {\n                };\n            }\n        ;\n        }\n    });\n    h.onUnload(function() {\n        k.logPhotoViews(k.UNLOAD);\n    });\n    h.onLeave(function() {\n        k.logPhotoViews(k.LEAVE);\n    });\n    e.exports = k;\n});\n__d(\"PhotoViewerImage\", [\"PhotoEverstoreLogger\",\"URI\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"PhotoEverstoreLogger\"), h = b(\"URI\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._hiResDimensions = (l.hiResDimensions && i.deserialize(l.hiResDimensions));\n        this._normalDimensions = (l.normalDimensions && i.deserialize(l.normalDimensions));\n        this._info = l.info;\n        this._video = l.video;\n        this._shouldLog = l.everstoreLogThis;\n        this._hiResSrc = l.hiResSrc;\n        this._normalSrc = l.normalSrc;\n        this._thumbSrc = l.thumbSrc;\n        this._isInverted = false;\n        this._data = l;\n    };\n    j(k.prototype, {\n        getURIString: function() {\n            return h(this._info.permalink).getUnqualifiedURI().toString();\n        },\n        hasHiResDimensions: function() {\n            return !!this._hiResDimensions;\n        },\n        getHiResDimensions: function() {\n            return this._hiResDimensions;\n        },\n        getNormalDimensions: function() {\n            return this._normalDimensions;\n        },\n        getHiResSrc: function() {\n            return this._hiResSrc;\n        },\n        getNormalSrc: function() {\n            return this._normalSrc;\n        },\n        getThumbSrc: function() {\n            return this._thumbSrc;\n        },\n        getInfo: function() {\n            return this._info;\n        },\n        getPermalink: function() {\n            return this._info.permalink;\n        },\n        getHighestResSrc: function() {\n            return (this._hiResSrc || this._normalSrc);\n        },\n        preload: function(l) {\n            if (this.getHighestResSrc()) {\n                if ((l && !this._resource)) {\n                    this._resource = new Image();\n                    this._resource.src = this.getHighestResSrc();\n                    if (this._shouldLog) {\n                        g.logImmediately(this._resource.src);\n                    };\n                }\n                 else if ((!l && !this._small)) {\n                    this._small = new Image();\n                    this._small.src = (this._normalSrc || this._hiResSrc);\n                    if (this._shouldLog) {\n                        g.logImmediately(this._small.src);\n                    };\n                }\n                \n            \n            };\n        },\n        setDimensions: function(l, m) {\n            this.widthRatio = (l / this._hiResDimensions.x);\n            this.heightRatio = (m / this._hiResDimensions.y);\n            this._hiResDimensions = this._hiResDimensions.mul(this.widthRatio, this.heightRatio);\n            this._normalDimensions = this._normalDimensions.mul(this.widthRatio, this.heightRatio);\n        },\n        invertDimensions: function() {\n            this._hiResDimensions = new i(this._hiResDimensions.y, this._hiResDimensions.x);\n            this._normalDimensions = new i(this._normalDimensions.y, this._normalDimensions.x);\n            this._isInverted = !this._isInverted;\n        },\n        copy: function() {\n            return new k(this._data);\n        }\n    });\n    e.exports = k;\n});\n__d(\"PhotosConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        VIEWER_PERMALINK: 0,\n        VIEWER_SNOWLIFT: 6,\n        VIEWER_VAULTBOX: 8,\n        BULK_EDITOR: 3,\n        FLASH_UPLOADER: 4,\n        HTML5_UPLOADER: 10,\n        SIZE_NORMAL: \"n\",\n        PIC_NORMAL_FBX_SIZE: 180\n    };\n    e.exports = g;\n});\n__d(\"PhotosUtils\", [\"copyProperties\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Vector\");\n    function i() {\n    \n    };\n    g(i, {\n        getNearestBox: function(j, k) {\n            var l = Infinity, m = null;\n            for (var n in j) {\n                var o = j[n];\n                if (o.contains(k)) {\n                    var p = k.distanceTo(o.getCenter());\n                    if ((p < l)) {\n                        l = p;\n                        m = n;\n                    }\n                ;\n                }\n            ;\n            };\n            return m;\n        },\n        absoluteToNormalizedPosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.sub(l).mul((100 / m.x), (100 / m.y));\n            n.domain = \"pure\";\n            return n;\n        },\n        normalizedToAbsolutePosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.mul((m.x / 100), (m.y / 100)).add(l);\n            n.domain = \"document\";\n            return n;\n        },\n        isFacebox: function(j) {\n            return j.match(/^face:/);\n        }\n    });\n    e.exports = i;\n});\n__d(\"PhotoStreamCache\", [\"DOM\",\"HTML\",\"PhotosConst\",\"PhotoEverstoreLogger\",\"PhotoViewerImage\",\"Rect\",\"UIPagelet\",\"URI\",\"Vector\",\"copyProperties\",\"createArrayFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"HTML\"), i = b(\"PhotosConst\"), j = b(\"PhotoEverstoreLogger\"), k = b(\"PhotoViewerImage\"), l = b(\"Rect\"), m = b(\"UIPagelet\"), n = b(\"URI\"), o = b(\"Vector\"), p = b(\"copyProperties\"), q = b(\"createArrayFrom\"), r = b(\"ge\");\n    function s() {\n    \n    };\n    p(s, {\n        ERROR: \"error\",\n        HTML: \"html\",\n        IMAGE_DATA: \"image\",\n        EXTRA: \"extra\",\n        BUFFER_SIZE: 3,\n        INIT_BUCKET_SIZE: 4,\n        FULL_BUCKET_SIZE: 12,\n        ERROR_ID: -1,\n        INIT_PLACEHOLDER: 1\n    });\n    p(s.prototype, {\n        init: function(t, u, v) {\n            this.version = t;\n            this.pageletName = u;\n            this.pageletRootID = v;\n            this.bufferSize = s.BUFFER_SIZE;\n            this.fullBucketSize = s.FULL_BUCKET_SIZE;\n            this.initError = false;\n            this.isActive = true;\n            this.leftLock = false;\n            this.rightLock = false;\n            this.useAjaxPipe = true;\n            this.reset();\n        },\n        setUseAjaxPipe: function(t) {\n            this.useAjaxPipe = t;\n        },\n        reset: function() {\n            this.cache = {\n                image: {\n                },\n                extra: {\n                },\n                html: {\n                }\n            };\n            this.fbidList = [];\n            this.loaded = false;\n            this.allLoaded = false;\n            this.permalinkMap = {\n            };\n            this.position = 0;\n            this.totalCount = null;\n            this.firstCursor = null;\n            this.firstCursorIndex = null;\n        },\n        waitForInitData: function() {\n            this.fbidList.push(s.INIT_PLACEHOLDER);\n        },\n        destroy: function() {\n            this.reset();\n            this.isActive = false;\n        },\n        isLoaded: function() {\n            return this.loaded;\n        },\n        canPage: function() {\n            if (!this.isLoaded()) {\n                return false\n            };\n            if ((this.totalCount !== null)) {\n                return (this.totalCount > 1)\n            };\n            return (this.getLength() > 1);\n        },\n        errorInCurrent: function() {\n            if (this.initError) {\n                return true;\n            }\n             else if (!this.isLoaded()) {\n                return false\n            }\n        ;\n            return this.checkErrorAt(this.getCursor());\n        },\n        getLength: function() {\n            return this.fbidList.length;\n        },\n        getPhotoSet: function() {\n            return this.photoSetQuery.set;\n        },\n        getPhotoSetQuery: function() {\n            return this.photoSetQuery;\n        },\n        getCurrentImageData: function() {\n            return this.getImageData(this.getCursor());\n        },\n        getImageData: function(t) {\n            return this.getCacheContent(t, s.IMAGE_DATA);\n        },\n        getCurrentHtml: function() {\n            return this.getCacheContent(this.getCursor(), s.HTML);\n        },\n        getCurrentExtraData: function() {\n            return this.getCacheContent(this.getCursor(), s.EXTRA);\n        },\n        getCacheContent: function(t, u) {\n            if (((!t || (t === s.ERROR_ID)) || (t === s.INIT_PLACEHOLDER))) {\n                return null\n            };\n            return this.cache[u][t];\n        },\n        getCursorPos: function() {\n            return this.position;\n        },\n        getCursor: function() {\n            if (((this.position >= 0) && (this.position < this.getLength()))) {\n                return this.fbidList[this.position]\n            };\n            return null;\n        },\n        getCursorForURI: function(t) {\n            return this.permalinkMap[t];\n        },\n        calculatePositionForMovement: function(t) {\n            var u = (this.position + t);\n            if (this.allLoaded) {\n                var v = this.getLength();\n                u = (((v + (u % v))) % v);\n            }\n        ;\n            return u;\n        },\n        isValidMovement: function(t) {\n            if ((!this.isLoaded() || !this.canPage())) {\n                return false\n            };\n            var u = this.calculatePositionForMovement(t);\n            return ((this.getCursor() > 0) || (((u >= 0) && (u < this.getLength()))));\n        },\n        moveCursor: function(t) {\n            if (!this.isValidMovement(t)) {\n                return\n            };\n            this.position = this.calculatePositionForMovement(t);\n            if ((t !== 0)) {\n                this.loadMoreIfNeccessary((t > 0));\n            };\n        },\n        checkErrorAt: function(t) {\n            if (!this.isLoaded()) {\n                return false\n            };\n            if ((t === s.ERROR_ID)) {\n                return true\n            };\n            return false;\n        },\n        getRelativeMovement: function(t) {\n            for (var u = 0; (u < this.getLength()); u++) {\n                if ((this.fbidList[u] == t)) {\n                    return (u - this.position)\n                };\n            };\n            return null;\n        },\n        preloadImages: function(t) {\n            var u, v, w = this.getLength(), x = this.cache.image, y = s.BUFFER_SIZE;\n            if ((w > (y * 2))) {\n                u = ((((this.position + w) - (y % w))) % w);\n                v = (((this.position + y)) % w);\n            }\n             else {\n                u = 0;\n                v = (w - 1);\n            }\n        ;\n            while ((u != v)) {\n                var z = this.fbidList[u];\n                if ((this.version === i.VIEWER_VAULTBOX)) {\n                    (x[z] && x[z].preload(t));\n                }\n                 else if ((x[z] && x[z].url)) {\n                    if ((t && !x[z].resource)) {\n                        x[z].resource = new Image();\n                        x[z].resource.src = x[z].url;\n                        if ((x[z].everstoreLogThis === true)) {\n                            j.logImmediately(x[z].resource.src);\n                        };\n                    }\n                     else if ((!t && !x[z].small)) {\n                        x[z].small = new Image();\n                        x[z].small.src = (x[z].smallurl || x[z].url);\n                        if ((x[z].everstoreLogThis === true)) {\n                            j.logImmediately(x[z].small.src);\n                        };\n                    }\n                    \n                \n                }\n            ;\n                u = (((u + 1)) % w);\n            };\n        },\n        loadMoreIfNeccessary: function(t) {\n            if (((this.allLoaded || ((t && this.rightLock))) || ((!t && this.leftLock)))) {\n                return\n            };\n            var u = (t ? 1 : -1), v = (this.position + (this.bufferSize * u));\n            if (((v < 0) && !this.checkErrorAt(this.getEndCursor(false)))) {\n                this.leftLock = true;\n                this.fetch(this.fullBucketSize, false);\n            }\n             else if (((v > this.getLength()) && !this.checkErrorAt(this.getEndCursor(true)))) {\n                this.rightLock = true;\n                this.fetch(this.fullBucketSize, true);\n            }\n            \n        ;\n        },\n        getEndCursor: function(t) {\n            return (t ? this.fbidList[(this.getLength() - 1)] : this.fbidList[0]);\n        },\n        calculateRelativeIndex: function(t, u, v) {\n            if (!this.totalCount) {\n                return null\n            };\n            var w = this.fbidList.indexOf(u), x = this.fbidList.indexOf(v);\n            if (((w === -1) || (x === -1))) {\n                return null\n            };\n            var y = (x - w);\n            return ((((t + y) + this.totalCount)) % this.totalCount);\n        },\n        calculateDistance: function(t, u) {\n            var v = this.fbidList.indexOf(t), w = this.fbidList.indexOf(u);\n            if (((v === -1) || (w === -1))) {\n                return null\n            };\n            return ((((w - v) + this.getLength())) % this.getLength());\n        },\n        fetch: function(t, u) {\n            var v = this.getEndCursor(u), w = p({\n                cursor: v,\n                version: this.version,\n                end: this.getEndCursor(!u),\n                fetchSize: (u ? t : (-1 * t)),\n                relevant_count: this.relevantCount\n            }, this.photoSetQuery);\n            if ((this.totalCount && (this.firstCursorIndex !== null))) {\n                w.total = this.totalCount;\n                w.cursorIndex = this.calculateRelativeIndex(this.firstCursorIndex, this.firstCursor, v);\n            }\n        ;\n            var x = r(this.pageletRootID);\n            if (!x) {\n                x = g.create(\"div\", {\n                    id: this.pageletRootID\n                });\n                g.appendContent(document.body, x);\n            }\n        ;\n            m.loadFromEndpoint(this.pageletName, x, w, {\n                usePipe: this.useAjaxPipe,\n                automatic: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n            if (!this.useAjaxPipe) {\n                this.setUseAjaxPipe(true);\n            };\n        },\n        storeToCache: function(t) {\n            var u = {\n            };\n            if (!this.isActive) {\n                return u\n            };\n            if ((\"error\" in t)) {\n                this.processErrorResult(t.error);\n                u.error = true;\n                return u;\n            }\n        ;\n            if ((\"init\" in t)) {\n                this.processInitResult(t.init);\n                u.init = {\n                    logids: t.init.logids,\n                    fbid: t.init.fbid,\n                    loggedin: t.init.loggedin,\n                    fromad: t.init.fromad,\n                    disablesessionads: t.init.disablesessionads,\n                    flashtags: t.init.flashtags\n                };\n            }\n        ;\n            if ((\"image\" in t)) {\n                this.processImageResult(t.image);\n                u.image = true;\n            }\n        ;\n            if ((\"data\" in t)) {\n                this.processDataResult(t.data);\n                u.data = true;\n            }\n        ;\n            return u;\n        },\n        processInitResult: function(t) {\n            if (this.loaded) {\n                return\n            };\n            this.loaded = true;\n            this.photoSetQuery = t.query;\n            if (t.bufferSize) {\n                this.bufferSize = t.bufferSize;\n            };\n            if (t.fullBucketSize) {\n                this.fullBucketSize = t.fullBucketSize;\n            };\n            if ((this.fbidList.length === 0)) {\n                this.fbidList.push(t.fbid);\n                this.rightLock = true;\n            }\n             else {\n                var u = this.fbidList.indexOf(s.INIT_PLACEHOLDER);\n                if ((u != -1)) {\n                    this.fbidList[u] = t.fbid;\n                };\n            }\n        ;\n            this.firstCursor = t.fbid;\n            if (((\"initIndex\" in t) && (\"totalCount\" in t))) {\n                this.firstCursorIndex = t.initIndex;\n                this.totalCount = t.totalCount;\n            }\n        ;\n            if ((this.version == i.VIEWER_PERMALINK)) {\n                this.fetch(s.INIT_BUCKET_SIZE, true);\n            };\n        },\n        processImageResult: function(t) {\n            for (var u in t) {\n                if (((u === this.firstCursor) && t[u].everstoreLogThis)) {\n                    j.logImmediately(t[u].url);\n                };\n                if ((this.version === i.VIEWER_VAULTBOX)) {\n                    var v = t[u];\n                    this.cache.image[u] = new k(v);\n                    this.permalinkMap[this.cache.image[u].getURIString()] = u;\n                }\n                 else {\n                    this.cache.image[u] = t[u];\n                    if (t[u].dimensions) {\n                        this.cache.image[u].dimensions = o.deserialize(t[u].dimensions);\n                    };\n                    if (t[u].smalldims) {\n                        this.cache.image[u].smalldims = o.deserialize(t[u].smalldims);\n                    };\n                    this.permalinkMap[n(t[u].info.permalink).getUnqualifiedURI().toString()] = u;\n                }\n            ;\n            };\n        },\n        attachToFbidsList: function(t, u, v) {\n            if (this.allLoaded) {\n                return\n            };\n            if ((u === -1)) {\n                for (var w = (t.length - 1); (w >= 0); w--) {\n                    this.fbidList.unshift(t[w]);\n                    this.position++;\n                };\n                this.leftLock = false;\n            }\n             else {\n                for (var x = 0; (x < t.length); x++) {\n                    this.fbidList.push(t[x]);;\n                };\n                this.rightLock = false;\n            }\n        ;\n            if (v) {\n                this.setAllLoaded();\n            };\n        },\n        setAllLoaded: function() {\n            this.allLoaded = true;\n            if ((this.getCursor() === null)) {\n                this.position = this.calculatePositionForMovement(0);\n            };\n        },\n        processDataResult: function(t) {\n            for (var u in t) {\n                if (!this.cache.html[u]) {\n                    this.cache.html[u] = {\n                    };\n                };\n                for (var v in t[u].html) {\n                    var w = t[u].html[v];\n                    if ((typeof w === \"string\")) {\n                        w = h(w).getRootNode();\n                    };\n                    this.cache.html[u][v] = q(w.childNodes);\n                };\n                if (!((\"extra\" in t[u]))) {\n                    this.cache.extra[u] = null;\n                    continue;\n                }\n            ;\n                this.cache.extra[u] = {\n                    tagRects: {\n                    }\n                };\n                if (!Array.isArray(t[u].extra.tagRects)) {\n                    for (var x in t[u].extra.tagRects) {\n                        if (t[u].extra.tagRects[x]) {\n                            this.cache.extra[u].tagRects[x] = l.deserialize(t[u].extra.tagRects[x]);\n                        };\n                    }\n                };\n                Object.keys(t[u].extra).forEach(function(y) {\n                    if ((y == \"tagRects\")) {\n                        return\n                    };\n                    this.cache.extra[u][y] = t[u].extra[y];\n                }.bind(this));\n            };\n        },\n        processErrorResult: function(t) {\n            if (!this.isLoaded()) {\n                this.initError = true;\n                return;\n            }\n        ;\n            var u = t.side, v = [s.ERROR_ID,];\n            this.attachToFbidsList(v, u);\n        },\n        setTotalCount: function(t) {\n            this.totalCount = t;\n        },\n        setFirstCursorIndex: function(t) {\n            this.firstCursorIndex = t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotoSnowliftAds\", [\"Event\",\"copyProperties\",\"CSS\",\"csx\",\"DataStore\",\"DOM\",\"PhotoSessionLog\",\"UIPagelet\",\"URI\",\"Vector\",\"extendArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"csx\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"PhotoSessionLog\"), n = b(\"UIPagelet\"), o = b(\"URI\"), p = b(\"Vector\"), q = b(\"extendArray\"), r = {\n        DEFAULT_UNITS_REFRESH_RATE: 30000,\n        UNITS_REGISTER_DELAY: 1000,\n        root: null,\n        availableDimensions: null,\n        loadQuery: null,\n        lastLoadTime: 0,\n        minAds: 100,\n        units: null,\n        isLogAdData: null,\n        displayedCallback: null,\n        refreshUnitsRate: null,\n        position: null,\n        adsStatus: \"null\",\n        adsEvents: {\n        },\n        snowliftRedesign: false,\n        resetEvents: function() {\n            this.adsStatus = \"reset\";\n            this.adsEvents = {\n            };\n        },\n        addEvent: function(s, t) {\n            if (t) {\n                this.adsStatus = s;\n            };\n            var u = Date.now();\n            this.adsEvents[((s + \"_\") + u)] = u;\n        },\n        init: function(s, t, u, v) {\n            this.reset();\n            this.root = s;\n            this.snowlift = t;\n            this.minAds = u.min_ads;\n            this.displayedCallback = v;\n            this.addEvent(\"init\", true);\n            this.snowliftRedesign = u.snowlift_redesign;\n            this.refreshUnitsRate = r.DEFAULT_UNITS_REFRESH_RATE;\n            if (u.refresh_fast) {\n                this.refreshUnitsRate = u.refresh_rate;\n            };\n        },\n        reset: function() {\n            this.lastLoadTime = 0;\n            this.position = 0;\n            this.units = [];\n            this.resetEvents();\n            this.addEvent(\"reset\", true);\n        },\n        resize: function(s) {\n            this.availableDimensions = s;\n            this.loadQuery = this.snowlift.getLoadQuery();\n            this.processResize();\n        },\n        calculateUnitSizes: function(s, t, u) {\n            var v = {\n            };\n            s.forEach(function(w) {\n                var x = w.root.firstChild.offsetHeight;\n                w.units.forEach(function(z) {\n                    if ((!i.hasClass(z, \"hidden\") && !((this.getIsAds(z) && this.getIsHoldout(z))))) {\n                        var aa = this.getHeight(z.firstChild, t);\n                        x -= aa;\n                    }\n                ;\n                }.bind(this));\n                var y = {\n                    height: x,\n                    visible: false\n                };\n                w.units.forEach(function(z) {\n                    var aa = this.getIsAds(z), ba = this.getHeight(z.firstChild, t), ca = this.getUnitId(z), da = (aa && this.getIsHoldout(z));\n                    if ((da && u)) {\n                        return\n                    };\n                    v[ca] = {\n                        height: ba,\n                        visible: false,\n                        priority: 0,\n                        is_ads: aa,\n                        is_holdout: da,\n                        section_ref: y\n                    };\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        calculateVisibleUnits: function(s, t, u) {\n            var v = 0, w = this.getUnitPriority(t);\n            w.forEach(function(x) {\n                if (t.hasOwnProperty(x)) {\n                    var y = t[x], z = y.height;\n                    if (!y.section_ref.visible) {\n                        z += y.section_ref.height;\n                    };\n                    y.height_below = (u - z);\n                    y.visible = ((y.height_below >= 0) && (z > 0));\n                    if (y.visible) {\n                        y.section_ref.visible = true;\n                        u -= z;\n                        v++;\n                    }\n                ;\n                }\n            ;\n            }.bind(this));\n            return t;\n        },\n        displayUnits: function(s, t) {\n            s.forEach(function(u) {\n                var v = false, w = true;\n                u.units.forEach(function(x) {\n                    var y = this.getUnitId(x), z = t[y];\n                    if (!z) {\n                        return\n                    };\n                    var aa = z.visible, ba = z.height_below, ca = z.is_ads;\n                    i.conditionClass(x, \"hidden\", !aa);\n                    if (((ca && aa) && w)) {\n                        var da = l.find(x, \"div.ego_unit\");\n                        i.addClass(da, \"ego_unit_no_top_border\");\n                        w = false;\n                    }\n                ;\n                    v = (v || aa);\n                    this.calcUnitStats(this.units[ca][y], aa, ba);\n                }.bind(this));\n                i.conditionClass(u.root, \"hidden\", !v);\n            }.bind(this));\n        },\n        getUnitsDisplayed: function(s, t) {\n            var u = 0;\n            s.forEach(function(v) {\n                v.units.forEach(function(w) {\n                    var x = this.getUnitId(w), y = t[x];\n                    if ((!y || !y.visible)) {\n                        return\n                    };\n                    u++;\n                }.bind(this));\n            }.bind(this));\n            return u;\n        },\n        getHeightsRequired: function(s, t) {\n            var u = 0, v = [];\n            s.forEach(function(w) {\n                var x = false;\n                w.units.forEach(function(y) {\n                    var z = this.getUnitId(y), aa = t[z];\n                    if (!aa) {\n                        return\n                    };\n                    u += aa.height;\n                    if (!x) {\n                        u += aa.section_ref.height;\n                        x = true;\n                    }\n                ;\n                    v.push(u);\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        getUnitPriority: function(s) {\n            var t = [], u = 0, v = 0;\n            for (var w in s) {\n                var x = s[w];\n                t.push(w);\n                var y = ((this.minAds + u) + v);\n                if (x.is_ads) {\n                    if ((v < this.minAds)) {\n                        y = v;\n                    };\n                    v++;\n                }\n                 else u++;\n            ;\n                x.priority = y;\n            };\n            t = t.sort(function(z, aa) {\n                var ba = s[z], ca = s[aa];\n                return (ba.priority - ca.priority);\n            }.bind(this));\n            return t;\n        },\n        updateUnitsStatus: function() {\n            var s = this.availableDimensions.x, t = this.availableDimensions.y, u = this.calculateUnitSizes(this.sections, s);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            for (var v in u) {\n                if (!u.hasOwnProperty(v)) {\n                    continue;\n                };\n                var w = u[v];\n                if ((!w.is_holdout || !w.visible)) {\n                    continue;\n                };\n                var x = this.units[1][v];\n                this.calcUnitStats(x, w.visible, w.height_below);\n            };\n            u = this.calculateUnitSizes(this.sections, s, true);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            this.displayUnits(this.sections, u);\n            if (this.displayedCallback) {\n                var y = this.getUnitsDisplayed(this.sections, u), z = this.getHeightsRequired(this.sections, u);\n                this.displayedCallback(y, z);\n            }\n        ;\n        },\n        calcUnitStats: function(s, t, u) {\n            var v = Date.now();\n            if (s.visible) {\n                s.totalTime += (v - s.lastShowTime);\n            };\n            if (((s.trackingCode !== null) && (s.totalTime >= this.UNITS_REGISTER_DELAY))) {\n                var w = s.trackingCode;\n                s.trackingCode = null;\n                this.registerImpression(w, s.registerUrl);\n            }\n        ;\n            s.visible = t;\n            s.heightBelow = u;\n            s.lastShowTime = v;\n        },\n        prepareResize: function() {\n            var s = function(t) {\n                var u = l.create(\"div\", {\n                    className: \"inner\"\n                }), v = l.create(\"div\", {\n                    className: \"wrapper\"\n                }, u);\n                l.replace(t, v);\n                l.setContent(u, t);\n                return v;\n            };\n            this.sections = l.scry(this.root, \"div.ego_section\").map(function(t) {\n                return {\n                    root: s(t),\n                    units: l.scry(t, \"div.ego_unit\").map(s)\n                };\n            });\n        },\n        processResize: function() {\n            if (((this.isLoading || (this.lastLoadTime === 0)) || (this.availableDimensions === null))) {\n                this.setLogData();\n                return;\n            }\n        ;\n            this.updateUnitsStatus();\n            this.setLogData();\n            var s = this.nextRegisterTime();\n            if ((s !== Infinity)) {\n                this.processResize.bind(this).defer(s, true);\n            };\n        },\n        setIsLogAdData: function(s) {\n            this.isLogAdData = s;\n            this.addEvent(\"setIsLogAdData\", false);\n            this.setLogData();\n        },\n        setLogData: function() {\n            var s = this.snowlift.getImageId();\n            if ((this.isLogAdData && s)) {\n                var t = p.getElementDimensions(this.snowlift.getImage()), u = p.getElementDimensions(this.snowlift.getRHCHeader()), v = p.getElementDimensions(this.snowlift.getRHCBody()), w = p.getElementDimensions(this.snowlift.getRHCFooter()), x = {\n                    query_set: this.snowlift.getLoadQuery().set,\n                    window_x: window.innerWidth,\n                    window_y: window.innerHeight,\n                    image_x: t.x,\n                    image_y: t.y,\n                    header_x: u.x,\n                    header_y: u.y,\n                    body_x: v.x,\n                    body_y: v.y,\n                    footer_x: w.x,\n                    footer_y: w.y,\n                    ads_below_space: this.getAdsBelowSpace(),\n                    time: Date.now(),\n                    adsStatus: this.adsStatus,\n                    adsEvents: this.adsEvents,\n                    refreshRate: this.refreshUnitsRate,\n                    position: this.position\n                };\n                m.updateAdData(s, x);\n            }\n        ;\n        },\n        getAdsBelowSpace: function() {\n            var s = [], t = this.units[1];\n            for (var u in t) {\n                if ((t.hasOwnProperty(u) && !this.getIsHoldout(this.getAdUnit(u)))) {\n                    s.push(t[u].heightBelow);\n                };\n            };\n            return s;\n        },\n        getIsAds: function(s) {\n            var t = l.scry(s, \"div.-cx-PUBLIC-fbAdUnit__root\");\n            return t.length;\n        },\n        getUnitId: function(s) {\n            if (this.getIsAds(s)) {\n                return this.getAdId(s);\n            }\n             else return this.getEgoId(s)\n        ;\n        },\n        getEgoId: function(s) {\n            var t = l.find(s, \"div.ego_unit\");\n            return t.getAttribute(\"data-ego-fbid\");\n        },\n        getAdData: function(s) {\n            var t = l.find(s, \"div.-cx-PUBLIC-fbAdUnit__root\"), u = t.getAttribute(\"data-ad\");\n            return ((u && JSON.parse(u)) || {\n            });\n        },\n        getAdId: function(s) {\n            return this.getAdData(s).adid;\n        },\n        getIsHoldout: function(s) {\n            return (s && this.getAdData(s).holdout);\n        },\n        getAdUnit: function(s) {\n            if (!this.sections) {\n                return null\n            };\n            var t = [];\n            this.sections.forEach(function(v) {\n                q(t, v.units);\n            });\n            for (var u = 0; (u < t.length); u++) {\n                if ((this.getIsAds(t[u]) && (this.getAdId(t[u]) == s))) {\n                    return t[u]\n                };\n            };\n            return null;\n        },\n        nextRegisterTime: function() {\n            var s = Infinity, t = h(h({\n            }, this.units[0]), this.units[1]);\n            for (var u in t) {\n                if (t.hasOwnProperty(u)) {\n                    var v = t[u];\n                    if (((v.trackingCode !== null) && v.visible)) {\n                        s = Math.min(s, (this.UNITS_REGISTER_DELAY - v.totalTime));\n                    };\n                }\n            ;\n            };\n            return s;\n        },\n        getHeight: function(s, t) {\n            var u = k.get(s, \"height\");\n            if ((u && (u.x === t))) {\n                return u.y\n            };\n            return this.cacheHeight(s, t);\n        },\n        cacheHeight: function(s, t) {\n            var u = {\n                x: t,\n                y: s.offsetHeight\n            };\n            k.set(s, \"height\", u);\n            return u.y;\n        },\n        loadAdsAndEgo: function() {\n            this.resetEvents();\n            this.addEvent(\"adsRequested\", true);\n            this.position++;\n            n.loadFromEndpoint(\"WebEgoPane\", this.root, {\n                pid: 34,\n                data: [this.loadQuery.set,this.getCursorFBID(this.loadQuery),this.snowliftRedesign,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        getCursorFBID: function(s) {\n            if ((s.v !== undefined)) {\n                return s.v\n            };\n            if ((s.fbid !== undefined)) {\n                return s.fbid\n            };\n            return \"0\";\n        },\n        unitsLoaded: function(s, t) {\n            var u;\n            if (t) {\n                u = \"/ai.php\";\n                this.addEvent(\"adsLoaded\", true);\n            }\n             else {\n                u = \"/ajax/ei.php\";\n                this.addEvent(\"egoLoaded\", true);\n            }\n        ;\n            var v = {\n            };\n            for (var w in s) {\n                if (s.hasOwnProperty(w)) {\n                    v[w] = {\n                        trackingCode: s[w],\n                        totalTime: 0,\n                        lastShowTime: 0,\n                        heightBelow: -10000,\n                        visible: false,\n                        registerUrl: u\n                    };\n                };\n            };\n            this.units[t] = v;\n            if (t) {\n                this.waitForImages(this.imagesLoaded.bind(this));\n            };\n        },\n        imagesLoaded: function() {\n            this.prepareResize();\n            this.addEvent(\"imagesLoaded\", true);\n            this.lastLoadTime = Date.now();\n            this.isLoading = false;\n            this.processResize();\n            i.removeClass(this.root, \"loading\");\n        },\n        loadAdsFromUserActivity: function() {\n            var s = Date.now(), t = this.refreshUnitsRate;\n            if ((!this.isLoading && ((s - this.lastLoadTime) > t))) {\n                i.addClass(this.root, \"loading\");\n                this.isLoading = true;\n                this.loadAdsAndEgo();\n            }\n        ;\n        },\n        registerImpression: function(s, t) {\n            var u = l.create(\"iframe\", {\n                src: o(t).addQueryData({\n                    aed: s\n                }),\n                width: 0,\n                height: 0,\n                frameborder: 0,\n                scrolling: \"no\",\n                className: \"fbEmuTracking\"\n            });\n            u.setAttribute(\"aria-hidden\", \"true\");\n            l.appendContent(this.root, u);\n        },\n        waitForImages: function(s) {\n            var t = l.scry(this.root, \"img.img\"), u = t.length, v = u;\n            if ((v === 0)) {\n                s();\n            };\n            var w = function() {\n                v--;\n                if ((v === 0)) {\n                    s.defer();\n                };\n            };\n            for (var x = 0; (x < u); x++) {\n                var y = t[x];\n                if (y.complete) {\n                    w();\n                }\n                 else g.listen(y, {\n                    load: w,\n                    error: w,\n                    abort: w\n                });\n            ;\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"PhotoViewer\", [\"Bootloader\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n        this.image = null;\n        this.root = null;\n        this.stream = null;\n    };\n    h(j, {\n        bootstrap: function(k, l) {\n            g.loadModules([\"PhotoSnowlift\",], function(m) {\n                m.bootstrap(k, l);\n            });\n        }\n    });\n    h(j.prototype, {\n        getEventPrefix: i.thatReturnsNull,\n        getEventString: function(k) {\n            var l = this.getEventPrefix();\n            if (l) {\n                return ((l + \".\") + k)\n            };\n            return null;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getPosition: function() {\n            return (this.stream ? this.stream.getCursor() : null);\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: i.thatReturnsNull,\n        getVersionConst: i.thatReturnsNull,\n        getViewerSource: i.thatReturnsNull,\n        getViewerSet: i.thatReturnsNull\n    });\n    e.exports = j;\n});\n__d(\"PhotoSnowlift\", [\"function-extensions\",\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"collectDataAttributes\",\"CSS\",\"Dialog\",\"DOM\",\"DOMControl\",\"Event\",\"FullScreen\",\"Input\",\"ImageUtils\",\"Keys\",\"Layer\",\"LinkController\",\"Locale\",\"PageTransitions\",\"Parent\",\"PhotosConst\",\"PhotoSessionLog\",\"PhotoSnowliftAds\",\"PhotoStreamCache\",\"PhotosUtils\",\"PhotoViewer\",\"Rect\",\"ScrollableArea\",\"Style\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserAgent\",\"Vector\",\"$\",\"asyncCallback\",\"computeRelativeURI\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"emptyFunction\",\"ge\",\"goURI\",\"shield\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMControl\"), q = b(\"Event\"), r = b(\"FullScreen\"), s = b(\"Input\"), t = b(\"ImageUtils\"), u = b(\"Keys\"), v = b(\"Layer\"), w = b(\"LinkController\"), x = b(\"Locale\"), y = b(\"PageTransitions\"), z = b(\"Parent\"), aa = b(\"PhotosConst\"), ba = b(\"PhotoSessionLog\"), ca = b(\"PhotoSnowliftAds\"), da = b(\"PhotoStreamCache\"), ea = b(\"PhotosUtils\"), fa = b(\"PhotoViewer\"), ga = b(\"Rect\"), ha = b(\"ScrollableArea\"), ia = b(\"Style\"), ja = b(\"Toggler\"), ka = b(\"UIPagelet\"), la = b(\"URI\"), ma = b(\"UserAgent\"), na = b(\"Vector\"), oa = b(\"$\"), pa = b(\"asyncCallback\"), qa = b(\"computeRelativeURI\"), ra = b(\"copyProperties\"), sa = b(\"createArrayFrom\"), ta = b(\"csx\"), ua = b(\"emptyFunction\"), va = b(\"ge\"), wa = b(\"goURI\"), xa = b(\"shield\"), ya = b(\"startsWith\"), za = b(\"tx\"), ab = b(\"userAction\");\n    function bb() {\n        this.parent.construct(this);\n    };\n    ra(bb, {\n        STATE_ERROR: \"error\",\n        STATE_HTML: \"html\",\n        STATE_IMAGE_PIXELS: \"image_pixels\",\n        STATE_IMAGE_DATA: \"image\",\n        LOADING_TIMEOUT: 2000,\n        PAGER_FADE: 3000,\n        FULL_SCREEN_PADDING: 10,\n        STAGE_HIRES_MAX: {\n            x: 2048,\n            y: 2048\n        },\n        STAGE_NORMAL_MAX: {\n            x: 960,\n            y: 960\n        },\n        STAGE_MIN: {\n            x: 520,\n            y: 520\n        },\n        SIDEBAR_SIZE_MAX: 360,\n        STAGE_CHROME: {\n            x: 82,\n            y: 42\n        },\n        VIDEO_BOTTOM_BAR_SPACE: 40,\n        GOPREV_AREA: 120,\n        TIMELINE_STRETCH_WIDTH: 843,\n        TIMELINE_STRETCH_MIN: 480,\n        MIN_TAG_DISTANCE: 83,\n        PADDING_MIN: 40,\n        MIN_UFI_HEIGHT: 250,\n        COLLECTIONS_UNTAGGED_PHOTOS: 3,\n        PHOTOS_OF_YOU_SUGGESTIONS: 28,\n        MIN_ADS_VISIBLE: 1,\n        _instance: null,\n        getInstance: function() {\n            if (!bb._instance) {\n                bb._instance = new bb();\n            };\n            return bb._instance;\n        },\n        initWithSpotlight: function(cb, db) {\n            bb.getInstance().init(cb, db);\n        },\n        touch: ua,\n        addPhotoFbids: function(cb, db, eb, fb) {\n            bb.getInstance().addPhotoFbids(cb, db, eb, fb);\n        },\n        attachFollowFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachSubscribeFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachTagger: function(cb) {\n            bb.getInstance().attachTagger(cb);\n        },\n        preload: function(cb, db) {\n            bb.getInstance().preload(cb, db);\n        },\n        bootstrap: function(cb, db) {\n            if ((cb && la(cb).getQueryData().hasOwnProperty(\"share_id\"))) {\n                j.loadModules([\"SpotlightShareViewer\",], function(eb) {\n                    eb.bootstrap(cb, db);\n                });\n                return;\n            }\n        ;\n            bb.getInstance().bootstrap(cb, db);\n        },\n        closeRefresh: function() {\n            bb.getInstance().closeRefresh();\n        },\n        deletePhoto: function(cb) {\n            bb.getInstance().deletePhoto(cb);\n        },\n        getImage: function() {\n            return bb.getInstance().getImage();\n        },\n        getImageId: function() {\n            return bb.getInstance().getImageId();\n        },\n        getLoadQuery: function() {\n            return bb.getInstance().getLoadQuery();\n        },\n        getRHCBody: function() {\n            return bb.getInstance().getRHCBody();\n        },\n        getRHCFooter: function() {\n            return bb.getInstance().getRHCFooter();\n        },\n        getRHCHeader: function() {\n            return bb.getInstance().getRHCHeader();\n        },\n        getRoot: function() {\n            return bb.getInstance().getRoot();\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            bb.getInstance().likePhotoSkipConfirmation(cb);\n        },\n        saveTagsFromPayload: function(cb) {\n            bb.getInstance().saveTagsFromPayload(cb);\n        },\n        saveTagsFromPayloadDelayed: function(cb) {\n            bb.saveTagsFromPayload.curry(cb).defer(2000);\n        },\n        handleServerError: function(cb, db) {\n            bb.getInstance().handleServerError(cb, db);\n        },\n        setVideoWarning: function(cb, db) {\n            var eb = bb.getInstance(), fb = (\"video_warning_\" + cb);\n            if (!eb.videoWarnings) {\n                eb.videoWarnings = [];\n            };\n            eb.videoWarnings[fb] = db;\n        },\n        storeFromData: function(cb) {\n            bb.getInstance().storeFromData(cb);\n        },\n        swapData: function() {\n            bb.getInstance().swapData();\n        },\n        touchMarkup: ua,\n        updateTotalCount: function(cb, db, eb) {\n            bb.getInstance().updateTotalCount(cb, db, eb);\n        }\n    });\n    k.extend(bb, fa);\n    ra(bb.prototype, {\n        switchTimer: null,\n        imageRefreshTimer: null,\n        imageLoadingTimer: null,\n        lastPage: 0,\n        currentMinSize: null,\n        currentImageSize: null,\n        resetUriStack: true,\n        thumbSrc: null,\n        shouldStretch: false,\n        stageMax: bb.STAGE_NORMAL_MAX,\n        stageChrome: bb.STAGE_CHROME,\n        stagePagerPrev: null,\n        ua: null,\n        PhotoTagger: null,\n        showHover: false,\n        skipLikePhotoConfirmation: false,\n        isShowingLikePhotoConfirmation: false,\n        preload: function(cb, db) {\n            j.loadModules([\"PhotoTagger\",\"Live\",\"PhotoTagApproval\",\"PhotoTags\",\"TagTokenizer\",\"fb-photos-snowlift-fullscreen-css\",], function(fb) {\n                this.PhotoTagger = fb;\n            }.bind(this));\n            var eb = this.getImageSrc(la(cb).getQueryData());\n            if (eb) {\n                (new Image()).src = eb;\n            };\n        },\n        bootstrap: function(cb, db) {\n            if ((cb && la(cb).getQueryData().makeprofile)) {\n                this.enableCropperOnInit = true;\n                this.isUserProfilePic = la(cb).getQueryData().makeuserprofile;\n                this.isInProfilePicAlbum = la(cb).getQueryData().inprofilepicalbum;\n            }\n        ;\n            this.preload(cb, db);\n            if (this.closeDirty) {\n                this.bootstrap.bind(this, cb, db).defer();\n                return;\n            }\n        ;\n            ca.reset();\n            this.resetUriStack = true;\n            if (this.isOpen) {\n                if (this.openExplicitly) {\n                    this.closeCleanup();\n                    this.resetUriStack = false;\n                }\n                 else return\n            \n            };\n            this.ua = ab(\"snowlift\", db).uai(\"open\");\n            this.returningToStart = false;\n            (this.loading && m.removeClass(this.loading, \"loading\"));\n            if (db) {\n                m.addClass((this.loading = db), \"loading\");\n                if (this.container) {\n                    var eb = z.byClass(db, \"uiStreamStory\");\n                    if (eb) {\n                        this.container.setAttribute(\"data-ownerid\", eb.id);\n                    }\n                     else this.container.removeAttribute(\"data-ownerid\");\n                ;\n                }\n            ;\n                this.getThumbAndSize(db);\n            }\n             else this.loading = null;\n        ;\n            g.inform(\"PhotoSnowlift.GO\", cb, g.BEHAVIOR_STATE);\n            this.loadFrameIfUninitialized();\n        },\n        getCurrentImageServerSizeDimensions: function() {\n            return this.stream.getCurrentImageData().dimensions;\n        },\n        getEventPrefix: function() {\n            return \"PhotoSnowlift\";\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: function() {\n            return \"snowlift\";\n        },\n        getViewerSource: function() {\n            return this.source;\n        },\n        getViewerSet: function() {\n            return this.stream.getPhotoSet();\n        },\n        getVersionConst: function() {\n            return aa.VIEWER_SNOWLIFT;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getImageId: function() {\n            return this.stream.getCursor();\n        },\n        getRHCHeader: function() {\n            return this.rhcHeader;\n        },\n        getRHCBody: function() {\n            return this.ufiForm;\n        },\n        getRHCFooter: function() {\n            return this.rhcFooter;\n        },\n        getLoadQuery: function() {\n            return this.loadQuery;\n        },\n        getCurrentPhotoInfo: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info\n            };\n            return null;\n        },\n        getOwnerId: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info.owner\n            };\n            return null;\n        },\n        getThumbAndSize: function(cb) {\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            var db = la(cb.getAttribute(\"ajaxify\")).getQueryData();\n            if (!db.size) {\n                return\n            };\n            var eb = na.deserialize(db.size);\n            if ((!eb.x || !eb.y)) {\n                return\n            };\n            this.currentImageSize = eb;\n            if (((!m.hasClass(cb, \"uiMediaThumb\") && !m.hasClass(cb, \"uiPhotoThumb\")) && !m.hasClass(cb, \"uiScaledThumb\"))) {\n                return\n            };\n            if (cb.getAttribute(\"data-cropped\")) {\n                return\n            };\n            var fb = o.scry(cb, \"img\")[0], gb = o.scry(cb, \"i\")[0], hb = z.byAttribute(cb, \"data-size\");\n            this.shouldStretch = ((((((hb && this.currentImageSize) && fb) && (hb.getAttribute(\"data-size\") === \"2\")) && (this.currentImageSize.x > this.currentImageSize.y)) && (this.currentImageSize.x <= bb.TIMELINE_STRETCH_WIDTH)) && (fb.offsetWidth === bb.TIMELINE_STRETCH_WIDTH));\n            var ib;\n            if (fb) {\n                ib = fb.src;\n            }\n             else if (gb) {\n                ib = ia.get(gb, \"backgroundImage\").replace(/.*url\\(\"?([^\"]*)\"?\\).*/, \"$1\");\n            }\n             else return\n            \n        ;\n            this.thumbSrc = ib;\n        },\n        loadFrameIfUninitialized: function() {\n            if (this.root) {\n                return\n            };\n            new i(\"/ajax/photos/snowlift/init.php\").setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n        },\n        init: function(cb, db) {\n            this.init = ua;\n            this.showHover = db.pivot_hover;\n            ba.setEndMetrics(db.pivot_end_metric);\n            this.enableSnowliftProfilePicCropper = db.snowlift_profile_pic_cropper;\n            this.pagersOnKeyboardNav = db.pagers_on_keyboard_nav;\n            this.hilitAllTagsAndBoxesOnHover = db.snowlift_hover_shows_all_tags_and_faces;\n            this.fullscreen = r.isSupported();\n            this.showOGVideos = db.og_videos;\n            this.resizeCommentsForAds = db.resize_comments_for_ads;\n            this.stageMax = bb.STAGE_HIRES_MAX;\n            this.spotlight = cb;\n            this.spotlight.subscribe(\"blur\", function() {\n                this.closingAction = ba.OUTSIDE;\n            }.bind(this));\n            this.spotlight.subscribe(\"hide\", xa(this.closeHandler, this));\n            this.spotlight.subscribe(\"key\", this.keyHandler.bind(this));\n            this.initializeNodes(this.spotlight.getRoot());\n            ca.init(this.sideAdUnit, this, db, this.adsDisplayedCallback.bind(this));\n            this.inAdsDisplayedCallback = false;\n            if (!this.subscription) {\n                w.registerHandler(this.handleNavigateAway.bind(this));\n                this.subscription = g.subscribe(\"PhotoSnowlift.GO\", function(eb, fb) {\n                    this.openExplicitly = true;\n                    (this.loading && m.removeClass(this.loading, \"loading\"));\n                    this.open(fb);\n                }.bind(this));\n            }\n        ;\n            this.transitionHandlerRegistered = false;\n            this.returningToStart = false;\n            y.registerHandler(this.openHandler.bind(this));\n            this.openHandlerRegistered = true;\n            g.subscribe(\"PhotoTagApproval.HILITE_TAG\", this.onHiliteTag.bind(this));\n            g.subscribe(\"PhotoTagApproval.UPDATE_TAG_BOX\", this.onUpdateTagBox.bind(this));\n            if (this.fullscreen) {\n                r.subscribe(\"changed\", this.onFullScreenChange.bind(this));\n            };\n        },\n        onFullScreenChange: function() {\n            var cb = r.isFullScreen();\n            m.conditionClass(document.body, \"fbPhotoSnowliftFullScreenMode\", cb);\n            if (cb) {\n                if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                    this.collapseRHC();\n                };\n                var db = this.stream.getCurrentImageData();\n                if ((((db && db.url) && (this.image.src !== db.url)) && this.shouldShowHiRes(db))) {\n                    this.switchImage(db.url);\n                };\n                this.adjustForResize();\n            }\n             else {\n                this.uncollapseRHC();\n                if ((ma.chrome() && !m.hasClass(this.root, \"fbPhotoSnowliftEditMode\"))) {\n                    this.page(0, false);\n                };\n                g.inform(\"reflow\");\n            }\n        ;\n            ja.hide();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            };\n        },\n        initializeNodes: function(cb) {\n            this.root = cb;\n            this.container = o.find(cb, \"div.fbPhotoSnowliftContainer\");\n            this.snowliftPopup = o.find(this.container, \"div.fbPhotoSnowliftPopup\");\n            this.rhc = o.find(this.snowliftPopup, \"div.rhc\");\n            this.rhcHeader = o.find(this.rhc, \"div.rhcHeader\");\n            this.rhcFooter = o.find(this.rhc, \"div.rhcFooter\");\n            this.ufiForm = o.find(this.rhc, \"form.fbPhotosSnowliftFeedbackForm\");\n            this.ufiInputContainer = o.find(this.rhc, \"div.fbPhotosSnowboxFeedbackInput\");\n            this.scroller = o.find(this.ufiForm, \"div.rhcScroller\");\n            this.scrollerBody = o.find(this.scroller, \"div.uiScrollableAreaBody\");\n            this.stageWrapper = o.find(this.snowliftPopup, \"div.stageWrapper\");\n            this.overlay = o.find(this.snowliftPopup, \"div.snowliftOverlay\");\n            this.errorBox = o.find(this.stageWrapper, \"div.stageError\");\n            this.image = o.find(this.stageWrapper, \"img.spotlight\");\n            this.stage = o.find(this.stageWrapper, \"div.stage\");\n            this.videoStage = o.find(this.stageWrapper, \"div.videoStage\");\n            this.prevPager = o.find(this.snowliftPopup, \"a.snowliftPager.prev\");\n            this.nextPager = o.find(this.snowliftPopup, \"a.snowliftPager.next\");\n            this.stageActions = o.find(cb, \"div.stageActions\");\n            this.buttonActions = o.find(this.stageActions, \"div.fbPhotosPhotoButtons\");\n            this.productMetadata = o.scry(this.rhc, \"div.fbPhotosSnowliftProductMetadata\").pop();\n            this.sideAdUnit = o.find(cb, \".-cx-PUBLIC-snowliftAds__root\");\n            g.inform(\"Amoeba/instrumentMulti\", [[this.container,\"snowlift\",],[this.rhc,\"rhc\",],[this.rhcHeader,\"rhc_header\",],[this.ufiForm,\"ufi_form\",],[this.ufiInputContainer,\"ufi_input\",],[this.prevPager,\"prev_pager\",],[this.nextPager,\"next_pager\",],[this.stageActions,\"stage_actions\",],[this.sideAdUnit,\"side_ads\",],], g.BEHAVIOR_PERSISTENT);\n            m.conditionClass(this.root, \"fullScreenAvailable\", this.fullscreen);\n        },\n        initializeScroller: function() {\n            this.initializeScroller = ua;\n            this.scrollableArea = ha.fromNative(this.scroller, {\n                fade: true,\n                persistent: true\n            });\n            var cb = function(event) {\n                var db = q.$E(event).getTarget();\n                if (o.contains(this.ufiInputContainer, db)) {\n                    var eb = p.getInstance(db);\n                    if (eb) {\n                        this.scrollableArea.scrollToBottom();\n                        var fb = eb.subscribe(\"resize\", function() {\n                            var hb = this.scrollableArea.isScrolledToBottom();\n                            this.adjustScroller();\n                            (hb && this.scrollableArea.scrollToBottom());\n                        }.bind(this)), gb = q.listen(db, \"blur\", function() {\n                            eb.unsubscribe(fb);\n                            gb.remove();\n                        });\n                    }\n                ;\n                }\n            ;\n            }.bind(this);\n            g.subscribe(\"ufi/changed\", function(db, eb) {\n                if ((this.ufiForm === eb.form)) {\n                    this.adjustScrollerIfNecessary();\n                };\n            }.bind(this));\n            g.subscribe(\"ufi/comment\", function(db, eb) {\n                if ((this.ufiForm === eb.form)) {\n                    if (eb.isranked) {\n                        this.scrollableArea.scrollToTop();\n                    }\n                     else this.scrollableArea.scrollToBottom();\n                \n                };\n            }.bind(this));\n            q.listen(this.rhc, \"click\", function(event) {\n                var db = event.getTarget();\n                if (((z.byTag(db, \"a\") || z.byTag(db, \"button\")) || o.isNodeOfType(db, \"input\"))) {\n                    this.adjustScrollerIfNecessary();\n                };\n            }.bind(this));\n            g.subscribe([\"reflow\",\"CommentUFI.Pager\",], function() {\n                if (this.isOpen) {\n                    this.adjustScroller();\n                };\n            }.bind(this));\n            q.listen(this.ufiForm, \"focusin\", cb);\n        },\n        openHandler: function(cb) {\n            if ((((((this.isOpen || (cb.getPath() != \"/photo.php\")) || this.returningToStart) || cb.getQueryData().closeTheater) || cb.getQueryData().permPage) || cb.getQueryData().makeprofile)) {\n                this.openHandlerRegistered = false;\n                return false;\n            }\n        ;\n            this.open(cb);\n            this._uriStack.push(la(cb).getQualifiedURI().toString());\n            y.transitionComplete(true);\n            return true;\n        },\n        getImageSrc: function(cb) {\n            if (cb.smallsrc) {\n                if (!cb.size) {\n                    return cb.smallsrc\n                };\n                var db = na.deserialize(cb.size), eb = this.getStageSize(db);\n                if (((eb.x <= bb.STAGE_NORMAL_MAX.x) && (eb.y <= bb.STAGE_NORMAL_MAX.y))) {\n                    return cb.smallsrc\n                };\n            }\n        ;\n            return cb.src;\n        },\n        open: function(cb) {\n            var db = la(cb).getQueryData(), eb = this.getImageSrc(db);\n            if (eb) {\n                delete db.src;\n                delete db.smallsrc;\n            }\n        ;\n            if (this.resetUriStack) {\n                this._uriStack = [];\n            };\n            if (!this.initialLoad) {\n                db.firstLoad = true;\n                this.initialLoad = true;\n            }\n        ;\n            this.sessionID = Date.now();\n            this.sessionPhotosHilited = {\n            };\n            this.loadQuery = ra(db, {\n                ssid: this.sessionID\n            });\n            this.isOpen = true;\n            this.pagersShown = false;\n            this.refreshOnClose = false;\n            this.hilitedTag = null;\n            this.loadingStates = {\n                image: false,\n                html: false\n            };\n            this.replaceUrl = false;\n            this.source = null;\n            this.saveTagSubscription = g.subscribe(\"PhotoTagger.SAVE_TAG\", this.onTagSaved.bind(this));\n            this.taggedPhotoIds = [];\n            this.stream = new da();\n            this.stream.init(aa.VIEWER_SNOWLIFT, \"PhotoViewerPagelet\", \"pagelet_photo_viewer\");\n            this.fetchInitialData();\n            this.setLoadingState(bb.STATE_HTML, true);\n            this.rhcCollapsed = false;\n            this._open(cb, eb);\n            if (this.enableSnowliftProfilePicCropper) {\n                j.loadModules([\"SnowliftPicCropper\",], function(fb) {\n                    this.cropper = fb.getInstance(this);\n                    this.cropper.init();\n                    if (this.enableCropperOnInit) {\n                        var gb = g.subscribe(\"PhotoSnowlift.SWITCH_IMAGE\", function() {\n                            if (this.isInProfilePicAlbum) {\n                                this.cropper.showPicInProfileAlbumDialog();\n                            }\n                             else this.cropper.enableCropping(this.isUserProfilePic);\n                        ;\n                            g.unsubscribe(gb);\n                        }.bind(this));\n                        this.enableCropperOnInit = false;\n                    }\n                ;\n                }.bind(this));\n            };\n            j.loadModules([\"PhotosButtonTooltips\",], function(fb) {\n                fb.init();\n            });\n        },\n        _open: function(cb, db) {\n            this.createLoader(db);\n            this.spotlight.show();\n            (this.ua && this.ua.add_event(\"frame\"));\n            g.inform(\"layer_shown\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.OPEN\");\n            this.stageHandlers = [q.listen(window, \"resize\", this.adjustForResize.bind(this)),q.listen(this.stageWrapper, \"click\", this.buttonListener.bind(this)),q.listen(this.stageWrapper, \"mouseleave\", function(event) {\n                var gb = event.getTarget();\n                if (!(((((((z.byClass(gb, \"snowliftOverlay\") || z.byClass(gb, \"fbPhotoSnowliftTagApproval\")) || z.byClass(gb, \"tagPointer\")) || z.byClass(gb, \"arrow\")) || z.byClass(gb, \"faceboxSuggestion\")) || z.byClass(gb, \"typeaheadWrapper\")) || z.byClass(gb, \"photoTagTypeahead\")))) {\n                    this.unhiliteAllTags();\n                };\n                this.hidePagers();\n            }.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hilitePagerOnMouseMove.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hiliteTagsOnMouseMove.bind(this)),q.listen(this.overlay, \"mouseenter\", this.unhiliteAllTags.bind(this)),];\n            this.stageHandlers.push(q.listen(this.container, \"click\", function(event) {\n                var gb = event.getTarget();\n                if (z.byClass(gb, \"rotateRight\")) {\n                    this.rotate(\"right\");\n                }\n                 else if (z.byClass(gb, \"rotateLeft\")) {\n                    this.rotate(\"left\");\n                }\n                 else if (z.byClass(gb, \"closeTheater\")) {\n                    if (r.isFullScreen()) {\n                        r.toggleFullScreen();\n                        return;\n                    }\n                ;\n                    this.closingAction = ba.X;\n                    this.closeHandler();\n                    return false;\n                }\n                 else if (this.fullscreen) {\n                    if (z.byClass(gb, \"fbPhotoSnowliftFullScreen\")) {\n                        this.toggleFullScreen();\n                    }\n                     else if (z.byClass(gb, \"fbPhotoSnowliftCollapse\")) {\n                        this.toggleCollapse();\n                    }\n                \n                }\n                \n                \n            ;\n            }.bind(this)));\n            var eb = va(\"fbPhotoSnowliftFeedback\");\n            if (eb) {\n                this.stageHandlers.push(q.listen(eb, \"click\", function(event) {\n                    var gb = event.getTarget();\n                    if ((z.byClass(gb, \"like_link\") || ((z.byClass(gb, \"UFILikeLink\") && z.byClass(gb, \"UIActionLinks\"))))) {\n                        this.toggleLikeButton();\n                    };\n                    var hb = z.byClass(event.getTarget(), \"uiUfiCollapsedComment\");\n                    if (hb) {\n                        m.addClass(hb, \"uiUfiCollapsedCommentToggle\");\n                    };\n                }.bind(this)));\n            };\n            var fb = va(\"fbPhotoSnowliftOnProfile\");\n            if (fb) {\n                this.stageHandlers.push(q.listen(fb, \"click\", function(event) {\n                    if (z.byClass(event.getTarget(), \"fbPhotoRemoveFromProfileLink\")) {\n                        this.refreshOnClose = true;\n                    };\n                }.bind(this)));\n            };\n            if (this.resetUriStack) {\n                this.startingURI = la.getMostRecentURI().addQueryData({\n                    closeTheater: 1\n                }).getUnqualifiedURI();\n            };\n            if (!db) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            };\n            if (!this.transitionHandlerRegistered) {\n                y.registerHandler(this.transitionHandler.bind(this));\n                this.transitionHandlerRegistered = true;\n            }\n        ;\n            ba.initLogging(ba.SNOWLIFT);\n            if (this.pivots) {\n                ba.setRelevantCount(this.pivots.relevantCount);\n            };\n        },\n        toggleFullScreen: function() {\n            var cb = r.toggleFullScreen(document.documentElement);\n            if (cb) {\n                var db = this.stream.getCurrentImageData();\n                if ((((db && db.url) && (this.image.src !== db.url)) && this.shouldShowHiRes(db))) {\n                    (new Image()).src = db.url;\n                };\n                ba.logEnterFullScreen(this.stream.getCursor());\n            }\n        ;\n        },\n        getStream: function() {\n            return this.stream;\n        },\n        fetchInitialData: function() {\n            (this.ua && this.ua.add_event(\"init_data\"));\n            this.stream.waitForInitData();\n            var cb = l(this.container, [\"ft\",]);\n            if ((((cb && cb.ft) && cb.ft.ei) && this.loadQuery)) {\n                this.loadQuery.ei = cb.ft.ei;\n            };\n            ka.loadFromEndpoint(\"PhotoViewerInitPagelet\", va(\"pagelet_photo_viewer_init\", this.root), this.loadQuery, {\n                usePipe: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n        },\n        toggleCollapse: function() {\n            if (this.rhcCollapsed) {\n                this.uncollapseRHC();\n            }\n             else this.collapseRHC();\n        ;\n        },\n        collapseRHC: function() {\n            this.rhcCollapsed = true;\n            m.addClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        uncollapseRHC: function() {\n            this.rhcCollapsed = false;\n            m.removeClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        closeHandler: function() {\n            if (!this.isOpen) {\n                return\n            };\n            this.closingAction = (this.closingAction || ba.ESC);\n            if ((la.getMostRecentURI().addQueryData({\n                closeTheater: 1\n            }).getUnqualifiedURI().toString() == this.startingURI.toString())) {\n                this.close();\n                return;\n            }\n        ;\n            this.returnToStartingURI(this.refreshOnClose);\n            this.close();\n        },\n        returnToStartingURI: function(cb, db) {\n            if (!cb) {\n                if (db) {\n                    this.squashNextTransition(wa.curry(db));\n                }\n                 else this.squashNextTransition();\n            \n            };\n            this.returningToStart = true;\n            var eb = g.subscribe(\"page_transition\", (function() {\n                this.returningToStart = false;\n                eb.unsubscribe();\n            }).bind(this)), fb = (cb || isNaN(ma.opera())), gb = this._uriStack.length;\n            if ((fb && (gb < window.history.length))) {\n                window.history.go(-gb);\n            }\n             else {\n                var hb = this.startingURI, ib = new la(hb).removeQueryData(\"closeTheater\");\n                if (((hb.getQueryData().sk == \"approve\") && (hb.getPath() == \"/profile.php\"))) {\n                    ib.removeQueryData(\"highlight\");\n                    ib.removeQueryData(\"notif_t\");\n                }\n            ;\n                wa(ib);\n            }\n        ;\n        },\n        squashNextTransition: function(cb) {\n            this.squashNext = true;\n            y.registerHandler(function db() {\n                if (this.squashNext) {\n                    this.squashNext = false;\n                    if (cb) {\n                        cb.defer();\n                    };\n                    y.transitionComplete(true);\n                    return true;\n                }\n            ;\n                return false;\n            }.bind(this), 7);\n        },\n        handleNavigateAway: function(cb) {\n            var db = qa(y._most_recent_uri.getQualifiedURI(), cb.getAttribute(\"href\"));\n            if ((this.isOpen && ya(db.getPath(), \"/hashtag/\"))) {\n                this.close();\n                y.transitionComplete(true);\n                this.squashNextTransition();\n                y.go(this.startingURI);\n                return true;\n            }\n        ;\n            if ((((this.isOpen && ((db instanceof la))) && (db.getUnqualifiedURI().toString() != this.startingURI.toString())) && (db.getPath() != \"/photo.php\"))) {\n                if (!this.closingAction) {\n                    this.closingAction = ba.NAVIGATE;\n                };\n                this.returnToStartingURI(false, db);\n                this.close();\n                return false;\n            }\n        ;\n            return true;\n        },\n        postProcessTaggedPhotos: function() {\n            if ((this.taggedPhotoIds && (this.taggedPhotoIds.length > 0))) {\n                var cb = null;\n                if ((this.source === bb.COLLECTIONS_UNTAGGED_PHOTOS)) {\n                    cb = \"/ajax/photos/photo/edit/skiptag/\";\n                }\n                 else if ((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS)) {\n                    cb = \"/ajax/photos/photo/add_to_star_grid/\";\n                }\n            ;\n                if (cb) {\n                    new i().setURI(cb).setAllowCrossPageTransition(true).setData({\n                        media_id: this.taggedPhotoIds\n                    }).send();\n                };\n            }\n        ;\n        },\n        onTagSaved: function(cb, db) {\n            if (this.taggedPhotoIds) {\n                if (((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS) && !db.self_tag)) {\n                    return\n                };\n                this.taggedPhotoIds.push(db.photo_fbid);\n            }\n        ;\n        },\n        close: function() {\n            if (!this.isOpen) {\n                return\n            };\n            this.isOpen = false;\n            if (this.fullscreen) {\n                r.disableFullScreen();\n            };\n            ab(\"snowlift\").uai(\"close\");\n            (this.cropper && this.cropper.disableCropping());\n            this.spotlight.hide();\n            this.openExplicitly = false;\n            this.postProcessTaggedPhotos();\n            g.unsubscribe(this.saveTagSubscription);\n            this.taggedPhotoIds = [];\n            this.closeDirty = true;\n            this.closeCleanup.bind(this).defer();\n        },\n        closeCleanup: function() {\n            this.closeDirty = false;\n            m.removeClass(this.root, \"dataLoading\");\n            ba.logPhotoViews(this.closingAction);\n            this.destroy();\n            m.hide(this.errorBox);\n            m.hide(this.image);\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            this.shouldStretch = false;\n            this.resetUriStack = true;\n            m.removeClass(this.stageWrapper, \"showVideo\");\n            o.empty(this.videoStage);\n            this.uncollapseRHC();\n            this.currentMinSize = null;\n            this.rhcMinHeight = null;\n            this.setStagePagersState(\"reset\");\n            this.recacheData();\n            o.empty(this.sideAdUnit);\n            this.stream.destroy();\n            var cb = (this.closingAction === ba.NAVIGATE);\n            this.closingAction = null;\n            if (!this.openHandlerRegistered) {\n                y.registerHandler(this.openHandler.bind(this));\n                this.openHandlerRegistered = true;\n            }\n        ;\n            g.inform(\"layer_hidden\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.CLOSE\", cb);\n            this.root.setAttribute(\"aria-busy\", \"true\");\n        },\n        createLoader: function(cb) {\n            if ((this.currentImageSize === null)) {\n                this.adjustStageSize(bb.STAGE_MIN);\n            }\n             else {\n                var db = this.getStageSize(this.currentImageSize);\n                db = new na(Math.max(db.x, bb.STAGE_MIN.x), Math.max(db.y, bb.STAGE_MIN.y));\n                var eb = this.getImageSizeInStage(this.currentImageSize, db);\n                if ((this.thumbSrc === null)) {\n                    this.adjustStageSize(eb);\n                }\n                 else this.useImage(o.create(\"img\", {\n                    className: \"spotlight\",\n                    alt: \"\",\n                    src: this.thumbSrc,\n                    style: {\n                        width: (eb.x + \"px\"),\n                        height: (eb.y + \"px\")\n                    }\n                }), eb, false);\n            ;\n            }\n        ;\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            if (cb) {\n                (function() {\n                    var fb = new Image(), gb = q.listen(fb, \"load\", pa(function() {\n                        if (!this.isOpen) {\n                            return\n                        };\n                        if ((!this.stream || !this.stream.errorInCurrent())) {\n                            this.switchImage(cb, this.currentImageSize);\n                            (this.ua && this.ua.add_event(\"image\"));\n                            this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                        }\n                    ;\n                    }.bind(this), \"photo_theater\"));\n                    g.subscribeOnce(\"PhotoSnowlift.PAGE\", gb.remove.bind(gb));\n                    fb.src = cb;\n                }).bind(this).defer();\n            };\n            m.hide(this.stageActions);\n            this.setStagePagersState(\"disabled\");\n        },\n        initDataFetched: function(cb) {\n            ba.setPhotoSet(this.stream.getPhotoSet());\n            ba.setLogFbids(cb.logids);\n            var db = this.stream.getCurrentImageData();\n            ba.addPhotoView(db.info, this.shouldShowHiRes(db), (this.fullscreen && r.isFullScreen()));\n            var eb = this.stream.getCurrentExtraData();\n            if ((eb && (eb.source !== undefined))) {\n                this.source = parseInt(eb.source, 10);\n                ba.setSource(this.source);\n            }\n        ;\n            if (!this.pageHandlers) {\n                this.pageHandlers = [q.listen(this.root, \"click\", this.pageListener.bind(this)),q.listen(this.root, \"mouseleave\", this.mouseLeaveListener.bind(this)),];\n            };\n            m.show(this.stageActions);\n            this.root.setAttribute(\"aria-busy\", \"false\");\n            this.isLoggedInViewer = cb.loggedin;\n            this.disableAdsForSession = (cb.disablesessionads || !this.isLoggedInViewer);\n            this.showFlashTags = !!cb.flashtags;\n            this.disableAds = (this.disableAdsForSession || cb.fromad);\n            this.loadAds();\n        },\n        adjustScrollerIfNecessary: function() {\n            clearTimeout(this.scrollerTimeout);\n            this.scrollerTimeout = this.adjustScroller.bind(this).defer();\n        },\n        adjustScroller: function(cb) {\n            clearTimeout(this.scrollerTimeout);\n            this.initializeScroller();\n            this.scrollableArea.resize();\n            var db = na.getElementDimensions(this.rhc), eb = db.y;\n            eb -= na.getElementDimensions(this.rhcHeader).y;\n            eb -= na.getElementDimensions(this.ufiInputContainer).y;\n            if (this.productMetadata) {\n                var fb = na.getElementDimensions(this.productMetadata);\n                if ((fb.x !== 0)) {\n                    eb -= fb.y;\n                };\n            }\n        ;\n            if ((cb == null)) {\n                cb = 0;\n            };\n            this.rhcMinHeight = (db.y - ((eb - bb.MIN_UFI_HEIGHT)));\n            eb = Math.max(0, eb);\n            var gb = na.getElementDimensions(this.scrollerBody).y, hb = Math.max(bb.MIN_UFI_HEIGHT, (eb - cb));\n            if ((gb >= hb)) {\n                ia.set(this.scroller, \"height\", (hb + \"px\"));\n                if ((eb > hb)) {\n                    m.removeClass(this.rhc, \"pinnedUfi\");\n                    eb -= hb;\n                }\n                 else {\n                    m.addClass(this.rhc, \"pinnedUfi\");\n                    eb = 0;\n                }\n            ;\n            }\n             else {\n                ia.set(this.scroller, \"height\", \"auto\");\n                m.removeClass(this.rhc, \"pinnedUfi\");\n                eb -= gb;\n            }\n        ;\n            var ib = o.scry(this.scrollerBody, \"li.UFIFirstComponent\");\n            if ((ib.length === 0)) {\n                var jb = o.scry(this.ufiInputContainer, \"li.UFIAddComment\");\n                if ((jb.length !== 0)) {\n                    m.addClass(jb[0], \"UFIFirstComponent\");\n                };\n            }\n        ;\n            var kb = na.getElementDimensions(this.ufiInputContainer).y;\n            ia.set(this.ufiForm, \"padding-bottom\", (kb + \"px\"));\n            ca.resize(new na(db.x, eb));\n            this.scrollableArea.adjustGripper();\n        },\n        adjustForResize: function() {\n            this.currentMinSize = null;\n            this.adjustStageSize();\n            this.adjustForNewData();\n        },\n        shouldShowHiRes: function(cb) {\n            if ((!cb || !cb.smallurl)) {\n                return false\n            };\n            var db = this.getStageSize(cb.dimensions), eb = this.getImageSizeInStage(cb.dimensions, db);\n            return (((eb.x > bb.STAGE_NORMAL_MAX.x) || (eb.y > bb.STAGE_NORMAL_MAX.y)));\n        },\n        getImageURL: function(cb) {\n            if (cb.video) {\n                return null;\n            }\n             else if ((cb.smallurl && !this.shouldShowHiRes(cb))) {\n                return cb.smallurl\n            }\n        ;\n            return cb.url;\n        },\n        getImageDimensions: function(cb) {\n            if ((cb.smalldims && ((!this.shouldShowHiRes(cb) || (this.image.src === cb.smallurl))))) {\n                return cb.smalldims\n            };\n            return cb.dimensions;\n        },\n        getStageSize: function(cb, db) {\n            var eb = na.getViewportDimensions(), fb = new na(cb.x, cb.y);\n            if (db) {\n                fb = new na(Math.max(cb.x, db.x), Math.max(cb.y, db.y));\n            };\n            var gb, hb;\n            if ((this.fullscreen && r.isFullScreen())) {\n                return new na(((this.rhcCollapsed ? screen.width : (screen.width - bb.SIDEBAR_SIZE_MAX))), (screen.height - (bb.FULL_SCREEN_PADDING * 2)));\n            }\n             else {\n                gb = Math.min(fb.x, this.stageMax.x, (((eb.x - bb.SIDEBAR_SIZE_MAX) - bb.STAGE_CHROME.x)));\n                hb = Math.min(fb.y, this.stageMax.y, (eb.y - bb.STAGE_CHROME.y));\n            }\n        ;\n            if (((gb === 0) && (hb === 0))) {\n                return new na(0, 0)\n            };\n            var ib = (gb / hb), jb = (fb.x / fb.y);\n            if ((ib < jb)) {\n                return new na(gb, Math.round((gb / jb)))\n            };\n            return new na(Math.round((hb * jb)), hb);\n        },\n        getImageSizeInStage: function(cb, db) {\n            var eb = cb.x, fb = cb.y;\n            if (((eb >= db.x) || (fb >= db.y))) {\n                var gb = (db.x / db.y), hb = (eb / fb);\n                if ((gb < hb)) {\n                    eb = db.x;\n                    fb = Math.round((eb / hb));\n                }\n                 else if ((gb > hb)) {\n                    fb = db.y;\n                    eb = Math.round((fb * hb));\n                }\n                 else {\n                    eb = db.x;\n                    fb = db.y;\n                }\n                \n            ;\n            }\n        ;\n            return new na(eb, fb);\n        },\n        adjustStageSize: function(cb) {\n            var db = this.currentImageSize;\n            if (cb) {\n                db = cb;\n            }\n             else {\n                var eb = (this.stream && this.stream.getCurrentImageData());\n                if (eb) {\n                    db = this.getImageDimensions(eb);\n                };\n            }\n        ;\n            if (!db) {\n                return\n            };\n            this.currentImageSize = db;\n            var fb = 0;\n            if (((((this.shouldStretch && !this.getVideoOnStage()) && (db.x > db.y)) && (db.x <= bb.TIMELINE_STRETCH_WIDTH)) && (db.x >= bb.TIMELINE_STRETCH_MIN))) {\n                db.y = Math.round(((db.y * bb.TIMELINE_STRETCH_WIDTH) / db.x));\n                db.x = bb.TIMELINE_STRETCH_WIDTH;\n            }\n             else if (this.getVideoOnStage()) {\n                fb = (bb.VIDEO_BOTTOM_BAR_SPACE * 2);\n            }\n        ;\n            var gb = this.getStageSize(db, this.currentMinSize);\n            if (!this.currentMinSize) {\n                this.currentMinSize = new na(0, 0);\n            };\n            if (!this.rhcMinHeight) {\n                this.rhcMinHeight = 0;\n            };\n            this.currentMinSize = new na(Math.max(gb.x, bb.STAGE_MIN.x, this.currentMinSize.x), Math.max(gb.y, bb.STAGE_MIN.y, this.currentMinSize.y));\n            var hb = this.getImageSizeInStage(db, this.currentMinSize), ib = (this.currentMinSize.x - hb.x), jb = (this.currentMinSize.y - hb.y);\n            if (((ib > 0) && (ib < bb.PADDING_MIN))) {\n                this.currentMinSize.x -= ib;\n            }\n             else if (((jb > 0) && (jb < bb.PADDING_MIN))) {\n                this.currentMinSize.y -= jb;\n            }\n        ;\n            var kb = o.scry(this.productMetadata, \"#fbPhotoSnowliftTaggedProducts .taggee\");\n            if (kb.length) {\n                this.currentMinSize.y = Math.max(this.currentMinSize.y, this.rhcMinHeight);\n            };\n            var lb = (this.currentMinSize.x + bb.SIDEBAR_SIZE_MAX);\n            if (this.rhcCollapsed) {\n                lb = this.currentMinSize.x;\n            };\n            this.snowliftPopup.style.cssText = (((((\"width:\" + lb) + \"px;\") + \"height:\") + this.currentMinSize.y) + \"px;\");\n            var mb = ((this.currentMinSize.y - fb) + \"px\");\n            if ((ma.firefox() || (ma.ie() < 8))) {\n                var nb = ia.get(this.stageWrapper, \"font-size\");\n                if ((ma.ie() && (nb.indexOf(\"px\") < 0))) {\n                    var ob = o.create(\"div\");\n                    ob.style.fontSize = nb;\n                    ob.style.height = \"1em\";\n                    nb = ob.style.pixelHeight;\n                }\n            ;\n                mb = (((((this.currentMinSize.y - fb)) / parseFloat(nb))) + \"em\");\n            }\n        ;\n            this.stageWrapper.style.cssText = (((((\"width:\" + this.currentMinSize.x) + \"px;\") + \"line-height:\") + mb) + \";\");\n            if ((ma.ie() < 8)) {\n                ia.set(this.root, \"height\", (na.getViewportDimensions().y + \"px\"));\n                ia.set(this.container, \"min-height\", (((this.currentMinSize.y + bb.STAGE_CHROME.y)) + \"px\"));\n            }\n        ;\n            this.image.style.cssText = (((((\"width:\" + hb.x) + \"px;\") + \"height:\") + hb.y) + \"px;\");\n            var pb = this.getTagger();\n            if (pb) {\n                pb.repositionTagger();\n            };\n            this.adjustScrollerIfNecessary();\n        },\n        adjustForNewData: function() {\n            if (!this.image) {\n                return\n            };\n            var cb = o.scry(this.stage, \"div.tagsWrapper\")[0], db = na.getElementDimensions(this.image);\n            if (cb) {\n                ia.set(cb, \"width\", (db.x + \"px\"));\n                ia.set(cb, \"height\", (db.y + \"px\"));\n                if ((ma.ie() <= 7)) {\n                    var eb = o.scry(this.root, \"div.tagContainer\")[0];\n                    if (eb) {\n                        m.conditionClass(cb, \"ie7VerticalFix\", (na.getElementDimensions(eb).y > db.y));\n                    };\n                }\n            ;\n            }\n        ;\n        },\n        adsDisplayedCallback: function(cb, db) {\n            if ((((((this.resizeCommentsForAds && !this.inAdsDisplayedCallback) && !this.disableAds) && (bb.MIN_ADS_VISIBLE > 0)) && (cb < bb.MIN_ADS_VISIBLE)) && (db.length >= bb.MIN_ADS_VISIBLE))) {\n                this.inAdsDisplayedCallback = true;\n                var eb = db[(bb.MIN_ADS_VISIBLE - 1)];\n                this.adjustScroller(eb);\n                this.inAdsDisplayedCallback = false;\n            }\n        ;\n        },\n        setLoadingState: function(cb, db) {\n            switch (cb) {\n              case bb.STATE_IMAGE_PIXELS:\n                m.conditionClass(this.root, \"imagePixelsLoading\", db);\n                break;\n              case bb.STATE_IMAGE_DATA:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"imageLoading\", db);\n                break;\n              case bb.STATE_HTML:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"dataLoading\", db);\n                this.rhc.setAttribute(\"aria-busy\", (db ? \"true\" : \"false\"));\n                break;\n            };\n        },\n        destroy: function() {\n            this.stageHandlers.forEach(function(cb) {\n                cb.remove();\n            });\n            if (this.pageHandlers) {\n                this.pageHandlers.forEach(function(cb) {\n                    cb.remove();\n                });\n                this.pageHandlers = null;\n            }\n        ;\n        },\n        checkState: function(cb) {\n            if (((cb != bb.STATE_ERROR) && !this.loadingStates[cb])) {\n                return\n            };\n            switch (cb) {\n              case bb.STATE_IMAGE_DATA:\n                var db = this.stream.getCurrentImageData();\n                if (db) {\n                    var eb = this.getImageURL(db);\n                    if (eb) {\n                        this.switchImage(eb, null, true);\n                    }\n                     else if (db.video) {\n                        this.switchVideo(db.video, true);\n                    }\n                ;\n                    this.setLoadingState(cb, false);\n                }\n            ;\n                break;\n              case bb.STATE_HTML:\n                if (this.stream.getCurrentHtml()) {\n                    this.swapData();\n                    this.showPagers(bb.PAGER_FADE);\n                    this.setLoadingState(cb, false);\n                }\n            ;\n                break;\n              default:\n                if (this.stream.errorInCurrent()) {\n                    m.hide(this.image);\n                    m.show(this.errorBox);\n                }\n            ;\n                break;\n            };\n        },\n        buttonListener: function(event) {\n            var cb = event.getTarget(), db = Date.now();\n            if (z.byClass(cb, \"fbPhotoTagApprovalBox\")) {\n                return\n            };\n            if (z.byClass(cb, \"fbPhotosCornerWantButton\")) {\n                event.stop();\n                return;\n            }\n        ;\n            if (((db - this.lastPage) < 350)) {\n                return\n            };\n            if (z.byClass(cb, \"fbPhotosPhotoLike\")) {\n                this.likePhoto();\n            }\n             else if (z.byClass(cb, \"tagApproveIgnore\")) {\n                this.updateTagBox(event, cb);\n            }\n        ;\n        },\n        likePhoto: function() {\n            ba.addButtonLike();\n            var cb = oa(\"fbPhotoSnowliftFeedback\"), db = o.scry(cb, \"button.like_link\")[0];\n            if (!db) {\n                db = o.scry(cb, \"a.UFILikeLink\")[0];\n            };\n            var eb = db.getAttribute(\"href\");\n            if (r.isFullScreen()) {\n                if (ma.chrome()) {\n                    db.setAttribute(\"href\", \"javascript:;\");\n                }\n            };\n            db.click();\n            db.setAttribute(\"href\", eb);\n        },\n        toggleLikeButton: function() {\n            var cb = o.scry(this.buttonActions, \"a.fbPhotosPhotoLike\")[0];\n            if (cb) {\n                var db = o.find(this.root, \".likeCount\"), eb = o.find(db, \".likeCountNum\");\n                if (db) {\n                    if (m.hasClass(cb, \"viewerLikesThis\")) {\n                        o.setContent(eb, (parseInt(eb.textContent, 10) - 1));\n                    }\n                     else o.setContent(eb, (parseInt(eb.textContent, 10) + 1));\n                \n                };\n                m.toggleClass(cb, \"viewerLikesThis\");\n                m.removeClass(cb, \"viewerAlreadyLikedThis\");\n            }\n        ;\n        },\n        likePhotoWithKey: function() {\n            if (this.isShowingLikePhotoConfirmation) {\n                return\n            };\n            if (this.skipLikePhotoConfirmation) {\n                this.likePhoto();\n            }\n             else h.send(new i(\"/photos/confirm_like.php\"), function(cb) {\n                this.isShowingLikePhotoConfirmation = true;\n                cb.subscribe(\"confirm\", this.onCloseLikePhotoConfirmDialog.bind(this));\n                cb.subscribe(\"cancel\", this.onCloseLikePhotoConfirmDialog.bind(this));\n            }.bind(this));\n        ;\n            return false;\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            this.skipLikePhotoConfirmation = cb;\n            this.likePhoto();\n        },\n        onCloseLikePhotoConfirmDialog: function() {\n            this.isShowingLikePhotoConfirmation = false;\n        },\n        updateTagBox: function(cb, db) {\n            this.unhiliteAllTags();\n            var eb = va(cb);\n            if (!eb) {\n                return\n            };\n            m.addClass(eb, \"tagBox\");\n            m.addClass(eb, \"tagBoxPendingResponse\");\n            m.removeClass(eb, \"tagBoxPending\");\n            m.hide(o.find(eb, \"span.tagForm\"));\n            if (db) {\n                m.show(o.find(eb, \"span.tagApproved\"));\n            }\n             else m.show(o.find(eb, \"span.tagIgnored\"));\n        ;\n        },\n        rotate: function(cb) {\n            var db = this.stream.getCursor();\n            if (this.getVideoOnStage()) {\n                var eb = (((cb == \"left\")) ? 270 : 90);\n                j.loadModules([\"VideoRotate\",], function(gb) {\n                    new gb(db).motionRotate(eb);\n                });\n                return;\n            }\n        ;\n            var fb = ra({\n                fbid: db,\n                cs_ver: aa.VIEWER_SNOWLIFT\n            }, this.stream.getPhotoSetQuery());\n            fb[cb] = 1;\n            this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            m.hide(this.image);\n            new i(\"/ajax/photos/photo/rotate/\").setAllowCrossPageTransition(true).setData(fb).setErrorHandler(this.rotationError.bind(this, db)).setFinallyHandler(this.rotationComplete.bind(this, db)).setMethod(\"POST\").setReadOnly(false).send();\n        },\n        rotationComplete: function(cb, db) {\n            if ((cb == this.stream.getCursor())) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                this.swapData();\n            }\n        ;\n        },\n        rotationError: function(cb, db) {\n            if ((cb == this.stream.getCursor())) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                j.loadModules([\"AsyncResponse\",], function(eb) {\n                    eb.defaultErrorHandler(db);\n                });\n            }\n        ;\n        },\n        saveTagsFromPayload: function(cb) {\n            this.storeFromData(cb);\n            if (((\"data\" in cb) && (this.stream.getCursor() in cb.data))) {\n                this.swapData();\n            };\n        },\n        saveEdit: function() {\n            if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                return\n            };\n            j.loadModules([\"PhotoInlineEditor\",\"Form\",], function(cb, db) {\n                var eb = cb.getInstance(this.getViewerConst());\n                (eb && db.bootstrap(eb.getForm().controller));\n            }.bind(this));\n        },\n        mouseLeaveListener: function(event) {\n            this.unhiliteAllTags();\n            this.reHilitePendingTag();\n        },\n        hilitePagerOnMouseMove: function(event) {\n            var cb = na.getEventPosition(event), db = na.getElementPosition(this.stage);\n            if (x.isRTL()) {\n                var eb = na.getElementDimensions(this.stage);\n                this.stagePagerPrev = ((eb.x - ((cb.x - db.x))) < bb.GOPREV_AREA);\n            }\n             else this.stagePagerPrev = ((cb.x - db.x) < bb.GOPREV_AREA);\n        ;\n            m.conditionClass(this.prevPager, \"hilightPager\", this.stagePagerPrev);\n            m.conditionClass(this.nextPager, \"hilightPager\", !this.stagePagerPrev);\n            var fb, gb = event.getTarget();\n            if (((!z.byClass(gb, \"snowliftOverlay\") && !z.byClass(gb, \"bottomBarActions\")) && !z.byClass(gb, \"snowliftPager\"))) {\n                fb = bb.PAGER_FADE;\n            };\n            this.showPagers(fb);\n        },\n        showPagers: function(cb) {\n            clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"active\");\n            if ((typeof cb !== \"undefined\")) {\n                this.fadePagerTimer = this.hidePagers.bind(this).defer(cb);\n            };\n        },\n        hidePagers: function() {\n            var cb = o.scry(this.getRoot(), \".fbPhotosPhotoActionsMenu\")[0];\n            if (cb) {\n                return\n            };\n            clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"inactive\");\n        },\n        getTagger: function() {\n            if (!this.PhotoTagger) {\n                return null\n            };\n            var cb = this.PhotoTagger.getInstance(aa.VIEWER_SNOWLIFT);\n            if ((!cb || !cb.tagHoverFacebox)) {\n                return null\n            };\n            return cb;\n        },\n        hiliteAllBoxes: function() {\n            o.scry(this.stage, \"div.tagsWrapper div.faceBox\").forEach(function(cb) {\n                m.addClass(cb, \"otherActive\");\n            });\n        },\n        flashAllTags: function() {\n            var cb = this.stream.getCurrentImageData().info.fbid;\n            if (this.sessionPhotosHilited[cb]) {\n                return\n            };\n            o.scry(this.stage, \"div.tagsWrapper div.tagBox\").forEach(function(db) {\n                m.addClass(db, \"hover\");\n            });\n            this.sessionPhotosHilited[cb] = true;\n            this.unhiliteTimer = this.unhiliteAllTags.bind(this).defer(2000, true);\n        },\n        unhiliteAllTags: function() {\n            clearTimeout(this.unhiliteTimer);\n            o.scry(this.stage, \"div.tagsWrapper div.hover\").forEach(function(db) {\n                m.removeClass(db, \"hover\");\n            });\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                o.scry(this.stage, \"div.tagsWrapper div.otherActive\").forEach(function(db) {\n                    m.removeClass(db, \"otherActive\");\n                });\n            };\n            this.hilitedTag = null;\n            if (!m.hasClass(this.root, \"taggingMode\")) {\n                var cb = this.getTagger();\n                if (cb) {\n                    cb.hideTagger();\n                    cb.setCurrentFacebox(null);\n                }\n            ;\n            }\n        ;\n        },\n        switchHilitedTags: function(cb, db) {\n            if ((this.switchTimer !== null)) {\n                clearTimeout(this.switchTimer);\n                this.switchTimer = null;\n            }\n        ;\n            this.unhiliteAllTags();\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                this.hiliteAllBoxes();\n            };\n            var eb = va(cb);\n            if (eb) {\n                this.hilitedTag = cb;\n                if ((!m.hasClass(this.root, \"taggingMode\") && ea.isFacebox(this.hilitedTag))) {\n                    var fb = this.getTagger();\n                    if (fb) {\n                        m.addClass(eb, \"hover\");\n                        var gb = fb.getFacebox(cb);\n                        fb.setCurrentFacebox(gb);\n                        if (gb) {\n                            fb.addTagFromFacebox(gb);\n                        };\n                    }\n                ;\n                }\n                 else m.addClass(eb, \"hover\");\n            ;\n                if (((m.hasClass(eb, \"tagBoxPending\") && !m.hasClass(eb, \"showPendingTagName\")) && (db === true))) {\n                    o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\").forEach(function(hb) {\n                        m.removeClass(hb, \"showPendingTagName\");\n                    });\n                    m.addClass(eb, \"showPendingTagName\");\n                }\n            ;\n            }\n        ;\n        },\n        reHilitePendingTag: function() {\n            var cb = va(this.hilitedTag);\n            if ((cb && m.hasClass(cb, \"showPendingTagName\"))) {\n                return\n            };\n            var db = o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\")[0];\n            if (db) {\n                this.switchHilitedTags(db.id);\n            };\n        },\n        hiliteTagsOnMouseMove: function(event) {\n            if ((!this.stream.getCurrentExtraData() || this.getVideoOnStage())) {\n                return\n            };\n            if ((this.switchTimer !== null)) {\n                return\n            };\n            var cb = event.getTarget();\n            if (((((((z.byClass(cb, \"snowliftOverlay\") || z.byClass(cb, \"fbPhotoSnowliftTagApproval\")) || z.byClass(cb, \"tagPointer\")) || z.byClass(cb, \"arrow\")) || z.byClass(cb, \"faceboxSuggestion\")) || z.byClass(cb, \"typeaheadWrapper\")) || z.byClass(cb, \"photoTagTypeahead\"))) {\n                return\n            };\n            var db = z.byClass(cb, \"tagBoxPending\"), eb = false;\n            if (this.hilitedTag) {\n                var fb = va(this.hilitedTag);\n                eb = (fb && m.hasClass(fb, \"tagBoxPending\"));\n            }\n        ;\n            var gb = ((((!this.hilitedTag && db)) || ((!eb && db))));\n            if (gb) {\n                this.switchHilitedTags(db.id);\n                return;\n            }\n        ;\n            if ((db && ((db.id == this.hilitedTag)))) {\n                return\n            };\n            var hb = 250, ib = ea.absoluteToNormalizedPosition(this.image, na.getEventPosition(event));\n            if (this.currentTagHasPrecedence(ib)) {\n                return\n            };\n            var jb = ea.getNearestBox(this.stream.getCurrentExtraData().tagRects, ib);\n            if (!jb) {\n                if (!eb) {\n                    this.unhiliteAllTags();\n                    this.reHilitePendingTag();\n                }\n            ;\n                return;\n            }\n        ;\n            var kb = null;\n            if (eb) {\n                var lb = {\n                };\n                lb[this.hilitedTag] = this.stream.getCurrentExtraData().tagRects[this.hilitedTag];\n                kb = ea.getNearestBox(lb, ib);\n            }\n        ;\n            if (((kb !== null) && eb)) {\n                return\n            };\n            if ((this.hilitedTag != jb)) {\n                if (eb) {\n                    this.switchTimer = this.switchHilitedTags.bind(this, jb).defer(hb);\n                }\n                 else {\n                    if (this.showHover) {\n                        if (!this.seenTags) {\n                            this.seenTags = [];\n                        };\n                        if (!this.seenTags[jb]) {\n                            ba.addFaceTagImpression();\n                            this.seenTags[jb] = true;\n                        }\n                    ;\n                    }\n                ;\n                    this.switchHilitedTags(jb);\n                }\n            \n            };\n        },\n        currentTagHasPrecedence: function(cb) {\n            if (!this.hilitedTag) {\n                return false\n            };\n            if ((this.stream.getCurrentExtraData().tagRects[this.hilitedTag] === undefined)) {\n                this.hilitedTag = null;\n                return false;\n            }\n        ;\n            var db = this.stream.getCurrentExtraData().tagRects[this.hilitedTag], eb = new ga((db.t + ((db.h() / 2))), db.r, (db.b + ((ea.isFacebox(this.hilitedTag) ? 10 : 0))), db.l, db.domain);\n            return eb.contains(cb);\n        },\n        getVideoOnStage: function() {\n            var cb = (this.stream && this.stream.getCurrentImageData());\n            return (cb && cb.video);\n        },\n        shouldPageOnAction: function(cb, db) {\n            if ((!this.isOpen || this.isShowingLikePhotoConfirmation)) {\n                return false\n            };\n            var eb = (o.isNode(db) && (((z.byClass(db, \"snowliftPager\") || z.byClass(db, \"stagePagers\")) || z.byClass(db, \"pivotPageColumn\")))), fb = (o.isNode(db) && z.byClass(db, \"stage\")), gb = m.hasClass(db, \"faceBox\"), hb = ((((((((fb && m.hasClass(this.root, \"taggingMode\"))) || z.byClass(db, \"tagBoxPending\")) || z.byClass(db, \"tagBoxPendingResponse\")) || z.byClass(db, \"fbPhotoTagApprovalBox\")) || z.byClass(db, \"tag\")) || ((this.cropper && this.cropper.croppingMode))));\n            if (hb) {\n                return false\n            };\n            return (((((cb == u.LEFT) || (cb == u.RIGHT)) || ((!m.hasClass(this.root, \"taggingMode\") && gb))) || eb) || fb);\n        },\n        keyHandler: function(cb, event) {\n            if ((event.getModifiers().any || (v.getTopmostLayer() !== this.spotlight))) {\n                return true\n            };\n            switch (q.getKeyCode(event)) {\n              case u.LEFT:\n            \n              case u.RIGHT:\n                if (!this.pagersOnKeyboardNav) {\n                    this.showPagers(bb.PAGER_FADE);\n                };\n                this.pageListener(event);\n                return false;\n              case 70:\n                return this.toggleFullScreen();\n              case 76:\n                return this.likePhotoWithKey();\n            };\n        },\n        pageListener: function(event) {\n            var cb = q.getKeyCode(event), db = event.getTarget();\n            if (!this.shouldPageOnAction(cb, db)) {\n                return\n            };\n            var eb = 0;\n            if ((cb == u.RIGHT)) {\n                eb = 1;\n                ba.setPagingAction(\"key_right\");\n            }\n             else if ((cb == u.LEFT)) {\n                eb = -1;\n                ba.setPagingAction(\"key_left\");\n            }\n             else if (z.byClass(db, \"next\")) {\n                eb = 1;\n                ba.setPagingAction(\"click_next\");\n            }\n             else if (z.byClass(db, \"prev\")) {\n                eb = -1;\n                ba.setPagingAction(\"click_prev\");\n            }\n             else if (!this.stagePagerPrev) {\n                eb = 1;\n                ba.setPagingAction(\"click_stage\");\n            }\n             else {\n                eb = -1;\n                ba.setPagingAction(\"click_stage_back\");\n            }\n            \n            \n            \n            \n        ;\n            var fb = o.scry(this.ufiForm, \"input.mentionsHidden\"), gb = false;\n            for (var hb = 0; (hb < fb.length); hb++) {\n                if (!s.isEmpty(fb[hb])) {\n                    gb = true;\n                    break;\n                }\n            ;\n            };\n            if (((gb || m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) || ((this.cropper && this.cropper.croppingMode)))) {\n                this.warnLeavePage(eb);\n            }\n             else {\n                this.page(eb, (ma.chrome() && r.isFullScreen()));\n                ab(\"snowlift\", db, event).uai(ba.pagingAction);\n            }\n        ;\n        },\n        warnLeavePage: function(cb) {\n            new n().setTitle(\"Are you sure you want to leave this page?\").setBody(\"You have unsaved changes that will be lost if you leave the page.\").setButtons([{\n                name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: this.page.bind(this, cb)\n            },{\n                name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        page: function(cb, db) {\n            if (!this.stream.isValidMovement(cb)) {\n                this.showPagers(bb.PAGER_FADE);\n                return;\n            }\n        ;\n            this.lastPage = Date.now();\n            this.unhiliteAllTags();\n            this.seenTags = [];\n            var eb = this.getVideoOnStage();\n            if (eb) {\n                this.switchVideo(eb, false);\n            };\n            if ((this.pivots && this.pivots.page(cb))) {\n                return\n            };\n            g.inform(\"PhotoSnowlift.PAGE\");\n            ja.hide();\n            this.recacheData();\n            this.stream.moveCursor(cb);\n            m.hide(this.image);\n            if (this.stream.errorInCurrent()) {\n                this.setLoadingState(bb.STATE_HTML, true);\n                m.show(this.errorBox);\n                return;\n            }\n        ;\n            var fb = this.stream.getCurrentImageData();\n            if (fb) {\n                var gb = this.getImageURL(fb);\n                if (gb) {\n                    this.switchImage(gb, null, true);\n                }\n                 else if (fb.video) {\n                    this.switchVideo(fb.video, true);\n                }\n            ;\n                if (!db) {\n                    this.replaceUrl = true;\n                    wa(fb.info.permalink);\n                }\n            ;\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n            }\n             else {\n                this.setLoadingState(bb.STATE_IMAGE_PIXELS, true);\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            }\n        ;\n            if (this.stream.getCurrentHtml()) {\n                this.swapData();\n            }\n             else this.setLoadingState(bb.STATE_HTML, true);\n        ;\n            this.disableAds = this.disableAdsForSession;\n            this.loadAds();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            };\n        },\n        logImpressionDetailsForPhoto: function() {\n            var cb = [].concat(o.scry(oa(\"fbPhotoSnowliftTagList\"), \"input.photoImpressionDetails\"), o.scry(oa(\"fbPhotoSnowliftFeedback\"), \"input.photoImpressionDetails\"));\n            if ((cb.length === 0)) {\n                return\n            };\n            var db = {\n            };\n            for (var eb = 0; (eb < cb.length); eb++) {\n                db[cb[eb].name] = cb[eb].value;;\n            };\n            if (this.getVideoOnStage()) {\n                db.width = 0;\n                db.height = 0;\n            }\n             else {\n                var fb = this.getImageDimensions(this.stream.getCurrentImageData());\n                db.width = fb.x;\n                db.height = fb.y;\n            }\n        ;\n            ba.addDetailData(this.stream.getCursor(), db);\n            ca.setIsLogAdData(true);\n        },\n        loadAds: function() {\n            if (this.disableAds) {\n                return\n            };\n            ca.loadAdsFromUserActivity();\n        },\n        transitionHandler: function(cb) {\n            if ((((cb.getQueryData().closeTheater || cb.getQueryData().permPage) || cb.getQueryData().makeprofile) || this.returningToStart)) {\n                if (this.isOpen) {\n                    this.close();\n                };\n                this.transitionHandlerRegistered = false;\n                return false;\n            }\n        ;\n            if (this.replaceUrl) {\n                this.replaceUrl = false;\n                this._uriStack.push(cb.getQualifiedURI().toString());\n                y.transitionComplete(true);\n                return true;\n            }\n        ;\n            var db = this._uriStack.length;\n            if (((db >= 2) && (this._uriStack[(db - 2)] == cb.getQualifiedURI().toString()))) {\n                this._uriStack.pop();\n            };\n            var eb = this.stream.getCursorForURI(cb.getUnqualifiedURI().toString());\n            if (eb) {\n                var fb = this.stream.getRelativeMovement(eb);\n                this.page(fb, true);\n                y.transitionComplete(false);\n                return true;\n            }\n        ;\n            if (this.isOpen) {\n                y.transitionComplete(true);\n                this.close();\n                return true;\n            }\n        ;\n            this.transitionHandlerRegistered = false;\n            return false;\n        },\n        recacheData: function() {\n            if (!this.loadingStates.html) {\n                var cb = this.stream.getCurrentHtml();\n                for (var db in cb) {\n                    cb[db] = sa(oa(db).childNodes);\n                    o.empty(oa(db));\n                };\n            }\n        ;\n        },\n        reloadIfTimeout: function() {\n            if (!t.hasLoaded(this.image)) {\n                var cb = this.makeNewImage(this.image.src, true);\n                q.listen(cb, \"load\", this.useImage.bind(this, cb, null, true));\n            }\n        ;\n        },\n        useImage: function(cb, db, eb) {\n            if ((eb && t.hasLoaded(this.image))) {\n                return\n            };\n            o.replace(this.image, cb);\n            this.image = cb;\n            g.inform(\"Amoeba/instrument\", [this.image,\"image\",], g.BEHAVIOR_PERSISTENT);\n            this.adjustStageSize(db);\n        },\n        makeNewImage: function(cb, db) {\n            if (this.imageLoadingTimer) {\n                clearTimeout(this.imageLoadingTimer);\n                this.imageLoadingTimer = null;\n            }\n             else if (!db) {\n                this.imageRefreshTimer = setTimeout(this.reloadIfTimeout.bind(this), bb.LOADING_TIMEOUT);\n            }\n        ;\n            var eb = o.create(\"img\", {\n                className: \"spotlight\",\n                alt: \"\"\n            });\n            eb.setAttribute(\"aria-describedby\", \"fbPhotosSnowliftCaption\");\n            eb.setAttribute(\"aria-busy\", \"true\");\n            q.listen(eb, \"load\", pa(function() {\n                clearTimeout(this.imageRefreshTimer);\n                this.image.setAttribute(\"aria-busy\", \"false\");\n                this.setLoadingState(this.STATE_IMAGE_PIXELS, false);\n                (function() {\n                    if (this.isOpen) {\n                        this.adjustStageSize();\n                        this.adjustForNewData();\n                    }\n                ;\n                }).bind(this).defer();\n            }.bind(this), \"photo_theater\"));\n            eb.src = cb;\n            return eb;\n        },\n        switchImage: function(cb, db, eb) {\n            m.hide(this.image);\n            m.hide(this.errorBox);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            var fb = (this.stream && this.stream.getCurrentImageData());\n            if (fb) {\n                ba.addPhotoView(fb.info, this.shouldShowHiRes(fb), (this.fullscreen && r.isFullScreen()));\n            };\n            this.useImage(this.makeNewImage(cb, false), db, false);\n            if (eb) {\n                this.stream.preloadImages(this.shouldShowHiRes(fb));\n            };\n            if ((this.cropper && this.cropper.croppingMode)) {\n                this.cropper.resetPhoto();\n            };\n            g.inform(\"PhotoSnowlift.SWITCH_IMAGE\");\n        },\n        switchVideo: function(cb, db) {\n            var eb = (\"swf_\" + cb);\n            if (db) {\n                m.addClass(this.stageWrapper, \"showVideo\");\n                var fb = o.create(\"div\", {\n                    className: \"videoStageContainer\"\n                });\n                o.appendContent(this.videoStage, fb);\n                fb.id = cb;\n                if ((window[eb] && !va(eb))) {\n                    window[eb].write(cb);\n                };\n                var gb = (\"video_warning_\" + cb), hb = va(cb);\n                if (!this.videoWarnings) {\n                    this.videoWarnings = [];\n                };\n                if ((hb && this.videoWarnings[gb])) {\n                    o.setContent(hb, this.videoWarnings[gb]);\n                };\n                this.adjustStageSizeForVideo.bind(this, eb).defer();\n            }\n             else {\n                (window[eb] && window[eb].addVariable(\"video_autoplay\", 0));\n                (this.videoLoadTimer && clearTimeout(this.videoLoadTimer));\n                o.empty(this.videoStage);\n                m.removeClass(this.stageWrapper, \"showVideo\");\n            }\n        ;\n        },\n        checkVideoStatus: function(cb) {\n            if (this.videoLoadTimer) {\n                clearTimeout(this.videoLoadTimer);\n            };\n            var db = this.getVideoOnStage();\n            if (!db) {\n                return;\n            }\n             else {\n                var eb = (\"swf_\" + db);\n                if ((cb !== eb)) {\n                    return\n                };\n                this.adjustStageSizeForVideo(cb);\n            }\n        ;\n        },\n        adjustStageSizeForVideo: function(cb) {\n            var db = va(cb);\n            if (!db) {\n                this.videoLoadTimer = setTimeout(this.checkVideoStatus.bind(this, cb), 200);\n            }\n             else this.adjustStageSize(new na(db.width, db.height));\n        ;\n        },\n        handleServerError: function(cb, db) {\n            o.setContent(this.errorBox, cb);\n            this.storeFromData(db);\n        },\n        swapData: function() {\n            var cb, db = this.stream.getCurrentHtml();\n            if (db) {\n                this.setLoadingState(bb.STATE_HTML, false);\n                for (var eb in db) {\n                    cb = va(eb);\n                    (cb && o.setContent(cb, db[eb]));\n                };\n                g.inform(\"PhotoSnowlift.DATA_CHANGE\", this.stream.getCurrentImageData().info, g.BEHAVIOR_STATE);\n                if (this.stream.getCurrentExtraData()) {\n                    g.inform(\"PhotoSnowlift.EXTRA_DATA_CHANGE\", this.stream.getCurrentExtraData(), g.BEHAVIOR_STATE);\n                };\n            }\n        ;\n            this.adjustScroller();\n            this.adjustStageSize();\n            this.scrollableArea.showScrollbar(false);\n            this.adjustForNewData();\n            this.logImpressionDetailsForPhoto();\n            if (this.showFlashTags) {\n                this.flashAllTags();\n            };\n        },\n        updateTotalCount: function(cb, db, eb) {\n            var fb = this.stream.getCurrentHtml();\n            if (fb) {\n                var gb = oa(\"fbPhotoSnowliftPositionAndCount\");\n                o.replace(gb, eb);\n                gb = eb;\n                m.show(gb);\n                var hb = \"fbPhotoSnowliftPositionAndCount\";\n                fb[hb] = sa(gb.childNodes);\n            }\n        ;\n            this.stream.setTotalCount(cb);\n            this.stream.setFirstCursorIndex(db);\n        },\n        addPhotoFbids: function(cb, db, eb, fb) {\n            if (((fb && this.sessionID) && (fb != this.sessionID))) {\n                return\n            };\n            var gb = (this.stream.getCursor() === null);\n            this.stream.attachToFbidsList(cb, db, eb);\n            if ((eb && gb)) {\n                this.page(0, true);\n            };\n            if ((this.pivots && eb)) {\n                this.pivots.setCycleCount(this.stream.calculateDistance(this.stream.getCursor(), this.stream.firstCursor));\n            };\n            if ((!this.pagersShown && this.stream.canPage())) {\n                this.setStagePagersState(\"ready\");\n            };\n        },\n        attachTagger: function(cb) {\n            o.appendContent(this.stageActions, cb);\n        },\n        storeFromData: function(cb) {\n            if (!this.isOpen) {\n                return\n            };\n            if (((cb.ssid && this.sessionID) && (this.sessionID != cb.ssid))) {\n                return\n            };\n            var db = this.stream.storeToCache(cb);\n            if ((\"error\" in db)) {\n                this.checkState(bb.STATE_ERROR);\n                return;\n            }\n        ;\n            if ((\"init\" in db)) {\n                this.initDataFetched(db.init);\n                if (this.openExplicitly) {\n                    this.replaceUrl = true;\n                    wa(this.stream.getCurrentImageData().info.permalink);\n                }\n            ;\n                if (this.stream.canPage()) {\n                    this.setStagePagersState(\"ready\");\n                };\n                (this.ua && this.ua.add_event(\"ufi\"));\n            }\n        ;\n            if ((\"image\" in db)) {\n                this.checkState(bb.STATE_IMAGE_DATA);\n            };\n            if ((\"data\" in db)) {\n                this.checkState(bb.STATE_HTML);\n            };\n        },\n        setStagePagersState: function(cb) {\n            switch (cb) {\n              case \"ready\":\n                m.addClass(this.root, \"pagingReady\");\n                this.pagersShown = true;\n                (this.ua && this.ua.add_event(\"arrows\"));\n                return;\n              case \"active\":\n                m.addClass(this.root, \"pagingActivated\");\n                return;\n              case \"inactive\":\n                m.removeClass(this.root, \"pagingActivated\");\n                return;\n              case \"disabled\":\n            \n              case \"reset\":\n                m.removeClass(this.root, \"pagingReady\");\n                return;\n            };\n        },\n        deletePhoto: function(cb) {\n            this.closeRefresh();\n        },\n        closeRefresh: function() {\n            this.refreshOnClose = true;\n            this.closeHandler();\n        },\n        onHiliteTag: function(cb, db) {\n            if ((db.version != aa.VIEWER_SNOWLIFT)) {\n                return\n            };\n            var eb = db.tag;\n            if (eb) {\n                this.switchHilitedTags(eb, true);\n            };\n        },\n        onUpdateTagBox: function(cb, db) {\n            if ((db.version == aa.VIEWER_SNOWLIFT)) {\n                this.updateTagBox(db.id, db.approve);\n            };\n        }\n    });\n    e.exports = bb;\n});\n__d(\"Spotlight\", [\"JSXDOM\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"DOM\",\"Layer\",\"LayerAutoFocus\",\"LayerTabIsolation\",\"ModalLayer\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"DOM\"), l = b(\"Layer\"), m = b(\"LayerAutoFocus\"), n = b(\"LayerTabIsolation\"), o = b(\"ModalLayer\"), p = b(\"Vector\"), q = b(\"copyProperties\"), r = b(\"csx\"), s = b(\"cx\");\n    function t(v, w) {\n        this.parent.construct(this, v, w);\n        this.stageMinSize = new p(0, 0);\n        this.stagePadding = new p(0, 0);\n    };\n    j.extend(t, l);\n    q(t.prototype, i, {\n        stageMinSize: null,\n        stagePadding: null,\n        _buildWrapper: function(v, w) {\n            return (g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__root -cx-PRIVATE-ModalLayer__dark\"\n            }, g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__container\"\n            }, w)));\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([u,m,n,o,]);\n        },\n        getContentRoot: function() {\n            if (!this._content) {\n                this._content = k.find(this.getRoot(), \"div.-cx-PRIVATE-uiSpotlight__content\");\n            };\n            return this._content;\n        },\n        configure: function(v) {\n            if (v.stageMinSize) {\n                this.stageMinSize = v.stageMinSize;\n            };\n            if (v.stagePadding) {\n                this.stagePadding = v.stagePadding;\n            };\n        },\n        onContentLoaded: function() {\n            this.inform(\"content-load\");\n        },\n        updatePermalink: function(v) {\n            this.inform(\"permalinkchange\", v);\n        }\n    });\n    function u(v) {\n        this._layer = v;\n    };\n    q(u.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(v, w) {\n                if ((v === \"show\")) {\n                    h.inform(\"layer_shown\", {\n                        type: \"Spotlight\"\n                    });\n                }\n                 else h.inform(\"layer_hidden\", {\n                    type: \"Spotlight\"\n                });\n            ;\n            });\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        }\n    });\n    e.exports = t;\n});");
// 12161
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s8bb9444073d3f3b7fad0104a24a615c8a8f6b74d");
// 12162
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"+h1d2\",]);\n}\n;\n;\n__d(\"ImageUtils\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = {\n        hasLoaded: function(i) {\n            if (((i.naturalWidth !== undefined))) {\n                return ((i.complete && ((i.width !== 0))));\n            }\n             else if (((((((i.height == 20)) && ((i.width == 20)))) && i.complete))) {\n                return false;\n            }\n             else if (((((i.complete === undefined)) && ((g.webkit() < 500))))) {\n                var j = new JSBNG__Image();\n                j.src = i.src;\n                return j.complete;\n            }\n            \n            \n        ;\n        ;\n            return i.complete;\n        }\n    };\n    e.exports = h;\n});\n__d(\"PhotoEverstoreLogger\", [\"JSBNG__Event\",\"AsyncRequest\",\"copyProperties\",\"ImageUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"ImageUtils\"), k = {\n        BATCH_WINDOW_MS: 500,\n        storedLog: []\n    };\n    function l() {\n    \n    };\n;\n    i(l, {\n        _log: function(n) {\n            k.storedLog.push(n);\n            if (((k.storedLog.length == 1))) {\n                JSBNG__setTimeout(m, k.BATCH_WINDOW_MS, false);\n            }\n        ;\n        ;\n        },\n        logImmediately: function(n) {\n            l._log(n);\n        },\n        registerForLogging: function(n) {\n            if (j.hasLoaded(n)) {\n                l._log(n.src);\n            }\n             else g.listen(n, \"load\", function(JSBNG__event) {\n                l._log(n.src);\n            });\n        ;\n        ;\n        }\n    });\n    function m() {\n        var n = k.storedLog;\n        k.storedLog = [];\n        var o = JSON.stringify(n);\n        new h().setURI(\"/ajax/photos/logging/everstore_logging.php\").setData({\n            loggedUrls: o\n        }).setMethod(\"POST\").setOption(\"suppressErrorHandlerWarning\", true).setOption(\"suppressErrorAlerts\", true).send();\n    };\n;\n    e.exports = l;\n});\n__d(\"PhotoSessionLog\", [\"AsyncRequest\",\"Run\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Run\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k() {\n    \n    };\n;\n    j(k, {\n        UNKNOWN: 0,\n        ESC: 1,\n        X: 2,\n        OUTSIDE: 3,\n        UNLOAD: 4,\n        NAVIGATE: 5,\n        AGGREGATE: 6,\n        LEAVE: 7,\n        PERMALINK: 0,\n        SNOWLIFT: 6,\n        AGGREGATION_COUNT: 20,\n        set: null,\n        time: null,\n        views: 0,\n        fbidList: [],\n        details: {\n        },\n        width: 0,\n        height: 0,\n        first: false,\n        last: false,\n        logIds: false,\n        version: null,\n        source: null,\n        buttonLikes: 0,\n        pagingAction: \"\",\n        faceTagImpressions: 0,\n        cycle: false,\n        endOfRelevant: false,\n        relevantCount: 0,\n        initLogging: function(l) {\n            this.set = null;\n            this.time = new JSBNG__Date();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fullScreenViews = {\n            };\n            this.first = true;\n            this.last = false;\n            this.logIds = false;\n            this.version = l;\n            this.buttonLikes = 0;\n            this.pagingAction = \"\";\n            this.faceTagImpressions = 0;\n            this.cycle = false;\n            this.endOfRelevant = false;\n            this.relevantCount = 0;\n            if (((l === k.SNOWLIFT))) {\n                var m = i.getViewportDimensions();\n                this.width = m.x;\n                this.height = m.y;\n            }\n        ;\n        ;\n        },\n        setLogFbids: function(l) {\n            this.logIds = l;\n        },\n        setPhotoSet: function(l) {\n            this.set = l;\n        },\n        addButtonLike: function() {\n            this.buttonLikes++;\n        },\n        setPagingAction: function(l) {\n            this.pagingAction = l;\n        },\n        addFaceTagImpression: function() {\n            this.faceTagImpressions++;\n        },\n        setCycle: function(l) {\n            this.cycle = l;\n        },\n        setEndOfRelevant: function(l) {\n            this.endOfRelevant = l;\n        },\n        setRelevantCount: function(l) {\n            this.relevantCount = l;\n        },\n        setEndMetrics: function(l) {\n            this.endMetrics = l;\n        },\n        setSource: function(l) {\n            this.source = l;\n        },\n        addPhotoView: function(l, m, n) {\n            if (((this.logIds && ((this.views >= this.AGGREGATION_COUNT))))) {\n                this.logPhotoViews(this.AGGREGATE);\n            }\n        ;\n        ;\n            this.views++;\n            if (l) {\n                this.fbidList.push([l.fbid,l.owner,JSBNG__Date.now(),]);\n            }\n        ;\n        ;\n            if (m) {\n                this.hiResLoads++;\n            }\n        ;\n        ;\n            if (n) {\n                this.fullScreenViews[l.fbid] = true;\n            }\n        ;\n        ;\n        },\n        logEnterFullScreen: function(l) {\n            this.fullScreenViews[l] = true;\n        },\n        addDetailData: function(l, m) {\n            if (!this.details[l]) {\n                this.details[l] = {\n                    t: m.num_tags,\n                    l: m.has_location,\n                    c: m.has_caption,\n                    cm: m.comment_count,\n                    lk: m.like_count,\n                    w: m.width,\n                    h: m.height,\n                    ad: \"{}\",\n                    p: this.pagingAction\n                };\n            }\n        ;\n        ;\n        },\n        updateAdData: function(l, m) {\n            if (this.details[l]) {\n                this.details[l].ad = JSON.stringify(m);\n            }\n        ;\n        ;\n        },\n        logPhotoViews: function(l) {\n            if ((((!this.views) || ((((this.version === k.SNOWLIFT)) && ((l == k.LEAVE))))))) {\n                return;\n            }\n        ;\n        ;\n            if (((l != this.AGGREGATE))) {\n                this.last = true;\n            }\n        ;\n        ;\n            var m = {\n                set: this.set,\n                time: ((new JSBNG__Date() - this.time)),\n                fbids: ((this.logIds ? this.fbidList : [])),\n                details: ((this.logIds ? this.details : {\n                })),\n                first: this.first,\n                last: this.last,\n                close: ((l ? l : this.UNKNOWN)),\n                button_likes: this.buttonLikes,\n                version: this.version,\n                face_imp: this.faceTagImpressions,\n                endmetric: this.endMetrics,\n                cycle: this.cycle,\n                end_relev: this.endOfRelevant,\n                relev_count: this.relevantCount,\n                source: this.source\n            };\n            if (((this.version === k.SNOWLIFT))) {\n                var n = i.getViewportDimensions();\n                m.width = ((n.x || this.width));\n                m.height = ((n.y || this.height));\n                if (((this.hiResLoads > 0))) {\n                    m.hires_loads = this.hiResLoads;\n                }\n            ;\n            ;\n                if (this.last) {\n                    var o = Object.keys(this.fullScreenViews).length;\n                    if (((o > 0))) {\n                        m.fullscreen = o;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/photos/logging/session_logging.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", ((l != k.UNLOAD))).setOption(\"suppressErrorHandlerWarning\", true).setData(m).send();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fbidList = [];\n            this.details = {\n            };\n            this.first = false;\n            this.buttonLikes = 0;\n            if (this.last) {\n                this.set = null;\n                this.logIds = false;\n                this.fullScreenViews = {\n                };\n            }\n        ;\n        ;\n        }\n    });\n    h.onUnload(function() {\n        k.logPhotoViews(k.UNLOAD);\n    });\n    h.onLeave(function() {\n        k.logPhotoViews(k.LEAVE);\n    });\n    e.exports = k;\n});\n__d(\"PhotoViewerImage\", [\"PhotoEverstoreLogger\",\"URI\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"PhotoEverstoreLogger\"), h = b(\"URI\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._hiResDimensions = ((l.hiResDimensions && i.deserialize(l.hiResDimensions)));\n        this._normalDimensions = ((l.normalDimensions && i.deserialize(l.normalDimensions)));\n        this._info = l.info;\n        this._video = l.video;\n        this._shouldLog = l.everstoreLogThis;\n        this._hiResSrc = l.hiResSrc;\n        this._normalSrc = l.normalSrc;\n        this._thumbSrc = l.thumbSrc;\n        this._isInverted = false;\n        this._data = l;\n    };\n;\n    j(k.prototype, {\n        getURIString: function() {\n            return h(this._info.permalink).getUnqualifiedURI().toString();\n        },\n        hasHiResDimensions: function() {\n            return !!this._hiResDimensions;\n        },\n        getHiResDimensions: function() {\n            return this._hiResDimensions;\n        },\n        getNormalDimensions: function() {\n            return this._normalDimensions;\n        },\n        getHiResSrc: function() {\n            return this._hiResSrc;\n        },\n        getNormalSrc: function() {\n            return this._normalSrc;\n        },\n        getThumbSrc: function() {\n            return this._thumbSrc;\n        },\n        getInfo: function() {\n            return this._info;\n        },\n        getPermalink: function() {\n            return this._info.permalink;\n        },\n        getHighestResSrc: function() {\n            return ((this._hiResSrc || this._normalSrc));\n        },\n        preload: function(l) {\n            if (this.getHighestResSrc()) {\n                if (((l && !this._resource))) {\n                    this._resource = new JSBNG__Image();\n                    this._resource.src = this.getHighestResSrc();\n                    if (this._shouldLog) {\n                        g.logImmediately(this._resource.src);\n                    }\n                ;\n                ;\n                }\n                 else if (((!l && !this._small))) {\n                    this._small = new JSBNG__Image();\n                    this._small.src = ((this._normalSrc || this._hiResSrc));\n                    if (this._shouldLog) {\n                        g.logImmediately(this._small.src);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        setDimensions: function(l, m) {\n            this.widthRatio = ((l / this._hiResDimensions.x));\n            this.heightRatio = ((m / this._hiResDimensions.y));\n            this._hiResDimensions = this._hiResDimensions.mul(this.widthRatio, this.heightRatio);\n            this._normalDimensions = this._normalDimensions.mul(this.widthRatio, this.heightRatio);\n        },\n        invertDimensions: function() {\n            this._hiResDimensions = new i(this._hiResDimensions.y, this._hiResDimensions.x);\n            this._normalDimensions = new i(this._normalDimensions.y, this._normalDimensions.x);\n            this._isInverted = !this._isInverted;\n        },\n        copy: function() {\n            return new k(this._data);\n        }\n    });\n    e.exports = k;\n});\n__d(\"PhotosConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        VIEWER_PERMALINK: 0,\n        VIEWER_SNOWLIFT: 6,\n        VIEWER_VAULTBOX: 8,\n        BULK_EDITOR: 3,\n        FLASH_UPLOADER: 4,\n        HTML5_UPLOADER: 10,\n        SIZE_NORMAL: \"n\",\n        PIC_NORMAL_FBX_SIZE: 180\n    };\n    e.exports = g;\n});\n__d(\"PhotosUtils\", [\"copyProperties\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Vector\");\n    function i() {\n    \n    };\n;\n    g(i, {\n        getNearestBox: function(j, k) {\n            var l = Infinity, m = null;\n            {\n                var fin208keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin208i = (0);\n                var n;\n                for (; (fin208i < fin208keys.length); (fin208i++)) {\n                    ((n) = (fin208keys[fin208i]));\n                    {\n                        var o = j[n];\n                        if (o.contains(k)) {\n                            var p = k.distanceTo(o.getCenter());\n                            if (((p < l))) {\n                                l = p;\n                                m = n;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return m;\n        },\n        absoluteToNormalizedPosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.sub(l).mul(((100 / m.x)), ((100 / m.y)));\n            n.domain = \"pure\";\n            return n;\n        },\n        normalizedToAbsolutePosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.mul(((m.x / 100)), ((m.y / 100))).add(l);\n            n.domain = \"JSBNG__document\";\n            return n;\n        },\n        isFacebox: function(j) {\n            return j.match(/^face:/);\n        }\n    });\n    e.exports = i;\n});\n__d(\"PhotoStreamCache\", [\"DOM\",\"HTML\",\"PhotosConst\",\"PhotoEverstoreLogger\",\"PhotoViewerImage\",\"JSBNG__Rect\",\"UIPagelet\",\"URI\",\"Vector\",\"copyProperties\",\"createArrayFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"HTML\"), i = b(\"PhotosConst\"), j = b(\"PhotoEverstoreLogger\"), k = b(\"PhotoViewerImage\"), l = b(\"JSBNG__Rect\"), m = b(\"UIPagelet\"), n = b(\"URI\"), o = b(\"Vector\"), p = b(\"copyProperties\"), q = b(\"createArrayFrom\"), r = b(\"ge\");\n    function s() {\n    \n    };\n;\n    p(s, {\n        ERROR: \"error\",\n        HTML: \"html\",\n        IMAGE_DATA: \"image\",\n        EXTRA: \"extra\",\n        BUFFER_SIZE: 3,\n        INIT_BUCKET_SIZE: 4,\n        FULL_BUCKET_SIZE: 12,\n        ERROR_ID: -1,\n        INIT_PLACEHOLDER: 1\n    });\n    p(s.prototype, {\n        init: function(t, u, v) {\n            this.version = t;\n            this.pageletName = u;\n            this.pageletRootID = v;\n            this.bufferSize = s.BUFFER_SIZE;\n            this.fullBucketSize = s.FULL_BUCKET_SIZE;\n            this.initError = false;\n            this.isActive = true;\n            this.leftLock = false;\n            this.rightLock = false;\n            this.useAjaxPipe = true;\n            this.reset();\n        },\n        setUseAjaxPipe: function(t) {\n            this.useAjaxPipe = t;\n        },\n        reset: function() {\n            this.cache = {\n                image: {\n                },\n                extra: {\n                },\n                html: {\n                }\n            };\n            this.fbidList = [];\n            this.loaded = false;\n            this.allLoaded = false;\n            this.permalinkMap = {\n            };\n            this.position = 0;\n            this.totalCount = null;\n            this.firstCursor = null;\n            this.firstCursorIndex = null;\n        },\n        waitForInitData: function() {\n            this.fbidList.push(s.INIT_PLACEHOLDER);\n        },\n        destroy: function() {\n            this.reset();\n            this.isActive = false;\n        },\n        isLoaded: function() {\n            return this.loaded;\n        },\n        canPage: function() {\n            if (!this.isLoaded()) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.totalCount !== null))) {\n                return ((this.totalCount > 1));\n            }\n        ;\n        ;\n            return ((this.getLength() > 1));\n        },\n        errorInCurrent: function() {\n            if (this.initError) {\n                return true;\n            }\n             else if (!this.isLoaded()) {\n                return false;\n            }\n            \n        ;\n        ;\n            return this.checkErrorAt(this.getCursor());\n        },\n        getLength: function() {\n            return this.fbidList.length;\n        },\n        getPhotoSet: function() {\n            return this.photoSetQuery.set;\n        },\n        getPhotoSetQuery: function() {\n            return this.photoSetQuery;\n        },\n        getCurrentImageData: function() {\n            return this.getImageData(this.getCursor());\n        },\n        getImageData: function(t) {\n            return this.getCacheContent(t, s.IMAGE_DATA);\n        },\n        getCurrentHtml: function() {\n            return this.getCacheContent(this.getCursor(), s.HTML);\n        },\n        getCurrentExtraData: function() {\n            return this.getCacheContent(this.getCursor(), s.EXTRA);\n        },\n        getCacheContent: function(t, u) {\n            if (((((!t || ((t === s.ERROR_ID)))) || ((t === s.INIT_PLACEHOLDER))))) {\n                return null;\n            }\n        ;\n        ;\n            return this.cache[u][t];\n        },\n        getCursorPos: function() {\n            return this.position;\n        },\n        getCursor: function() {\n            if (((((this.position >= 0)) && ((this.position < this.getLength()))))) {\n                return this.fbidList[this.position];\n            }\n        ;\n        ;\n            return null;\n        },\n        getCursorForURI: function(t) {\n            return this.permalinkMap[t];\n        },\n        calculatePositionForMovement: function(t) {\n            var u = ((this.position + t));\n            if (this.allLoaded) {\n                var v = this.getLength();\n                u = ((((v + ((u % v)))) % v));\n            }\n        ;\n        ;\n            return u;\n        },\n        isValidMovement: function(t) {\n            if (((!this.isLoaded() || !this.canPage()))) {\n                return false;\n            }\n        ;\n        ;\n            var u = this.calculatePositionForMovement(t);\n            return ((((this.getCursor() > 0)) || ((((u >= 0)) && ((u < this.getLength()))))));\n        },\n        moveCursor: function(t) {\n            if (!this.isValidMovement(t)) {\n                return;\n            }\n        ;\n        ;\n            this.position = this.calculatePositionForMovement(t);\n            if (((t !== 0))) {\n                this.loadMoreIfNeccessary(((t > 0)));\n            }\n        ;\n        ;\n        },\n        checkErrorAt: function(t) {\n            if (!this.isLoaded()) {\n                return false;\n            }\n        ;\n        ;\n            if (((t === s.ERROR_ID))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        getRelativeMovement: function(t) {\n            for (var u = 0; ((u < this.getLength())); u++) {\n                if (((this.fbidList[u] == t))) {\n                    return ((u - this.position));\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        preloadImages: function(t) {\n            var u, v, w = this.getLength(), x = this.cache.image, y = s.BUFFER_SIZE;\n            if (((w > ((y * 2))))) {\n                u = ((((((this.position + w)) - ((y % w)))) % w));\n                v = ((((this.position + y)) % w));\n            }\n             else {\n                u = 0;\n                v = ((w - 1));\n            }\n        ;\n        ;\n            while (((u != v))) {\n                var z = this.fbidList[u];\n                if (((this.version === i.VIEWER_VAULTBOX))) {\n                    ((x[z] && x[z].preload(t)));\n                }\n                 else if (((x[z] && x[z].url))) {\n                    if (((t && !x[z].resource))) {\n                        x[z].resource = new JSBNG__Image();\n                        x[z].resource.src = x[z].url;\n                        if (((x[z].everstoreLogThis === true))) {\n                            j.logImmediately(x[z].resource.src);\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((!t && !x[z].small))) {\n                        x[z].small = new JSBNG__Image();\n                        x[z].small.src = ((x[z].smallurl || x[z].url));\n                        if (((x[z].everstoreLogThis === true))) {\n                            j.logImmediately(x[z].small.src);\n                        }\n                    ;\n                    ;\n                    }\n                    \n                ;\n                }\n                \n            ;\n            ;\n                u = ((((u + 1)) % w));\n            };\n        ;\n        },\n        loadMoreIfNeccessary: function(t) {\n            if (((((this.allLoaded || ((t && this.rightLock)))) || ((!t && this.leftLock))))) {\n                return;\n            }\n        ;\n        ;\n            var u = ((t ? 1 : -1)), v = ((this.position + ((this.bufferSize * u))));\n            if (((((v < 0)) && !this.checkErrorAt(this.getEndCursor(false))))) {\n                this.leftLock = true;\n                this.fetch(this.fullBucketSize, false);\n            }\n             else if (((((v > this.getLength())) && !this.checkErrorAt(this.getEndCursor(true))))) {\n                this.rightLock = true;\n                this.fetch(this.fullBucketSize, true);\n            }\n            \n        ;\n        ;\n        },\n        getEndCursor: function(t) {\n            return ((t ? this.fbidList[((this.getLength() - 1))] : this.fbidList[0]));\n        },\n        calculateRelativeIndex: function(t, u, v) {\n            if (!this.totalCount) {\n                return null;\n            }\n        ;\n        ;\n            var w = this.fbidList.indexOf(u), x = this.fbidList.indexOf(v);\n            if (((((w === -1)) || ((x === -1))))) {\n                return null;\n            }\n        ;\n        ;\n            var y = ((x - w));\n            return ((((((t + y)) + this.totalCount)) % this.totalCount));\n        },\n        calculateDistance: function(t, u) {\n            var v = this.fbidList.indexOf(t), w = this.fbidList.indexOf(u);\n            if (((((v === -1)) || ((w === -1))))) {\n                return null;\n            }\n        ;\n        ;\n            return ((((((w - v)) + this.getLength())) % this.getLength()));\n        },\n        fetch: function(t, u) {\n            var v = this.getEndCursor(u), w = p({\n                cursor: v,\n                version: this.version,\n                end: this.getEndCursor(!u),\n                fetchSize: ((u ? t : ((-1 * t)))),\n                relevant_count: this.relevantCount\n            }, this.photoSetQuery);\n            if (((this.totalCount && ((this.firstCursorIndex !== null))))) {\n                w.total = this.totalCount;\n                w.cursorIndex = this.calculateRelativeIndex(this.firstCursorIndex, this.firstCursor, v);\n            }\n        ;\n        ;\n            var x = r(this.pageletRootID);\n            if (!x) {\n                x = g.create(\"div\", {\n                    id: this.pageletRootID\n                });\n                g.appendContent(JSBNG__document.body, x);\n            }\n        ;\n        ;\n            m.loadFromEndpoint(this.pageletName, x, w, {\n                usePipe: this.useAjaxPipe,\n                automatic: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n            if (!this.useAjaxPipe) {\n                this.setUseAjaxPipe(true);\n            }\n        ;\n        ;\n        },\n        storeToCache: function(t) {\n            var u = {\n            };\n            if (!this.isActive) {\n                return u;\n            }\n        ;\n        ;\n            if (((\"error\" in t))) {\n                this.processErrorResult(t.error);\n                u.error = true;\n                return u;\n            }\n        ;\n        ;\n            if (((\"init\" in t))) {\n                this.processInitResult(t.init);\n                u.init = {\n                    logids: t.init.logids,\n                    fbid: t.init.fbid,\n                    loggedin: t.init.loggedin,\n                    fromad: t.init.fromad,\n                    disablesessionads: t.init.disablesessionads,\n                    flashtags: t.init.flashtags\n                };\n            }\n        ;\n        ;\n            if (((\"image\" in t))) {\n                this.processImageResult(t.image);\n                u.image = true;\n            }\n        ;\n        ;\n            if (((\"data\" in t))) {\n                this.processDataResult(t.data);\n                u.data = true;\n            }\n        ;\n        ;\n            return u;\n        },\n        processInitResult: function(t) {\n            if (this.loaded) {\n                return;\n            }\n        ;\n        ;\n            this.loaded = true;\n            this.photoSetQuery = t.query;\n            if (t.bufferSize) {\n                this.bufferSize = t.bufferSize;\n            }\n        ;\n        ;\n            if (t.fullBucketSize) {\n                this.fullBucketSize = t.fullBucketSize;\n            }\n        ;\n        ;\n            if (((this.fbidList.length === 0))) {\n                this.fbidList.push(t.fbid);\n                this.rightLock = true;\n            }\n             else {\n                var u = this.fbidList.indexOf(s.INIT_PLACEHOLDER);\n                if (((u != -1))) {\n                    this.fbidList[u] = t.fbid;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.firstCursor = t.fbid;\n            if (((((\"initIndex\" in t)) && ((\"totalCount\" in t))))) {\n                this.firstCursorIndex = t.initIndex;\n                this.totalCount = t.totalCount;\n            }\n        ;\n        ;\n            if (((this.version == i.VIEWER_PERMALINK))) {\n                this.fetch(s.INIT_BUCKET_SIZE, true);\n            }\n        ;\n        ;\n        },\n        processImageResult: function(t) {\n            {\n                var fin209keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin209i = (0);\n                var u;\n                for (; (fin209i < fin209keys.length); (fin209i++)) {\n                    ((u) = (fin209keys[fin209i]));\n                    {\n                        if (((((u === this.firstCursor)) && t[u].everstoreLogThis))) {\n                            j.logImmediately(t[u].url);\n                        }\n                    ;\n                    ;\n                        if (((this.version === i.VIEWER_VAULTBOX))) {\n                            var v = t[u];\n                            this.cache.image[u] = new k(v);\n                            this.permalinkMap[this.cache.image[u].getURIString()] = u;\n                        }\n                         else {\n                            this.cache.image[u] = t[u];\n                            if (t[u].dimensions) {\n                                this.cache.image[u].dimensions = o.deserialize(t[u].dimensions);\n                            }\n                        ;\n                        ;\n                            if (t[u].smalldims) {\n                                this.cache.image[u].smalldims = o.deserialize(t[u].smalldims);\n                            }\n                        ;\n                        ;\n                            this.permalinkMap[n(t[u].info.permalink).getUnqualifiedURI().toString()] = u;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        attachToFbidsList: function(t, u, v) {\n            if (this.allLoaded) {\n                return;\n            }\n        ;\n        ;\n            if (((u === -1))) {\n                for (var w = ((t.length - 1)); ((w >= 0)); w--) {\n                    this.fbidList.unshift(t[w]);\n                    this.position++;\n                };\n            ;\n                this.leftLock = false;\n            }\n             else {\n                for (var x = 0; ((x < t.length)); x++) {\n                    this.fbidList.push(t[x]);\n                ;\n                };\n            ;\n                this.rightLock = false;\n            }\n        ;\n        ;\n            if (v) {\n                this.setAllLoaded();\n            }\n        ;\n        ;\n        },\n        setAllLoaded: function() {\n            this.allLoaded = true;\n            if (((this.getCursor() === null))) {\n                this.position = this.calculatePositionForMovement(0);\n            }\n        ;\n        ;\n        },\n        processDataResult: function(t) {\n            {\n                var fin210keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin210i = (0);\n                var u;\n                for (; (fin210i < fin210keys.length); (fin210i++)) {\n                    ((u) = (fin210keys[fin210i]));\n                    {\n                        if (!this.cache.html[u]) {\n                            this.cache.html[u] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin211keys = ((window.top.JSBNG_Replay.forInKeys)((t[u].html))), fin211i = (0);\n                            var v;\n                            for (; (fin211i < fin211keys.length); (fin211i++)) {\n                                ((v) = (fin211keys[fin211i]));\n                                {\n                                    var w = t[u].html[v];\n                                    if (((typeof w === \"string\"))) {\n                                        w = h(w).getRootNode();\n                                    }\n                                ;\n                                ;\n                                    this.cache.html[u][v] = q(w.childNodes);\n                                };\n                            };\n                        };\n                    ;\n                        if (!((\"extra\" in t[u]))) {\n                            this.cache.extra[u] = null;\n                            continue;\n                        }\n                    ;\n                    ;\n                        this.cache.extra[u] = {\n                            tagRects: {\n                            }\n                        };\n                        if (!Array.isArray(t[u].extra.tagRects)) {\n                            {\n                                var fin212keys = ((window.top.JSBNG_Replay.forInKeys)((t[u].extra.tagRects))), fin212i = (0);\n                                var x;\n                                for (; (fin212i < fin212keys.length); (fin212i++)) {\n                                    ((x) = (fin212keys[fin212i]));\n                                    {\n                                        if (t[u].extra.tagRects[x]) {\n                                            this.cache.extra[u].tagRects[x] = l.deserialize(t[u].extra.tagRects[x]);\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        Object.keys(t[u].extra).forEach(function(y) {\n                            if (((y == \"tagRects\"))) {\n                                return;\n                            }\n                        ;\n                        ;\n                            this.cache.extra[u][y] = t[u].extra[y];\n                        }.bind(this));\n                    };\n                };\n            };\n        ;\n        },\n        processErrorResult: function(t) {\n            if (!this.isLoaded()) {\n                this.initError = true;\n                return;\n            }\n        ;\n        ;\n            var u = t.side, v = [s.ERROR_ID,];\n            this.attachToFbidsList(v, u);\n        },\n        setTotalCount: function(t) {\n            this.totalCount = t;\n        },\n        setFirstCursorIndex: function(t) {\n            this.firstCursorIndex = t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotoSnowliftAds\", [\"JSBNG__Event\",\"copyProperties\",\"CSS\",\"csx\",\"DataStore\",\"DOM\",\"PhotoSessionLog\",\"UIPagelet\",\"URI\",\"Vector\",\"extendArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"csx\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"PhotoSessionLog\"), n = b(\"UIPagelet\"), o = b(\"URI\"), p = b(\"Vector\"), q = b(\"extendArray\"), r = {\n        DEFAULT_UNITS_REFRESH_RATE: 30000,\n        UNITS_REGISTER_DELAY: 1000,\n        root: null,\n        availableDimensions: null,\n        loadQuery: null,\n        lastLoadTime: 0,\n        minAds: 100,\n        units: null,\n        isLogAdData: null,\n        displayedCallback: null,\n        refreshUnitsRate: null,\n        position: null,\n        adsStatus: \"null\",\n        adsEvents: {\n        },\n        snowliftRedesign: false,\n        resetEvents: function() {\n            this.adsStatus = \"reset\";\n            this.adsEvents = {\n            };\n        },\n        addEvent: function(s, t) {\n            if (t) {\n                this.adsStatus = s;\n            }\n        ;\n        ;\n            var u = JSBNG__Date.now();\n            this.adsEvents[((((s + \"_\")) + u))] = u;\n        },\n        init: function(s, t, u, v) {\n            this.reset();\n            this.root = s;\n            this.snowlift = t;\n            this.minAds = u.min_ads;\n            this.displayedCallback = v;\n            this.addEvent(\"init\", true);\n            this.snowliftRedesign = u.snowlift_redesign;\n            this.refreshUnitsRate = r.DEFAULT_UNITS_REFRESH_RATE;\n            if (u.refresh_fast) {\n                this.refreshUnitsRate = u.refresh_rate;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this.lastLoadTime = 0;\n            this.position = 0;\n            this.units = [];\n            this.resetEvents();\n            this.addEvent(\"reset\", true);\n        },\n        resize: function(s) {\n            this.availableDimensions = s;\n            this.loadQuery = this.snowlift.getLoadQuery();\n            this.processResize();\n        },\n        calculateUnitSizes: function(s, t, u) {\n            var v = {\n            };\n            s.forEach(function(w) {\n                var x = w.root.firstChild.offsetHeight;\n                w.units.forEach(function(z) {\n                    if (((!i.hasClass(z, \"hidden\") && !((this.getIsAds(z) && this.getIsHoldout(z)))))) {\n                        var aa = this.getHeight(z.firstChild, t);\n                        x -= aa;\n                    }\n                ;\n                ;\n                }.bind(this));\n                var y = {\n                    height: x,\n                    visible: false\n                };\n                w.units.forEach(function(z) {\n                    var aa = this.getIsAds(z), ba = this.getHeight(z.firstChild, t), ca = this.getUnitId(z), da = ((aa && this.getIsHoldout(z)));\n                    if (((da && u))) {\n                        return;\n                    }\n                ;\n                ;\n                    v[ca] = {\n                        height: ba,\n                        visible: false,\n                        priority: 0,\n                        is_ads: aa,\n                        is_holdout: da,\n                        section_ref: y\n                    };\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        calculateVisibleUnits: function(s, t, u) {\n            var v = 0, w = this.getUnitPriority(t);\n            w.forEach(function(x) {\n                if (t.hasOwnProperty(x)) {\n                    var y = t[x], z = y.height;\n                    if (!y.section_ref.visible) {\n                        z += y.section_ref.height;\n                    }\n                ;\n                ;\n                    y.height_below = ((u - z));\n                    y.visible = ((((y.height_below >= 0)) && ((z > 0))));\n                    if (y.visible) {\n                        y.section_ref.visible = true;\n                        u -= z;\n                        v++;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            return t;\n        },\n        displayUnits: function(s, t) {\n            s.forEach(function(u) {\n                var v = false, w = true;\n                u.units.forEach(function(x) {\n                    var y = this.getUnitId(x), z = t[y];\n                    if (!z) {\n                        return;\n                    }\n                ;\n                ;\n                    var aa = z.visible, ba = z.height_below, ca = z.is_ads;\n                    i.conditionClass(x, \"hidden\", !aa);\n                    if (((((ca && aa)) && w))) {\n                        var da = l.JSBNG__find(x, \"div.ego_unit\");\n                        i.addClass(da, \"ego_unit_no_top_border\");\n                        w = false;\n                    }\n                ;\n                ;\n                    v = ((v || aa));\n                    this.calcUnitStats(this.units[ca][y], aa, ba);\n                }.bind(this));\n                i.conditionClass(u.root, \"hidden\", !v);\n            }.bind(this));\n        },\n        getUnitsDisplayed: function(s, t) {\n            var u = 0;\n            s.forEach(function(v) {\n                v.units.forEach(function(w) {\n                    var x = this.getUnitId(w), y = t[x];\n                    if (((!y || !y.visible))) {\n                        return;\n                    }\n                ;\n                ;\n                    u++;\n                }.bind(this));\n            }.bind(this));\n            return u;\n        },\n        getHeightsRequired: function(s, t) {\n            var u = 0, v = [];\n            s.forEach(function(w) {\n                var x = false;\n                w.units.forEach(function(y) {\n                    var z = this.getUnitId(y), aa = t[z];\n                    if (!aa) {\n                        return;\n                    }\n                ;\n                ;\n                    u += aa.height;\n                    if (!x) {\n                        u += aa.section_ref.height;\n                        x = true;\n                    }\n                ;\n                ;\n                    v.push(u);\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        getUnitPriority: function(s) {\n            var t = [], u = 0, v = 0;\n            {\n                var fin213keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin213i = (0);\n                var w;\n                for (; (fin213i < fin213keys.length); (fin213i++)) {\n                    ((w) = (fin213keys[fin213i]));\n                    {\n                        var x = s[w];\n                        t.push(w);\n                        var y = ((((this.minAds + u)) + v));\n                        if (x.is_ads) {\n                            if (((v < this.minAds))) {\n                                y = v;\n                            }\n                        ;\n                        ;\n                            v++;\n                        }\n                         else u++;\n                    ;\n                    ;\n                        x.priority = y;\n                    };\n                };\n            };\n        ;\n            t = t.sort(function(z, aa) {\n                var ba = s[z], ca = s[aa];\n                return ((ba.priority - ca.priority));\n            }.bind(this));\n            return t;\n        },\n        updateUnitsStatus: function() {\n            var s = this.availableDimensions.x, t = this.availableDimensions.y, u = this.calculateUnitSizes(this.sections, s);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            {\n                var fin214keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin214i = (0);\n                var v;\n                for (; (fin214i < fin214keys.length); (fin214i++)) {\n                    ((v) = (fin214keys[fin214i]));\n                    {\n                        if (!u.hasOwnProperty(v)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var w = u[v];\n                        if (((!w.is_holdout || !w.visible))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var x = this.units[1][v];\n                        this.calcUnitStats(x, w.visible, w.height_below);\n                    };\n                };\n            };\n        ;\n            u = this.calculateUnitSizes(this.sections, s, true);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            this.displayUnits(this.sections, u);\n            if (this.displayedCallback) {\n                var y = this.getUnitsDisplayed(this.sections, u), z = this.getHeightsRequired(this.sections, u);\n                this.displayedCallback(y, z);\n            }\n        ;\n        ;\n        },\n        calcUnitStats: function(s, t, u) {\n            var v = JSBNG__Date.now();\n            if (s.visible) {\n                s.totalTime += ((v - s.lastShowTime));\n            }\n        ;\n        ;\n            if (((((s.trackingCode !== null)) && ((s.totalTime >= this.UNITS_REGISTER_DELAY))))) {\n                var w = s.trackingCode;\n                s.trackingCode = null;\n                this.registerImpression(w, s.registerUrl);\n            }\n        ;\n        ;\n            s.visible = t;\n            s.heightBelow = u;\n            s.lastShowTime = v;\n        },\n        prepareResize: function() {\n            var s = function(t) {\n                var u = l.create(\"div\", {\n                    className: \"JSBNG__inner\"\n                }), v = l.create(\"div\", {\n                    className: \"wrapper\"\n                }, u);\n                l.replace(t, v);\n                l.setContent(u, t);\n                return v;\n            };\n            this.sections = l.scry(this.root, \"div.ego_section\").map(function(t) {\n                return {\n                    root: s(t),\n                    units: l.scry(t, \"div.ego_unit\").map(s)\n                };\n            });\n        },\n        processResize: function() {\n            if (((((this.isLoading || ((this.lastLoadTime === 0)))) || ((this.availableDimensions === null))))) {\n                this.setLogData();\n                return;\n            }\n        ;\n        ;\n            this.updateUnitsStatus();\n            this.setLogData();\n            var s = this.nextRegisterTime();\n            if (((s !== Infinity))) {\n                this.processResize.bind(this).defer(s, true);\n            }\n        ;\n        ;\n        },\n        setIsLogAdData: function(s) {\n            this.isLogAdData = s;\n            this.addEvent(\"setIsLogAdData\", false);\n            this.setLogData();\n        },\n        setLogData: function() {\n            var s = this.snowlift.getImageId();\n            if (((this.isLogAdData && s))) {\n                var t = p.getElementDimensions(this.snowlift.getImage()), u = p.getElementDimensions(this.snowlift.getRHCHeader()), v = p.getElementDimensions(this.snowlift.getRHCBody()), w = p.getElementDimensions(this.snowlift.getRHCFooter()), x = {\n                    query_set: this.snowlift.getLoadQuery().set,\n                    window_x: window.JSBNG__innerWidth,\n                    window_y: window.JSBNG__innerHeight,\n                    image_x: t.x,\n                    image_y: t.y,\n                    header_x: u.x,\n                    header_y: u.y,\n                    body_x: v.x,\n                    body_y: v.y,\n                    footer_x: w.x,\n                    footer_y: w.y,\n                    ads_below_space: this.getAdsBelowSpace(),\n                    time: JSBNG__Date.now(),\n                    adsStatus: this.adsStatus,\n                    adsEvents: this.adsEvents,\n                    refreshRate: this.refreshUnitsRate,\n                    position: this.position\n                };\n                m.updateAdData(s, x);\n            }\n        ;\n        ;\n        },\n        getAdsBelowSpace: function() {\n            var s = [], t = this.units[1];\n            {\n                var fin215keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin215i = (0);\n                var u;\n                for (; (fin215i < fin215keys.length); (fin215i++)) {\n                    ((u) = (fin215keys[fin215i]));\n                    {\n                        if (((t.hasOwnProperty(u) && !this.getIsHoldout(this.getAdUnit(u))))) {\n                            s.push(t[u].heightBelow);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getIsAds: function(s) {\n            var t = l.scry(s, \"div.-cx-PUBLIC-fbAdUnit__root\");\n            return t.length;\n        },\n        getUnitId: function(s) {\n            if (this.getIsAds(s)) {\n                return this.getAdId(s);\n            }\n             else return this.getEgoId(s)\n        ;\n        },\n        getEgoId: function(s) {\n            var t = l.JSBNG__find(s, \"div.ego_unit\");\n            return t.getAttribute(\"data-ego-fbid\");\n        },\n        getAdData: function(s) {\n            var t = l.JSBNG__find(s, \"div.-cx-PUBLIC-fbAdUnit__root\"), u = t.getAttribute(\"data-ad\");\n            return ((((u && JSON.parse(u))) || {\n            }));\n        },\n        getAdId: function(s) {\n            return this.getAdData(s).adid;\n        },\n        getIsHoldout: function(s) {\n            return ((s && this.getAdData(s).holdout));\n        },\n        getAdUnit: function(s) {\n            if (!this.sections) {\n                return null;\n            }\n        ;\n        ;\n            var t = [];\n            this.sections.forEach(function(v) {\n                q(t, v.units);\n            });\n            for (var u = 0; ((u < t.length)); u++) {\n                if (((this.getIsAds(t[u]) && ((this.getAdId(t[u]) == s))))) {\n                    return t[u];\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        nextRegisterTime: function() {\n            var s = Infinity, t = h(h({\n            }, this.units[0]), this.units[1]);\n            {\n                var fin216keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin216i = (0);\n                var u;\n                for (; (fin216i < fin216keys.length); (fin216i++)) {\n                    ((u) = (fin216keys[fin216i]));\n                    {\n                        if (t.hasOwnProperty(u)) {\n                            var v = t[u];\n                            if (((((v.trackingCode !== null)) && v.visible))) {\n                                s = Math.min(s, ((this.UNITS_REGISTER_DELAY - v.totalTime)));\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getHeight: function(s, t) {\n            var u = k.get(s, \"height\");\n            if (((u && ((u.x === t))))) {\n                return u.y;\n            }\n        ;\n        ;\n            return this.cacheHeight(s, t);\n        },\n        cacheHeight: function(s, t) {\n            var u = {\n                x: t,\n                y: s.offsetHeight\n            };\n            k.set(s, \"height\", u);\n            return u.y;\n        },\n        loadAdsAndEgo: function() {\n            this.resetEvents();\n            this.addEvent(\"adsRequested\", true);\n            this.position++;\n            n.loadFromEndpoint(\"WebEgoPane\", this.root, {\n                pid: 34,\n                data: [this.loadQuery.set,this.getCursorFBID(this.loadQuery),this.snowliftRedesign,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        getCursorFBID: function(s) {\n            if (((s.v !== undefined))) {\n                return s.v;\n            }\n        ;\n        ;\n            if (((s.fbid !== undefined))) {\n                return s.fbid;\n            }\n        ;\n        ;\n            return \"0\";\n        },\n        unitsLoaded: function(s, t) {\n            var u;\n            if (t) {\n                u = \"/ai.php\";\n                this.addEvent(\"adsLoaded\", true);\n            }\n             else {\n                u = \"/ajax/ei.php\";\n                this.addEvent(\"egoLoaded\", true);\n            }\n        ;\n        ;\n            var v = {\n            };\n            {\n                var fin217keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin217i = (0);\n                var w;\n                for (; (fin217i < fin217keys.length); (fin217i++)) {\n                    ((w) = (fin217keys[fin217i]));\n                    {\n                        if (s.hasOwnProperty(w)) {\n                            v[w] = {\n                                trackingCode: s[w],\n                                totalTime: 0,\n                                lastShowTime: 0,\n                                heightBelow: -10000,\n                                visible: false,\n                                registerUrl: u\n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.units[t] = v;\n            if (t) {\n                this.waitForImages(this.imagesLoaded.bind(this));\n            }\n        ;\n        ;\n        },\n        imagesLoaded: function() {\n            this.prepareResize();\n            this.addEvent(\"imagesLoaded\", true);\n            this.lastLoadTime = JSBNG__Date.now();\n            this.isLoading = false;\n            this.processResize();\n            i.removeClass(this.root, \"loading\");\n        },\n        loadAdsFromUserActivity: function() {\n            var s = JSBNG__Date.now(), t = this.refreshUnitsRate;\n            if (((!this.isLoading && ((((s - this.lastLoadTime)) > t))))) {\n                i.addClass(this.root, \"loading\");\n                this.isLoading = true;\n                this.loadAdsAndEgo();\n            }\n        ;\n        ;\n        },\n        registerImpression: function(s, t) {\n            var u = l.create(\"div\", {\n                src: o(t).addQueryData({\n                    aed: s\n                }),\n                width: 0,\n                height: 0,\n                frameborder: 0,\n                scrolling: \"no\",\n                className: \"fbEmuTracking\"\n            });\n            u.setAttribute(\"aria-hidden\", \"true\");\n            l.appendContent(this.root, u);\n        },\n        waitForImages: function(s) {\n            var t = l.scry(this.root, \"img.img\"), u = t.length, v = u;\n            if (((v === 0))) {\n                s();\n            }\n        ;\n        ;\n            var w = function() {\n                v--;\n                if (((v === 0))) {\n                    s.defer();\n                }\n            ;\n            ;\n            };\n            for (var x = 0; ((x < u)); x++) {\n                var y = t[x];\n                if (y.complete) {\n                    w();\n                }\n                 else g.listen(y, {\n                    load: w,\n                    error: w,\n                    abort: w\n                });\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = r;\n});\n__d(\"PhotoViewer\", [\"Bootloader\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n        this.image = null;\n        this.root = null;\n        this.stream = null;\n    };\n;\n    h(j, {\n        bootstrap: function(k, l) {\n            g.loadModules([\"PhotoSnowlift\",], function(m) {\n                m.bootstrap(k, l);\n            });\n        }\n    });\n    h(j.prototype, {\n        getEventPrefix: i.thatReturnsNull,\n        getEventString: function(k) {\n            var l = this.getEventPrefix();\n            if (l) {\n                return ((((l + \".\")) + k));\n            }\n        ;\n        ;\n            return null;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getPosition: function() {\n            return ((this.stream ? this.stream.getCursor() : null));\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: i.thatReturnsNull,\n        getVersionConst: i.thatReturnsNull,\n        getViewerSource: i.thatReturnsNull,\n        getViewerSet: i.thatReturnsNull\n    });\n    e.exports = j;\n});\n__d(\"PhotoSnowlift\", [\"function-extensions\",\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"collectDataAttributes\",\"CSS\",\"Dialog\",\"DOM\",\"DOMControl\",\"JSBNG__Event\",\"FullScreen\",\"Input\",\"ImageUtils\",\"Keys\",\"Layer\",\"LinkController\",\"Locale\",\"PageTransitions\",\"Parent\",\"PhotosConst\",\"PhotoSessionLog\",\"PhotoSnowliftAds\",\"PhotoStreamCache\",\"PhotosUtils\",\"PhotoViewer\",\"JSBNG__Rect\",\"ScrollableArea\",\"Style\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserAgent\",\"Vector\",\"$\",\"asyncCallback\",\"computeRelativeURI\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"emptyFunction\",\"ge\",\"goURI\",\"shield\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMControl\"), q = b(\"JSBNG__Event\"), r = b(\"FullScreen\"), s = b(\"Input\"), t = b(\"ImageUtils\"), u = b(\"Keys\"), v = b(\"Layer\"), w = b(\"LinkController\"), x = b(\"Locale\"), y = b(\"PageTransitions\"), z = b(\"Parent\"), aa = b(\"PhotosConst\"), ba = b(\"PhotoSessionLog\"), ca = b(\"PhotoSnowliftAds\"), da = b(\"PhotoStreamCache\"), ea = b(\"PhotosUtils\"), fa = b(\"PhotoViewer\"), ga = b(\"JSBNG__Rect\"), ha = b(\"ScrollableArea\"), ia = b(\"Style\"), ja = b(\"Toggler\"), ka = b(\"UIPagelet\"), la = b(\"URI\"), ma = b(\"UserAgent\"), na = b(\"Vector\"), oa = b(\"$\"), pa = b(\"asyncCallback\"), qa = b(\"computeRelativeURI\"), ra = b(\"copyProperties\"), sa = b(\"createArrayFrom\"), ta = b(\"csx\"), ua = b(\"emptyFunction\"), va = b(\"ge\"), wa = b(\"goURI\"), xa = b(\"shield\"), ya = b(\"startsWith\"), za = b(\"tx\"), ab = b(\"userAction\");\n    function bb() {\n        this.parent.construct(this);\n    };\n;\n    ra(bb, {\n        STATE_ERROR: \"error\",\n        STATE_HTML: \"html\",\n        STATE_IMAGE_PIXELS: \"image_pixels\",\n        STATE_IMAGE_DATA: \"image\",\n        LOADING_TIMEOUT: 2000,\n        PAGER_FADE: 3000,\n        FULL_SCREEN_PADDING: 10,\n        STAGE_HIRES_MAX: {\n            x: 2048,\n            y: 2048\n        },\n        STAGE_NORMAL_MAX: {\n            x: 960,\n            y: 960\n        },\n        STAGE_MIN: {\n            x: 520,\n            y: 520\n        },\n        SIDEBAR_SIZE_MAX: 360,\n        STAGE_CHROME: {\n            x: 82,\n            y: 42\n        },\n        VIDEO_BOTTOM_BAR_SPACE: 40,\n        GOPREV_AREA: 120,\n        TIMELINE_STRETCH_WIDTH: 843,\n        TIMELINE_STRETCH_MIN: 480,\n        MIN_TAG_DISTANCE: 83,\n        PADDING_MIN: 40,\n        MIN_UFI_HEIGHT: 250,\n        COLLECTIONS_UNTAGGED_PHOTOS: 3,\n        PHOTOS_OF_YOU_SUGGESTIONS: 28,\n        MIN_ADS_VISIBLE: 1,\n        _instance: null,\n        getInstance: function() {\n            if (!bb._instance) {\n                bb._instance = new bb();\n            }\n        ;\n        ;\n            return bb._instance;\n        },\n        initWithSpotlight: function(cb, db) {\n            bb.getInstance().init(cb, db);\n        },\n        touch: ua,\n        addPhotoFbids: function(cb, db, eb, fb) {\n            bb.getInstance().addPhotoFbids(cb, db, eb, fb);\n        },\n        attachFollowFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachSubscribeFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachTagger: function(cb) {\n            bb.getInstance().attachTagger(cb);\n        },\n        preload: function(cb, db) {\n            bb.getInstance().preload(cb, db);\n        },\n        bootstrap: function(cb, db) {\n            if (((cb && la(cb).getQueryData().hasOwnProperty(\"share_id\")))) {\n                j.loadModules([\"SpotlightShareViewer\",], function(eb) {\n                    eb.bootstrap(cb, db);\n                });\n                return;\n            }\n        ;\n        ;\n            bb.getInstance().bootstrap(cb, db);\n        },\n        closeRefresh: function() {\n            bb.getInstance().closeRefresh();\n        },\n        deletePhoto: function(cb) {\n            bb.getInstance().deletePhoto(cb);\n        },\n        getImage: function() {\n            return bb.getInstance().getImage();\n        },\n        getImageId: function() {\n            return bb.getInstance().getImageId();\n        },\n        getLoadQuery: function() {\n            return bb.getInstance().getLoadQuery();\n        },\n        getRHCBody: function() {\n            return bb.getInstance().getRHCBody();\n        },\n        getRHCFooter: function() {\n            return bb.getInstance().getRHCFooter();\n        },\n        getRHCHeader: function() {\n            return bb.getInstance().getRHCHeader();\n        },\n        getRoot: function() {\n            return bb.getInstance().getRoot();\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            bb.getInstance().likePhotoSkipConfirmation(cb);\n        },\n        saveTagsFromPayload: function(cb) {\n            bb.getInstance().saveTagsFromPayload(cb);\n        },\n        saveTagsFromPayloadDelayed: function(cb) {\n            bb.saveTagsFromPayload.curry(cb).defer(2000);\n        },\n        handleServerError: function(cb, db) {\n            bb.getInstance().handleServerError(cb, db);\n        },\n        setVideoWarning: function(cb, db) {\n            var eb = bb.getInstance(), fb = ((\"video_warning_\" + cb));\n            if (!eb.videoWarnings) {\n                eb.videoWarnings = [];\n            }\n        ;\n        ;\n            eb.videoWarnings[fb] = db;\n        },\n        storeFromData: function(cb) {\n            bb.getInstance().storeFromData(cb);\n        },\n        swapData: function() {\n            bb.getInstance().swapData();\n        },\n        touchMarkup: ua,\n        updateTotalCount: function(cb, db, eb) {\n            bb.getInstance().updateTotalCount(cb, db, eb);\n        }\n    });\n    k.extend(bb, fa);\n    ra(bb.prototype, {\n        switchTimer: null,\n        imageRefreshTimer: null,\n        imageLoadingTimer: null,\n        lastPage: 0,\n        currentMinSize: null,\n        currentImageSize: null,\n        resetUriStack: true,\n        thumbSrc: null,\n        shouldStretch: false,\n        stageMax: bb.STAGE_NORMAL_MAX,\n        stageChrome: bb.STAGE_CHROME,\n        stagePagerPrev: null,\n        ua: null,\n        PhotoTagger: null,\n        showHover: false,\n        skipLikePhotoConfirmation: false,\n        isShowingLikePhotoConfirmation: false,\n        preload: function(cb, db) {\n            j.loadModules([\"PhotoTagger\",\"Live\",\"PhotoTagApproval\",\"PhotoTags\",\"TagTokenizer\",\"fb-photos-snowlift-fullscreen-css\",], function(fb) {\n                this.PhotoTagger = fb;\n            }.bind(this));\n            var eb = this.getImageSrc(la(cb).getQueryData());\n            if (eb) {\n                (new JSBNG__Image()).src = eb;\n            }\n        ;\n        ;\n        },\n        bootstrap: function(cb, db) {\n            if (((cb && la(cb).getQueryData().makeprofile))) {\n                this.enableCropperOnInit = true;\n                this.isUserProfilePic = la(cb).getQueryData().makeuserprofile;\n                this.isInProfilePicAlbum = la(cb).getQueryData().inprofilepicalbum;\n            }\n        ;\n        ;\n            this.preload(cb, db);\n            if (this.closeDirty) {\n                this.bootstrap.bind(this, cb, db).defer();\n                return;\n            }\n        ;\n        ;\n            ca.reset();\n            this.resetUriStack = true;\n            if (this.isOpen) {\n                if (this.openExplicitly) {\n                    this.closeCleanup();\n                    this.resetUriStack = false;\n                }\n                 else return\n            ;\n            }\n        ;\n        ;\n            this.ua = ab(\"snowlift\", db).uai(\"open\");\n            this.returningToStart = false;\n            ((this.loading && m.removeClass(this.loading, \"loading\")));\n            if (db) {\n                m.addClass((this.loading = db), \"loading\");\n                if (this.container) {\n                    var eb = z.byClass(db, \"uiStreamStory\");\n                    if (eb) {\n                        this.container.setAttribute(\"data-ownerid\", eb.id);\n                    }\n                     else this.container.removeAttribute(\"data-ownerid\");\n                ;\n                ;\n                }\n            ;\n            ;\n                this.getThumbAndSize(db);\n            }\n             else this.loading = null;\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.GO\", cb, g.BEHAVIOR_STATE);\n            this.loadFrameIfUninitialized();\n        },\n        getCurrentImageServerSizeDimensions: function() {\n            return this.stream.getCurrentImageData().dimensions;\n        },\n        getEventPrefix: function() {\n            return \"PhotoSnowlift\";\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: function() {\n            return \"snowlift\";\n        },\n        getViewerSource: function() {\n            return this.source;\n        },\n        getViewerSet: function() {\n            return this.stream.getPhotoSet();\n        },\n        getVersionConst: function() {\n            return aa.VIEWER_SNOWLIFT;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getImageId: function() {\n            return this.stream.getCursor();\n        },\n        getRHCHeader: function() {\n            return this.rhcHeader;\n        },\n        getRHCBody: function() {\n            return this.ufiForm;\n        },\n        getRHCFooter: function() {\n            return this.rhcFooter;\n        },\n        getLoadQuery: function() {\n            return this.loadQuery;\n        },\n        getCurrentPhotoInfo: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info;\n            }\n        ;\n        ;\n            return null;\n        },\n        getOwnerId: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info.owner;\n            }\n        ;\n        ;\n            return null;\n        },\n        getThumbAndSize: function(cb) {\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            var db = la(cb.getAttribute(\"ajaxify\")).getQueryData();\n            if (!db.size) {\n                return;\n            }\n        ;\n        ;\n            var eb = na.deserialize(db.size);\n            if (((!eb.x || !eb.y))) {\n                return;\n            }\n        ;\n        ;\n            this.currentImageSize = eb;\n            if (((((!m.hasClass(cb, \"uiMediaThumb\") && !m.hasClass(cb, \"uiPhotoThumb\"))) && !m.hasClass(cb, \"uiScaledThumb\")))) {\n                return;\n            }\n        ;\n        ;\n            if (cb.getAttribute(\"data-cropped\")) {\n                return;\n            }\n        ;\n        ;\n            var fb = o.scry(cb, \"img\")[0], gb = o.scry(cb, \"i\")[0], hb = z.byAttribute(cb, \"data-size\");\n            this.shouldStretch = ((((((((((((hb && this.currentImageSize)) && fb)) && ((hb.getAttribute(\"data-size\") === \"2\")))) && ((this.currentImageSize.x > this.currentImageSize.y)))) && ((this.currentImageSize.x <= bb.TIMELINE_STRETCH_WIDTH)))) && ((fb.offsetWidth === bb.TIMELINE_STRETCH_WIDTH))));\n            var ib;\n            if (fb) {\n                ib = fb.src;\n            }\n             else if (gb) {\n                ib = ia.get(gb, \"backgroundImage\").replace(/.*url\\(\"?([^\"]*)\"?\\).*/, \"$1\");\n            }\n             else return\n            \n        ;\n            this.thumbSrc = ib;\n        },\n        loadFrameIfUninitialized: function() {\n            if (this.root) {\n                return;\n            }\n        ;\n        ;\n            new i(\"/ajax/photos/snowlift/init.php\").setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n        },\n        init: function(cb, db) {\n            this.init = ua;\n            this.showHover = db.pivot_hover;\n            ba.setEndMetrics(db.pivot_end_metric);\n            this.enableSnowliftProfilePicCropper = db.snowlift_profile_pic_cropper;\n            this.pagersOnKeyboardNav = db.pagers_on_keyboard_nav;\n            this.hilitAllTagsAndBoxesOnHover = db.snowlift_hover_shows_all_tags_and_faces;\n            this.fullscreen = r.isSupported();\n            this.showOGVideos = db.og_videos;\n            this.resizeCommentsForAds = db.resize_comments_for_ads;\n            this.stageMax = bb.STAGE_HIRES_MAX;\n            this.spotlight = cb;\n            this.spotlight.subscribe(\"JSBNG__blur\", function() {\n                this.closingAction = ba.OUTSIDE;\n            }.bind(this));\n            this.spotlight.subscribe(\"hide\", xa(this.closeHandler, this));\n            this.spotlight.subscribe(\"key\", this.keyHandler.bind(this));\n            this.initializeNodes(this.spotlight.getRoot());\n            ca.init(this.sideAdUnit, this, db, this.adsDisplayedCallback.bind(this));\n            this.inAdsDisplayedCallback = false;\n            if (!this.subscription) {\n                w.registerHandler(this.handleNavigateAway.bind(this));\n                this.subscription = g.subscribe(\"PhotoSnowlift.GO\", function(eb, fb) {\n                    this.openExplicitly = true;\n                    ((this.loading && m.removeClass(this.loading, \"loading\")));\n                    this.open(fb);\n                }.bind(this));\n            }\n        ;\n        ;\n            this.transitionHandlerRegistered = false;\n            this.returningToStart = false;\n            y.registerHandler(this.openHandler.bind(this));\n            this.openHandlerRegistered = true;\n            g.subscribe(\"PhotoTagApproval.HILITE_TAG\", this.onHiliteTag.bind(this));\n            g.subscribe(\"PhotoTagApproval.UPDATE_TAG_BOX\", this.onUpdateTagBox.bind(this));\n            if (this.fullscreen) {\n                r.subscribe(\"changed\", this.onFullScreenChange.bind(this));\n            }\n        ;\n        ;\n        },\n        onFullScreenChange: function() {\n            var cb = r.isFullScreen();\n            m.conditionClass(JSBNG__document.body, \"fbPhotoSnowliftFullScreenMode\", cb);\n            if (cb) {\n                if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                    this.collapseRHC();\n                }\n            ;\n            ;\n                var db = this.stream.getCurrentImageData();\n                if (((((((db && db.url)) && ((this.image.src !== db.url)))) && this.shouldShowHiRes(db)))) {\n                    this.switchImage(db.url);\n                }\n            ;\n            ;\n                this.adjustForResize();\n            }\n             else {\n                this.uncollapseRHC();\n                if (((ma.chrome() && !m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")))) {\n                    this.page(0, false);\n                }\n            ;\n            ;\n                g.inform(\"reflow\");\n            }\n        ;\n        ;\n            ja.hide();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n        },\n        initializeNodes: function(cb) {\n            this.root = cb;\n            this.container = o.JSBNG__find(cb, \"div.fbPhotoSnowliftContainer\");\n            this.snowliftPopup = o.JSBNG__find(this.container, \"div.fbPhotoSnowliftPopup\");\n            this.rhc = o.JSBNG__find(this.snowliftPopup, \"div.rhc\");\n            this.rhcHeader = o.JSBNG__find(this.rhc, \"div.rhcHeader\");\n            this.rhcFooter = o.JSBNG__find(this.rhc, \"div.rhcFooter\");\n            this.ufiForm = o.JSBNG__find(this.rhc, \"form.fbPhotosSnowliftFeedbackForm\");\n            this.ufiInputContainer = o.JSBNG__find(this.rhc, \"div.fbPhotosSnowboxFeedbackInput\");\n            this.scroller = o.JSBNG__find(this.ufiForm, \"div.rhcScroller\");\n            this.scrollerBody = o.JSBNG__find(this.scroller, \"div.uiScrollableAreaBody\");\n            this.stageWrapper = o.JSBNG__find(this.snowliftPopup, \"div.stageWrapper\");\n            this.overlay = o.JSBNG__find(this.snowliftPopup, \"div.snowliftOverlay\");\n            this.errorBox = o.JSBNG__find(this.stageWrapper, \"div.stageError\");\n            this.image = o.JSBNG__find(this.stageWrapper, \"img.spotlight\");\n            this.stage = o.JSBNG__find(this.stageWrapper, \"div.stage\");\n            this.videoStage = o.JSBNG__find(this.stageWrapper, \"div.videoStage\");\n            this.prevPager = o.JSBNG__find(this.snowliftPopup, \"a.snowliftPager.prev\");\n            this.nextPager = o.JSBNG__find(this.snowliftPopup, \"a.snowliftPager.next\");\n            this.stageActions = o.JSBNG__find(cb, \"div.stageActions\");\n            this.buttonActions = o.JSBNG__find(this.stageActions, \"div.fbPhotosPhotoButtons\");\n            this.productMetadata = o.scry(this.rhc, \"div.fbPhotosSnowliftProductMetadata\").pop();\n            this.sideAdUnit = o.JSBNG__find(cb, \".-cx-PUBLIC-snowliftAds__root\");\n            g.inform(\"Amoeba/instrumentMulti\", [[this.container,\"snowlift\",],[this.rhc,\"rhc\",],[this.rhcHeader,\"rhc_header\",],[this.ufiForm,\"ufi_form\",],[this.ufiInputContainer,\"ufi_input\",],[this.prevPager,\"prev_pager\",],[this.nextPager,\"next_pager\",],[this.stageActions,\"stage_actions\",],[this.sideAdUnit,\"side_ads\",],], g.BEHAVIOR_PERSISTENT);\n            m.conditionClass(this.root, \"fullScreenAvailable\", this.fullscreen);\n        },\n        initializeScroller: function() {\n            this.initializeScroller = ua;\n            this.scrollableArea = ha.fromNative(this.scroller, {\n                fade: true,\n                persistent: true\n            });\n            var cb = function(JSBNG__event) {\n                var db = q.$E(JSBNG__event).getTarget();\n                if (o.contains(this.ufiInputContainer, db)) {\n                    var eb = p.getInstance(db);\n                    if (eb) {\n                        this.scrollableArea.scrollToBottom();\n                        var fb = eb.subscribe(\"resize\", function() {\n                            var hb = this.scrollableArea.isScrolledToBottom();\n                            this.adjustScroller();\n                            ((hb && this.scrollableArea.scrollToBottom()));\n                        }.bind(this)), gb = q.listen(db, \"JSBNG__blur\", function() {\n                            eb.unsubscribe(fb);\n                            gb.remove();\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this);\n            g.subscribe(\"ufi/changed\", function(db, eb) {\n                if (((this.ufiForm === eb.form))) {\n                    this.adjustScrollerIfNecessary();\n                }\n            ;\n            ;\n            }.bind(this));\n            g.subscribe(\"ufi/comment\", function(db, eb) {\n                if (((this.ufiForm === eb.form))) {\n                    if (eb.isranked) {\n                        this.scrollableArea.scrollToTop();\n                    }\n                     else this.scrollableArea.scrollToBottom();\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            q.listen(this.rhc, \"click\", function(JSBNG__event) {\n                var db = JSBNG__event.getTarget();\n                if (((((z.byTag(db, \"a\") || z.byTag(db, \"button\"))) || o.isNodeOfType(db, \"input\")))) {\n                    this.adjustScrollerIfNecessary();\n                }\n            ;\n            ;\n            }.bind(this));\n            g.subscribe([\"reflow\",\"CommentUFI.Pager\",], function() {\n                if (this.isOpen) {\n                    this.adjustScroller();\n                }\n            ;\n            ;\n            }.bind(this));\n            q.listen(this.ufiForm, \"focusin\", cb);\n        },\n        openHandler: function(cb) {\n            if (((((((((((this.isOpen || ((cb.getPath() != \"/photo.php\")))) || this.returningToStart)) || cb.getQueryData().closeTheater)) || cb.getQueryData().permPage)) || cb.getQueryData().makeprofile))) {\n                this.openHandlerRegistered = false;\n                return false;\n            }\n        ;\n        ;\n            this.open(cb);\n            this._uriStack.push(la(cb).getQualifiedURI().toString());\n            y.transitionComplete(true);\n            return true;\n        },\n        getImageSrc: function(cb) {\n            if (cb.smallsrc) {\n                if (!cb.size) {\n                    return cb.smallsrc;\n                }\n            ;\n            ;\n                var db = na.deserialize(cb.size), eb = this.getStageSize(db);\n                if (((((eb.x <= bb.STAGE_NORMAL_MAX.x)) && ((eb.y <= bb.STAGE_NORMAL_MAX.y))))) {\n                    return cb.smallsrc;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return cb.src;\n        },\n        open: function(cb) {\n            var db = la(cb).getQueryData(), eb = this.getImageSrc(db);\n            if (eb) {\n                delete db.src;\n                delete db.smallsrc;\n            }\n        ;\n        ;\n            if (this.resetUriStack) {\n                this._uriStack = [];\n            }\n        ;\n        ;\n            if (!this.initialLoad) {\n                db.firstLoad = true;\n                this.initialLoad = true;\n            }\n        ;\n        ;\n            this.sessionID = JSBNG__Date.now();\n            this.sessionPhotosHilited = {\n            };\n            this.loadQuery = ra(db, {\n                ssid: this.sessionID\n            });\n            this.isOpen = true;\n            this.pagersShown = false;\n            this.refreshOnClose = false;\n            this.hilitedTag = null;\n            this.loadingStates = {\n                image: false,\n                html: false\n            };\n            this.replaceUrl = false;\n            this.source = null;\n            this.saveTagSubscription = g.subscribe(\"PhotoTagger.SAVE_TAG\", this.onTagSaved.bind(this));\n            this.taggedPhotoIds = [];\n            this.stream = new da();\n            this.stream.init(aa.VIEWER_SNOWLIFT, \"PhotoViewerPagelet\", \"pagelet_photo_viewer\");\n            this.fetchInitialData();\n            this.setLoadingState(bb.STATE_HTML, true);\n            this.rhcCollapsed = false;\n            this._open(cb, eb);\n            if (this.enableSnowliftProfilePicCropper) {\n                j.loadModules([\"SnowliftPicCropper\",], function(fb) {\n                    this.cropper = fb.getInstance(this);\n                    this.cropper.init();\n                    if (this.enableCropperOnInit) {\n                        var gb = g.subscribe(\"PhotoSnowlift.SWITCH_IMAGE\", function() {\n                            if (this.isInProfilePicAlbum) {\n                                this.cropper.showPicInProfileAlbumDialog();\n                            }\n                             else this.cropper.enableCropping(this.isUserProfilePic);\n                        ;\n                        ;\n                            g.unsubscribe(gb);\n                        }.bind(this));\n                        this.enableCropperOnInit = false;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            j.loadModules([\"PhotosButtonTooltips\",], function(fb) {\n                fb.init();\n            });\n        },\n        _open: function(cb, db) {\n            this.createLoader(db);\n            this.spotlight.show();\n            ((this.ua && this.ua.add_event(\"frame\")));\n            g.inform(\"layer_shown\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.OPEN\");\n            this.stageHandlers = [q.listen(window, \"resize\", this.adjustForResize.bind(this)),q.listen(this.stageWrapper, \"click\", this.buttonListener.bind(this)),q.listen(this.stageWrapper, \"mouseleave\", function(JSBNG__event) {\n                var gb = JSBNG__event.getTarget();\n                if (!((((((((((((z.byClass(gb, \"snowliftOverlay\") || z.byClass(gb, \"fbPhotoSnowliftTagApproval\"))) || z.byClass(gb, \"tagPointer\"))) || z.byClass(gb, \"arrow\"))) || z.byClass(gb, \"faceboxSuggestion\"))) || z.byClass(gb, \"typeaheadWrapper\"))) || z.byClass(gb, \"photoTagTypeahead\")))) {\n                    this.unhiliteAllTags();\n                }\n            ;\n            ;\n                this.hidePagers();\n            }.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hilitePagerOnMouseMove.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hiliteTagsOnMouseMove.bind(this)),q.listen(this.overlay, \"mouseenter\", this.unhiliteAllTags.bind(this)),];\n            this.stageHandlers.push(q.listen(this.container, \"click\", function(JSBNG__event) {\n                var gb = JSBNG__event.getTarget();\n                if (z.byClass(gb, \"rotateRight\")) {\n                    this.rotate(\"right\");\n                }\n                 else if (z.byClass(gb, \"rotateLeft\")) {\n                    this.rotate(\"left\");\n                }\n                 else if (z.byClass(gb, \"closeTheater\")) {\n                    if (r.isFullScreen()) {\n                        r.toggleFullScreen();\n                        return;\n                    }\n                ;\n                ;\n                    this.closingAction = ba.X;\n                    this.closeHandler();\n                    return false;\n                }\n                 else if (this.fullscreen) {\n                    if (z.byClass(gb, \"fbPhotoSnowliftFullScreen\")) {\n                        this.toggleFullScreen();\n                    }\n                     else if (z.byClass(gb, \"fbPhotoSnowliftCollapse\")) {\n                        this.toggleCollapse();\n                    }\n                    \n                ;\n                }\n                \n                \n                \n            ;\n            ;\n            }.bind(this)));\n            var eb = va(\"fbPhotoSnowliftFeedback\");\n            if (eb) {\n                this.stageHandlers.push(q.listen(eb, \"click\", function(JSBNG__event) {\n                    var gb = JSBNG__event.getTarget();\n                    if (((z.byClass(gb, \"like_link\") || ((z.byClass(gb, \"UFILikeLink\") && z.byClass(gb, \"UIActionLinks\")))))) {\n                        this.toggleLikeButton();\n                    }\n                ;\n                ;\n                    var hb = z.byClass(JSBNG__event.getTarget(), \"uiUfiCollapsedComment\");\n                    if (hb) {\n                        m.addClass(hb, \"uiUfiCollapsedCommentToggle\");\n                    }\n                ;\n                ;\n                }.bind(this)));\n            }\n        ;\n        ;\n            var fb = va(\"fbPhotoSnowliftOnProfile\");\n            if (fb) {\n                this.stageHandlers.push(q.listen(fb, \"click\", function(JSBNG__event) {\n                    if (z.byClass(JSBNG__event.getTarget(), \"fbPhotoRemoveFromProfileLink\")) {\n                        this.refreshOnClose = true;\n                    }\n                ;\n                ;\n                }.bind(this)));\n            }\n        ;\n        ;\n            if (this.resetUriStack) {\n                this.startingURI = la.getMostRecentURI().addQueryData({\n                    closeTheater: 1\n                }).getUnqualifiedURI();\n            }\n        ;\n        ;\n            if (!db) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            }\n        ;\n        ;\n            if (!this.transitionHandlerRegistered) {\n                y.registerHandler(this.transitionHandler.bind(this));\n                this.transitionHandlerRegistered = true;\n            }\n        ;\n        ;\n            ba.initLogging(ba.SNOWLIFT);\n            if (this.pivots) {\n                ba.setRelevantCount(this.pivots.relevantCount);\n            }\n        ;\n        ;\n        },\n        toggleFullScreen: function() {\n            var cb = r.toggleFullScreen(JSBNG__document.documentElement);\n            if (cb) {\n                var db = this.stream.getCurrentImageData();\n                if (((((((db && db.url)) && ((this.image.src !== db.url)))) && this.shouldShowHiRes(db)))) {\n                    (new JSBNG__Image()).src = db.url;\n                }\n            ;\n            ;\n                ba.logEnterFullScreen(this.stream.getCursor());\n            }\n        ;\n        ;\n        },\n        getStream: function() {\n            return this.stream;\n        },\n        fetchInitialData: function() {\n            ((this.ua && this.ua.add_event(\"init_data\")));\n            this.stream.waitForInitData();\n            var cb = l(this.container, [\"ft\",]);\n            if (((((((cb && cb.ft)) && cb.ft.ei)) && this.loadQuery))) {\n                this.loadQuery.ei = cb.ft.ei;\n            }\n        ;\n        ;\n            ka.loadFromEndpoint(\"PhotoViewerInitPagelet\", va(\"pagelet_photo_viewer_init\", this.root), this.loadQuery, {\n                usePipe: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n        },\n        toggleCollapse: function() {\n            if (this.rhcCollapsed) {\n                this.uncollapseRHC();\n            }\n             else this.collapseRHC();\n        ;\n        ;\n        },\n        collapseRHC: function() {\n            this.rhcCollapsed = true;\n            m.addClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        uncollapseRHC: function() {\n            this.rhcCollapsed = false;\n            m.removeClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        closeHandler: function() {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            this.closingAction = ((this.closingAction || ba.ESC));\n            if (((la.getMostRecentURI().addQueryData({\n                closeTheater: 1\n            }).getUnqualifiedURI().toString() == this.startingURI.toString()))) {\n                this.close();\n                return;\n            }\n        ;\n        ;\n            this.returnToStartingURI(this.refreshOnClose);\n            this.close();\n        },\n        returnToStartingURI: function(cb, db) {\n            if (!cb) {\n                if (db) {\n                    this.squashNextTransition(wa.curry(db));\n                }\n                 else this.squashNextTransition();\n            ;\n            }\n        ;\n        ;\n            this.returningToStart = true;\n            var eb = g.subscribe(\"page_transition\", (function() {\n                this.returningToStart = false;\n                eb.unsubscribe();\n            }).bind(this)), fb = ((cb || isNaN(ma.JSBNG__opera()))), gb = this._uriStack.length;\n            if (((fb && ((gb < window.JSBNG__history.length))))) {\n                window.JSBNG__history.go(-gb);\n            }\n             else {\n                var hb = this.startingURI, ib = new la(hb).removeQueryData(\"closeTheater\");\n                if (((((hb.getQueryData().sk == \"approve\")) && ((hb.getPath() == \"/profile.php\"))))) {\n                    ib.removeQueryData(\"highlight\");\n                    ib.removeQueryData(\"notif_t\");\n                }\n            ;\n            ;\n                wa(ib);\n            }\n        ;\n        ;\n        },\n        squashNextTransition: function(cb) {\n            this.squashNext = true;\n            y.registerHandler(function db() {\n                if (this.squashNext) {\n                    this.squashNext = false;\n                    if (cb) {\n                        cb.defer();\n                    }\n                ;\n                ;\n                    y.transitionComplete(true);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            }.bind(this), 7);\n        },\n        handleNavigateAway: function(cb) {\n            var db = qa(y._most_recent_uri.getQualifiedURI(), cb.getAttribute(\"href\"));\n            if (((this.isOpen && ya(db.getPath(), \"/hashtag/\")))) {\n                this.close();\n                y.transitionComplete(true);\n                this.squashNextTransition();\n                y.go(this.startingURI);\n                return true;\n            }\n        ;\n        ;\n            if (((((((this.isOpen && ((db instanceof la)))) && ((db.getUnqualifiedURI().toString() != this.startingURI.toString())))) && ((db.getPath() != \"/photo.php\"))))) {\n                if (!this.closingAction) {\n                    this.closingAction = ba.NAVIGATE;\n                }\n            ;\n            ;\n                this.returnToStartingURI(false, db);\n                this.close();\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        postProcessTaggedPhotos: function() {\n            if (((this.taggedPhotoIds && ((this.taggedPhotoIds.length > 0))))) {\n                var cb = null;\n                if (((this.source === bb.COLLECTIONS_UNTAGGED_PHOTOS))) {\n                    cb = \"/ajax/photos/photo/edit/skiptag/\";\n                }\n                 else if (((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS))) {\n                    cb = \"/ajax/photos/photo/add_to_star_grid/\";\n                }\n                \n            ;\n            ;\n                if (cb) {\n                    new i().setURI(cb).setAllowCrossPageTransition(true).setData({\n                        media_id: this.taggedPhotoIds\n                    }).send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        onTagSaved: function(cb, db) {\n            if (this.taggedPhotoIds) {\n                if (((((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS)) && !db.self_tag))) {\n                    return;\n                }\n            ;\n            ;\n                this.taggedPhotoIds.push(db.photo_fbid);\n            }\n        ;\n        ;\n        },\n        close: function() {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            this.isOpen = false;\n            if (this.fullscreen) {\n                r.disableFullScreen();\n            }\n        ;\n        ;\n            ab(\"snowlift\").uai(\"close\");\n            ((this.cropper && this.cropper.disableCropping()));\n            this.spotlight.hide();\n            this.openExplicitly = false;\n            this.postProcessTaggedPhotos();\n            g.unsubscribe(this.saveTagSubscription);\n            this.taggedPhotoIds = [];\n            this.closeDirty = true;\n            this.closeCleanup.bind(this).defer();\n        },\n        closeCleanup: function() {\n            this.closeDirty = false;\n            m.removeClass(this.root, \"dataLoading\");\n            ba.logPhotoViews(this.closingAction);\n            this.destroy();\n            m.hide(this.errorBox);\n            m.hide(this.image);\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            this.shouldStretch = false;\n            this.resetUriStack = true;\n            m.removeClass(this.stageWrapper, \"showVideo\");\n            o.empty(this.videoStage);\n            this.uncollapseRHC();\n            this.currentMinSize = null;\n            this.rhcMinHeight = null;\n            this.setStagePagersState(\"reset\");\n            this.recacheData();\n            o.empty(this.sideAdUnit);\n            this.stream.destroy();\n            var cb = ((this.closingAction === ba.NAVIGATE));\n            this.closingAction = null;\n            if (!this.openHandlerRegistered) {\n                y.registerHandler(this.openHandler.bind(this));\n                this.openHandlerRegistered = true;\n            }\n        ;\n        ;\n            g.inform(\"layer_hidden\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.CLOSE\", cb);\n            this.root.setAttribute(\"aria-busy\", \"true\");\n        },\n        createLoader: function(cb) {\n            if (((this.currentImageSize === null))) {\n                this.adjustStageSize(bb.STAGE_MIN);\n            }\n             else {\n                var db = this.getStageSize(this.currentImageSize);\n                db = new na(Math.max(db.x, bb.STAGE_MIN.x), Math.max(db.y, bb.STAGE_MIN.y));\n                var eb = this.getImageSizeInStage(this.currentImageSize, db);\n                if (((this.thumbSrc === null))) {\n                    this.adjustStageSize(eb);\n                }\n                 else this.useImage(o.create(\"img\", {\n                    className: \"spotlight\",\n                    alt: \"\",\n                    src: this.thumbSrc,\n                    style: {\n                        width: ((eb.x + \"px\")),\n                        height: ((eb.y + \"px\"))\n                    }\n                }), eb, false);\n            ;\n            ;\n            }\n        ;\n        ;\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            if (cb) {\n                (function() {\n                    var fb = new JSBNG__Image(), gb = q.listen(fb, \"load\", pa(function() {\n                        if (!this.isOpen) {\n                            return;\n                        }\n                    ;\n                    ;\n                        if (((!this.stream || !this.stream.errorInCurrent()))) {\n                            this.switchImage(cb, this.currentImageSize);\n                            ((this.ua && this.ua.add_event(\"image\")));\n                            this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                        }\n                    ;\n                    ;\n                    }.bind(this), \"photo_theater\"));\n                    g.subscribeOnce(\"PhotoSnowlift.PAGE\", gb.remove.bind(gb));\n                    fb.src = cb;\n                }).bind(this).defer();\n            }\n        ;\n        ;\n            m.hide(this.stageActions);\n            this.setStagePagersState(\"disabled\");\n        },\n        initDataFetched: function(cb) {\n            ba.setPhotoSet(this.stream.getPhotoSet());\n            ba.setLogFbids(cb.logids);\n            var db = this.stream.getCurrentImageData();\n            ba.addPhotoView(db.info, this.shouldShowHiRes(db), ((this.fullscreen && r.isFullScreen())));\n            var eb = this.stream.getCurrentExtraData();\n            if (((eb && ((eb.source !== undefined))))) {\n                this.source = parseInt(eb.source, 10);\n                ba.setSource(this.source);\n            }\n        ;\n        ;\n            if (!this.pageHandlers) {\n                this.pageHandlers = [q.listen(this.root, \"click\", this.pageListener.bind(this)),q.listen(this.root, \"mouseleave\", this.mouseLeaveListener.bind(this)),];\n            }\n        ;\n        ;\n            m.show(this.stageActions);\n            this.root.setAttribute(\"aria-busy\", \"false\");\n            this.isLoggedInViewer = cb.loggedin;\n            this.disableAdsForSession = ((cb.disablesessionads || !this.isLoggedInViewer));\n            this.showFlashTags = !!cb.flashtags;\n            this.disableAds = ((this.disableAdsForSession || cb.fromad));\n            this.loadAds();\n        },\n        adjustScrollerIfNecessary: function() {\n            JSBNG__clearTimeout(this.scrollerTimeout);\n            this.scrollerTimeout = this.adjustScroller.bind(this).defer();\n        },\n        adjustScroller: function(cb) {\n            JSBNG__clearTimeout(this.scrollerTimeout);\n            this.initializeScroller();\n            this.scrollableArea.resize();\n            var db = na.getElementDimensions(this.rhc), eb = db.y;\n            eb -= na.getElementDimensions(this.rhcHeader).y;\n            eb -= na.getElementDimensions(this.ufiInputContainer).y;\n            if (this.productMetadata) {\n                var fb = na.getElementDimensions(this.productMetadata);\n                if (((fb.x !== 0))) {\n                    eb -= fb.y;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((cb == null))) {\n                cb = 0;\n            }\n        ;\n        ;\n            this.rhcMinHeight = ((db.y - ((eb - bb.MIN_UFI_HEIGHT))));\n            eb = Math.max(0, eb);\n            var gb = na.getElementDimensions(this.scrollerBody).y, hb = Math.max(bb.MIN_UFI_HEIGHT, ((eb - cb)));\n            if (((gb >= hb))) {\n                ia.set(this.scroller, \"height\", ((hb + \"px\")));\n                if (((eb > hb))) {\n                    m.removeClass(this.rhc, \"pinnedUfi\");\n                    eb -= hb;\n                }\n                 else {\n                    m.addClass(this.rhc, \"pinnedUfi\");\n                    eb = 0;\n                }\n            ;\n            ;\n            }\n             else {\n                ia.set(this.scroller, \"height\", \"auto\");\n                m.removeClass(this.rhc, \"pinnedUfi\");\n                eb -= gb;\n            }\n        ;\n        ;\n            var ib = o.scry(this.scrollerBody, \"li.UFIFirstComponent\");\n            if (((ib.length === 0))) {\n                var jb = o.scry(this.ufiInputContainer, \"li.UFIAddComment\");\n                if (((jb.length !== 0))) {\n                    m.addClass(jb[0], \"UFIFirstComponent\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var kb = na.getElementDimensions(this.ufiInputContainer).y;\n            ia.set(this.ufiForm, \"padding-bottom\", ((kb + \"px\")));\n            ca.resize(new na(db.x, eb));\n            this.scrollableArea.adjustGripper();\n        },\n        adjustForResize: function() {\n            this.currentMinSize = null;\n            this.adjustStageSize();\n            this.adjustForNewData();\n        },\n        shouldShowHiRes: function(cb) {\n            if (((!cb || !cb.smallurl))) {\n                return false;\n            }\n        ;\n        ;\n            var db = this.getStageSize(cb.dimensions), eb = this.getImageSizeInStage(cb.dimensions, db);\n            return ((((eb.x > bb.STAGE_NORMAL_MAX.x)) || ((eb.y > bb.STAGE_NORMAL_MAX.y))));\n        },\n        getImageURL: function(cb) {\n            if (cb.video) {\n                return null;\n            }\n             else if (((cb.smallurl && !this.shouldShowHiRes(cb)))) {\n                return cb.smallurl;\n            }\n            \n        ;\n        ;\n            return cb.url;\n        },\n        getImageDimensions: function(cb) {\n            if (((cb.smalldims && ((!this.shouldShowHiRes(cb) || ((this.image.src === cb.smallurl))))))) {\n                return cb.smalldims;\n            }\n        ;\n        ;\n            return cb.dimensions;\n        },\n        getStageSize: function(cb, db) {\n            var eb = na.getViewportDimensions(), fb = new na(cb.x, cb.y);\n            if (db) {\n                fb = new na(Math.max(cb.x, db.x), Math.max(cb.y, db.y));\n            }\n        ;\n        ;\n            var gb, hb;\n            if (((this.fullscreen && r.isFullScreen()))) {\n                return new na(((this.rhcCollapsed ? JSBNG__screen.width : ((JSBNG__screen.width - bb.SIDEBAR_SIZE_MAX)))), ((JSBNG__screen.height - ((bb.FULL_SCREEN_PADDING * 2)))));\n            }\n             else {\n                gb = Math.min(fb.x, this.stageMax.x, ((((eb.x - bb.SIDEBAR_SIZE_MAX)) - bb.STAGE_CHROME.x)));\n                hb = Math.min(fb.y, this.stageMax.y, ((eb.y - bb.STAGE_CHROME.y)));\n            }\n        ;\n        ;\n            if (((((gb === 0)) && ((hb === 0))))) {\n                return new na(0, 0);\n            }\n        ;\n        ;\n            var ib = ((gb / hb)), jb = ((fb.x / fb.y));\n            if (((ib < jb))) {\n                return new na(gb, Math.round(((gb / jb))));\n            }\n        ;\n        ;\n            return new na(Math.round(((hb * jb))), hb);\n        },\n        getImageSizeInStage: function(cb, db) {\n            var eb = cb.x, fb = cb.y;\n            if (((((eb >= db.x)) || ((fb >= db.y))))) {\n                var gb = ((db.x / db.y)), hb = ((eb / fb));\n                if (((gb < hb))) {\n                    eb = db.x;\n                    fb = Math.round(((eb / hb)));\n                }\n                 else if (((gb > hb))) {\n                    fb = db.y;\n                    eb = Math.round(((fb * hb)));\n                }\n                 else {\n                    eb = db.x;\n                    fb = db.y;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return new na(eb, fb);\n        },\n        adjustStageSize: function(cb) {\n            var db = this.currentImageSize;\n            if (cb) {\n                db = cb;\n            }\n             else {\n                var eb = ((this.stream && this.stream.getCurrentImageData()));\n                if (eb) {\n                    db = this.getImageDimensions(eb);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!db) {\n                return;\n            }\n        ;\n        ;\n            this.currentImageSize = db;\n            var fb = 0;\n            if (((((((((this.shouldStretch && !this.getVideoOnStage())) && ((db.x > db.y)))) && ((db.x <= bb.TIMELINE_STRETCH_WIDTH)))) && ((db.x >= bb.TIMELINE_STRETCH_MIN))))) {\n                db.y = Math.round(((((db.y * bb.TIMELINE_STRETCH_WIDTH)) / db.x)));\n                db.x = bb.TIMELINE_STRETCH_WIDTH;\n            }\n             else if (this.getVideoOnStage()) {\n                fb = ((bb.VIDEO_BOTTOM_BAR_SPACE * 2));\n            }\n            \n        ;\n        ;\n            var gb = this.getStageSize(db, this.currentMinSize);\n            if (!this.currentMinSize) {\n                this.currentMinSize = new na(0, 0);\n            }\n        ;\n        ;\n            if (!this.rhcMinHeight) {\n                this.rhcMinHeight = 0;\n            }\n        ;\n        ;\n            this.currentMinSize = new na(Math.max(gb.x, bb.STAGE_MIN.x, this.currentMinSize.x), Math.max(gb.y, bb.STAGE_MIN.y, this.currentMinSize.y));\n            var hb = this.getImageSizeInStage(db, this.currentMinSize), ib = ((this.currentMinSize.x - hb.x)), jb = ((this.currentMinSize.y - hb.y));\n            if (((((ib > 0)) && ((ib < bb.PADDING_MIN))))) {\n                this.currentMinSize.x -= ib;\n            }\n             else if (((((jb > 0)) && ((jb < bb.PADDING_MIN))))) {\n                this.currentMinSize.y -= jb;\n            }\n            \n        ;\n        ;\n            var kb = o.scry(this.productMetadata, \"#fbPhotoSnowliftTaggedProducts .taggee\");\n            if (kb.length) {\n                this.currentMinSize.y = Math.max(this.currentMinSize.y, this.rhcMinHeight);\n            }\n        ;\n        ;\n            var lb = ((this.currentMinSize.x + bb.SIDEBAR_SIZE_MAX));\n            if (this.rhcCollapsed) {\n                lb = this.currentMinSize.x;\n            }\n        ;\n        ;\n            this.snowliftPopup.style.cssText = ((((((((((\"width:\" + lb)) + \"px;\")) + \"height:\")) + this.currentMinSize.y)) + \"px;\"));\n            var mb = ((((this.currentMinSize.y - fb)) + \"px\"));\n            if (((ma.firefox() || ((ma.ie() < 8))))) {\n                var nb = ia.get(this.stageWrapper, \"font-size\");\n                if (((ma.ie() && ((nb.indexOf(\"px\") < 0))))) {\n                    var ob = o.create(\"div\");\n                    ob.style.fontSize = nb;\n                    ob.style.height = \"1em\";\n                    nb = ob.style.pixelHeight;\n                }\n            ;\n            ;\n                mb = ((((((this.currentMinSize.y - fb)) / parseFloat(nb))) + \"em\"));\n            }\n        ;\n        ;\n            this.stageWrapper.style.cssText = ((((((((((\"width:\" + this.currentMinSize.x)) + \"px;\")) + \"line-height:\")) + mb)) + \";\"));\n            if (((ma.ie() < 8))) {\n                ia.set(this.root, \"height\", ((na.getViewportDimensions().y + \"px\")));\n                ia.set(this.container, \"min-height\", ((((this.currentMinSize.y + bb.STAGE_CHROME.y)) + \"px\")));\n            }\n        ;\n        ;\n            this.image.style.cssText = ((((((((((\"width:\" + hb.x)) + \"px;\")) + \"height:\")) + hb.y)) + \"px;\"));\n            var pb = this.getTagger();\n            if (pb) {\n                pb.repositionTagger();\n            }\n        ;\n        ;\n            this.adjustScrollerIfNecessary();\n        },\n        adjustForNewData: function() {\n            if (!this.image) {\n                return;\n            }\n        ;\n        ;\n            var cb = o.scry(this.stage, \"div.tagsWrapper\")[0], db = na.getElementDimensions(this.image);\n            if (cb) {\n                ia.set(cb, \"width\", ((db.x + \"px\")));\n                ia.set(cb, \"height\", ((db.y + \"px\")));\n                if (((ma.ie() <= 7))) {\n                    var eb = o.scry(this.root, \"div.tagContainer\")[0];\n                    if (eb) {\n                        m.conditionClass(cb, \"ie7VerticalFix\", ((na.getElementDimensions(eb).y > db.y)));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        adsDisplayedCallback: function(cb, db) {\n            if (((((((((((this.resizeCommentsForAds && !this.inAdsDisplayedCallback)) && !this.disableAds)) && ((bb.MIN_ADS_VISIBLE > 0)))) && ((cb < bb.MIN_ADS_VISIBLE)))) && ((db.length >= bb.MIN_ADS_VISIBLE))))) {\n                this.inAdsDisplayedCallback = true;\n                var eb = db[((bb.MIN_ADS_VISIBLE - 1))];\n                this.adjustScroller(eb);\n                this.inAdsDisplayedCallback = false;\n            }\n        ;\n        ;\n        },\n        setLoadingState: function(cb, db) {\n            switch (cb) {\n              case bb.STATE_IMAGE_PIXELS:\n                m.conditionClass(this.root, \"imagePixelsLoading\", db);\n                break;\n              case bb.STATE_IMAGE_DATA:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"imageLoading\", db);\n                break;\n              case bb.STATE_HTML:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"dataLoading\", db);\n                this.rhc.setAttribute(\"aria-busy\", ((db ? \"true\" : \"false\")));\n                break;\n            };\n        ;\n        },\n        destroy: function() {\n            this.stageHandlers.forEach(function(cb) {\n                cb.remove();\n            });\n            if (this.pageHandlers) {\n                this.pageHandlers.forEach(function(cb) {\n                    cb.remove();\n                });\n                this.pageHandlers = null;\n            }\n        ;\n        ;\n        },\n        checkState: function(cb) {\n            if (((((cb != bb.STATE_ERROR)) && !this.loadingStates[cb]))) {\n                return;\n            }\n        ;\n        ;\n            switch (cb) {\n              case bb.STATE_IMAGE_DATA:\n                var db = this.stream.getCurrentImageData();\n                if (db) {\n                    var eb = this.getImageURL(db);\n                    if (eb) {\n                        this.switchImage(eb, null, true);\n                    }\n                     else if (db.video) {\n                        this.switchVideo(db.video, true);\n                    }\n                    \n                ;\n                ;\n                    this.setLoadingState(cb, false);\n                }\n            ;\n            ;\n                break;\n              case bb.STATE_HTML:\n                if (this.stream.getCurrentHtml()) {\n                    this.swapData();\n                    this.showPagers(bb.PAGER_FADE);\n                    this.setLoadingState(cb, false);\n                }\n            ;\n            ;\n                break;\n              default:\n                if (this.stream.errorInCurrent()) {\n                    m.hide(this.image);\n                    m.show(this.errorBox);\n                }\n            ;\n            ;\n                break;\n            };\n        ;\n        },\n        buttonListener: function(JSBNG__event) {\n            var cb = JSBNG__event.getTarget(), db = JSBNG__Date.now();\n            if (z.byClass(cb, \"fbPhotoTagApprovalBox\")) {\n                return;\n            }\n        ;\n        ;\n            if (z.byClass(cb, \"fbPhotosCornerWantButton\")) {\n                JSBNG__event.JSBNG__stop();\n                return;\n            }\n        ;\n        ;\n            if (((((db - this.lastPage)) < 350))) {\n                return;\n            }\n        ;\n        ;\n            if (z.byClass(cb, \"fbPhotosPhotoLike\")) {\n                this.likePhoto();\n            }\n             else if (z.byClass(cb, \"tagApproveIgnore\")) {\n                this.updateTagBox(JSBNG__event, cb);\n            }\n            \n        ;\n        ;\n        },\n        likePhoto: function() {\n            ba.addButtonLike();\n            var cb = oa(\"fbPhotoSnowliftFeedback\"), db = o.scry(cb, \"button.like_link\")[0];\n            if (!db) {\n                db = o.scry(cb, \"a.UFILikeLink\")[0];\n            }\n        ;\n        ;\n            var eb = db.getAttribute(\"href\");\n            if (r.isFullScreen()) {\n                if (ma.chrome()) {\n                    db.setAttribute(\"href\", \"javascript:;\");\n                }\n            ;\n            }\n        ;\n        ;\n            db.click();\n            db.setAttribute(\"href\", eb);\n        },\n        toggleLikeButton: function() {\n            var cb = o.scry(this.buttonActions, \"a.fbPhotosPhotoLike\")[0];\n            if (cb) {\n                var db = o.JSBNG__find(this.root, \".likeCount\"), eb = o.JSBNG__find(db, \".likeCountNum\");\n                if (db) {\n                    if (m.hasClass(cb, \"viewerLikesThis\")) {\n                        o.setContent(eb, ((parseInt(eb.textContent, 10) - 1)));\n                    }\n                     else o.setContent(eb, ((parseInt(eb.textContent, 10) + 1)));\n                ;\n                }\n            ;\n            ;\n                m.toggleClass(cb, \"viewerLikesThis\");\n                m.removeClass(cb, \"viewerAlreadyLikedThis\");\n            }\n        ;\n        ;\n        },\n        likePhotoWithKey: function() {\n            if (this.isShowingLikePhotoConfirmation) {\n                return;\n            }\n        ;\n        ;\n            if (this.skipLikePhotoConfirmation) {\n                this.likePhoto();\n            }\n             else h.send(new i(\"/photos/confirm_like.php\"), function(cb) {\n                this.isShowingLikePhotoConfirmation = true;\n                cb.subscribe(\"JSBNG__confirm\", this.onCloseLikePhotoConfirmDialog.bind(this));\n                cb.subscribe(\"cancel\", this.onCloseLikePhotoConfirmDialog.bind(this));\n            }.bind(this));\n        ;\n        ;\n            return false;\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            this.skipLikePhotoConfirmation = cb;\n            this.likePhoto();\n        },\n        onCloseLikePhotoConfirmDialog: function() {\n            this.isShowingLikePhotoConfirmation = false;\n        },\n        updateTagBox: function(cb, db) {\n            this.unhiliteAllTags();\n            var eb = va(cb);\n            if (!eb) {\n                return;\n            }\n        ;\n        ;\n            m.addClass(eb, \"tagBox\");\n            m.addClass(eb, \"tagBoxPendingResponse\");\n            m.removeClass(eb, \"tagBoxPending\");\n            m.hide(o.JSBNG__find(eb, \"span.tagForm\"));\n            if (db) {\n                m.show(o.JSBNG__find(eb, \"span.tagApproved\"));\n            }\n             else m.show(o.JSBNG__find(eb, \"span.tagIgnored\"));\n        ;\n        ;\n        },\n        rotate: function(cb) {\n            var db = this.stream.getCursor();\n            if (this.getVideoOnStage()) {\n                var eb = ((((cb == \"left\")) ? 270 : 90));\n                j.loadModules([\"VideoRotate\",], function(gb) {\n                    new gb(db).motionRotate(eb);\n                });\n                return;\n            }\n        ;\n        ;\n            var fb = ra({\n                fbid: db,\n                cs_ver: aa.VIEWER_SNOWLIFT\n            }, this.stream.getPhotoSetQuery());\n            fb[cb] = 1;\n            this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            m.hide(this.image);\n            new i(\"/ajax/photos/photo/rotate/\").setAllowCrossPageTransition(true).setData(fb).setErrorHandler(this.rotationError.bind(this, db)).setFinallyHandler(this.rotationComplete.bind(this, db)).setMethod(\"POST\").setReadOnly(false).send();\n        },\n        rotationComplete: function(cb, db) {\n            if (((cb == this.stream.getCursor()))) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                this.swapData();\n            }\n        ;\n        ;\n        },\n        rotationError: function(cb, db) {\n            if (((cb == this.stream.getCursor()))) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                j.loadModules([\"AsyncResponse\",], function(eb) {\n                    eb.defaultErrorHandler(db);\n                });\n            }\n        ;\n        ;\n        },\n        saveTagsFromPayload: function(cb) {\n            this.storeFromData(cb);\n            if (((((\"data\" in cb)) && ((this.stream.getCursor() in cb.data))))) {\n                this.swapData();\n            }\n        ;\n        ;\n        },\n        saveEdit: function() {\n            if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                return;\n            }\n        ;\n        ;\n            j.loadModules([\"PhotoInlineEditor\",\"Form\",], function(cb, db) {\n                var eb = cb.getInstance(this.getViewerConst());\n                ((eb && db.bootstrap(eb.getForm().controller)));\n            }.bind(this));\n        },\n        mouseLeaveListener: function(JSBNG__event) {\n            this.unhiliteAllTags();\n            this.reHilitePendingTag();\n        },\n        hilitePagerOnMouseMove: function(JSBNG__event) {\n            var cb = na.getEventPosition(JSBNG__event), db = na.getElementPosition(this.stage);\n            if (x.isRTL()) {\n                var eb = na.getElementDimensions(this.stage);\n                this.stagePagerPrev = ((((eb.x - ((cb.x - db.x)))) < bb.GOPREV_AREA));\n            }\n             else this.stagePagerPrev = ((((cb.x - db.x)) < bb.GOPREV_AREA));\n        ;\n        ;\n            m.conditionClass(this.prevPager, \"hilightPager\", this.stagePagerPrev);\n            m.conditionClass(this.nextPager, \"hilightPager\", !this.stagePagerPrev);\n            var fb, gb = JSBNG__event.getTarget();\n            if (((((!z.byClass(gb, \"snowliftOverlay\") && !z.byClass(gb, \"bottomBarActions\"))) && !z.byClass(gb, \"snowliftPager\")))) {\n                fb = bb.PAGER_FADE;\n            }\n        ;\n        ;\n            this.showPagers(fb);\n        },\n        showPagers: function(cb) {\n            JSBNG__clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"active\");\n            if (((typeof cb !== \"undefined\"))) {\n                this.fadePagerTimer = this.hidePagers.bind(this).defer(cb);\n            }\n        ;\n        ;\n        },\n        hidePagers: function() {\n            var cb = o.scry(this.getRoot(), \".fbPhotosPhotoActionsMenu\")[0];\n            if (cb) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"inactive\");\n        },\n        getTagger: function() {\n            if (!this.PhotoTagger) {\n                return null;\n            }\n        ;\n        ;\n            var cb = this.PhotoTagger.getInstance(aa.VIEWER_SNOWLIFT);\n            if (((!cb || !cb.tagHoverFacebox))) {\n                return null;\n            }\n        ;\n        ;\n            return cb;\n        },\n        hiliteAllBoxes: function() {\n            o.scry(this.stage, \"div.tagsWrapper div.faceBox\").forEach(function(cb) {\n                m.addClass(cb, \"otherActive\");\n            });\n        },\n        flashAllTags: function() {\n            var cb = this.stream.getCurrentImageData().info.fbid;\n            if (this.sessionPhotosHilited[cb]) {\n                return;\n            }\n        ;\n        ;\n            o.scry(this.stage, \"div.tagsWrapper div.tagBox\").forEach(function(db) {\n                m.addClass(db, \"hover\");\n            });\n            this.sessionPhotosHilited[cb] = true;\n            this.unhiliteTimer = this.unhiliteAllTags.bind(this).defer(2000, true);\n        },\n        unhiliteAllTags: function() {\n            JSBNG__clearTimeout(this.unhiliteTimer);\n            o.scry(this.stage, \"div.tagsWrapper div.hover\").forEach(function(db) {\n                m.removeClass(db, \"hover\");\n            });\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                o.scry(this.stage, \"div.tagsWrapper div.otherActive\").forEach(function(db) {\n                    m.removeClass(db, \"otherActive\");\n                });\n            }\n        ;\n        ;\n            this.hilitedTag = null;\n            if (!m.hasClass(this.root, \"taggingMode\")) {\n                var cb = this.getTagger();\n                if (cb) {\n                    cb.hideTagger();\n                    cb.setCurrentFacebox(null);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        switchHilitedTags: function(cb, db) {\n            if (((this.switchTimer !== null))) {\n                JSBNG__clearTimeout(this.switchTimer);\n                this.switchTimer = null;\n            }\n        ;\n        ;\n            this.unhiliteAllTags();\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                this.hiliteAllBoxes();\n            }\n        ;\n        ;\n            var eb = va(cb);\n            if (eb) {\n                this.hilitedTag = cb;\n                if (((!m.hasClass(this.root, \"taggingMode\") && ea.isFacebox(this.hilitedTag)))) {\n                    var fb = this.getTagger();\n                    if (fb) {\n                        m.addClass(eb, \"hover\");\n                        var gb = fb.getFacebox(cb);\n                        fb.setCurrentFacebox(gb);\n                        if (gb) {\n                            fb.addTagFromFacebox(gb);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n                 else m.addClass(eb, \"hover\");\n            ;\n            ;\n                if (((((m.hasClass(eb, \"tagBoxPending\") && !m.hasClass(eb, \"showPendingTagName\"))) && ((db === true))))) {\n                    o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\").forEach(function(hb) {\n                        m.removeClass(hb, \"showPendingTagName\");\n                    });\n                    m.addClass(eb, \"showPendingTagName\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        reHilitePendingTag: function() {\n            var cb = va(this.hilitedTag);\n            if (((cb && m.hasClass(cb, \"showPendingTagName\")))) {\n                return;\n            }\n        ;\n        ;\n            var db = o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\")[0];\n            if (db) {\n                this.switchHilitedTags(db.id);\n            }\n        ;\n        ;\n        },\n        hiliteTagsOnMouseMove: function(JSBNG__event) {\n            if (((!this.stream.getCurrentExtraData() || this.getVideoOnStage()))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.switchTimer !== null))) {\n                return;\n            }\n        ;\n        ;\n            var cb = JSBNG__event.getTarget();\n            if (((((((((((((z.byClass(cb, \"snowliftOverlay\") || z.byClass(cb, \"fbPhotoSnowliftTagApproval\"))) || z.byClass(cb, \"tagPointer\"))) || z.byClass(cb, \"arrow\"))) || z.byClass(cb, \"faceboxSuggestion\"))) || z.byClass(cb, \"typeaheadWrapper\"))) || z.byClass(cb, \"photoTagTypeahead\")))) {\n                return;\n            }\n        ;\n        ;\n            var db = z.byClass(cb, \"tagBoxPending\"), eb = false;\n            if (this.hilitedTag) {\n                var fb = va(this.hilitedTag);\n                eb = ((fb && m.hasClass(fb, \"tagBoxPending\")));\n            }\n        ;\n        ;\n            var gb = ((((!this.hilitedTag && db)) || ((!eb && db))));\n            if (gb) {\n                this.switchHilitedTags(db.id);\n                return;\n            }\n        ;\n        ;\n            if (((db && ((db.id == this.hilitedTag))))) {\n                return;\n            }\n        ;\n        ;\n            var hb = 250, ib = ea.absoluteToNormalizedPosition(this.image, na.getEventPosition(JSBNG__event));\n            if (this.currentTagHasPrecedence(ib)) {\n                return;\n            }\n        ;\n        ;\n            var jb = ea.getNearestBox(this.stream.getCurrentExtraData().tagRects, ib);\n            if (!jb) {\n                if (!eb) {\n                    this.unhiliteAllTags();\n                    this.reHilitePendingTag();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var kb = null;\n            if (eb) {\n                var lb = {\n                };\n                lb[this.hilitedTag] = this.stream.getCurrentExtraData().tagRects[this.hilitedTag];\n                kb = ea.getNearestBox(lb, ib);\n            }\n        ;\n        ;\n            if (((((kb !== null)) && eb))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.hilitedTag != jb))) {\n                if (eb) {\n                    this.switchTimer = this.switchHilitedTags.bind(this, jb).defer(hb);\n                }\n                 else {\n                    if (this.showHover) {\n                        if (!this.seenTags) {\n                            this.seenTags = [];\n                        }\n                    ;\n                    ;\n                        if (!this.seenTags[jb]) {\n                            ba.addFaceTagImpression();\n                            this.seenTags[jb] = true;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    this.switchHilitedTags(jb);\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        currentTagHasPrecedence: function(cb) {\n            if (!this.hilitedTag) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.stream.getCurrentExtraData().tagRects[this.hilitedTag] === undefined))) {\n                this.hilitedTag = null;\n                return false;\n            }\n        ;\n        ;\n            var db = this.stream.getCurrentExtraData().tagRects[this.hilitedTag], eb = new ga(((db.t + ((db.h() / 2)))), db.r, ((db.b + ((ea.isFacebox(this.hilitedTag) ? 10 : 0)))), db.l, db.domain);\n            return eb.contains(cb);\n        },\n        getVideoOnStage: function() {\n            var cb = ((this.stream && this.stream.getCurrentImageData()));\n            return ((cb && cb.video));\n        },\n        shouldPageOnAction: function(cb, db) {\n            if (((!this.isOpen || this.isShowingLikePhotoConfirmation))) {\n                return false;\n            }\n        ;\n        ;\n            var eb = ((o.isNode(db) && ((((z.byClass(db, \"snowliftPager\") || z.byClass(db, \"stagePagers\"))) || z.byClass(db, \"pivotPageColumn\"))))), fb = ((o.isNode(db) && z.byClass(db, \"stage\"))), gb = m.hasClass(db, \"faceBox\"), hb = ((((((((((((fb && m.hasClass(this.root, \"taggingMode\"))) || z.byClass(db, \"tagBoxPending\"))) || z.byClass(db, \"tagBoxPendingResponse\"))) || z.byClass(db, \"fbPhotoTagApprovalBox\"))) || z.byClass(db, \"tag\"))) || ((this.cropper && this.cropper.croppingMode))));\n            if (hb) {\n                return false;\n            }\n        ;\n        ;\n            return ((((((((((cb == u.LEFT)) || ((cb == u.RIGHT)))) || ((!m.hasClass(this.root, \"taggingMode\") && gb)))) || eb)) || fb));\n        },\n        keyHandler: function(cb, JSBNG__event) {\n            if (((JSBNG__event.getModifiers().any || ((v.getTopmostLayer() !== this.spotlight))))) {\n                return true;\n            }\n        ;\n        ;\n            switch (q.getKeyCode(JSBNG__event)) {\n              case u.LEFT:\n            \n              case u.RIGHT:\n                if (!this.pagersOnKeyboardNav) {\n                    this.showPagers(bb.PAGER_FADE);\n                }\n            ;\n            ;\n                this.pageListener(JSBNG__event);\n                return false;\n              case 70:\n                return this.toggleFullScreen();\n              case 76:\n                return this.likePhotoWithKey();\n            };\n        ;\n        },\n        pageListener: function(JSBNG__event) {\n            var cb = q.getKeyCode(JSBNG__event), db = JSBNG__event.getTarget();\n            if (!this.shouldPageOnAction(cb, db)) {\n                return;\n            }\n        ;\n        ;\n            var eb = 0;\n            if (((cb == u.RIGHT))) {\n                eb = 1;\n                ba.setPagingAction(\"key_right\");\n            }\n             else if (((cb == u.LEFT))) {\n                eb = -1;\n                ba.setPagingAction(\"key_left\");\n            }\n             else if (z.byClass(db, \"next\")) {\n                eb = 1;\n                ba.setPagingAction(\"click_next\");\n            }\n             else if (z.byClass(db, \"prev\")) {\n                eb = -1;\n                ba.setPagingAction(\"click_prev\");\n            }\n             else if (!this.stagePagerPrev) {\n                eb = 1;\n                ba.setPagingAction(\"click_stage\");\n            }\n             else {\n                eb = -1;\n                ba.setPagingAction(\"click_stage_back\");\n            }\n            \n            \n            \n            \n        ;\n        ;\n            var fb = o.scry(this.ufiForm, \"input.mentionsHidden\"), gb = false;\n            for (var hb = 0; ((hb < fb.length)); hb++) {\n                if (!s.isEmpty(fb[hb])) {\n                    gb = true;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((((gb || m.hasClass(this.root, \"fbPhotoSnowliftEditMode\"))) || ((this.cropper && this.cropper.croppingMode))))) {\n                this.warnLeavePage(eb);\n            }\n             else {\n                this.page(eb, ((ma.chrome() && r.isFullScreen())));\n                ab(\"snowlift\", db, JSBNG__event).uai(ba.pagingAction);\n            }\n        ;\n        ;\n        },\n        warnLeavePage: function(cb) {\n            new n().setTitle(\"Are you sure you want to leave this page?\").setBody(\"You have unsaved changes that will be lost if you leave the page.\").setButtons([{\n                JSBNG__name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: this.page.bind(this, cb)\n            },{\n                JSBNG__name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        page: function(cb, db) {\n            if (!this.stream.isValidMovement(cb)) {\n                this.showPagers(bb.PAGER_FADE);\n                return;\n            }\n        ;\n        ;\n            this.lastPage = JSBNG__Date.now();\n            this.unhiliteAllTags();\n            this.seenTags = [];\n            var eb = this.getVideoOnStage();\n            if (eb) {\n                this.switchVideo(eb, false);\n            }\n        ;\n        ;\n            if (((this.pivots && this.pivots.page(cb)))) {\n                return;\n            }\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.PAGE\");\n            ja.hide();\n            this.recacheData();\n            this.stream.moveCursor(cb);\n            m.hide(this.image);\n            if (this.stream.errorInCurrent()) {\n                this.setLoadingState(bb.STATE_HTML, true);\n                m.show(this.errorBox);\n                return;\n            }\n        ;\n        ;\n            var fb = this.stream.getCurrentImageData();\n            if (fb) {\n                var gb = this.getImageURL(fb);\n                if (gb) {\n                    this.switchImage(gb, null, true);\n                }\n                 else if (fb.video) {\n                    this.switchVideo(fb.video, true);\n                }\n                \n            ;\n            ;\n                if (!db) {\n                    this.replaceUrl = true;\n                    wa(fb.info.permalink);\n                }\n            ;\n            ;\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n            }\n             else {\n                this.setLoadingState(bb.STATE_IMAGE_PIXELS, true);\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            }\n        ;\n        ;\n            if (this.stream.getCurrentHtml()) {\n                this.swapData();\n            }\n             else this.setLoadingState(bb.STATE_HTML, true);\n        ;\n        ;\n            this.disableAds = this.disableAdsForSession;\n            this.loadAds();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n        },\n        logImpressionDetailsForPhoto: function() {\n            var cb = [].concat(o.scry(oa(\"fbPhotoSnowliftTagList\"), \"input.photoImpressionDetails\"), o.scry(oa(\"fbPhotoSnowliftFeedback\"), \"input.photoImpressionDetails\"));\n            if (((cb.length === 0))) {\n                return;\n            }\n        ;\n        ;\n            var db = {\n            };\n            for (var eb = 0; ((eb < cb.length)); eb++) {\n                db[cb[eb].JSBNG__name] = cb[eb].value;\n            ;\n            };\n        ;\n            if (this.getVideoOnStage()) {\n                db.width = 0;\n                db.height = 0;\n            }\n             else {\n                var fb = this.getImageDimensions(this.stream.getCurrentImageData());\n                db.width = fb.x;\n                db.height = fb.y;\n            }\n        ;\n        ;\n            ba.addDetailData(this.stream.getCursor(), db);\n            ca.setIsLogAdData(true);\n        },\n        loadAds: function() {\n            if (this.disableAds) {\n                return;\n            }\n        ;\n        ;\n            ca.loadAdsFromUserActivity();\n        },\n        transitionHandler: function(cb) {\n            if (((((((cb.getQueryData().closeTheater || cb.getQueryData().permPage)) || cb.getQueryData().makeprofile)) || this.returningToStart))) {\n                if (this.isOpen) {\n                    this.close();\n                }\n            ;\n            ;\n                this.transitionHandlerRegistered = false;\n                return false;\n            }\n        ;\n        ;\n            if (this.replaceUrl) {\n                this.replaceUrl = false;\n                this._uriStack.push(cb.getQualifiedURI().toString());\n                y.transitionComplete(true);\n                return true;\n            }\n        ;\n        ;\n            var db = this._uriStack.length;\n            if (((((db >= 2)) && ((this._uriStack[((db - 2))] == cb.getQualifiedURI().toString()))))) {\n                this._uriStack.pop();\n            }\n        ;\n        ;\n            var eb = this.stream.getCursorForURI(cb.getUnqualifiedURI().toString());\n            if (eb) {\n                var fb = this.stream.getRelativeMovement(eb);\n                this.page(fb, true);\n                y.transitionComplete(false);\n                return true;\n            }\n        ;\n        ;\n            if (this.isOpen) {\n                y.transitionComplete(true);\n                this.close();\n                return true;\n            }\n        ;\n        ;\n            this.transitionHandlerRegistered = false;\n            return false;\n        },\n        recacheData: function() {\n            if (!this.loadingStates.html) {\n                var cb = this.stream.getCurrentHtml();\n                {\n                    var fin218keys = ((window.top.JSBNG_Replay.forInKeys)((cb))), fin218i = (0);\n                    var db;\n                    for (; (fin218i < fin218keys.length); (fin218i++)) {\n                        ((db) = (fin218keys[fin218i]));\n                        {\n                            cb[db] = sa(oa(db).childNodes);\n                            o.empty(oa(db));\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        reloadIfTimeout: function() {\n            if (!t.hasLoaded(this.image)) {\n                var cb = this.makeNewImage(this.image.src, true);\n                q.listen(cb, \"load\", this.useImage.bind(this, cb, null, true));\n            }\n        ;\n        ;\n        },\n        useImage: function(cb, db, eb) {\n            if (((eb && t.hasLoaded(this.image)))) {\n                return;\n            }\n        ;\n        ;\n            o.replace(this.image, cb);\n            this.image = cb;\n            g.inform(\"Amoeba/instrument\", [this.image,\"image\",], g.BEHAVIOR_PERSISTENT);\n            this.adjustStageSize(db);\n        },\n        makeNewImage: function(cb, db) {\n            if (this.imageLoadingTimer) {\n                JSBNG__clearTimeout(this.imageLoadingTimer);\n                this.imageLoadingTimer = null;\n            }\n             else if (!db) {\n                this.imageRefreshTimer = JSBNG__setTimeout(this.reloadIfTimeout.bind(this), bb.LOADING_TIMEOUT);\n            }\n            \n        ;\n        ;\n            var eb = o.create(\"img\", {\n                className: \"spotlight\",\n                alt: \"\"\n            });\n            eb.setAttribute(\"aria-describedby\", \"fbPhotosSnowliftCaption\");\n            eb.setAttribute(\"aria-busy\", \"true\");\n            q.listen(eb, \"load\", pa(function() {\n                JSBNG__clearTimeout(this.imageRefreshTimer);\n                this.image.setAttribute(\"aria-busy\", \"false\");\n                this.setLoadingState(this.STATE_IMAGE_PIXELS, false);\n                (function() {\n                    if (this.isOpen) {\n                        this.adjustStageSize();\n                        this.adjustForNewData();\n                    }\n                ;\n                ;\n                }).bind(this).defer();\n            }.bind(this), \"photo_theater\"));\n            eb.src = cb;\n            return eb;\n        },\n        switchImage: function(cb, db, eb) {\n            m.hide(this.image);\n            m.hide(this.errorBox);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            var fb = ((this.stream && this.stream.getCurrentImageData()));\n            if (fb) {\n                ba.addPhotoView(fb.info, this.shouldShowHiRes(fb), ((this.fullscreen && r.isFullScreen())));\n            }\n        ;\n        ;\n            this.useImage(this.makeNewImage(cb, false), db, false);\n            if (eb) {\n                this.stream.preloadImages(this.shouldShowHiRes(fb));\n            }\n        ;\n        ;\n            if (((this.cropper && this.cropper.croppingMode))) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.SWITCH_IMAGE\");\n        },\n        switchVideo: function(cb, db) {\n            var eb = ((\"swf_\" + cb));\n            if (db) {\n                m.addClass(this.stageWrapper, \"showVideo\");\n                var fb = o.create(\"div\", {\n                    className: \"videoStageContainer\"\n                });\n                o.appendContent(this.videoStage, fb);\n                fb.id = cb;\n                if (((window[eb] && !va(eb)))) {\n                    window[eb].write(cb);\n                }\n            ;\n            ;\n                var gb = ((\"video_warning_\" + cb)), hb = va(cb);\n                if (!this.videoWarnings) {\n                    this.videoWarnings = [];\n                }\n            ;\n            ;\n                if (((hb && this.videoWarnings[gb]))) {\n                    o.setContent(hb, this.videoWarnings[gb]);\n                }\n            ;\n            ;\n                this.adjustStageSizeForVideo.bind(this, eb).defer();\n            }\n             else {\n                ((window[eb] && window[eb].addVariable(\"video_autoplay\", 0)));\n                ((this.videoLoadTimer && JSBNG__clearTimeout(this.videoLoadTimer)));\n                o.empty(this.videoStage);\n                m.removeClass(this.stageWrapper, \"showVideo\");\n            }\n        ;\n        ;\n        },\n        checkVideoStatus: function(cb) {\n            if (this.videoLoadTimer) {\n                JSBNG__clearTimeout(this.videoLoadTimer);\n            }\n        ;\n        ;\n            var db = this.getVideoOnStage();\n            if (!db) {\n                return;\n            }\n             else {\n                var eb = ((\"swf_\" + db));\n                if (((cb !== eb))) {\n                    return;\n                }\n            ;\n            ;\n                this.adjustStageSizeForVideo(cb);\n            }\n        ;\n        ;\n        },\n        adjustStageSizeForVideo: function(cb) {\n            var db = va(cb);\n            if (!db) {\n                this.videoLoadTimer = JSBNG__setTimeout(this.checkVideoStatus.bind(this, cb), 200);\n            }\n             else this.adjustStageSize(new na(db.width, db.height));\n        ;\n        ;\n        },\n        handleServerError: function(cb, db) {\n            o.setContent(this.errorBox, cb);\n            this.storeFromData(db);\n        },\n        swapData: function() {\n            var cb, db = this.stream.getCurrentHtml();\n            if (db) {\n                this.setLoadingState(bb.STATE_HTML, false);\n                {\n                    var fin219keys = ((window.top.JSBNG_Replay.forInKeys)((db))), fin219i = (0);\n                    var eb;\n                    for (; (fin219i < fin219keys.length); (fin219i++)) {\n                        ((eb) = (fin219keys[fin219i]));\n                        {\n                            cb = va(eb);\n                            ((cb && o.setContent(cb, db[eb])));\n                        };\n                    };\n                };\n            ;\n                g.inform(\"PhotoSnowlift.DATA_CHANGE\", this.stream.getCurrentImageData().info, g.BEHAVIOR_STATE);\n                if (this.stream.getCurrentExtraData()) {\n                    g.inform(\"PhotoSnowlift.EXTRA_DATA_CHANGE\", this.stream.getCurrentExtraData(), g.BEHAVIOR_STATE);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.adjustScroller();\n            this.adjustStageSize();\n            this.scrollableArea.showScrollbar(false);\n            this.adjustForNewData();\n            this.logImpressionDetailsForPhoto();\n            if (this.showFlashTags) {\n                this.flashAllTags();\n            }\n        ;\n        ;\n        },\n        updateTotalCount: function(cb, db, eb) {\n            var fb = this.stream.getCurrentHtml();\n            if (fb) {\n                var gb = oa(\"fbPhotoSnowliftPositionAndCount\");\n                o.replace(gb, eb);\n                gb = eb;\n                m.show(gb);\n                var hb = \"fbPhotoSnowliftPositionAndCount\";\n                fb[hb] = sa(gb.childNodes);\n            }\n        ;\n        ;\n            this.stream.setTotalCount(cb);\n            this.stream.setFirstCursorIndex(db);\n        },\n        addPhotoFbids: function(cb, db, eb, fb) {\n            if (((((fb && this.sessionID)) && ((fb != this.sessionID))))) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((this.stream.getCursor() === null));\n            this.stream.attachToFbidsList(cb, db, eb);\n            if (((eb && gb))) {\n                this.page(0, true);\n            }\n        ;\n        ;\n            if (((this.pivots && eb))) {\n                this.pivots.setCycleCount(this.stream.calculateDistance(this.stream.getCursor(), this.stream.firstCursor));\n            }\n        ;\n        ;\n            if (((!this.pagersShown && this.stream.canPage()))) {\n                this.setStagePagersState(\"ready\");\n            }\n        ;\n        ;\n        },\n        attachTagger: function(cb) {\n            o.appendContent(this.stageActions, cb);\n        },\n        storeFromData: function(cb) {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            if (((((cb.ssid && this.sessionID)) && ((this.sessionID != cb.ssid))))) {\n                return;\n            }\n        ;\n        ;\n            var db = this.stream.storeToCache(cb);\n            if (((\"error\" in db))) {\n                this.checkState(bb.STATE_ERROR);\n                return;\n            }\n        ;\n        ;\n            if (((\"init\" in db))) {\n                this.initDataFetched(db.init);\n                if (this.openExplicitly) {\n                    this.replaceUrl = true;\n                    wa(this.stream.getCurrentImageData().info.permalink);\n                }\n            ;\n            ;\n                if (this.stream.canPage()) {\n                    this.setStagePagersState(\"ready\");\n                }\n            ;\n            ;\n                ((this.ua && this.ua.add_event(\"ufi\")));\n            }\n        ;\n        ;\n            if (((\"image\" in db))) {\n                this.checkState(bb.STATE_IMAGE_DATA);\n            }\n        ;\n        ;\n            if (((\"data\" in db))) {\n                this.checkState(bb.STATE_HTML);\n            }\n        ;\n        ;\n        },\n        setStagePagersState: function(cb) {\n            switch (cb) {\n              case \"ready\":\n                m.addClass(this.root, \"pagingReady\");\n                this.pagersShown = true;\n                ((this.ua && this.ua.add_event(\"arrows\")));\n                return;\n              case \"active\":\n                m.addClass(this.root, \"pagingActivated\");\n                return;\n              case \"inactive\":\n                m.removeClass(this.root, \"pagingActivated\");\n                return;\n              case \"disabled\":\n            \n              case \"reset\":\n                m.removeClass(this.root, \"pagingReady\");\n                return;\n            };\n        ;\n        },\n        deletePhoto: function(cb) {\n            this.closeRefresh();\n        },\n        closeRefresh: function() {\n            this.refreshOnClose = true;\n            this.closeHandler();\n        },\n        onHiliteTag: function(cb, db) {\n            if (((db.version != aa.VIEWER_SNOWLIFT))) {\n                return;\n            }\n        ;\n        ;\n            var eb = db.tag;\n            if (eb) {\n                this.switchHilitedTags(eb, true);\n            }\n        ;\n        ;\n        },\n        onUpdateTagBox: function(cb, db) {\n            if (((db.version == aa.VIEWER_SNOWLIFT))) {\n                this.updateTagBox(db.id, db.approve);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = bb;\n});\n__d(\"Spotlight\", [\"JSXDOM\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"DOM\",\"Layer\",\"LayerAutoFocus\",\"LayerTabIsolation\",\"ModalLayer\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"DOM\"), l = b(\"Layer\"), m = b(\"LayerAutoFocus\"), n = b(\"LayerTabIsolation\"), o = b(\"ModalLayer\"), p = b(\"Vector\"), q = b(\"copyProperties\"), r = b(\"csx\"), s = b(\"cx\");\n    function t(v, w) {\n        this.parent.construct(this, v, w);\n        this.stageMinSize = new p(0, 0);\n        this.stagePadding = new p(0, 0);\n    };\n;\n    j.extend(t, l);\n    q(t.prototype, i, {\n        stageMinSize: null,\n        stagePadding: null,\n        _buildWrapper: function(v, w) {\n            return (g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__root -cx-PRIVATE-ModalLayer__dark\"\n            }, g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__container\"\n            }, w)));\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([u,m,n,o,]);\n        },\n        getContentRoot: function() {\n            if (!this._content) {\n                this._content = k.JSBNG__find(this.getRoot(), \"div.-cx-PRIVATE-uiSpotlight__content\");\n            }\n        ;\n        ;\n            return this._content;\n        },\n        configure: function(v) {\n            if (v.stageMinSize) {\n                this.stageMinSize = v.stageMinSize;\n            }\n        ;\n        ;\n            if (v.stagePadding) {\n                this.stagePadding = v.stagePadding;\n            }\n        ;\n        ;\n        },\n        onContentLoaded: function() {\n            this.inform(\"content-load\");\n        },\n        updatePermalink: function(v) {\n            this.inform(\"permalinkchange\", v);\n        }\n    });\n    function u(v) {\n        this._layer = v;\n    };\n;\n    q(u.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(v, w) {\n                if (((v === \"show\"))) {\n                    h.inform(\"layer_shown\", {\n                        type: \"Spotlight\"\n                    });\n                }\n                 else h.inform(\"layer_hidden\", {\n                    type: \"Spotlight\"\n                });\n            ;\n            ;\n            });\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        }\n    });\n    e.exports = t;\n});");
// 12303
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o20,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/1irKUs2UFup.js",o94);
// undefined
o20 = null;
// undefined
o94 = null;
// 12339
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"bUzfU\",]);\n}\n;\n__d(\"TrackingPixel\", [\"Arbiter\",\"ControlledReferer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ControlledReferer\"), i = {\n        _iframe: undefined,\n        loadWithNoReferrer: function(j) {\n            if (!i._iframe) {\n                var k = document.createElement(\"iframe\");\n                k.frameborder = 0;\n                k.width = k.height = 1;\n                k.style.position = \"absolute\";\n                k.style.top = \"-10px\";\n                h.useFacebookReferer(k, function() {\n                    g.inform(\"TrackingPixel/iframeIsLoaded\", null, g.BEHAVIOR_PERSISTENT);\n                }, null);\n                document.body.appendChild(k);\n                i._iframe = k;\n            }\n        ;\n            g.subscribe(\"TrackingPixel/iframeIsLoaded\", function() {\n                var l = i._iframe.contentWindow.document, m = l.createElement(\"img\");\n                m.src = j;\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ExternalTrackingTag\", [\"AsyncSignal\",\"TrackingPixel\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"TrackingPixel\"), i = b(\"Event\"), j = {\n        listenForElementClick: function(k, l, m, n) {\n            i.listen(k, \"click\", function() {\n                j.sendRequest(l, m, n);\n            });\n        },\n        sendRequest: function(k, l, m) {\n            if (!k) {\n                return\n            };\n            new g(\"/ads/external_tracking_tag/\", {\n                href: k,\n                tracking_tag_id: l,\n                adgroup_id: m\n            }).send();\n            h.loadWithNoReferrer(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"ad-logging\", [\"Arbiter\",\"AsyncRequest\",\"Banzai\",\"collectDataAttributes\",\"Parent\",\"TrackingNodes\",\"ExternalTrackingTag\",], function(a, b, c, d, e, f) {\n    var g = \"ssinfeed\", h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Banzai\"), k = b(\"collectDataAttributes\"), l = b(\"Parent\"), m = b(\"TrackingNodes\"), n = b(\"ExternalTrackingTag\"), o = {\n    };\n    function p(s) {\n        return (((((s.getAttribute && ((s.getAttribute(\"ajaxify\") || s.getAttribute(\"data-endpoint\")))) || s.action) || s.href) || s.name));\n    };\n    function q(s) {\n        var t = (s.ei || s.ai);\n        if ((!t && s.mei)) {\n            t = s.mf_story_key;\n        };\n        if (((s !== null) && (typeof (t) === \"string\"))) {\n            var u = false;\n            if (s.tn) {\n                var v = m.parseTrackingNodeString(s.tn);\n                for (var w = 0; (w < v.length); w++) {\n                    var x = v[w][0];\n                    switch (x) {\n                      case m.types.LIKE_LINK:\n                    \n                      case m.types.UNLIKE_LINK:\n                    \n                      case m.types.COMMENT:\n                    \n                      case m.types.ADD_COMMENT_BOX:\n                        return;\n                      case m.types.XBUTTON:\n                    \n                      case m.types.HIDE_LINK:\n                    \n                      case m.types.REPORT_SPAM_LINK:\n                    \n                      case m.types.HIDE_ALL_LINK:\n                    \n                      case m.types.DROPDOWN_BUTTON:\n                    \n                      case m.types.UNHIDE_LINK:\n                        return;\n                      case m.types.ATTACHMENT:\n                    \n                      case m.types.USER_MESSAGE:\n                        u = true;\n                        break;\n                    };\n                };\n            }\n        ;\n            var y = Date.now(), z = 500;\n            s.duplicate_click = (!!o[t] && (((y - o[t]) < z)));\n            o[t] = y;\n            if (j.isEnabled(\"ssinfeed\")) {\n                j.post(g, s, {\n                    delay: 0,\n                    retry: j.isEnabled(\"ssinfeed_retry\")\n                });\n            }\n             else {\n                var aa = new i(\"/ajax/ssinfeed/end/\").setData(s).setAllowCrossPageTransition(true).setMethod(\"POST\");\n                aa.send();\n            }\n        ;\n            if (((u && s.external_tracking_tag) && !s.duplicate_click)) {\n                n.sendRequest(s.external_tracking_tag.url, s.external_tracking_tag.tag_id, s.external_tracking_tag.adgroup_id);\n            };\n        }\n    ;\n    };\n    function r(s, t) {\n        if (!t.node) {\n            return\n        };\n        var u = p(t.node), v = (l.byTag(t.node, \"input\") || l.byTag(t.node, \"button\"));\n        if (((((!u && v) && (v.type == \"submit\")) && v.getAttribute) && v.getAttribute(\"data-ft\"))) {\n            u = \"#\";\n        };\n        var w;\n        if (((u && t.event) && (((t.event.type === \"click\") || (t.event.type === \"contextmenu\"))))) {\n            w = k(t.node, [\"ft\",]);\n            w.ft.href = u;\n            w.ft.mouse_type = t.event.type;\n            q(w.ft);\n        }\n    ;\n    };\n    h.subscribe(\"ClickRefAction/new\", r);\n});\n__d(\"PopoverMenu.react\", [\"CSS\",\"InlineBlock.react\",\"Popover\",\"PopoverMenu\",\"React\",\"ReactProps\",\"SubscriptionsHandler\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"InlineBlock.react\"), i = b(\"Popover\"), j = b(\"PopoverMenu\"), k = b(\"React\"), l = b(\"ReactProps\"), m = b(\"SubscriptionsHandler\"), n = b(\"cx\"), o = b(\"joinClasses\");\n    function p(r, s) {\n        var t, u;\n        for (var v in r) {\n            t = r[v];\n            u = s[v];\n            if (((typeof t === \"object\") && (typeof u === \"object\"))) {\n                if (!p(t, u)) {\n                    return false\n                };\n            }\n             else if ((t !== u)) {\n                return false\n            }\n        ;\n        };\n        return true;\n    };\n    var q = k.createClass({\n        displayName: \"ReactPopoverMenu\",\n        props: {\n            alignh: l.oneOf([\"left\",\"center\",\"right\",]),\n            layerBehaviors: l.array,\n            menu: l.object,\n            disabled: l.bool\n        },\n        _menuSubscriptions: null,\n        componentDidMount: function() {\n            var r = this.refs.root.getDOMNode(), s = r.firstChild;\n            g.addClass(s, \"-cx-PRIVATE-uiPopover__trigger\");\n            this._popover = new i(r, s, this.props.layerBehaviors, {\n                alignh: this.props.alignh,\n                disabled: this.props.disabled\n            });\n            this._popoverMenu = new j(this._popover, s, this._createMenu(this.props.menu), this.props.behaviors);\n        },\n        componentDidUpdate: function(r) {\n            if (!p(r.menu, this.props.menu)) {\n                if (this._menuSubscriptions) {\n                    this._menuSubscriptions.release();\n                    this._menuSubscriptions = null;\n                }\n            ;\n                this._popoverMenu.setMenu(this._createMenu(this.props.menu));\n            }\n        ;\n            if ((this.props.alignh !== r.alignh)) {\n                this._popoverMenu.getPopover().getLayer().setAlignment(this.props.alignh);\n            };\n            if ((this.props.disabled !== r.disabled)) {\n                if (this.props.disabled) {\n                    this._popoverMenu.disable();\n                }\n                 else this._popoverMenu.enable();\n            \n            };\n        },\n        getFirstChild: function() {\n            var r = this.props.children;\n            return (Array.isArray(r) ? r[0] : r);\n        },\n        getButtonSize: function() {\n            var r = this.getFirstChild();\n            return (r && r.getButtonSize());\n        },\n        render: function() {\n            var r = this.getFirstChild();\n            r.props.className = o((r.props.className || \"\"), \"-cx-PRIVATE-uiPopover__trigger\");\n            return this.transferPropsTo(h({\n                alignv: \"middle\",\n                className: \"uiPopover\",\n                ref: \"root\",\n                disabled: null\n            }, this.props.children));\n        },\n        componentWillUnmount: function() {\n            if (this._menuSubscriptions) {\n                this._menuSubscriptions.release();\n                this._menuSubscriptions = null;\n            }\n        ;\n        },\n        _createMenu: function(r) {\n            var s = new r.ctor(r.menuitems, r.config);\n            this._menuSubscriptions = new m();\n            if (r.onItemClick) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"itemclick\", r.onItemClick));\n            };\n            if (r.onChange) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"change\", r.onChange));\n            };\n            if (this.props.onShow) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"show\", this.props.onShow));\n            };\n            if (this.props.onHide) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"hide\", this.props.onHide));\n            };\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ReactMenu\", [\"Menu\",\"MenuItem\",\"MenuSelectableItem\",\"MenuTheme\",\"SelectableMenu\",\"cx\",\"flattenArray\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Menu\"), h = b(\"MenuItem\"), i = b(\"MenuSelectableItem\"), j = b(\"MenuTheme\"), k = b(\"SelectableMenu\"), l = b(\"cx\"), m = b(\"flattenArray\"), n = b(\"merge\"), o = Array.prototype.slice;\n    function p(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: g,\n            menuitems: m((r || [])),\n            config: {\n                theme: j,\n                maxheight: (q ? q.maxheight : null)\n            }\n        };\n        return n(s, q);\n    };\n    p.SelectableMenu = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: k,\n            menuitems: m(r),\n            config: {\n                className: \"-cx-PUBLIC-abstractSelectableMenu__root\",\n                theme: j,\n                multiple: (q && q.multiple),\n                maxheight: (q ? q.maxheight : null)\n            }\n        };\n        return n(s, q);\n    };\n    p.Item = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: h,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    p.SelectableItem = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: i,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    e.exports = p;\n});\n__d(\"UFIOrderingModeSelector.react\", [\"InlineBlock.react\",\"Link.react\",\"LoadingIndicator.react\",\"React\",\"Image.react\",\"ReactMenu\",\"PopoverMenu.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"InlineBlock.react\"), h = b(\"Link.react\"), i = b(\"LoadingIndicator.react\"), j = b(\"React\"), k = b(\"Image.react\"), l = b(\"ReactMenu\"), m = b(\"PopoverMenu.react\"), n = b(\"cx\"), o = b(\"ix\"), p = l.SelectableMenu, q = l.SelectableItem, r = j.createClass({\n        displayName: \"UFIOrderingModeSelector\",\n        getInitialState: function() {\n            var s = null;\n            this.props.orderingmodes.map(function(t) {\n                if (t.selected) {\n                    s = t;\n                };\n            });\n            return {\n                selectedMode: s\n            };\n        },\n        onMenuItemClick: function(s, t) {\n            var u = t.item.getValue();\n            this.props.orderingmodes.map(function(v) {\n                if ((v.value === u)) {\n                    this.setState({\n                        selectedMode: v\n                    });\n                };\n            }.bind(this));\n            this.props.onOrderChanged(u);\n        },\n        render: function() {\n            var s = null;\n            if ((this.props.currentOrderingMode != this.state.selectedMode.value)) {\n                s = i({\n                    className: \"UFIOrderingModeSelectorLoading\",\n                    color: \"white\",\n                    size: \"small\"\n                });\n            };\n            var t = p({\n                onItemClick: this.onMenuItemClick\n            }, this.props.orderingmodes.map(function(u) {\n                return (q({\n                    key: u.value,\n                    value: u.value,\n                    selected: (u.value === this.state.selectedMode.value)\n                }, u.name));\n            }.bind(this)));\n            return (j.DOM.div({\n                className: \"UFIOrderingModeSelector\"\n            }, s, g(null, m({\n                className: \"UFIOrderingModeSelectorPopover\",\n                menu: t,\n                alignh: \"right\"\n            }, h(null, this.state.selectedMode.name, k({\n                className: \"UFIOrderingModeSelectorDownCaret\",\n                src: o(\"/images/ui/xhp/link/more/down_caret.gif\")\n            }))))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerPublishTrackingStory\", [\"Event\",\"ge\",\"reportData\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"reportData\"), j = b(\"DOMQuery\");\n    f.init = function(k) {\n        g.listen(k, \"submit\", function() {\n            var l = h(\"home_stream\");\n            if (!l) {\n                return\n            };\n            var m = j.scry(l, \".uiStreamStory\")[0];\n            if ((m && m.getAttribute(\"data-ft\"))) {\n                var n = JSON.parse(m.getAttribute(\"data-ft\"));\n                if (!((((\"mf_story_key\" in n)) && ((\"qid\" in n))))) {\n                    return\n                };\n                var o = {\n                    mf_story_key: n.mf_story_key,\n                    qid: n.qid\n                };\n                i(\"compose\", {\n                    ft: o\n                });\n            }\n        ;\n        });\n    };\n});\n__d(\"ComposerXAttachmentBootstrap\", [\"CSS\",\"Form\",\"Parent\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Form\"), i = b(\"Parent\"), j = b(\"URI\"), k = b(\"cx\"), l = [], m = {\n        bootstrap: function(n) {\n            m.load(i.byTag(n, \"form\"), n.getAttribute(\"data-endpoint\"));\n        },\n        load: function(n, o, p) {\n            var q = j(o).addQueryData({\n                composerurihash: m.getURIHash(o)\n            });\n            g.conditionClass(n, \"-cx-PRIVATE-fbComposerAttachment__hidespinner\", p);\n            var r = i.byClass(n, \"-cx-PRIVATE-fbComposer__attachmentform\");\n            g.removeClass(r, \"async_saving\");\n            h.setDisabled(n, false);\n            n.action = q.toString();\n            h.bootstrap(n);\n        },\n        getURIHash: function(n) {\n            if ((n === \"initial\")) {\n                return \"initial\"\n            };\n            var o = l.indexOf(n);\n            if ((o !== -1)) {\n                return (o + \"\");\n            }\n             else {\n                o = l.length;\n                l[o] = n;\n                return (o + \"\");\n            }\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ComposerXStore\", [\"function-extensions\",\"Arbiter\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ge\"), i = {\n    };\n    function j(l, m) {\n        return (((\"ComposerX/\" + l) + \"/\") + m);\n    };\n    var k = {\n        set: function(l, m, n) {\n            if (!i[l]) {\n                i[l] = {\n                };\n            };\n            i[l][m] = n;\n            g.inform(j(l, m), {\n            }, g.BEHAVIOR_STATE);\n        },\n        get: function(l, m) {\n            if (i[l]) {\n                return i[l][m]\n            };\n            return null;\n        },\n        getAllForComposer: function(l) {\n            return (i[l] || {\n            });\n        },\n        waitForComponents: function(l, m, n) {\n            g.registerCallback(n, m.map(j.curry(l)));\n        }\n    };\n    g.subscribe(\"page_transition\", function() {\n        for (var l in i) {\n            if (!h(l)) {\n                delete i[l];\n            };\n        };\n    });\n    e.exports = k;\n});\n__d(\"ComposerX\", [\"Arbiter\",\"ComposerXAttachmentBootstrap\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"copyProperties\",\"csx\",\"cx\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXAttachmentBootstrap\"), i = b(\"ComposerXStore\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"getObjectValues\"), q = \"any\";\n    function r(s) {\n        this._root = s;\n        this._composerID = s.id;\n        this._attachments = {\n        };\n        this._attachmentFetchForm = l.find(s, \".-cx-PRIVATE-fbComposer__attachmentform\");\n        this._resetSubscription = g.subscribe(\"composer/publish\", function(t, u) {\n            if ((u.composer_id === this._composerID)) {\n                this.reset();\n            };\n        }.bind(this));\n    };\n    m(r.prototype, {\n        _endpointHashToShow: q,\n        _lastFetchEndpoint: \"\",\n        _initialAttachmentEndpoint: \"\",\n        getAttachment: function(s, t) {\n            var u = h.getURIHash(s);\n            this._endpointHashToShow = u;\n            var v = this._attachments[u];\n            if (v) {\n                this._showAttachmentAfterComponentsLoaded(u);\n            }\n             else this.fetchAttachmentData(s, t);\n        ;\n        },\n        fetchAttachmentData: function(s, t) {\n            var u = h.getURIHash(s);\n            if (this._attachments[u]) {\n                return\n            };\n            if ((s !== this._lastFetchEndpoint)) {\n                h.load(this._attachmentFetchForm, s, t);\n                this._lastFetchEndpoint = s;\n            }\n        ;\n        },\n        setAttachment: function(s, t, u, v) {\n            this._setupAttachment(s, t, u, v);\n            this._showAttachmentAfterComponentsLoaded(s);\n        },\n        setInitialAttachment: function(s, t, u, v) {\n            var w = h.getURIHash(s);\n            this._setupAttachment(w, t, u, v);\n            this._initialAttachmentEndpoint = s;\n            if (!this._currentInstance) {\n                this._showAttachmentAfterComponentsLoaded(w);\n            };\n        },\n        setComponent: function(s, t) {\n            if (!i.get(this._composerID, s)) {\n                i.set(this._composerID, s, t);\n                k.appendContent(this._attachmentFetchForm, k.create(\"input\", {\n                    type: \"hidden\",\n                    name: \"loaded_components[]\",\n                    value: s\n                }));\n            }\n        ;\n        },\n        reset: function() {\n            if (this._currentInstance) {\n                this._currentInstance.cleanup();\n                this._currentInstance = null;\n            }\n        ;\n            for (var s in this._attachments) {\n                this._attachments[s].instance.reset();;\n            };\n            var t = i.getAllForComposer(this._composerID);\n            p(t).forEach(function(u) {\n                if (u.reset) {\n                    u.reset(u);\n                };\n            });\n            this.getAttachment(this._initialAttachmentEndpoint);\n            g.inform(\"composer/reset\");\n        },\n        destroy: function() {\n            if (this._resetSubscription) {\n                this._resetSubscription.unsubscribe();\n                this._resetSubscription = null;\n            }\n        ;\n        },\n        addPlaceholders: function(s, t) {\n            var u;\n            for (var v in this._attachments) {\n                u = this._attachments[v];\n                if ((u.instance === s)) {\n                    t.forEach(function(w) {\n                        u.placeholders.push(w);\n                        u.required_components.push(w.component_name);\n                    });\n                    break;\n                }\n            ;\n            };\n            if ((this._currentInstance === s)) {\n                this._fillPlaceholders(t);\n            };\n        },\n        _setupAttachment: function(s, t, u, v) {\n            t.setComposerID(this._composerID);\n            this._attachments[s] = {\n                instance: t,\n                placeholders: u,\n                required_components: v\n            };\n            var w = l.find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), x = t.getRoot();\n            if ((x.parentNode !== w)) {\n                j.hide(x);\n                k.appendContent(w, x);\n            }\n        ;\n        },\n        _showAttachment: function(s, t, u) {\n            if ((this._currentInstance === s)) {\n                return\n            };\n            if ((this._endpointHashToShow === q)) {\n                this._endpointHashToShow = null;\n            }\n             else if ((this._endpointHashToShow !== t)) {\n                return\n            }\n        ;\n            if (this._currentInstance) {\n                if (!this._currentInstance.canSwitchAway()) {\n                    return\n                };\n                this._currentInstance.cleanup();\n            }\n        ;\n            this._currentInstance = s;\n            var v = l.find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), w = v.childNodes, x = s.getRoot();\n            for (var y = 0; (y < w.length); y++) {\n                if ((w[y] !== x)) {\n                    j.hide(w[y]);\n                };\n            };\n            j.show(x);\n            this._fillPlaceholders(u);\n            var z = h.getURIHash(this._initialAttachmentEndpoint), aa = (t === z);\n            s.initWithComponents(aa);\n            this._setAttachmentSelectedClass(s.attachmentClassName);\n            g.inform(\"composer/initializedAttachment\", {\n                composerRoot: this._root,\n                isInitial: aa\n            });\n        },\n        _showAttachmentAfterComponentsLoaded: function(s) {\n            var t = this._attachments[s];\n            i.waitForComponents(this._composerID, t.required_components, this._showAttachment.bind(this, t.instance, s, t.placeholders));\n        },\n        _fillPlaceholders: function(s) {\n            s.forEach(function(t) {\n                var u = i.get(this._composerID, t.component_name);\n                if ((t.element !== u.element.parentNode)) {\n                    k.setContent(t.element, u.element);\n                };\n            }.bind(this));\n        },\n        _setAttachmentSelectedClass: function(s) {\n            var t = l.scry(this._root, \".-cx-PUBLIC-fbComposerAttachment__selected\")[0], u;\n            if (t) {\n                j.removeClass(t, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                u = l.scry(t, \"*[aria-pressed=\\\"true\\\"]\")[0];\n                if (u) {\n                    u.setAttribute(\"aria-pressed\", \"false\");\n                };\n            }\n        ;\n            if (s) {\n                var v = l.scry(this._root, (\".\" + s))[0];\n                if (v) {\n                    j.addClass(v, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                    u = l.scry(v, \"*[aria-pressed=\\\"false\\\"]\")[0];\n                    if (u) {\n                        u.setAttribute(\"aria-pressed\", \"true\");\n                    };\n                }\n            ;\n            }\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerXAttachment\", [\"ComposerXStore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ComposerXStore\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n    h(j.prototype, {\n        getRoot: i,\n        initWithComponents: function(k) {\n        \n        },\n        cleanup: i,\n        reset: i,\n        attachmentClassName: \"\",\n        getComponent: function(k) {\n            return g.get(this._composerID, k);\n        },\n        canSwitchAway: i.thatReturnsTrue,\n        setComposerID: function(k) {\n            this._composerID = k;\n        },\n        allowOGTagPreview: function() {\n            return false;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXController\", [\"Arbiter\",\"ComposerX\",\"ComposerXAttachmentBootstrap\",\"Parent\",\"$\",\"cx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerX\"), i = b(\"ComposerXAttachmentBootstrap\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = b(\"ge\"), o = {\n    };\n    function p(r) {\n        var s = j.byClass(k(r), \"-cx-PRIVATE-fbComposer__root\"), t = s.id;\n        if (!o[t]) {\n            o[t] = new h(s);\n        };\n        return o[t];\n    };\n    var q = {\n        getAttachment: function(r, s, t) {\n            var u = p(r);\n            u.getAttachment(s, t);\n        },\n        fetchAttachmentData: function(r, s, t) {\n            p(r).fetchAttachmentData(s, t);\n        },\n        setAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setAttachment(s, t, u, v);\n        },\n        setInitialAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setInitialAttachment(s, t, u, v);\n        },\n        setComponent: function(r, s, t) {\n            var u = p(r);\n            u.setComponent(s, t);\n        },\n        reset: function(r) {\n            var s = p(r);\n            s.reset();\n        },\n        holdTheMarkup: m,\n        getEndpoint: function(r, s, t) {\n            var u = p(r);\n            i.load(u._attachmentFetchForm, s, t);\n        },\n        addPlaceholders: function(r, s, t) {\n            var u = p(r);\n            u.addPlaceholders(s, t);\n        }\n    };\n    i.bootstrap = function(r) {\n        q.getAttachment(r, r.getAttribute(\"data-endpoint\"));\n    };\n    g.subscribe(\"page_transition\", function() {\n        for (var r in o) {\n            if (!n(r)) {\n                o[r].destroy();\n                delete o[r];\n            }\n        ;\n        };\n    });\n    e.exports = q;\n});\n__d(\"ComposerXAttachmentUtils\", [\"CSS\",\"DataStore\",\"DOMQuery\",\"Focus\",\"Input\",\"PageTransitions\",\"Run\",\"StickyPlaceholderInput\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Focus\"), k = b(\"Input\"), l = b(\"PageTransitions\"), m = b(\"Run\"), n = b(\"StickyPlaceholderInput\"), o = b(\"tx\"), p = \"composer_fixed_placeholder\";\n    function q(s, t) {\n        if (!h.get(s.element, p, false)) {\n            s.instance.setPlaceholder(t);\n        };\n    };\n    var r = {\n        initMentions: function(s, t) {\n            q(s, t);\n            var u = i.find(s.element, \"textarea.input\");\n            j.set(u);\n        },\n        setStickyPlaceholderForMentions: function(s, t) {\n            if ((i.contains(s.element, document.activeElement) && g.hasClass(document.activeElement, \"DOMControl_placeholder\"))) {\n                document.activeElement.blur();\n            };\n            q(s, t);\n        },\n        setPlaceholderIsFixed: function(s, t) {\n            h.set(s.element, p, !!t);\n        },\n        setStickyPlaceholderForTypeahead: function(s, t) {\n            var u = i.find(s, \".textInput\");\n            n.setPlaceholderText(u, t);\n        },\n        registerInputForLeaveWarning: function(s) {\n            m.onBeforeUnload(function() {\n                var t = l.getNextURI();\n                if (t.getQueryData().hasOwnProperty(\"theater\")) {\n                    return\n                };\n                if ((a.Dialog && a.Dialog.getCurrent())) {\n                    return\n                };\n                if (((s.offsetParent !== null) && !k.isEmpty(s))) {\n                    return \"You haven't finished your post yet. Do you want to leave without finishing?\"\n                };\n            });\n        }\n    };\n    e.exports = r;\n});\n__d(\"DragDropFileUpload\", [], function(a, b, c, d, e, f) {\n    f.isSupported = function() {\n        return (typeof (FileList) !== \"undefined\");\n    };\n});\n__d(\"DocumentDragDrop\", [\"Event\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMQuery\",\"DragDropFileUpload\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DragDropFileUpload\"), m = b(\"emptyFunction\"), n = b(\"getObjectValues\"), o = {\n    }, p = 0;\n    function q() {\n        p = 0;\n        n(o).forEach(function(t) {\n            i.removeClass(t.element, t.className);\n            h.inform(\"dragleave\", {\n                element: t.element\n            });\n        });\n    };\n    function r() {\n        if (!l.isSupported()) {\n            return\n        };\n        g.listen(document, \"dragenter\", function(u) {\n            if ((p === 0)) {\n                n(o).forEach(function(v) {\n                    i.addClass(v.element, v.className);\n                    h.inform(\"dragenter\", {\n                        element: v.element,\n                        event: u\n                    });\n                });\n            };\n            p++;\n        });\n        g.listen(document, \"dragleave\", function(u) {\n            p--;\n            if ((p === 0)) {\n                q();\n            };\n        });\n        g.listen(document, \"drop\", function(u) {\n            var v = u.getTarget();\n            if (k.isNodeOfType(u.getTarget(), \"input\")) {\n                if ((v.type === \"file\")) {\n                    return\n                }\n            };\n            u.prevent();\n        });\n        g.listen(document, \"dragover\", g.prevent);\n        var t = null;\n        document.addEventListener(\"dragover\", function() {\n            (t && clearTimeout(t));\n            t = setTimeout(q, 839);\n        }, true);\n        r = m;\n    };\n    var s = {\n        registerStatusElement: function(t, u) {\n            r();\n            o[j.getID(t)] = {\n                element: t,\n                className: u\n            };\n        },\n        removeStatusElement: function(t) {\n            var u = j.getID(t), v = o[u];\n            i.removeClass(v.element, v.className);\n            delete o[u];\n        }\n    };\n    e.exports = s;\n});\n__d(\"DragDropTarget\", [\"Event\",\"CSS\",\"DocumentDragDrop\",\"DragDropFileUpload\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DocumentDragDrop\"), j = b(\"DragDropFileUpload\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this._element = n;\n        this._listeners = [];\n        this._statusElem = n;\n        this._dragEnterCount = 0;\n        this._enabled = false;\n    };\n    k(m.prototype, {\n        _onFilesDropCallback: l,\n        _onURLDropCallback: l,\n        _onPlainTextDropCallback: l,\n        _onDropCallback: l,\n        _fileFilterFn: l.thatReturnsArgument,\n        setOnFilesDropCallback: function(n) {\n            this._onFilesDropCallback = n;\n            return this;\n        },\n        setOnURLDropCallback: function(n) {\n            this._onURLDropCallback = n;\n            return this;\n        },\n        setOnPlainTextDropCallback: function(n) {\n            this._onPlainTextDropCallback = n;\n            return this;\n        },\n        setOnDropCallback: function(n) {\n            this._onDropCallback = n;\n            return this;\n        },\n        enable: function() {\n            if (!j.isSupported()) {\n                return this\n            };\n            i.registerStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            this._listeners.push(g.listen(this._element, \"dragenter\", this._onDragEnter.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragleave\", this._onDragLeave.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragover\", g.kill));\n            this._listeners.push(g.listen(this._element, \"drop\", function(n) {\n                this._dragEnterCount = 0;\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n                var o = {\n                }, p = false, q = this._fileFilterFn(n.dataTransfer.files);\n                if (q.length) {\n                    this._onFilesDropCallback(q, n);\n                    o.files = q;\n                    p = true;\n                }\n            ;\n                var r = (n.dataTransfer.getData(\"url\") || n.dataTransfer.getData(\"text/uri-list\"));\n                if (r) {\n                    this._onURLDropCallback(r, n);\n                    o.url = r;\n                    p = true;\n                }\n            ;\n                var s = n.dataTransfer.getData(\"text/plain\");\n                if (s) {\n                    this._onPlainTextDropCallback(s, n);\n                    o.plainText = s;\n                    p = true;\n                }\n            ;\n                if (p) {\n                    this._onDropCallback(o, n);\n                };\n                n.kill();\n            }.bind(this)));\n            this._enabled = true;\n            return this;\n        },\n        disable: function() {\n            if (!this._enabled) {\n                return this\n            };\n            i.removeStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            h.removeClass(this._statusElem, \"fbDropReady\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n            h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            this._enabled = false;\n            return this;\n        },\n        setFileFilter: function(n) {\n            this._fileFilterFn = n;\n            return this;\n        },\n        setStatusElement: function(n) {\n            this._statusElem = n;\n            return this;\n        },\n        _onDragEnter: function(n) {\n            if ((this._dragEnterCount === 0)) {\n                var o = n.dataTransfer.items, p = false;\n                for (var q = 0; (q < o.length); q++) {\n                    if (!o[q].type.match(\"image/*\")) {\n                        p = true;\n                        break;\n                    }\n                ;\n                };\n                h.addClass(this._statusElem, \"fbDropReady\");\n                if (p) {\n                    h.addClass(this._statusElem, \"fbDropReadyLink\");\n                }\n                 else if ((o.length > 1)) {\n                    h.addClass(this._statusElem, \"fbDropReadyPhotos\");\n                }\n                 else h.addClass(this._statusElem, \"fbDropReadyPhoto\");\n                \n            ;\n            }\n        ;\n            this._dragEnterCount++;\n        },\n        _onDragLeave: function() {\n            this._dragEnterCount = Math.max((this._dragEnterCount - 1), 0);\n            if ((this._dragEnterCount === 0)) {\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ComposerXDragDrop\", [\"Arbiter\",\"ComposerXController\",\"CSS\",\"DragDropTarget\",\"DOMQuery\",\"Parent\",\"URI\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXController\"), i = b(\"CSS\"), j = b(\"DragDropTarget\"), k = b(\"DOMQuery\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = \"/ajax/composerx/attachment/media/upload/\", r = \"/ajax/composerx/attachment/link/scraper/\", s = function(u) {\n        u();\n    };\n    function t(u, v, w, x) {\n        this._root = u;\n        this._composerID = v;\n        this._targetID = w;\n        x = (x || s);\n        this._dragdrop = new j(u).setOnFilesDropCallback(function(y) {\n            x(this._uploadFiles.bind(this, y));\n        }.bind(this)).setFileFilter(t.filterImages).enable();\n        t.handleDragEnterAndLeave(u);\n        g.subscribe(\"composer/deactivateDragdrop\", function() {\n            this.deactivate();\n        }.bind(this));\n        g.subscribe(\"composer/reactivateDragdrop\", function() {\n            this.reactivate();\n        }.bind(this));\n    };\n    n(t, {\n        handleDragEnterAndLeave: function(u) {\n            var v = k.scry(l.byClass(u, \"-cx-PRIVATE-fbComposer__root\"), \".-cx-PUBLIC-fbComposerAttachment__nub\");\n            g.subscribe(\"dragenter\", function(w, x) {\n                if ((u == x.element)) {\n                    v.forEach(i.hide);\n                };\n            });\n            g.subscribe(\"dragleave\", function(w, x) {\n                if ((u == x.element)) {\n                    v.forEach(i.show);\n                };\n            });\n        },\n        filterImages: function(u) {\n            var v = [];\n            for (var w = 0; (w < u.length); w++) {\n                if (u[w].type.match(\"image/*\")) {\n                    v.push(u[w]);\n                };\n            };\n            return v;\n        }\n    });\n    n(t.prototype, {\n        enableURLDropping: function() {\n            this._dragdrop.setOnURLDropCallback(this._onURLDrop.bind(this));\n        },\n        deactivate: function() {\n            this._dragdrop.disable();\n        },\n        reactivate: function() {\n            this._dragdrop.enable();\n        },\n        _uploadFiles: function(u) {\n            h.getAttachment(this._root, q);\n            g.inform(((\"ComposerXFilesStore/filesDropped/\" + this._composerID) + \"/mediaupload\"), {\n                files: u\n            }, g.BEHAVIOR_PERSISTENT);\n        },\n        _onURLDrop: function(u) {\n            var v = new m(r);\n            v.addQueryData({\n                scrape_url: encodeURIComponent(u)\n            });\n            h.getAttachment(this._root, v.toString());\n        }\n    });\n    e.exports = t;\n});\n__d(\"PrivacyConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FRIENDS_PLUS_GAMER_FRIENDS: 128,\n        FRIENDS_MINUS_ACQUAINTANCES: 127,\n        FACEBOOK_EMPLOYEES: 112,\n        CUSTOM: 111,\n        EVERYONE: 80,\n        NETWORKS_FRIENDS_OF_FRIENDS: 60,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SELF: 10,\n        NOBODY: 0\n    }, h = {\n        EVERYONE: 80,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SOME_FRIENDS: 30,\n        SELF: 10,\n        NO_FRIENDS: 0\n    }, i = {\n        NONE: 0,\n        TAGGEES: 1,\n        FRIENDS_OF_TAGGEES: 2\n    }, j = {\n        BaseValue: g,\n        FriendsValue: h,\n        TagExpansion: i\n    };\n    e.exports = j;\n});\n__d(\"ComposerXBootloadStatusAttachment\", [\"Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"ComposerXAttachment\",\"ComposerXController\",\"ComposerXDragDrop\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"PlaceholderListener\",\"PrivacyConst\",\"URI\",\"SelectorDeprecated\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ComposerXAttachment\"), m = b(\"ComposerXController\"), n = b(\"ComposerXDragDrop\"), o = b(\"ComposerXStore\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"DOMQuery\"), s = b(\"Focus\"), t = b(\"Parent\"), u = b(\"PlaceholderListener\"), v = b(\"PrivacyConst\"), w = b(\"URI\"), x = b(\"SelectorDeprecated\"), y = b(\"copyProperties\"), z = b(\"csx\"), aa = b(\"cx\"), ba = {\n    };\n    function ca(da, ea) {\n        this.parent.construct(this);\n        this._root = da;\n        this._config = ea;\n    };\n    k.extend(ca, l);\n    y(ca.prototype, {\n        _attachmentIsActive: false,\n        _bootloading: false,\n        _fullVersion: false,\n        _focusListener: null,\n        _privacyWidgetTags: null,\n        _scraper: null,\n        _dragdrop: null,\n        attachmentClassName: \"-cx-PRIVATE-fbComposerAttachment__status\",\n        getRoot: function() {\n            return this._root;\n        },\n        initWithComponents: function(da) {\n            ba[this._composerID] = this;\n            this._attachmentIsActive = true;\n            var ea = r.find(this.getComponent(\"maininput\").element, \"textarea.input\");\n            if (this._fullVersion) {\n                this._fullInitWithComponents();\n            }\n             else if (!this._bootloading) {\n                if (r.contains(this._root, document.activeElement)) {\n                    this._onInitialFocus();\n                }\n                 else this._focusListener = g.listen(ea, \"focus\", this._onInitialFocus.bind(this));\n            \n            }\n        ;\n            this._dragEnterHandler = h.subscribe(\"dragenter\", function(fa, ga) {\n                if ((ga.element == this._root)) {\n                    var ha = ga.event.dataTransfer.items, ia;\n                    if (ha) {\n                        ia = n.filterImages(ha);\n                    };\n                    if ((ia && (ia.length > 0))) {\n                        s.set(ea);\n                    }\n                     else {\n                        var ja = t.byClass(this._root, \"focus_target\");\n                        u.expandInput(ja);\n                        if ((!this._bootloading && !this._fullVersion)) {\n                            this._onInitialFocus();\n                        };\n                    }\n                ;\n                }\n            ;\n            }.bind(this));\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n            if (!da) {\n                s.set(ea);\n            };\n            if (this._config.plus_version) {\n                this._dragdrop = new n(this._root, this._composerID, this._config.targetID);\n                this._dragdrop.enableURLDropping();\n            }\n        ;\n        },\n        _fullInitWithComponents: function() {\n            j.loadModules([\"ComposerXPrivacyWidgetTags\",\"URLScraper\",\"URI\",], function(da, ea, fa) {\n                this._tagger.init(this);\n                this._privacyWidgetTags = new da(this);\n                var ga = r.find(this.getComponent(\"maininput\").element, \"textarea.input\");\n                if (!this._scraper) {\n                    this._scraper = new ea(ga);\n                    this._scraper.subscribe(\"match\", function(ha, ia) {\n                        var ja = this._getScraperEndpoint();\n                        ja.addQueryData({\n                            scrape_url: encodeURIComponent(ia.url)\n                        });\n                        m.getAttachment(this._root, ja.toString());\n                    }.bind(this));\n                }\n            ;\n                this._scraper.enable();\n                this._scraper.check();\n            }.bind(this));\n            this._initPrivacyReminder();\n        },\n        _initPrivacyReminder: function() {\n            if ((!this._reminderDialog || this._reminderShown)) {\n                return\n            };\n            var da = this.getComponent(\"mainprivacywidget\"), ea = x.getSelectedOptions(da.element), fa = x.getOptionValue(ea[0]);\n            if ((fa !== String(v.BaseValue.SELF))) {\n                return\n            };\n            this._reminderDialog.setContext(this.getComponent(\"mainprivacywidget\").element).show();\n            this._reminderShown = true;\n            var ga = function() {\n                new i(\"/ajax/privacy/reminders/dismiss\").setData({\n                    type: \"only_me\"\n                }).send();\n                this._reminderDialog.hide();\n            }.bind(this);\n            this._reminderEvents = [g.listen(this._reminderDialog.getContent(), \"click\", ga),g.listen(this._reminderDialog.getContext(), \"click\", ga),];\n        },\n        cleanup: function() {\n            this._attachmentIsActive = false;\n            if (this._focusListener) {\n                this._focusListener.remove();\n                this._focusListener = null;\n            }\n        ;\n            if ((this._reminderDialog && this._reminderShown)) {\n                this._reminderDialog.hide();\n                this._reminderEvents.forEach(function(da) {\n                    da.remove();\n                });\n            }\n        ;\n            if (this._dragdrop) {\n                this._dragdrop.deactivate();\n                this._dragdrop = null;\n            }\n        ;\n            if (this._fullVersion) {\n                this._tagger.cleanup();\n                this._privacyWidgetTags.destroy();\n                this._privacyWidgetTags = null;\n                this._scraper.disable();\n            }\n        ;\n            if (this._dragEnterHandler) {\n                this._dragEnterHandler.unsubscribe();\n                this._dragEnterHandler = null;\n            }\n        ;\n        },\n        reset: function() {\n            var da = t.byClass(this._root, \"child_was_focused\");\n            if (da) {\n                p.removeClass(da, \"child_was_focused\");\n            };\n            if (this._tagger) {\n                this._tagger.reset();\n            };\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n        },\n        canSwitchAway: function() {\n            return !t.byClass(this._root, \"async_saving\");\n        },\n        setBootloadedContent: function(da, ea, fa, ga) {\n            this._reminderDialog = ga;\n            var ha = fa.map(function(ia) {\n                return ia.component_name;\n            });\n            o.waitForComponents(this._composerID, ha, function() {\n                var ia = r.find(this._root, \".-cx-PRIVATE-fbComposerBootloadStatus__taggersplaceholder\"), ja = r.find(this._root, \".-cx-PRIVATE-fbComposerBootloadStatus__iconsplaceholder\");\n                q.setContent(ia, da.tagger_content);\n                q.setContent(ja, da.tagger_icons);\n                m.addPlaceholders(this._root, this, fa);\n                this._tagger = ea;\n                this._fullVersion = true;\n                if (this._attachmentIsActive) {\n                    if (this._focusListener) {\n                        this._focusListener.remove();\n                        this._focusListener = null;\n                    }\n                ;\n                    this._fullInitWithComponents();\n                }\n            ;\n            }.bind(this));\n        },\n        _getScraperEndpoint: function() {\n            return w(\"/ajax/composerx/attachment/link/scraper/\");\n        },\n        _onInitialFocus: function() {\n            h.inform(\"composer/focus\");\n            m.getEndpoint(this._root, \"/ajax/composerx/attachment/status/bootload/\", true);\n            this._bootloading = true;\n        },\n        allowOGTagPreview: function() {\n            return true;\n        }\n    });\n    ca.setBootloadedContent = function(da, ea, fa, ga, ha) {\n        var ia = ba[da];\n        if (ia) {\n            ia.setBootloadedContent(ea, fa, ga, ha);\n        };\n    };\n    e.exports = ca;\n});\n__d(\"ComposerXMentionsInputReset\", [\"DOMQuery\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Input\");\n    function i(j) {\n        var k = g.scry(j.element, \"textarea.input\")[0];\n        j.instance.reset();\n        h.reset(k);\n    };\n    e.exports = i;\n});\n__d(\"ComposerXOGTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbOGComposerXTagger__ogactioniconselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n    e.exports = i;\n});\n__d(\"ComposerXPrivacyWidgetReset\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    function h(i) {\n        g.inform(\"Composer/changedtags\", {\n            withTags: [],\n            mention: {\n            },\n            eventTag: false\n        });\n    };\n    e.exports = h;\n});\n__d(\"ComposerXTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__friendiconselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__placeiconselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n    e.exports = i;\n});\n__d(\"SwapButtonDEPRECATED\", [\"Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k(l, m, n) {\n        this._swapperButton = l;\n        this._swappeeButton = m;\n        g.listen(l, \"click\", this.swap.bind(this));\n        if (n) {\n            g.listen(m, \"click\", this.unswap.bind(this));\n        };\n        h.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", this.setFocusOnSwapper.bind(this), h.SUBSCRIBE_ALL);\n    };\n    i(k.prototype, {\n        _swapperButton: null,\n        _swappeeButton: null,\n        swap: function(l) {\n            j.hide(this._swapperButton);\n            j.show(this._swappeeButton);\n            ((l !== false) && this._swappeeButton.focus());\n        },\n        unswap: function(l) {\n            j.show(this._swapperButton);\n            j.hide(this._swappeeButton);\n            ((l !== false) && this._swapperButton.focus());\n        },\n        toggle: function() {\n            j.toggle(this._swapperButton);\n            j.toggle(this._swappeeButton);\n        },\n        setFocusOnSwapper: function() {\n            this._swapperButton.focus();\n        }\n    });\n    e.exports = k;\n});\n__d(\"SubscribeButton\", [\"Arbiter\",\"AsyncRequest\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Event\"), j = {\n        SUBSCRIBED: \"FollowingUser\",\n        UNSUBSCRIBED: \"UnfollowingUser\",\n        init: function(k, l, m, n, o, p) {\n            i.listen(l, \"click\", function() {\n                g.inform(j.SUBSCRIBED, {\n                    profile_id: n\n                });\n            });\n            g.subscribe(j.SUBSCRIBED, function(q, r) {\n                if ((n === r.profile_id)) {\n                    if (!o) {\n                        m.suppressNextMouseEnter();\n                    };\n                    k.swap();\n                    if ((p === true)) {\n                        new h().setURI(\"/ajax/profile/suggestions_on_following.php\").setData({\n                            profileid: n\n                        }).send();\n                    };\n                }\n            ;\n            });\n            g.subscribe(j.UNSUBSCRIBED, function(q, r) {\n                if ((n === r.profile_id)) {\n                    k.unswap();\n                    m.hideFlyout();\n                    g.inform(\"SubMenu/Reset\");\n                }\n            ;\n            });\n        },\n        initUnsubscribe: function(k, l) {\n            i.listen(k, \"click\", function() {\n                g.inform.bind(g, j.UNSUBSCRIBED, {\n                    profile_id: l\n                }).defer();\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"AudienceSelectorTags\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        hasTags: function(i) {\n            return g.hasOwnProperty(i);\n        },\n        setHasTags: function(i) {\n            if (i) {\n                g[i] = true;\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"BasePrivacyOption\", [\"Arbiter\",\"AudienceSelectorTags\",\"copyProperties\",\"CSS\",\"DOM\",\"Env\",\"fbt\",\"Parent\",\"PrivacyConst\",\"SelectorDeprecated\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"fbt\"), n = b(\"Parent\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"tx\");\n    function r(s) {\n        this._selector = n.byClass(s, \"audienceSelector\");\n        this._plusLabel = k.scry(s, \".plusLabel\")[0];\n        if (!this._selector) {\n            return\n        };\n        this._elem = s;\n        this._taggedIDs = [];\n        this._tags = [];\n        this._hasEvent = false;\n        this._recalculateTooltipAndLabel();\n        this._updateSelector();\n        g.subscribe(\"Composer/changedtags\", function(t, u) {\n            if (!this._getChangedData()) {\n                return\n            };\n            var v = this._hasEvent;\n            this._hasEvent = !!u.eventTag;\n            this._tags = u.withTags.map(function(y) {\n                return y.getText();\n            });\n            this._taggedIDs = u.withTags.map(function(y) {\n                return y.getValue();\n            });\n            for (var w in u.mention) {\n                if (((u.mention[w].type == \"user\") && (u.mention[w].uid != l.user))) {\n                    this._tags.push(u.mention[w].text);\n                    this._taggedIDs.push(u.mention[w].uid);\n                }\n                 else if ((u.mention[w].type == \"event\")) {\n                    this._hasEvent = true;\n                }\n            ;\n            };\n            if ((this._hasEvent && (v != this._hasEvent))) {\n                this._eventTagChanged();\n            };\n            var x = this._recalculateTooltipAndLabel();\n            if ((x && p.isOptionSelected(this._elem))) {\n                this._updateSelector();\n                g.inform(\"SelectedPrivacyOption/changed\", this._getChangedData());\n            }\n        ;\n        }.bind(this));\n        p.listen(this._selector, \"change\", this._updateSelector.bind(this));\n    };\n    i(r.prototype, {\n        _eventTagChanged: function() {\n        \n        },\n        _getChangedData: function() {\n            return null;\n        },\n        _recalculateTooltipAndLabel: function() {\n            var s = this._tooltip, t = this._label, u = this._getIncludedAudience(), v = this._getExcludedAudience(), w = this._getTagExpansionText();\n            if (w) {\n                u = m._(\"{list of people who can see this}, {list of additional people who can see this}\", [m.param(\"list of people who can see this\", u),m.param(\"list of additional people who can see this\", w),]);\n            };\n            this._tooltip = this._getCombinedSentence(u, v);\n            this._recalcLabel();\n            return (((s != this._tooltip)) || ((t != this._label)));\n        },\n        _getIncludedAudience: function() {\n            return this._elem.getAttribute(\"data-label\");\n        },\n        _getExcludedAudience: function() {\n            return \"\";\n        },\n        _getTagExpansionText: function() {\n            var s = this._getTagExpansionBehavior();\n            if ((!!this._taggedIDs.length || this._alreadyHasTags())) {\n                if ((s == o.TagExpansion.FRIENDS_OF_TAGGEES)) {\n                    if (this._hasEvent) {\n                        return \"friends of anyone tagged, event guests\"\n                    };\n                    return \"friends of anyone tagged\";\n                }\n                 else if ((s == o.TagExpansion.TAGGEES)) {\n                    return \"Anyone tagged\"\n                }\n            ;\n                return \"\";\n            }\n        ;\n            if ((this._hasEvent && (s == o.TagExpansion.FRIENDS_OF_TAGGEES))) {\n                return \"event guests\"\n            };\n            return \"\";\n        },\n        _getCombinedSentence: function(s, t) {\n            if (!t) {\n                return s\n            };\n            return m._(\"{list of people who can see this}; Except: {list of people who cannot see this}\", [m.param(\"list of people who can see this\", s),m.param(\"list of people who cannot see this\", t),]);\n        },\n        _recalcLabel: function() {\n            this._label = this._elem.getAttribute(\"data-label\");\n            if (this._showPlusLabel()) {\n                this._label += \" (+)\";\n            };\n            j.conditionShow(this._plusLabel, this._showPlusLabel());\n        },\n        _showPlusLabel: function() {\n            var s = this._getTagExpansionBehavior();\n            return (((!!this._taggedIDs.length && (s != o.TagExpansion.NONE))) || ((!!this._hasEvent && (s == o.TagExpansion.FRIENDS_OF_TAGGEES))));\n        },\n        _getTagExpansionBehavior: function() {\n            return o.TagExpansion.NONE;\n        },\n        _alreadyHasTags: function() {\n            var s = k.scry(this._selector, \"*[data-oid]\")[0];\n            s = (s && s.getAttribute(\"data-oid\"));\n            return (s && h.hasTags(s));\n        },\n        _updateSelector: function() {\n            if (p.isOptionSelected(this._elem)) {\n                p.setButtonTooltip(this._selector, this._tooltip);\n                return false;\n            }\n        ;\n            return true;\n        }\n    });\n    e.exports = r;\n});\n__d(\"CustomPrivacyOption\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"Event\",\"Form\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"BasePrivacyOption\"), k = b(\"Class\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"Form\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"copyProperties\");\n    function r(s, t, u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!s) {\n            return\n        };\n        this._baseAudienceValue = aa;\n        this._includedAudience = ba;\n        this._excludedAudience = ca;\n        this._tagExpansionBehavior = da;\n        (function() {\n            this.initCustomState(s, t, u);\n            m.listen(s, \"click\", function(event) {\n                this.openCustomDialog(event, t, v, x, y, z);\n            }.bind(this));\n            p.listen(this._selector, \"select\", function(ea) {\n                if ((ea.option._id != this._id)) {\n                    this.clearCustomState();\n                };\n            }.bind(this));\n            this.parent.construct(this, s);\n        }).bind(this).defer();\n    };\n    k.extend(r, j);\n    q(r, {\n        _instances: {\n        },\n        update: function(s, t, u, v, w, x, y, z) {\n            var aa = r._instances[s];\n            aa._update(t, u)._updateOptionValues(w, x, y, z)._updateOption(u);\n            g.inform(\"Form/change\", {\n                node: aa._container\n            });\n        },\n        getData: function(s) {\n            return r._instances[s]._privacyData;\n        },\n        setPrivacyData: function(s, t, u) {\n            r._instances[s]._update(t, u);\n            r._instances[s]._updateOption(u);\n        }\n    });\n    q(r.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: this._baseAudienceValue\n            };\n        },\n        _updateOptionValues: function(s, t, u, v) {\n            this._baseAudienceValue = s;\n            this._includedAudience = t;\n            this._excludedAudience = u;\n            this._tagExpansionBehavior = v;\n            return this;\n        },\n        _updateOption: function(s) {\n            var t = (p.getOption(this._selector, s) || p.getOption(this._selector, (o.BaseValue.CUSTOM + \"\")));\n            this._recalculateTooltipAndLabel();\n            g.inform(\"CustomPrivacyOption/update\", {\n                selector: this._selector,\n                option: t,\n                tooltip: this._tooltip,\n                label: this._label\n            });\n            return this;\n        },\n        _getIncludedAudience: function() {\n            return this._includedAudience;\n        },\n        _getExcludedAudience: function() {\n            return this._excludedAudience;\n        },\n        _getTagExpansionBehavior: function() {\n            return this._tagExpansionBehavior;\n        },\n        _update: function(s, t) {\n            var u = ((t == o.BaseValue.CUSTOM) || !p.getOption(this._selector, t)), v = this._selector.getAttribute(\"data-name\");\n            this.updateCustomState(s, u, v);\n            return this;\n        },\n        initCustomState: function(s, t, u) {\n            r._instances[t] = this;\n            this._container = l.find(s, \".customPrivacyInputs\");\n            this._id = u;\n            this._privacyData = {\n            };\n            var v = n.serialize(this._container);\n            if (v.audience) {\n                this._privacyData = v.audience[u];\n            };\n            return s;\n        },\n        openCustomDialog: function(event, s, t, u, v, w) {\n            var x = new i(\"/ajax/privacy/custom_dialog/\").setData({\n                option_id: s,\n                id: this._id,\n                privacy_data: this._privacyData,\n                explain_tags: t,\n                autosave: u,\n                limit_to_friends: v,\n                source: w\n            });\n            x.setRelativeTo(event.getTarget());\n            h.send(x);\n        },\n        updateCustomState: function(s, t, u) {\n            this.clearCustomState();\n            this._privacyData = q({\n            }, s);\n            if (t) {\n                if (u) {\n                    u = u.slice(0, -\"[value]\".length);\n                    var v = {\n                    };\n                    v[u] = s;\n                    n.createHiddenInputs(v, this._container, null, true);\n                }\n            \n            };\n        },\n        clearCustomState: function() {\n            this._privacyData = {\n            };\n            l.empty(this._container);\n        }\n    });\n    e.exports = r;\n});\n__d(\"DynamicIconSelector\", [\"Button\",\"CSS\",\"DOM\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Button\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"SelectorDeprecated\"), k = {\n        swapIcon: function(l) {\n            var m = j.getSelectedOptions(l)[0], n = (m && i.scry(m, \".itemIcon\")[0]), o = j.getSelectorButton(l);\n            if (n) {\n                g.setIcon(o, n.cloneNode(true));\n            }\n             else {\n                var p = i.scry(o, \".img\")[0];\n                (p && i.remove(p));\n            }\n        ;\n            h.conditionClass(o, \"uiSelectorChevronOnly\", !n);\n        }\n    };\n    j.subscribe(\"change\", function(l, m) {\n        var n = m.selector;\n        if (h.hasClass(n, \"dynamicIconSelector\")) {\n            k.swapIcon(n);\n        };\n    });\n    e.exports = k;\n});\n__d(\"AudienceSelector\", [\"Arbiter\",\"AudienceSelectorTags\",\"CSS\",\"CustomPrivacyOption\",\"DOM\",\"DynamicIconSelector\",\"PrivacyConst\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"CSS\"), j = b(\"CustomPrivacyOption\"), k = b(\"DOM\"), l = b(\"DynamicIconSelector\"), m = b(\"PrivacyConst\"), n = b(\"SelectorDeprecated\"), o = {\n    };\n    n.subscribe(\"select\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return\n        };\n        var s = n.getOptionValue(r.option);\n        r.value = s;\n        g.inform(\"AudienceSelector/changed\", r);\n        if (((s == m.BaseValue.CUSTOM) && !i.hasClass(r.option, \"noDialog\"))) {\n            n.toggle(r.selector);\n            return false;\n        }\n    ;\n        if (i.hasClass(r.selector, \"dataTooltip\")) {\n            var t = k.find(r.option, \".itemAnchor\").getAttribute(\"data-tooltip\");\n            n.setButtonTooltip(r.selector, (t || null));\n        }\n    ;\n        if (!i.hasClass(r.option, \"specialOption\")) {\n            return\n        };\n        var u = k.find(r.option, \"a\").getAttribute(\"data-type\");\n        if (i.hasClass(r.option, \"moreOption\")) {\n            i.addClass(r.selector, u);\n            i.addClass(r.selector, \"showSecondaryOptions\");\n            return false;\n        }\n         else if (i.hasClass(r.option, \"returnOption\")) {\n            i.removeClass(r.selector, \"showSecondaryOptions\");\n            i.removeClass(r.selector, \"friendList\");\n            return false;\n        }\n        \n    ;\n    });\n    var p = {\n        keepSynchronized: function(q, r) {\n            (o[q] || (o[q] = {\n            }));\n            o[q][r.id] = r;\n        },\n        setHasTags: function(q) {\n            h.setHasTags(q);\n        }\n    };\n    g.subscribe(\"CustomPrivacyOption/update\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return\n        };\n        n.setSelected(r.selector, n.getOptionValue(r.option));\n        l.swapIcon(r.selector);\n        n.setButtonLabel(r.selector, r.label);\n        n.setButtonTooltip(r.selector, r.tooltip);\n        g.inform(\"AudienceSelector/update\", r);\n    });\n    g.subscribe([\"AudienceSelector/changed\",\"AudienceSelector/update\",], function(event, q) {\n        var r = n.getOptionValue(q.option), s = {\n        };\n        if ((r == m.BaseValue.CUSTOM)) {\n            if ((event == \"AudienceSelector/changed\")) {\n                return\n            };\n            s = j.getData(q.option.id);\n        }\n    ;\n        for (var t in o) {\n            var u = o[t];\n            if (u[q.selector.id]) {\n                g.inform(\"AudienceSelector/syncNonSelectorIcon\", {\n                    category: t\n                });\n                for (var v in u) {\n                    var w = u[v];\n                    if ((!w || (q.selector === w))) {\n                        continue;\n                    };\n                    if ((n.getValue(w) !== r)) {\n                        n.setSelected(w, r);\n                        l.swapIcon(w);\n                    }\n                ;\n                    if ((r == m.BaseValue.CUSTOM)) {\n                        var x = n.getOption(w, (m.BaseValue.CUSTOM + \"\"));\n                        if (x) {\n                            j.setPrivacyData(x.id, s, r);\n                            n.setButtonTooltip(w, q.tooltip);\n                        }\n                    ;\n                    }\n                ;\n                };\n            }\n        ;\n        };\n    });\n    e.exports = p;\n});\n__d(\"ErrorDialog\", [\"Dialog\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\"), h = b(\"emptyFunction\"), i = {\n        showAsyncError: function(j) {\n            try {\n                return i.show(j.getErrorSummary(), j.getErrorDescription());\n            } catch (k) {\n                alert(j);\n            };\n        },\n        show: function(j, k, l, m) {\n            return (new g()).setTitle(j).setBody(k).setButtons([g.OK,]).setStackable(true).setModal(true).setHandler((l || h)).setButtonsMessage((m || \"\")).show();\n        }\n    };\n    e.exports = i;\n});\n__d(\"Tour\", [\"Arbiter\",\"LayerDestroyOnHide\",\"LayerHideOnEscape\",\"copyProperties\",\"NavigationMessage\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"LayerDestroyOnHide\"), i = b(\"LayerHideOnEscape\"), j = b(\"copyProperties\"), k = b(\"NavigationMessage\");\n    function l() {\n        if (l._instance) {\n            l._instance.setTourComplete();\n        };\n        l._instance = this;\n    };\n    j(l.prototype, {\n        tourStarted: false,\n        tourComplete: false,\n        _navigationBeginToken: null,\n        _pageLeaveToken: null,\n        steps: {\n        },\n        openDialog: null,\n        init: function() {\n            this._pageLeaveToken = g.subscribe(\"onload/exit\", this.handleLeavePage.bind(this));\n            this._navigationBeginToken = g.subscribe(k.NAVIGATION_BEGIN, this.handleTransition.bind(this));\n            this.steps = {\n            };\n            return this;\n        },\n        registerStep: function(m, n) {\n            m.disableBehavior(h);\n            m.disableBehavior(i);\n            this.steps[n] = m;\n            m.subscribe(\"show\", function() {\n                m.inform(\"tour-dialog-show\", m);\n            });\n            if (!this.getTourStarted()) {\n                this.setTourStart();\n            };\n        },\n        _unsubscribeSubscriptions: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._pageLeaveToken.unsubscribe();\n        },\n        handleLeavePage: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTransition: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTourStart: function() {\n        \n        },\n        handleTourStop: function() {\n        \n        },\n        handleTourComplete: function() {\n        \n        },\n        showStep: function(m) {\n            var n = this.steps[m];\n            if (!((this.openDialog == n))) {\n                this.hideOpenDialog();\n            };\n            if (!n) {\n                return\n            };\n            this.openDialog = n;\n            n.show();\n        },\n        hideOpenDialog: function() {\n            if (this.openDialog) {\n                this.openDialog.hide();\n                this.openDialog = null;\n            }\n        ;\n        },\n        getTourStarted: function() {\n            return this.tourStarted;\n        },\n        setTourStart: function() {\n            this.tourStarted = true;\n            this.handleTourStart();\n        },\n        setTourStop: function() {\n            this.tourStarted = false;\n            this.hideOpenDialog();\n            this.handleTourStop();\n        },\n        setTourComplete: function() {\n            if (this.tourComplete) {\n                return\n            };\n            this.setTourStop();\n            this.tourComplete = true;\n            this.handleTourComplete();\n        },\n        hideStep: function(m) {\n            var n = this.steps[m];\n            (n && n.hide());\n        }\n    });\n    j(l, {\n        getInstance: function() {\n            return (l._instance || (l._instance = new l()));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FutureSideNavItem\", [\"Arbiter\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\");\n    function n(o, p) {\n        this.id = o.id;\n        this.up = p;\n        this.endpoint = o.endpoint;\n        this.type = o.type;\n        this.node = (o.node || k(o.id));\n        this.paths = (o.path ? m(o.path) : []);\n        this.keys = (o.key ? m(o.key) : []);\n        var q = this._findKeys(this.keys);\n        this.numericKey = (q.numeric || this.keys[0]);\n        this.textKey = (q.text || this.keys[0]);\n        this._pathPattern = this._buildRegex(this.paths);\n        this._keyPattern = this._buildRegex(this.keys);\n        this.hideLoading();\n        this.hideSelected();\n    };\n    l(n.prototype, {\n        equals: function(o) {\n            return (o && (o.id === this.id));\n        },\n        getLinkNode: function() {\n            return ((i.scry(this.node, \"a.item\")[0] || i.scry(this.node, \"a.subitem\")[0]));\n        },\n        matchPath: function(o) {\n            return this._matchInput(this._pathPattern, o);\n        },\n        matchKey: function(o) {\n            return this._matchInput(this._keyPattern, o);\n        },\n        _matchInput: function(o, p) {\n            var q = (o && o.exec(p));\n            return (q && q.slice(1));\n        },\n        getTop: function() {\n            return (this.isTop() ? this : this.up.getTop());\n        },\n        isTop: function(o) {\n            return !this.up;\n        },\n        setCount: function(o, p) {\n            return this._updateCount(o, true);\n        },\n        incrementCount: function(o, p) {\n            return this._updateCount(o, false);\n        },\n        _updateCount: function(o, p, q) {\n            var r = i.scry(this.node, \"span.count\")[0], s = (r && i.scry(r, \"span.countValue\")[0]);\n            if (s) {\n                var t = (p ? 0 : parseInt(i.getText(s), 10)), u = Math.max(0, (t + o)), v = (this.isTop() ? \"hidden\" : \"hiddenSubitem\");\n                i.setContent(s, u);\n                (q && h.conditionClass(this.node, v, !u));\n                h.conditionClass(r, \"hidden_elem\", !u);\n                if (this.isTop()) {\n                    var w = i.scry(this.node, \"div.linkWrap\")[0];\n                    if (w) {\n                        h.conditionClass(w, \"noCount\", !u);\n                        h.conditionClass(w, \"hasCount\", u);\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n            g.inform(\"NavigationMessage.COUNT_UPDATE_DONE\");\n        },\n        showLoading: function() {\n            h.addClass(this.node, \"loading\");\n        },\n        hideLoading: function() {\n            h.removeClass(this.node, \"loading\");\n        },\n        showSelected: function() {\n            h.addClass(this.node, \"selectedItem\");\n            (h.hasClass(this.node, \"hider\") && h.addClass(this._getExpanderParent(), \"expandedMode\"));\n        },\n        hideSelected: function() {\n            h.removeClass(this.node, \"selectedItem\");\n        },\n        showChildren: function() {\n            h.addClass(this.node, \"open\");\n        },\n        hideChildren: function() {\n            h.removeClass(this.node, \"open\");\n        },\n        _getExpanderParent: function() {\n            return j.byClass(this.node, \"expandableSideNav\");\n        },\n        _buildRegex: function(o) {\n            if (o.length) {\n                var p = o.map(function(q) {\n                    if ((typeof q === \"string\")) {\n                        return q.replace(/([^a-z0-9_])/gi, \"\\\\$1\");\n                    }\n                     else if ((q && q.regex)) {\n                        return q.regex\n                    }\n                ;\n                });\n                return new RegExp(((\"^(?:\" + p.join(\"|\")) + \")$\"));\n            }\n        ;\n        },\n        _findKeys: function(o) {\n            var p = /^(app|group|fl)_/, q = {\n            };\n            for (var r = 0; (r < o.length); r++) {\n                var s = p.test(o[r]);\n                if ((s && !q.numeric)) {\n                    q.numeric = o[r];\n                }\n                 else if ((!s && !q.text)) {\n                    q.text = o[r];\n                }\n            ;\n                if ((q.numeric && q.text)) {\n                    break;\n                };\n            };\n            return q;\n        }\n    });\n    e.exports = n;\n});\n__d(\"FutureSideNavSection\", [\"Bootloader\",\"DOMQuery\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"DOMQuery\"), i = b(\"$\"), j = b(\"copyProperties\");\n    function k(l) {\n        this.id = l.id;\n        this.node = (this.node || i(l.id));\n        this.editEndpoint = l.editEndpoint;\n    };\n    j(k.prototype, {\n        equals: function(l) {\n            return (l && (l.id === this.id));\n        },\n        getEditorAsync: function(l) {\n            g.loadModules([\"SortableSideNav\",], function(m) {\n                var n = new m(h.find(this.node, \"ul.uiSideNav\"), this.editEndpoint);\n                l(n);\n            }.bind(this));\n        }\n    });\n    e.exports = k;\n});\n__d(\"FutureSideNav\", [\"Arbiter\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Event\",\"FutureSideNavItem\",\"FutureSideNavSection\",\"NavigationMessage\",\"PageTransitions\",\"Parent\",\"Run\",\"SelectorDeprecated\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"ChannelConstants\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Event\"), m = b(\"FutureSideNavItem\"), n = b(\"FutureSideNavSection\"), o = b(\"NavigationMessage\"), p = b(\"PageTransitions\"), q = b(\"Parent\"), r = b(\"Run\"), s = b(\"SelectorDeprecated\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"Vector\"), w = b(\"copyProperties\"), x = b(\"createArrayFrom\");\n    function y() {\n        (y.instance && y.instance.uninstall());\n        y.instance = this;\n    };\n    y.instance = null;\n    y.getInstance = function() {\n        return (y.instance || new y());\n    };\n    w(y.prototype, {\n        init: function(z, aa, ba) {\n            this.root = z;\n            this.items = {\n            };\n            this.sections = {\n            };\n            this.editor = null;\n            this.editing = false;\n            this.selected = null;\n            this.loading = null;\n            this.keyParam = \"sk\";\n            this.defaultKey = aa;\n            this.uri = t.getRequestURI();\n            this.ajaxPipe = ba;\n            this.ajaxPipeEndpoints = {\n            };\n            this.sidecol = true;\n            this._installed = true;\n            this._handlePageTransitions = true;\n            p.registerHandler(function(ca) {\n                return (this._handlePageTransitions && this.handlePageTransition(ca));\n            }.bind(this));\n            this._eventHandlers = [];\n            this._arbiterSubscriptions = [g.subscribe(o.NAVIGATION_COMPLETED, this.navigationComplete.bind(this)),g.subscribe(o.NAVIGATION_FAILED, this.navigationFailed.bind(this)),g.subscribe(o.NAVIGATION_COUNT_UPDATE, this.navigationCountUpdate.bind(this)),g.subscribe(o.NAVIGATION_SELECT, this.navigationSelect.bind(this)),g.subscribe(i.getArbiterType(\"nav_update_counts\"), this.navigationCountUpdateFromPresence.bind(this)),];\n            this._explicitHover = [];\n            this._ensureHover(\"sideNavItem\");\n            this._eventHandlers.push(l.listen(window, \"resize\", this._handleResize.bind(this)));\n            this._checkNarrow();\n            this._selectorSubscriptions = [];\n            (window.Selector && this._selectorSubscriptions.push(s.subscribe([\"open\",\"close\",], function(ca, da) {\n                var ea = q.byClass(da.selector, \"sideNavItem\");\n                (ea && j.conditionClass(ea, \"editMenuOpened\", (ca === \"open\")));\n            })));\n            r.onLeave(this.uninstall.bind(this));\n            if (this._pendingSections) {\n                this._pendingSections.forEach(function(ca) {\n                    this.initSection.apply(this, ca);\n                }.bind(this));\n            };\n        },\n        _handleResize: (function() {\n            var z;\n            return function() {\n                (z && clearTimeout(z));\n                z = this._checkNarrow.bind(this).defer(200);\n            };\n        })(),\n        _checkNarrow: function() {\n            j.conditionClass(this.root, \"uiNarrowSideNav\", (v.getElementPosition(this.root).x < 20));\n        },\n        _ensureHover: function(z) {\n            if ((u.ie() < 8)) {\n                h.loadModules([\"ExplicitHover\",], function(aa) {\n                    this._explicitHover.push(new aa(this.root, z));\n                }.bind(this));\n            };\n        },\n        uninstall: function() {\n            if (this._installed) {\n                this._installed = false;\n                this._handlePageTransitions = false;\n                this._arbiterSubscriptions.forEach(g.unsubscribe);\n                this._selectorSubscriptions.forEach(function(z) {\n                    s.unsubscribe(z);\n                });\n                this._eventHandlers.forEach(function(z) {\n                    z.remove();\n                });\n                this._explicitHover.forEach(function(z) {\n                    z.uninstall();\n                });\n            }\n        ;\n        },\n        initSection: function(z, aa) {\n            if (!this._installed) {\n                this._pendingSections = (this._pendingSections || []);\n                this._pendingSections.push(arguments);\n                return;\n            }\n        ;\n            this._initItems(aa);\n            this._initSection(z);\n        },\n        addItem: function(z, aa) {\n            this._initItem(z, aa);\n        },\n        _initItems: function(z) {\n            var aa = function(ba, ca) {\n                var da = this._initItem(ba, ca);\n                if (ba.children) {\n                    ba.children.forEach(function(ea) {\n                        aa(ea, da);\n                    });\n                };\n            }.bind(this);\n            x(z).forEach(function(ba) {\n                aa(ba, null);\n            });\n        },\n        _initItem: function(z, aa) {\n            var ba = this.items[z.id] = this._constructItem(z, aa);\n            if ((ba.equals(this.selected) || z.selected)) {\n                this.setSelected(ba);\n            };\n            var ca = ba.getLinkNode();\n            (ca && this._eventHandlers.push(l.listen(ca, \"click\", function(event) {\n                return !this.editing;\n            }.bind(this))));\n            return ba;\n        },\n        _initSection: function(z) {\n            var aa = this.sections[z.id] = this._constructSection(z);\n            this._eventHandlers.push(l.listen(aa.node, \"click\", this.handleSectionClick.bind(this, aa)));\n            k.scry(aa.node, \"div.bookmarksMenuButton\").forEach(j.show);\n            return aa;\n        },\n        _constructItem: function(z, aa) {\n            return new m(z, aa);\n        },\n        _constructSection: function(z) {\n            return new n(z);\n        },\n        handleSectionClick: function(z, event) {\n            var aa = this._getEventTarget(event, \"a\"), ba = this._getItemForNode(aa);\n            if (!aa) {\n                return;\n            }\n             else if (j.hasClass(aa.parentNode, \"uiMenuItem\")) {\n                this._handleMenuClick(z, ba, aa.parentNode, event);\n            }\n             else this._handleLinkClick(z, aa, event);\n            \n        ;\n        },\n        _getEventTarget: function(event, z) {\n            var aa = event.getTarget();\n            if ((aa.tagName !== z.toUpperCase())) {\n                return q.byTag(aa, z);\n            }\n             else return aa\n        ;\n        },\n        _handleMenuClick: function(z, aa, ba, event) {\n            if (j.hasClass(ba, \"rearrange\")) {\n                this.beginEdit(z);\n            };\n        },\n        _handleLinkClick: function(z, aa, event) {\n            if (j.hasClass(aa, \"navEditDone\")) {\n                (this.editing ? this.endEdit() : this.beginEdit(z));\n                event.kill();\n            }\n        ;\n        },\n        getItem: function(z) {\n            if (this._isCurrentPath(z)) {\n                return this._getItemForKey((this._getKey(z.getQueryData()) || this.defaultKey));\n            }\n             else return this._getItemForPath(z.getPath())\n        ;\n        },\n        getNodeForKey: function(z) {\n            var aa = this._getItemForKey(z);\n            if (aa) {\n                return aa.node\n            };\n        },\n        _isCurrentPath: function(z) {\n            return ((z.getDomain() === this.uri.getDomain()) && (z.getPath() === this.uri.getPath()));\n        },\n        _getKey: function(z) {\n            return z[this.keyParam];\n        },\n        _getItemForNode: function(z) {\n            z = q.byClass(z, \"sideNavItem\");\n            return (z && this.items[z.id]);\n        },\n        _getItemForKey: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchKey(z);\n            });\n        },\n        _getItemForPath: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchPath(z);\n            });\n        },\n        _findItem: function(z) {\n            for (var aa in this.items) {\n                if (z(this.items[aa])) {\n                    return this.items[aa]\n                };\n            };\n        },\n        removeItem: function(z) {\n            if ((z && this.items[z.id])) {\n                k.remove(z.node);\n                delete this.items[z.id];\n            }\n        ;\n        },\n        removeItemByKey: function(z) {\n            this.removeItem(this._getItemForKey(z));\n        },\n        moveItem: function(z, aa, ba) {\n            var ca = k.find(z.node, \"ul.uiSideNav\");\n            ((ba ? k.prependContent : k.appendContent))(ca, aa.node);\n        },\n        setLoading: function(z) {\n            (this.loading && this.loading.hideLoading());\n            this.loading = z;\n            (this.loading && this.loading.showLoading());\n        },\n        setSelected: function(z) {\n            this.setLoading(null);\n            if (this.selected) {\n                this.selected.hideSelected();\n                this.selected.getTop().hideChildren();\n            }\n        ;\n            this.selected = z;\n            if (this.selected) {\n                this.selected.showSelected();\n                this.selected.getTop().showChildren();\n            }\n        ;\n        },\n        handlePageTransition: function(z) {\n            var aa = this.getItem(z), ba = ((aa && aa.endpoint) && this._doPageTransition(aa, z));\n            return ba;\n        },\n        _doPageTransition: function(z, aa) {\n            this.setLoading(z);\n            this._sendPageTransition(z.endpoint, w(this._getTransitionData(z, aa), aa.getQueryData()));\n            return true;\n        },\n        _sendPageTransition: function(z, aa) {\n            aa.endpoint = z;\n            g.inform(o.NAVIGATION_BEGIN, {\n                useAjaxPipe: this._useAjaxPipe(z),\n                params: aa\n            });\n        },\n        _getTransitionData: function(z, aa) {\n            var ba = {\n            };\n            ba.sidecol = this.sidecol;\n            ba.path = aa.getPath();\n            ba[this.keyParam] = z.textKey;\n            ba.key = z.textKey;\n            return ba;\n        },\n        _useAjaxPipe: function(z) {\n            return (this.ajaxPipe || this.ajaxPipeEndpoints[z]);\n        },\n        navigationComplete: function() {\n            (this.loading && this.setSelected(this.loading));\n        },\n        navigationFailed: function() {\n            this.setLoading(null);\n        },\n        navigationSelect: function(z, aa) {\n            var ba = this._getItemForKey(this._getKey(aa));\n            if (aa.asLoading) {\n                this.setLoading(ba);\n            }\n             else this.setSelected(ba);\n        ;\n        },\n        navigationCountUpdate: function(z, aa) {\n            var ba = this._getItemForKey((aa && aa.key));\n            if (ba) {\n                if ((typeof aa.count !== \"undefined\")) {\n                    ba.setCount(aa.count, aa.hide);\n                }\n                 else if ((typeof aa.increment !== \"undefined\")) {\n                    ba.incrementCount(aa.increment, aa.hide);\n                }\n            \n            };\n        },\n        navigationCountUpdateFromPresence: function(z, aa) {\n            aa = aa.obj;\n            if (aa) {\n                if ((!aa.class_name || (aa.class_name && j.hasClass(this.root, aa.class_name)))) {\n                    if (aa.items) {\n                        for (var ba = 0; (ba < aa.items.length); ba++) {\n                            this.navigationCountUpdate(z, aa.items[ba]);;\n                        }\n                    }\n                }\n            };\n        },\n        beginEdit: function(z) {\n            if (!this.editing) {\n                this.editing = true;\n                j.addClass(this.root, \"editMode\");\n                this._updateTrackingData();\n                this._initEditor(z);\n            }\n        ;\n        },\n        endEdit: function() {\n            if (this.editing) {\n                j.removeClass(this.root, \"editMode\");\n                (this.editor && this.editor.endEdit());\n                this.editor = null;\n                this.editing = false;\n                this._updateTrackingData();\n            }\n        ;\n        },\n        _updateTrackingData: function(z) {\n            var aa = (this.root.getAttribute(\"data-gt\") || \"{}\");\n            try {\n                aa = JSON.parse(aa);\n                if (this.editing) {\n                    aa.editing = true;\n                }\n                 else delete aa.editing;\n            ;\n                this.root.setAttribute(\"data-gt\", JSON.stringify(aa));\n            } catch (ba) {\n            \n            };\n        },\n        _initEditor: function(z) {\n            z.getEditorAsync(function(aa) {\n                if (this.editing) {\n                    this.editor = aa;\n                    this.editor.beginEdit();\n                }\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = y;\n});\n__d(\"PageFanning\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DOM\",\"FutureSideNav\",\"Parent\",\"URI\",\"$\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"FutureSideNav\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"$\"), o = b(\"collectDataAttributes\"), p = b(\"copyProperties\"), q = {\n        setFanStatus: function(s, t, u, v, w, x, y) {\n            var z = {\n                ft: {\n                }\n            };\n            if (s) {\n                z = {\n                    ft: o(s, [\"ft\",]).ft\n                };\n            };\n            w = (w || function(ca) {\n                var da = ca.getPayload();\n                if ((!da || !s)) {\n                    return\n                };\n                if (da.reload) {\n                    q.reloadOnFanStatusChanged(da.preserve_tab);\n                }\n                 else r(s, da);\n            ;\n            });\n            var aa = {\n                fbpage_id: t,\n                add: u,\n                reload: v\n            };\n            if ((y != null)) {\n                p(aa, y);\n            };\n            p(aa, z);\n            var ba = new h().setURI(\"/ajax/pages/fan_status.php\").setData(aa).setNectarModuleDataSafe(s).setHandler(w);\n            if (x) {\n                ba.setErrorHandler(x);\n            };\n            ba.send();\n            return false;\n        },\n        reloadOnFanStatusChanged: function(s) {\n            var t = m.getRequestURI();\n            if (s) {\n                var u = k.getInstance().selected.textKey;\n                if ((!t.getQueryData().sk && u)) {\n                    t.addQueryData({\n                        sk: u\n                    });\n                };\n            }\n        ;\n            window.location.href = t;\n        },\n        toggleLikeOnFanStatusChanged: function(s, t) {\n            var u = n((\"liked_pages_like_action_\" + s)), v = n((\"liked_pages_undo_action_\" + s));\n            i.conditionClass(u, \"hidden_elem\", t);\n            i.conditionClass(v, \"hidden_elem\", !t);\n        },\n        informPageLikeButtonOnChange: function(s, t) {\n            var u = a.PageLikeButton;\n            if (u) {\n                if (t) {\n                    u.informLike(s);\n                    u.informLikeSuccess(s);\n                }\n                 else u.informUnlike(s);\n            \n            };\n        }\n    };\n    function r(s, t) {\n        var u = t.feedback;\n        if (!u) {\n            return\n        };\n        if (l.byClass(s, \"fbTimelineEscapeSectionItem\")) {\n            s = (l.byClass(s, \"fan_status_inactive\") || s);\n        };\n        var v = j.create(\"span\", {\n            className: \"fan_status_inactive\"\n        }, u);\n        s.parentNode.replaceChild(v, s);\n        var w = function() {\n            if (t.can_repeat_action) {\n                v.parentNode.replaceChild(s, v);\n            };\n        };\n        new g(v).duration(3000).checkpoint().to(\"backgroundColor\", \"#FFFFFF\").duration(1000).ondone(w).go();\n    };\n    e.exports = q;\n});\n__d(\"PageLikeButton\", [\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"Event\",\"PageFanning\",\"SubscribeButton\",\"Tour\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Event\"), k = b(\"PageFanning\"), l = b(\"SubscribeButton\"), m = b(\"Tour\"), n = b(\"URI\"), o = {\n        LIKED: \"liked\",\n        UNLIKED: \"unliked\",\n        LIKED_SUCCESS: \"liked_success\",\n        init: function(r, s, t, u, v, w, x, y, z, aa, ba) {\n            g.subscribe(o.LIKED, function(ca, da) {\n                if ((u === da.profile_id)) {\n                    if (!z) {\n                        t.suppressNextMouseEnter();\n                    };\n                    r.swap(ba);\n                    if ((aa === true)) {\n                        new h().setURI(\"/ajax/pages/suggestions_on_liking.php\").setData({\n                            pageid: u\n                        }).send();\n                    };\n                }\n            ;\n            });\n            g.subscribe(o.UNLIKED, function(ca, da) {\n                if ((u === da.profile_id)) {\n                    r.unswap(ba);\n                    t.hideFlyout();\n                }\n            ;\n            });\n            if (y) {\n                g.subscribe(o.LIKED_SUCCESS, function(ca, da) {\n                    var ea = n.getRequestURI().getQueryData().app_data;\n                    if ((da.profile_id == u)) {\n                        new h().setURI(\"/ajax/pages/fetch_app_column.php\").setData({\n                            profile_id: u,\n                            tab_key: y,\n                            app_data: ea\n                        }).send();\n                    };\n                });\n            };\n            j.listen(s, \"click\", q.bind(null, u, v, w, x));\n        },\n        initCallout: function(r, s) {\n            var t = document.getElementById(\"pageActionLikeCalloutButton\");\n            j.listen(t, \"click\", q.bind(null, r, s, null, null));\n        },\n        initUnlike: function(r, s, t) {\n            j.listen(r, \"click\", function(event) {\n                p(event.getTarget(), s, false, function(u) {\n                    g.inform(o.LIKED, {\n                        profile_id: s\n                    });\n                    i.defaultErrorHandler(u);\n                }, t);\n                o.informUnlike(s);\n            });\n        },\n        informLike: function(r, s, t) {\n            var u = {\n                profile_id: r,\n                target: s,\n                origin: t\n            };\n            g.inform(o.LIKED, u);\n            g.inform(l.SUBSCRIBED, u);\n        },\n        informLikeSuccess: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform(o.LIKED_SUCCESS, s);\n        },\n        informUnlike: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform.bind(g, o.UNLIKED, s).defer();\n            g.inform.bind(g, l.UNSUBSCRIBED, s).defer();\n        }\n    };\n    function p(r, s, t, u, v, w, x) {\n        m.getInstance().hideStep(\"low_page_likes\");\n        k.setFanStatus(r, s, t, false, function() {\n            o.informLikeSuccess(s);\n        }, u, {\n            fan_origin: v,\n            fan_source: w,\n            cat: x\n        });\n    };\n    function q(r, s, t, u, event) {\n        p(event.getTarget(), r, true, function(v) {\n            g.inform(o.UNLIKED, {\n                profile_id: r\n            });\n            i.defaultErrorHandler(v);\n        }, s, t, u);\n        o.informLike(r, event.getTarget(), s);\n    };\n    e.exports = o;\n    a.PageLikeButton = o;\n});\n__d(\"legacy:PageLikeButton\", [\"PageLikeButton\",], function(a, b, c, d) {\n    a.PageLikeButton = b(\"PageLikeButton\");\n}, 3);\n__d(\"legacy:AudienceSelector\", [\"AudienceSelector\",], function(a, b, c, d) {\n    b(\"AudienceSelector\");\n}, 3);\n__d(\"FriendListPrivacyOptions\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"DOMQuery\",\"PageTransitions\",\"Parent\",\"SelectorDeprecated\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"Parent\"), n = b(\"SelectorDeprecated\"), o = b(\"$\"), p = b(\"ge\"), q = false, r = false, s = null, t = {\n    }, u = function(w) {\n        if (!Object.keys(t).length) {\n            l.registerHandler(function() {\n                t = {\n                };\n                q = false;\n                r = false;\n            });\n        };\n        var x = w.getAttribute(\"data-name\");\n        t[x] = w;\n        n.listen(w, \"select\", function(y) {\n            var z = y.option, aa = k.find(z, \"a.itemAnchor\"), ba = aa.getAttribute(\"data-flid\");\n            if (!ba) {\n                return\n            };\n            var ca = aa.getAttribute(\"data-dynamic\");\n            if ((ca && q)) {\n                v.showSmartListNux(z, ba);\n            }\n             else if ((!ca && r)) {\n                v.showDumbListNux([ba,]);\n            }\n        ;\n        });\n    }, v = {\n        listen: function(w, x, y) {\n            var z = p(w);\n            if (!z) {\n                return\n            };\n            var aa = m.byClass(z, \"audienceSelector\");\n            if (aa) {\n                u(aa);\n                q = x;\n                r = y;\n            }\n        ;\n        },\n        showSmartListNux: function(w, x) {\n            w = o(w);\n            new i(\"/ajax/friends/lists/smart_list_publish_nux.php\").setData({\n                option_id: w.id,\n                flid: x\n            }).send();\n            q = false;\n        },\n        setContextualDialog: function(w, x) {\n            x = o(x);\n            var y = m.byClass(x, \"audienceSelector\");\n            if (y) {\n                w.setContext(y);\n                w.show();\n                var z = g.subscribe(\"composer/publish\", function() {\n                    w.hide();\n                });\n                w.subscribe(\"hide\", function() {\n                    z.unsubscribe();\n                });\n            }\n        ;\n        },\n        showDumbListNux: function(w) {\n            h.send(new i(\"/ajax/friends/lists/dumb_list_publish_nux.php\").setData({\n                flids: w\n            }));\n            r = false;\n        },\n        showBothListsNux: function(w, x) {\n            s = o(w);\n            v.showDumbListNux(x);\n        },\n        setDialogX: function(w) {\n            if (!s) {\n                return\n            };\n            w.subscribe(\"hide\", function() {\n                v.showSmartListNux(s);\n                s = null;\n            });\n        },\n        setDialog: function() {\n            if (!s) {\n                return\n            };\n            var w = j.getCurrent();\n            if (w) {\n                w.setCloseHandler(function() {\n                    v.showSmartListNux(s);\n                    s = null;\n                });\n            };\n        }\n    };\n    e.exports = v;\n});\n__d(\"FriendsMinusAcquaintancesPrivacyOption\", [\"AudienceSelectorTags\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"PrivacyConst\",\"copyProperties\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AudienceSelectorTags\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"DOM\"), k = b(\"PrivacyConst\"), l = k.FriendsValue, m = b(\"copyProperties\"), n = b(\"fbt\"), o = b(\"tx\");\n    function p(q, r) {\n        this._hasRestricted = r;\n        this.parent.construct(this, q);\n    };\n    i.extend(p, h);\n    m(p.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: l.FRIENDS_MINUS_ACQUAINTANCES\n            };\n        },\n        _recalculateTooltipAndLabel: function() {\n            var q = this._hasEvent, r = this._tags.length, s = this._tooltip, t = this._label;\n            if (q) {\n                if (((r > 1) || this._alreadyHasTags())) {\n                    this._tooltip = (this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances, Restricted\" : \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances\");\n                }\n                 else if ((r == 1)) {\n                    this._tooltip = (this._hasRestricted ? o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances, Restricted\", {\n                        user: this._tags[0]\n                    }) : o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances\", {\n                        user: this._tags[0]\n                    }));\n                }\n                 else this._tooltip = (this._hasRestricted ? \"Your friends and event guests; Except: Acquaintances, Restricted\" : \"Your friends and event guests; Except: Acquaintances\");\n                \n            ;\n            }\n             else if (((r > 0) || this._alreadyHasTags())) {\n                var u = \"friends of anyone tagged\", v = n._(\"{people who can see this}, {list of more people who can see this}\", [n.param(\"people who can see this\", \"Your friends\"),n.param(\"list of more people who can see this\", u),]), w = \"Acquaintances\";\n                if (this._hasRestricted) {\n                    w = n._(\"{Name of Acquaintances friend list}, {restricted}\", [n.param(\"Name of Acquaintances friend list\", w),n.param(\"restricted\", \"Restricted\"),]);\n                };\n                this._tooltip = this._getCombinedSentence(v, w);\n            }\n             else {\n                this._tooltip = \"Friends except Acquaintances\";\n                if (this._hasRestricted) {\n                    this._tooltip = \"Friends; Except: Acquaintances, Restricted\";\n                };\n            }\n            \n        ;\n            this._recalcLabel();\n            return ((((s != this._tooltip)) || ((t != this._label))));\n        },\n        _alreadyHasTags: function() {\n            var q = j.scry(this._selector, \"*[data-oid]\")[0];\n            q = (q && q.getAttribute(\"data-oid\"));\n            return (q && g.hasTags(q));\n        },\n        _getTagExpansionBehavior: function() {\n            return k.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = p;\n});\n__d(\"FriendsPrivacyOption\", [\"Arbiter\",\"BasePrivacyOption\",\"Class\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"SelectorDeprecated\"), l = b(\"copyProperties\"), m = b(\"tx\");\n    function n(o, p) {\n        this._hasRestricted = p;\n        this.parent.construct(this, o);\n    };\n    i.extend(n, h);\n    l(n.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.ALL_FRIENDS\n            };\n        },\n        _eventTagChanged: function() {\n            var o = this._getChangedData();\n            o.privacy = k.getValue(this._selector);\n            g.inform(\"EventTagged/changed\", o);\n        },\n        _recalculateTooltipAndLabel: function() {\n            var o = this._hasEvent, p = this._tags.length, q = this._tooltip, r = this._label;\n            if ((p > 2)) {\n                if (o) {\n                    this._tooltip = (this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Restricted\" : \"Your friends, friends of anyone tagged and event guests\");\n                }\n                 else this._tooltip = (this._hasRestricted ? \"Your friends and friends of anyone tagged; Except: Restricted\" : \"Your friends and friends of anyone tagged\");\n            ;\n            }\n             else if ((p == 2)) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = \"Your friends, friends of anyone tagged and event guests; Except: Restricted\";\n                    }\n                     else this._tooltip = \"Your friends, friends of anyone tagged and event guests\";\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends; Except: Restricted \", {\n                        user: this._tags[0],\n                        user2: this._tags[1]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends\", {\n                    user: this._tags[0],\n                    user2: this._tags[1]\n                });\n                \n            ;\n            }\n             else if ((p == 1)) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = m._(\"Your friends, {user}'s friends and event guests; Except: Restricted\", {\n                            user: this._tags[0]\n                        });\n                    }\n                     else this._tooltip = m._(\"Your friends, {user}'s friends and event guests\", {\n                        user: this._tags[0]\n                    });\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends and {user}'s friends; Except: Restricted\", {\n                        user: this._tags[0]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends and {user}'s friends\", {\n                    user: this._tags[0]\n                });\n                \n            ;\n            }\n             else if (o) {\n                this._tooltip = (this._hasRestricted ? \"Your friends and event guests; Except: Restricted\" : \"Your friends and event guests\");\n            }\n             else this._tooltip = (this._hasRestricted ? \"Your friends; Except: Restricted\" : \"Your friends\");\n            \n            \n            \n        ;\n            this._recalcLabel();\n            return (((q != this._tooltip)) || ((r != this._label)));\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = n;\n});\n__d(\"MetaComposerEdDialog\", [\"Animation\",\"Arbiter\",\"ARIA\",\"AsyncRequest\",\"copyProperties\",\"CSS\",\"DOM\",\"Ease\",\"ge\",\"Parent\",\"SelectorDeprecated\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"AsyncRequest\"), k = b(\"copyProperties\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"Ease\"), o = b(\"ge\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Vector\"), s = null;\n    function t(u) {\n        this._dialog = u.dialog;\n        this.config = u;\n        this._init();\n    };\n    t.init = function(u) {\n        if (s) {\n            s.config.show_audience = u.show_audience;\n            u.dialog.destroy();\n            return;\n        }\n    ;\n        s = new t(u);\n    };\n    k(t.prototype, {\n        _init: function() {\n            h.subscribe(\"ComposerXStatusAttachment/ready\", function() {\n                if (this.config.show_audience) {\n                    this._sendEducationRequest({\n                    }, \"/ajax/composer/audience/education\", this._handlerCustomDuration.bind(this, 6000));\n                    this.config.show_audience = false;\n                }\n            ;\n            }.bind(this));\n            if (this.config.show_sticky) {\n                h.subscribe(\"composer/mutate\", function(u, v) {\n                    this._sendEducationRequest({\n                        sticky_num: this.config.n_sticky_shown\n                    }, \"/ajax/composer/audience/sticky_education\");\n                }.bind(this));\n            };\n            if (this.config.show_event_tags) {\n                if ((this.config.n_event_tag_shown === 0)) {\n                    h.subscribe(\"EventTagged/changed\", function(u, v) {\n                        this._sendEducationRequest({\n                            selector: \"div.fbComposerAudienceTourContext\",\n                            privacy: v.privacy,\n                            event_tag_num: this.config.n_event_tag_shown\n                        }, \"/ajax/events/tagging/user_education\");\n                    }.bind(this));\n                    h.subscribe([\"composer/publish\",\"composer/reset\",], function() {\n                        var u = o(\"event_tagging_tag_expansion_NUX\");\n                        (u && l.hide(u));\n                    }.bind(this));\n                }\n                 else h.subscribe(\"EventTagged/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"AtTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            \n            };\n            if (this.config.show_tags) {\n                h.subscribe(\"SelectedPrivacyOption/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"WithTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"/ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            };\n            q.subscribe(\"open\", this._killAnim.bind(this));\n        },\n        _sendEducationRequest: function(u, v, w) {\n            if (!this._updateDialogContext()) {\n                return\n            };\n            (this._async && this._async.abort());\n            this._async = new j(v);\n            this._async.setData(u).setHandler(w).send();\n        },\n        _updateDialogContext: function() {\n            var u = m.scry(document.body, \"div.composerAudienceWrapper\"), v, w;\n            for (var x = 0; (x < u.length); x++) {\n                v = u[x];\n                w = r.getElementPosition(v);\n                if (((v && (w.x > 0)) && (w.y > 0))) {\n                    this._dialog.setContext(v);\n                    return true;\n                }\n            ;\n            };\n            return false;\n        },\n        _handler: function(u) {\n            this._handlerCustomDuration(1500, u);\n        },\n        _handlerCustomDuration: function(u, v) {\n            var w = v.payload;\n            if ((!w || !this._updateDialogContext())) {\n                return\n            };\n            var x = this._dialog.getContent().firstChild;\n            m.setContent(x, w);\n            i.announce(m.getText(x));\n            this._dialog.show();\n            var y = p.byClass(x, \"metaComposerUserEd\");\n            if (this._anim) {\n                this._anim.stop();\n                this._anim = new g(y);\n            }\n             else this._anim = new g(y).from(\"opacity\", 0);\n        ;\n            this._anim.to(\"opacity\", 1).ease(n.sineOut).checkpoint().duration(u).checkpoint().to(\"opacity\", 0).ease(n.sineOut).checkpoint().ondone(this._killAnim.bind(this)).go();\n        },\n        _killAnim: function(u, v) {\n            if (this._anim) {\n                this._dialog.hide();\n                this._anim.stop();\n                this._anim = null;\n            }\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"OnlyMePrivacyOption\", [\"BasePrivacyOption\",\"copyProperties\",\"Class\",\"PrivacyConst\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BasePrivacyOption\"), h = b(\"copyProperties\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"tx\");\n    function l(m) {\n        this.parent.construct(this, m);\n    };\n    i.extend(l, g);\n    h(l.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.SELF\n            };\n        },\n        _getIncludedAudience: function() {\n            return \"Only you\";\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.TAGGEES;\n        }\n    });\n    e.exports = l;\n});\n__d(\"legacy:UIPagelet\", [\"UIPagelet\",], function(a, b, c, d) {\n    a.UIPagelet = b(\"UIPagelet\");\n}, 3);\n__d(\"HoverButton\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        this._button = n;\n        this._flyout = o;\n        this._flyoutAjaxify = q;\n        this._flyoutContent = p;\n        o.subscribe(\"show\", this._onShow.bind(this));\n        o.subscribe(\"hide\", this._onHide.bind(this));\n    };\n    k(m.prototype, {\n        _button: null,\n        _flyout: null,\n        _flyoutAjaxify: null,\n        _flyoutContent: null,\n        showFlyoutBriefly: function() {\n            this.showFlyout();\n            this._flyout.hideFlyoutDelayed(5000);\n        },\n        showFlyout: function() {\n            this._flyout.showFlyout(this._button, true);\n            this._flyout.inform(\"show\", this._button);\n        },\n        hideFlyout: function() {\n            this._flyout.hideFlyout(true);\n            this._flyout.inform(\"hide\", this._button);\n        },\n        enableButton: function() {\n            this._flyout.initNode(this._button);\n        },\n        disableButton: function() {\n            this.hideFlyout();\n            this._flyout.deactivateNode(this._button);\n        },\n        _onShow: function(n, o) {\n            h.addClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if ((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\"))) {\n                h.addClass(o, \"selected\");\n            };\n            if (this._flyoutAjaxify) {\n                h.addClass(this._flyoutContent, \"async_saving\");\n                new g().setURI(new j(this._flyoutAjaxify)).setHandler(function(p) {\n                    h.removeClass(this._flyoutContent, \"async_saving\");\n                    i.setContent(this._flyoutContent, p.payload);\n                }.bind(this)).send();\n                this._flyoutAjaxify = null;\n            }\n        ;\n        },\n        _onHide: function(n, o) {\n            h.removeClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if ((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\"))) {\n                h.removeClass(o, \"selected\");\n            };\n        },\n        destroy: function() {\n            this.hideFlyout();\n            this._flyout.destroy();\n        },\n        suppressNextMouseEnter: function() {\n            this._flyout.setActiveNode(this._button);\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:DynamicIconSelector\", [\"DynamicIconSelector\",], function(a, b, c, d) {\n    a.DynamicIconSelector = b(\"DynamicIconSelector\");\n}, 3);\n__d(\"MentionsInputMatchers\", [], function(a, b, c, d, e, f) {\n    var g = [\"@\",\"\\\\uff20\",\"+\",\"\\\\uff0b\",].join(\"\"), h = \".,*?$|#{}()\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%&'\\\"~=\\u003C\\u003E_:;\", i = ((\"\\\\b[A-Z][^ A-Z\" + h) + \"]\"), j = (((((((\"([^\" + g) + h) + \"]|[\") + h) + \"][^ \") + h) + \"])\"), k = ((((\"(?:^|\\\\s)(?:[\" + g) + \"](\") + j) + \"{0,20}))\"), l = ((((\"(?:(?:^|[^#])(\" + i) + \"+)|\") + k) + \")\"), m = ((\"(?:\" + i) + \"{4,})\"), n = \"#\\\\uFF03\", o = {\n        trigger: new RegExp(((\"[\" + g) + \"]$\")),\n        hashtagTrigger: new RegExp(((\"[\" + n) + \"]\")),\n        mainMatcher: new RegExp((k + \"$\")),\n        autoMatcher: new RegExp((l + \"$\")),\n        userMatcher: new RegExp((m + \"$\"))\n    };\n    e.exports = o;\n});\n__d(\"MentionsInput\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"Bootloader\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"HTML\",\"Input\",\"InputSelection\",\"Keys\",\"MentionsInputMatchers\",\"Parent\",\"Style\",\"TypeaheadUtil\",\"UserAgent\",\"copyProperties\",\"htmlize\",\"removeFromArray\",\"repeatString\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"HTML\"), o = b(\"Input\"), p = b(\"InputSelection\"), q = b(\"Keys\"), r = b(\"MentionsInputMatchers\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"TypeaheadUtil\"), v = b(\"UserAgent\"), w = b(\"copyProperties\"), x = b(\"htmlize\"), y = b(\"removeFromArray\"), z = b(\"repeatString\"), aa = \"\\ufeff\", ba = new RegExp(aa, \"g\"), ca = function(ja) {\n        return (ja + aa);\n    }, da = \"\\ufffd\", ea = /@+\\[[0-9]+\\:([^\\]]|\\\\\\])*\\]+/g, fa = /[\\\\\\]:]/g;\n    function ga(ja, ka) {\n        return ja.replace(ka, z(\" \", ka.length));\n    };\n    function ha(ja, ka) {\n        return (ja.substring(0, ka) + ja.substring((ka + 1)));\n    };\n    function ia(ja, ka, la, ma, na, oa) {\n        k.set(ja, \"MentionsInput\", this);\n        this._root = ja;\n        this._typeahead = ka;\n        this._input = la;\n        var pa = null, qa = this.init.bind(this, ma, na, oa);\n        try {\n            pa = (document.activeElement === this._input);\n        } catch (ra) {\n        \n        };\n        if (pa) {\n            qa.defer();\n        }\n         else var sa = m.listen(this._input, \"focus\", function() {\n            qa.defer();\n            sa.remove();\n        })\n    ;\n        this._hasHashtags = ma.hashtags;\n        this._hashtags = [];\n    };\n    ia.getInstance = function(ja) {\n        var ka = s.byClass(ja, \"uiMentionsInput\");\n        return (ka ? k.get(ka, \"MentionsInput\") : null);\n    };\n    w(ia.prototype, h, {\n        init: function(ja, ka, la) {\n            if (this._initialized) {\n                return\n            };\n            this._initialized = true;\n            this._highlighter = l.find(this._root, \".highlighter\");\n            this._highlighterInner = this._highlighter.firstChild;\n            this._highlighterContent = l.find(this._root, \".highlighterContent\");\n            this._hiddenInput = l.find(this._root, \".mentionsHidden\");\n            this._placeholder = (this._input.getAttribute(\"placeholder\") || \"\");\n            this._maxMentions = (ja.max || 6);\n            this._metrics = la;\n            if (!this._hiddenInput.name) {\n                var ma = this._input.name;\n                this._input.name = (ma + \"_text\");\n                this._hiddenInput.name = ma;\n            }\n        ;\n            this._initEvents();\n            this._initTypeahead();\n            this.reset(ka);\n            this.inform(\"init\", null, g.BEHAVIOR_STATE);\n        },\n        reset: function(ja) {\n            if (!this._initialized) {\n                return\n            };\n            this._mentioned = {\n            };\n            this._orderedUIDs = [];\n            this._numMentioned = 0;\n            this._filterData = null;\n            (this._hiddenInput && (this._hiddenInput.value = \"\"));\n            (this._highlighterContent && l.empty(this._highlighterContent));\n            (this._highlighterAuxContent && l.remove(this._highlighterAuxContent));\n            this._highlighterAuxContent = null;\n            o.setPlaceholder(this._input, this._placeholder);\n            t.set(this._typeahead.getElement(), \"height\", \"auto\");\n            var ka = ((ja && ja.value) || \"\"), la = (ja && ja.mentions);\n            if ((la && la.length)) {\n                var ma = [];\n                la.forEach(function(na) {\n                    ma.push((na.offset + na.length));\n                    delete na.offset;\n                    delete na.length;\n                    this._addToken(na);\n                }, this);\n                ma.reverse().forEach(function(na) {\n                    ka = ((ka.substring(0, na) + aa) + ka.substring(na));\n                });\n            }\n        ;\n            o.setValue(this._input, ka);\n            this._updateTypeahead();\n            this._updateWidth();\n            this._update();\n        },\n        getValue: function() {\n            return this._getMarkedValue().replace(ba, \"\");\n        },\n        _getMarkedValue: function() {\n            return o.getValue(this._input);\n        },\n        getRawValue: function() {\n            this._update();\n            return o.getValue(this._hiddenInput);\n        },\n        checkValue: function() {\n            var ja = this._typeahead.getCore().getValue();\n            if ((r.trigger.exec(ja) || (ja === \"\"))) {\n                this.inform(\"sessionEnd\", {\n                });\n            };\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _initEvents: function() {\n            var ja = this._update.bind(this);\n            m.listen(this._input, {\n                input: ja,\n                keyup: ja,\n                change: ja,\n                blur: this._handleBlur.bind(this),\n                focus: this._handleFocus.bind(this),\n                keydown: this._handleKeydown.bind(this)\n            });\n            if (this._metrics) {\n                this._metrics._reset();\n                this._metrics.bindSessionStart(this._typeahead, \"render\", true);\n                this._metrics.bindSessionEnd(this._typeahead.getView(), \"select\", true);\n                this._metrics.bindSessionEnd(this, \"sessionEnd\", false);\n                m.listen(this._input, \"keyup\", function(event) {\n                    this.checkValue.bind(this).defer();\n                }.bind(this));\n            }\n        ;\n        },\n        _initTypeahead: function() {\n            this._typeahead.subscribe(\"select\", function(oa, pa) {\n                var qa = pa.selected;\n                this._addToken({\n                    uid: qa.uid,\n                    text: qa.text,\n                    type: qa.type,\n                    weakreference: qa.weak_reference\n                });\n                this.updateValue();\n            }.bind(this));\n            var ja = this._input, ka = null;\n            function la() {\n                if ((ka === null)) {\n                    ka = o.getSubmitOnEnter(ja);\n                    o.setSubmitOnEnter(ja, false);\n                }\n            ;\n            };\n            function ma() {\n                if ((ka !== null)) {\n                    o.setSubmitOnEnter(ja, ka);\n                    ka = null;\n                }\n            ;\n            };\n            this._typeahead.subscribe(\"reset\", ma);\n            this._typeahead.subscribe(\"render\", la);\n            this._typeahead.subscribe(\"highlight\", function(oa, pa) {\n                ((pa.index >= 0) ? la() : ma());\n            });\n            this._typeahead.subscribe(\"query\", function() {\n                this._filterData = null;\n            }.bind(this));\n            var na = this._typeahead.getCore();\n            na.suffix = aa;\n            this._handleFocus();\n        },\n        _handleBlur: function() {\n            if (this._filterToken) {\n                this._filterToken.remove();\n                this._filterToken = null;\n            }\n        ;\n        },\n        _handleFocus: function() {\n            if (!this._filterToken) {\n                this._filterToken = this._typeahead.getData().addFilter(this._filterResults.bind(this));\n            };\n            this._updateWidth();\n        },\n        _handleKeydown: function(event) {\n            var ja = event.keyCode;\n            if (((ja == q.BACKSPACE) || (ja == q.DELETE))) {\n                this._handleBackspaceAndDelete(event, ja);\n            };\n            if (((ja == q.LEFT) || (ja == q.RIGHT))) {\n                setTimeout(this._handleLeftAndRight.bind(this, ja), 10);\n            };\n        },\n        _handleLeftAndRight: function(ja) {\n            var ka = this._getMarkedValue(), la = p.get(this._input), ma = la.start, na = la.end, oa = (ja == q.LEFT), pa = (ja == q.RIGHT);\n            if ((ma == na)) {\n                var qa = (oa ? -1 : 1);\n                if ((ka.charAt(ma) == aa)) {\n                    p.set(this._input, (ma + qa));\n                };\n            }\n             else if ((oa && (ka.charAt(ma) == aa))) {\n                p.set(this._input, (ma - 1), na);\n            }\n             else if ((oa && (ka.charAt(na) == aa))) {\n                p.set(this._input, ma, (na - 1));\n            }\n             else if ((pa && (ka.charAt(na) == aa))) {\n                p.set(this._input, ma, (na + 1));\n            }\n             else if ((pa && (ka.charAt(ma) == aa))) {\n                p.set(this._input, (ma + 1), na);\n            }\n            \n            \n            \n        ;\n        },\n        _handleBackspaceAndDelete: function(event, ja) {\n            var ka = p.get(this._input), la = false;\n            if ((ka.start !== ka.end)) {\n                if ((this._offsetIsInsideMention((ka.start + 1)) && this._offsetIsInsideMention(ka.end))) {\n                    la = ((ja === q.BACKSPACE));\n                }\n                 else return\n            \n            };\n            var ma = ((ja === q.DELETE) ? 1 : -1), na = (ma + ((la ? ka.end : ka.start))), oa = this._getMarkedValue(), pa = oa;\n            for (var qa = 0; (qa < this._orderedUIDs.length); ++qa) {\n                var ra = this._mentioned[this._orderedUIDs[qa]], sa = ra.text, ta = ca(sa), ua = pa.indexOf(ta), va = (ua + ta.length);\n                if (((na < ua) || (na >= va))) {\n                    pa = ga(pa, ta);\n                    continue;\n                }\n            ;\n                var wa, xa;\n                if ((ra.type != \"user\")) {\n                    wa = 0;\n                    xa = [sa,];\n                }\n                 else {\n                    wa = (ta.substring(0, (na - ua)).split(\" \").length - 1);\n                    xa = sa.split(\" \");\n                }\n            ;\n                var ya = xa.splice(wa, 1)[0], za = xa.join(\" \"), ab = ((wa === 0) ? ua : ((va - ya.length) - 1));\n                if (za) {\n                    ra.text = za;\n                    za = ca(za);\n                }\n                 else this._removeToken(ra.uid);\n            ;\n                var bb = ((oa.substring(0, ua) + za) + oa.substring(va));\n                o.setValue(this._input, bb);\n                p.set(this._input, ab);\n                this._update();\n                event.kill();\n                break;\n            };\n        },\n        _offsetIsInsideMention: function(ja) {\n            for (var ka = 0; (ka < this._offsets.length); ka++) {\n                if (((ja > this._offsets[ka][0]) && (ja <= this._offsets[ka][1]))) {\n                    return true\n                };\n            };\n            return false;\n        },\n        _filterResults: function(ja) {\n            if ((this._filterData === null)) {\n                var ka = p.get(this._input).start;\n                if (this._offsetIsInsideMention(ka)) {\n                    this._filterData = {\n                        caretIsInsideMention: true\n                    };\n                    return false;\n                }\n            ;\n                var la = this._typeahead.getCore();\n                this._filterData = {\n                    value: la.getValue(),\n                    rawValue: la.getRawValue()\n                };\n            }\n        ;\n            if (this._filterData.caretIsInsideMention) {\n                return false\n            };\n            if (r.mainMatcher.test(this._filterData.rawValue)) {\n                return true\n            };\n            if ((ja.type != \"user\")) {\n                return false\n            };\n            if (ja.disable_autosuggest) {\n                return false\n            };\n            if (r.userMatcher.test(this._filterData.value)) {\n                return true\n            };\n            return u.isExactMatch(this._filterData.value, this._typeahead.getData().getTextToIndex(ja));\n        },\n        _addToken: function(ja) {\n            var ka = ja.uid;\n            if (!this._mentioned.hasOwnProperty(ka)) {\n                this._mentioned[ka] = ja;\n                this._orderedUIDs.push(ka);\n                this._numMentioned++;\n                this._updateTypeahead();\n            }\n        ;\n        },\n        _removeToken: function(ja) {\n            if (this._mentioned.hasOwnProperty(ja)) {\n                delete this._mentioned[ja];\n                y(this._orderedUIDs, ja);\n                this._numMentioned--;\n                this._updateTypeahead();\n            }\n        ;\n        },\n        _update: function() {\n            var ja = this._getMarkedValue();\n            if ((ja == this._value)) {\n                return\n            };\n            this._value = ja;\n            this._updateMentions();\n            this._updateDirection.bind(this).defer();\n            this.updateValue();\n        },\n        _updateMentions: function() {\n            this._offsets = [];\n            var ja = this._getMarkedValue(), ka = ja;\n            for (var la = 0; (la < this._orderedUIDs.length); ++la) {\n                var ma = this._orderedUIDs[la], na = ca(this._mentioned[ma].text), oa = ka.indexOf(na);\n                if ((oa == -1)) {\n                    this._removeToken(ma);\n                };\n                ka = ga(ka, na);\n                this._offsets.push([oa,(oa + na.length),]);\n            };\n            var pa = ja;\n            while (((oa = ka.indexOf(aa)) > -1)) {\n                pa = ha(pa, oa);\n                ka = ha(ka, oa);\n            };\n            if ((ja !== pa)) {\n                var qa = p.get(this._input);\n                o.setValue(this._input, pa);\n                p.set(this._input, qa.start);\n                this._value = pa;\n            }\n        ;\n        },\n        _renderHashtags: function(ja) {\n            if (!this._hasHashtags) {\n                return x(ja)\n            };\n            if (!this._hashtagParser) {\n                if (r.hashtagTrigger.exec(ja)) {\n                    this.bootloadHashtagParser();\n                };\n                if (!this._hashtagParser) {\n                    return x(ja)\n                };\n            }\n        ;\n            this._hashtags = this._hashtagParser.parse(ja);\n            var ka = [], la = 0;\n            for (var ma = 0; (ma < this._hashtags.length); ma++) {\n                var na = this._hashtags[ma];\n                ka.push(x(ja.substring(la, na.rawOffset)), \"\\u003Cb\\u003E\", na.marker, na.tag, \"\\u003C/b\\u003E\");\n                la = ((na.rawOffset + na.marker.length) + na.tag.length);\n            };\n            ka.push(x(ja.substring(la)));\n            return ka.join(\"\");\n        },\n        updateValue: function() {\n            var ja = this._value = this._getMarkedValue(), ka = this._orderedUIDs, la = ja.replace(ea, da);\n            for (var ma = 0; (ma < ka.length); ++ma) {\n                var na = ((\"@[\" + ka[ma]) + \":]\"), oa = ca(this._mentioned[ka[ma]].text);\n                la = la.replace(oa, na);\n                ja = ja.replace(oa, na);\n            };\n            var pa = this._renderHashtags(ja);\n            for (var ma = 0; (ma < ka.length); ++ma) {\n                var qa = ka[ma], ra = this._mentioned[qa], sa = ra.text, ta = (ra.weakreference ? \"\\u003Cb class=\\\"weak\\\"\\u003E\" : \"\\u003Cb\\u003E\");\n                pa = pa.replace(((\"@[\" + qa) + \":]\"), ((ta + x(ca(sa))) + \"\\u003C/b\\u003E\"));\n                sa = sa.replace(fa, function(ua) {\n                    return (\"\\\\\" + ua);\n                });\n                la = la.replace(((\"@[\" + qa) + \":]\"), ((((\"@[\" + qa) + \":\") + sa) + \"]\"));\n            };\n            if (v.ie()) {\n                pa = pa.replace(/ /g, \"&nbsp;\\u003Cwbr/\\u003E\");\n            };\n            l.setContent(this._highlighterContent, n(pa));\n            this._hiddenInput.value = la;\n            this._updateHighlighter();\n            this._updateHeight();\n        },\n        _updateDirection: function() {\n            var ja = t.get(this._input, \"direction\");\n            if ((ja == this._dir)) {\n                return\n            };\n            this._dir = ja;\n            t.set(this._highlighter, \"direction\", ja);\n            if ((ja == \"rtl\")) {\n                t.set(this._highlighter, \"text-align\", \"right\");\n            }\n             else t.set(this._highlighter, \"text-align\", \"left\");\n        ;\n        },\n        _updateWidth: function() {\n            var ja = t.getFloat.curry(this._input), ka = ((((this._input.offsetWidth - ja(\"paddingLeft\")) - ja(\"paddingRight\")) - ja(\"borderLeftWidth\")) - ja(\"borderRightWidth\"));\n            if (v.firefox()) {\n                ka -= 2;\n            };\n            if ((v.ie() <= 7)) {\n                ka -= t.getFloat(this._highlighterInner, \"paddingLeft\");\n                this._highlighter.style.zoom = 1;\n            }\n        ;\n            this._highlighterInner.style.width = (Math.max(ka, 0) + \"px\");\n        },\n        _updateHeight: function() {\n            if (this._highlighterAuxContent) {\n                var ja = this._highlighter.offsetHeight, ka = this._typeahead.getElement();\n                if ((ja > ka.offsetHeight)) {\n                    t.set(ka, \"height\", (ja + \"px\"));\n                    g.inform(\"reflow\");\n                }\n            ;\n            }\n        ;\n        },\n        _updateTypeahead: function() {\n            var ja = this._typeahead.getCore(), ka = null;\n            if ((!this._maxMentions || (this._numMentioned < this._maxMentions))) {\n                ka = r.autoMatcher;\n            };\n            ja.matcher = ka;\n            ja.setExclusions(this._orderedUIDs);\n            this.inform(\"update\", {\n                mentioned: this._mentioned\n            });\n        },\n        setPlaceholder: function(ja) {\n            this._placeholder = ja;\n            if (!this.hasAuxContent()) {\n                o.setPlaceholder(this._input, ja);\n            };\n        },\n        _updateHighlighter: function() {\n            if (this._highlighterContent) {\n                j.conditionShow(this._highlighterContent, (((this._numMentioned > 0) || this.hasAuxContent()) || this._hashtags.length));\n            };\n        },\n        setAuxContent: function(ja) {\n            if (this._highlighterContent) {\n                if (!this._highlighterAuxContent) {\n                    this._highlighterAuxContent = l.create(\"span\", {\n                        className: \"highlighterAuxContent\"\n                    });\n                    l.insertAfter(this._highlighterContent, this._highlighterAuxContent);\n                }\n            ;\n                l.setContent(this._highlighterAuxContent, ja);\n                if (ja) {\n                    o.setPlaceholder(this._input, \"\");\n                }\n                 else o.setPlaceholder(this._input, this._placeholder);\n            ;\n                this._updateHighlighter();\n                this._updateHeight();\n            }\n        ;\n        },\n        hasAuxContent: function() {\n            var ja = this.getAuxContentRoot();\n            return (ja && (ja.innerHTML.length > 0));\n        },\n        getAuxContentRoot: function() {\n            return this._highlighterAuxContent;\n        },\n        addMention: function(ja) {\n            var ka = this._getMarkedValue();\n            if ((ka !== \"\")) {\n                ka += \" \";\n            };\n            o.setValue(this._input, ((ka + ca(ja.text)) + \" \"));\n            this._addToken(ja);\n            this._update();\n        },\n        getMentions: function() {\n            return this._mentioned;\n        },\n        bootloadHashtagParser: function() {\n            if (!this._hashtagParser) {\n                i.loadModules([\"HashtagParser\",], function(ja) {\n                    this._hashtagParser = ja;\n                    if (this._initialized) {\n                        this._update();\n                    };\n                }.bind(this));\n            };\n        }\n    });\n    e.exports = ia;\n});\n__d(\"MentionsTypeaheadAreaView\", [\"Class\",\"ContextualTypeaheadView\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"ContextualTypeaheadView\"), i = b(\"Parent\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, h);\n    j(k.prototype, {\n        getContext: function() {\n            return i.byClass(this.element, \"uiMentionsInput\");\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:MentionsInput\", [\"MentionsInput\",], function(a, b, c, d) {\n    a.MentionsInput = b(\"MentionsInput\");\n}, 3);\n__d(\"legacy:ui-side-nav-future-js\", [\"FutureSideNav\",], function(a, b, c, d) {\n    a.FutureSideNav = b(\"FutureSideNav\");\n}, 3);\n__d(\"HoverFlyout\", [\"Arbiter\",\"ArbiterMixin\",\"DataStore\",\"Event\",\"Keys\",\"arrayContains\",\"copyProperties\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"DataStore\"), j = b(\"Event\"), k = b(\"Keys\"), l = b(\"arrayContains\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\"), o = b(\"shield\");\n    function p(q, r, s, t) {\n        if (q) {\n            this._showDelay = s;\n            this._hideDelay = t;\n            this.init(q);\n            if (r) {\n                this.initNode(r);\n            };\n        }\n    ;\n        g.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", o(this.hideFlyout, this), g.SUBSCRIBE_ALL);\n    };\n    m(p.prototype, h, {\n        init: function(q) {\n            this._flyout = q;\n            this._showDelay = (this._showDelay || 0);\n            this._hideDelay = (this._hideDelay || 100);\n            this._showTimeout = null;\n            this._hideTimeout = null;\n            this._flyoutSubscriptions = [this._flyout.subscribe(\"mouseenter\", this._onFlyoutMouseEnter.bind(this)),this._flyout.subscribe(\"mouseleave\", o(this.hideFlyout, this)),];\n            this._nodes = [];\n            this._dataStoreUnique = ((\"HoverFlyout_\" + Date.now()) + \"_listeners\");\n            return this;\n        },\n        initNode: function(q) {\n            if (l(this._nodes, q)) {\n                return this\n            };\n            this._nodes.push(q);\n            i.set(q, this._dataStoreUnique, [j.listen(q, \"mouseenter\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"mouseleave\", o(this.hideFlyout, this)),j.listen(q, \"click\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"keydown\", this._onNodeKeyEscape.bind(this)),]);\n            return this;\n        },\n        deactivateNode: function(q) {\n            var r = i.get(q, this._dataStoreUnique);\n            if (r) {\n                while (r.length) {\n                    r.pop().remove();;\n                }\n            };\n            n(this._nodes, q);\n        },\n        setShowDelay: function(q) {\n            this._showDelay = q;\n            return this;\n        },\n        setHideDelay: function(q) {\n            this._hideDelay = q;\n            return this;\n        },\n        showFlyout: function(q, r) {\n            this.setActiveNode(q);\n            if (r) {\n                this._flyout.setContext(q).show();\n                this.inform(\"show\", q);\n            }\n             else this._showTimeout = this.showFlyout.bind(this, q, true).defer(this._showDelay);\n        ;\n            return this;\n        },\n        hideFlyout: function(q) {\n            clearTimeout(this._showTimeout);\n            if (q) {\n                this._flyout.hide();\n                (this._activeNode && this.inform(\"hide\", this._activeNode));\n                this._activeNode = null;\n            }\n             else this._hideTimeout = this.hideFlyout.bind(this, true).defer(this._hideDelay);\n        ;\n        },\n        hideFlyoutDelayed: function(q) {\n            clearTimeout(this._showTimeout);\n            clearTimeout(this._hideTimeout);\n            this._hideTimeout = this.hideFlyout.bind(this, true).defer(q);\n        },\n        getActiveNode: function() {\n            return this._activeNode;\n        },\n        setActiveNode: function(q) {\n            clearTimeout(this._hideTimeout);\n            if ((this._activeNode && (this._activeNode !== q))) {\n                this.hideFlyout(true);\n            };\n            this._activeNode = q;\n            return this;\n        },\n        clearNodes: function() {\n            for (var q = this._nodes.length; (q > 0); q--) {\n                this.deactivateNode(this._nodes[(q - 1)]);;\n            };\n        },\n        destroy: function() {\n            while (this._flyoutSubscriptions.length) {\n                this._flyout.unsubscribe(this._flyoutSubscriptions.pop());;\n            };\n            this.clearNodes();\n        },\n        _onNodeMouseEnter: function(q) {\n            if ((this._activeNode === q)) {\n                clearTimeout(this._hideTimeout);\n            }\n             else this.showFlyout(q);\n        ;\n        },\n        _onFlyoutMouseEnter: function() {\n            clearTimeout(this._hideTimeout);\n        },\n        _onNodeKeyEscape: function(event) {\n            if ((j.getKeyCode(event) === k.ESC)) {\n                (this._activeNode && this.inform(\"hide\", this._activeNode));\n                this._activeNode = null;\n            }\n        ;\n        }\n    });\n    e.exports = (a.HoverFlyout || p);\n});\n__d(\"TypeaheadAreaCore\", [\"Class\",\"InputSelection\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"InputSelection\"), i = b(\"TypeaheadCore\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this.matcher = new RegExp((this.matcher + \"$\"));\n        this.preventFocusChangeOnTab = true;\n    };\n    g.extend(l, i);\n    j(l.prototype, {\n        prefix: \"\",\n        suffix: \", \",\n        matcher: \"\\\\b[^,]*\",\n        click: k,\n        select: function(m) {\n            this.parent.select(m);\n            var n = this.element.value, o = ((this.prefix + m.text) + this.suffix);\n            this.expandBounds(n, o);\n            var p = n.substring(0, this.start), q = n.substring(this.end);\n            this.element.value = ((p + o) + q);\n            h.set(this.element, (p.length + o.length));\n        },\n        expandBounds: function(m, n) {\n            m = m.toLowerCase();\n            n = n.toLowerCase();\n            var o, p, q, r, s = /\\s/;\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.start;\n            while (((o >= 0) && (q >= 0))) {\n                r = m.charAt((o - 1));\n                if ((!r || s.test(r))) {\n                    this.start = o;\n                };\n                p = (r + p);\n                q = n.indexOf(p);\n                o--;\n            };\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.end;\n            while (((o <= m.length) && (q >= 0))) {\n                r = m.charAt(o);\n                if ((!r || s.test(r))) {\n                    this.end = o;\n                };\n                p = (p + r);\n                q = n.indexOf(p);\n                o++;\n            };\n        },\n        getRawValue: function() {\n            var m = (h.get(this.element).start || 0);\n            return this.parent.getValue().substring(0, m);\n        },\n        getValue: function() {\n            var m = (this.matcher && this.matcher.exec(this.getRawValue()));\n            if (!m) {\n                return \"\"\n            };\n            var n = m[0], o = (m.index + n.length);\n            n = n.replace(/^\\s/, \"\");\n            var p = n.length;\n            n = n.replace(/\\s$/, \"\");\n            var q = (p - n.length);\n            this.start = (o - p);\n            this.end = (o + q);\n            return ((m[2] || m[1]) || m[0]);\n        }\n    });\n    e.exports = l;\n});\n__d(\"TypeaheadMetrics\", [\"Event\",\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this.extraData = {\n        };\n        i(this, l);\n    };\n    i(k.prototype, {\n        endPoint: \"/ajax/typeahead/record_basic_metrics.php\",\n        init: function(l) {\n            this.init = j;\n            this.core = l.getCore();\n            this.view = l.getView();\n            this.data = l.getData();\n            this.stats = {\n            };\n            this.sessionActive = false;\n            this._sessionStartEvents = [];\n            this._sessionEndEvents = [];\n            this._reset();\n            this.initEvents();\n        },\n        _reset: function() {\n            this.stats = {\n            };\n            this.avgStats = {\n            };\n            this.sessionActive = false;\n            this.results = null;\n            this.sid = Math.floor((Date.now() * Math.random()));\n            this.data.setQueryData({\n                sid: this.sid\n            });\n        },\n        recordSelect: function(l) {\n            var m = l.selected;\n            if ((m.uid == null)) {\n                this.recordStat(\"selected_id\", \"SELECT_NULL\");\n            }\n             else this.recordStat(\"selected_id\", m.uid);\n        ;\n            this.recordStat(\"selected_type\", m.type);\n            this.recordStat(\"selected_position\", l.index);\n            this.recordStat(\"selected_with_mouse\", (l.clicked ? 1 : 0));\n            this.recordStat(\"selected_query\", l.query);\n            this._sessionEnd();\n        },\n        bindSessionStart: function(l, event, m) {\n            if (m) {\n                for (var n = 0; (n < this._sessionStartEvents.length); ++n) {\n                    var o = this._sessionStartEvents[n];\n                    o.obj.unsubscribe(o.token);\n                }\n            };\n            this._sessionStartEvents.push({\n                obj: l,\n                token: l.subscribe(event, function(p, q) {\n                    this._sessionStart();\n                }.bind(this))\n            });\n        },\n        bindSessionEnd: function(l, event, m) {\n            if (m) {\n                for (var n = 0; (n < this._sessionEndEvents.length); ++n) {\n                    var o = this._sessionEndEvents[n];\n                    o.obj.unsubscribe(o.token);\n                }\n            };\n            this._sessionEndEvents.push({\n                obj: l,\n                token: l.subscribe(event, function(p, q) {\n                    this._sessionEnd();\n                }.bind(this))\n            });\n        },\n        initEvents: function() {\n            this.bindSessionStart(this.core, \"focus\", false);\n            this.bindSessionEnd(this.core, \"blur\", false);\n            this.view.subscribe(\"select\", function(l, m) {\n                this.recordSelect(m);\n            }.bind(this));\n            this.bindSessionEnd(this.view, \"select\", false);\n            this.view.subscribe(\"render\", function(l, m) {\n                this.results = m;\n            }.bind(this));\n            this.data.subscribe(\"beforeQuery\", function(l, m) {\n                if (!m.value) {\n                    return\n                };\n                this.query = m.value;\n                this.recordCountStat(\"num_queries\");\n            }.bind(this));\n            this.data.subscribe(\"beforeFetch\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.bootstrapBegin = Date.now();\n                }\n                 else m.fetch_context.queryBegin = Date.now();\n            ;\n            }.bind(this));\n            this.data.subscribe(\"fetchComplete\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.recordAvgStat(\"bootstrap_latency\", (Date.now() - this.bootstrapBegin));\n                    var n = {\n                    };\n                    m.response.payload.entries.forEach(function(o) {\n                        if (!n[o.type]) {\n                            n[o.type] = 1;\n                        }\n                         else n[o.type]++;\n                    ;\n                    });\n                    this.recordStat(\"bootstrap_response_types\", n);\n                    this.bootstrapped = true;\n                }\n                 else {\n                    if ((\"filtered_count\" in m.response.payload)) {\n                        this.recordStat(\"filtered_count\", m.response.payload.filtered_count);\n                    };\n                    this.recordAvgStat(\"avg_query_latency\", (Date.now() - m.fetch_context.queryBegin));\n                }\n            ;\n            }.bind(this));\n            this.data.subscribe(\"dirty\", function(l, m) {\n                this.bootstrapped = false;\n            });\n        },\n        _sessionStart: function() {\n            if (this.sessionActive) {\n                return\n            };\n            this.sessionActive = true;\n        },\n        _sessionEnd: function() {\n            if (!this.sessionActive) {\n                return\n            };\n            this.sessionActive = false;\n            this.submit();\n            this._reset();\n        },\n        recordStat: function(l, m) {\n            this.stats[l] = m;\n        },\n        recordCountStat: function(l) {\n            var m = this.stats[l];\n            this.stats[l] = (m ? (m + 1) : 1);\n        },\n        recordAvgStat: function(l, m) {\n            if (this.avgStats[l]) {\n                this.avgStats[l][0] += m;\n                ++this.avgStats[l][1];\n            }\n             else this.avgStats[l] = [m,1,];\n        ;\n        },\n        submit: function() {\n            if (Object.keys(this.stats).length) {\n                i(this.stats, this.extraData);\n                if (this.results) {\n                    var l = (this.results).map(function(o, p) {\n                        return o.uid;\n                    });\n                    this.recordStat(\"candidate_results\", JSON.stringify(l));\n                }\n            ;\n                if (this.query) {\n                    this.recordStat(\"query\", this.query);\n                };\n                if (this.sid) {\n                    this.recordStat(\"sid\", this.sid);\n                };\n                if (this.bootstrapped) {\n                    this.recordStat(\"bootstrapped\", 1);\n                };\n                for (var m in this.avgStats) {\n                    var n = this.avgStats[m];\n                    this.stats[m] = (n[0] / n[1]);\n                };\n                new h().setURI(this.endPoint).setMethod(\"POST\").setData({\n                    stats: this.stats\n                }).send();\n                this._reset();\n            }\n        ;\n        }\n    });\n    k.register = function(l, m, n) {\n        if ((document.activeElement === l)) {\n            m.init(n);\n        }\n         else var o = g.listen(l, \"focus\", function() {\n            m.init(n);\n            o.remove();\n        })\n    ;\n    };\n    e.exports = k;\n});\n__d(\"TypeaheadHoistFriends\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._typeahead = i;\n    };\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            var i = this._typeahead.getView();\n            this._subscription = i.subscribe(\"beforeRender\", function(j, k) {\n                var l = [], m = [], n = [];\n                for (var o = 0; (o < k.results.length); ++o) {\n                    var p = k.results[o];\n                    if ((p.type == \"header\")) {\n                        n = n.concat(m, l);\n                        n.push(p);\n                        m = [];\n                        l = [];\n                    }\n                     else if (((p.type == \"user\") && p.bootstrapped)) {\n                        m.push(p);\n                    }\n                     else l.push(p);\n                    \n                ;\n                };\n                k.results = n.concat(m, l);\n            });\n        },\n        disable: function() {\n            this._typeahead.getView().unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"legacy:HoistFriendsTypeaheadBehavior\", [\"TypeaheadHoistFriends\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadHoistFriends\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.hoistFriends = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"escapeRegex\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return h.replace(/([.?*+\\^$\\[\\]\\\\(){}|\\-])/g, \"\\\\$1\");\n    };\n    e.exports = g;\n});\n__d(\"mixin\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n, o, p, q, r) {\n        var s = function() {\n        \n        }, t = [h,i,j,k,l,m,n,o,p,q,], u = 0, v;\n        while (t[u]) {\n            v = t[u];\n            for (var w in v) {\n                if (v.hasOwnProperty(w)) {\n                    s.prototype[w] = v[w];\n                };\n            };\n            u += 1;\n        };\n        return s;\n    };\n    e.exports = g;\n});");
// 12340
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sac39a7debc5c4035b44175fe994d25a90ba58b6f");
// 12341
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"bUzfU\",]);\n}\n;\n;\n__d(\"TrackingPixel\", [\"Arbiter\",\"ControlledReferer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ControlledReferer\"), i = {\n        _iframe: undefined,\n        loadWithNoReferrer: function(j) {\n            if (!i._iframe) {\n                var k = JSBNG__document.createElement(\"div\");\n                k.frameborder = 0;\n                k.width = k.height = 1;\n                k.style.position = \"absolute\";\n                k.style.JSBNG__top = \"-10px\";\n                h.useFacebookReferer(k, function() {\n                    g.inform(\"TrackingPixel/iframeIsLoaded\", null, g.BEHAVIOR_PERSISTENT);\n                }, null);\n                JSBNG__document.body.appendChild(k);\n                i._iframe = k;\n            }\n        ;\n        ;\n            g.subscribe(\"TrackingPixel/iframeIsLoaded\", function() {\n                var l = i._iframe.contentWindow.JSBNG__document, m = l.createElement(\"img\");\n                m.src = j;\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ExternalTrackingTag\", [\"AsyncSignal\",\"TrackingPixel\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"TrackingPixel\"), i = b(\"JSBNG__Event\"), j = {\n        listenForElementClick: function(k, l, m, n) {\n            i.listen(k, \"click\", function() {\n                j.sendRequest(l, m, n);\n            });\n        },\n        sendRequest: function(k, l, m) {\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            new g(\"/ads/external_tracking_tag/\", {\n                href: k,\n                tracking_tag_id: l,\n                adgroup_id: m\n            }).send();\n            h.loadWithNoReferrer(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"ad-logging\", [\"Arbiter\",\"AsyncRequest\",\"Banzai\",\"collectDataAttributes\",\"Parent\",\"TrackingNodes\",\"ExternalTrackingTag\",], function(a, b, c, d, e, f) {\n    var g = \"ssinfeed\", h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Banzai\"), k = b(\"collectDataAttributes\"), l = b(\"Parent\"), m = b(\"TrackingNodes\"), n = b(\"ExternalTrackingTag\"), o = {\n    };\n    function p(s) {\n        return ((((((((s.getAttribute && ((s.getAttribute(\"ajaxify\") || s.getAttribute(\"data-endpoint\"))))) || s.action)) || s.href)) || s.JSBNG__name));\n    };\n;\n    function q(s) {\n        var t = ((s.ei || s.ai));\n        if (((!t && s.mei))) {\n            t = s.mf_story_key;\n        }\n    ;\n    ;\n        if (((((s !== null)) && ((typeof (t) === \"string\"))))) {\n            var u = false;\n            if (s.tn) {\n                var v = m.parseTrackingNodeString(s.tn);\n                for (var w = 0; ((w < v.length)); w++) {\n                    var x = v[w][0];\n                    switch (x) {\n                      case m.types.LIKE_LINK:\n                    \n                      case m.types.UNLIKE_LINK:\n                    \n                      case m.types.COMMENT:\n                    \n                      case m.types.ADD_COMMENT_BOX:\n                        return;\n                      case m.types.XBUTTON:\n                    \n                      case m.types.HIDE_LINK:\n                    \n                      case m.types.REPORT_SPAM_LINK:\n                    \n                      case m.types.HIDE_ALL_LINK:\n                    \n                      case m.types.DROPDOWN_BUTTON:\n                    \n                      case m.types.UNHIDE_LINK:\n                        return;\n                      case m.types.ATTACHMENT:\n                    \n                      case m.types.USER_MESSAGE:\n                        u = true;\n                        break;\n                    };\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var y = JSBNG__Date.now(), z = 500;\n            s.duplicate_click = ((!!o[t] && ((((y - o[t])) < z))));\n            o[t] = y;\n            if (j.isEnabled(\"ssinfeed\")) {\n                j.post(g, s, {\n                    delay: 0,\n                    retry: j.isEnabled(\"ssinfeed_retry\")\n                });\n            }\n             else {\n                var aa = new i(\"/ajax/ssinfeed/end/\").setData(s).setAllowCrossPageTransition(true).setMethod(\"POST\");\n                aa.send();\n            }\n        ;\n        ;\n            if (((((u && s.external_tracking_tag)) && !s.duplicate_click))) {\n                n.sendRequest(s.external_tracking_tag.url, s.external_tracking_tag.tag_id, s.external_tracking_tag.adgroup_id);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function r(s, t) {\n        if (!t.node) {\n            return;\n        }\n    ;\n    ;\n        var u = p(t.node), v = ((l.byTag(t.node, \"input\") || l.byTag(t.node, \"button\")));\n        if (((((((((!u && v)) && ((v.type == \"submit\")))) && v.getAttribute)) && v.getAttribute(\"data-ft\")))) {\n            u = \"#\";\n        }\n    ;\n    ;\n        var w;\n        if (((((u && t.JSBNG__event)) && ((((t.JSBNG__event.type === \"click\")) || ((t.JSBNG__event.type === \"contextmenu\"))))))) {\n            w = k(t.node, [\"ft\",]);\n            w.ft.href = u;\n            w.ft.mouse_type = t.JSBNG__event.type;\n            q(w.ft);\n        }\n    ;\n    ;\n    };\n;\n    h.subscribe(\"ClickRefAction/new\", r);\n});\n__d(\"PopoverMenu.react\", [\"CSS\",\"InlineBlock.react\",\"Popover\",\"PopoverMenu\",\"React\",\"ReactProps\",\"SubscriptionsHandler\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"InlineBlock.react\"), i = b(\"Popover\"), j = b(\"PopoverMenu\"), k = b(\"React\"), l = b(\"ReactProps\"), m = b(\"SubscriptionsHandler\"), n = b(\"cx\"), o = b(\"joinClasses\");\n    function p(r, s) {\n        var t, u;\n        {\n            var fin220keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin220i = (0);\n            var v;\n            for (; (fin220i < fin220keys.length); (fin220i++)) {\n                ((v) = (fin220keys[fin220i]));\n                {\n                    t = r[v];\n                    u = s[v];\n                    if (((((typeof t === \"object\")) && ((typeof u === \"object\"))))) {\n                        if (!p(t, u)) {\n                            return false;\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((t !== u))) {\n                        return false;\n                    }\n                    \n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return true;\n    };\n;\n    var q = k.createClass({\n        displayName: \"ReactPopoverMenu\",\n        props: {\n            alignh: l.oneOf([\"left\",\"center\",\"right\",]),\n            layerBehaviors: l.array,\n            menu: l.object,\n            disabled: l.bool\n        },\n        _menuSubscriptions: null,\n        componentDidMount: function() {\n            var r = this.refs.root.getDOMNode(), s = r.firstChild;\n            g.addClass(s, \"-cx-PRIVATE-uiPopover__trigger\");\n            this._popover = new i(r, s, this.props.layerBehaviors, {\n                alignh: this.props.alignh,\n                disabled: this.props.disabled\n            });\n            this._popoverMenu = new j(this._popover, s, this._createMenu(this.props.menu), this.props.behaviors);\n        },\n        componentDidUpdate: function(r) {\n            if (!p(r.menu, this.props.menu)) {\n                if (this._menuSubscriptions) {\n                    this._menuSubscriptions.release();\n                    this._menuSubscriptions = null;\n                }\n            ;\n            ;\n                this._popoverMenu.setMenu(this._createMenu(this.props.menu));\n            }\n        ;\n        ;\n            if (((this.props.alignh !== r.alignh))) {\n                this._popoverMenu.getPopover().getLayer().setAlignment(this.props.alignh);\n            }\n        ;\n        ;\n            if (((this.props.disabled !== r.disabled))) {\n                if (this.props.disabled) {\n                    this._popoverMenu.disable();\n                }\n                 else this._popoverMenu.enable();\n            ;\n            }\n        ;\n        ;\n        },\n        getFirstChild: function() {\n            var r = this.props.children;\n            return ((Array.isArray(r) ? r[0] : r));\n        },\n        getButtonSize: function() {\n            var r = this.getFirstChild();\n            return ((r && r.getButtonSize()));\n        },\n        render: function() {\n            var r = this.getFirstChild();\n            r.props.className = o(((r.props.className || \"\")), \"-cx-PRIVATE-uiPopover__trigger\");\n            return this.transferPropsTo(h({\n                alignv: \"middle\",\n                className: \"uiPopover\",\n                ref: \"root\",\n                disabled: null\n            }, this.props.children));\n        },\n        componentWillUnmount: function() {\n            if (this._menuSubscriptions) {\n                this._menuSubscriptions.release();\n                this._menuSubscriptions = null;\n            }\n        ;\n        ;\n        },\n        _createMenu: function(r) {\n            var s = new r.ctor(r.menuitems, r.config);\n            this._menuSubscriptions = new m();\n            if (r.onItemClick) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"itemclick\", r.onItemClick));\n            }\n        ;\n        ;\n            if (r.onChange) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"change\", r.onChange));\n            }\n        ;\n        ;\n            if (this.props.onShow) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"show\", this.props.onShow));\n            }\n        ;\n        ;\n            if (this.props.onHide) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"hide\", this.props.onHide));\n            }\n        ;\n        ;\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ReactMenu\", [\"Menu\",\"MenuItem\",\"MenuSelectableItem\",\"MenuTheme\",\"SelectableMenu\",\"cx\",\"flattenArray\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Menu\"), h = b(\"MenuItem\"), i = b(\"MenuSelectableItem\"), j = b(\"MenuTheme\"), k = b(\"SelectableMenu\"), l = b(\"cx\"), m = b(\"flattenArray\"), n = b(\"merge\"), o = Array.prototype.slice;\n    function p(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: g,\n            menuitems: m(((r || []))),\n            config: {\n                theme: j,\n                maxheight: ((q ? q.maxheight : null))\n            }\n        };\n        return n(s, q);\n    };\n;\n    p.SelectableMenu = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: k,\n            menuitems: m(r),\n            config: {\n                className: \"-cx-PUBLIC-abstractSelectableMenu__root\",\n                theme: j,\n                multiple: ((q && q.multiple)),\n                maxheight: ((q ? q.maxheight : null))\n            }\n        };\n        return n(s, q);\n    };\n    p.Item = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: h,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    p.SelectableItem = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: i,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    e.exports = p;\n});\n__d(\"UFIOrderingModeSelector.react\", [\"InlineBlock.react\",\"Link.react\",\"LoadingIndicator.react\",\"React\",\"JSBNG__Image.react\",\"ReactMenu\",\"PopoverMenu.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"InlineBlock.react\"), h = b(\"Link.react\"), i = b(\"LoadingIndicator.react\"), j = b(\"React\"), k = b(\"JSBNG__Image.react\"), l = b(\"ReactMenu\"), m = b(\"PopoverMenu.react\"), n = b(\"cx\"), o = b(\"ix\"), p = l.SelectableMenu, q = l.SelectableItem, r = j.createClass({\n        displayName: \"UFIOrderingModeSelector\",\n        getInitialState: function() {\n            var s = null;\n            this.props.orderingmodes.map(function(t) {\n                if (t.selected) {\n                    s = t;\n                }\n            ;\n            ;\n            });\n            return {\n                selectedMode: s\n            };\n        },\n        onMenuItemClick: function(s, t) {\n            var u = t.item.getValue();\n            this.props.orderingmodes.map(function(v) {\n                if (((v.value === u))) {\n                    this.setState({\n                        selectedMode: v\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            this.props.onOrderChanged(u);\n        },\n        render: function() {\n            var s = null;\n            if (((this.props.currentOrderingMode != this.state.selectedMode.value))) {\n                s = i({\n                    className: \"UFIOrderingModeSelectorLoading\",\n                    color: \"white\",\n                    size: \"small\"\n                });\n            }\n        ;\n        ;\n            var t = p({\n                onItemClick: this.onMenuItemClick\n            }, this.props.orderingmodes.map(function(u) {\n                return (q({\n                    key: u.value,\n                    value: u.value,\n                    selected: ((u.value === this.state.selectedMode.value))\n                }, u.JSBNG__name));\n            }.bind(this)));\n            return (j.DOM.div({\n                className: \"UFIOrderingModeSelector\"\n            }, s, g(null, m({\n                className: \"UFIOrderingModeSelectorPopover\",\n                menu: t,\n                alignh: \"right\"\n            }, h(null, this.state.selectedMode.JSBNG__name, k({\n                className: \"UFIOrderingModeSelectorDownCaret\",\n                src: o(\"/images/ui/xhp/link/more/down_caret.gif\")\n            }))))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerPublishTrackingStory\", [\"JSBNG__Event\",\"ge\",\"reportData\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ge\"), i = b(\"reportData\"), j = b(\"DOMQuery\");\n    f.init = function(k) {\n        g.listen(k, \"submit\", function() {\n            var l = h(\"home_stream\");\n            if (!l) {\n                return;\n            }\n        ;\n        ;\n            var m = j.scry(l, \".uiStreamStory\")[0];\n            if (((m && m.getAttribute(\"data-ft\")))) {\n                var n = JSON.parse(m.getAttribute(\"data-ft\"));\n                if (!((((\"mf_story_key\" in n)) && ((\"qid\" in n))))) {\n                    return;\n                }\n            ;\n            ;\n                var o = {\n                    mf_story_key: n.mf_story_key,\n                    qid: n.qid\n                };\n                i(\"compose\", {\n                    ft: o\n                });\n            }\n        ;\n        ;\n        });\n    };\n});\n__d(\"ComposerXAttachmentBootstrap\", [\"CSS\",\"Form\",\"Parent\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Form\"), i = b(\"Parent\"), j = b(\"URI\"), k = b(\"cx\"), l = [], m = {\n        bootstrap: function(n) {\n            m.load(i.byTag(n, \"form\"), n.getAttribute(\"data-endpoint\"));\n        },\n        load: function(n, o, p) {\n            var q = j(o).addQueryData({\n                composerurihash: m.getURIHash(o)\n            });\n            g.conditionClass(n, \"-cx-PRIVATE-fbComposerAttachment__hidespinner\", p);\n            var r = i.byClass(n, \"-cx-PRIVATE-fbComposer__attachmentform\");\n            g.removeClass(r, \"async_saving\");\n            h.setDisabled(n, false);\n            n.action = q.toString();\n            h.bootstrap(n);\n        },\n        getURIHash: function(n) {\n            if (((n === \"initial\"))) {\n                return \"initial\";\n            }\n        ;\n        ;\n            var o = l.indexOf(n);\n            if (((o !== -1))) {\n                return ((o + \"\"));\n            }\n             else {\n                o = l.length;\n                l[o] = n;\n                return ((o + \"\"));\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ComposerXStore\", [\"function-extensions\",\"Arbiter\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ge\"), i = {\n    };\n    function j(l, m) {\n        return ((((((\"ComposerX/\" + l)) + \"/\")) + m));\n    };\n;\n    var k = {\n        set: function(l, m, n) {\n            if (!i[l]) {\n                i[l] = {\n                };\n            }\n        ;\n        ;\n            i[l][m] = n;\n            g.inform(j(l, m), {\n            }, g.BEHAVIOR_STATE);\n        },\n        get: function(l, m) {\n            if (i[l]) {\n                return i[l][m];\n            }\n        ;\n        ;\n            return null;\n        },\n        getAllForComposer: function(l) {\n            return ((i[l] || {\n            }));\n        },\n        waitForComponents: function(l, m, n) {\n            g.registerCallback(n, m.map(j.curry(l)));\n        }\n    };\n    g.subscribe(\"page_transition\", function() {\n        {\n            var fin221keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin221i = (0);\n            var l;\n            for (; (fin221i < fin221keys.length); (fin221i++)) {\n                ((l) = (fin221keys[fin221i]));\n                {\n                    if (!h(l)) {\n                        delete i[l];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = k;\n});\n__d(\"ComposerX\", [\"Arbiter\",\"ComposerXAttachmentBootstrap\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"copyProperties\",\"csx\",\"cx\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXAttachmentBootstrap\"), i = b(\"ComposerXStore\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"getObjectValues\"), q = \"any\";\n    function r(s) {\n        this._root = s;\n        this._composerID = s.id;\n        this._attachments = {\n        };\n        this._attachmentFetchForm = l.JSBNG__find(s, \".-cx-PRIVATE-fbComposer__attachmentform\");\n        this._resetSubscription = g.subscribe(\"composer/publish\", function(t, u) {\n            if (((u.composer_id === this._composerID))) {\n                this.reset();\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    m(r.prototype, {\n        _endpointHashToShow: q,\n        _lastFetchEndpoint: \"\",\n        _initialAttachmentEndpoint: \"\",\n        getAttachment: function(s, t) {\n            var u = h.getURIHash(s);\n            this._endpointHashToShow = u;\n            var v = this._attachments[u];\n            if (v) {\n                this._showAttachmentAfterComponentsLoaded(u);\n            }\n             else this.fetchAttachmentData(s, t);\n        ;\n        ;\n        },\n        fetchAttachmentData: function(s, t) {\n            var u = h.getURIHash(s);\n            if (this._attachments[u]) {\n                return;\n            }\n        ;\n        ;\n            if (((s !== this._lastFetchEndpoint))) {\n                h.load(this._attachmentFetchForm, s, t);\n                this._lastFetchEndpoint = s;\n            }\n        ;\n        ;\n        },\n        setAttachment: function(s, t, u, v) {\n            this._setupAttachment(s, t, u, v);\n            this._showAttachmentAfterComponentsLoaded(s);\n        },\n        setInitialAttachment: function(s, t, u, v) {\n            var w = h.getURIHash(s);\n            this._setupAttachment(w, t, u, v);\n            this._initialAttachmentEndpoint = s;\n            if (!this._currentInstance) {\n                this._showAttachmentAfterComponentsLoaded(w);\n            }\n        ;\n        ;\n        },\n        setComponent: function(s, t) {\n            if (!i.get(this._composerID, s)) {\n                i.set(this._composerID, s, t);\n                k.appendContent(this._attachmentFetchForm, k.create(\"input\", {\n                    type: \"hidden\",\n                    JSBNG__name: \"loaded_components[]\",\n                    value: s\n                }));\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            if (this._currentInstance) {\n                this._currentInstance.cleanup();\n                this._currentInstance = null;\n            }\n        ;\n        ;\n            {\n                var fin222keys = ((window.top.JSBNG_Replay.forInKeys)((this._attachments))), fin222i = (0);\n                var s;\n                for (; (fin222i < fin222keys.length); (fin222i++)) {\n                    ((s) = (fin222keys[fin222i]));\n                    {\n                        this._attachments[s].instance.reset();\n                    ;\n                    };\n                };\n            };\n        ;\n            var t = i.getAllForComposer(this._composerID);\n            p(t).forEach(function(u) {\n                if (u.reset) {\n                    u.reset(u);\n                }\n            ;\n            ;\n            });\n            this.getAttachment(this._initialAttachmentEndpoint);\n            g.inform(\"composer/reset\");\n        },\n        destroy: function() {\n            if (this._resetSubscription) {\n                this._resetSubscription.unsubscribe();\n                this._resetSubscription = null;\n            }\n        ;\n        ;\n        },\n        addPlaceholders: function(s, t) {\n            var u;\n            {\n                var fin223keys = ((window.top.JSBNG_Replay.forInKeys)((this._attachments))), fin223i = (0);\n                var v;\n                for (; (fin223i < fin223keys.length); (fin223i++)) {\n                    ((v) = (fin223keys[fin223i]));\n                    {\n                        u = this._attachments[v];\n                        if (((u.instance === s))) {\n                            t.forEach(function(w) {\n                                u.placeholders.push(w);\n                                u.required_components.push(w.component_name);\n                            });\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((this._currentInstance === s))) {\n                this._fillPlaceholders(t);\n            }\n        ;\n        ;\n        },\n        _setupAttachment: function(s, t, u, v) {\n            t.setComposerID(this._composerID);\n            this._attachments[s] = {\n                instance: t,\n                placeholders: u,\n                required_components: v\n            };\n            var w = l.JSBNG__find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), x = t.getRoot();\n            if (((x.parentNode !== w))) {\n                j.hide(x);\n                k.appendContent(w, x);\n            }\n        ;\n        ;\n        },\n        _showAttachment: function(s, t, u) {\n            if (((this._currentInstance === s))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._endpointHashToShow === q))) {\n                this._endpointHashToShow = null;\n            }\n             else if (((this._endpointHashToShow !== t))) {\n                return;\n            }\n            \n        ;\n        ;\n            if (this._currentInstance) {\n                if (!this._currentInstance.canSwitchAway()) {\n                    return;\n                }\n            ;\n            ;\n                this._currentInstance.cleanup();\n            }\n        ;\n        ;\n            this._currentInstance = s;\n            var v = l.JSBNG__find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), w = v.childNodes, x = s.getRoot();\n            for (var y = 0; ((y < w.length)); y++) {\n                if (((w[y] !== x))) {\n                    j.hide(w[y]);\n                }\n            ;\n            ;\n            };\n        ;\n            j.show(x);\n            this._fillPlaceholders(u);\n            var z = h.getURIHash(this._initialAttachmentEndpoint), aa = ((t === z));\n            s.initWithComponents(aa);\n            this._setAttachmentSelectedClass(s.attachmentClassName);\n            g.inform(\"composer/initializedAttachment\", {\n                composerRoot: this._root,\n                isInitial: aa\n            });\n        },\n        _showAttachmentAfterComponentsLoaded: function(s) {\n            var t = this._attachments[s];\n            i.waitForComponents(this._composerID, t.required_components, this._showAttachment.bind(this, t.instance, s, t.placeholders));\n        },\n        _fillPlaceholders: function(s) {\n            s.forEach(function(t) {\n                var u = i.get(this._composerID, t.component_name);\n                if (((t.element !== u.element.parentNode))) {\n                    k.setContent(t.element, u.element);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _setAttachmentSelectedClass: function(s) {\n            var t = l.scry(this._root, \".-cx-PUBLIC-fbComposerAttachment__selected\")[0], u;\n            if (t) {\n                j.removeClass(t, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                u = l.scry(t, \"*[aria-pressed=\\\"true\\\"]\")[0];\n                if (u) {\n                    u.setAttribute(\"aria-pressed\", \"false\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (s) {\n                var v = l.scry(this._root, ((\".\" + s)))[0];\n                if (v) {\n                    j.addClass(v, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                    u = l.scry(v, \"*[aria-pressed=\\\"false\\\"]\")[0];\n                    if (u) {\n                        u.setAttribute(\"aria-pressed\", \"true\");\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerXAttachment\", [\"ComposerXStore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ComposerXStore\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n;\n    h(j.prototype, {\n        getRoot: i,\n        initWithComponents: function(k) {\n        \n        },\n        cleanup: i,\n        reset: i,\n        attachmentClassName: \"\",\n        getComponent: function(k) {\n            return g.get(this._composerID, k);\n        },\n        canSwitchAway: i.thatReturnsTrue,\n        setComposerID: function(k) {\n            this._composerID = k;\n        },\n        allowOGTagPreview: function() {\n            return false;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXController\", [\"Arbiter\",\"ComposerX\",\"ComposerXAttachmentBootstrap\",\"Parent\",\"$\",\"cx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerX\"), i = b(\"ComposerXAttachmentBootstrap\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = b(\"ge\"), o = {\n    };\n    function p(r) {\n        var s = j.byClass(k(r), \"-cx-PRIVATE-fbComposer__root\"), t = s.id;\n        if (!o[t]) {\n            o[t] = new h(s);\n        }\n    ;\n    ;\n        return o[t];\n    };\n;\n    var q = {\n        getAttachment: function(r, s, t) {\n            var u = p(r);\n            u.getAttachment(s, t);\n        },\n        fetchAttachmentData: function(r, s, t) {\n            p(r).fetchAttachmentData(s, t);\n        },\n        setAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setAttachment(s, t, u, v);\n        },\n        setInitialAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setInitialAttachment(s, t, u, v);\n        },\n        setComponent: function(r, s, t) {\n            var u = p(r);\n            u.setComponent(s, t);\n        },\n        reset: function(r) {\n            var s = p(r);\n            s.reset();\n        },\n        holdTheMarkup: m,\n        getEndpoint: function(r, s, t) {\n            var u = p(r);\n            i.load(u._attachmentFetchForm, s, t);\n        },\n        addPlaceholders: function(r, s, t) {\n            var u = p(r);\n            u.addPlaceholders(s, t);\n        }\n    };\n    i.bootstrap = function(r) {\n        q.getAttachment(r, r.getAttribute(\"data-endpoint\"));\n    };\n    g.subscribe(\"page_transition\", function() {\n        {\n            var fin224keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin224i = (0);\n            var r;\n            for (; (fin224i < fin224keys.length); (fin224i++)) {\n                ((r) = (fin224keys[fin224i]));\n                {\n                    if (!n(r)) {\n                        o[r].destroy();\n                        delete o[r];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = q;\n});\n__d(\"ComposerXAttachmentUtils\", [\"CSS\",\"DataStore\",\"DOMQuery\",\"Focus\",\"Input\",\"PageTransitions\",\"Run\",\"StickyPlaceholderInput\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Focus\"), k = b(\"Input\"), l = b(\"PageTransitions\"), m = b(\"Run\"), n = b(\"StickyPlaceholderInput\"), o = b(\"tx\"), p = \"composer_fixed_placeholder\";\n    function q(s, t) {\n        if (!h.get(s.element, p, false)) {\n            s.instance.setPlaceholder(t);\n        }\n    ;\n    ;\n    };\n;\n    var r = {\n        initMentions: function(s, t) {\n            q(s, t);\n            var u = i.JSBNG__find(s.element, \"textarea.input\");\n            j.set(u);\n        },\n        setStickyPlaceholderForMentions: function(s, t) {\n            if (((i.contains(s.element, JSBNG__document.activeElement) && g.hasClass(JSBNG__document.activeElement, \"DOMControl_placeholder\")))) {\n                JSBNG__document.activeElement.JSBNG__blur();\n            }\n        ;\n        ;\n            q(s, t);\n        },\n        setPlaceholderIsFixed: function(s, t) {\n            h.set(s.element, p, !!t);\n        },\n        setStickyPlaceholderForTypeahead: function(s, t) {\n            var u = i.JSBNG__find(s, \".textInput\");\n            n.setPlaceholderText(u, t);\n        },\n        registerInputForLeaveWarning: function(s) {\n            m.onBeforeUnload(function() {\n                var t = l.getNextURI();\n                if (t.getQueryData().hasOwnProperty(\"theater\")) {\n                    return;\n                }\n            ;\n            ;\n                if (((a.Dialog && a.Dialog.getCurrent()))) {\n                    return;\n                }\n            ;\n            ;\n                if (((((s.offsetParent !== null)) && !k.isEmpty(s)))) {\n                    return \"You haven't finished your post yet. Do you want to leave without finishing?\";\n                }\n            ;\n            ;\n            });\n        }\n    };\n    e.exports = r;\n});\n__d(\"DragDropFileUpload\", [], function(a, b, c, d, e, f) {\n    f.isSupported = function() {\n        return ((typeof (JSBNG__FileList) !== \"undefined\"));\n    };\n});\n__d(\"DocumentDragDrop\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMQuery\",\"DragDropFileUpload\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DragDropFileUpload\"), m = b(\"emptyFunction\"), n = b(\"getObjectValues\"), o = {\n    }, p = 0;\n    function q() {\n        p = 0;\n        n(o).forEach(function(t) {\n            i.removeClass(t.element, t.className);\n            h.inform(\"dragleave\", {\n                element: t.element\n            });\n        });\n    };\n;\n    function r() {\n        if (!l.isSupported()) {\n            return;\n        }\n    ;\n    ;\n        g.listen(JSBNG__document, \"dragenter\", function(u) {\n            if (((p === 0))) {\n                n(o).forEach(function(v) {\n                    i.addClass(v.element, v.className);\n                    h.inform(\"dragenter\", {\n                        element: v.element,\n                        JSBNG__event: u\n                    });\n                });\n            }\n        ;\n        ;\n            p++;\n        });\n        g.listen(JSBNG__document, \"dragleave\", function(u) {\n            p--;\n            if (((p === 0))) {\n                q();\n            }\n        ;\n        ;\n        });\n        g.listen(JSBNG__document, \"drop\", function(u) {\n            var v = u.getTarget();\n            if (k.isNodeOfType(u.getTarget(), \"input\")) {\n                if (((v.type === \"file\"))) {\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            u.prevent();\n        });\n        g.listen(JSBNG__document, \"dragover\", g.prevent);\n        var t = null;\n        JSBNG__document.JSBNG__addEventListener(\"dragover\", function() {\n            ((t && JSBNG__clearTimeout(t)));\n            t = JSBNG__setTimeout(q, 839);\n        }, true);\n        r = m;\n    };\n;\n    var s = {\n        registerStatusElement: function(t, u) {\n            r();\n            o[j.getID(t)] = {\n                element: t,\n                className: u\n            };\n        },\n        removeStatusElement: function(t) {\n            var u = j.getID(t), v = o[u];\n            i.removeClass(v.element, v.className);\n            delete o[u];\n        }\n    };\n    e.exports = s;\n});\n__d(\"DragDropTarget\", [\"JSBNG__Event\",\"CSS\",\"DocumentDragDrop\",\"DragDropFileUpload\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DocumentDragDrop\"), j = b(\"DragDropFileUpload\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this._element = n;\n        this._listeners = [];\n        this._statusElem = n;\n        this._dragEnterCount = 0;\n        this._enabled = false;\n    };\n;\n    k(m.prototype, {\n        _onFilesDropCallback: l,\n        _onURLDropCallback: l,\n        _onPlainTextDropCallback: l,\n        _onDropCallback: l,\n        _fileFilterFn: l.thatReturnsArgument,\n        setOnFilesDropCallback: function(n) {\n            this._onFilesDropCallback = n;\n            return this;\n        },\n        setOnURLDropCallback: function(n) {\n            this._onURLDropCallback = n;\n            return this;\n        },\n        setOnPlainTextDropCallback: function(n) {\n            this._onPlainTextDropCallback = n;\n            return this;\n        },\n        setOnDropCallback: function(n) {\n            this._onDropCallback = n;\n            return this;\n        },\n        enable: function() {\n            if (!j.isSupported()) {\n                return this;\n            }\n        ;\n        ;\n            i.registerStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            this._listeners.push(g.listen(this._element, \"dragenter\", this._onDragEnter.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragleave\", this._onDragLeave.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragover\", g.kill));\n            this._listeners.push(g.listen(this._element, \"drop\", function(n) {\n                this._dragEnterCount = 0;\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n                var o = {\n                }, p = false, q = this._fileFilterFn(n.dataTransfer.files);\n                if (q.length) {\n                    this._onFilesDropCallback(q, n);\n                    o.files = q;\n                    p = true;\n                }\n            ;\n            ;\n                var r = ((n.dataTransfer.getData(\"url\") || n.dataTransfer.getData(\"text/uri-list\")));\n                if (r) {\n                    this._onURLDropCallback(r, n);\n                    o.url = r;\n                    p = true;\n                }\n            ;\n            ;\n                var s = n.dataTransfer.getData(\"text/plain\");\n                if (s) {\n                    this._onPlainTextDropCallback(s, n);\n                    o.plainText = s;\n                    p = true;\n                }\n            ;\n            ;\n                if (p) {\n                    this._onDropCallback(o, n);\n                }\n            ;\n            ;\n                n.kill();\n            }.bind(this)));\n            this._enabled = true;\n            return this;\n        },\n        disable: function() {\n            if (!this._enabled) {\n                return this;\n            }\n        ;\n        ;\n            i.removeStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            h.removeClass(this._statusElem, \"fbDropReady\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n            h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            this._enabled = false;\n            return this;\n        },\n        setFileFilter: function(n) {\n            this._fileFilterFn = n;\n            return this;\n        },\n        setStatusElement: function(n) {\n            this._statusElem = n;\n            return this;\n        },\n        _onDragEnter: function(n) {\n            if (((this._dragEnterCount === 0))) {\n                var o = n.dataTransfer.items, p = false;\n                for (var q = 0; ((q < o.length)); q++) {\n                    if (!o[q].type.match(\"image/*\")) {\n                        p = true;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                h.addClass(this._statusElem, \"fbDropReady\");\n                if (p) {\n                    h.addClass(this._statusElem, \"fbDropReadyLink\");\n                }\n                 else if (((o.length > 1))) {\n                    h.addClass(this._statusElem, \"fbDropReadyPhotos\");\n                }\n                 else h.addClass(this._statusElem, \"fbDropReadyPhoto\");\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            this._dragEnterCount++;\n        },\n        _onDragLeave: function() {\n            this._dragEnterCount = Math.max(((this._dragEnterCount - 1)), 0);\n            if (((this._dragEnterCount === 0))) {\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ComposerXDragDrop\", [\"Arbiter\",\"ComposerXController\",\"CSS\",\"DragDropTarget\",\"DOMQuery\",\"Parent\",\"URI\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXController\"), i = b(\"CSS\"), j = b(\"DragDropTarget\"), k = b(\"DOMQuery\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = \"/ajax/composerx/attachment/media/upload/\", r = \"/ajax/composerx/attachment/link/scraper/\", s = function(u) {\n        u();\n    };\n    function t(u, v, w, x) {\n        this._root = u;\n        this._composerID = v;\n        this._targetID = w;\n        x = ((x || s));\n        this._dragdrop = new j(u).setOnFilesDropCallback(function(y) {\n            x(this._uploadFiles.bind(this, y));\n        }.bind(this)).setFileFilter(t.filterImages).enable();\n        t.handleDragEnterAndLeave(u);\n        g.subscribe(\"composer/deactivateDragdrop\", function() {\n            this.deactivate();\n        }.bind(this));\n        g.subscribe(\"composer/reactivateDragdrop\", function() {\n            this.reactivate();\n        }.bind(this));\n    };\n;\n    n(t, {\n        handleDragEnterAndLeave: function(u) {\n            var v = k.scry(l.byClass(u, \"-cx-PRIVATE-fbComposer__root\"), \".-cx-PUBLIC-fbComposerAttachment__nub\");\n            g.subscribe(\"dragenter\", function(w, x) {\n                if (((u == x.element))) {\n                    v.forEach(i.hide);\n                }\n            ;\n            ;\n            });\n            g.subscribe(\"dragleave\", function(w, x) {\n                if (((u == x.element))) {\n                    v.forEach(i.show);\n                }\n            ;\n            ;\n            });\n        },\n        filterImages: function(u) {\n            var v = [];\n            for (var w = 0; ((w < u.length)); w++) {\n                if (u[w].type.match(\"image/*\")) {\n                    v.push(u[w]);\n                }\n            ;\n            ;\n            };\n        ;\n            return v;\n        }\n    });\n    n(t.prototype, {\n        enableURLDropping: function() {\n            this._dragdrop.setOnURLDropCallback(this._onURLDrop.bind(this));\n        },\n        deactivate: function() {\n            this._dragdrop.disable();\n        },\n        reactivate: function() {\n            this._dragdrop.enable();\n        },\n        _uploadFiles: function(u) {\n            h.getAttachment(this._root, q);\n            g.inform(((((\"ComposerXFilesStore/filesDropped/\" + this._composerID)) + \"/mediaupload\")), {\n                files: u\n            }, g.BEHAVIOR_PERSISTENT);\n        },\n        _onURLDrop: function(u) {\n            var v = new m(r);\n            v.addQueryData({\n                scrape_url: encodeURIComponent(u)\n            });\n            h.getAttachment(this._root, v.toString());\n        }\n    });\n    e.exports = t;\n});\n__d(\"PrivacyConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FRIENDS_PLUS_GAMER_FRIENDS: 128,\n        FRIENDS_MINUS_ACQUAINTANCES: 127,\n        FACEBOOK_EMPLOYEES: 112,\n        CUSTOM: 111,\n        EVERYONE: 80,\n        NETWORKS_FRIENDS_OF_FRIENDS: 60,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SELF: 10,\n        NOBODY: 0\n    }, h = {\n        EVERYONE: 80,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SOME_FRIENDS: 30,\n        SELF: 10,\n        NO_FRIENDS: 0\n    }, i = {\n        NONE: 0,\n        TAGGEES: 1,\n        FRIENDS_OF_TAGGEES: 2\n    }, j = {\n        BaseValue: g,\n        FriendsValue: h,\n        TagExpansion: i\n    };\n    e.exports = j;\n});\n__d(\"ComposerXBootloadStatusAttachment\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"ComposerXAttachment\",\"ComposerXController\",\"ComposerXDragDrop\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"PlaceholderListener\",\"PrivacyConst\",\"URI\",\"SelectorDeprecated\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ComposerXAttachment\"), m = b(\"ComposerXController\"), n = b(\"ComposerXDragDrop\"), o = b(\"ComposerXStore\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"DOMQuery\"), s = b(\"Focus\"), t = b(\"Parent\"), u = b(\"PlaceholderListener\"), v = b(\"PrivacyConst\"), w = b(\"URI\"), x = b(\"SelectorDeprecated\"), y = b(\"copyProperties\"), z = b(\"csx\"), aa = b(\"cx\"), ba = {\n    };\n    function ca(da, ea) {\n        this.parent.construct(this);\n        this._root = da;\n        this._config = ea;\n    };\n;\n    k.extend(ca, l);\n    y(ca.prototype, {\n        _attachmentIsActive: false,\n        _bootloading: false,\n        _fullVersion: false,\n        _focusListener: null,\n        _privacyWidgetTags: null,\n        _scraper: null,\n        _dragdrop: null,\n        attachmentClassName: \"-cx-PRIVATE-fbComposerAttachment__status\",\n        getRoot: function() {\n            return this._root;\n        },\n        initWithComponents: function(da) {\n            ba[this._composerID] = this;\n            this._attachmentIsActive = true;\n            var ea = r.JSBNG__find(this.getComponent(\"maininput\").element, \"textarea.input\");\n            if (this._fullVersion) {\n                this._fullInitWithComponents();\n            }\n             else if (!this._bootloading) {\n                if (r.contains(this._root, JSBNG__document.activeElement)) {\n                    this._onInitialFocus();\n                }\n                 else this._focusListener = g.listen(ea, \"JSBNG__focus\", this._onInitialFocus.bind(this));\n            ;\n            }\n            \n        ;\n        ;\n            this._dragEnterHandler = h.subscribe(\"dragenter\", function(fa, ga) {\n                if (((ga.element == this._root))) {\n                    var ha = ga.JSBNG__event.dataTransfer.items, ia;\n                    if (ha) {\n                        ia = n.filterImages(ha);\n                    }\n                ;\n                ;\n                    if (((ia && ((ia.length > 0))))) {\n                        s.set(ea);\n                    }\n                     else {\n                        var ja = t.byClass(this._root, \"focus_target\");\n                        u.expandInput(ja);\n                        if (((!this._bootloading && !this._fullVersion))) {\n                            this._onInitialFocus();\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n            if (!da) {\n                s.set(ea);\n            }\n        ;\n        ;\n            if (this._config.plus_version) {\n                this._dragdrop = new n(this._root, this._composerID, this._config.targetID);\n                this._dragdrop.enableURLDropping();\n            }\n        ;\n        ;\n        },\n        _fullInitWithComponents: function() {\n            j.loadModules([\"ComposerXPrivacyWidgetTags\",\"URLScraper\",\"URI\",], function(da, ea, fa) {\n                this._tagger.init(this);\n                this._privacyWidgetTags = new da(this);\n                var ga = r.JSBNG__find(this.getComponent(\"maininput\").element, \"textarea.input\");\n                if (!this._scraper) {\n                    this._scraper = new ea(ga);\n                    this._scraper.subscribe(\"match\", function(ha, ia) {\n                        var ja = this._getScraperEndpoint();\n                        ja.addQueryData({\n                            scrape_url: encodeURIComponent(ia.url)\n                        });\n                        m.getAttachment(this._root, ja.toString());\n                    }.bind(this));\n                }\n            ;\n            ;\n                this._scraper.enable();\n                this._scraper.check();\n            }.bind(this));\n            this._initPrivacyReminder();\n        },\n        _initPrivacyReminder: function() {\n            if (((!this._reminderDialog || this._reminderShown))) {\n                return;\n            }\n        ;\n        ;\n            var da = this.getComponent(\"mainprivacywidget\"), ea = x.getSelectedOptions(da.element), fa = x.getOptionValue(ea[0]);\n            if (((fa !== String(v.BaseValue.SELF)))) {\n                return;\n            }\n        ;\n        ;\n            this._reminderDialog.setContext(this.getComponent(\"mainprivacywidget\").element).show();\n            this._reminderShown = true;\n            var ga = function() {\n                new i(\"/ajax/privacy/reminders/dismiss\").setData({\n                    type: \"only_me\"\n                }).send();\n                this._reminderDialog.hide();\n            }.bind(this);\n            this._reminderEvents = [g.listen(this._reminderDialog.getContent(), \"click\", ga),g.listen(this._reminderDialog.getContext(), \"click\", ga),];\n        },\n        cleanup: function() {\n            this._attachmentIsActive = false;\n            if (this._focusListener) {\n                this._focusListener.remove();\n                this._focusListener = null;\n            }\n        ;\n        ;\n            if (((this._reminderDialog && this._reminderShown))) {\n                this._reminderDialog.hide();\n                this._reminderEvents.forEach(function(da) {\n                    da.remove();\n                });\n            }\n        ;\n        ;\n            if (this._dragdrop) {\n                this._dragdrop.deactivate();\n                this._dragdrop = null;\n            }\n        ;\n        ;\n            if (this._fullVersion) {\n                this._tagger.cleanup();\n                this._privacyWidgetTags.destroy();\n                this._privacyWidgetTags = null;\n                this._scraper.disable();\n            }\n        ;\n        ;\n            if (this._dragEnterHandler) {\n                this._dragEnterHandler.unsubscribe();\n                this._dragEnterHandler = null;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            var da = t.byClass(this._root, \"child_was_focused\");\n            if (da) {\n                p.removeClass(da, \"child_was_focused\");\n            }\n        ;\n        ;\n            if (this._tagger) {\n                this._tagger.reset();\n            }\n        ;\n        ;\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n        },\n        canSwitchAway: function() {\n            return !t.byClass(this._root, \"async_saving\");\n        },\n        setBootloadedContent: function(da, ea, fa, ga) {\n            this._reminderDialog = ga;\n            var ha = fa.map(function(ia) {\n                return ia.component_name;\n            });\n            o.waitForComponents(this._composerID, ha, function() {\n                var ia = r.JSBNG__find(this._root, \".-cx-PRIVATE-fbComposerBootloadStatus__taggersplaceholder\"), ja = r.JSBNG__find(this._root, \".-cx-PRIVATE-fbComposerBootloadStatus__iconsplaceholder\");\n                q.setContent(ia, da.tagger_content);\n                q.setContent(ja, da.tagger_icons);\n                m.addPlaceholders(this._root, this, fa);\n                this._tagger = ea;\n                this._fullVersion = true;\n                if (this._attachmentIsActive) {\n                    if (this._focusListener) {\n                        this._focusListener.remove();\n                        this._focusListener = null;\n                    }\n                ;\n                ;\n                    this._fullInitWithComponents();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _getScraperEndpoint: function() {\n            return w(\"/ajax/composerx/attachment/link/scraper/\");\n        },\n        _onInitialFocus: function() {\n            h.inform(\"composer/focus\");\n            m.getEndpoint(this._root, \"/ajax/composerx/attachment/status/bootload/\", true);\n            this._bootloading = true;\n        },\n        allowOGTagPreview: function() {\n            return true;\n        }\n    });\n    ca.setBootloadedContent = function(da, ea, fa, ga, ha) {\n        var ia = ba[da];\n        if (ia) {\n            ia.setBootloadedContent(ea, fa, ga, ha);\n        }\n    ;\n    ;\n    };\n    e.exports = ca;\n});\n__d(\"ComposerXMentionsInputReset\", [\"DOMQuery\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Input\");\n    function i(j) {\n        var k = g.scry(j.element, \"textarea.input\")[0];\n        j.instance.reset();\n        h.reset(k);\n    };\n;\n    e.exports = i;\n});\n__d(\"ComposerXOGTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbOGComposerXTagger__ogactioniconselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n;\n    e.exports = i;\n});\n__d(\"ComposerXPrivacyWidgetReset\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    function h(i) {\n        g.inform(\"Composer/changedtags\", {\n            withTags: [],\n            mention: {\n            },\n            eventTag: false\n        });\n    };\n;\n    e.exports = h;\n});\n__d(\"ComposerXTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__friendiconselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__placeiconselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n;\n    e.exports = i;\n});\n__d(\"SwapButtonDEPRECATED\", [\"JSBNG__Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k(l, m, n) {\n        this._swapperButton = l;\n        this._swappeeButton = m;\n        g.listen(l, \"click\", this.swap.bind(this));\n        if (n) {\n            g.listen(m, \"click\", this.unswap.bind(this));\n        }\n    ;\n    ;\n        h.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", this.setFocusOnSwapper.bind(this), h.SUBSCRIBE_ALL);\n    };\n;\n    i(k.prototype, {\n        _swapperButton: null,\n        _swappeeButton: null,\n        swap: function(l) {\n            j.hide(this._swapperButton);\n            j.show(this._swappeeButton);\n            ((((l !== false)) && this._swappeeButton.JSBNG__focus()));\n        },\n        unswap: function(l) {\n            j.show(this._swapperButton);\n            j.hide(this._swappeeButton);\n            ((((l !== false)) && this._swapperButton.JSBNG__focus()));\n        },\n        toggle: function() {\n            j.toggle(this._swapperButton);\n            j.toggle(this._swappeeButton);\n        },\n        setFocusOnSwapper: function() {\n            this._swapperButton.JSBNG__focus();\n        }\n    });\n    e.exports = k;\n});\n__d(\"SubscribeButton\", [\"Arbiter\",\"AsyncRequest\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__Event\"), j = {\n        SUBSCRIBED: \"FollowingUser\",\n        UNSUBSCRIBED: \"UnfollowingUser\",\n        init: function(k, l, m, n, o, p) {\n            i.listen(l, \"click\", function() {\n                g.inform(j.SUBSCRIBED, {\n                    profile_id: n\n                });\n            });\n            g.subscribe(j.SUBSCRIBED, function(q, r) {\n                if (((n === r.profile_id))) {\n                    if (!o) {\n                        m.suppressNextMouseEnter();\n                    }\n                ;\n                ;\n                    k.swap();\n                    if (((p === true))) {\n                        new h().setURI(\"/ajax/profile/suggestions_on_following.php\").setData({\n                            profileid: n\n                        }).send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            g.subscribe(j.UNSUBSCRIBED, function(q, r) {\n                if (((n === r.profile_id))) {\n                    k.unswap();\n                    m.hideFlyout();\n                    g.inform(\"SubMenu/Reset\");\n                }\n            ;\n            ;\n            });\n        },\n        initUnsubscribe: function(k, l) {\n            i.listen(k, \"click\", function() {\n                g.inform.bind(g, j.UNSUBSCRIBED, {\n                    profile_id: l\n                }).defer();\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"AudienceSelectorTags\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        hasTags: function(i) {\n            return g.hasOwnProperty(i);\n        },\n        setHasTags: function(i) {\n            if (i) {\n                g[i] = true;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"BasePrivacyOption\", [\"Arbiter\",\"AudienceSelectorTags\",\"copyProperties\",\"CSS\",\"DOM\",\"Env\",\"fbt\",\"Parent\",\"PrivacyConst\",\"SelectorDeprecated\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"fbt\"), n = b(\"Parent\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"tx\");\n    function r(s) {\n        this._selector = n.byClass(s, \"audienceSelector\");\n        this._plusLabel = k.scry(s, \".plusLabel\")[0];\n        if (!this._selector) {\n            return;\n        }\n    ;\n    ;\n        this._elem = s;\n        this._taggedIDs = [];\n        this._tags = [];\n        this._hasEvent = false;\n        this._recalculateTooltipAndLabel();\n        this._updateSelector();\n        g.subscribe(\"Composer/changedtags\", function(t, u) {\n            if (!this._getChangedData()) {\n                return;\n            }\n        ;\n        ;\n            var v = this._hasEvent;\n            this._hasEvent = !!u.eventTag;\n            this._tags = u.withTags.map(function(y) {\n                return y.getText();\n            });\n            this._taggedIDs = u.withTags.map(function(y) {\n                return y.getValue();\n            });\n            {\n                var fin225keys = ((window.top.JSBNG_Replay.forInKeys)((u.mention))), fin225i = (0);\n                var w;\n                for (; (fin225i < fin225keys.length); (fin225i++)) {\n                    ((w) = (fin225keys[fin225i]));\n                    {\n                        if (((((u.mention[w].type == \"user\")) && ((u.mention[w].uid != l.user))))) {\n                            this._tags.push(u.mention[w].text);\n                            this._taggedIDs.push(u.mention[w].uid);\n                        }\n                         else if (((u.mention[w].type == \"JSBNG__event\"))) {\n                            this._hasEvent = true;\n                        }\n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((this._hasEvent && ((v != this._hasEvent))))) {\n                this._eventTagChanged();\n            }\n        ;\n        ;\n            var x = this._recalculateTooltipAndLabel();\n            if (((x && p.isOptionSelected(this._elem)))) {\n                this._updateSelector();\n                g.inform(\"SelectedPrivacyOption/changed\", this._getChangedData());\n            }\n        ;\n        ;\n        }.bind(this));\n        p.listen(this._selector, \"change\", this._updateSelector.bind(this));\n    };\n;\n    i(r.prototype, {\n        _eventTagChanged: function() {\n        \n        },\n        _getChangedData: function() {\n            return null;\n        },\n        _recalculateTooltipAndLabel: function() {\n            var s = this._tooltip, t = this._label, u = this._getIncludedAudience(), v = this._getExcludedAudience(), w = this._getTagExpansionText();\n            if (w) {\n                u = m._(\"{list of people who can see this}, {list of additional people who can see this}\", [m.param(\"list of people who can see this\", u),m.param(\"list of additional people who can see this\", w),]);\n            }\n        ;\n        ;\n            this._tooltip = this._getCombinedSentence(u, v);\n            this._recalcLabel();\n            return ((((s != this._tooltip)) || ((t != this._label))));\n        },\n        _getIncludedAudience: function() {\n            return this._elem.getAttribute(\"data-label\");\n        },\n        _getExcludedAudience: function() {\n            return \"\";\n        },\n        _getTagExpansionText: function() {\n            var s = this._getTagExpansionBehavior();\n            if (((!!this._taggedIDs.length || this._alreadyHasTags()))) {\n                if (((s == o.TagExpansion.FRIENDS_OF_TAGGEES))) {\n                    if (this._hasEvent) {\n                        return \"friends of anyone tagged, event guests\";\n                    }\n                ;\n                ;\n                    return \"friends of anyone tagged\";\n                }\n                 else if (((s == o.TagExpansion.TAGGEES))) {\n                    return \"Anyone tagged\";\n                }\n                \n            ;\n            ;\n                return \"\";\n            }\n        ;\n        ;\n            if (((this._hasEvent && ((s == o.TagExpansion.FRIENDS_OF_TAGGEES))))) {\n                return \"event guests\";\n            }\n        ;\n        ;\n            return \"\";\n        },\n        _getCombinedSentence: function(s, t) {\n            if (!t) {\n                return s;\n            }\n        ;\n        ;\n            return m._(\"{list of people who can see this}; Except: {list of people who cannot see this}\", [m.param(\"list of people who can see this\", s),m.param(\"list of people who cannot see this\", t),]);\n        },\n        _recalcLabel: function() {\n            this._label = this._elem.getAttribute(\"data-label\");\n            if (this._showPlusLabel()) {\n                this._label += \" (+)\";\n            }\n        ;\n        ;\n            j.conditionShow(this._plusLabel, this._showPlusLabel());\n        },\n        _showPlusLabel: function() {\n            var s = this._getTagExpansionBehavior();\n            return ((((!!this._taggedIDs.length && ((s != o.TagExpansion.NONE)))) || ((!!this._hasEvent && ((s == o.TagExpansion.FRIENDS_OF_TAGGEES))))));\n        },\n        _getTagExpansionBehavior: function() {\n            return o.TagExpansion.NONE;\n        },\n        _alreadyHasTags: function() {\n            var s = k.scry(this._selector, \"*[data-oid]\")[0];\n            s = ((s && s.getAttribute(\"data-oid\")));\n            return ((s && h.hasTags(s)));\n        },\n        _updateSelector: function() {\n            if (p.isOptionSelected(this._elem)) {\n                p.setButtonTooltip(this._selector, this._tooltip);\n                return false;\n            }\n        ;\n        ;\n            return true;\n        }\n    });\n    e.exports = r;\n});\n__d(\"CustomPrivacyOption\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"JSBNG__Event\",\"Form\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"BasePrivacyOption\"), k = b(\"Class\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"Form\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"copyProperties\");\n    function r(s, t, u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!s) {\n            return;\n        }\n    ;\n    ;\n        this._baseAudienceValue = aa;\n        this._includedAudience = ba;\n        this._excludedAudience = ca;\n        this._tagExpansionBehavior = da;\n        (function() {\n            this.initCustomState(s, t, u);\n            m.listen(s, \"click\", function(JSBNG__event) {\n                this.openCustomDialog(JSBNG__event, t, v, x, y, z);\n            }.bind(this));\n            p.listen(this._selector, \"select\", function(ea) {\n                if (((ea.option._id != this._id))) {\n                    this.clearCustomState();\n                }\n            ;\n            ;\n            }.bind(this));\n            this.parent.construct(this, s);\n        }).bind(this).defer();\n    };\n;\n    k.extend(r, j);\n    q(r, {\n        _instances: {\n        },\n        update: function(s, t, u, v, w, x, y, z) {\n            var aa = r._instances[s];\n            aa._update(t, u)._updateOptionValues(w, x, y, z)._updateOption(u);\n            g.inform(\"Form/change\", {\n                node: aa._container\n            });\n        },\n        getData: function(s) {\n            return r._instances[s]._privacyData;\n        },\n        setPrivacyData: function(s, t, u) {\n            r._instances[s]._update(t, u);\n            r._instances[s]._updateOption(u);\n        }\n    });\n    q(r.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: this._baseAudienceValue\n            };\n        },\n        _updateOptionValues: function(s, t, u, v) {\n            this._baseAudienceValue = s;\n            this._includedAudience = t;\n            this._excludedAudience = u;\n            this._tagExpansionBehavior = v;\n            return this;\n        },\n        _updateOption: function(s) {\n            var t = ((p.getOption(this._selector, s) || p.getOption(this._selector, ((o.BaseValue.CUSTOM + \"\")))));\n            this._recalculateTooltipAndLabel();\n            g.inform(\"CustomPrivacyOption/update\", {\n                selector: this._selector,\n                option: t,\n                tooltip: this._tooltip,\n                label: this._label\n            });\n            return this;\n        },\n        _getIncludedAudience: function() {\n            return this._includedAudience;\n        },\n        _getExcludedAudience: function() {\n            return this._excludedAudience;\n        },\n        _getTagExpansionBehavior: function() {\n            return this._tagExpansionBehavior;\n        },\n        _update: function(s, t) {\n            var u = ((((t == o.BaseValue.CUSTOM)) || !p.getOption(this._selector, t))), v = this._selector.getAttribute(\"data-name\");\n            this.updateCustomState(s, u, v);\n            return this;\n        },\n        initCustomState: function(s, t, u) {\n            r._instances[t] = this;\n            this._container = l.JSBNG__find(s, \".customPrivacyInputs\");\n            this._id = u;\n            this._privacyData = {\n            };\n            var v = n.serialize(this._container);\n            if (v.audience) {\n                this._privacyData = v.audience[u];\n            }\n        ;\n        ;\n            return s;\n        },\n        openCustomDialog: function(JSBNG__event, s, t, u, v, w) {\n            var x = new i(\"/ajax/privacy/custom_dialog/\").setData({\n                option_id: s,\n                id: this._id,\n                privacy_data: this._privacyData,\n                explain_tags: t,\n                autosave: u,\n                limit_to_friends: v,\n                source: w\n            });\n            x.setRelativeTo(JSBNG__event.getTarget());\n            h.send(x);\n        },\n        updateCustomState: function(s, t, u) {\n            this.clearCustomState();\n            this._privacyData = q({\n            }, s);\n            if (t) {\n                if (u) {\n                    u = u.slice(0, -\"[value]\".length);\n                    var v = {\n                    };\n                    v[u] = s;\n                    n.createHiddenInputs(v, this._container, null, true);\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        clearCustomState: function() {\n            this._privacyData = {\n            };\n            l.empty(this._container);\n        }\n    });\n    e.exports = r;\n});\n__d(\"DynamicIconSelector\", [\"Button\",\"CSS\",\"DOM\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Button\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"SelectorDeprecated\"), k = {\n        swapIcon: function(l) {\n            var m = j.getSelectedOptions(l)[0], n = ((m && i.scry(m, \".itemIcon\")[0])), o = j.getSelectorButton(l);\n            if (n) {\n                g.setIcon(o, n.cloneNode(true));\n            }\n             else {\n                var p = i.scry(o, \".img\")[0];\n                ((p && i.remove(p)));\n            }\n        ;\n        ;\n            h.conditionClass(o, \"uiSelectorChevronOnly\", !n);\n        }\n    };\n    j.subscribe(\"change\", function(l, m) {\n        var n = m.selector;\n        if (h.hasClass(n, \"dynamicIconSelector\")) {\n            k.swapIcon(n);\n        }\n    ;\n    ;\n    });\n    e.exports = k;\n});\n__d(\"AudienceSelector\", [\"Arbiter\",\"AudienceSelectorTags\",\"CSS\",\"CustomPrivacyOption\",\"DOM\",\"DynamicIconSelector\",\"PrivacyConst\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"CSS\"), j = b(\"CustomPrivacyOption\"), k = b(\"DOM\"), l = b(\"DynamicIconSelector\"), m = b(\"PrivacyConst\"), n = b(\"SelectorDeprecated\"), o = {\n    };\n    n.subscribe(\"select\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return;\n        }\n    ;\n    ;\n        var s = n.getOptionValue(r.option);\n        r.value = s;\n        g.inform(\"AudienceSelector/changed\", r);\n        if (((((s == m.BaseValue.CUSTOM)) && !i.hasClass(r.option, \"noDialog\")))) {\n            n.toggle(r.selector);\n            return false;\n        }\n    ;\n    ;\n        if (i.hasClass(r.selector, \"dataTooltip\")) {\n            var t = k.JSBNG__find(r.option, \".itemAnchor\").getAttribute(\"data-tooltip\");\n            n.setButtonTooltip(r.selector, ((t || null)));\n        }\n    ;\n    ;\n        if (!i.hasClass(r.option, \"specialOption\")) {\n            return;\n        }\n    ;\n    ;\n        var u = k.JSBNG__find(r.option, \"a\").getAttribute(\"data-type\");\n        if (i.hasClass(r.option, \"moreOption\")) {\n            i.addClass(r.selector, u);\n            i.addClass(r.selector, \"showSecondaryOptions\");\n            return false;\n        }\n         else if (i.hasClass(r.option, \"returnOption\")) {\n            i.removeClass(r.selector, \"showSecondaryOptions\");\n            i.removeClass(r.selector, \"friendList\");\n            return false;\n        }\n        \n    ;\n    ;\n    });\n    var p = {\n        keepSynchronized: function(q, r) {\n            ((o[q] || (o[q] = {\n            })));\n            o[q][r.id] = r;\n        },\n        setHasTags: function(q) {\n            h.setHasTags(q);\n        }\n    };\n    g.subscribe(\"CustomPrivacyOption/update\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return;\n        }\n    ;\n    ;\n        n.setSelected(r.selector, n.getOptionValue(r.option));\n        l.swapIcon(r.selector);\n        n.setButtonLabel(r.selector, r.label);\n        n.setButtonTooltip(r.selector, r.tooltip);\n        g.inform(\"AudienceSelector/update\", r);\n    });\n    g.subscribe([\"AudienceSelector/changed\",\"AudienceSelector/update\",], function(JSBNG__event, q) {\n        var r = n.getOptionValue(q.option), s = {\n        };\n        if (((r == m.BaseValue.CUSTOM))) {\n            if (((JSBNG__event == \"AudienceSelector/changed\"))) {\n                return;\n            }\n        ;\n        ;\n            s = j.getData(q.option.id);\n        }\n    ;\n    ;\n        {\n            var fin226keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin226i = (0);\n            var t;\n            for (; (fin226i < fin226keys.length); (fin226i++)) {\n                ((t) = (fin226keys[fin226i]));\n                {\n                    var u = o[t];\n                    if (u[q.selector.id]) {\n                        g.inform(\"AudienceSelector/syncNonSelectorIcon\", {\n                            category: t\n                        });\n                        {\n                            var fin227keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin227i = (0);\n                            var v;\n                            for (; (fin227i < fin227keys.length); (fin227i++)) {\n                                ((v) = (fin227keys[fin227i]));\n                                {\n                                    var w = u[v];\n                                    if (((!w || ((q.selector === w))))) {\n                                        continue;\n                                    }\n                                ;\n                                ;\n                                    if (((n.getValue(w) !== r))) {\n                                        n.setSelected(w, r);\n                                        l.swapIcon(w);\n                                    }\n                                ;\n                                ;\n                                    if (((r == m.BaseValue.CUSTOM))) {\n                                        var x = n.getOption(w, ((m.BaseValue.CUSTOM + \"\")));\n                                        if (x) {\n                                            j.setPrivacyData(x.id, s, r);\n                                            n.setButtonTooltip(w, q.tooltip);\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = p;\n});\n__d(\"ErrorDialog\", [\"Dialog\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\"), h = b(\"emptyFunction\"), i = {\n        showAsyncError: function(j) {\n            try {\n                return i.show(j.getErrorSummary(), j.getErrorDescription());\n            } catch (k) {\n                JSBNG__alert(j);\n            };\n        ;\n        },\n        show: function(j, k, l, m) {\n            return (new g()).setTitle(j).setBody(k).setButtons([g.OK,]).setStackable(true).setModal(true).setHandler(((l || h))).setButtonsMessage(((m || \"\"))).show();\n        }\n    };\n    e.exports = i;\n});\n__d(\"Tour\", [\"Arbiter\",\"LayerDestroyOnHide\",\"LayerHideOnEscape\",\"copyProperties\",\"NavigationMessage\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"LayerDestroyOnHide\"), i = b(\"LayerHideOnEscape\"), j = b(\"copyProperties\"), k = b(\"NavigationMessage\");\n    function l() {\n        if (l._instance) {\n            l._instance.setTourComplete();\n        }\n    ;\n    ;\n        l._instance = this;\n    };\n;\n    j(l.prototype, {\n        tourStarted: false,\n        tourComplete: false,\n        _navigationBeginToken: null,\n        _pageLeaveToken: null,\n        steps: {\n        },\n        JSBNG__openDialog: null,\n        init: function() {\n            this._pageLeaveToken = g.subscribe(\"onload/exit\", this.handleLeavePage.bind(this));\n            this._navigationBeginToken = g.subscribe(k.NAVIGATION_BEGIN, this.handleTransition.bind(this));\n            this.steps = {\n            };\n            return this;\n        },\n        registerStep: function(m, n) {\n            m.disableBehavior(h);\n            m.disableBehavior(i);\n            this.steps[n] = m;\n            m.subscribe(\"show\", function() {\n                m.inform(\"tour-dialog-show\", m);\n            });\n            if (!this.getTourStarted()) {\n                this.setTourStart();\n            }\n        ;\n        ;\n        },\n        _unsubscribeSubscriptions: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._pageLeaveToken.unsubscribe();\n        },\n        handleLeavePage: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTransition: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTourStart: function() {\n        \n        },\n        handleTourStop: function() {\n        \n        },\n        handleTourComplete: function() {\n        \n        },\n        showStep: function(m) {\n            var n = this.steps[m];\n            if (!((this.JSBNG__openDialog == n))) {\n                this.hideOpenDialog();\n            }\n        ;\n        ;\n            if (!n) {\n                return;\n            }\n        ;\n        ;\n            this.JSBNG__openDialog = n;\n            n.show();\n        },\n        hideOpenDialog: function() {\n            if (this.JSBNG__openDialog) {\n                this.JSBNG__openDialog.hide();\n                this.JSBNG__openDialog = null;\n            }\n        ;\n        ;\n        },\n        getTourStarted: function() {\n            return this.tourStarted;\n        },\n        setTourStart: function() {\n            this.tourStarted = true;\n            this.handleTourStart();\n        },\n        setTourStop: function() {\n            this.tourStarted = false;\n            this.hideOpenDialog();\n            this.handleTourStop();\n        },\n        setTourComplete: function() {\n            if (this.tourComplete) {\n                return;\n            }\n        ;\n        ;\n            this.setTourStop();\n            this.tourComplete = true;\n            this.handleTourComplete();\n        },\n        hideStep: function(m) {\n            var n = this.steps[m];\n            ((n && n.hide()));\n        }\n    });\n    j(l, {\n        getInstance: function() {\n            return ((l._instance || (l._instance = new l())));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FutureSideNavItem\", [\"Arbiter\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\");\n    function n(o, p) {\n        this.id = o.id;\n        this.up = p;\n        this.endpoint = o.endpoint;\n        this.type = o.type;\n        this.node = ((o.node || k(o.id)));\n        this.paths = ((o.path ? m(o.path) : []));\n        this.keys = ((o.key ? m(o.key) : []));\n        var q = this._findKeys(this.keys);\n        this.numericKey = ((q.numeric || this.keys[0]));\n        this.textKey = ((q.text || this.keys[0]));\n        this._pathPattern = this._buildRegex(this.paths);\n        this._keyPattern = this._buildRegex(this.keys);\n        this.hideLoading();\n        this.hideSelected();\n    };\n;\n    l(n.prototype, {\n        equals: function(o) {\n            return ((o && ((o.id === this.id))));\n        },\n        getLinkNode: function() {\n            return ((i.scry(this.node, \"a.item\")[0] || i.scry(this.node, \"a.subitem\")[0]));\n        },\n        matchPath: function(o) {\n            return this._matchInput(this._pathPattern, o);\n        },\n        matchKey: function(o) {\n            return this._matchInput(this._keyPattern, o);\n        },\n        _matchInput: function(o, p) {\n            var q = ((o && o.exec(p)));\n            return ((q && q.slice(1)));\n        },\n        getTop: function() {\n            return ((this.isTop() ? this : this.up.getTop()));\n        },\n        isTop: function(o) {\n            return !this.up;\n        },\n        setCount: function(o, p) {\n            return this._updateCount(o, true);\n        },\n        incrementCount: function(o, p) {\n            return this._updateCount(o, false);\n        },\n        _updateCount: function(o, p, q) {\n            var r = i.scry(this.node, \"span.count\")[0], s = ((r && i.scry(r, \"span.countValue\")[0]));\n            if (s) {\n                var t = ((p ? 0 : parseInt(i.getText(s), 10))), u = Math.max(0, ((t + o))), v = ((this.isTop() ? \"hidden\" : \"hiddenSubitem\"));\n                i.setContent(s, u);\n                ((q && h.conditionClass(this.node, v, !u)));\n                h.conditionClass(r, \"hidden_elem\", !u);\n                if (this.isTop()) {\n                    var w = i.scry(this.node, \"div.linkWrap\")[0];\n                    if (w) {\n                        h.conditionClass(w, \"noCount\", !u);\n                        h.conditionClass(w, \"hasCount\", u);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            g.inform(\"NavigationMessage.COUNT_UPDATE_DONE\");\n        },\n        showLoading: function() {\n            h.addClass(this.node, \"loading\");\n        },\n        hideLoading: function() {\n            h.removeClass(this.node, \"loading\");\n        },\n        showSelected: function() {\n            h.addClass(this.node, \"selectedItem\");\n            ((h.hasClass(this.node, \"hider\") && h.addClass(this._getExpanderParent(), \"expandedMode\")));\n        },\n        hideSelected: function() {\n            h.removeClass(this.node, \"selectedItem\");\n        },\n        showChildren: function() {\n            h.addClass(this.node, \"open\");\n        },\n        hideChildren: function() {\n            h.removeClass(this.node, \"open\");\n        },\n        _getExpanderParent: function() {\n            return j.byClass(this.node, \"expandableSideNav\");\n        },\n        _buildRegex: function(o) {\n            if (o.length) {\n                var p = o.map(function(q) {\n                    if (((typeof q === \"string\"))) {\n                        return q.replace(/([^a-z0-9_])/gi, \"\\\\$1\");\n                    }\n                     else if (((q && q.regex))) {\n                        return q.regex;\n                    }\n                    \n                ;\n                ;\n                });\n                return new RegExp(((((\"^(?:\" + p.join(\"|\"))) + \")$\")));\n            }\n        ;\n        ;\n        },\n        _findKeys: function(o) {\n            var p = /^(app|group|fl)_/, q = {\n            };\n            for (var r = 0; ((r < o.length)); r++) {\n                var s = p.test(o[r]);\n                if (((s && !q.numeric))) {\n                    q.numeric = o[r];\n                }\n                 else if (((!s && !q.text))) {\n                    q.text = o[r];\n                }\n                \n            ;\n            ;\n                if (((q.numeric && q.text))) {\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        }\n    });\n    e.exports = n;\n});\n__d(\"FutureSideNavSection\", [\"Bootloader\",\"DOMQuery\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"DOMQuery\"), i = b(\"$\"), j = b(\"copyProperties\");\n    function k(l) {\n        this.id = l.id;\n        this.node = ((this.node || i(l.id)));\n        this.editEndpoint = l.editEndpoint;\n    };\n;\n    j(k.prototype, {\n        equals: function(l) {\n            return ((l && ((l.id === this.id))));\n        },\n        getEditorAsync: function(l) {\n            g.loadModules([\"SortableSideNav\",], function(m) {\n                var n = new m(h.JSBNG__find(this.node, \"ul.uiSideNav\"), this.editEndpoint);\n                l(n);\n            }.bind(this));\n        }\n    });\n    e.exports = k;\n});\n__d(\"FutureSideNav\", [\"Arbiter\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"FutureSideNavItem\",\"FutureSideNavSection\",\"NavigationMessage\",\"PageTransitions\",\"Parent\",\"Run\",\"SelectorDeprecated\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"ChannelConstants\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"JSBNG__Event\"), m = b(\"FutureSideNavItem\"), n = b(\"FutureSideNavSection\"), o = b(\"NavigationMessage\"), p = b(\"PageTransitions\"), q = b(\"Parent\"), r = b(\"Run\"), s = b(\"SelectorDeprecated\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"Vector\"), w = b(\"copyProperties\"), x = b(\"createArrayFrom\");\n    function y() {\n        ((y.instance && y.instance.uninstall()));\n        y.instance = this;\n    };\n;\n    y.instance = null;\n    y.getInstance = function() {\n        return ((y.instance || new y()));\n    };\n    w(y.prototype, {\n        init: function(z, aa, ba) {\n            this.root = z;\n            this.items = {\n            };\n            this.sections = {\n            };\n            this.editor = null;\n            this.editing = false;\n            this.selected = null;\n            this.loading = null;\n            this.keyParam = \"sk\";\n            this.defaultKey = aa;\n            this.uri = t.getRequestURI();\n            this.ajaxPipe = ba;\n            this.ajaxPipeEndpoints = {\n            };\n            this.sidecol = true;\n            this._installed = true;\n            this._handlePageTransitions = true;\n            p.registerHandler(function(ca) {\n                return ((this._handlePageTransitions && this.handlePageTransition(ca)));\n            }.bind(this));\n            this._eventHandlers = [];\n            this._arbiterSubscriptions = [g.subscribe(o.NAVIGATION_COMPLETED, this.navigationComplete.bind(this)),g.subscribe(o.NAVIGATION_FAILED, this.navigationFailed.bind(this)),g.subscribe(o.NAVIGATION_COUNT_UPDATE, this.navigationCountUpdate.bind(this)),g.subscribe(o.NAVIGATION_SELECT, this.navigationSelect.bind(this)),g.subscribe(i.getArbiterType(\"nav_update_counts\"), this.navigationCountUpdateFromPresence.bind(this)),];\n            this._explicitHover = [];\n            this._ensureHover(\"sideNavItem\");\n            this._eventHandlers.push(l.listen(window, \"resize\", this._handleResize.bind(this)));\n            this._checkNarrow();\n            this._selectorSubscriptions = [];\n            ((window.Selector && this._selectorSubscriptions.push(s.subscribe([\"open\",\"close\",], function(ca, da) {\n                var ea = q.byClass(da.selector, \"sideNavItem\");\n                ((ea && j.conditionClass(ea, \"editMenuOpened\", ((ca === \"open\")))));\n            }))));\n            r.onLeave(this.uninstall.bind(this));\n            if (this._pendingSections) {\n                this._pendingSections.forEach(function(ca) {\n                    this.initSection.apply(this, ca);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _handleResize: (function() {\n            var z;\n            return function() {\n                ((z && JSBNG__clearTimeout(z)));\n                z = this._checkNarrow.bind(this).defer(200);\n            };\n        })(),\n        _checkNarrow: function() {\n            j.conditionClass(this.root, \"uiNarrowSideNav\", ((v.getElementPosition(this.root).x < 20)));\n        },\n        _ensureHover: function(z) {\n            if (((u.ie() < 8))) {\n                h.loadModules([\"ExplicitHover\",], function(aa) {\n                    this._explicitHover.push(new aa(this.root, z));\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        uninstall: function() {\n            if (this._installed) {\n                this._installed = false;\n                this._handlePageTransitions = false;\n                this._arbiterSubscriptions.forEach(g.unsubscribe);\n                this._selectorSubscriptions.forEach(function(z) {\n                    s.unsubscribe(z);\n                });\n                this._eventHandlers.forEach(function(z) {\n                    z.remove();\n                });\n                this._explicitHover.forEach(function(z) {\n                    z.uninstall();\n                });\n            }\n        ;\n        ;\n        },\n        initSection: function(z, aa) {\n            if (!this._installed) {\n                this._pendingSections = ((this._pendingSections || []));\n                this._pendingSections.push(arguments);\n                return;\n            }\n        ;\n        ;\n            this._initItems(aa);\n            this._initSection(z);\n        },\n        addItem: function(z, aa) {\n            this._initItem(z, aa);\n        },\n        _initItems: function(z) {\n            var aa = function(ba, ca) {\n                var da = this._initItem(ba, ca);\n                if (ba.children) {\n                    ba.children.forEach(function(ea) {\n                        aa(ea, da);\n                    });\n                }\n            ;\n            ;\n            }.bind(this);\n            x(z).forEach(function(ba) {\n                aa(ba, null);\n            });\n        },\n        _initItem: function(z, aa) {\n            var ba = this.items[z.id] = this._constructItem(z, aa);\n            if (((ba.equals(this.selected) || z.selected))) {\n                this.setSelected(ba);\n            }\n        ;\n        ;\n            var ca = ba.getLinkNode();\n            ((ca && this._eventHandlers.push(l.listen(ca, \"click\", function(JSBNG__event) {\n                return !this.editing;\n            }.bind(this)))));\n            return ba;\n        },\n        _initSection: function(z) {\n            var aa = this.sections[z.id] = this._constructSection(z);\n            this._eventHandlers.push(l.listen(aa.node, \"click\", this.handleSectionClick.bind(this, aa)));\n            k.scry(aa.node, \"div.bookmarksMenuButton\").forEach(j.show);\n            return aa;\n        },\n        _constructItem: function(z, aa) {\n            return new m(z, aa);\n        },\n        _constructSection: function(z) {\n            return new n(z);\n        },\n        handleSectionClick: function(z, JSBNG__event) {\n            var aa = this._getEventTarget(JSBNG__event, \"a\"), ba = this._getItemForNode(aa);\n            if (!aa) {\n                return;\n            }\n             else if (j.hasClass(aa.parentNode, \"uiMenuItem\")) {\n                this._handleMenuClick(z, ba, aa.parentNode, JSBNG__event);\n            }\n             else this._handleLinkClick(z, aa, JSBNG__event);\n            \n        ;\n        ;\n        },\n        _getEventTarget: function(JSBNG__event, z) {\n            var aa = JSBNG__event.getTarget();\n            if (((aa.tagName !== z.toUpperCase()))) {\n                return q.byTag(aa, z);\n            }\n             else return aa\n        ;\n        },\n        _handleMenuClick: function(z, aa, ba, JSBNG__event) {\n            if (j.hasClass(ba, \"rearrange\")) {\n                this.beginEdit(z);\n            }\n        ;\n        ;\n        },\n        _handleLinkClick: function(z, aa, JSBNG__event) {\n            if (j.hasClass(aa, \"navEditDone\")) {\n                ((this.editing ? this.endEdit() : this.beginEdit(z)));\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        getItem: function(z) {\n            if (this._isCurrentPath(z)) {\n                return this._getItemForKey(((this._getKey(z.getQueryData()) || this.defaultKey)));\n            }\n             else return this._getItemForPath(z.getPath())\n        ;\n        },\n        getNodeForKey: function(z) {\n            var aa = this._getItemForKey(z);\n            if (aa) {\n                return aa.node;\n            }\n        ;\n        ;\n        },\n        _isCurrentPath: function(z) {\n            return ((((z.getDomain() === this.uri.getDomain())) && ((z.getPath() === this.uri.getPath()))));\n        },\n        _getKey: function(z) {\n            return z[this.keyParam];\n        },\n        _getItemForNode: function(z) {\n            z = q.byClass(z, \"sideNavItem\");\n            return ((z && this.items[z.id]));\n        },\n        _getItemForKey: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchKey(z);\n            });\n        },\n        _getItemForPath: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchPath(z);\n            });\n        },\n        _findItem: function(z) {\n            {\n                var fin228keys = ((window.top.JSBNG_Replay.forInKeys)((this.items))), fin228i = (0);\n                var aa;\n                for (; (fin228i < fin228keys.length); (fin228i++)) {\n                    ((aa) = (fin228keys[fin228i]));\n                    {\n                        if (z(this.items[aa])) {\n                            return this.items[aa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        removeItem: function(z) {\n            if (((z && this.items[z.id]))) {\n                k.remove(z.node);\n                delete this.items[z.id];\n            }\n        ;\n        ;\n        },\n        removeItemByKey: function(z) {\n            this.removeItem(this._getItemForKey(z));\n        },\n        moveItem: function(z, aa, ba) {\n            var ca = k.JSBNG__find(z.node, \"ul.uiSideNav\");\n            ((ba ? k.prependContent : k.appendContent))(ca, aa.node);\n        },\n        setLoading: function(z) {\n            ((this.loading && this.loading.hideLoading()));\n            this.loading = z;\n            ((this.loading && this.loading.showLoading()));\n        },\n        setSelected: function(z) {\n            this.setLoading(null);\n            if (this.selected) {\n                this.selected.hideSelected();\n                this.selected.getTop().hideChildren();\n            }\n        ;\n        ;\n            this.selected = z;\n            if (this.selected) {\n                this.selected.showSelected();\n                this.selected.getTop().showChildren();\n            }\n        ;\n        ;\n        },\n        handlePageTransition: function(z) {\n            var aa = this.getItem(z), ba = ((((aa && aa.endpoint)) && this._doPageTransition(aa, z)));\n            return ba;\n        },\n        _doPageTransition: function(z, aa) {\n            this.setLoading(z);\n            this._sendPageTransition(z.endpoint, w(this._getTransitionData(z, aa), aa.getQueryData()));\n            return true;\n        },\n        _sendPageTransition: function(z, aa) {\n            aa.endpoint = z;\n            g.inform(o.NAVIGATION_BEGIN, {\n                useAjaxPipe: this._useAjaxPipe(z),\n                params: aa\n            });\n        },\n        _getTransitionData: function(z, aa) {\n            var ba = {\n            };\n            ba.sidecol = this.sidecol;\n            ba.path = aa.getPath();\n            ba[this.keyParam] = z.textKey;\n            ba.key = z.textKey;\n            return ba;\n        },\n        _useAjaxPipe: function(z) {\n            return ((this.ajaxPipe || this.ajaxPipeEndpoints[z]));\n        },\n        navigationComplete: function() {\n            ((this.loading && this.setSelected(this.loading)));\n        },\n        navigationFailed: function() {\n            this.setLoading(null);\n        },\n        navigationSelect: function(z, aa) {\n            var ba = this._getItemForKey(this._getKey(aa));\n            if (aa.asLoading) {\n                this.setLoading(ba);\n            }\n             else this.setSelected(ba);\n        ;\n        ;\n        },\n        navigationCountUpdate: function(z, aa) {\n            var ba = this._getItemForKey(((aa && aa.key)));\n            if (ba) {\n                if (((typeof aa.count !== \"undefined\"))) {\n                    ba.setCount(aa.count, aa.hide);\n                }\n                 else if (((typeof aa.increment !== \"undefined\"))) {\n                    ba.incrementCount(aa.increment, aa.hide);\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        navigationCountUpdateFromPresence: function(z, aa) {\n            aa = aa.obj;\n            if (aa) {\n                if (((!aa.class_name || ((aa.class_name && j.hasClass(this.root, aa.class_name)))))) {\n                    if (aa.items) {\n                        for (var ba = 0; ((ba < aa.items.length)); ba++) {\n                            this.navigationCountUpdate(z, aa.items[ba]);\n                        ;\n                        };\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        beginEdit: function(z) {\n            if (!this.editing) {\n                this.editing = true;\n                j.addClass(this.root, \"editMode\");\n                this._updateTrackingData();\n                this._initEditor(z);\n            }\n        ;\n        ;\n        },\n        endEdit: function() {\n            if (this.editing) {\n                j.removeClass(this.root, \"editMode\");\n                ((this.editor && this.editor.endEdit()));\n                this.editor = null;\n                this.editing = false;\n                this._updateTrackingData();\n            }\n        ;\n        ;\n        },\n        _updateTrackingData: function(z) {\n            var aa = ((this.root.getAttribute(\"data-gt\") || \"{}\"));\n            try {\n                aa = JSON.parse(aa);\n                if (this.editing) {\n                    aa.editing = true;\n                }\n                 else delete aa.editing;\n            ;\n            ;\n                this.root.setAttribute(\"data-gt\", JSON.stringify(aa));\n            } catch (ba) {\n            \n            };\n        ;\n        },\n        _initEditor: function(z) {\n            z.getEditorAsync(function(aa) {\n                if (this.editing) {\n                    this.editor = aa;\n                    this.editor.beginEdit();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = y;\n});\n__d(\"PageFanning\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DOM\",\"FutureSideNav\",\"Parent\",\"URI\",\"$\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"FutureSideNav\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"$\"), o = b(\"collectDataAttributes\"), p = b(\"copyProperties\"), q = {\n        setFanStatus: function(s, t, u, v, w, x, y) {\n            var z = {\n                ft: {\n                }\n            };\n            if (s) {\n                z = {\n                    ft: o(s, [\"ft\",]).ft\n                };\n            }\n        ;\n        ;\n            w = ((w || function(ca) {\n                var da = ca.getPayload();\n                if (((!da || !s))) {\n                    return;\n                }\n            ;\n            ;\n                if (da.reload) {\n                    q.reloadOnFanStatusChanged(da.preserve_tab);\n                }\n                 else r(s, da);\n            ;\n            ;\n            }));\n            var aa = {\n                fbpage_id: t,\n                add: u,\n                reload: v\n            };\n            if (((y != null))) {\n                p(aa, y);\n            }\n        ;\n        ;\n            p(aa, z);\n            var ba = new h().setURI(\"/ajax/pages/fan_status.php\").setData(aa).setNectarModuleDataSafe(s).setHandler(w);\n            if (x) {\n                ba.setErrorHandler(x);\n            }\n        ;\n        ;\n            ba.send();\n            return false;\n        },\n        reloadOnFanStatusChanged: function(s) {\n            var t = m.getRequestURI();\n            if (s) {\n                var u = k.getInstance().selected.textKey;\n                if (((!t.getQueryData().sk && u))) {\n                    t.addQueryData({\n                        sk: u\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            window.JSBNG__location.href = t;\n        },\n        toggleLikeOnFanStatusChanged: function(s, t) {\n            var u = n(((\"liked_pages_like_action_\" + s))), v = n(((\"liked_pages_undo_action_\" + s)));\n            i.conditionClass(u, \"hidden_elem\", t);\n            i.conditionClass(v, \"hidden_elem\", !t);\n        },\n        informPageLikeButtonOnChange: function(s, t) {\n            var u = a.PageLikeButton;\n            if (u) {\n                if (t) {\n                    u.informLike(s);\n                    u.informLikeSuccess(s);\n                }\n                 else u.informUnlike(s);\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    function r(s, t) {\n        var u = t.feedback;\n        if (!u) {\n            return;\n        }\n    ;\n    ;\n        if (l.byClass(s, \"fbTimelineEscapeSectionItem\")) {\n            s = ((l.byClass(s, \"fan_status_inactive\") || s));\n        }\n    ;\n    ;\n        var v = j.create(\"span\", {\n            className: \"fan_status_inactive\"\n        }, u);\n        s.parentNode.replaceChild(v, s);\n        var w = function() {\n            if (t.can_repeat_action) {\n                v.parentNode.replaceChild(s, v);\n            }\n        ;\n        ;\n        };\n        new g(v).duration(3000).checkpoint().to(\"backgroundColor\", \"#FFFFFF\").duration(1000).ondone(w).go();\n    };\n;\n    e.exports = q;\n});\n__d(\"PageLikeButton\", [\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"JSBNG__Event\",\"PageFanning\",\"SubscribeButton\",\"Tour\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"JSBNG__Event\"), k = b(\"PageFanning\"), l = b(\"SubscribeButton\"), m = b(\"Tour\"), n = b(\"URI\"), o = {\n        LIKED: \"liked\",\n        UNLIKED: \"unliked\",\n        LIKED_SUCCESS: \"liked_success\",\n        init: function(r, s, t, u, v, w, x, y, z, aa, ba) {\n            g.subscribe(o.LIKED, function(ca, da) {\n                if (((u === da.profile_id))) {\n                    if (!z) {\n                        t.suppressNextMouseEnter();\n                    }\n                ;\n                ;\n                    r.swap(ba);\n                    if (((aa === true))) {\n                        new h().setURI(\"/ajax/pages/suggestions_on_liking.php\").setData({\n                            pageid: u\n                        }).send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            g.subscribe(o.UNLIKED, function(ca, da) {\n                if (((u === da.profile_id))) {\n                    r.unswap(ba);\n                    t.hideFlyout();\n                }\n            ;\n            ;\n            });\n            if (y) {\n                g.subscribe(o.LIKED_SUCCESS, function(ca, da) {\n                    var ea = n.getRequestURI().getQueryData().app_data;\n                    if (((da.profile_id == u))) {\n                        new h().setURI(\"/ajax/pages/fetch_app_column.php\").setData({\n                            profile_id: u,\n                            tab_key: y,\n                            app_data: ea\n                        }).send();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            j.listen(s, \"click\", q.bind(null, u, v, w, x));\n        },\n        initCallout: function(r, s) {\n            var t = JSBNG__document.getElementById(\"pageActionLikeCalloutButton\");\n            j.listen(t, \"click\", q.bind(null, r, s, null, null));\n        },\n        initUnlike: function(r, s, t) {\n            j.listen(r, \"click\", function(JSBNG__event) {\n                p(JSBNG__event.getTarget(), s, false, function(u) {\n                    g.inform(o.LIKED, {\n                        profile_id: s\n                    });\n                    i.defaultErrorHandler(u);\n                }, t);\n                o.informUnlike(s);\n            });\n        },\n        informLike: function(r, s, t) {\n            var u = {\n                profile_id: r,\n                target: s,\n                origin: t\n            };\n            g.inform(o.LIKED, u);\n            g.inform(l.SUBSCRIBED, u);\n        },\n        informLikeSuccess: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform(o.LIKED_SUCCESS, s);\n        },\n        informUnlike: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform.bind(g, o.UNLIKED, s).defer();\n            g.inform.bind(g, l.UNSUBSCRIBED, s).defer();\n        }\n    };\n    function p(r, s, t, u, v, w, x) {\n        m.getInstance().hideStep(\"low_page_likes\");\n        k.setFanStatus(r, s, t, false, function() {\n            o.informLikeSuccess(s);\n        }, u, {\n            fan_origin: v,\n            fan_source: w,\n            cat: x\n        });\n    };\n;\n    function q(r, s, t, u, JSBNG__event) {\n        p(JSBNG__event.getTarget(), r, true, function(v) {\n            g.inform(o.UNLIKED, {\n                profile_id: r\n            });\n            i.defaultErrorHandler(v);\n        }, s, t, u);\n        o.informLike(r, JSBNG__event.getTarget(), s);\n    };\n;\n    e.exports = o;\n    a.PageLikeButton = o;\n});\n__d(\"legacy:PageLikeButton\", [\"PageLikeButton\",], function(a, b, c, d) {\n    a.PageLikeButton = b(\"PageLikeButton\");\n}, 3);\n__d(\"legacy:AudienceSelector\", [\"AudienceSelector\",], function(a, b, c, d) {\n    b(\"AudienceSelector\");\n}, 3);\n__d(\"FriendListPrivacyOptions\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"DOMQuery\",\"PageTransitions\",\"Parent\",\"SelectorDeprecated\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"Parent\"), n = b(\"SelectorDeprecated\"), o = b(\"$\"), p = b(\"ge\"), q = false, r = false, s = null, t = {\n    }, u = function(w) {\n        if (!Object.keys(t).length) {\n            l.registerHandler(function() {\n                t = {\n                };\n                q = false;\n                r = false;\n            });\n        }\n    ;\n    ;\n        var x = w.getAttribute(\"data-name\");\n        t[x] = w;\n        n.listen(w, \"select\", function(y) {\n            var z = y.option, aa = k.JSBNG__find(z, \"a.itemAnchor\"), ba = aa.getAttribute(\"data-flid\");\n            if (!ba) {\n                return;\n            }\n        ;\n        ;\n            var ca = aa.getAttribute(\"data-dynamic\");\n            if (((ca && q))) {\n                v.showSmartListNux(z, ba);\n            }\n             else if (((!ca && r))) {\n                v.showDumbListNux([ba,]);\n            }\n            \n        ;\n        ;\n        });\n    }, v = {\n        listen: function(w, x, y) {\n            var z = p(w);\n            if (!z) {\n                return;\n            }\n        ;\n        ;\n            var aa = m.byClass(z, \"audienceSelector\");\n            if (aa) {\n                u(aa);\n                q = x;\n                r = y;\n            }\n        ;\n        ;\n        },\n        showSmartListNux: function(w, x) {\n            w = o(w);\n            new i(\"/ajax/friends/lists/smart_list_publish_nux.php\").setData({\n                option_id: w.id,\n                flid: x\n            }).send();\n            q = false;\n        },\n        setContextualDialog: function(w, x) {\n            x = o(x);\n            var y = m.byClass(x, \"audienceSelector\");\n            if (y) {\n                w.setContext(y);\n                w.show();\n                var z = g.subscribe(\"composer/publish\", function() {\n                    w.hide();\n                });\n                w.subscribe(\"hide\", function() {\n                    z.unsubscribe();\n                });\n            }\n        ;\n        ;\n        },\n        showDumbListNux: function(w) {\n            h.send(new i(\"/ajax/friends/lists/dumb_list_publish_nux.php\").setData({\n                flids: w\n            }));\n            r = false;\n        },\n        showBothListsNux: function(w, x) {\n            s = o(w);\n            v.showDumbListNux(x);\n        },\n        setDialogX: function(w) {\n            if (!s) {\n                return;\n            }\n        ;\n        ;\n            w.subscribe(\"hide\", function() {\n                v.showSmartListNux(s);\n                s = null;\n            });\n        },\n        setDialog: function() {\n            if (!s) {\n                return;\n            }\n        ;\n        ;\n            var w = j.getCurrent();\n            if (w) {\n                w.setCloseHandler(function() {\n                    v.showSmartListNux(s);\n                    s = null;\n                });\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = v;\n});\n__d(\"FriendsMinusAcquaintancesPrivacyOption\", [\"AudienceSelectorTags\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"PrivacyConst\",\"copyProperties\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AudienceSelectorTags\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"DOM\"), k = b(\"PrivacyConst\"), l = k.FriendsValue, m = b(\"copyProperties\"), n = b(\"fbt\"), o = b(\"tx\");\n    function p(q, r) {\n        this._hasRestricted = r;\n        this.parent.construct(this, q);\n    };\n;\n    i.extend(p, h);\n    m(p.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: l.FRIENDS_MINUS_ACQUAINTANCES\n            };\n        },\n        _recalculateTooltipAndLabel: function() {\n            var q = this._hasEvent, r = this._tags.length, s = this._tooltip, t = this._label;\n            if (q) {\n                if (((((r > 1)) || this._alreadyHasTags()))) {\n                    this._tooltip = ((this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances, Restricted\" : \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances\"));\n                }\n                 else if (((r == 1))) {\n                    this._tooltip = ((this._hasRestricted ? o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances, Restricted\", {\n                        user: this._tags[0]\n                    }) : o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances\", {\n                        user: this._tags[0]\n                    })));\n                }\n                 else this._tooltip = ((this._hasRestricted ? \"Your friends and event guests; Except: Acquaintances, Restricted\" : \"Your friends and event guests; Except: Acquaintances\"));\n                \n            ;\n            ;\n            }\n             else if (((((r > 0)) || this._alreadyHasTags()))) {\n                var u = \"friends of anyone tagged\", v = n._(\"{people who can see this}, {list of more people who can see this}\", [n.param(\"people who can see this\", \"Your friends\"),n.param(\"list of more people who can see this\", u),]), w = \"Acquaintances\";\n                if (this._hasRestricted) {\n                    w = n._(\"{Name of Acquaintances friend list}, {restricted}\", [n.param(\"Name of Acquaintances friend list\", w),n.param(\"restricted\", \"Restricted\"),]);\n                }\n            ;\n            ;\n                this._tooltip = this._getCombinedSentence(v, w);\n            }\n             else {\n                this._tooltip = \"Friends except Acquaintances\";\n                if (this._hasRestricted) {\n                    this._tooltip = \"Friends; Except: Acquaintances, Restricted\";\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            this._recalcLabel();\n            return ((((s != this._tooltip)) || ((t != this._label))));\n        },\n        _alreadyHasTags: function() {\n            var q = j.scry(this._selector, \"*[data-oid]\")[0];\n            q = ((q && q.getAttribute(\"data-oid\")));\n            return ((q && g.hasTags(q)));\n        },\n        _getTagExpansionBehavior: function() {\n            return k.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = p;\n});\n__d(\"FriendsPrivacyOption\", [\"Arbiter\",\"BasePrivacyOption\",\"Class\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"SelectorDeprecated\"), l = b(\"copyProperties\"), m = b(\"tx\");\n    function n(o, p) {\n        this._hasRestricted = p;\n        this.parent.construct(this, o);\n    };\n;\n    i.extend(n, h);\n    l(n.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.ALL_FRIENDS\n            };\n        },\n        _eventTagChanged: function() {\n            var o = this._getChangedData();\n            o.privacy = k.getValue(this._selector);\n            g.inform(\"EventTagged/changed\", o);\n        },\n        _recalculateTooltipAndLabel: function() {\n            var o = this._hasEvent, p = this._tags.length, q = this._tooltip, r = this._label;\n            if (((p > 2))) {\n                if (o) {\n                    this._tooltip = ((this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Restricted\" : \"Your friends, friends of anyone tagged and event guests\"));\n                }\n                 else this._tooltip = ((this._hasRestricted ? \"Your friends and friends of anyone tagged; Except: Restricted\" : \"Your friends and friends of anyone tagged\"));\n            ;\n            ;\n            }\n             else if (((p == 2))) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = \"Your friends, friends of anyone tagged and event guests; Except: Restricted\";\n                    }\n                     else this._tooltip = \"Your friends, friends of anyone tagged and event guests\";\n                ;\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends; Except: Restricted \", {\n                        user: this._tags[0],\n                        user2: this._tags[1]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends\", {\n                    user: this._tags[0],\n                    user2: this._tags[1]\n                });\n                \n            ;\n            ;\n            }\n             else if (((p == 1))) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = m._(\"Your friends, {user}'s friends and event guests; Except: Restricted\", {\n                            user: this._tags[0]\n                        });\n                    }\n                     else this._tooltip = m._(\"Your friends, {user}'s friends and event guests\", {\n                        user: this._tags[0]\n                    });\n                ;\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends and {user}'s friends; Except: Restricted\", {\n                        user: this._tags[0]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends and {user}'s friends\", {\n                    user: this._tags[0]\n                });\n                \n            ;\n            ;\n            }\n             else if (o) {\n                this._tooltip = ((this._hasRestricted ? \"Your friends and event guests; Except: Restricted\" : \"Your friends and event guests\"));\n            }\n             else this._tooltip = ((this._hasRestricted ? \"Your friends; Except: Restricted\" : \"Your friends\"));\n            \n            \n            \n        ;\n        ;\n            this._recalcLabel();\n            return ((((q != this._tooltip)) || ((r != this._label))));\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = n;\n});\n__d(\"MetaComposerEdDialog\", [\"Animation\",\"Arbiter\",\"ARIA\",\"AsyncRequest\",\"copyProperties\",\"CSS\",\"DOM\",\"Ease\",\"ge\",\"Parent\",\"SelectorDeprecated\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"AsyncRequest\"), k = b(\"copyProperties\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"Ease\"), o = b(\"ge\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Vector\"), s = null;\n    function t(u) {\n        this._dialog = u.dialog;\n        this.config = u;\n        this._init();\n    };\n;\n    t.init = function(u) {\n        if (s) {\n            s.config.show_audience = u.show_audience;\n            u.dialog.destroy();\n            return;\n        }\n    ;\n    ;\n        s = new t(u);\n    };\n    k(t.prototype, {\n        _init: function() {\n            h.subscribe(\"ComposerXStatusAttachment/ready\", function() {\n                if (this.config.show_audience) {\n                    this._sendEducationRequest({\n                    }, \"/ajax/composer/audience/education\", this._handlerCustomDuration.bind(this, 6000));\n                    this.config.show_audience = false;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (this.config.show_sticky) {\n                h.subscribe(\"composer/mutate\", function(u, v) {\n                    this._sendEducationRequest({\n                        sticky_num: this.config.n_sticky_shown\n                    }, \"/ajax/composer/audience/sticky_education\");\n                }.bind(this));\n            }\n        ;\n        ;\n            if (this.config.show_event_tags) {\n                if (((this.config.n_event_tag_shown === 0))) {\n                    h.subscribe(\"EventTagged/changed\", function(u, v) {\n                        this._sendEducationRequest({\n                            selector: \"div.fbComposerAudienceTourContext\",\n                            privacy: v.privacy,\n                            event_tag_num: this.config.n_event_tag_shown\n                        }, \"/ajax/events/tagging/user_education\");\n                    }.bind(this));\n                    h.subscribe([\"composer/publish\",\"composer/reset\",], function() {\n                        var u = o(\"event_tagging_tag_expansion_NUX\");\n                        ((u && l.hide(u)));\n                    }.bind(this));\n                }\n                 else h.subscribe(\"EventTagged/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"AtTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            ;\n            }\n        ;\n        ;\n            if (this.config.show_tags) {\n                h.subscribe(\"SelectedPrivacyOption/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"WithTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"/ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            }\n        ;\n        ;\n            q.subscribe(\"open\", this._killAnim.bind(this));\n        },\n        _sendEducationRequest: function(u, v, w) {\n            if (!this._updateDialogContext()) {\n                return;\n            }\n        ;\n        ;\n            ((this._async && this._async.abort()));\n            this._async = new j(v);\n            this._async.setData(u).setHandler(w).send();\n        },\n        _updateDialogContext: function() {\n            var u = m.scry(JSBNG__document.body, \"div.composerAudienceWrapper\"), v, w;\n            for (var x = 0; ((x < u.length)); x++) {\n                v = u[x];\n                w = r.getElementPosition(v);\n                if (((((v && ((w.x > 0)))) && ((w.y > 0))))) {\n                    this._dialog.setContext(v);\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        },\n        _handler: function(u) {\n            this._handlerCustomDuration(1500, u);\n        },\n        _handlerCustomDuration: function(u, v) {\n            var w = v.payload;\n            if (((!w || !this._updateDialogContext()))) {\n                return;\n            }\n        ;\n        ;\n            var x = this._dialog.getContent().firstChild;\n            m.setContent(x, w);\n            i.announce(m.getText(x));\n            this._dialog.show();\n            var y = p.byClass(x, \"metaComposerUserEd\");\n            if (this._anim) {\n                this._anim.JSBNG__stop();\n                this._anim = new g(y);\n            }\n             else this._anim = new g(y).from(\"opacity\", 0);\n        ;\n        ;\n            this._anim.to(\"opacity\", 1).ease(n.sineOut).checkpoint().duration(u).checkpoint().to(\"opacity\", 0).ease(n.sineOut).checkpoint().ondone(this._killAnim.bind(this)).go();\n        },\n        _killAnim: function(u, v) {\n            if (this._anim) {\n                this._dialog.hide();\n                this._anim.JSBNG__stop();\n                this._anim = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"OnlyMePrivacyOption\", [\"BasePrivacyOption\",\"copyProperties\",\"Class\",\"PrivacyConst\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BasePrivacyOption\"), h = b(\"copyProperties\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"tx\");\n    function l(m) {\n        this.parent.construct(this, m);\n    };\n;\n    i.extend(l, g);\n    h(l.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.SELF\n            };\n        },\n        _getIncludedAudience: function() {\n            return \"Only you\";\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.TAGGEES;\n        }\n    });\n    e.exports = l;\n});\n__d(\"legacy:UIPagelet\", [\"UIPagelet\",], function(a, b, c, d) {\n    a.UIPagelet = b(\"UIPagelet\");\n}, 3);\n__d(\"HoverButton\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        this._button = n;\n        this._flyout = o;\n        this._flyoutAjaxify = q;\n        this._flyoutContent = p;\n        o.subscribe(\"show\", this._onShow.bind(this));\n        o.subscribe(\"hide\", this._onHide.bind(this));\n    };\n;\n    k(m.prototype, {\n        _button: null,\n        _flyout: null,\n        _flyoutAjaxify: null,\n        _flyoutContent: null,\n        showFlyoutBriefly: function() {\n            this.showFlyout();\n            this._flyout.hideFlyoutDelayed(5000);\n        },\n        showFlyout: function() {\n            this._flyout.showFlyout(this._button, true);\n            this._flyout.inform(\"show\", this._button);\n        },\n        hideFlyout: function() {\n            this._flyout.hideFlyout(true);\n            this._flyout.inform(\"hide\", this._button);\n        },\n        enableButton: function() {\n            this._flyout.initNode(this._button);\n        },\n        disableButton: function() {\n            this.hideFlyout();\n            this._flyout.deactivateNode(this._button);\n        },\n        _onShow: function(n, o) {\n            h.addClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if (((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\")))) {\n                h.addClass(o, \"selected\");\n            }\n        ;\n        ;\n            if (this._flyoutAjaxify) {\n                h.addClass(this._flyoutContent, \"async_saving\");\n                new g().setURI(new j(this._flyoutAjaxify)).setHandler(function(p) {\n                    h.removeClass(this._flyoutContent, \"async_saving\");\n                    i.setContent(this._flyoutContent, p.payload);\n                }.bind(this)).send();\n                this._flyoutAjaxify = null;\n            }\n        ;\n        ;\n        },\n        _onHide: function(n, o) {\n            h.removeClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if (((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\")))) {\n                h.removeClass(o, \"selected\");\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.hideFlyout();\n            this._flyout.destroy();\n        },\n        suppressNextMouseEnter: function() {\n            this._flyout.setActiveNode(this._button);\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:DynamicIconSelector\", [\"DynamicIconSelector\",], function(a, b, c, d) {\n    a.DynamicIconSelector = b(\"DynamicIconSelector\");\n}, 3);\n__d(\"MentionsInputMatchers\", [], function(a, b, c, d, e, f) {\n    var g = [\"@\",\"\\\\uff20\",\"+\",\"\\\\uff0b\",].join(\"\"), h = \".,*?$|#{}()\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%&'\\\"~=\\u003C\\u003E_:;\", i = ((((\"\\\\b[A-Z][^ A-Z\" + h)) + \"]\")), j = ((((((((((((((\"([^\" + g)) + h)) + \"]|[\")) + h)) + \"][^ \")) + h)) + \"])\")), k = ((((((((\"(?:^|\\\\s)(?:[\" + g)) + \"](\")) + j)) + \"{0,20}))\")), l = ((((((((\"(?:(?:^|[^#])(\" + i)) + \"+)|\")) + k)) + \")\")), m = ((((\"(?:\" + i)) + \"{4,})\")), n = \"#\\\\uFF03\", o = {\n        trigger: new RegExp(((((\"[\" + g)) + \"]$\"))),\n        hashtagTrigger: new RegExp(((((\"[\" + n)) + \"]\"))),\n        mainMatcher: new RegExp(((k + \"$\"))),\n        autoMatcher: new RegExp(((l + \"$\"))),\n        userMatcher: new RegExp(((m + \"$\")))\n    };\n    e.exports = o;\n});\n__d(\"MentionsInput\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"Bootloader\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"HTML\",\"Input\",\"InputSelection\",\"Keys\",\"MentionsInputMatchers\",\"Parent\",\"Style\",\"TypeaheadUtil\",\"UserAgent\",\"copyProperties\",\"htmlize\",\"removeFromArray\",\"repeatString\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"HTML\"), o = b(\"Input\"), p = b(\"InputSelection\"), q = b(\"Keys\"), r = b(\"MentionsInputMatchers\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"TypeaheadUtil\"), v = b(\"UserAgent\"), w = b(\"copyProperties\"), x = b(\"htmlize\"), y = b(\"removeFromArray\"), z = b(\"repeatString\"), aa = \"\\ufeff\", ba = new RegExp(aa, \"g\"), ca = function(ja) {\n        return ((ja + aa));\n    }, da = \"\\ufffd\", ea = /@+\\[[0-9]+\\:([^\\]]|\\\\\\])*\\]+/g, fa = /[\\\\\\]:]/g;\n    function ga(ja, ka) {\n        return ja.replace(ka, z(\" \", ka.length));\n    };\n;\n    function ha(ja, ka) {\n        return ((ja.substring(0, ka) + ja.substring(((ka + 1)))));\n    };\n;\n    function ia(ja, ka, la, ma, na, oa) {\n        k.set(ja, \"MentionsInput\", this);\n        this._root = ja;\n        this._typeahead = ka;\n        this._input = la;\n        var pa = null, qa = this.init.bind(this, ma, na, oa);\n        try {\n            pa = ((JSBNG__document.activeElement === this._input));\n        } catch (ra) {\n        \n        };\n    ;\n        if (pa) {\n            qa.defer();\n        }\n         else var sa = m.listen(this._input, \"JSBNG__focus\", function() {\n            qa.defer();\n            sa.remove();\n        })\n    ;\n        this._hasHashtags = ma.hashtags;\n        this._hashtags = [];\n    };\n;\n    ia.getInstance = function(ja) {\n        var ka = s.byClass(ja, \"uiMentionsInput\");\n        return ((ka ? k.get(ka, \"MentionsInput\") : null));\n    };\n    w(ia.prototype, h, {\n        init: function(ja, ka, la) {\n            if (this._initialized) {\n                return;\n            }\n        ;\n        ;\n            this._initialized = true;\n            this._highlighter = l.JSBNG__find(this._root, \".highlighter\");\n            this._highlighterInner = this._highlighter.firstChild;\n            this._highlighterContent = l.JSBNG__find(this._root, \".highlighterContent\");\n            this._hiddenInput = l.JSBNG__find(this._root, \".mentionsHidden\");\n            this._placeholder = ((this._input.getAttribute(\"placeholder\") || \"\"));\n            this._maxMentions = ((ja.max || 6));\n            this._metrics = la;\n            if (!this._hiddenInput.JSBNG__name) {\n                var ma = this._input.JSBNG__name;\n                this._input.JSBNG__name = ((ma + \"_text\"));\n                this._hiddenInput.JSBNG__name = ma;\n            }\n        ;\n        ;\n            this._initEvents();\n            this._initTypeahead();\n            this.reset(ka);\n            this.inform(\"init\", null, g.BEHAVIOR_STATE);\n        },\n        reset: function(ja) {\n            if (!this._initialized) {\n                return;\n            }\n        ;\n        ;\n            this._mentioned = {\n            };\n            this._orderedUIDs = [];\n            this._numMentioned = 0;\n            this._filterData = null;\n            ((this._hiddenInput && (this._hiddenInput.value = \"\")));\n            ((this._highlighterContent && l.empty(this._highlighterContent)));\n            ((this._highlighterAuxContent && l.remove(this._highlighterAuxContent)));\n            this._highlighterAuxContent = null;\n            o.setPlaceholder(this._input, this._placeholder);\n            t.set(this._typeahead.getElement(), \"height\", \"auto\");\n            var ka = ((((ja && ja.value)) || \"\")), la = ((ja && ja.mentions));\n            if (((la && la.length))) {\n                var ma = [];\n                la.forEach(function(na) {\n                    ma.push(((na.offset + na.length)));\n                    delete na.offset;\n                    delete na.length;\n                    this._addToken(na);\n                }, this);\n                ma.reverse().forEach(function(na) {\n                    ka = ((((ka.substring(0, na) + aa)) + ka.substring(na)));\n                });\n            }\n        ;\n        ;\n            o.setValue(this._input, ka);\n            this._updateTypeahead();\n            this._updateWidth();\n            this._update();\n        },\n        getValue: function() {\n            return this._getMarkedValue().replace(ba, \"\");\n        },\n        _getMarkedValue: function() {\n            return o.getValue(this._input);\n        },\n        getRawValue: function() {\n            this._update();\n            return o.getValue(this._hiddenInput);\n        },\n        checkValue: function() {\n            var ja = this._typeahead.getCore().getValue();\n            if (((r.trigger.exec(ja) || ((ja === \"\"))))) {\n                this.inform(\"sessionEnd\", {\n                });\n            }\n        ;\n        ;\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _initEvents: function() {\n            var ja = this._update.bind(this);\n            m.listen(this._input, {\n                input: ja,\n                keyup: ja,\n                change: ja,\n                JSBNG__blur: this._handleBlur.bind(this),\n                JSBNG__focus: this._handleFocus.bind(this),\n                keydown: this._handleKeydown.bind(this)\n            });\n            if (this._metrics) {\n                this._metrics._reset();\n                this._metrics.bindSessionStart(this._typeahead, \"render\", true);\n                this._metrics.bindSessionEnd(this._typeahead.getView(), \"select\", true);\n                this._metrics.bindSessionEnd(this, \"sessionEnd\", false);\n                m.listen(this._input, \"keyup\", function(JSBNG__event) {\n                    this.checkValue.bind(this).defer();\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _initTypeahead: function() {\n            this._typeahead.subscribe(\"select\", function(oa, pa) {\n                var qa = pa.selected;\n                this._addToken({\n                    uid: qa.uid,\n                    text: qa.text,\n                    type: qa.type,\n                    weakreference: qa.weak_reference\n                });\n                this.updateValue();\n            }.bind(this));\n            var ja = this._input, ka = null;\n            function la() {\n                if (((ka === null))) {\n                    ka = o.getSubmitOnEnter(ja);\n                    o.setSubmitOnEnter(ja, false);\n                }\n            ;\n            ;\n            };\n        ;\n            function ma() {\n                if (((ka !== null))) {\n                    o.setSubmitOnEnter(ja, ka);\n                    ka = null;\n                }\n            ;\n            ;\n            };\n        ;\n            this._typeahead.subscribe(\"reset\", ma);\n            this._typeahead.subscribe(\"render\", la);\n            this._typeahead.subscribe(\"highlight\", function(oa, pa) {\n                ((((pa.index >= 0)) ? la() : ma()));\n            });\n            this._typeahead.subscribe(\"query\", function() {\n                this._filterData = null;\n            }.bind(this));\n            var na = this._typeahead.getCore();\n            na.suffix = aa;\n            this._handleFocus();\n        },\n        _handleBlur: function() {\n            if (this._filterToken) {\n                this._filterToken.remove();\n                this._filterToken = null;\n            }\n        ;\n        ;\n        },\n        _handleFocus: function() {\n            if (!this._filterToken) {\n                this._filterToken = this._typeahead.getData().addFilter(this._filterResults.bind(this));\n            }\n        ;\n        ;\n            this._updateWidth();\n        },\n        _handleKeydown: function(JSBNG__event) {\n            var ja = JSBNG__event.keyCode;\n            if (((((ja == q.BACKSPACE)) || ((ja == q.DELETE))))) {\n                this._handleBackspaceAndDelete(JSBNG__event, ja);\n            }\n        ;\n        ;\n            if (((((ja == q.LEFT)) || ((ja == q.RIGHT))))) {\n                JSBNG__setTimeout(this._handleLeftAndRight.bind(this, ja), 10);\n            }\n        ;\n        ;\n        },\n        _handleLeftAndRight: function(ja) {\n            var ka = this._getMarkedValue(), la = p.get(this._input), ma = la.start, na = la.end, oa = ((ja == q.LEFT)), pa = ((ja == q.RIGHT));\n            if (((ma == na))) {\n                var qa = ((oa ? -1 : 1));\n                if (((ka.charAt(ma) == aa))) {\n                    p.set(this._input, ((ma + qa)));\n                }\n            ;\n            ;\n            }\n             else if (((oa && ((ka.charAt(ma) == aa))))) {\n                p.set(this._input, ((ma - 1)), na);\n            }\n             else if (((oa && ((ka.charAt(na) == aa))))) {\n                p.set(this._input, ma, ((na - 1)));\n            }\n             else if (((pa && ((ka.charAt(na) == aa))))) {\n                p.set(this._input, ma, ((na + 1)));\n            }\n             else if (((pa && ((ka.charAt(ma) == aa))))) {\n                p.set(this._input, ((ma + 1)), na);\n            }\n            \n            \n            \n            \n        ;\n        ;\n        },\n        _handleBackspaceAndDelete: function(JSBNG__event, ja) {\n            var ka = p.get(this._input), la = false;\n            if (((ka.start !== ka.end))) {\n                if (((this._offsetIsInsideMention(((ka.start + 1))) && this._offsetIsInsideMention(ka.end)))) {\n                    la = ((ja === q.BACKSPACE));\n                }\n                 else return\n            ;\n            }\n        ;\n        ;\n            var ma = ((((ja === q.DELETE)) ? 1 : -1)), na = ((ma + ((la ? ka.end : ka.start)))), oa = this._getMarkedValue(), pa = oa;\n            for (var qa = 0; ((qa < this._orderedUIDs.length)); ++qa) {\n                var ra = this._mentioned[this._orderedUIDs[qa]], sa = ra.text, ta = ca(sa), ua = pa.indexOf(ta), va = ((ua + ta.length));\n                if (((((na < ua)) || ((na >= va))))) {\n                    pa = ga(pa, ta);\n                    continue;\n                }\n            ;\n            ;\n                var wa, xa;\n                if (((ra.type != \"user\"))) {\n                    wa = 0;\n                    xa = [sa,];\n                }\n                 else {\n                    wa = ((ta.substring(0, ((na - ua))).split(\" \").length - 1));\n                    xa = sa.split(\" \");\n                }\n            ;\n            ;\n                var ya = xa.splice(wa, 1)[0], za = xa.join(\" \"), ab = ((((wa === 0)) ? ua : ((((va - ya.length)) - 1))));\n                if (za) {\n                    ra.text = za;\n                    za = ca(za);\n                }\n                 else this._removeToken(ra.uid);\n            ;\n            ;\n                var bb = ((((oa.substring(0, ua) + za)) + oa.substring(va)));\n                o.setValue(this._input, bb);\n                p.set(this._input, ab);\n                this._update();\n                JSBNG__event.kill();\n                break;\n            };\n        ;\n        },\n        _offsetIsInsideMention: function(ja) {\n            for (var ka = 0; ((ka < this._offsets.length)); ka++) {\n                if (((((ja > this._offsets[ka][0])) && ((ja <= this._offsets[ka][1]))))) {\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        },\n        _filterResults: function(ja) {\n            if (((this._filterData === null))) {\n                var ka = p.get(this._input).start;\n                if (this._offsetIsInsideMention(ka)) {\n                    this._filterData = {\n                        caretIsInsideMention: true\n                    };\n                    return false;\n                }\n            ;\n            ;\n                var la = this._typeahead.getCore();\n                this._filterData = {\n                    value: la.getValue(),\n                    rawValue: la.getRawValue()\n                };\n            }\n        ;\n        ;\n            if (this._filterData.caretIsInsideMention) {\n                return false;\n            }\n        ;\n        ;\n            if (r.mainMatcher.test(this._filterData.rawValue)) {\n                return true;\n            }\n        ;\n        ;\n            if (((ja.type != \"user\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (ja.disable_autosuggest) {\n                return false;\n            }\n        ;\n        ;\n            if (r.userMatcher.test(this._filterData.value)) {\n                return true;\n            }\n        ;\n        ;\n            return u.isExactMatch(this._filterData.value, this._typeahead.getData().getTextToIndex(ja));\n        },\n        _addToken: function(ja) {\n            var ka = ja.uid;\n            if (!this._mentioned.hasOwnProperty(ka)) {\n                this._mentioned[ka] = ja;\n                this._orderedUIDs.push(ka);\n                this._numMentioned++;\n                this._updateTypeahead();\n            }\n        ;\n        ;\n        },\n        _removeToken: function(ja) {\n            if (this._mentioned.hasOwnProperty(ja)) {\n                delete this._mentioned[ja];\n                y(this._orderedUIDs, ja);\n                this._numMentioned--;\n                this._updateTypeahead();\n            }\n        ;\n        ;\n        },\n        _update: function() {\n            var ja = this._getMarkedValue();\n            if (((ja == this._value))) {\n                return;\n            }\n        ;\n        ;\n            this._value = ja;\n            this._updateMentions();\n            this._updateDirection.bind(this).defer();\n            this.updateValue();\n        },\n        _updateMentions: function() {\n            this._offsets = [];\n            var ja = this._getMarkedValue(), ka = ja;\n            for (var la = 0; ((la < this._orderedUIDs.length)); ++la) {\n                var ma = this._orderedUIDs[la], na = ca(this._mentioned[ma].text), oa = ka.indexOf(na);\n                if (((oa == -1))) {\n                    this._removeToken(ma);\n                }\n            ;\n            ;\n                ka = ga(ka, na);\n                this._offsets.push([oa,((oa + na.length)),]);\n            };\n        ;\n            var pa = ja;\n            while ((((oa = ka.indexOf(aa)) > -1))) {\n                pa = ha(pa, oa);\n                ka = ha(ka, oa);\n            };\n        ;\n            if (((ja !== pa))) {\n                var qa = p.get(this._input);\n                o.setValue(this._input, pa);\n                p.set(this._input, qa.start);\n                this._value = pa;\n            }\n        ;\n        ;\n        },\n        _renderHashtags: function(ja) {\n            if (!this._hasHashtags) {\n                return x(ja);\n            }\n        ;\n        ;\n            if (!this._hashtagParser) {\n                if (r.hashtagTrigger.exec(ja)) {\n                    this.bootloadHashtagParser();\n                }\n            ;\n            ;\n                if (!this._hashtagParser) {\n                    return x(ja);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._hashtags = this._hashtagParser.parse(ja);\n            var ka = [], la = 0;\n            for (var ma = 0; ((ma < this._hashtags.length)); ma++) {\n                var na = this._hashtags[ma];\n                ka.push(x(ja.substring(la, na.rawOffset)), \"\\u003Cb\\u003E\", na.marker, na.tag, \"\\u003C/b\\u003E\");\n                la = ((((na.rawOffset + na.marker.length)) + na.tag.length));\n            };\n        ;\n            ka.push(x(ja.substring(la)));\n            return ka.join(\"\");\n        },\n        updateValue: function() {\n            var ja = this._value = this._getMarkedValue(), ka = this._orderedUIDs, la = ja.replace(ea, da);\n            for (var ma = 0; ((ma < ka.length)); ++ma) {\n                var na = ((((\"@[\" + ka[ma])) + \":]\")), oa = ca(this._mentioned[ka[ma]].text);\n                la = la.replace(oa, na);\n                ja = ja.replace(oa, na);\n            };\n        ;\n            var pa = this._renderHashtags(ja);\n            for (var ma = 0; ((ma < ka.length)); ++ma) {\n                var qa = ka[ma], ra = this._mentioned[qa], sa = ra.text, ta = ((ra.weakreference ? \"\\u003Cb class=\\\"weak\\\"\\u003E\" : \"\\u003Cb\\u003E\"));\n                pa = pa.replace(((((\"@[\" + qa)) + \":]\")), ((((ta + x(ca(sa)))) + \"\\u003C/b\\u003E\")));\n                sa = sa.replace(fa, function(ua) {\n                    return ((\"\\\\\" + ua));\n                });\n                la = la.replace(((((\"@[\" + qa)) + \":]\")), ((((((((\"@[\" + qa)) + \":\")) + sa)) + \"]\")));\n            };\n        ;\n            if (v.ie()) {\n                pa = pa.replace(/ /g, \"&nbsp;\\u003Cwbr/\\u003E\");\n            }\n        ;\n        ;\n            l.setContent(this._highlighterContent, n(pa));\n            this._hiddenInput.value = la;\n            this._updateHighlighter();\n            this._updateHeight();\n        },\n        _updateDirection: function() {\n            var ja = t.get(this._input, \"direction\");\n            if (((ja == this._dir))) {\n                return;\n            }\n        ;\n        ;\n            this._dir = ja;\n            t.set(this._highlighter, \"direction\", ja);\n            if (((ja == \"rtl\"))) {\n                t.set(this._highlighter, \"text-align\", \"right\");\n            }\n             else t.set(this._highlighter, \"text-align\", \"left\");\n        ;\n        ;\n        },\n        _updateWidth: function() {\n            var ja = t.getFloat.curry(this._input), ka = ((((((((this._input.offsetWidth - ja(\"paddingLeft\"))) - ja(\"paddingRight\"))) - ja(\"borderLeftWidth\"))) - ja(\"borderRightWidth\")));\n            if (v.firefox()) {\n                ka -= 2;\n            }\n        ;\n        ;\n            if (((v.ie() <= 7))) {\n                ka -= t.getFloat(this._highlighterInner, \"paddingLeft\");\n                this._highlighter.style.zoom = 1;\n            }\n        ;\n        ;\n            this._highlighterInner.style.width = ((Math.max(ka, 0) + \"px\"));\n        },\n        _updateHeight: function() {\n            if (this._highlighterAuxContent) {\n                var ja = this._highlighter.offsetHeight, ka = this._typeahead.getElement();\n                if (((ja > ka.offsetHeight))) {\n                    t.set(ka, \"height\", ((ja + \"px\")));\n                    g.inform(\"reflow\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _updateTypeahead: function() {\n            var ja = this._typeahead.getCore(), ka = null;\n            if (((!this._maxMentions || ((this._numMentioned < this._maxMentions))))) {\n                ka = r.autoMatcher;\n            }\n        ;\n        ;\n            ja.matcher = ka;\n            ja.setExclusions(this._orderedUIDs);\n            this.inform(\"update\", {\n                mentioned: this._mentioned\n            });\n        },\n        setPlaceholder: function(ja) {\n            this._placeholder = ja;\n            if (!this.hasAuxContent()) {\n                o.setPlaceholder(this._input, ja);\n            }\n        ;\n        ;\n        },\n        _updateHighlighter: function() {\n            if (this._highlighterContent) {\n                j.conditionShow(this._highlighterContent, ((((((this._numMentioned > 0)) || this.hasAuxContent())) || this._hashtags.length)));\n            }\n        ;\n        ;\n        },\n        setAuxContent: function(ja) {\n            if (this._highlighterContent) {\n                if (!this._highlighterAuxContent) {\n                    this._highlighterAuxContent = l.create(\"span\", {\n                        className: \"highlighterAuxContent\"\n                    });\n                    l.insertAfter(this._highlighterContent, this._highlighterAuxContent);\n                }\n            ;\n            ;\n                l.setContent(this._highlighterAuxContent, ja);\n                if (ja) {\n                    o.setPlaceholder(this._input, \"\");\n                }\n                 else o.setPlaceholder(this._input, this._placeholder);\n            ;\n            ;\n                this._updateHighlighter();\n                this._updateHeight();\n            }\n        ;\n        ;\n        },\n        hasAuxContent: function() {\n            var ja = this.getAuxContentRoot();\n            return ((ja && ((ja.innerHTML.length > 0))));\n        },\n        getAuxContentRoot: function() {\n            return this._highlighterAuxContent;\n        },\n        addMention: function(ja) {\n            var ka = this._getMarkedValue();\n            if (((ka !== \"\"))) {\n                ka += \" \";\n            }\n        ;\n        ;\n            o.setValue(this._input, ((((ka + ca(ja.text))) + \" \")));\n            this._addToken(ja);\n            this._update();\n        },\n        getMentions: function() {\n            return this._mentioned;\n        },\n        bootloadHashtagParser: function() {\n            if (!this._hashtagParser) {\n                i.loadModules([\"HashtagParser\",], function(ja) {\n                    this._hashtagParser = ja;\n                    if (this._initialized) {\n                        this._update();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = ia;\n});\n__d(\"MentionsTypeaheadAreaView\", [\"Class\",\"ContextualTypeaheadView\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"ContextualTypeaheadView\"), i = b(\"Parent\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, h);\n    j(k.prototype, {\n        getContext: function() {\n            return i.byClass(this.element, \"uiMentionsInput\");\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:MentionsInput\", [\"MentionsInput\",], function(a, b, c, d) {\n    a.MentionsInput = b(\"MentionsInput\");\n}, 3);\n__d(\"legacy:ui-side-nav-future-js\", [\"FutureSideNav\",], function(a, b, c, d) {\n    a.FutureSideNav = b(\"FutureSideNav\");\n}, 3);\n__d(\"HoverFlyout\", [\"Arbiter\",\"ArbiterMixin\",\"DataStore\",\"JSBNG__Event\",\"Keys\",\"arrayContains\",\"copyProperties\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"DataStore\"), j = b(\"JSBNG__Event\"), k = b(\"Keys\"), l = b(\"arrayContains\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\"), o = b(\"shield\");\n    function p(q, r, s, t) {\n        if (q) {\n            this._showDelay = s;\n            this._hideDelay = t;\n            this.init(q);\n            if (r) {\n                this.initNode(r);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        g.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", o(this.hideFlyout, this), g.SUBSCRIBE_ALL);\n    };\n;\n    m(p.prototype, h, {\n        init: function(q) {\n            this._flyout = q;\n            this._showDelay = ((this._showDelay || 0));\n            this._hideDelay = ((this._hideDelay || 100));\n            this._showTimeout = null;\n            this._hideTimeout = null;\n            this._flyoutSubscriptions = [this._flyout.subscribe(\"mouseenter\", this._onFlyoutMouseEnter.bind(this)),this._flyout.subscribe(\"mouseleave\", o(this.hideFlyout, this)),];\n            this._nodes = [];\n            this._dataStoreUnique = ((((\"HoverFlyout_\" + JSBNG__Date.now())) + \"_listeners\"));\n            return this;\n        },\n        initNode: function(q) {\n            if (l(this._nodes, q)) {\n                return this;\n            }\n        ;\n        ;\n            this._nodes.push(q);\n            i.set(q, this._dataStoreUnique, [j.listen(q, \"mouseenter\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"mouseleave\", o(this.hideFlyout, this)),j.listen(q, \"click\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"keydown\", this._onNodeKeyEscape.bind(this)),]);\n            return this;\n        },\n        deactivateNode: function(q) {\n            var r = i.get(q, this._dataStoreUnique);\n            if (r) {\n                while (r.length) {\n                    r.pop().remove();\n                ;\n                };\n            }\n        ;\n        ;\n            n(this._nodes, q);\n        },\n        setShowDelay: function(q) {\n            this._showDelay = q;\n            return this;\n        },\n        setHideDelay: function(q) {\n            this._hideDelay = q;\n            return this;\n        },\n        showFlyout: function(q, r) {\n            this.setActiveNode(q);\n            if (r) {\n                this._flyout.setContext(q).show();\n                this.inform(\"show\", q);\n            }\n             else this._showTimeout = this.showFlyout.bind(this, q, true).defer(this._showDelay);\n        ;\n        ;\n            return this;\n        },\n        hideFlyout: function(q) {\n            JSBNG__clearTimeout(this._showTimeout);\n            if (q) {\n                this._flyout.hide();\n                ((this._activeNode && this.inform(\"hide\", this._activeNode)));\n                this._activeNode = null;\n            }\n             else this._hideTimeout = this.hideFlyout.bind(this, true).defer(this._hideDelay);\n        ;\n        ;\n        },\n        hideFlyoutDelayed: function(q) {\n            JSBNG__clearTimeout(this._showTimeout);\n            JSBNG__clearTimeout(this._hideTimeout);\n            this._hideTimeout = this.hideFlyout.bind(this, true).defer(q);\n        },\n        getActiveNode: function() {\n            return this._activeNode;\n        },\n        setActiveNode: function(q) {\n            JSBNG__clearTimeout(this._hideTimeout);\n            if (((this._activeNode && ((this._activeNode !== q))))) {\n                this.hideFlyout(true);\n            }\n        ;\n        ;\n            this._activeNode = q;\n            return this;\n        },\n        clearNodes: function() {\n            for (var q = this._nodes.length; ((q > 0)); q--) {\n                this.deactivateNode(this._nodes[((q - 1))]);\n            ;\n            };\n        ;\n        },\n        destroy: function() {\n            while (this._flyoutSubscriptions.length) {\n                this._flyout.unsubscribe(this._flyoutSubscriptions.pop());\n            ;\n            };\n        ;\n            this.clearNodes();\n        },\n        _onNodeMouseEnter: function(q) {\n            if (((this._activeNode === q))) {\n                JSBNG__clearTimeout(this._hideTimeout);\n            }\n             else this.showFlyout(q);\n        ;\n        ;\n        },\n        _onFlyoutMouseEnter: function() {\n            JSBNG__clearTimeout(this._hideTimeout);\n        },\n        _onNodeKeyEscape: function(JSBNG__event) {\n            if (((j.getKeyCode(JSBNG__event) === k.ESC))) {\n                ((this._activeNode && this.inform(\"hide\", this._activeNode)));\n                this._activeNode = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = ((a.HoverFlyout || p));\n});\n__d(\"TypeaheadAreaCore\", [\"Class\",\"InputSelection\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"InputSelection\"), i = b(\"TypeaheadCore\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this.matcher = new RegExp(((this.matcher + \"$\")));\n        this.preventFocusChangeOnTab = true;\n    };\n;\n    g.extend(l, i);\n    j(l.prototype, {\n        prefix: \"\",\n        suffix: \", \",\n        matcher: \"\\\\b[^,]*\",\n        click: k,\n        select: function(m) {\n            this.parent.select(m);\n            var n = this.element.value, o = ((((this.prefix + m.text)) + this.suffix));\n            this.expandBounds(n, o);\n            var p = n.substring(0, this.start), q = n.substring(this.end);\n            this.element.value = ((((p + o)) + q));\n            h.set(this.element, ((p.length + o.length)));\n        },\n        expandBounds: function(m, n) {\n            m = m.toLowerCase();\n            n = n.toLowerCase();\n            var o, p, q, r, s = /\\s/;\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.start;\n            while (((((o >= 0)) && ((q >= 0))))) {\n                r = m.charAt(((o - 1)));\n                if (((!r || s.test(r)))) {\n                    this.start = o;\n                }\n            ;\n            ;\n                p = ((r + p));\n                q = n.indexOf(p);\n                o--;\n            };\n        ;\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.end;\n            while (((((o <= m.length)) && ((q >= 0))))) {\n                r = m.charAt(o);\n                if (((!r || s.test(r)))) {\n                    this.end = o;\n                }\n            ;\n            ;\n                p = ((p + r));\n                q = n.indexOf(p);\n                o++;\n            };\n        ;\n        },\n        getRawValue: function() {\n            var m = ((h.get(this.element).start || 0));\n            return this.parent.getValue().substring(0, m);\n        },\n        getValue: function() {\n            var m = ((this.matcher && this.matcher.exec(this.getRawValue())));\n            if (!m) {\n                return \"\";\n            }\n        ;\n        ;\n            var n = m[0], o = ((m.index + n.length));\n            n = n.replace(/^\\s/, \"\");\n            var p = n.length;\n            n = n.replace(/\\s$/, \"\");\n            var q = ((p - n.length));\n            this.start = ((o - p));\n            this.end = ((o + q));\n            return ((((m[2] || m[1])) || m[0]));\n        }\n    });\n    e.exports = l;\n});\n__d(\"TypeaheadMetrics\", [\"JSBNG__Event\",\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this.extraData = {\n        };\n        i(this, l);\n    };\n;\n    i(k.prototype, {\n        endPoint: \"/ajax/typeahead/record_basic_metrics.php\",\n        init: function(l) {\n            this.init = j;\n            this.core = l.getCore();\n            this.view = l.getView();\n            this.data = l.getData();\n            this.stats = {\n            };\n            this.sessionActive = false;\n            this._sessionStartEvents = [];\n            this._sessionEndEvents = [];\n            this._reset();\n            this.initEvents();\n        },\n        _reset: function() {\n            this.stats = {\n            };\n            this.avgStats = {\n            };\n            this.sessionActive = false;\n            this.results = null;\n            this.sid = Math.floor(((JSBNG__Date.now() * Math.JSBNG__random())));\n            this.data.setQueryData({\n                sid: this.sid\n            });\n        },\n        recordSelect: function(l) {\n            var m = l.selected;\n            if (((m.uid == null))) {\n                this.recordStat(\"selected_id\", \"SELECT_NULL\");\n            }\n             else this.recordStat(\"selected_id\", m.uid);\n        ;\n        ;\n            this.recordStat(\"selected_type\", m.type);\n            this.recordStat(\"selected_position\", l.index);\n            this.recordStat(\"selected_with_mouse\", ((l.clicked ? 1 : 0)));\n            this.recordStat(\"selected_query\", l.query);\n            this._sessionEnd();\n        },\n        bindSessionStart: function(l, JSBNG__event, m) {\n            if (m) {\n                for (var n = 0; ((n < this._sessionStartEvents.length)); ++n) {\n                    var o = this._sessionStartEvents[n];\n                    o.obj.unsubscribe(o.token);\n                };\n            }\n        ;\n        ;\n            this._sessionStartEvents.push({\n                obj: l,\n                token: l.subscribe(JSBNG__event, function(p, q) {\n                    this._sessionStart();\n                }.bind(this))\n            });\n        },\n        bindSessionEnd: function(l, JSBNG__event, m) {\n            if (m) {\n                for (var n = 0; ((n < this._sessionEndEvents.length)); ++n) {\n                    var o = this._sessionEndEvents[n];\n                    o.obj.unsubscribe(o.token);\n                };\n            }\n        ;\n        ;\n            this._sessionEndEvents.push({\n                obj: l,\n                token: l.subscribe(JSBNG__event, function(p, q) {\n                    this._sessionEnd();\n                }.bind(this))\n            });\n        },\n        initEvents: function() {\n            this.bindSessionStart(this.core, \"JSBNG__focus\", false);\n            this.bindSessionEnd(this.core, \"JSBNG__blur\", false);\n            this.view.subscribe(\"select\", function(l, m) {\n                this.recordSelect(m);\n            }.bind(this));\n            this.bindSessionEnd(this.view, \"select\", false);\n            this.view.subscribe(\"render\", function(l, m) {\n                this.results = m;\n            }.bind(this));\n            this.data.subscribe(\"beforeQuery\", function(l, m) {\n                if (!m.value) {\n                    return;\n                }\n            ;\n            ;\n                this.query = m.value;\n                this.recordCountStat(\"num_queries\");\n            }.bind(this));\n            this.data.subscribe(\"beforeFetch\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.bootstrapBegin = JSBNG__Date.now();\n                }\n                 else m.fetch_context.queryBegin = JSBNG__Date.now();\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"fetchComplete\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.recordAvgStat(\"bootstrap_latency\", ((JSBNG__Date.now() - this.bootstrapBegin)));\n                    var n = {\n                    };\n                    m.response.payload.entries.forEach(function(o) {\n                        if (!n[o.type]) {\n                            n[o.type] = 1;\n                        }\n                         else n[o.type]++;\n                    ;\n                    ;\n                    });\n                    this.recordStat(\"bootstrap_response_types\", n);\n                    this.bootstrapped = true;\n                }\n                 else {\n                    if (((\"filtered_count\" in m.response.payload))) {\n                        this.recordStat(\"filtered_count\", m.response.payload.filtered_count);\n                    }\n                ;\n                ;\n                    this.recordAvgStat(\"avg_query_latency\", ((JSBNG__Date.now() - m.fetch_context.queryBegin)));\n                }\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"dirty\", function(l, m) {\n                this.bootstrapped = false;\n            });\n        },\n        _sessionStart: function() {\n            if (this.sessionActive) {\n                return;\n            }\n        ;\n        ;\n            this.sessionActive = true;\n        },\n        _sessionEnd: function() {\n            if (!this.sessionActive) {\n                return;\n            }\n        ;\n        ;\n            this.sessionActive = false;\n            this.submit();\n            this._reset();\n        },\n        recordStat: function(l, m) {\n            this.stats[l] = m;\n        },\n        recordCountStat: function(l) {\n            var m = this.stats[l];\n            this.stats[l] = ((m ? ((m + 1)) : 1));\n        },\n        recordAvgStat: function(l, m) {\n            if (this.avgStats[l]) {\n                this.avgStats[l][0] += m;\n                ++this.avgStats[l][1];\n            }\n             else this.avgStats[l] = [m,1,];\n        ;\n        ;\n        },\n        submit: function() {\n            if (Object.keys(this.stats).length) {\n                i(this.stats, this.extraData);\n                if (this.results) {\n                    var l = (this.results).map(function(o, p) {\n                        return o.uid;\n                    });\n                    this.recordStat(\"candidate_results\", JSON.stringify(l));\n                }\n            ;\n            ;\n                if (this.query) {\n                    this.recordStat(\"query\", this.query);\n                }\n            ;\n            ;\n                if (this.sid) {\n                    this.recordStat(\"sid\", this.sid);\n                }\n            ;\n            ;\n                if (this.bootstrapped) {\n                    this.recordStat(\"bootstrapped\", 1);\n                }\n            ;\n            ;\n                {\n                    var fin229keys = ((window.top.JSBNG_Replay.forInKeys)((this.avgStats))), fin229i = (0);\n                    var m;\n                    for (; (fin229i < fin229keys.length); (fin229i++)) {\n                        ((m) = (fin229keys[fin229i]));\n                        {\n                            var n = this.avgStats[m];\n                            this.stats[m] = ((n[0] / n[1]));\n                        };\n                    };\n                };\n            ;\n                new h().setURI(this.endPoint).setMethod(\"POST\").setData({\n                    stats: this.stats\n                }).send();\n                this._reset();\n            }\n        ;\n        ;\n        }\n    });\n    k.register = function(l, m, n) {\n        if (((JSBNG__document.activeElement === l))) {\n            m.init(n);\n        }\n         else var o = g.listen(l, \"JSBNG__focus\", function() {\n            m.init(n);\n            o.remove();\n        })\n    ;\n    };\n    e.exports = k;\n});\n__d(\"TypeaheadHoistFriends\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._typeahead = i;\n    };\n;\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            var i = this._typeahead.getView();\n            this._subscription = i.subscribe(\"beforeRender\", function(j, k) {\n                var l = [], m = [], n = [];\n                for (var o = 0; ((o < k.results.length)); ++o) {\n                    var p = k.results[o];\n                    if (((p.type == \"header\"))) {\n                        n = n.concat(m, l);\n                        n.push(p);\n                        m = [];\n                        l = [];\n                    }\n                     else if (((((p.type == \"user\")) && p.bootstrapped))) {\n                        m.push(p);\n                    }\n                     else l.push(p);\n                    \n                ;\n                ;\n                };\n            ;\n                k.results = n.concat(m, l);\n            });\n        },\n        disable: function() {\n            this._typeahead.getView().unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"legacy:HoistFriendsTypeaheadBehavior\", [\"TypeaheadHoistFriends\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadHoistFriends\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.hoistFriends = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"escapeRegex\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return h.replace(/([.?*+\\^$\\[\\]\\\\(){}|\\-])/g, \"\\\\$1\");\n    };\n;\n    e.exports = g;\n});\n__d(\"mixin\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n, o, p, q, r) {\n        var s = function() {\n        \n        }, t = [h,i,j,k,l,m,n,o,p,q,], u = 0, v;\n        while (t[u]) {\n            v = t[u];\n            {\n                var fin230keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin230i = (0);\n                var w;\n                for (; (fin230i < fin230keys.length); (fin230i++)) {\n                    ((w) = (fin230keys[fin230i]));\n                    {\n                        if (v.hasOwnProperty(w)) {\n                            s.prototype[w] = v[w];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            u += 1;\n        };\n    ;\n        return s;\n    };\n;\n    e.exports = g;\n});");
// 12399
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o95,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/T5cpEiWgpks.js",o96);
// undefined
o95 = null;
// undefined
o96 = null;
// 12458
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"EzMPG\",]);\n}\n;\n__d(\"ChannelSubdomain\", [\"Cookie\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"JSLogger\"), i = h.create(\"channel\"), j = 7, k = null;\n    function l(o, p) {\n        var q = null, r = m(), s;\n        o--;\n        var t = Math.min(32, (j * o));\n        t = Math.max(t, 1);\n        var u = false;\n        for (var v = 0; (v < 32); v++) {\n            s = (((v + p)) % t);\n            if (!((r & ((1 << s))))) {\n                u = true;\n                break;\n            }\n        ;\n        };\n        if (u) {\n            k = s;\n            q = (k % j);\n            g.set(\"sub\", (r | ((1 << k))));\n        }\n         else {\n            k = -1;\n            q = null;\n            i.error(\"subdomain_overflow\", {\n                slot: k,\n                max: o\n            });\n        }\n    ;\n        return q;\n    };\n    function m() {\n        var o = (g.get(\"sub\") || 0);\n        o = parseInt(o, 10);\n        return (isNaN(o) ? 0 : o);\n    };\n    function n() {\n        if (((k !== null) && (k >= 0))) {\n            var o = (m() & ~((1 << k)));\n            if (o) {\n                g.set(\"sub\", o);\n            }\n             else g.clear(\"sub\");\n        ;\n        }\n    ;\n    };\n    e.exports = {\n        allocate: l,\n        clear: n\n    };\n});\n__d(\"DocRPC\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = {\n        _apis: {\n        },\n        _dispatch: function(i) {\n            var j;\n            try {\n                i = JSON.parse(i);\n            } catch (k) {\n                throw new Error(((\"DocRPC unparsable dispatch: \\\"\" + i) + \"\\\"\"));\n            };\n            if (h._apis.hasOwnProperty(i.api)) {\n                var l = h._apis[i.api];\n                if (l[i.method]) {\n                    j = g.applyWithGuard(l[i.method], l, i.args);\n                };\n            }\n        ;\n            if ((j === undefined)) {\n                j = null;\n            };\n            return JSON.stringify(j);\n        },\n        publish: function(i, j) {\n            h._apis[j] = i;\n        },\n        proxy: function(i, j, k) {\n            var l = {\n            };\n            k.forEach(function(m) {\n                l[m] = function() {\n                    var n = {\n                        api: j,\n                        method: m,\n                        args: Array.prototype.slice.call(arguments)\n                    }, o;\n                    try {\n                        if (i.closed) {\n                            throw new Error(\"DocRPC window closed\")\n                        };\n                        o = i.DocRPC._dispatch(JSON.stringify(n));\n                    } catch (p) {\n                        g.reportError(p);\n                        return;\n                    };\n                    if ((typeof (o) == \"string\")) {\n                        try {\n                            o = JSON.parse(o);\n                        } catch (p) {\n                            throw new Error(((((((\"DocRPC \" + j) + \".\") + m) + \" unparsable return: \\\"\") + o) + \"\\\"\"));\n                        }\n                    };\n                    return o;\n                };\n            });\n            return l;\n        }\n    };\n    e.exports = a.DocRPC = h;\n});\n__d(\"ChannelTransport\", [\"copyProperties\",\"bind\",\"AjaxRequest\",\"URI\",\"JSLogger\",\"DocRPC\",\"ChannelConstants\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"bind\"), i = b(\"AjaxRequest\"), j = b(\"URI\"), k = b(\"JSLogger\"), l = b(\"DocRPC\"), m = b(\"ChannelConstants\"), n = b(\"UserAgent\"), o = k.create(\"channel\");\n    function p() {\n        return (((1048576 * Math.random()) | 0)).toString(36);\n    };\n    function q(y, z) {\n        var aa = y.subdomain;\n        aa = ((aa === null) ? \"\" : ((aa + \"-\")));\n        var ba = new j(z).setDomain(((aa + y.host) + \".facebook.com\")).setPort(y.port).setSecure(j().isSecure());\n        return ba;\n    };\n    function r(y) {\n        var z = {\n            partition: y.partition,\n            cb: p()\n        }, aa = q(y, \"/p\").setQueryData(z);\n        o.log(\"start_p\", {\n            uri: aa.toString()\n        });\n        var ba = new i(\"GET\", aa);\n        if (i.supportsCORS()) {\n            ba.xhr.withCredentials = true;\n        };\n        var ca = function(da) {\n            o.log(\"finish_p\", {\n                xhr: (da.toJSON ? da.toJSON() : da)\n            });\n        };\n        ba.timeout = y.P_TIMEOUT;\n        ba.onError = ba.onSuccess = ca;\n        ba.send();\n    };\n    function s(y, z, aa) {\n        var ba = new Image(), ca = 0, da = function(ga) {\n            ba.abort();\n            return (ga ? z() : aa());\n        };\n        ba.onload = function() {\n            o.log(\"ping_ok\", {\n                duration: (Date.now() - ca)\n            });\n            da(true);\n        };\n        ba.onerror = function() {\n            r(y);\n            da(false);\n        };\n        var ea = setTimeout(ba.onerror, 10000, false);\n        ba.abort = function() {\n            if (ea) {\n                clearTimeout(ea);\n                ea = null;\n            }\n        ;\n            ba.onload = ba.onerror = null;\n        };\n        var fa = {\n            partition: y.partition,\n            cb: p()\n        };\n        ca = Date.now();\n        ba.src = q(y, \"/ping\").setQueryData(fa);\n        return ba;\n    };\n    function t(y, z, aa, ba) {\n        var ca = new Date(), da = ((((ca - y.userActive)) / 1000) | 0);\n        if ((da < 0)) {\n            o.warn(\"idle_regression\", {\n                idleTime: da,\n                now: ca.getTime(),\n                userActive: y.userActive\n            });\n        };\n        var ea = {\n            channel: y.user_channel,\n            seq: y.seq,\n            partition: y.partition,\n            clientid: y.sessionID,\n            cb: p(),\n            idle: da,\n            cap: 0\n        };\n        if ((da < 60)) {\n            ea.state = \"active\";\n        };\n        if (y.streamingCapable) {\n            ea.mode = \"stream\";\n            ea.format = \"json\";\n        }\n    ;\n        if (y.profile) {\n            ea.profile = y.profile;\n        };\n        if ((y.webrtcSupport && (((n.chrome() >= 24) || (n.firefox() >= 22))))) {\n            ea.cap = m.CAPABILITY_VOIP;\n        };\n        var fa = q(y, \"/pull\").setQueryData(ea), ga = new i(\"GET\", fa);\n        if (i.supportsCORS()) {\n            ga.xhr.withCredentials = true;\n        };\n        ga.timeout = (y.streamingCapable ? y.STREAMING_TIMEOUT : y.LONGPOLL_TIMEOUT);\n        ga.onJSON = z;\n        ga.onSuccess = aa;\n        ga.onError = function() {\n            var ha = ((((this.status == 12002) && (this._time >= y.MIN_12002_TIMEOUT))) || (((this.status == 504) && (this._time >= y.MIN_504_TIMEOUT)))), ia = (ha ? aa : ba);\n            return (ia && ia.apply(this, arguments));\n        };\n        ga.send();\n        y.inStreaming = y.streamingCapable;\n        return ga;\n    };\n    function u(y) {\n        this.manager = y;\n        ((this.init && this.init()));\n    };\n    function v(y) {\n        u.apply(this, arguments);\n    };\n    g(v.prototype, {\n        logName: \"CORS\",\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n            if ((y == \"init\")) {\n                setTimeout(h(this.manager, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), 3000, false);\n            };\n            if (!/pull|ping/.test(y)) {\n                return\n            };\n            var aa = this.manager;\n            if ((y == \"ping\")) {\n                this._request = s(z, h(aa, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if ((y == \"pull\")) {\n                this._request = t(z, h(aa, \"_processTransportData\", z.stateId), h(aa, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n        ;\n        }\n    });\n    function w(y) {\n        o.log(\"iframe_init_constructor\");\n        u.apply(this, arguments);\n        this._iframe = document.createElement(\"iframe\");\n        this._iframe.style.display = \"none\";\n        document.body.appendChild(this._iframe);\n        l.publish(this, \"outerTransport\");\n    };\n    g(w.prototype, {\n        logName: \"iframe\",\n        _initIframe: function(y) {\n            o.log(\"iframe_init_start\");\n            window.onchanneliframeready = function() {\n                o.log(\"iframe_resources\");\n                return y.resources;\n            };\n            window.onchanneliframeloaded = function() {\n                o.log(\"iframe_loaded\");\n            };\n            if (y) {\n                this._iframeURI = q(y, y.path);\n                if (y.bustIframe) {\n                    var z = {\n                        partition: y.partition,\n                        cb: p()\n                    };\n                    this._iframeURI.setQueryData(z);\n                }\n            ;\n            }\n             else this._iframeURI = \"about:blank\";\n        ;\n            this._iframeProxy = null;\n            try {\n                this._iframe.contentWindow.location.replace(this._iframeURI);\n                o.log(\"iframe_uri_set\");\n            } catch (aa) {\n                o.error(\"iframe_uri_set_error\", aa);\n                this.exitState({\n                    status: m.ERROR,\n                    stateId: y.stateId\n                }, (aa + \"\"));\n            };\n        },\n        enterState: function(y, z) {\n            if ((y == \"init\")) {\n                this._initIframe(z);\n            }\n             else if (/idle|ping|pull/.test(y)) {\n                if (this._iframeProxy) {\n                    this._iframeProxy.enterState.apply(this._iframeProxy, arguments);\n                }\n                 else if ((y != \"idle\")) {\n                    this.exitState({\n                        status: m.ERROR,\n                        stateId: z.stateId\n                    }, \"iframe not yet loaded\");\n                }\n            ;\n            }\n             else if ((y == \"shutdown\")) {\n                this._initIframe();\n            }\n            \n        ;\n        },\n        _processTransportData: function() {\n            this.manager._processTransportData.apply(this.manager, arguments);\n        },\n        exitState: function(y) {\n            if (((this.manager.state == \"init\") && (y.status == m.OK))) {\n                this._iframeProxy = l.proxy(this._iframe.contentWindow, \"innerTransport\", [\"enterState\",], ((this._iframeURI + \"\")).replace(/iframe.*/, \"\"));\n            };\n            if ((/ping|pull/.test(this.manager.state) && !this._iframeProxy)) {\n                return\n            };\n            this.manager.exitState.apply(this.manager, arguments);\n        }\n    });\n    function x() {\n        this.init = this.init.bind(this);\n        u.apply(this, arguments);\n    };\n    g(x.prototype, {\n        logName: \"iframe(inner)\",\n        init: function() {\n            l.publish(this, \"innerTransport\");\n            try {\n                var z = l.proxy(window.parent, \"outerTransport\", [\"_processTransportData\",\"exitState\",], top.DocRPC.origin);\n                g(this, z);\n                this.exitState({\n                    status: m.OK,\n                    stateId: 1000000\n                });\n            } catch (y) {\n                o.error(\"iframe_inner_init_error\", y);\n            };\n        },\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n            if ((y == \"ping\")) {\n                this._request = s(z, h(this, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if ((y == \"pull\")) {\n                this._request = t(z, h(this, \"_processTransportData\", z.stateId), h(this, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n        ;\n        }\n    });\n    e.exports = {\n        getURI: q,\n        Transport: u,\n        CORSTransport: v,\n        IframeTransport: w,\n        IframeInnerTransport: x\n    };\n});\n__d(\"MovingStat\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        h = (h || 60000);\n        var i = {\n            t: new Date(),\n            count: 0,\n            v: 0\n        }, j = i, k = 0, l = 0;\n        function m() {\n            var n = (new Date() - h);\n            while (((j && j.next) && (j.t < n))) {\n                k -= j.v;\n                l -= j.count;\n                j = j.next;\n            };\n        };\n        this.add = function(n) {\n            k += n;\n            l++;\n            var o = new Date();\n            if (((o - i.t) < 1000)) {\n                i.v += n;\n                i.count++;\n            }\n             else {\n                i.next = {\n                    t: o,\n                    v: n,\n                    count: 1\n                };\n                i = i.next;\n                m();\n            }\n        ;\n        };\n        this.tally = function(n) {\n            n = (n || 1000);\n            m();\n            return {\n                sum: k,\n                count: l,\n                timeAverage: ((k * n) / h)\n            };\n        };\n    };\n    e.exports = g;\n});\n__d(\"ChannelManager\", [\"Event\",\"function-extensions\",\"AjaxRequest\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"ChannelInitialData\",\"ChannelSubdomain\",\"ChannelTransport\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"MovingStat\",\"PresenceCookieManager\",\"PresenceState\",\"PresenceUtil\",\"Run\",\"SystemEvents\",\"URI\",\"UserActivity\",\"copyProperties\",\"createArrayFrom\",\"ChatVisibility\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"AjaxRequest\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"ChannelConstants\"), l = b(\"ChannelInitialData\"), m = b(\"ChannelSubdomain\"), n = b(\"ChannelTransport\"), o = b(\"Env\"), p = b(\"FBAjaxRequest\"), q = b(\"JSLogger\"), r = b(\"MovingStat\"), s = b(\"PresenceCookieManager\"), t = b(\"PresenceState\"), u = b(\"PresenceUtil\"), v = b(\"Run\"), w = b(\"SystemEvents\"), x = b(\"URI\"), y = b(\"UserActivity\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"ChatVisibility\"), ca, da = q.create(\"channel\"), ea = null;\n    function fa(qa) {\n        ea = qa;\n    };\n    var ga = {\n        idle: {\n            ok: \"init!\"\n        },\n        init: {\n            ok: \"pull!\",\n            error: \"reconnect\",\n            sys_online: \"init\",\n            sys_timetravel: \"init\"\n        },\n        pull: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_missing: \"pull\",\n            error_msg_type: \"pull\",\n            refresh_0: \"reconnect\",\n            refresh_110: \"reconnect\",\n            refresh_111: \"reconnect\",\n            refresh_112: \"pull\",\n            refresh_113: \"pull\",\n            refresh_117: \"reconnect\"\n        },\n        ping: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_stale: \"reconnect!\"\n        },\n        reconnect: {\n            ok: \"init!\",\n            error: \"reconnect\",\n            sys_online: \"reconnect\",\n            sys_timetravel: \"reconnect\"\n        },\n        shutdown: {\n        },\n        _all: {\n            error_max: \"shutdown!\",\n            error_shutdown: \"shutdown!\",\n            sys_owner: \"reconnect\",\n            sys_nonowner: \"idle!\",\n            sys_online: \"ping\",\n            sys_offline: \"idle!\",\n            sys_timetravel: \"ping\"\n        }\n    }, ha = {\n        userActive: (ba.isOnline() ? Date.now() : 0),\n        sessionID: (((Math.random() * 2147483648) | 0)).toString(16),\n        streamingCapable: false,\n        inStreaming: false,\n        LONGPOLL_TIMEOUT: 60000,\n        STREAMING_TIMEOUT: 60000,\n        P_TIMEOUT: 30000,\n        IFRAME_LOAD_TIMEOUT: 30000,\n        MIN_RETRY_INTERVAL: 5000,\n        MAX_RETRY_INTERVAL: 30000,\n        MIN_12002_TIMEOUT: 9000,\n        MIN_504_TIMEOUT: 20000,\n        STALL_THRESHOLD: 180000,\n        JUMPSTART_THRESHOLD: 90000,\n        MIN_INIT_PROBE_DELAY: 3000,\n        INIT_PROBE_DELAY_RANDOMIZE_RANGE: 12000,\n        PROBE_DELAY: 60000,\n        PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n        PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n        STREAMING_EXIT_STATE_ON_CONTINUE: false\n    }, ia = 1, ja = {\n    }, ka = 0;\n    function la() {\n        return (j.lastSuccessTime ? Math.round((((Date.now() - j.lastSuccessTime)) / 1000)) : -1);\n    };\n    function ma() {\n        var qa = {\n        };\n        if (ca.getConfig(\"host\")) {\n            qa[ca.getConfig(\"user_channel\")] = ca.getConfig(\"seq\", 0);\n        };\n        return qa;\n    };\n    function na() {\n        var qa = Date.now(), ra = Date.now(), sa = {\n            total: 0\n        }, ta = \"idle\", ua = false;\n        w.subscribe([w.USER,w.ONLINE,w.TIME_TRAVEL,], function(xa, ya) {\n            pa(true);\n            ra = null;\n            ca.lastPullTime = Date.now();\n            var za;\n            switch (xa) {\n              case w.USER:\n                za = (w.isPageOwner() ? k.SYS_OWNER : k.SYS_NONOWNER);\n                break;\n              case w.ONLINE:\n                za = (ya ? k.SYS_ONLINE : k.SYS_OFFLINE);\n                break;\n              case w.TIME_TRAVEL:\n                za = k.SYS_TIMETRAVEL;\n                break;\n            };\n            ca.exitState({\n                status: za,\n                stateId: ia\n            });\n        });\n        var va = function(xa, ya) {\n            var za = Date.now(), ab;\n            if (ya) {\n                qa = za;\n                ab = (ya.nextState || ya.state);\n            }\n             else ab = ta;\n        ;\n            w.checkTimeTravel();\n            if (ra) {\n                var bb = Math.round((((za - ra)) / 1000));\n                if ((bb > 0)) {\n                    sa[ta] = (((sa[ta] || 0)) + bb);\n                    sa.total += bb;\n                }\n            ;\n            }\n        ;\n            ta = ab;\n            ra = za;\n            if (!xa) {\n                sa.lastSuccessTime = la();\n                sa.online = w.isOnline();\n                da.log(\"rollup\", sa);\n            }\n        ;\n        };\n        i.subscribe(k.ON_ENTER_STATE, va);\n        setInterval(va, 60000, false);\n        i.subscribe(q.DUMP_EVENT, function(xa, ya) {\n            ya.channelRollup = sa;\n        });\n        var wa = function() {\n            if ((ca.isShutdown() || ca.shouldIdle())) {\n                return\n            };\n            w.checkTimeTravel();\n            var xa = (Date.now() - ((ca.lastPullTime || o.start)));\n            if ((!ua && (xa > ha.STALL_THRESHOLD))) {\n                var ya = la();\n                da.error(\"stall\", {\n                    lastSuccessTime: ya,\n                    rollupState: ta\n                });\n                ua = true;\n            }\n        ;\n            var za = (Date.now() - qa);\n            if (((ca.state == \"pull\") && (za > ha.JUMPSTART_THRESHOLD))) {\n                qa = null;\n                da.warn(\"jumpstart\", {\n                    state: ca.state,\n                    dormant: za\n                });\n                ca.enterState(\"init\");\n            }\n        ;\n        };\n        setInterval(wa, 10000, false);\n    };\n    function oa() {\n        var qa = Date.now(), ra = 1;\n        function sa() {\n            setTimeout(sa, (ra * 1000), false);\n            var xa = ca.state;\n            if (((xa == \"idle\") && ca.shouldIdle())) {\n                return\n            };\n            da.bump(\"conn_t\", ra);\n            if ((xa == \"pull\")) {\n                da.bump(\"conn_t_pull\", ra);\n            };\n        };\n        sa();\n        var ta = [15,30,60,120,240,], ua = false, va = false;\n        function wa(xa) {\n            setTimeout(function() {\n                da.rate((\"pullenter_\" + xa), ua);\n                da.rate((\"pullexit_\" + xa), va);\n            }, (xa * 1000), false);\n        };\n        while (ta.length) {\n            wa(ta.shift());;\n        };\n        i.subscribe(k.ON_ENTER_STATE, function(xa, ya) {\n            if ((ya.state == \"pull\")) {\n                ua = true;\n            };\n            qa = Date.now();\n        });\n        i.subscribe(k.ON_EXIT_STATE, function(xa, ya) {\n            if (((ya.state != \"pull\") || !qa)) {\n                return\n            };\n            var za = \"other\";\n            if ((ya.status == k.OK)) {\n                va = true;\n                za = \"ok\";\n            }\n             else if ((ya.xhr && ya.xhr.errorType)) {\n                za = (/ar:(\\w+)/.test(ya.xhr.errorType) && RegExp.$1);\n            }\n             else if (/^sys_/.test(ya.status)) {\n                return\n            }\n            \n        ;\n            var ab = (((Date.now() - qa)) / 1000);\n            if ((ab < 0)) {\n                return;\n            }\n             else if ((ab > 3600)) {\n                ab = 3600;\n            }\n        ;\n            da.bump(\"conn_num\");\n            da.bump(\"conn_exit\", ab);\n            da.bump((\"conn_num_\" + za));\n            da.bump((\"conn_exit_\" + za), ab);\n        });\n    };\n    function pa(qa) {\n        if (qa) {\n            ka = 0;\n            ja = {\n            };\n        }\n         else ka++;\n    ;\n    };\n    ca = {\n        state: \"idle\",\n        nextState: null,\n        lastPullTime: Date.now(),\n        heartbeats: [],\n        setTestCallback: fa,\n        init: function(qa) {\n            this.init = function() {\n            \n            };\n            if ((typeof (y) != \"undefined\")) {\n                y.subscribe(function() {\n                    if (ba.isOnline()) {\n                        ha.userActive = Date.now();\n                    };\n                }.bind(this));\n            }\n             else da.error(\"user_activity_undefined\");\n        ;\n            s.register(\"ch\", ma);\n            var ra = this.getConfig(\"max_conn\", 2), sa = Math.floor((Math.random() * 32));\n            ha.subdomain = m.allocate(ra, sa);\n            if ((typeof window.onpageshow != \"undefined\")) {\n                g.listen(window, \"pagehide\", m.clear);\n            }\n             else v.onUnload(m.clear);\n        ;\n            this._transportRate = new r(30000);\n            var ta = (((h.supportsCORS() && !ha.forceIframe)) ? \"CORSTransport\" : \"IframeTransport\");\n            this.transport = new n[ta](this);\n            if (qa) {\n                this.enterState.apply(this, arguments);\n            };\n            i.subscribe(q.DUMP_EVENT, function(event, va) {\n                va.transportRate = this._transportRate.tally();\n                va.transportType = ta;\n                va.transportVersion = 2;\n            }.bind(this));\n            na();\n            oa();\n            if ((((ca.getConfig(\"tryStreaming\") && ca.getConfig(\"host\")) && h.supportsCORS()) && !ha.forceIframe)) {\n                var ua = (ha.MIN_INIT_PROBE_DELAY + (Math.random() * ha.INIT_PROBE_DELAY_RANDOMIZE_RANGE));\n                setTimeout(this._probeTest, ua, false);\n            }\n        ;\n        },\n        configure: function() {\n            var qa = aa(arguments);\n            da.log(\"configure\", qa);\n            qa.forEach(z.bind(null, ha));\n            i.inform(k.ON_CONFIG, this);\n        },\n        getConfig: function(qa, ra) {\n            return ((qa in ha) ? ha[qa] : ra);\n        },\n        isShutdown: function() {\n            return (this.state == \"shutdown\");\n        },\n        shouldIdle: function() {\n            return !((w.isPageOwner() && w.isOnline()));\n        },\n        _sendIframeError: function(qa) {\n            var ra = new j().setURI(\"/ajax/presence/reconnect.php\").setData({\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            }).setOption(\"suppressErrorHandlerWarning\", true).setOption(\"retries\", 1).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true);\n            (ra.specifiesWriteRequiredParams() && ra.send());\n        },\n        _getDelay: function() {\n            var qa = Math.min((ha.MIN_RETRY_INTERVAL * Math.pow(2, Math.max(0, (ka - 1)))), ha.MAX_RETRY_INTERVAL);\n            return ((qa * ((13517 + (Math.random() / 2)))) | 0);\n        },\n        enterState: function() {\n            if (this._inEnterState) {\n                da.warn(\"enterstate_recursion\");\n            };\n            this._inEnterState = true;\n            try {\n                this._enterState.apply(this, arguments);\n                this._inEnterState = false;\n            } catch (qa) {\n                this._inEnterState = false;\n                throw qa;\n            };\n        },\n        _enterState: function(qa) {\n            var ra = 0, sa = aa(arguments);\n            if (this.isShutdown()) {\n                return\n            };\n            if (((qa != \"idle!\") && this.shouldIdle())) {\n                return\n            };\n            ia++;\n            ha.stateId = ia;\n            clearTimeout(this._deferredTransition);\n            this._deferredTransition = null;\n            this.transport.enterState(\"idle\");\n            this.state = \"idle\";\n            this.nextState = null;\n            if (/!$/.test(qa)) {\n                var ta = this._transportRate.tally().timeAverage, ua = ca.getConfig(\"MAX_CHANNEL_STATES_PER_SEC\", 1);\n                if ((ta >= ua)) {\n                    if (!this._throttled) {\n                        this._throttled = true;\n                        da.warn(\"throttled\");\n                    }\n                ;\n                    da.bump(\"throttle\");\n                    ra = (1000 / ua);\n                }\n            ;\n            }\n             else if (!(/#$/.test(qa))) {\n                ra = this._getDelay();\n            }\n        ;\n            qa = qa.replace(/\\W*$/, \"\");\n            if (!ga[qa]) {\n                throw new Error((\"invalid state:\" + qa))\n            };\n            var va;\n            if ((ra <= 0)) {\n                va = {\n                    state: qa\n                };\n                this._transportRate.add(1);\n                this.state = qa;\n                var wa = this[(\"_enter_\" + this.state)];\n                if (wa) {\n                    sa.shift();\n                    wa.apply(this, sa);\n                }\n            ;\n                if (/init|idle|pull|ping/.test(this.state)) {\n                    if ((ha.streamingCapable && /pull/.test(this.state))) {\n                        this.heartbeats = [];\n                    };\n                    this.transport.enterState(this.state, ha);\n                    if ((this.state == \"ping\")) {\n                        va.url = n.getURI(ha).toString();\n                        va.port = (ha.port || \"undefined\");\n                    }\n                ;\n                }\n            ;\n            }\n             else {\n                this.state = \"idle\";\n                this.nextState = qa;\n                va = {\n                    state: this.state,\n                    delay: ra,\n                    nextState: qa\n                };\n                sa[0] = (qa + \"#\");\n                this._deferredTransition = (function() {\n                    this._deferredTransition = null;\n                    this.enterState.apply(this, sa);\n                }).bind(this).defer(ra, false);\n            }\n        ;\n            if (/pull/.test(qa)) {\n                va.client_id = ha.sessionID;\n                va.streaming = ha.inStreaming;\n            }\n        ;\n            da.log((\"enter_\" + this.state), va);\n            i.inform(k.ON_ENTER_STATE, va);\n        },\n        exitState: function(qa, ra) {\n            var sa = qa.stateId, ta = qa.status;\n            if ((this.isShutdown() || (sa < ia))) {\n                return\n            };\n            var ua = aa(arguments), va = this.state;\n            ua[0] = qa.status;\n            var wa = {\n                state: va,\n                status: ta\n            };\n            if (/pull/.test(va)) {\n                wa.client_id = ha.sessionID;\n                wa.streaming = ha.inStreaming;\n            }\n        ;\n            if ((/ping/.test(va) && (ta != k.OK))) {\n                wa.url = n.getURI(ha).toString();\n            };\n            if (this.nextState) {\n                wa.nextState = this.nextState;\n            };\n            if ((ra && ra.errorType)) {\n                wa.xhr = (ra.toJSON ? ra.toJSON() : ra);\n                delete wa.xhr.json;\n            }\n        ;\n            if ((ra && ra.json)) {\n                if (ra.json.t) {\n                    wa.t = ra.json.t;\n                };\n                if (ra.json.reason) {\n                    wa.reason = ra.json.reason;\n                };\n                if (ra.json.seq) {\n                    wa.seq = ra.json.seq;\n                };\n            }\n        ;\n            da.log((\"exit_\" + va), wa);\n            i.inform(k.ON_EXIT_STATE, wa);\n            var xa = this[(\"_exit_\" + va)];\n            if (xa) {\n                ta = (xa.apply(this, ua) || ta);\n            };\n            if ((ta != k.OK)) {\n                pa();\n                ja[va] = (((ja[va] || 0)) + 1);\n            }\n        ;\n            var ya = (ga[(this.nextState || va)][ta] || ga._all[ta]), za = (ya && ya.replace(/!*$/, \"\"));\n            if (!za) {\n                da.error(\"terminal_transition\", wa);\n                this._shutdownHint = k.HINT_INVALID_STATE;\n                ya = \"shutdown!\";\n            }\n        ;\n            this._lastState = va;\n            this._lastStatus = ta;\n            this.enterState(ya);\n        },\n        _processTransportData: function(qa, ra) {\n            var sa = ra.json, ta = sa.t;\n            if ((\"s\" in sa)) {\n                sa.seq = sa.s;\n                delete sa.s;\n            }\n        ;\n            var ua = ha.seq;\n            if ((\"seq\" in sa)) {\n                ha.seq = sa.seq;\n                t.doSync();\n            }\n        ;\n            switch (ta) {\n              case \"continue\":\n                if ((ha.inStreaming && (this.heartbeats.length < 1))) {\n                    ha.streamingCapable = false;\n                    da.log(\"switch_to_longpoll\");\n                    setTimeout(this._probeTest, ha.PROBE_DELAY, false);\n                }\n            ;\n                pa(true);\n                if ((!ha.inStreaming || ha.STREAMING_EXIT_STATE_ON_CONTINUE)) {\n                    this.exitState({\n                        status: k.OK,\n                        stateId: qa\n                    });\n                };\n                break;\n              case \"refresh\":\n            \n              case \"refreshDelay\":\n                this.exitState({\n                    status: (\"refresh_\" + ((sa.reason || 0))),\n                    stateId: qa\n                }, ra);\n                break;\n              case \"fullReload\":\n                s.clear();\n                da.log(\"invalid_history\");\n                i.inform(k.ON_INVALID_HISTORY);\n                this.exitState({\n                    status: k.ERROR_MISSING,\n                    stateId: qa\n                }, ra);\n                break;\n              case \"msg\":\n                var va, wa, xa, ya;\n                pa(true);\n                wa = sa.ms;\n                xa = (ha.seq - wa.length);\n                for (va = 0; (va < wa.length); va++, xa++) {\n                    if ((xa >= ua)) {\n                        ya = wa[va];\n                        if (ya.type) {\n                            if (((ya.type === \"messaging\") && ya.message)) {\n                                var za = (ya.unread_counts && ya.unread_counts.inbox);\n                                da.debug(\"message\", {\n                                    type: \"messaging\",\n                                    inbox_unread: za,\n                                    tid: ya.message.tid,\n                                    mid: ya.message.mid\n                                });\n                            }\n                             else if ((ya.type === \"m_messaging\")) {\n                                da.debug(\"message\", {\n                                    type: \"m_messaging\",\n                                    tid: ya.tid,\n                                    mid: ya.uuid\n                                });\n                            }\n                             else da.debug(\"message\", {\n                                type: ya.type\n                            });\n                            \n                        ;\n                            i.inform(k.getArbiterType(ya.type), {\n                                obj: ya\n                            });\n                        }\n                    ;\n                    }\n                     else da.warn(\"seq_regression\", {\n                        seq: xa,\n                        last_seq: ua,\n                        messages: wa.length\n                    });\n                ;\n                };\n                break;\n              case \"heartbeat\":\n                if (ha.inStreaming) {\n                    var ab = Date.now();\n                    if ((this.heartbeats.length > 0)) {\n                        var bb = (ab - this.heartbeats[(this.heartbeats.length - 1)]);\n                        da.log(\"heartbeat_interval\", {\n                            client_id: ha.sessionID,\n                            interval: bb\n                        });\n                    }\n                ;\n                    this.heartbeats.push(ab);\n                }\n            ;\n                break;\n              default:\n                da.error(\"unknown_msg_type\", {\n                    type: ta\n                });\n                break;\n            };\n        },\n        _enter_init: function() {\n            if ((ja.init >= ca.getConfig(\"MAX_INIT_FAILS\", 2))) {\n                return this.exitState.bind(this, {\n                    status: k.ERROR_MAX,\n                    stateId: ia\n                }).defer()\n            };\n            this._initTimer = this.exitState.bind(this, {\n                status: k.ERROR,\n                stateId: ia\n            }, \"timeout\").defer(ha.IFRAME_LOAD_TIMEOUT, false);\n        },\n        _enter_reconnect: function(qa) {\n            var ra = ia;\n            if (!u.hasUserCookie()) {\n                da.warn(\"no_user_cookie\");\n                (function() {\n                    ca._shutdownHint = k.HINT_AUTH;\n                    ca.exitState({\n                        status: k.ERROR_SHUTDOWN,\n                        stateId: ra\n                    });\n                }).defer();\n                return;\n            }\n        ;\n            var sa = {\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            };\n            if (o.fb_isb) {\n                sa.fb_isb = o.fb_isb;\n            };\n            if (ea) {\n                ea(sa);\n            };\n            var ta = new p(\"GET\", \"/ajax/presence/reconnect.php\", sa);\n            ta.onSuccess = (function() {\n                ca.configure(ta.json);\n                s.store();\n                this.exitState({\n                    status: k.OK,\n                    stateId: ra\n                });\n            }).bind(this);\n            ta.onError = (function() {\n                var ua = (ta.json && ta.json.error);\n                if (((ta.errorType == h.TRANSPORT_ERROR) || (ta.errorType == h.PROXY_ERROR))) {\n                    this._shutdownHint = k.HINT_CONN;\n                };\n                if ((ua && (ua == 1356007))) {\n                    this._shutdownHint = k.HINT_MAINT;\n                }\n                 else if ((((ua == 1357001) || (ua == 1357004)) || (ua == 1348009))) {\n                    this._shutdownHint = k.HINT_AUTH;\n                }\n                 else this._shutdownHint = null;\n                \n            ;\n                this.exitState({\n                    status: (this._shutdownHint ? k.ERROR_SHUTDOWN : k.ERROR),\n                    stateId: ra\n                }, ta);\n            }).bind(this);\n            ta.send();\n        },\n        _enter_shutdown: function() {\n            i.inform(k.ON_SHUTDOWN, {\n                reason: this._shutdownHint\n            });\n        },\n        _exit_init: function(qa) {\n            if (this._initTimer) {\n                this._initTimer = clearTimeout(this._initTimer);\n            };\n            if ((qa == k.ERROR_MAX)) {\n                this._sendIframeError(k.reason_IFrameLoadGiveUp);\n            };\n        },\n        _exit_pull: function(qa) {\n            if ((qa == k.OK)) {\n                this.lastPullTime = Date.now();\n            };\n        },\n        _exit_ping: function(qa) {\n            if ((qa == k.OK)) {\n                var ra = (Date.now() - ((this.lastPullTime || o.start)));\n                if ((ra > ha.STALL_THRESHOLD)) {\n                    return k.ERROR_STALE\n                };\n            }\n        ;\n        },\n        _probeTest: function() {\n            ha.streamingCapable = false;\n            var qa = [], ra = {\n                mode: \"stream\",\n                format: \"json\"\n            }, sa = new x(\"/probe\").setDomain((ha.host + \".facebook.com\")).setPort(ha.port).setSecure(x().isSecure()).setQueryData(ra), ta = new h(\"GET\", sa);\n            ta.onJSON = function(ua, va) {\n                if (((ua && ua.json) && (ua.json.t === \"heartbeat\"))) {\n                    qa.push(Date.now());\n                    if ((qa.length >= 2)) {\n                        var wa = (qa[1] - qa[0]);\n                        if (((wa >= ha.PROBE_HEARTBEATS_INTERVAL_LOW) && (wa <= ha.PROBE_HEARTBEATS_INTERVAL_HIGH))) {\n                            ha.streamingCapable = true;\n                            da.log(\"switch_to_streaming\");\n                        }\n                    ;\n                        da.log(\"probe_ok\", {\n                            time: wa\n                        });\n                    }\n                ;\n                }\n            ;\n            };\n            ta.onSuccess = function(ua) {\n                if ((qa.length != 2)) {\n                    ha.streamingCapable = false;\n                    da.error(\"probe_error\", {\n                        error: (\"beats.length = \" + qa.length)\n                    });\n                }\n            ;\n            };\n            ta.onError = function(ua) {\n                ha.streamingCapable = false;\n                da.error(\"probe_error\", ua);\n            };\n            da.log(\"probe_request\");\n            ta.send();\n        }\n    };\n    e.exports = ca;\n    if (l.channelConfig) {\n        ca.configure(l.channelConfig);\n        if (/shutdown/.test(l.state)) {\n            ca._shutdownHint = k[l.reason];\n        };\n        ca.init(l.state, l.reason);\n    }\n;\n});\n__d(\"ChannelConnection\", [\"Arbiter\",\"copyProperties\",\"ChatConfig\",\"Run\",\"SystemEvents\",\"ChannelConstants\",\"ChannelManager\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"ChatConfig\"), j = b(\"Run\"), k = b(\"SystemEvents\"), l = b(\"ChannelConstants\"), m = b(\"ChannelManager\"), n = b(\"JSLogger\"), o = n.create(\"channel_connection\"), p = null, q = null, r = null, s = null, t = 0, u = h(new g(), {\n        CONNECTED: \"chat-connection/connected\",\n        RECONNECTING: \"chat-connection/reconnecting\",\n        SHUTDOWN: \"chat-connection/shutdown\",\n        MUTE_WARNING: \"chat-connection/mute\",\n        UNMUTE_WARNING: \"chat-connection/unmute\"\n    });\n    function v() {\n        if (q) {\n            clearTimeout(q);\n            q = null;\n        }\n    ;\n    };\n    function w() {\n        v();\n        o.log(\"unmute_warning\");\n        u.inform(u.UNMUTE_WARNING);\n    };\n    function x(ba) {\n        v();\n        q = w.defer(ba, false);\n        o.log(\"mute_warning\", {\n            time: ba\n        });\n        u.inform(u.MUTE_WARNING);\n    };\n    function y() {\n        if (r) {\n            clearTimeout(r);\n            r = null;\n        }\n    ;\n    };\n    function z(ba, ca) {\n        y();\n        if (((ba === l.ON_ENTER_STATE) && (((ca.nextState || ca.state)) === \"pull\"))) {\n            if ((s !== u.CONNECTED)) {\n                o.log(\"connected\");\n                var da = !s;\n                s = u.CONNECTED;\n                t = 0;\n                u.inform(u.CONNECTED, {\n                    init: da\n                });\n            }\n        ;\n        }\n         else if (((ba === l.ON_ENTER_STATE) && (((((ca.nextState || ca.state)) === \"ping\") || ((!ca.nextState && (ca.state === \"idle\"))))))) {\n            r = (function() {\n                var ea = null;\n                if (!(((ca.state === \"idle\") && !ca.nextState))) {\n                    ea = ((ca.delay || 0));\n                };\n                o.log(\"reconnecting\", {\n                    delay: ea\n                });\n                if (u.disconnected()) {\n                    o.log(\"reconnecting_ui\", {\n                        delay: ea\n                    });\n                };\n                s = u.RECONNECTING;\n                (((ca.state === \"idle\")) && t++);\n                if ((t > 1)) {\n                    u.inform(u.RECONNECTING, ea);\n                }\n                 else if ((!ca.nextState && (ca.state === \"idle\"))) {\n                    z(ba, ca);\n                }\n            ;\n            }).defer(500, false);\n        }\n         else if ((ba === l.ON_SHUTDOWN)) {\n            o.log(\"shutdown\", {\n                reason: ca.reason\n            });\n            s = u.SHUTDOWN;\n            t = 0;\n            u.inform(u.SHUTDOWN, ca.reason);\n        }\n        \n        \n    ;\n    };\n    function aa(ba) {\n        if (((m.state === \"ping\") || m.isShutdown())) {\n            return\n        };\n        o.log(\"reconnect\", {\n            now: ba\n        });\n        u.inform(u.RECONNECTING, 0);\n        if (!!ba) {\n            if ((p !== null)) {\n                clearTimeout(p);\n                p = null;\n            }\n        ;\n            m.enterState(\"ping!\");\n        }\n         else if (!p) {\n            p = setTimeout(function() {\n                m.enterState(\"ping!\");\n                p = null;\n            }, i.get(\"channel_manual_reconnect_defer_msec\"), false);\n        }\n    ;\n    };\n    if (m.isShutdown()) {\n        z(l.ON_SHUTDOWN, m._shutdownHint);\n    }\n     else z(l.ON_ENTER_STATE, {\n        state: m.state,\n        nextState: m.nextState,\n        delay: 0\n    });\n;\n    g.subscribe([l.ON_ENTER_STATE,l.ON_SHUTDOWN,], z);\n    k.subscribe(k.TIME_TRAVEL, function() {\n        aa();\n        x(i.get(\"mute_warning_time_msec\"));\n    });\n    j.onBeforeUnload(y, false);\n    h(u, {\n        disconnected: function() {\n            return ((s === u.SHUTDOWN) || ((((s === u.RECONNECTING) && !q) && (t > 1))));\n        },\n        isShutdown: function() {\n            return (s === u.SHUTDOWN);\n        },\n        reconnect: aa,\n        unmuteWarning: w\n    });\n    e.exports = u;\n});\n__d(\"ChatFavoriteList\", [\"AsyncRequest\",\"arrayContains\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"arrayContains\"), i = b(\"emptyFunction\"), j = false, k = [], l = [], m = false;\n    function n() {\n        var r = k.join(\",\");\n        new g(\"/ajax/chat/favorite_list.php\").setData({\n            favorite_list: r\n        }).setHandler(i).setErrorHandler(i).send();\n    };\n    function o(r) {\n        return r.toString();\n    };\n    function p(r) {\n        if ((k.length != r.length)) {\n            return true\n        };\n        for (var s = 0; (s < r.length); s++) {\n            if ((k[s] !== r[s].toString())) {\n                return true\n            };\n        };\n        return false;\n    };\n    var q = {\n        isEditMode: function() {\n            var r = null;\n            d([\"ChatSidebar\",], function(s) {\n                r = s;\n            });\n            return ((j && r) && r.isEnabled());\n        },\n        toggleEditMode: function() {\n            j = !j;\n            if (j) {\n                l = k.slice();\n            };\n        },\n        get: function() {\n            if (j) {\n                return l.slice();\n            }\n             else return k.slice()\n        ;\n        },\n        isFavored: function(r) {\n            return h(l, r.toString());\n        },\n        init: function(r) {\n            k = r.slice().map(o);\n            l = k.slice();\n        },\n        toggleID: function(r) {\n            if (!j) {\n                return\n            };\n            r = r.toString();\n            var s = l.indexOf(r);\n            if ((s >= 0)) {\n                l.splice(s, 1);\n            }\n             else l.push(r);\n        ;\n            m = true;\n        },\n        hasChanged: function() {\n            if (m) {\n                m = false;\n                return true;\n            }\n        ;\n            return false;\n        },\n        updateList: function(r) {\n            if (!j) {\n                return\n            };\n            l = r.map(o);\n        },\n        save: function() {\n            if (p(l)) {\n                k = l;\n                n();\n            }\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChatContexts\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(k) {\n        var l = (k ? k.subtext : \"\");\n        return l;\n    };\n    function i(k, l) {\n        g[k] = l;\n    };\n    var j = {\n        get: function(k) {\n            if ((k in g)) {\n                return g[k];\n            }\n             else return null\n        ;\n        },\n        update: function(k) {\n            for (var l in k) {\n                i(l, k[l]);;\n            };\n        },\n        getShortDisplay: function(k) {\n            return h(j.get(k));\n        }\n    };\n    e.exports = j;\n});\n__d(\"LastMobileActiveTimes\", [\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"tx\"), h = 0, i = {\n    };\n    function j(n) {\n        if ((!h || !n)) {\n            return \"\"\n        };\n        var o = (h - n), p = Math.floor((o / 60)), q = Math.floor((p / 60)), r = Math.floor((q / 24));\n        if ((p <= 1)) {\n            return g._(\"{count}m\", {\n                count: 1\n            });\n        }\n         else if ((p < 60)) {\n            return g._(\"{count}m\", {\n                count: p\n            });\n        }\n         else if ((q < 24)) {\n            return g._(\"{count}h\", {\n                count: q\n            });\n        }\n         else if ((r < 3)) {\n            return g._(\"{count}d\", {\n                count: r\n            });\n        }\n         else return \"\"\n        \n        \n        \n    ;\n    };\n    function k(n, o) {\n        i[n] = o;\n    };\n    function l(n) {\n        if ((n in i)) {\n            return i[n];\n        }\n         else return 0\n    ;\n    };\n    var m = {\n        update: function(n, o) {\n            h = (o / 1000);\n            for (var p in n) {\n                k(p, n[p]);;\n            };\n        },\n        getShortDisplay: function(n) {\n            return j(l(n));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ServerTime\", [\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"PresenceInitialData\"), h;\n    function i(k) {\n        h = (Date.now() - k);\n    };\n    i(g.serverTime);\n    var j = {\n        get: function() {\n            return (Date.now() - h);\n        },\n        getSkew: function() {\n            return h;\n        },\n        update: function(k) {\n            i(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"PresenceStatus\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatVisibility\",\"Env\",\"PresencePrivacy\",\"ServerTime\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatVisibility\"), j = b(\"Env\"), k = b(\"PresencePrivacy\"), l = b(\"ServerTime\"), m = b(\"createObjectFrom\"), n = {\n    }, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n        resetPresenceData: function() {\n            n = {\n            };\n            q = {\n            };\n            p = {\n            };\n        },\n        reset: function() {\n            r.resetPresenceData();\n            o = {\n            };\n        },\n        get: function(s) {\n            if ((s == j.user)) {\n                return (i.isOnline() ? g.ACTIVE : g.OFFLINE)\n            };\n            var t = g.OFFLINE;\n            if ((s in n)) {\n                t = n[s];\n            };\n            if (!k.allows(s)) {\n                t = g.OFFLINE;\n            };\n            if ((t == g.OFFLINE)) {\n                if (o[s]) {\n                    t = g.MOBILE;\n                }\n            };\n            return t;\n        },\n        getGroup: function(s) {\n            if (!h.get(\"chat_group_presence\", 0)) {\n                return g.OFFLINE\n            };\n            return (s.some(function(t) {\n                if ((t == j.user)) {\n                    return false\n                };\n                return ((r.get(t) === g.ACTIVE));\n            }) ? g.ACTIVE : g.OFFLINE);\n        },\n        set: function(s, t, u, v) {\n            if ((s == j.user)) {\n                return false\n            };\n            switch (t) {\n              case g.OFFLINE:\n            \n              case g.IDLE:\n            \n              case g.ACTIVE:\n            \n              case g.MOBILE:\n                break;\n              default:\n                return false;\n            };\n            var w = (r.get(s) != t);\n            if (u) {\n                p[s] = l.get();\n                q[s] = v;\n            }\n        ;\n            n[s] = t;\n            return w;\n        },\n        setMobileFriends: function(s) {\n            o = m(s);\n        },\n        getOnlineIDs: function() {\n            var s, t = [];\n            for (s in n) {\n                if ((r.get(s) === g.ACTIVE)) {\n                    t.push(s);\n                };\n            };\n            return t;\n        },\n        getAvailableIDs: function() {\n            var s = r.getOnlineIDs(), t;\n            for (t in o) {\n                if (n[t]) {\n                    continue;\n                };\n                s.push(t);\n            };\n            return s;\n        },\n        getOnlineCount: function() {\n            return r.getOnlineIDs().length;\n        },\n        getPresenceStats: function() {\n            var s = 0, t = 0, u = 0, v = 0, w = 0;\n            for (var x in n) {\n                s += 1;\n                switch (r.get(x)) {\n                  case g.OFFLINE:\n                    t += 1;\n                    break;\n                  case g.IDLE:\n                    u += 1;\n                    break;\n                  case g.ACTIVE:\n                    v += 1;\n                    break;\n                  case g.MOBILE:\n                    w += 1;\n                    break;\n                  default:\n                    break;\n                };\n            };\n            return {\n                total: s,\n                offline: t,\n                idle: u,\n                active: v,\n                mobile: w\n            };\n        },\n        getDebugInfo: function(s) {\n            return {\n                id: s,\n                presence: n[s],\n                overlaySource: q[s],\n                overlayTime: p[s],\n                mobile: o[s]\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"PresencePoller\", [\"AvailableListConstants\",\"AvailableListInitialData\",\"BanzaiODS\",\"ChannelConnection\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatVisibility\",\"Env\",\"JSLogger\",\"LastMobileActiveTimes\",\"Poller\",\"PresenceStatus\",\"PresenceUtil\",\"ServerTime\",\"ShortProfiles\",\"UserActivity\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"AvailableListInitialData\"), i = b(\"BanzaiODS\"), j = b(\"ChannelConnection\"), k = b(\"ChatContexts\"), l = b(\"ChatFavoriteList\"), m = b(\"ChatVisibility\"), n = b(\"Env\"), o = b(\"JSLogger\"), p = b(\"LastMobileActiveTimes\"), q = b(\"Poller\"), r = b(\"PresenceStatus\"), s = b(\"PresenceUtil\"), t = b(\"ServerTime\"), u = b(\"ShortProfiles\"), v = b(\"UserActivity\"), w = b(\"copyProperties\"), x = b(\"debounceAcrossTransitions\"), y = 5, z = \"/ajax/chat/buddy_list.php\", aa = 1800000, ba = h.pollInterval, ca = h.lazyPollInterval, da = h.lazyThreshold, ea = o.create(\"available_list\"), fa = \"presence_poller\";\n    function ga(ha) {\n        this.$PresencePoller0 = ha;\n        this.$PresencePoller1 = false;\n        this.$PresencePoller2 = h.chatNotif;\n        this.$PresencePoller3 = new q({\n            interval: ba,\n            setupRequest: this.$PresencePoller4.bind(this),\n            clearOnQuicklingEvents: false,\n            dontStart: true\n        });\n        this.$PresencePoller5 = Date.now();\n        this.$PresencePoller6 = Date.now();\n        this.$PresencePoller7 = Date.now();\n        this.$PresencePoller8 = h.updateTime;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera = 0;\n        if (h.favoriteList) {\n            l.init(h.favoriteList);\n        };\n        this.$PresencePollerb(\"available_initial_data\", h.updateTime, h.availableList, h.lastActiveTimes, h.mobileFriends);\n        v.subscribe(function(ia, ja) {\n            if ((ja.idleness > ba)) {\n                this.forceUpdate();\n            };\n        }.bind(this));\n    };\n    ga.prototype.start = function() {\n        this.$PresencePoller3.start.bind(this.$PresencePoller3).defer();\n    };\n    ga.prototype.forceUpdate = function() {\n        if (!this.$PresencePoller9) {\n            this.$PresencePoller3.request();\n        };\n    };\n    ga.prototype.getIsUserIdle = function() {\n        return this.$PresencePoller1;\n    };\n    ga.prototype.getWebChatNotification = function() {\n        return this.$PresencePoller2;\n    };\n    ga.prototype.getCallback = function() {\n        return this.$PresencePoller0;\n    };\n    ga.prototype.$PresencePollerc = function() {\n        return x(function() {\n            this.$PresencePoller0(g.ON_AVAILABILITY_CHANGED);\n        }.bind(this), 0)();\n    };\n    ga.prototype.$PresencePollerb = function(ha, ia, ja, ka, la) {\n        this.$PresencePoller8 = ia;\n        if (!Array.isArray(ja)) {\n            r.resetPresenceData();\n            for (var ma in ja) {\n                r.set(ma, ja[ma].a, false, ha);;\n            };\n        }\n    ;\n        if (ka) {\n            p.update(ka, ia);\n        };\n        if (la) {\n            r.setMobileFriends(la);\n        };\n        this.$PresencePollerc();\n    };\n    ga.prototype.$PresencePoller4 = function(ha) {\n        if ((j.isShutdown() || !m.isOnline())) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.offline\");\n            return;\n        }\n    ;\n        if (((Date.now() - this.$PresencePoller5) < ba)) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.recent\");\n            return;\n        }\n    ;\n        i.bumpEntityKey(fa, \"request\");\n        this.$PresencePoller5 = Date.now();\n        var ia = (((Date.now() - this.$PresencePoller7) > aa)), ja = u.getCachedProfileIDs().join(\",\");\n        this.$PresencePoller9 = true;\n        ha.setHandler(this.$PresencePollerd.bind(this)).setErrorHandler(this.$PresencePollere.bind(this)).setOption(\"suppressErrorAlerts\", true).setOption(\"retries\", 1).setData({\n            user: n.user,\n            cached_user_info_ids: ja,\n            fetch_mobile: ia\n        }).setURI(z).setAllowCrossPageTransition(true);\n    };\n    ga.prototype.$PresencePollerd = function(ha) {\n        var ia = ha.getPayload(), ja = ia.buddy_list;\n        if (!ja) {\n            this.$PresencePollere(ha);\n            return;\n        }\n    ;\n        i.bumpEntityKey(fa, \"response\");\n        this.$PresencePoller9 = false;\n        this.$PresencePollerf();\n        this.$PresencePoller6 = Date.now();\n        t.update(ia.time);\n        this.$PresencePollera = 0;\n        this.$PresencePollerg();\n        var ka = ja.userInfos;\n        if (ka) {\n            u.setMulti(ka);\n        };\n        var la = ja.chatContexts;\n        (la && k.update(la));\n        this.$PresencePoller1 = ja.userIsIdle;\n        if ((ja.chatNotif !== undefined)) {\n            this.$PresencePoller2 = ja.chatNotif;\n            this.$PresencePoller0(g.ON_CHAT_NOTIFICATION_CHANGED, this.$PresencePoller2);\n        }\n    ;\n        this.$PresencePollerb(\"buddy_list_poller\", ia.time, ja.nowAvailableList, ja.last_active_times, ja.mobile_friends);\n    };\n    ga.prototype.$PresencePollere = function(ha) {\n        i.bumpEntityKey(fa, \"error\");\n        if (s.checkMaintenanceError(ha)) {\n            return\n        };\n        this.$PresencePoller9 = false;\n        this.$PresencePollera++;\n        if ((this.$PresencePollera++ >= y)) {\n            this.$PresencePoller0(g.ON_UPDATE_ERROR);\n        };\n    };\n    ga.prototype.$PresencePollerg = function() {\n        var ha = (v.isActive(da) ? ba : ca);\n        i.bumpEntityKey(fa, (\"period.\" + ha));\n        this.$PresencePoller3.setInterval(ha);\n    };\n    ga.prototype.$PresencePollerf = function() {\n        var ha = Date.now(), ia = (ha - this.$PresencePoller6);\n        ea.log(\"buddylist_presence_stats\", w({\n            duration: ia\n        }, r.getPresenceStats()));\n    };\n    e.exports = ga;\n});\n__d(\"AvailableList\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableListConstants\",\"ChannelImplementation\",\"ChannelConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"JSLogger\",\"PresencePoller\",\"PresencePrivacy\",\"PresenceStatus\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"debounceAcrossTransitions\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableListConstants\"), k = b(\"ChannelImplementation\").instance, l = b(\"ChannelConstants\"), m = b(\"ChatConfig\"), n = b(\"ChatFavoriteList\"), o = b(\"JSLogger\"), p = b(\"PresencePoller\"), q = b(\"PresencePrivacy\"), r = b(\"PresenceStatus\"), s = b(\"ShortProfiles\"), t = b(\"TypingDetector\"), u = b(\"copyProperties\"), v = b(\"debounceAcrossTransitions\"), w = b(\"emptyFunction\"), x = u({\n    }, j, h);\n    x.subscribe([j.ON_AVAILABILITY_CHANGED,j.ON_UPDATE_ERROR,], function(ea, fa) {\n        g.inform(ea, fa);\n    });\n    var y = v(function() {\n        x.inform(j.ON_AVAILABILITY_CHANGED);\n    }, 0);\n    function z(ea, fa, ga, ha) {\n        var ia = r.set(ea, fa, ga, ha);\n        if (ia) {\n            y();\n        };\n    };\n    function aa(ea) {\n        var fa = (ea.payload.availability || {\n        });\n        for (var ga in fa) {\n            z(ga, fa[ga], true, \"mercury_tabs\");;\n        };\n    };\n    function ba(ea) {\n        var fa = x.getDebugInfo(ea), ga = ((fa.presence == j.ACTIVE)), ha = new i(\"/ajax/mercury/tabs_presence.php\").setData({\n            target_id: ea,\n            to_online: ga,\n            presence_source: fa.overlaySource,\n            presence_time: fa.overlayTime\n        }).setHandler(aa).setErrorHandler(w).setAllowCrossPageTransition(true).send();\n    };\n    function ca(ea, fa) {\n        fa.chat_config = m.getDebugInfo();\n        fa.available_list_debug_info = {\n        };\n        x.getAvailableIDs().forEach(function(ga) {\n            fa.available_list_debug_info[ga] = x.getDebugInfo(ga);\n        });\n        fa.available_list_poll_interval = (x._poller && x._poller.getInterval());\n    };\n    var da = new p(function(event) {\n        x.inform(event);\n    });\n    u(x, {\n        get: function(ea) {\n            return r.get(ea);\n        },\n        updateForID: function(ea) {\n            ba(ea);\n        },\n        getWebChatNotification: function() {\n            return da.getWebChatNotification();\n        },\n        isUserIdle: function() {\n            return da.getIsUserIdle();\n        },\n        isReady: function() {\n            return true;\n        },\n        set: function(ea, fa, ga) {\n            z(ea, fa, true, ga);\n        },\n        update: function() {\n            da.forceUpdate();\n        },\n        isIdle: function(ea) {\n            return (x.get(ea) == j.IDLE);\n        },\n        getOnlineIDs: function() {\n            return r.getOnlineIDs();\n        },\n        getAvailableIDs: function() {\n            return r.getAvailableIDs();\n        },\n        getOnlineCount: function() {\n            return r.getOnlineCount();\n        },\n        getDebugInfo: function(ea) {\n            var fa = r.getDebugInfo(ea), ga = s.getNow(ea);\n            if (ga) {\n                fa.name = ga.name;\n            };\n            return fa;\n        }\n    });\n    da.start();\n    g.subscribe(o.DUMP_EVENT, ca);\n    g.subscribe(l.getArbiterType(\"favorite_list\"), function(ea, fa) {\n        var ga = fa.obj, ha = (ga.value ? ga.value.split(\",\") : []);\n        n.init(ha);\n        y();\n    });\n    q.subscribe([\"privacy-changed\",\"privacy-availability-changed\",\"privacy-user-presence-response\",], y);\n    k.subscribe([k.CONNECTED,k.RECONNECTING,k.SHUTDOWN,k.MUTE_WARNING,k.UNMUTE_WARNING,], y);\n    g.subscribe(l.getArbiterType(\"buddylist_overlay\"), function(ea, fa) {\n        var ga = fa.obj.overlay;\n        for (var ha in ga) {\n            x.set(ha, ga[ha].a, (ga[ha].s || \"channel\"));;\n        };\n    });\n    g.subscribe([l.getArbiterType(\"typ\"),l.getArbiterType(\"ttyp\"),], function(ea, fa) {\n        var ga = fa.obj;\n        if ((ga.st === t.TYPING)) {\n            var ha = ga.from;\n            x.set(ha, j.ACTIVE, \"channel-typing\");\n        }\n    ;\n    });\n    a.AvailableList = e.exports = x;\n});\n__d(\"ChatImpressionLogger\", [\"AvailableList\",\"AsyncSignal\",\"ChatConfig\",\"ChatVisibility\",\"Poller\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"AsyncSignal\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"Poller\"), l = null, m = null, n = {\n        init: function(o) {\n            l = o;\n            var p = i.get(\"chat_impression_logging_periodical\", 0);\n            if (p) {\n                var q = i.get(\"periodical_impression_logging_config.interval\");\n                m = new k({\n                    interval: q,\n                    setupRequest: this.logImps.bind(this),\n                    clearOnQuicklingEvents: false\n                });\n            }\n        ;\n            this.init = function() {\n            \n            };\n        },\n        logImps: function(o) {\n            if (!j.isOnline()) {\n                return\n            };\n            var p = {\n                source: \"periodical_imps\"\n            }, q = l.getCachedSortedList(), r = [];\n            for (var s = 0; (s < q.length); s++) {\n                r[s] = g.get(q[s]);;\n            };\n            p.sorted_list = q.toString();\n            p.list_availability = r.toString();\n            o.setURI(\"/ajax/chat/imps_logging.php\").setData(p);\n        },\n        getOrderedList: function() {\n            return l;\n        },\n        logImpressions: function(o) {\n            var p = [], q = [];\n            if (i.get(\"chat_impression_logging_with_click\")) {\n                p = l.getCachedSortedList();\n                for (var r = 0; (r < p.length); r++) {\n                    q[r] = g.get(p[r]);;\n                };\n            }\n        ;\n            o.sorted_list = p.toString();\n            o.list_availability = q.toString();\n            new h(\"/ajax/chat/ct.php\", o).send();\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatTypeaheadConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        USER_TYPE: \"user\",\n        THREAD_TYPE: \"thread\",\n        FRIEND_TYPE: \"friend\",\n        NON_FRIEND_TYPE: \"non_friend\",\n        HEADER_TYPE: \"header\"\n    };\n    e.exports = g;\n});\n__d(\"Chat\", [\"Arbiter\",\"AvailableList\",\"ChatImpressionLogger\",\"ChatTypeaheadConstants\",\"MercuryParticipantTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"ChatImpressionLogger\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"MercuryParticipantTypes\");\n    function l(q, r) {\n        var s = (r && r.source);\n        if ((((((((s && (s === \"ordered_list\")) || (s === \"more_online_friends\")) || (s === \"online_friends\")) || (s === \"recent_threads_in_divebar_new\")) || (s === \"recent_threads_in_divebar\")) || (s === \"presence\")) || (s === \"typeahead\"))) {\n            r.viewport_width = document.body.clientWidth;\n            r.target = q;\n            r.target_presence = h.get(q);\n            i.logImpressions(r);\n        }\n    ;\n    };\n    var m = {\n        buddyListNub: \"buddylist-nub/initialized\",\n        sidebar: \"sidebar/initialized\"\n    };\n    function n(q, r) {\n        g.subscribe(m[q], function(event, s) {\n            r(s);\n        });\n    };\n    function o() {\n        return (((Math.random() * 2147483648) | 0)).toString(16);\n    };\n    var p = {\n        openTab: function(q, r, s) {\n            if (((window.External && window.External.Chat) && window.External.Chat.openWindow)) {\n                window.External.Chat.openWindow(q);\n            };\n            l.curry(q, s).defer();\n            d([\"MercuryThreads\",], function(t) {\n                if ((((!r || (r === k.FRIEND)) || (r === j.FRIEND_TYPE)) || (r === j.USER_TYPE))) {\n                    var u = t.get().getCanonicalThreadToUser(q), v = o();\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: u.thread_id,\n                        signature_id: v\n                    });\n                    return;\n                }\n            ;\n                if ((r === j.THREAD_TYPE)) {\n                    d([\"ChatOpenTab\",], function(w) {\n                        if (q) {\n                            w.openThread(q);\n                        }\n                         else w.openEmptyTab();\n                    ;\n                    });\n                };\n            });\n        },\n        openBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.show();\n                n(\"sidebar\", function(r) {\n                    r.enable();\n                });\n            });\n        },\n        closeBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.hide();\n            });\n        },\n        toggleSidebar: function() {\n            n(\"sidebar\", function(q) {\n                q.toggle();\n            });\n        },\n        goOnline: function(q) {\n            d([\"ChatVisibility\",], function(r) {\n                r.goOnline(q);\n            });\n        },\n        isOnline: function() {\n            var q = null;\n            d([\"ChatVisibility\",], function(r) {\n                q = r;\n            });\n            return (q && q.isOnline());\n        }\n    };\n    a.Chat = e.exports = p;\n}, 3);\n__d(\"OrderedFriendsList\", [\"AvailableList\",\"ChatConfig\",\"createArrayFrom\",\"ShortProfiles\",\"InitialChatFriendsList\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatConfig\"), i = b(\"createArrayFrom\"), j = b(\"ShortProfiles\"), k = [], l = {\n    }, m = [], n = {\n        contains: function(o) {\n            return (o in l);\n        },\n        compare: function(o, p) {\n            var q = n.getRank(o), r = n.getRank(p);\n            if ((q !== r)) {\n                return (q - r)\n            };\n            var s = j.getNowUnsafe(o), t = j.getNowUnsafe(p), u = ((((s || {\n            })).name || \"~\")).toLowerCase(), v = ((((t || {\n            })).name || \"~\")).toLowerCase();\n            if ((u !== v)) {\n                return ((u < v) ? -1 : 1)\n            };\n            return 0;\n        },\n        getList: function() {\n            if (h.get(\"chat_web_ranking_with_presence\")) {\n                n.reRank();\n            };\n            var o = i(k);\n            o = o.filter(function(p) {\n                var q = j.getNowUnsafe(p);\n                return (!q || (q.type == \"friend\"));\n            });\n            return o;\n        },\n        getRank: function(o) {\n            return ((o in l) ? l[o] : k.length);\n        },\n        reRank: function() {\n            var o = {\n            }, p = {\n            };\n            m.forEach(function(r, s) {\n                var t = r.substr(0, (r.length - 2)), u = r.substring((r.length - 1));\n                if ((typeof (p.uid) == \"undefined\")) {\n                    if ((typeof (o.uid) == \"undefined\")) {\n                        o[t] = g.get(t);\n                    };\n                    var v = o[t];\n                    if ((v == u)) {\n                        p[s] = t;\n                    };\n                }\n            ;\n            });\n            k = [];\n            for (var q in p) {\n                k.push(p[q]);;\n            };\n            k.forEach(function(r, s) {\n                l[r] = s;\n            });\n        }\n    };\n    (function() {\n        var o = b(\"InitialChatFriendsList\");\n        k = (o.list.length ? o.list : []);\n        if (h.get(\"chat_web_ranking_with_presence\")) {\n            m = k.slice();\n            n.reRank();\n        }\n    ;\n        k.forEach(function(p, q) {\n            l[p] = q;\n        });\n    })();\n    e.exports = (a.OrderedFriendsList || n);\n});\n__d(\"ChatSidebarConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LITESTAND_IMAGE_SIZE: 24,\n        LITESTAND_BLENDED_SIZE: 32,\n        IMAGE_SIZE: 28\n    };\n    e.exports = g;\n});\n__d(\"ChatTypeaheadBehavior\", [\"Chat\",\"ChatConfig\",\"ChatFavoriteList\",\"CSS\",\"DOM\",\"Rect\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Chat\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Rect\"), m = b(\"copyProperties\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n    m(o.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var p = this._typeahead;\n            this._subscriptions = [p.subscribe(\"focus\", function() {\n                p.getData().refreshData();\n            }),p.subscribe(\"blur\", function(q) {\n                p.getCore().reset();\n            }),p.subscribe(\"respond\", function(q, r) {\n                if ((r.value && (r.value === p.getCore().getValue()))) {\n                    if (!r.results.length) {\n                        var s = h.get(\"divebar_typeahead_group_fof\", 0);\n                        if ((s && !r.isAsync)) {\n                            return\n                        };\n                        var t = k.create(\"div\", {\n                            className: \"noResults\"\n                        }, \"Friend not found.\");\n                        k.setContent(p.getView().getElement(), t);\n                    }\n                ;\n                    j.addClass(p.getElement(), \"hasValue\");\n                }\n            ;\n            }),p.subscribe(\"reset\", function() {\n                j.removeClass(p.getElement(), \"hasValue\");\n            }),p.subscribe(\"select\", function(q, r) {\n                if (i.isEditMode()) {\n                    i.toggleID(r.selected.uid);\n                    i.save();\n                }\n                 else {\n                    var s = j.hasClass(document.documentElement, \"sidebarMode\"), t = {\n                        mode: (s ? \"sidebar\" : \"chatNub\"),\n                        source: \"typeahead\",\n                        type: r.selected.type,\n                        typeahead: true\n                    };\n                    g.openTab(r.selected.uid, r.selected.type, t);\n                }\n            ;\n            }),p.subscribe(\"highlight\", function(q, r) {\n                if ((r.index >= 0)) {\n                    var s = p.getView().getItems()[r.index];\n                    if (s) {\n                        var t = new l(s), u = s.offsetParent, v = t.boundWithin(new l(u)).getPositionVector();\n                        t.getPositionVector().sub(v).scrollElementBy(u);\n                    }\n                ;\n                }\n            ;\n            }),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(p) {\n                this._typeahead.unsubscribe(p);\n            }.bind(this));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatTypeaheadCore\", [\"function-extensions\",\"Class\",\"Event\",\"Keys\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"Event\"), i = b(\"Keys\"), j = b(\"TypeaheadCore\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"shield\");\n    function n(o) {\n        this.parent.construct(this, o);\n    };\n    g.extend(n, j);\n    k(n.prototype, {\n        init: function(o, p, q) {\n            this.parent.init(o, p, q);\n            this.informBeginActive = false;\n            this.informEndActive = false;\n            this.data.subscribe(\"respond\", function() {\n                if (this.informBeginActive) {\n                    this.informBeginActive = false;\n                    this.inform(\"sidebar/typeahead/active\", true);\n                }\n                 else if (this.informEndActive) {\n                    this.informEndActive = false;\n                    this.inform(\"sidebar/typeahead/active\", false);\n                }\n                \n            ;\n            }.bind(this));\n        },\n        handleTab: l,\n        keydown: function(event) {\n            var o = h.getKeyCode(event);\n            if ((o === i.ESC)) {\n                m(this.reset, this).defer();\n                return event.kill();\n            }\n        ;\n            return this.parent.keydown(event);\n        },\n        checkValue: function() {\n            var o = this.getValue(), p = this.value;\n            if ((o == p)) {\n                return\n            };\n            if ((p && !o)) {\n                this.typeaheadActive = false;\n                this.informEndActive = true;\n            }\n             else if ((!p && o)) {\n                this.typeaheadActive = true;\n                this.informBeginActive = true;\n                this.inform(\"sidebar/typeahead/preActive\");\n            }\n            \n        ;\n            this.parent.checkValue();\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatTypeaheadDataSource\", [\"Class\",\"DataSource\",\"Env\",\"JSLogger\",\"MercuryParticipantTypes\",\"OrderedFriendsList\",\"Run\",\"ShortProfiles\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"MercuryParticipantTypes\"), l = b(\"OrderedFriendsList\"), m = b(\"Run\"), n = b(\"ShortProfiles\"), o = b(\"copyProperties\");\n    function p(q) {\n        q = (q || {\n        });\n        q.kanaNormalization = true;\n        this.parent.construct(this, q);\n        this.persistOnRefresh = (q.persistOnRefresh !== false);\n        this.showOfflineUsers = !!q.showOfflineUsers;\n        this._jslog = j.create(\"chat_typeahead\");\n        this._jslog.log(\"created\");\n    };\n    g.extend(p, h);\n    o(p.prototype, {\n        init: function() {\n            this._jslog.log(\"init\");\n            this.parent.init();\n            this._update();\n        },\n        bootstrap: function() {\n            this._jslog.log(\"bootstrap\");\n            this.parent.bootstrap();\n            if (this.showOfflineUsers) {\n                this._jslog.log(\"show_offline_users\");\n                this._jslog.log(\"ensured_short_profiles\");\n                if (n.hasAll()) {\n                    this._update();\n                }\n                 else {\n                    this._jslog.log(\"fetch_all_short_profiles\");\n                    n.fetchAll();\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                    var q = n.subscribe(\"updated\", function() {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                        this._update();\n                    }.bind(this));\n                    if (!this.persistOnRefresh) {\n                        m.onLeave(function() {\n                            n.unsubscribe(q);\n                        });\n                    };\n                }\n            ;\n            }\n        ;\n        },\n        _update: function() {\n            d([\"AvailableList\",], function(q) {\n                var r = this.value;\n                this.dirty();\n                var s = n.getCachedProfileIDs(), t = s.filter(function(v) {\n                    var w = n.getNow(v);\n                    return (w.type === k.FRIEND);\n                });\n                t.sort(l.compare);\n                var u = [];\n                t.forEach(function(v) {\n                    if ((v == i.user)) {\n                        return\n                    };\n                    var w = q.get(v);\n                    if ((!this.showOfflineUsers && (w !== q.ACTIVE))) {\n                        return\n                    };\n                    var x = n.getNow(v), y = x.additionalName;\n                    if (x.hasOwnProperty(\"searchTokens\")) {\n                        y = ((y !== null) ? ((y + \" \") + x.searchTokens.join(\" \")) : x.searchTokens.join(\" \"));\n                    };\n                    u.push({\n                        uid: v,\n                        text: x.name,\n                        tokens: y,\n                        localized_text: x.name,\n                        additional_text: x.additionalName,\n                        photo: x.thumbSrc,\n                        type: x.type\n                    });\n                }.bind(this));\n                if (u.length) {\n                    this.addEntries(u);\n                };\n                this.value = r;\n                if (r) {\n                    this.query(r);\n                };\n            }.bind(this));\n        },\n        refreshData: function() {\n            d([\"AvailableList\",], function(q) {\n                q.update();\n            }.bind(this));\n        }\n    });\n    e.exports = p;\n});\n__d(\"ChatSidebarHeader.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"ReactChatSidebarHeader\",\n        render: function() {\n            return (g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__header\"\n            }, g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__headertext\"\n            }, this.props.name)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ChatSidebarItem.react\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"ChatSidebarConstants\",\"Image.react\",\"Link.react\",\"React\",\"SplitImage.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"ChatSidebarConstants\"), k = b(\"Image.react\"), l = b(\"Link.react\"), m = b(\"React\"), n = b(\"SplitImage.react\"), o = b(\"cx\"), p = b(\"ix\"), q = 9, r = m.createClass({\n        displayName: \"ChatSidebarItem\",\n        render: function() {\n            var s = ((((\"-cx-PRIVATE-chatSidebarItem__link\") + ((this.props.context ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__hascontext\") : \"\"))) + (((this.props.unreadCount && h.get(\"litestand_buddylist_count\")) ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__hasunreadcount\") : \"\")))), t;\n            if (this.props.litestandSidebar) {\n                t = m.DOM.div({\n                    \"aria-label\": this.props.name,\n                    className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-position\": \"right\"\n                });\n            };\n            return (l({\n                className: s,\n                href: this.props.href,\n                onClick: this.props.onClick,\n                rel: \"ignore\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__contents\"\n            }, this.renderFavorite(), m.DOM.div({\n                className: \"-cx-PUBLIC-chatSidebarItem__piccontainer\"\n            }, this.renderImage(), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__picborder\"\n            })), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__rightcontent\"\n            }, this.renderUnreadCount(), this.renderStatus()), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__name\"\n            }, this.props.name), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__context\"\n            }, this.props.context)), t));\n        },\n        renderFavorite: function() {\n            if ((this.props.isAdded === undefined)) {\n                return null\n            };\n            var s = null;\n            if (this.props.litestandSidebar) {\n                s = (this.props.isAdded ? p(\"/images/litestand/bookmarks/sidebar/remove.png\") : p(\"/images/litestand/bookmarks/sidebar/add.png\"));\n            }\n             else s = (this.props.isAdded ? p(\"/images/chat/delete.png\") : p(\"/images/chat/add.png\"));\n        ;\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__favoritebutton\") + ((!this.props.showEditButton ? (\" \" + \"hidden_elem\") : \"\"))));\n            return (m.DOM.div({\n                className: t,\n                onClick: this.props.onEditClick\n            }, k({\n                className: \"-cx-PRIVATE-chatSidebarItem__favoriteicon\",\n                src: s\n            })));\n        },\n        renderImage: function() {\n            var s = (this.props.imageSize || j.IMAGE_SIZE);\n            return n({\n                size: s,\n                srcs: this.props.images\n            });\n        },\n        renderUnreadCount: function() {\n            var s = this.props.unreadCount;\n            if ((!s || !h.get(\"litestand_buddylist_count\"))) {\n                return null\n            };\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__unreadcount\") + (((s > q) ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__largecount\") : \"\"))));\n            if ((s > q)) {\n                s = (q + \"+\");\n            };\n            return (m.DOM.div({\n                className: t\n            }, s));\n        },\n        renderStatus: function() {\n            var s = this.getStatusSrc();\n            if (!s) {\n                return null\n            };\n            if (((this.props.unreadCount && h.get(\"litestand_blended_sidebar\")) && h.get(\"litestand_buddylist_count\"))) {\n                return\n            };\n            var t = (h.get(\"divebar_favorite_list\", 0) && i.isEditMode());\n            if (t) {\n                return\n            };\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__status\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__statustime\"\n            }, this.props.statusTime), k({\n                className: \"-cx-PRIVATE-chatSidebarItem__statusicon\",\n                src: s\n            })));\n        },\n        getStatusSrc: function() {\n            switch (this.props.status) {\n              case g.ACTIVE:\n            \n              case g.IDLE:\n                if (this.props.litestandSidebar) {\n                    return (h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/online.png\") : p(\"/images/litestand/sidebar/online.png\"))\n                };\n                return p(\"/images/chat/status/online.png\");\n              case g.MOBILE:\n                if (this.props.litestandSidebar) {\n                    return (h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/pushable.png\") : p(\"/images/litestand/sidebar/pushable.png\"))\n                };\n                return p(\"/images/chat/status/mobile.png\");\n            };\n            return null;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatSidebarThread.react\", [\"ChatSidebarItem.react\",\"WebMessengerPermalinkConstants\",\"React\",\"MercuryThreadMetadataRawRenderer\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"React\"), j = b(\"MercuryThreadMetadataRawRenderer\"), k = i.createClass({\n        displayName: \"ChatSidebarThread\",\n        render: function() {\n            var n = this.props.name, o = l(this.props.threadID, this.props.participants), p = (n ? o : undefined), q = h.getURIPathForThreadID(this.props.threadID), r = m(this.props.image, this.props.participants), s = (n ? n : o);\n            return (g({\n                context: p,\n                href: {\n                    url: q\n                },\n                imageSize: this.props.imageSize,\n                images: r,\n                litestandSidebar: this.props.litestandSidebar,\n                name: s,\n                status: this.props.status,\n                unreadCount: this.props.unreadCount\n            }));\n        }\n    });\n    function l(n, o) {\n        return j.renderRawParticipantList(n, o, o.length, {\n            names_renderer: j.renderShortNames\n        });\n    };\n    function m(n, o) {\n        if (n) {\n            return n\n        };\n        return o.map(function(p) {\n            return p.image_src;\n        });\n    };\n    e.exports = k;\n});\n__d(\"ChatSidebarUser.react\", [\"ChatFavoriteList\",\"WebMessengerPermalinkConstants\",\"ChatConfig\",\"React\",\"ChatSidebarItem.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatFavoriteList\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"ChatConfig\"), j = b(\"React\"), k = b(\"ChatSidebarItem.react\"), l = j.createClass({\n        displayName: \"ChatSidebarUser\",\n        render: function() {\n            var m = h.getURIPathForIDOrVanity(this.props.userID), n = g.isFavored(this.props.userID), o = function() {\n                g.toggleID(this.props.userID);\n            }.bind(this), p = (i.get(\"divebar_favorite_list\", 0) ? n : undefined);\n            return (k({\n                href: {\n                    url: m\n                },\n                imageSize: this.props.imageSize,\n                images: this.props.image,\n                litestandSidebar: this.props.litestandSidebar,\n                isAdded: p,\n                showEditButton: g.isEditMode(),\n                name: this.props.name,\n                onEditClick: o,\n                status: this.props.status,\n                statusTime: this.props.statusTime,\n                context: this.props.context\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatTypeaheadRenderer\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatSidebarConstants\",\"ChatSidebarHeader.react\",\"ChatSidebarThread.react\",\"ChatSidebarUser.react\",\"ChatTypeaheadConstants\",\"DOM\",\"LastMobileActiveTimes\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarHeader.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"ChatSidebarUser.react\"), m = b(\"ChatTypeaheadConstants\"), n = b(\"DOM\"), o = b(\"LastMobileActiveTimes\"), p = b(\"MercuryParticipants\"), q = b(\"PresenceStatus\"), r = b(\"React\"), s = {\n    };\n    function t(z, aa) {\n        if (!((z in s))) {\n            s[z] = n.create(\"li\");\n        };\n        r.renderComponent(aa, s[z]);\n        return s[z];\n    };\n    function u(z) {\n        return t(z.text, j({\n            name: z.text\n        }));\n    };\n    function v() {\n        if ((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\"))) {\n            return (h.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE)\n        };\n        return i.IMAGE_SIZE;\n    };\n    function w(z) {\n        var aa = z.mercury_thread.participants.map(function(ba) {\n            return p.getUserID(ba);\n        });\n        return t(z.uid, k({\n            image: z.mercury_thread.image_src,\n            imageSize: v(),\n            litestandSidebar: (h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\")),\n            name: z.mercury_thread.name,\n            participants: z.participants_to_render,\n            status: q.getGroup(aa),\n            threadID: z.uid\n        }));\n    };\n    function x(z) {\n        var aa = q.get(z.uid), ba = (((aa === g.MOBILE)) ? o.getShortDisplay(z.uid) : null), ca = ((z.render_type == \"non_friend\") ? z.subtext : null);\n        return t(z.uid, l({\n            image: z.photo,\n            imageSize: v(),\n            litestandSidebar: h.get(\"litestand\", 0),\n            name: z.text,\n            status: aa,\n            statusTime: ba,\n            userID: z.uid,\n            context: ca\n        }));\n    };\n    function y(z, aa) {\n        if ((z.type === m.HEADER_TYPE)) {\n            return u(z)\n        };\n        if ((z.type == m.THREAD_TYPE)) {\n            return w(z)\n        };\n        return x(z);\n    };\n    e.exports = y;\n});\n__d(\"ChatTypeaheadView\", [\"BucketedTypeaheadView\",\"ChatConfig\",\"Class\",\"ChatTypeaheadConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"ChatConfig\"), i = b(\"Class\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"copyProperties\"), l = b(\"tx\"), m = h.get(\"divebar_typeahead_group_fof\", 0);\n    function n(o, p) {\n        this.parent.construct(this, o, p);\n        this.typeObjects = {\n        };\n        this.typeObjectsOrder = [];\n        this.typeObjects[j.NON_FRIEND_TYPE] = {\n            uid: j.NON_FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS OF FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.NON_FRIEND_TYPE);\n        this.typeObjects[j.THREAD_TYPE] = {\n            uid: j.THREAD_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"GROUP CONVERSATIONS\"\n        };\n        this.typeObjectsOrder.push(j.THREAD_TYPE);\n        this.typeObjects[j.FRIEND_TYPE] = {\n            disabled: true,\n            uid: j.FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.FRIEND_TYPE);\n    };\n    i.extend(n, g);\n    k(n.prototype, {\n        buildBuckets: function(o, p) {\n            if (m) {\n                p = p.reverse();\n            };\n            p = this.parent.buildBuckets(o, p);\n            if (!m) {\n                p = p.filter(function(q) {\n                    return (q && !q.disabled);\n                });\n            };\n            return p;\n        },\n        getDefaultIndex: function(o) {\n            if (!m) {\n                return this.parent.getDefaultIndex(o)\n            };\n            if ((o.length === 0)) {\n                return -1\n            };\n            var p = (o.length - 1);\n            while ((!this.isHighlightable(o[p]) && (p >= 0))) {\n                p--;;\n            };\n            return p;\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ChatTypeaheadBehavior\", [\"ChatTypeaheadBehavior\",], function(a, b, c, d) {\n    var e = b(\"ChatTypeaheadBehavior\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.chatTypeahead = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:cookie\", [\"Cookie\",], function(a, b, c, d) {\n    var e = b(\"Cookie\");\n    a.getCookie = e.get;\n    a.setCookie = e.set;\n    a.clearCookie = e.clear;\n}, 3);\n__d(\"LayerHideOnSuccess\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._layer.hide.bind(this._layer));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = h;\n});\n__d(\"Overlay\", [\"Class\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerButtons\",\"LayerDestroyOnHide\",\"LayerFadeOnHide\",\"LayerFadeOnShow\",\"LayerFormHooks\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"LayerHideOnSuccess\",\"LayerHideOnTransition\",\"LayerTabIsolation\",\"LayerMouseHooks\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Layer\"), l = b(\"LayerButtons\"), m = b(\"LayerDestroyOnHide\"), n = b(\"LayerFadeOnHide\"), o = b(\"LayerFadeOnShow\"), p = b(\"LayerFormHooks\"), q = b(\"LayerHideOnBlur\"), r = b(\"LayerHideOnEscape\"), s = b(\"LayerHideOnSuccess\"), t = b(\"LayerHideOnTransition\"), u = b(\"LayerTabIsolation\"), v = b(\"LayerMouseHooks\"), w = b(\"copyProperties\");\n    function x(y, z) {\n        y = w({\n            buildWrapper: true\n        }, (y || {\n        }));\n        this._shouldBuildWrapper = y.buildWrapper;\n        this.parent.construct(this, y, z);\n    };\n    g.extend(x, k);\n    w(x.prototype, {\n        _configure: function(y, z) {\n            this.parent._configure(y, z);\n            var aa = this.getRoot();\n            this._overlay = (j.scry(aa, \"div.uiOverlay\")[0] || aa);\n            h.hide(aa);\n            j.appendContent(this.getInsertParent(), aa);\n            i.set(this._overlay, \"overlay\", this);\n            var ba = i.get(this._overlay, \"width\");\n            (ba && this.setWidth(ba));\n            if (this.setFixed) {\n                this.setFixed((i.get(this._overlay, \"fixed\") == \"true\"));\n            };\n            if ((i.get(this._overlay, \"fadeonshow\") != \"false\")) {\n                this.enableBehavior(o);\n            };\n            if ((i.get(this._overlay, \"fadeonhide\") != \"false\")) {\n                this.enableBehavior(n);\n            };\n            if ((i.get(this._overlay, \"hideonsuccess\") != \"false\")) {\n                this.enableBehavior(s);\n            };\n            if ((i.get(this._overlay, \"hideonblur\") == \"true\")) {\n                this.enableBehavior(q);\n            };\n            if ((i.get(this._overlay, \"destroyonhide\") != \"false\")) {\n                this.enableBehavior(m);\n            };\n            return this;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([l,p,v,r,t,u,]);\n        },\n        initWithoutBuildingWrapper: function() {\n            this._shouldBuildWrapper = false;\n            return this.init.apply(this, arguments);\n        },\n        _buildWrapper: function(y, z) {\n            z = this.parent._buildWrapper(y, z);\n            if (!this._shouldBuildWrapper) {\n                this._contentRoot = z;\n                return z;\n            }\n        ;\n            this._contentRoot = j.create(\"div\", {\n                className: \"uiOverlayContent\"\n            }, z);\n            return j.create(\"div\", {\n                className: \"uiOverlay\"\n            }, this._contentRoot);\n        },\n        getContentRoot: function() {\n            return this._contentRoot;\n        },\n        destroy: function() {\n            i.remove(this.getRoot(), \"overlay\");\n            this.parent.destroy();\n        }\n    });\n    e.exports = x;\n});\n__d(\"ReminderStory\", [\"AsyncRequest\",\"endsWith\",\"Event\",\"DOMQuery\",\"ScrollableArea\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"endsWith\"), i = b(\"Event\"), j = b(\"DOMQuery\"), k = b(\"ScrollableArea\");\n    function l(m, n, o) {\n        i.listen(m, \"click\", function(p) {\n            n.show();\n            if (o) {\n                var q = {\n                    context_data: o\n                };\n                new g().setURI(\"/growth/reminder/logging.php\").setData(q).send();\n            }\n        ;\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.scry(p, \".inlineReplyTextArea\");\n            if ((q.length > 0)) {\n                q[0].focus();\n            };\n            var r = j.scry(p, \".jewelItemNew\"), s = [];\n            for (var t in r) {\n                var u = r[t].getAttribute(\"id\");\n                if ((u && h(u, \"_1_req\"))) {\n                    s = s.concat(u.replace(\"_1_req\", \"\"));\n                };\n            };\n            if ((s.length > 0)) {\n                new g().setURI(\"/friends/requests/log_impressions\").setData({\n                    ids: s.join(\",\"),\n                    ref: \"reminder_box\"\n                }).send();\n            };\n            var v = j.find(p, \"#SuggestBelowInvite\");\n            if (v) {\n                new g().setURI(\"/ajax/pages/reminder/recommendations\").send();\n            };\n            k.poke(j.scry(p, \".uiScrollableArea\")[0]);\n        });\n    };\n    e.exports = l;\n});\n__d(\"ContextualDialogFooterLink\", [\"Event\",\"copyProperties\",\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"DOM\");\n    function k(l) {\n        this._layer = l;\n    };\n    h(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var l = this._layer.getRoot(), m = j.scry(l, \".uiContextualDialogFooterLink\")[0], n = \"uiContextualDialogHoverFooterArrow\";\n            this._subscriptions = [g.listen(m, \"mouseenter\", i.addClass.curry(l, n)),g.listen(m, \"mouseleave\", i.removeClass.curry(l, n)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(l) {\n                l.remove();\n            });\n            this._subscriptions = null;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LegacyContextualDialog\", [\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"Bootloader\",\"Class\",\"ContextualDialogFooterLink\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Locale\",\"Overlay\",\"Parent\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"getOverlayZIndex\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ARIA\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ContextualDialogFooterLink\"), m = b(\"ContextualThing\"), n = b(\"CSS\"), o = b(\"DataStore\"), p = b(\"DOM\"), q = b(\"Event\"), r = b(\"Locale\"), s = b(\"Overlay\"), t = b(\"Parent\"), u = b(\"Style\"), v = b(\"Vector\"), w = b(\"$\"), x = b(\"copyProperties\"), y = b(\"getOverlayZIndex\"), z = b(\"shield\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n    k.extend(aa, s);\n    x(aa, h, {\n        ARROW_OFFSET: 15,\n        ARROW_LENGTH: 16,\n        ARROW_INSET: 22,\n        TOP_MARGIN: 50,\n        BOTTOM_MARGIN: 30,\n        LEFT_MARGIN: 15,\n        RIGHT_MARGIN: 30,\n        MIN_TOP_GAP: 5,\n        POSITION_TO_CLASS: {\n            above: \"uiContextualDialogAbove\",\n            below: \"uiContextualDialogBelow\",\n            left: \"uiContextualDialogLeft\",\n            right: \"uiContextualDialogRight\"\n        },\n        RIGHT_ALIGNED_CLASS: \"uiContextualDialogRightAligned\",\n        ARROW_CLASS: {\n            bottom: \"uiContextualDialogArrowBottom\",\n            top: \"uiContextualDialogArrowTop\",\n            right: \"uiContextualDialogArrowRight\",\n            left: \"uiContextualDialogArrowLeft\"\n        },\n        POSITION_TO_ARROW: {\n            above: \"bottom\",\n            below: \"top\",\n            left: \"right\",\n            right: \"left\"\n        },\n        getInstance: function(ba) {\n            var ca = o.get(ba, \"LegacyContextualDialog\");\n            if (!ca) {\n                var da = t.byClass(ba, \"uiOverlay\");\n                if (da) {\n                    ca = o.get(da, \"overlay\");\n                };\n            }\n        ;\n            return ca;\n        }\n    });\n    x(aa.prototype, {\n        _scrollListener: null,\n        _scrollParent: null,\n        _width: null,\n        _fixed: false,\n        _hasFooter: false,\n        _showSubscription: null,\n        _hideSubscription: null,\n        _setContextSubscription: null,\n        _resizeListener: null,\n        _reflowSubscription: null,\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            var da = this.getRoot(), ea = o.get.curry(da);\n            this.setAlignH(ea(\"alignh\", \"left\"));\n            this.setOffsetX(ea(\"offsetx\", 0));\n            this.setOffsetY(ea(\"offsety\", 0));\n            this.setPosition(ea(\"position\", \"above\"));\n            this._hasFooter = ea(\"hasfooter\", false);\n            if (this._hasFooter) {\n                var fa = p.scry(da, \".uiContextualDialogFooterLink\")[0];\n                (fa && this.enableBehavior(l));\n            }\n        ;\n            this._setContextSubscription = this.subscribe(\"beforeshow\", function() {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n                var ha = ea(\"context\");\n                if (ha) {\n                    this.setContext(w(ha));\n                }\n                 else {\n                    ha = ea(\"contextselector\");\n                    if (ha) {\n                        this.setContext(p.find(document, ha));\n                    };\n                }\n            ;\n            }.bind(this));\n            this._content = p.scry(da, \".uiContextualDialogContent\")[0];\n            if (this._content) {\n                this._content.setAttribute(\"role\", \"dialog\");\n                var ga = p.scry(this._content, \".legacyContextualDialogTitle\")[0];\n                if (ga) {\n                    this._content.setAttribute(\"aria-labelledby\", p.getID(ga));\n                };\n            }\n        ;\n            this._showSubscription = this.subscribe(\"show\", function() {\n                var ha = z(this.updatePosition, this);\n                this._resizeListener = q.listen(window, \"resize\", ha);\n                this._reflowSubscription = g.subscribe(\"reflow\", ha);\n                this._setupScrollListener(this._scrollParent);\n                m.register(da, this.context);\n                g.inform(\"layer_shown\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            this._hideSubscription = this.subscribe(\"hide\", function() {\n                this._teardownResizeAndReflowListeners();\n                this._teardownScrollListener();\n                g.inform(\"layer_hidden\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            return this;\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = this.parent._buildWrapper(ba, ca);\n            if (!this._shouldBuildWrapper) {\n                return da\n            };\n            n.addClass(da, \"uiContextualDialog\");\n            return p.create(\"div\", {\n                className: \"uiContextualDialogPositioner\"\n            }, da);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            return this;\n        },\n        setFixed: function(ba) {\n            ba = !!ba;\n            n.conditionClass(this.getRoot(), \"uiContextualDialogFixed\", ba);\n            this._fixed = ba;\n            return this;\n        },\n        setAlignH: function(ba) {\n            this.alignH = ba;\n            this._updateAlignmentClass();\n            (this._shown && this.updatePosition());\n            (this.position && this._updateArrow());\n            return this;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            return this.context;\n        },\n        setContext: function(ba) {\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n            ba = w(ba);\n            if ((this.context && (this.context != ba))) {\n                o.remove(this.context, \"LegacyContextualDialog\");\n            };\n            this.context = ba;\n            i.setPopup(this.getCausalElement(), this.getRoot());\n            var ca = t.byClass(ba, \"fbPhotoSnowlift\");\n            this.setInsertParent((ca || document.body));\n            if ((this._scrollListener && (this._scrollParent !== ca))) {\n                this._teardownScrollListener();\n                this._setupScrollListener(ca);\n            }\n        ;\n            this._scrollParent = ca;\n            var da = y(ba, this._insertParent);\n            u.set(this.getRoot(), \"z-index\", ((da > 200) ? da : \"\"));\n            o.set(this.context, \"LegacyContextualDialog\", this);\n            return this;\n        },\n        getCausalElement: function() {\n            return (this.parent.getCausalElement() || this.context);\n        },\n        listen: function(ba, ca) {\n            return q.listen(this.getRoot(), ba, ca);\n        },\n        setOffsetX: function(ba) {\n            this.offsetX = (parseInt(ba, 10) || 0);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setOffsetY: function(ba) {\n            this.offsetY = (parseInt(ba, 10) || 0);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setPosition: function(ba) {\n            this.position = ba;\n            for (var ca in aa.POSITION_TO_CLASS) {\n                n.conditionClass(this.getRoot(), aa.POSITION_TO_CLASS[ca], (ba == ca));;\n            };\n            this._updateAlignmentClass();\n            (this._shown && this.updatePosition());\n            this._updateArrow();\n            return this;\n        },\n        updatePosition: function() {\n            if (!this.context) {\n                return false\n            };\n            if (this._width) {\n                u.set(this._overlay, \"width\", (this._width + \"px\"));\n            };\n            var ba = (this._fixed ? \"viewport\" : \"document\"), ca = v.getElementPosition(this.context, ba), da = this._scrollParent;\n            if (da) {\n                ca = ca.sub(v.getElementPosition(da, \"document\")).add(da.scrollLeft, da.scrollTop);\n            };\n            var ea = v.getElementDimensions(this.context), fa = ((this.position == \"above\") || (this.position == \"below\")), ga = r.isRTL();\n            if (((((this.position == \"right\") || ((fa && (this.alignH == \"right\"))))) != ga)) {\n                ca = ca.add(ea.x, 0);\n            };\n            if ((this.position == \"below\")) {\n                ca = ca.add(0, ea.y);\n            };\n            var ha = new v(0, 0);\n            if ((fa && (this.alignH == \"center\"))) {\n                ha = ha.add((((ea.x - this._width)) / 2), 0);\n            }\n             else {\n                var ia = (fa ? ea.x : ea.y), ja = (2 * aa.ARROW_INSET);\n                if ((ia < ja)) {\n                    var ka = ((ia / 2) - aa.ARROW_INSET);\n                    if ((fa && (((this.alignH == \"right\") != ga)))) {\n                        ka = -ka;\n                    };\n                    ha = ha.add((fa ? ka : 0), (fa ? 0 : ka));\n                }\n            ;\n            }\n        ;\n            ha = ha.add(this.offsetX, this.offsetY);\n            if (ga) {\n                ha = ha.mul(-1, 1);\n            };\n            ca = ca.add(ha);\n            if (this._fixed) {\n                ca = new v(ca.x, ca.y, \"document\");\n            };\n            ca.setElementPosition(this.getRoot());\n            this._adjustVerticalPosition();\n            this._adjustHorizontalPosition();\n            return true;\n        },\n        scrollTo: function() {\n            if (this.context) {\n                j.loadModules([\"DOMScroll\",], function(ba) {\n                    ba.scrollTo(this.context, true, true);\n                }.bind(this));\n            };\n        },\n        destroy: function() {\n            this.unsubscribe(this._showSubscription);\n            this.unsubscribe(this._hideSubscription);\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n            this._teardownScrollListener();\n            this._teardownResizeAndReflowListeners();\n            (this.context && o.remove(this.context, \"LegacyContextualDialog\"));\n            this.parent.destroy();\n        },\n        _adjustVerticalPosition: function() {\n            if (((this.position != \"left\") && (this.position != \"right\"))) {\n                u.set(this._overlay, \"top\", \"\");\n                return;\n            }\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").y, da = v.getElementDimensions(this._overlay).y, ea = v.getViewportDimensions().y, fa = Math.min(Math.max(ca, aa.MIN_TOP_GAP), aa.TOP_MARGIN), ga = Math.min(Math.max(0, (((ca + da) + aa.BOTTOM_MARGIN) - ea)), Math.max(-fa, (ca - fa)), (da - (2 * aa.ARROW_INSET)));\n            u.set(this._overlay, \"top\", (((-1 * ga)) + \"px\"));\n            u.set(this._arrow, \"top\", (aa.ARROW_OFFSET + \"px\"));\n            u.set(this._arrow, \"marginTop\", (ga + \"px\"));\n        },\n        _adjustHorizontalPosition: function() {\n            if (((((this.position != \"above\") && (this.position != \"below\"))) || (this.alignH != \"left\"))) {\n                u.set(this._overlay, \"left\", \"\");\n                u.set(this._overlay, \"right\", \"\");\n                return;\n            }\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").x, da = v.getElementDimensions(this._overlay).x, ea = v.getViewportDimensions().x, fa = r.isRTL(), ga;\n            if (!fa) {\n                ga = (((ca + da) + aa.RIGHT_MARGIN) - ea);\n            }\n             else ga = ((aa.LEFT_MARGIN + da) - ca);\n        ;\n            ga = Math.min(Math.max(0, ga), (da - (2 * aa.ARROW_INSET)));\n            u.set(this._overlay, (fa ? \"right\" : \"left\"), ((-1 * ga) + \"px\"));\n            u.set(this._arrow, (fa ? \"right\" : \"left\"), (aa.ARROW_OFFSET + \"px\"));\n            u.set(this._arrow, (fa ? \"marginRight\" : \"marginLeft\"), (ga + \"px\"));\n        },\n        _updateArrow: function() {\n            var ba = 0;\n            if (((this.position == \"above\") || (this.position == \"below\"))) {\n                switch (this.alignH) {\n                  case \"center\":\n                    ba = 50;\n                    break;\n                  case \"right\":\n                    ba = 100;\n                    break;\n                }\n            };\n            this._renderArrow(aa.POSITION_TO_ARROW[this.position], ba);\n        },\n        _renderArrow: function(ba, ca) {\n            for (var da in aa.ARROW_CLASS) {\n                n.conditionClass(this._overlay, aa.ARROW_CLASS[da], (ba == da));;\n            };\n            n.conditionClass(this._overlay, \"uiContextualDialogWithFooterArrowBottom\", ((ba == \"bottom\") && this._hasFooter));\n            if ((ba == \"none\")) {\n                return\n            };\n            if (!this._arrow) {\n                this._arrow = p.create(\"i\", {\n                    className: \"uiContextualDialogArrow\"\n                });\n                p.appendContent(this._overlay, this._arrow);\n            }\n        ;\n            u.set(this._arrow, \"top\", \"\");\n            u.set(this._arrow, \"left\", \"\");\n            u.set(this._arrow, \"right\", \"\");\n            u.set(this._arrow, \"margin\", \"\");\n            var ea = ((ba == \"top\") || (ba == \"bottom\")), fa = (ea ? ((r.isRTL() ? \"right\" : \"left\")) : \"top\");\n            ca = (ca || 0);\n            u.set(this._arrow, fa, (ca + \"%\"));\n            var ga = (aa.ARROW_LENGTH + (aa.ARROW_OFFSET * 2)), ha = -((((ga * ca) / 100) - aa.ARROW_OFFSET));\n            u.set(this._arrow, (\"margin-\" + fa), (ha + \"px\"));\n        },\n        _updateAlignmentClass: function() {\n            n.conditionClass(this.getRoot(), aa.RIGHT_ALIGNED_CLASS, ((((this.position == \"above\") || (this.position == \"below\"))) && (this.alignH == \"right\")));\n        },\n        _setupScrollListener: function(ba) {\n            this._scrollListener = q.listen((ba || window), \"scroll\", z(this._adjustVerticalPosition, this));\n        },\n        _teardownScrollListener: function() {\n            if (this._scrollListener) {\n                this._scrollListener.remove();\n                this._scrollListener = null;\n            }\n        ;\n        },\n        _teardownResizeAndReflowListeners: function() {\n            if (this._resizeListener) {\n                this._resizeListener.remove();\n                this._resizeListener = null;\n            }\n        ;\n            if (this._reflowSubscription) {\n                this._reflowSubscription.unsubscribe();\n                this._reflowSubscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = aa;\n});\n__d(\"TooltipLink\", [\"Parent\",\"Tooltip\",], function(a, b, c, d, e, f) {\n    var g = b(\"Parent\"), h = b(\"Tooltip\"), i = {\n        setTooltipText: function(j, k) {\n            j = g.byTag(j, \"a\");\n            (j && h.set(j, k));\n        }\n    };\n    e.exports = i;\n});");
// 12459
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s0d1de09b44c3537bfabe8ad8e0b26687acac24d6");
// 12460
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"EzMPG\",]);\n}\n;\n;\n__d(\"ChannelSubdomain\", [\"Cookie\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"JSLogger\"), i = h.create(\"channel\"), j = 7, k = null;\n    function l(o, p) {\n        var q = null, r = m(), s;\n        o--;\n        var t = Math.min(32, ((j * o)));\n        t = Math.max(t, 1);\n        var u = false;\n        for (var v = 0; ((v < 32)); v++) {\n            s = ((((v + p)) % t));\n            if (!((r & ((1 << s))))) {\n                u = true;\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        if (u) {\n            k = s;\n            q = ((k % j));\n            g.set(\"sub\", ((r | ((1 << k)))));\n        }\n         else {\n            k = -1;\n            q = null;\n            i.error(\"subdomain_overflow\", {\n                slot: k,\n                max: o\n            });\n        }\n    ;\n    ;\n        return q;\n    };\n;\n    function m() {\n        var o = ((g.get(\"sub\") || 0));\n        o = parseInt(o, 10);\n        return ((isNaN(o) ? 0 : o));\n    };\n;\n    function n() {\n        if (((((k !== null)) && ((k >= 0))))) {\n            var o = ((m() & ~((1 << k))));\n            if (o) {\n                g.set(\"sub\", o);\n            }\n             else g.clear(\"sub\");\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        allocate: l,\n        clear: n\n    };\n});\n__d(\"DocRPC\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = {\n        _apis: {\n        },\n        _dispatch: function(i) {\n            var j;\n            try {\n                i = JSON.parse(i);\n            } catch (k) {\n                throw new Error(((((\"DocRPC unparsable dispatch: \\\"\" + i)) + \"\\\"\")));\n            };\n        ;\n            if (h._apis.hasOwnProperty(i.api)) {\n                var l = h._apis[i.api];\n                if (l[i.method]) {\n                    j = g.applyWithGuard(l[i.method], l, i.args);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((j === undefined))) {\n                j = null;\n            }\n        ;\n        ;\n            return JSON.stringify(j);\n        },\n        publish: function(i, j) {\n            h._apis[j] = i;\n        },\n        proxy: function(i, j, k) {\n            var l = {\n            };\n            k.forEach(function(m) {\n                l[m] = function() {\n                    var n = {\n                        api: j,\n                        method: m,\n                        args: Array.prototype.slice.call(arguments)\n                    }, o;\n                    try {\n                        if (i.JSBNG__closed) {\n                            throw new Error(\"DocRPC window closed\");\n                        }\n                    ;\n                    ;\n                        o = i.DocRPC._dispatch(JSON.stringify(n));\n                    } catch (p) {\n                        g.reportError(p);\n                        return;\n                    };\n                ;\n                    if (((typeof (o) == \"string\"))) {\n                        try {\n                            o = JSON.parse(o);\n                        } catch (p) {\n                            throw new Error(((((((((((((\"DocRPC \" + j)) + \".\")) + m)) + \" unparsable return: \\\"\")) + o)) + \"\\\"\")));\n                        };\n                    }\n                ;\n                ;\n                    return o;\n                };\n            });\n            return l;\n        }\n    };\n    e.exports = a.DocRPC = h;\n});\n__d(\"ChannelTransport\", [\"copyProperties\",\"bind\",\"AjaxRequest\",\"URI\",\"JSLogger\",\"DocRPC\",\"ChannelConstants\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"bind\"), i = b(\"AjaxRequest\"), j = b(\"URI\"), k = b(\"JSLogger\"), l = b(\"DocRPC\"), m = b(\"ChannelConstants\"), n = b(\"UserAgent\"), o = k.create(\"channel\");\n    function p() {\n        return ((((1048576 * Math.JSBNG__random())) | 0)).toString(36);\n    };\n;\n    function q(y, z) {\n        var aa = y.subdomain;\n        aa = ((((aa === null)) ? \"\" : ((aa + \"-\"))));\n        var ba = new j(z).setDomain(((((aa + y.host)) + \".facebook.com\"))).setPort(y.port).setSecure(j().isSecure());\n        return ba;\n    };\n;\n    function r(y) {\n        var z = {\n            partition: y.partition,\n            cb: p()\n        }, aa = q(y, \"/p\").setQueryData(z);\n        o.log(\"start_p\", {\n            uri: aa.toString()\n        });\n        var ba = new i(\"GET\", aa);\n        if (i.supportsCORS()) {\n            ba.xhr.withCredentials = true;\n        }\n    ;\n    ;\n        var ca = function(da) {\n            o.log(\"finish_p\", {\n                xhr: ((da.toJSON ? da.toJSON() : da))\n            });\n        };\n        ba.timeout = y.P_TIMEOUT;\n        ba.onError = ba.onSuccess = ca;\n        ba.send();\n    };\n;\n    function s(y, z, aa) {\n        var ba = new JSBNG__Image(), ca = 0, da = function(ga) {\n            ba.abort();\n            return ((ga ? z() : aa()));\n        };\n        ba.JSBNG__onload = function() {\n            o.log(\"ping_ok\", {\n                duration: ((JSBNG__Date.now() - ca))\n            });\n            da(true);\n        };\n        ba.JSBNG__onerror = function() {\n            r(y);\n            da(false);\n        };\n        var ea = JSBNG__setTimeout(ba.JSBNG__onerror, 10000, false);\n        ba.abort = function() {\n            if (ea) {\n                JSBNG__clearTimeout(ea);\n                ea = null;\n            }\n        ;\n        ;\n            ba.JSBNG__onload = ba.JSBNG__onerror = null;\n        };\n        var fa = {\n            partition: y.partition,\n            cb: p()\n        };\n        ca = JSBNG__Date.now();\n        ba.src = q(y, \"/ping\").setQueryData(fa);\n        return ba;\n    };\n;\n    function t(y, z, aa, ba) {\n        var ca = new JSBNG__Date(), da = ((((((ca - y.userActive)) / 1000)) | 0));\n        if (((da < 0))) {\n            o.warn(\"idle_regression\", {\n                idleTime: da,\n                now: ca.getTime(),\n                userActive: y.userActive\n            });\n        }\n    ;\n    ;\n        var ea = {\n            channel: y.user_channel,\n            seq: y.seq,\n            partition: y.partition,\n            clientid: y.sessionID,\n            cb: p(),\n            idle: da,\n            cap: 0\n        };\n        if (((da < 60))) {\n            ea.state = \"active\";\n        }\n    ;\n    ;\n        if (y.streamingCapable) {\n            ea.mode = \"stream\";\n            ea.format = \"json\";\n        }\n    ;\n    ;\n        if (y.profile) {\n            ea.profile = y.profile;\n        }\n    ;\n    ;\n        if (((y.webrtcSupport && ((((n.chrome() >= 24)) || ((n.firefox() >= 22))))))) {\n            ea.cap = m.CAPABILITY_VOIP;\n        }\n    ;\n    ;\n        var fa = q(y, \"/pull\").setQueryData(ea), ga = new i(\"GET\", fa);\n        if (i.supportsCORS()) {\n            ga.xhr.withCredentials = true;\n        }\n    ;\n    ;\n        ga.timeout = ((y.streamingCapable ? y.STREAMING_TIMEOUT : y.LONGPOLL_TIMEOUT));\n        ga.onJSON = z;\n        ga.onSuccess = aa;\n        ga.onError = function() {\n            var ha = ((((((this.JSBNG__status == 12002)) && ((this._time >= y.MIN_12002_TIMEOUT)))) || ((((this.JSBNG__status == 504)) && ((this._time >= y.MIN_504_TIMEOUT)))))), ia = ((ha ? aa : ba));\n            return ((ia && ia.apply(this, arguments)));\n        };\n        ga.send();\n        y.inStreaming = y.streamingCapable;\n        return ga;\n    };\n;\n    function u(y) {\n        this.manager = y;\n        ((this.init && this.init()));\n    };\n;\n    function v(y) {\n        u.apply(this, arguments);\n    };\n;\n    g(v.prototype, {\n        logName: \"CORS\",\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n        ;\n            if (((y == \"init\"))) {\n                JSBNG__setTimeout(h(this.manager, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), 3000, false);\n            }\n        ;\n        ;\n            if (!/pull|ping/.test(y)) {\n                return;\n            }\n        ;\n        ;\n            var aa = this.manager;\n            if (((y == \"ping\"))) {\n                this._request = s(z, h(aa, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if (((y == \"pull\"))) {\n                this._request = t(z, h(aa, \"_processTransportData\", z.stateId), h(aa, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n            \n        ;\n        ;\n        }\n    });\n    function w(y) {\n        o.log(\"iframe_init_constructor\");\n        u.apply(this, arguments);\n        this._iframe = JSBNG__document.createElement(\"div\");\n        this._iframe.style.display = \"none\";\n        JSBNG__document.body.appendChild(this._iframe);\n        l.publish(this, \"outerTransport\");\n    };\n;\n    g(w.prototype, {\n        logName: \"div\",\n        _initIframe: function(y) {\n            o.log(\"iframe_init_start\");\n            window.onchanneliframeready = function() {\n                o.log(\"iframe_resources\");\n                return y.resources;\n            };\n            window.onchanneliframeloaded = function() {\n                o.log(\"iframe_loaded\");\n            };\n            if (y) {\n                this._iframeURI = q(y, y.path);\n                if (y.bustIframe) {\n                    var z = {\n                        partition: y.partition,\n                        cb: p()\n                    };\n                    this._iframeURI.setQueryData(z);\n                }\n            ;\n            ;\n            }\n             else this._iframeURI = \"about:blank\";\n        ;\n        ;\n            this._iframeProxy = null;\n            try {\n                this._iframe.contentWindow.JSBNG__location.replace(this._iframeURI);\n                o.log(\"iframe_uri_set\");\n            } catch (aa) {\n                o.error(\"iframe_uri_set_error\", aa);\n                this.exitState({\n                    JSBNG__status: m.ERROR,\n                    stateId: y.stateId\n                }, ((aa + \"\")));\n            };\n        ;\n        },\n        enterState: function(y, z) {\n            if (((y == \"init\"))) {\n                this._initIframe(z);\n            }\n             else if (/idle|ping|pull/.test(y)) {\n                if (this._iframeProxy) {\n                    this._iframeProxy.enterState.apply(this._iframeProxy, arguments);\n                }\n                 else if (((y != \"idle\"))) {\n                    this.exitState({\n                        JSBNG__status: m.ERROR,\n                        stateId: z.stateId\n                    }, \"iframe not yet loaded\");\n                }\n                \n            ;\n            ;\n            }\n             else if (((y == \"shutdown\"))) {\n                this._initIframe();\n            }\n            \n            \n        ;\n        ;\n        },\n        _processTransportData: function() {\n            this.manager._processTransportData.apply(this.manager, arguments);\n        },\n        exitState: function(y) {\n            if (((((this.manager.state == \"init\")) && ((y.JSBNG__status == m.OK))))) {\n                this._iframeProxy = l.proxy(this._iframe.contentWindow, \"innerTransport\", [\"enterState\",], ((this._iframeURI + \"\")).replace(/iframe.*/, \"\"));\n            }\n        ;\n        ;\n            if (((/ping|pull/.test(this.manager.state) && !this._iframeProxy))) {\n                return;\n            }\n        ;\n        ;\n            this.manager.exitState.apply(this.manager, arguments);\n        }\n    });\n    function x() {\n        this.init = this.init.bind(this);\n        u.apply(this, arguments);\n    };\n;\n    g(x.prototype, {\n        logName: \"iframe(inner)\",\n        init: function() {\n            l.publish(this, \"innerTransport\");\n            try {\n                var z = l.proxy(window.parent, \"outerTransport\", [\"_processTransportData\",\"exitState\",], JSBNG__top.DocRPC.origin);\n                g(this, z);\n                this.exitState({\n                    JSBNG__status: m.OK,\n                    stateId: 1000000\n                });\n            } catch (y) {\n                o.error(\"iframe_inner_init_error\", y);\n            };\n        ;\n        },\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n        ;\n            if (((y == \"ping\"))) {\n                this._request = s(z, h(this, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if (((y == \"pull\"))) {\n                this._request = t(z, h(this, \"_processTransportData\", z.stateId), h(this, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n            \n        ;\n        ;\n        }\n    });\n    e.exports = {\n        getURI: q,\n        Transport: u,\n        CORSTransport: v,\n        IframeTransport: w,\n        IframeInnerTransport: x\n    };\n});\n__d(\"MovingStat\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        h = ((h || 60000));\n        var i = {\n            t: new JSBNG__Date(),\n            count: 0,\n            v: 0\n        }, j = i, k = 0, l = 0;\n        function m() {\n            var n = ((new JSBNG__Date() - h));\n            while (((((j && j.next)) && ((j.t < n))))) {\n                k -= j.v;\n                l -= j.count;\n                j = j.next;\n            };\n        ;\n        };\n    ;\n        this.add = function(n) {\n            k += n;\n            l++;\n            var o = new JSBNG__Date();\n            if (((((o - i.t)) < 1000))) {\n                i.v += n;\n                i.count++;\n            }\n             else {\n                i.next = {\n                    t: o,\n                    v: n,\n                    count: 1\n                };\n                i = i.next;\n                m();\n            }\n        ;\n        ;\n        };\n        this.tally = function(n) {\n            n = ((n || 1000));\n            m();\n            return {\n                sum: k,\n                count: l,\n                timeAverage: ((((k * n)) / h))\n            };\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"ChannelManager\", [\"JSBNG__Event\",\"function-extensions\",\"AjaxRequest\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"ChannelInitialData\",\"ChannelSubdomain\",\"ChannelTransport\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"MovingStat\",\"PresenceCookieManager\",\"PresenceState\",\"PresenceUtil\",\"Run\",\"SystemEvents\",\"URI\",\"UserActivity\",\"copyProperties\",\"createArrayFrom\",\"ChatVisibility\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"AjaxRequest\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"ChannelConstants\"), l = b(\"ChannelInitialData\"), m = b(\"ChannelSubdomain\"), n = b(\"ChannelTransport\"), o = b(\"Env\"), p = b(\"FBAjaxRequest\"), q = b(\"JSLogger\"), r = b(\"MovingStat\"), s = b(\"PresenceCookieManager\"), t = b(\"PresenceState\"), u = b(\"PresenceUtil\"), v = b(\"Run\"), w = b(\"SystemEvents\"), x = b(\"URI\"), y = b(\"UserActivity\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"ChatVisibility\"), ca, da = q.create(\"channel\"), ea = null;\n    function fa(qa) {\n        ea = qa;\n    };\n;\n    var ga = {\n        idle: {\n            ok: \"init!\"\n        },\n        init: {\n            ok: \"pull!\",\n            error: \"reconnect\",\n            sys_online: \"init\",\n            sys_timetravel: \"init\"\n        },\n        pull: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_missing: \"pull\",\n            error_msg_type: \"pull\",\n            refresh_0: \"reconnect\",\n            refresh_110: \"reconnect\",\n            refresh_111: \"reconnect\",\n            refresh_112: \"pull\",\n            refresh_113: \"pull\",\n            refresh_117: \"reconnect\"\n        },\n        ping: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_stale: \"reconnect!\"\n        },\n        reconnect: {\n            ok: \"init!\",\n            error: \"reconnect\",\n            sys_online: \"reconnect\",\n            sys_timetravel: \"reconnect\"\n        },\n        shutdown: {\n        },\n        _all: {\n            error_max: \"shutdown!\",\n            error_shutdown: \"shutdown!\",\n            sys_owner: \"reconnect\",\n            sys_nonowner: \"idle!\",\n            sys_online: \"ping\",\n            sys_offline: \"idle!\",\n            sys_timetravel: \"ping\"\n        }\n    }, ha = {\n        userActive: ((ba.isOnline() ? JSBNG__Date.now() : 0)),\n        sessionID: ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(16),\n        streamingCapable: false,\n        inStreaming: false,\n        LONGPOLL_TIMEOUT: 60000,\n        STREAMING_TIMEOUT: 60000,\n        P_TIMEOUT: 30000,\n        IFRAME_LOAD_TIMEOUT: 30000,\n        MIN_RETRY_INTERVAL: 5000,\n        MAX_RETRY_INTERVAL: 30000,\n        MIN_12002_TIMEOUT: 9000,\n        MIN_504_TIMEOUT: 20000,\n        STALL_THRESHOLD: 180000,\n        JUMPSTART_THRESHOLD: 90000,\n        MIN_INIT_PROBE_DELAY: 3000,\n        INIT_PROBE_DELAY_RANDOMIZE_RANGE: 12000,\n        PROBE_DELAY: 60000,\n        PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n        PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n        STREAMING_EXIT_STATE_ON_CONTINUE: false\n    }, ia = 1, ja = {\n    }, ka = 0;\n    function la() {\n        return ((j.lastSuccessTime ? Math.round(((((JSBNG__Date.now() - j.lastSuccessTime)) / 1000))) : -1));\n    };\n;\n    function ma() {\n        var qa = {\n        };\n        if (ca.getConfig(\"host\")) {\n            qa[ca.getConfig(\"user_channel\")] = ca.getConfig(\"seq\", 0);\n        }\n    ;\n    ;\n        return qa;\n    };\n;\n    function na() {\n        var qa = JSBNG__Date.now(), ra = JSBNG__Date.now(), sa = {\n            total: 0\n        }, ta = \"idle\", ua = false;\n        w.subscribe([w.USER,w.ONLINE,w.TIME_TRAVEL,], function(xa, ya) {\n            pa(true);\n            ra = null;\n            ca.lastPullTime = JSBNG__Date.now();\n            var za;\n            switch (xa) {\n              case w.USER:\n                za = ((w.isPageOwner() ? k.SYS_OWNER : k.SYS_NONOWNER));\n                break;\n              case w.ONLINE:\n                za = ((ya ? k.SYS_ONLINE : k.SYS_OFFLINE));\n                break;\n              case w.TIME_TRAVEL:\n                za = k.SYS_TIMETRAVEL;\n                break;\n            };\n        ;\n            ca.exitState({\n                JSBNG__status: za,\n                stateId: ia\n            });\n        });\n        var va = function(xa, ya) {\n            var za = JSBNG__Date.now(), ab;\n            if (ya) {\n                qa = za;\n                ab = ((ya.nextState || ya.state));\n            }\n             else ab = ta;\n        ;\n        ;\n            w.checkTimeTravel();\n            if (ra) {\n                var bb = Math.round(((((za - ra)) / 1000)));\n                if (((bb > 0))) {\n                    sa[ta] = ((((sa[ta] || 0)) + bb));\n                    sa.total += bb;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ta = ab;\n            ra = za;\n            if (!xa) {\n                sa.lastSuccessTime = la();\n                sa.online = w.isOnline();\n                da.log(\"rollup\", sa);\n            }\n        ;\n        ;\n        };\n        i.subscribe(k.ON_ENTER_STATE, va);\n        JSBNG__setInterval(va, 60000, false);\n        i.subscribe(q.DUMP_EVENT, function(xa, ya) {\n            ya.channelRollup = sa;\n        });\n        var wa = function() {\n            if (((ca.isShutdown() || ca.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            w.checkTimeTravel();\n            var xa = ((JSBNG__Date.now() - ((ca.lastPullTime || o.start))));\n            if (((!ua && ((xa > ha.STALL_THRESHOLD))))) {\n                var ya = la();\n                da.error(\"stall\", {\n                    lastSuccessTime: ya,\n                    rollupState: ta\n                });\n                ua = true;\n            }\n        ;\n        ;\n            var za = ((JSBNG__Date.now() - qa));\n            if (((((ca.state == \"pull\")) && ((za > ha.JUMPSTART_THRESHOLD))))) {\n                qa = null;\n                da.warn(\"jumpstart\", {\n                    state: ca.state,\n                    dormant: za\n                });\n                ca.enterState(\"init\");\n            }\n        ;\n        ;\n        };\n        JSBNG__setInterval(wa, 10000, false);\n    };\n;\n    function oa() {\n        var qa = JSBNG__Date.now(), ra = 1;\n        function sa() {\n            JSBNG__setTimeout(sa, ((ra * 1000)), false);\n            var xa = ca.state;\n            if (((((xa == \"idle\")) && ca.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            da.bump(\"conn_t\", ra);\n            if (((xa == \"pull\"))) {\n                da.bump(\"conn_t_pull\", ra);\n            }\n        ;\n        ;\n        };\n    ;\n        sa();\n        var ta = [15,30,60,120,240,], ua = false, va = false;\n        function wa(xa) {\n            JSBNG__setTimeout(function() {\n                da.rate(((\"pullenter_\" + xa)), ua);\n                da.rate(((\"pullexit_\" + xa)), va);\n            }, ((xa * 1000)), false);\n        };\n    ;\n        while (ta.length) {\n            wa(ta.shift());\n        ;\n        };\n    ;\n        i.subscribe(k.ON_ENTER_STATE, function(xa, ya) {\n            if (((ya.state == \"pull\"))) {\n                ua = true;\n            }\n        ;\n        ;\n            qa = JSBNG__Date.now();\n        });\n        i.subscribe(k.ON_EXIT_STATE, function(xa, ya) {\n            if (((((ya.state != \"pull\")) || !qa))) {\n                return;\n            }\n        ;\n        ;\n            var za = \"other\";\n            if (((ya.JSBNG__status == k.OK))) {\n                va = true;\n                za = \"ok\";\n            }\n             else if (((ya.xhr && ya.xhr.errorType))) {\n                za = ((/ar:(\\w+)/.test(ya.xhr.errorType) && RegExp.$1));\n            }\n             else if (/^sys_/.test(ya.JSBNG__status)) {\n                return;\n            }\n            \n            \n        ;\n        ;\n            var ab = ((((JSBNG__Date.now() - qa)) / 1000));\n            if (((ab < 0))) {\n                return;\n            }\n             else if (((ab > 3600))) {\n                ab = 3600;\n            }\n            \n        ;\n        ;\n            da.bump(\"conn_num\");\n            da.bump(\"conn_exit\", ab);\n            da.bump(((\"conn_num_\" + za)));\n            da.bump(((\"conn_exit_\" + za)), ab);\n        });\n    };\n;\n    function pa(qa) {\n        if (qa) {\n            ka = 0;\n            ja = {\n            };\n        }\n         else ka++;\n    ;\n    ;\n    };\n;\n    ca = {\n        state: \"idle\",\n        nextState: null,\n        lastPullTime: JSBNG__Date.now(),\n        heartbeats: [],\n        setTestCallback: fa,\n        init: function(qa) {\n            this.init = function() {\n            \n            };\n            if (((typeof (y) != \"undefined\"))) {\n                y.subscribe(function() {\n                    if (ba.isOnline()) {\n                        ha.userActive = JSBNG__Date.now();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else da.error(\"user_activity_undefined\");\n        ;\n        ;\n            s.register(\"ch\", ma);\n            var ra = this.getConfig(\"max_conn\", 2), sa = Math.floor(((Math.JSBNG__random() * 32)));\n            ha.subdomain = m.allocate(ra, sa);\n            if (((typeof window.JSBNG__onpageshow != \"undefined\"))) {\n                g.listen(window, \"pagehide\", m.clear);\n            }\n             else v.onUnload(m.clear);\n        ;\n        ;\n            this._transportRate = new r(30000);\n            var ta = ((((h.supportsCORS() && !ha.forceIframe)) ? \"CORSTransport\" : \"IframeTransport\"));\n            this.transport = new n[ta](this);\n            if (qa) {\n                this.enterState.apply(this, arguments);\n            }\n        ;\n        ;\n            i.subscribe(q.DUMP_EVENT, function(JSBNG__event, va) {\n                va.transportRate = this._transportRate.tally();\n                va.transportType = ta;\n                va.transportVersion = 2;\n            }.bind(this));\n            na();\n            oa();\n            if (((((((ca.getConfig(\"tryStreaming\") && ca.getConfig(\"host\"))) && h.supportsCORS())) && !ha.forceIframe))) {\n                var ua = ((ha.MIN_INIT_PROBE_DELAY + ((Math.JSBNG__random() * ha.INIT_PROBE_DELAY_RANDOMIZE_RANGE))));\n                JSBNG__setTimeout(this._probeTest, ua, false);\n            }\n        ;\n        ;\n        },\n        configure: function() {\n            var qa = aa(arguments);\n            da.log(\"configure\", qa);\n            qa.forEach(z.bind(null, ha));\n            i.inform(k.ON_CONFIG, this);\n        },\n        getConfig: function(qa, ra) {\n            return ((((qa in ha)) ? ha[qa] : ra));\n        },\n        isShutdown: function() {\n            return ((this.state == \"shutdown\"));\n        },\n        shouldIdle: function() {\n            return !((w.isPageOwner() && w.isOnline()));\n        },\n        _sendIframeError: function(qa) {\n            var ra = new j().setURI(\"/ajax/presence/reconnect.php\").setData({\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            }).setOption(\"suppressErrorHandlerWarning\", true).setOption(\"retries\", 1).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true);\n            ((ra.specifiesWriteRequiredParams() && ra.send()));\n        },\n        _getDelay: function() {\n            var qa = Math.min(((ha.MIN_RETRY_INTERVAL * Math.pow(2, Math.max(0, ((ka - 1)))))), ha.MAX_RETRY_INTERVAL);\n            return ((((qa * ((13517 + ((Math.JSBNG__random() / 2)))))) | 0));\n        },\n        enterState: function() {\n            if (this._inEnterState) {\n                da.warn(\"enterstate_recursion\");\n            }\n        ;\n        ;\n            this._inEnterState = true;\n            try {\n                this._enterState.apply(this, arguments);\n                this._inEnterState = false;\n            } catch (qa) {\n                this._inEnterState = false;\n                throw qa;\n            };\n        ;\n        },\n        _enterState: function(qa) {\n            var ra = 0, sa = aa(arguments);\n            if (this.isShutdown()) {\n                return;\n            }\n        ;\n        ;\n            if (((((qa != \"idle!\")) && this.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            ia++;\n            ha.stateId = ia;\n            JSBNG__clearTimeout(this._deferredTransition);\n            this._deferredTransition = null;\n            this.transport.enterState(\"idle\");\n            this.state = \"idle\";\n            this.nextState = null;\n            if (/!$/.test(qa)) {\n                var ta = this._transportRate.tally().timeAverage, ua = ca.getConfig(\"MAX_CHANNEL_STATES_PER_SEC\", 1);\n                if (((ta >= ua))) {\n                    if (!this._throttled) {\n                        this._throttled = true;\n                        da.warn(\"throttled\");\n                    }\n                ;\n                ;\n                    da.bump(\"throttle\");\n                    ra = ((1000 / ua));\n                }\n            ;\n            ;\n            }\n             else if (!(/#$/.test(qa))) {\n                ra = this._getDelay();\n            }\n            \n        ;\n        ;\n            qa = qa.replace(/\\W*$/, \"\");\n            if (!ga[qa]) {\n                throw new Error(((\"invalid state:\" + qa)));\n            }\n        ;\n        ;\n            var va;\n            if (((ra <= 0))) {\n                va = {\n                    state: qa\n                };\n                this._transportRate.add(1);\n                this.state = qa;\n                var wa = this[((\"_enter_\" + this.state))];\n                if (wa) {\n                    sa.shift();\n                    wa.apply(this, sa);\n                }\n            ;\n            ;\n                if (/init|idle|pull|ping/.test(this.state)) {\n                    if (((ha.streamingCapable && /pull/.test(this.state)))) {\n                        this.heartbeats = [];\n                    }\n                ;\n                ;\n                    this.transport.enterState(this.state, ha);\n                    if (((this.state == \"ping\"))) {\n                        va.url = n.getURI(ha).toString();\n                        va.port = ((ha.port || \"undefined\"));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n             else {\n                this.state = \"idle\";\n                this.nextState = qa;\n                va = {\n                    state: this.state,\n                    delay: ra,\n                    nextState: qa\n                };\n                sa[0] = ((qa + \"#\"));\n                this._deferredTransition = (function() {\n                    this._deferredTransition = null;\n                    this.enterState.apply(this, sa);\n                }).bind(this).defer(ra, false);\n            }\n        ;\n        ;\n            if (/pull/.test(qa)) {\n                va.client_id = ha.sessionID;\n                va.streaming = ha.inStreaming;\n            }\n        ;\n        ;\n            da.log(((\"enter_\" + this.state)), va);\n            i.inform(k.ON_ENTER_STATE, va);\n        },\n        exitState: function(qa, ra) {\n            var sa = qa.stateId, ta = qa.JSBNG__status;\n            if (((this.isShutdown() || ((sa < ia))))) {\n                return;\n            }\n        ;\n        ;\n            var ua = aa(arguments), va = this.state;\n            ua[0] = qa.JSBNG__status;\n            var wa = {\n                state: va,\n                JSBNG__status: ta\n            };\n            if (/pull/.test(va)) {\n                wa.client_id = ha.sessionID;\n                wa.streaming = ha.inStreaming;\n            }\n        ;\n        ;\n            if (((/ping/.test(va) && ((ta != k.OK))))) {\n                wa.url = n.getURI(ha).toString();\n            }\n        ;\n        ;\n            if (this.nextState) {\n                wa.nextState = this.nextState;\n            }\n        ;\n        ;\n            if (((ra && ra.errorType))) {\n                wa.xhr = ((ra.toJSON ? ra.toJSON() : ra));\n                delete wa.xhr.json;\n            }\n        ;\n        ;\n            if (((ra && ra.json))) {\n                if (ra.json.t) {\n                    wa.t = ra.json.t;\n                }\n            ;\n            ;\n                if (ra.json.reason) {\n                    wa.reason = ra.json.reason;\n                }\n            ;\n            ;\n                if (ra.json.seq) {\n                    wa.seq = ra.json.seq;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            da.log(((\"exit_\" + va)), wa);\n            i.inform(k.ON_EXIT_STATE, wa);\n            var xa = this[((\"_exit_\" + va))];\n            if (xa) {\n                ta = ((xa.apply(this, ua) || ta));\n            }\n        ;\n        ;\n            if (((ta != k.OK))) {\n                pa();\n                ja[va] = ((((ja[va] || 0)) + 1));\n            }\n        ;\n        ;\n            var ya = ((ga[((this.nextState || va))][ta] || ga._all[ta])), za = ((ya && ya.replace(/!*$/, \"\")));\n            if (!za) {\n                da.error(\"terminal_transition\", wa);\n                this._shutdownHint = k.HINT_INVALID_STATE;\n                ya = \"shutdown!\";\n            }\n        ;\n        ;\n            this._lastState = va;\n            this._lastStatus = ta;\n            this.enterState(ya);\n        },\n        _processTransportData: function(qa, ra) {\n            var sa = ra.json, ta = sa.t;\n            if (((\"s\" in sa))) {\n                sa.seq = sa.s;\n                delete sa.s;\n            }\n        ;\n        ;\n            var ua = ha.seq;\n            if (((\"seq\" in sa))) {\n                ha.seq = sa.seq;\n                t.doSync();\n            }\n        ;\n        ;\n            switch (ta) {\n              case \"continue\":\n                if (((ha.inStreaming && ((this.heartbeats.length < 1))))) {\n                    ha.streamingCapable = false;\n                    da.log(\"switch_to_longpoll\");\n                    JSBNG__setTimeout(this._probeTest, ha.PROBE_DELAY, false);\n                }\n            ;\n            ;\n                pa(true);\n                if (((!ha.inStreaming || ha.STREAMING_EXIT_STATE_ON_CONTINUE))) {\n                    this.exitState({\n                        JSBNG__status: k.OK,\n                        stateId: qa\n                    });\n                }\n            ;\n            ;\n                break;\n              case \"refresh\":\n            \n              case \"refreshDelay\":\n                this.exitState({\n                    JSBNG__status: ((\"refresh_\" + ((sa.reason || 0)))),\n                    stateId: qa\n                }, ra);\n                break;\n              case \"fullReload\":\n                s.clear();\n                da.log(\"invalid_history\");\n                i.inform(k.ON_INVALID_HISTORY);\n                this.exitState({\n                    JSBNG__status: k.ERROR_MISSING,\n                    stateId: qa\n                }, ra);\n                break;\n              case \"msg\":\n                var va, wa, xa, ya;\n                pa(true);\n                wa = sa.ms;\n                xa = ((ha.seq - wa.length));\n                for (va = 0; ((va < wa.length)); va++, xa++) {\n                    if (((xa >= ua))) {\n                        ya = wa[va];\n                        if (ya.type) {\n                            if (((((ya.type === \"messaging\")) && ya.message))) {\n                                var za = ((ya.unread_counts && ya.unread_counts.inbox));\n                                da.debug(\"message\", {\n                                    type: \"messaging\",\n                                    inbox_unread: za,\n                                    tid: ya.message.tid,\n                                    mid: ya.message.mid\n                                });\n                            }\n                             else if (((ya.type === \"m_messaging\"))) {\n                                da.debug(\"message\", {\n                                    type: \"m_messaging\",\n                                    tid: ya.tid,\n                                    mid: ya.uuid\n                                });\n                            }\n                             else da.debug(\"message\", {\n                                type: ya.type\n                            });\n                            \n                        ;\n                        ;\n                            i.inform(k.getArbiterType(ya.type), {\n                                obj: ya\n                            });\n                        }\n                    ;\n                    ;\n                    }\n                     else da.warn(\"seq_regression\", {\n                        seq: xa,\n                        last_seq: ua,\n                        messages: wa.length\n                    });\n                ;\n                ;\n                };\n            ;\n                break;\n              case \"heartbeat\":\n                if (ha.inStreaming) {\n                    var ab = JSBNG__Date.now();\n                    if (((this.heartbeats.length > 0))) {\n                        var bb = ((ab - this.heartbeats[((this.heartbeats.length - 1))]));\n                        da.log(\"heartbeat_interval\", {\n                            client_id: ha.sessionID,\n                            interval: bb\n                        });\n                    }\n                ;\n                ;\n                    this.heartbeats.push(ab);\n                }\n            ;\n            ;\n                break;\n              default:\n                da.error(\"unknown_msg_type\", {\n                    type: ta\n                });\n                break;\n            };\n        ;\n        },\n        _enter_init: function() {\n            if (((ja.init >= ca.getConfig(\"MAX_INIT_FAILS\", 2)))) {\n                return this.exitState.bind(this, {\n                    JSBNG__status: k.ERROR_MAX,\n                    stateId: ia\n                }).defer();\n            }\n        ;\n        ;\n            this._initTimer = this.exitState.bind(this, {\n                JSBNG__status: k.ERROR,\n                stateId: ia\n            }, \"timeout\").defer(ha.IFRAME_LOAD_TIMEOUT, false);\n        },\n        _enter_reconnect: function(qa) {\n            var ra = ia;\n            if (!u.hasUserCookie()) {\n                da.warn(\"no_user_cookie\");\n                (function() {\n                    ca._shutdownHint = k.HINT_AUTH;\n                    ca.exitState({\n                        JSBNG__status: k.ERROR_SHUTDOWN,\n                        stateId: ra\n                    });\n                }).defer();\n                return;\n            }\n        ;\n        ;\n            var sa = {\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            };\n            if (o.fb_isb) {\n                sa.fb_isb = o.fb_isb;\n            }\n        ;\n        ;\n            if (ea) {\n                ea(sa);\n            }\n        ;\n        ;\n            var ta = new p(\"GET\", \"/ajax/presence/reconnect.php\", sa);\n            ta.onSuccess = (function() {\n                ca.configure(ta.json);\n                s.store();\n                this.exitState({\n                    JSBNG__status: k.OK,\n                    stateId: ra\n                });\n            }).bind(this);\n            ta.onError = (function() {\n                var ua = ((ta.json && ta.json.error));\n                if (((((ta.errorType == h.TRANSPORT_ERROR)) || ((ta.errorType == h.PROXY_ERROR))))) {\n                    this._shutdownHint = k.HINT_CONN;\n                }\n            ;\n            ;\n                if (((ua && ((ua == 1356007))))) {\n                    this._shutdownHint = k.HINT_MAINT;\n                }\n                 else if (((((((ua == 1357001)) || ((ua == 1357004)))) || ((ua == 1348009))))) {\n                    this._shutdownHint = k.HINT_AUTH;\n                }\n                 else this._shutdownHint = null;\n                \n            ;\n            ;\n                this.exitState({\n                    JSBNG__status: ((this._shutdownHint ? k.ERROR_SHUTDOWN : k.ERROR)),\n                    stateId: ra\n                }, ta);\n            }).bind(this);\n            ta.send();\n        },\n        _enter_shutdown: function() {\n            i.inform(k.ON_SHUTDOWN, {\n                reason: this._shutdownHint\n            });\n        },\n        _exit_init: function(qa) {\n            if (this._initTimer) {\n                this._initTimer = JSBNG__clearTimeout(this._initTimer);\n            }\n        ;\n        ;\n            if (((qa == k.ERROR_MAX))) {\n                this._sendIframeError(k.reason_IFrameLoadGiveUp);\n            }\n        ;\n        ;\n        },\n        _exit_pull: function(qa) {\n            if (((qa == k.OK))) {\n                this.lastPullTime = JSBNG__Date.now();\n            }\n        ;\n        ;\n        },\n        _exit_ping: function(qa) {\n            if (((qa == k.OK))) {\n                var ra = ((JSBNG__Date.now() - ((this.lastPullTime || o.start))));\n                if (((ra > ha.STALL_THRESHOLD))) {\n                    return k.ERROR_STALE;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _probeTest: function() {\n            ha.streamingCapable = false;\n            var qa = [], ra = {\n                mode: \"stream\",\n                format: \"json\"\n            }, sa = new x(\"/probe\").setDomain(((ha.host + \".facebook.com\"))).setPort(ha.port).setSecure(x().isSecure()).setQueryData(ra), ta = new h(\"GET\", sa);\n            ta.onJSON = function(ua, va) {\n                if (((((ua && ua.json)) && ((ua.json.t === \"heartbeat\"))))) {\n                    qa.push(JSBNG__Date.now());\n                    if (((qa.length >= 2))) {\n                        var wa = ((qa[1] - qa[0]));\n                        if (((((wa >= ha.PROBE_HEARTBEATS_INTERVAL_LOW)) && ((wa <= ha.PROBE_HEARTBEATS_INTERVAL_HIGH))))) {\n                            ha.streamingCapable = true;\n                            da.log(\"switch_to_streaming\");\n                        }\n                    ;\n                    ;\n                        da.log(\"probe_ok\", {\n                            time: wa\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n            ta.onSuccess = function(ua) {\n                if (((qa.length != 2))) {\n                    ha.streamingCapable = false;\n                    da.error(\"probe_error\", {\n                        error: ((\"beats.length = \" + qa.length))\n                    });\n                }\n            ;\n            ;\n            };\n            ta.onError = function(ua) {\n                ha.streamingCapable = false;\n                da.error(\"probe_error\", ua);\n            };\n            da.log(\"probe_request\");\n            ta.send();\n        }\n    };\n    e.exports = ca;\n    if (l.channelConfig) {\n        ca.configure(l.channelConfig);\n        if (/shutdown/.test(l.state)) {\n            ca._shutdownHint = k[l.reason];\n        }\n    ;\n    ;\n        ca.init(l.state, l.reason);\n    }\n;\n;\n});\n__d(\"ChannelConnection\", [\"Arbiter\",\"copyProperties\",\"ChatConfig\",\"Run\",\"SystemEvents\",\"ChannelConstants\",\"ChannelManager\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"ChatConfig\"), j = b(\"Run\"), k = b(\"SystemEvents\"), l = b(\"ChannelConstants\"), m = b(\"ChannelManager\"), n = b(\"JSLogger\"), o = n.create(\"channel_connection\"), p = null, q = null, r = null, s = null, t = 0, u = h(new g(), {\n        CONNECTED: \"chat-connection/connected\",\n        RECONNECTING: \"chat-connection/reconnecting\",\n        SHUTDOWN: \"chat-connection/shutdown\",\n        MUTE_WARNING: \"chat-connection/mute\",\n        UNMUTE_WARNING: \"chat-connection/unmute\"\n    });\n    function v() {\n        if (q) {\n            JSBNG__clearTimeout(q);\n            q = null;\n        }\n    ;\n    ;\n    };\n;\n    function w() {\n        v();\n        o.log(\"unmute_warning\");\n        u.inform(u.UNMUTE_WARNING);\n    };\n;\n    function x(ba) {\n        v();\n        q = w.defer(ba, false);\n        o.log(\"mute_warning\", {\n            time: ba\n        });\n        u.inform(u.MUTE_WARNING);\n    };\n;\n    function y() {\n        if (r) {\n            JSBNG__clearTimeout(r);\n            r = null;\n        }\n    ;\n    ;\n    };\n;\n    function z(ba, ca) {\n        y();\n        if (((((ba === l.ON_ENTER_STATE)) && ((((ca.nextState || ca.state)) === \"pull\"))))) {\n            if (((s !== u.CONNECTED))) {\n                o.log(\"connected\");\n                var da = !s;\n                s = u.CONNECTED;\n                t = 0;\n                u.inform(u.CONNECTED, {\n                    init: da\n                });\n            }\n        ;\n        ;\n        }\n         else if (((((ba === l.ON_ENTER_STATE)) && ((((((ca.nextState || ca.state)) === \"ping\")) || ((!ca.nextState && ((ca.state === \"idle\"))))))))) {\n            r = (function() {\n                var ea = null;\n                if (!((((ca.state === \"idle\")) && !ca.nextState))) {\n                    ea = ((ca.delay || 0));\n                }\n            ;\n            ;\n                o.log(\"reconnecting\", {\n                    delay: ea\n                });\n                if (u.disconnected()) {\n                    o.log(\"reconnecting_ui\", {\n                        delay: ea\n                    });\n                }\n            ;\n            ;\n                s = u.RECONNECTING;\n                ((((ca.state === \"idle\")) && t++));\n                if (((t > 1))) {\n                    u.inform(u.RECONNECTING, ea);\n                }\n                 else if (((!ca.nextState && ((ca.state === \"idle\"))))) {\n                    z(ba, ca);\n                }\n                \n            ;\n            ;\n            }).defer(500, false);\n        }\n         else if (((ba === l.ON_SHUTDOWN))) {\n            o.log(\"shutdown\", {\n                reason: ca.reason\n            });\n            s = u.SHUTDOWN;\n            t = 0;\n            u.inform(u.SHUTDOWN, ca.reason);\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    function aa(ba) {\n        if (((((m.state === \"ping\")) || m.isShutdown()))) {\n            return;\n        }\n    ;\n    ;\n        o.log(\"reconnect\", {\n            now: ba\n        });\n        u.inform(u.RECONNECTING, 0);\n        if (!!ba) {\n            if (((p !== null))) {\n                JSBNG__clearTimeout(p);\n                p = null;\n            }\n        ;\n        ;\n            m.enterState(\"ping!\");\n        }\n         else if (!p) {\n            p = JSBNG__setTimeout(function() {\n                m.enterState(\"ping!\");\n                p = null;\n            }, i.get(\"channel_manual_reconnect_defer_msec\"), false);\n        }\n        \n    ;\n    ;\n    };\n;\n    if (m.isShutdown()) {\n        z(l.ON_SHUTDOWN, m._shutdownHint);\n    }\n     else z(l.ON_ENTER_STATE, {\n        state: m.state,\n        nextState: m.nextState,\n        delay: 0\n    });\n;\n;\n    g.subscribe([l.ON_ENTER_STATE,l.ON_SHUTDOWN,], z);\n    k.subscribe(k.TIME_TRAVEL, function() {\n        aa();\n        x(i.get(\"mute_warning_time_msec\"));\n    });\n    j.onBeforeUnload(y, false);\n    h(u, {\n        disconnected: function() {\n            return ((((s === u.SHUTDOWN)) || ((((((s === u.RECONNECTING)) && !q)) && ((t > 1))))));\n        },\n        isShutdown: function() {\n            return ((s === u.SHUTDOWN));\n        },\n        reconnect: aa,\n        unmuteWarning: w\n    });\n    e.exports = u;\n});\n__d(\"ChatFavoriteList\", [\"AsyncRequest\",\"arrayContains\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"arrayContains\"), i = b(\"emptyFunction\"), j = false, k = [], l = [], m = false;\n    function n() {\n        var r = k.join(\",\");\n        new g(\"/ajax/chat/favorite_list.php\").setData({\n            favorite_list: r\n        }).setHandler(i).setErrorHandler(i).send();\n    };\n;\n    function o(r) {\n        return r.toString();\n    };\n;\n    function p(r) {\n        if (((k.length != r.length))) {\n            return true;\n        }\n    ;\n    ;\n        for (var s = 0; ((s < r.length)); s++) {\n            if (((k[s] !== r[s].toString()))) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    var q = {\n        isEditMode: function() {\n            var r = null;\n            d([\"ChatSidebar\",], function(s) {\n                r = s;\n            });\n            return ((((j && r)) && r.isEnabled()));\n        },\n        toggleEditMode: function() {\n            j = !j;\n            if (j) {\n                l = k.slice();\n            }\n        ;\n        ;\n        },\n        get: function() {\n            if (j) {\n                return l.slice();\n            }\n             else return k.slice()\n        ;\n        },\n        isFavored: function(r) {\n            return h(l, r.toString());\n        },\n        init: function(r) {\n            k = r.slice().map(o);\n            l = k.slice();\n        },\n        toggleID: function(r) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            r = r.toString();\n            var s = l.indexOf(r);\n            if (((s >= 0))) {\n                l.splice(s, 1);\n            }\n             else l.push(r);\n        ;\n        ;\n            m = true;\n        },\n        hasChanged: function() {\n            if (m) {\n                m = false;\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        updateList: function(r) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            l = r.map(o);\n        },\n        save: function() {\n            if (p(l)) {\n                k = l;\n                n();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChatContexts\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(k) {\n        var l = ((k ? k.subtext : \"\"));\n        return l;\n    };\n;\n    function i(k, l) {\n        g[k] = l;\n    };\n;\n    var j = {\n        get: function(k) {\n            if (((k in g))) {\n                return g[k];\n            }\n             else return null\n        ;\n        },\n        update: function(k) {\n            {\n                var fin231keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin231i = (0);\n                var l;\n                for (; (fin231i < fin231keys.length); (fin231i++)) {\n                    ((l) = (fin231keys[fin231i]));\n                    {\n                        i(l, k[l]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        getShortDisplay: function(k) {\n            return h(j.get(k));\n        }\n    };\n    e.exports = j;\n});\n__d(\"LastMobileActiveTimes\", [\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"tx\"), h = 0, i = {\n    };\n    function j(n) {\n        if (((!h || !n))) {\n            return \"\";\n        }\n    ;\n    ;\n        var o = ((h - n)), p = Math.floor(((o / 60))), q = Math.floor(((p / 60))), r = Math.floor(((q / 24)));\n        if (((p <= 1))) {\n            return g._(\"{count}m\", {\n                count: 1\n            });\n        }\n         else if (((p < 60))) {\n            return g._(\"{count}m\", {\n                count: p\n            });\n        }\n         else if (((q < 24))) {\n            return g._(\"{count}h\", {\n                count: q\n            });\n        }\n         else if (((r < 3))) {\n            return g._(\"{count}d\", {\n                count: r\n            });\n        }\n         else return \"\"\n        \n        \n        \n    ;\n    };\n;\n    function k(n, o) {\n        i[n] = o;\n    };\n;\n    function l(n) {\n        if (((n in i))) {\n            return i[n];\n        }\n         else return 0\n    ;\n    };\n;\n    var m = {\n        update: function(n, o) {\n            h = ((o / 1000));\n            {\n                var fin232keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin232i = (0);\n                var p;\n                for (; (fin232i < fin232keys.length); (fin232i++)) {\n                    ((p) = (fin232keys[fin232i]));\n                    {\n                        k(p, n[p]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        getShortDisplay: function(n) {\n            return j(l(n));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ServerTime\", [\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"PresenceInitialData\"), h;\n    function i(k) {\n        h = ((JSBNG__Date.now() - k));\n    };\n;\n    i(g.serverTime);\n    var j = {\n        get: function() {\n            return ((JSBNG__Date.now() - h));\n        },\n        getSkew: function() {\n            return h;\n        },\n        update: function(k) {\n            i(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"PresenceStatus\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatVisibility\",\"Env\",\"PresencePrivacy\",\"ServerTime\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatVisibility\"), j = b(\"Env\"), k = b(\"PresencePrivacy\"), l = b(\"ServerTime\"), m = b(\"createObjectFrom\"), n = {\n    }, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n        resetPresenceData: function() {\n            n = {\n            };\n            q = {\n            };\n            p = {\n            };\n        },\n        reset: function() {\n            r.resetPresenceData();\n            o = {\n            };\n        },\n        get: function(s) {\n            if (((s == j.user))) {\n                return ((i.isOnline() ? g.ACTIVE : g.OFFLINE));\n            }\n        ;\n        ;\n            var t = g.OFFLINE;\n            if (((s in n))) {\n                t = n[s];\n            }\n        ;\n        ;\n            if (!k.allows(s)) {\n                t = g.OFFLINE;\n            }\n        ;\n        ;\n            if (((t == g.OFFLINE))) {\n                if (o[s]) {\n                    t = g.MOBILE;\n                }\n            ;\n            }\n        ;\n        ;\n            return t;\n        },\n        getGroup: function(s) {\n            if (!h.get(\"chat_group_presence\", 0)) {\n                return g.OFFLINE;\n            }\n        ;\n        ;\n            return ((s.some(function(t) {\n                if (((t == j.user))) {\n                    return false;\n                }\n            ;\n            ;\n                return ((r.get(t) === g.ACTIVE));\n            }) ? g.ACTIVE : g.OFFLINE));\n        },\n        set: function(s, t, u, v) {\n            if (((s == j.user))) {\n                return false;\n            }\n        ;\n        ;\n            switch (t) {\n              case g.OFFLINE:\n            \n              case g.IDLE:\n            \n              case g.ACTIVE:\n            \n              case g.MOBILE:\n                break;\n              default:\n                return false;\n            };\n        ;\n            var w = ((r.get(s) != t));\n            if (u) {\n                p[s] = l.get();\n                q[s] = v;\n            }\n        ;\n        ;\n            n[s] = t;\n            return w;\n        },\n        setMobileFriends: function(s) {\n            o = m(s);\n        },\n        getOnlineIDs: function() {\n            var s, t = [];\n            {\n                var fin233keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin233i = (0);\n                (0);\n                for (; (fin233i < fin233keys.length); (fin233i++)) {\n                    ((s) = (fin233keys[fin233i]));\n                    {\n                        if (((r.get(s) === g.ACTIVE))) {\n                            t.push(s);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return t;\n        },\n        getAvailableIDs: function() {\n            var s = r.getOnlineIDs(), t;\n            {\n                var fin234keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin234i = (0);\n                (0);\n                for (; (fin234i < fin234keys.length); (fin234i++)) {\n                    ((t) = (fin234keys[fin234i]));\n                    {\n                        if (n[t]) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        s.push(t);\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getOnlineCount: function() {\n            return r.getOnlineIDs().length;\n        },\n        getPresenceStats: function() {\n            var s = 0, t = 0, u = 0, v = 0, w = 0;\n            {\n                var fin235keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin235i = (0);\n                var x;\n                for (; (fin235i < fin235keys.length); (fin235i++)) {\n                    ((x) = (fin235keys[fin235i]));\n                    {\n                        s += 1;\n                        switch (r.get(x)) {\n                          case g.OFFLINE:\n                            t += 1;\n                            break;\n                          case g.IDLE:\n                            u += 1;\n                            break;\n                          case g.ACTIVE:\n                            v += 1;\n                            break;\n                          case g.MOBILE:\n                            w += 1;\n                            break;\n                          default:\n                            break;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n            return {\n                total: s,\n                offline: t,\n                idle: u,\n                active: v,\n                mobile: w\n            };\n        },\n        getDebugInfo: function(s) {\n            return {\n                id: s,\n                presence: n[s],\n                overlaySource: q[s],\n                overlayTime: p[s],\n                mobile: o[s]\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"PresencePoller\", [\"AvailableListConstants\",\"AvailableListInitialData\",\"BanzaiODS\",\"ChannelConnection\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatVisibility\",\"Env\",\"JSLogger\",\"LastMobileActiveTimes\",\"Poller\",\"PresenceStatus\",\"PresenceUtil\",\"ServerTime\",\"ShortProfiles\",\"UserActivity\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"AvailableListInitialData\"), i = b(\"BanzaiODS\"), j = b(\"ChannelConnection\"), k = b(\"ChatContexts\"), l = b(\"ChatFavoriteList\"), m = b(\"ChatVisibility\"), n = b(\"Env\"), o = b(\"JSLogger\"), p = b(\"LastMobileActiveTimes\"), q = b(\"Poller\"), r = b(\"PresenceStatus\"), s = b(\"PresenceUtil\"), t = b(\"ServerTime\"), u = b(\"ShortProfiles\"), v = b(\"UserActivity\"), w = b(\"copyProperties\"), x = b(\"debounceAcrossTransitions\"), y = 5, z = \"/ajax/chat/buddy_list.php\", aa = 1800000, ba = h.pollInterval, ca = h.lazyPollInterval, da = h.lazyThreshold, ea = o.create(\"available_list\"), fa = \"presence_poller\";\n    function ga(ha) {\n        this.$PresencePoller0 = ha;\n        this.$PresencePoller1 = false;\n        this.$PresencePoller2 = h.chatNotif;\n        this.$PresencePoller3 = new q({\n            interval: ba,\n            setupRequest: this.$PresencePoller4.bind(this),\n            clearOnQuicklingEvents: false,\n            dontStart: true\n        });\n        this.$PresencePoller5 = JSBNG__Date.now();\n        this.$PresencePoller6 = JSBNG__Date.now();\n        this.$PresencePoller7 = JSBNG__Date.now();\n        this.$PresencePoller8 = h.updateTime;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera = 0;\n        if (h.favoriteList) {\n            l.init(h.favoriteList);\n        }\n    ;\n    ;\n        this.$PresencePollerb(\"available_initial_data\", h.updateTime, h.availableList, h.lastActiveTimes, h.mobileFriends);\n        v.subscribe(function(ia, ja) {\n            if (((ja.idleness > ba))) {\n                this.forceUpdate();\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    ga.prototype.start = function() {\n        this.$PresencePoller3.start.bind(this.$PresencePoller3).defer();\n    };\n    ga.prototype.forceUpdate = function() {\n        if (!this.$PresencePoller9) {\n            this.$PresencePoller3.request();\n        }\n    ;\n    ;\n    };\n    ga.prototype.getIsUserIdle = function() {\n        return this.$PresencePoller1;\n    };\n    ga.prototype.getWebChatNotification = function() {\n        return this.$PresencePoller2;\n    };\n    ga.prototype.getCallback = function() {\n        return this.$PresencePoller0;\n    };\n    ga.prototype.$PresencePollerc = function() {\n        return x(function() {\n            this.$PresencePoller0(g.ON_AVAILABILITY_CHANGED);\n        }.bind(this), 0)();\n    };\n    ga.prototype.$PresencePollerb = function(ha, ia, ja, ka, la) {\n        this.$PresencePoller8 = ia;\n        if (!Array.isArray(ja)) {\n            r.resetPresenceData();\n            {\n                var fin236keys = ((window.top.JSBNG_Replay.forInKeys)((ja))), fin236i = (0);\n                var ma;\n                for (; (fin236i < fin236keys.length); (fin236i++)) {\n                    ((ma) = (fin236keys[fin236i]));\n                    {\n                        r.set(ma, ja[ma].a, false, ha);\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        if (ka) {\n            p.update(ka, ia);\n        }\n    ;\n    ;\n        if (la) {\n            r.setMobileFriends(la);\n        }\n    ;\n    ;\n        this.$PresencePollerc();\n    };\n    ga.prototype.$PresencePoller4 = function(ha) {\n        if (((j.isShutdown() || !m.isOnline()))) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.offline\");\n            return;\n        }\n    ;\n    ;\n        if (((((JSBNG__Date.now() - this.$PresencePoller5)) < ba))) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.recent\");\n            return;\n        }\n    ;\n    ;\n        i.bumpEntityKey(fa, \"request\");\n        this.$PresencePoller5 = JSBNG__Date.now();\n        var ia = ((((JSBNG__Date.now() - this.$PresencePoller7)) > aa)), ja = u.getCachedProfileIDs().join(\",\");\n        this.$PresencePoller9 = true;\n        ha.setHandler(this.$PresencePollerd.bind(this)).setErrorHandler(this.$PresencePollere.bind(this)).setOption(\"suppressErrorAlerts\", true).setOption(\"retries\", 1).setData({\n            user: n.user,\n            cached_user_info_ids: ja,\n            fetch_mobile: ia\n        }).setURI(z).setAllowCrossPageTransition(true);\n    };\n    ga.prototype.$PresencePollerd = function(ha) {\n        var ia = ha.getPayload(), ja = ia.buddy_list;\n        if (!ja) {\n            this.$PresencePollere(ha);\n            return;\n        }\n    ;\n    ;\n        i.bumpEntityKey(fa, \"response\");\n        this.$PresencePoller9 = false;\n        this.$PresencePollerf();\n        this.$PresencePoller6 = JSBNG__Date.now();\n        t.update(ia.time);\n        this.$PresencePollera = 0;\n        this.$PresencePollerg();\n        var ka = ja.userInfos;\n        if (ka) {\n            u.setMulti(ka);\n        }\n    ;\n    ;\n        var la = ja.chatContexts;\n        ((la && k.update(la)));\n        this.$PresencePoller1 = ja.userIsIdle;\n        if (((ja.chatNotif !== undefined))) {\n            this.$PresencePoller2 = ja.chatNotif;\n            this.$PresencePoller0(g.ON_CHAT_NOTIFICATION_CHANGED, this.$PresencePoller2);\n        }\n    ;\n    ;\n        this.$PresencePollerb(\"buddy_list_poller\", ia.time, ja.nowAvailableList, ja.last_active_times, ja.mobile_friends);\n    };\n    ga.prototype.$PresencePollere = function(ha) {\n        i.bumpEntityKey(fa, \"error\");\n        if (s.checkMaintenanceError(ha)) {\n            return;\n        }\n    ;\n    ;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera++;\n        if (((this.$PresencePollera++ >= y))) {\n            this.$PresencePoller0(g.ON_UPDATE_ERROR);\n        }\n    ;\n    ;\n    };\n    ga.prototype.$PresencePollerg = function() {\n        var ha = ((v.isActive(da) ? ba : ca));\n        i.bumpEntityKey(fa, ((\"period.\" + ha)));\n        this.$PresencePoller3.JSBNG__setInterval(ha);\n    };\n    ga.prototype.$PresencePollerf = function() {\n        var ha = JSBNG__Date.now(), ia = ((ha - this.$PresencePoller6));\n        ea.log(\"buddylist_presence_stats\", w({\n            duration: ia\n        }, r.getPresenceStats()));\n    };\n    e.exports = ga;\n});\n__d(\"AvailableList\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableListConstants\",\"ChannelImplementation\",\"ChannelConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"JSLogger\",\"PresencePoller\",\"PresencePrivacy\",\"PresenceStatus\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"debounceAcrossTransitions\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableListConstants\"), k = b(\"ChannelImplementation\").instance, l = b(\"ChannelConstants\"), m = b(\"ChatConfig\"), n = b(\"ChatFavoriteList\"), o = b(\"JSLogger\"), p = b(\"PresencePoller\"), q = b(\"PresencePrivacy\"), r = b(\"PresenceStatus\"), s = b(\"ShortProfiles\"), t = b(\"TypingDetector\"), u = b(\"copyProperties\"), v = b(\"debounceAcrossTransitions\"), w = b(\"emptyFunction\"), x = u({\n    }, j, h);\n    x.subscribe([j.ON_AVAILABILITY_CHANGED,j.ON_UPDATE_ERROR,], function(ea, fa) {\n        g.inform(ea, fa);\n    });\n    var y = v(function() {\n        x.inform(j.ON_AVAILABILITY_CHANGED);\n    }, 0);\n    function z(ea, fa, ga, ha) {\n        var ia = r.set(ea, fa, ga, ha);\n        if (ia) {\n            y();\n        }\n    ;\n    ;\n    };\n;\n    function aa(ea) {\n        var fa = ((ea.payload.availability || {\n        }));\n        {\n            var fin237keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin237i = (0);\n            var ga;\n            for (; (fin237i < fin237keys.length); (fin237i++)) {\n                ((ga) = (fin237keys[fin237i]));\n                {\n                    z(ga, fa[ga], true, \"mercury_tabs\");\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function ba(ea) {\n        var fa = x.getDebugInfo(ea), ga = ((fa.presence == j.ACTIVE)), ha = new i(\"/ajax/mercury/tabs_presence.php\").setData({\n            target_id: ea,\n            to_online: ga,\n            presence_source: fa.overlaySource,\n            presence_time: fa.overlayTime\n        }).setHandler(aa).setErrorHandler(w).setAllowCrossPageTransition(true).send();\n    };\n;\n    function ca(ea, fa) {\n        fa.chat_config = m.getDebugInfo();\n        fa.available_list_debug_info = {\n        };\n        x.getAvailableIDs().forEach(function(ga) {\n            fa.available_list_debug_info[ga] = x.getDebugInfo(ga);\n        });\n        fa.available_list_poll_interval = ((x._poller && x._poller.getInterval()));\n    };\n;\n    var da = new p(function(JSBNG__event) {\n        x.inform(JSBNG__event);\n    });\n    u(x, {\n        get: function(ea) {\n            return r.get(ea);\n        },\n        updateForID: function(ea) {\n            ba(ea);\n        },\n        getWebChatNotification: function() {\n            return da.getWebChatNotification();\n        },\n        isUserIdle: function() {\n            return da.getIsUserIdle();\n        },\n        isReady: function() {\n            return true;\n        },\n        set: function(ea, fa, ga) {\n            z(ea, fa, true, ga);\n        },\n        update: function() {\n            da.forceUpdate();\n        },\n        isIdle: function(ea) {\n            return ((x.get(ea) == j.IDLE));\n        },\n        getOnlineIDs: function() {\n            return r.getOnlineIDs();\n        },\n        getAvailableIDs: function() {\n            return r.getAvailableIDs();\n        },\n        getOnlineCount: function() {\n            return r.getOnlineCount();\n        },\n        getDebugInfo: function(ea) {\n            var fa = r.getDebugInfo(ea), ga = s.getNow(ea);\n            if (ga) {\n                fa.JSBNG__name = ga.JSBNG__name;\n            }\n        ;\n        ;\n            return fa;\n        }\n    });\n    da.start();\n    g.subscribe(o.DUMP_EVENT, ca);\n    g.subscribe(l.getArbiterType(\"favorite_list\"), function(ea, fa) {\n        var ga = fa.obj, ha = ((ga.value ? ga.value.split(\",\") : []));\n        n.init(ha);\n        y();\n    });\n    q.subscribe([\"privacy-changed\",\"privacy-availability-changed\",\"privacy-user-presence-response\",], y);\n    k.subscribe([k.CONNECTED,k.RECONNECTING,k.SHUTDOWN,k.MUTE_WARNING,k.UNMUTE_WARNING,], y);\n    g.subscribe(l.getArbiterType(\"buddylist_overlay\"), function(ea, fa) {\n        var ga = fa.obj.overlay;\n        {\n            var fin238keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin238i = (0);\n            var ha;\n            for (; (fin238i < fin238keys.length); (fin238i++)) {\n                ((ha) = (fin238keys[fin238i]));\n                {\n                    x.set(ha, ga[ha].a, ((ga[ha].s || \"channel\")));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    g.subscribe([l.getArbiterType(\"typ\"),l.getArbiterType(\"ttyp\"),], function(ea, fa) {\n        var ga = fa.obj;\n        if (((ga.st === t.TYPING))) {\n            var ha = ga.from;\n            x.set(ha, j.ACTIVE, \"channel-typing\");\n        }\n    ;\n    ;\n    });\n    a.AvailableList = e.exports = x;\n});\n__d(\"ChatImpressionLogger\", [\"AvailableList\",\"AsyncSignal\",\"ChatConfig\",\"ChatVisibility\",\"Poller\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"AsyncSignal\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"Poller\"), l = null, m = null, n = {\n        init: function(o) {\n            l = o;\n            var p = i.get(\"chat_impression_logging_periodical\", 0);\n            if (p) {\n                var q = i.get(\"periodical_impression_logging_config.interval\");\n                m = new k({\n                    interval: q,\n                    setupRequest: this.logImps.bind(this),\n                    clearOnQuicklingEvents: false\n                });\n            }\n        ;\n        ;\n            this.init = function() {\n            \n            };\n        },\n        logImps: function(o) {\n            if (!j.isOnline()) {\n                return;\n            }\n        ;\n        ;\n            var p = {\n                source: \"periodical_imps\"\n            }, q = l.getCachedSortedList(), r = [];\n            for (var s = 0; ((s < q.length)); s++) {\n                r[s] = g.get(q[s]);\n            ;\n            };\n        ;\n            p.sorted_list = q.toString();\n            p.list_availability = r.toString();\n            o.setURI(\"/ajax/chat/imps_logging.php\").setData(p);\n        },\n        getOrderedList: function() {\n            return l;\n        },\n        logImpressions: function(o) {\n            var p = [], q = [];\n            if (i.get(\"chat_impression_logging_with_click\")) {\n                p = l.getCachedSortedList();\n                for (var r = 0; ((r < p.length)); r++) {\n                    q[r] = g.get(p[r]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            o.sorted_list = p.toString();\n            o.list_availability = q.toString();\n            new h(\"/ajax/chat/ct.php\", o).send();\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatTypeaheadConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        USER_TYPE: \"user\",\n        THREAD_TYPE: \"thread\",\n        FRIEND_TYPE: \"friend\",\n        NON_FRIEND_TYPE: \"non_friend\",\n        HEADER_TYPE: \"header\"\n    };\n    e.exports = g;\n});\n__d(\"Chat\", [\"Arbiter\",\"AvailableList\",\"ChatImpressionLogger\",\"ChatTypeaheadConstants\",\"MercuryParticipantTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"ChatImpressionLogger\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"MercuryParticipantTypes\");\n    function l(q, r) {\n        var s = ((r && r.source));\n        if (((((((((((((((s && ((s === \"ordered_list\")))) || ((s === \"more_online_friends\")))) || ((s === \"online_friends\")))) || ((s === \"recent_threads_in_divebar_new\")))) || ((s === \"recent_threads_in_divebar\")))) || ((s === \"presence\")))) || ((s === \"typeahead\"))))) {\n            r.viewport_width = JSBNG__document.body.clientWidth;\n            r.target = q;\n            r.target_presence = h.get(q);\n            i.logImpressions(r);\n        }\n    ;\n    ;\n    };\n;\n    var m = {\n        buddyListNub: \"buddylist-nub/initialized\",\n        JSBNG__sidebar: \"sidebar/initialized\"\n    };\n    function n(q, r) {\n        g.subscribe(m[q], function(JSBNG__event, s) {\n            r(s);\n        });\n    };\n;\n    function o() {\n        return ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(16);\n    };\n;\n    var p = {\n        openTab: function(q, r, s) {\n            if (((((window.External && window.External.Chat)) && window.External.Chat.openWindow))) {\n                window.External.Chat.openWindow(q);\n            }\n        ;\n        ;\n            l.curry(q, s).defer();\n            d([\"MercuryThreads\",], function(t) {\n                if (((((((!r || ((r === k.FRIEND)))) || ((r === j.FRIEND_TYPE)))) || ((r === j.USER_TYPE))))) {\n                    var u = t.get().getCanonicalThreadToUser(q), v = o();\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: u.thread_id,\n                        signature_id: v\n                    });\n                    return;\n                }\n            ;\n            ;\n                if (((r === j.THREAD_TYPE))) {\n                    d([\"ChatOpenTab\",], function(w) {\n                        if (q) {\n                            w.openThread(q);\n                        }\n                         else w.openEmptyTab();\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        openBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.show();\n                n(\"JSBNG__sidebar\", function(r) {\n                    r.enable();\n                });\n            });\n        },\n        closeBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.hide();\n            });\n        },\n        toggleSidebar: function() {\n            n(\"JSBNG__sidebar\", function(q) {\n                q.toggle();\n            });\n        },\n        goOnline: function(q) {\n            d([\"ChatVisibility\",], function(r) {\n                r.goOnline(q);\n            });\n        },\n        isOnline: function() {\n            var q = null;\n            d([\"ChatVisibility\",], function(r) {\n                q = r;\n            });\n            return ((q && q.isOnline()));\n        }\n    };\n    a.Chat = e.exports = p;\n}, 3);\n__d(\"OrderedFriendsList\", [\"AvailableList\",\"ChatConfig\",\"createArrayFrom\",\"ShortProfiles\",\"InitialChatFriendsList\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatConfig\"), i = b(\"createArrayFrom\"), j = b(\"ShortProfiles\"), k = [], l = {\n    }, m = [], n = {\n        contains: function(o) {\n            return ((o in l));\n        },\n        compare: function(o, p) {\n            var q = n.getRank(o), r = n.getRank(p);\n            if (((q !== r))) {\n                return ((q - r));\n            }\n        ;\n        ;\n            var s = j.getNowUnsafe(o), t = j.getNowUnsafe(p), u = ((((s || {\n            })).JSBNG__name || \"~\")).toLowerCase(), v = ((((t || {\n            })).JSBNG__name || \"~\")).toLowerCase();\n            if (((u !== v))) {\n                return ((((u < v)) ? -1 : 1));\n            }\n        ;\n        ;\n            return 0;\n        },\n        getList: function() {\n            if (h.get(\"chat_web_ranking_with_presence\")) {\n                n.reRank();\n            }\n        ;\n        ;\n            var o = i(k);\n            o = o.filter(function(p) {\n                var q = j.getNowUnsafe(p);\n                return ((!q || ((q.type == \"friend\"))));\n            });\n            return o;\n        },\n        getRank: function(o) {\n            return ((((o in l)) ? l[o] : k.length));\n        },\n        reRank: function() {\n            var o = {\n            }, p = {\n            };\n            m.forEach(function(r, s) {\n                var t = r.substr(0, ((r.length - 2))), u = r.substring(((r.length - 1)));\n                if (((typeof (p.uid) == \"undefined\"))) {\n                    if (((typeof (o.uid) == \"undefined\"))) {\n                        o[t] = g.get(t);\n                    }\n                ;\n                ;\n                    var v = o[t];\n                    if (((v == u))) {\n                        p[s] = t;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            k = [];\n            {\n                var fin239keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin239i = (0);\n                var q;\n                for (; (fin239i < fin239keys.length); (fin239i++)) {\n                    ((q) = (fin239keys[fin239i]));\n                    {\n                        k.push(p[q]);\n                    ;\n                    };\n                };\n            };\n        ;\n            k.forEach(function(r, s) {\n                l[r] = s;\n            });\n        }\n    };\n    (function() {\n        var o = b(\"InitialChatFriendsList\");\n        k = ((o.list.length ? o.list : []));\n        if (h.get(\"chat_web_ranking_with_presence\")) {\n            m = k.slice();\n            n.reRank();\n        }\n    ;\n    ;\n        k.forEach(function(p, q) {\n            l[p] = q;\n        });\n    })();\n    e.exports = ((a.OrderedFriendsList || n));\n});\n__d(\"ChatSidebarConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LITESTAND_IMAGE_SIZE: 24,\n        LITESTAND_BLENDED_SIZE: 32,\n        IMAGE_SIZE: 28\n    };\n    e.exports = g;\n});\n__d(\"ChatTypeaheadBehavior\", [\"Chat\",\"ChatConfig\",\"ChatFavoriteList\",\"CSS\",\"DOM\",\"JSBNG__Rect\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Chat\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"JSBNG__Rect\"), m = b(\"copyProperties\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n;\n    m(o.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var p = this._typeahead;\n            this._subscriptions = [p.subscribe(\"JSBNG__focus\", function() {\n                p.getData().refreshData();\n            }),p.subscribe(\"JSBNG__blur\", function(q) {\n                p.getCore().reset();\n            }),p.subscribe(\"respond\", function(q, r) {\n                if (((r.value && ((r.value === p.getCore().getValue()))))) {\n                    if (!r.results.length) {\n                        var s = h.get(\"divebar_typeahead_group_fof\", 0);\n                        if (((s && !r.isAsync))) {\n                            return;\n                        }\n                    ;\n                    ;\n                        var t = k.create(\"div\", {\n                            className: \"noResults\"\n                        }, \"Friend not found.\");\n                        k.setContent(p.getView().getElement(), t);\n                    }\n                ;\n                ;\n                    j.addClass(p.getElement(), \"hasValue\");\n                }\n            ;\n            ;\n            }),p.subscribe(\"reset\", function() {\n                j.removeClass(p.getElement(), \"hasValue\");\n            }),p.subscribe(\"select\", function(q, r) {\n                if (i.isEditMode()) {\n                    i.toggleID(r.selected.uid);\n                    i.save();\n                }\n                 else {\n                    var s = j.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), t = {\n                        mode: ((s ? \"JSBNG__sidebar\" : \"chatNub\")),\n                        source: \"typeahead\",\n                        type: r.selected.type,\n                        typeahead: true\n                    };\n                    g.openTab(r.selected.uid, r.selected.type, t);\n                }\n            ;\n            ;\n            }),p.subscribe(\"highlight\", function(q, r) {\n                if (((r.index >= 0))) {\n                    var s = p.getView().getItems()[r.index];\n                    if (s) {\n                        var t = new l(s), u = s.offsetParent, v = t.boundWithin(new l(u)).getPositionVector();\n                        t.getPositionVector().sub(v).scrollElementBy(u);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(p) {\n                this._typeahead.unsubscribe(p);\n            }.bind(this));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatTypeaheadCore\", [\"function-extensions\",\"Class\",\"JSBNG__Event\",\"Keys\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"JSBNG__Event\"), i = b(\"Keys\"), j = b(\"TypeaheadCore\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"shield\");\n    function n(o) {\n        this.parent.construct(this, o);\n    };\n;\n    g.extend(n, j);\n    k(n.prototype, {\n        init: function(o, p, q) {\n            this.parent.init(o, p, q);\n            this.informBeginActive = false;\n            this.informEndActive = false;\n            this.data.subscribe(\"respond\", function() {\n                if (this.informBeginActive) {\n                    this.informBeginActive = false;\n                    this.inform(\"sidebar/typeahead/active\", true);\n                }\n                 else if (this.informEndActive) {\n                    this.informEndActive = false;\n                    this.inform(\"sidebar/typeahead/active\", false);\n                }\n                \n            ;\n            ;\n            }.bind(this));\n        },\n        handleTab: l,\n        keydown: function(JSBNG__event) {\n            var o = h.getKeyCode(JSBNG__event);\n            if (((o === i.ESC))) {\n                m(this.reset, this).defer();\n                return JSBNG__event.kill();\n            }\n        ;\n        ;\n            return this.parent.keydown(JSBNG__event);\n        },\n        checkValue: function() {\n            var o = this.getValue(), p = this.value;\n            if (((o == p))) {\n                return;\n            }\n        ;\n        ;\n            if (((p && !o))) {\n                this.typeaheadActive = false;\n                this.informEndActive = true;\n            }\n             else if (((!p && o))) {\n                this.typeaheadActive = true;\n                this.informBeginActive = true;\n                this.inform(\"sidebar/typeahead/preActive\");\n            }\n            \n        ;\n        ;\n            this.parent.checkValue();\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatTypeaheadDataSource\", [\"Class\",\"DataSource\",\"Env\",\"JSLogger\",\"MercuryParticipantTypes\",\"OrderedFriendsList\",\"Run\",\"ShortProfiles\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"MercuryParticipantTypes\"), l = b(\"OrderedFriendsList\"), m = b(\"Run\"), n = b(\"ShortProfiles\"), o = b(\"copyProperties\");\n    function p(q) {\n        q = ((q || {\n        }));\n        q.kanaNormalization = true;\n        this.parent.construct(this, q);\n        this.persistOnRefresh = ((q.persistOnRefresh !== false));\n        this.showOfflineUsers = !!q.showOfflineUsers;\n        this._jslog = j.create(\"chat_typeahead\");\n        this._jslog.log(\"created\");\n    };\n;\n    g.extend(p, h);\n    o(p.prototype, {\n        init: function() {\n            this._jslog.log(\"init\");\n            this.parent.init();\n            this._update();\n        },\n        bootstrap: function() {\n            this._jslog.log(\"bootstrap\");\n            this.parent.bootstrap();\n            if (this.showOfflineUsers) {\n                this._jslog.log(\"show_offline_users\");\n                this._jslog.log(\"ensured_short_profiles\");\n                if (n.hasAll()) {\n                    this._update();\n                }\n                 else {\n                    this._jslog.log(\"fetch_all_short_profiles\");\n                    n.fetchAll();\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                    var q = n.subscribe(\"updated\", function() {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                        this._update();\n                    }.bind(this));\n                    if (!this.persistOnRefresh) {\n                        m.onLeave(function() {\n                            n.unsubscribe(q);\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _update: function() {\n            d([\"AvailableList\",], function(q) {\n                var r = this.value;\n                this.dirty();\n                var s = n.getCachedProfileIDs(), t = s.filter(function(v) {\n                    var w = n.getNow(v);\n                    return ((w.type === k.FRIEND));\n                });\n                t.sort(l.compare);\n                var u = [];\n                t.forEach(function(v) {\n                    if (((v == i.user))) {\n                        return;\n                    }\n                ;\n                ;\n                    var w = q.get(v);\n                    if (((!this.showOfflineUsers && ((w !== q.ACTIVE))))) {\n                        return;\n                    }\n                ;\n                ;\n                    var x = n.getNow(v), y = x.additionalName;\n                    if (x.hasOwnProperty(\"searchTokens\")) {\n                        y = ((((y !== null)) ? ((((y + \" \")) + x.searchTokens.join(\" \"))) : x.searchTokens.join(\" \")));\n                    }\n                ;\n                ;\n                    u.push({\n                        uid: v,\n                        text: x.JSBNG__name,\n                        tokens: y,\n                        localized_text: x.JSBNG__name,\n                        additional_text: x.additionalName,\n                        photo: x.thumbSrc,\n                        type: x.type\n                    });\n                }.bind(this));\n                if (u.length) {\n                    this.addEntries(u);\n                }\n            ;\n            ;\n                this.value = r;\n                if (r) {\n                    this.query(r);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        refreshData: function() {\n            d([\"AvailableList\",], function(q) {\n                q.update();\n            }.bind(this));\n        }\n    });\n    e.exports = p;\n});\n__d(\"ChatSidebarHeader.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"ReactChatSidebarHeader\",\n        render: function() {\n            return (g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__header\"\n            }, g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__headertext\"\n            }, this.props.JSBNG__name)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ChatSidebarItem.react\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"ChatSidebarConstants\",\"JSBNG__Image.react\",\"Link.react\",\"React\",\"SplitImage.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"ChatSidebarConstants\"), k = b(\"JSBNG__Image.react\"), l = b(\"Link.react\"), m = b(\"React\"), n = b(\"SplitImage.react\"), o = b(\"cx\"), p = b(\"ix\"), q = 9, r = m.createClass({\n        displayName: \"ChatSidebarItem\",\n        render: function() {\n            var s = (((((\"-cx-PRIVATE-chatSidebarItem__link\") + ((this.props.context ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__hascontext\")) : \"\")))) + ((((this.props.unreadCount && h.get(\"litestand_buddylist_count\"))) ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__hasunreadcount\")) : \"\")))), t;\n            if (this.props.litestandSidebar) {\n                t = m.DOM.div({\n                    \"aria-label\": this.props.JSBNG__name,\n                    className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-position\": \"right\"\n                });\n            }\n        ;\n        ;\n            return (l({\n                className: s,\n                href: this.props.href,\n                onClick: this.props.onClick,\n                rel: \"ignore\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__contents\"\n            }, this.renderFavorite(), m.DOM.div({\n                className: \"-cx-PUBLIC-chatSidebarItem__piccontainer\"\n            }, this.renderImage(), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__picborder\"\n            })), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__rightcontent\"\n            }, this.renderUnreadCount(), this.renderStatus()), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__name\"\n            }, this.props.JSBNG__name), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__context\"\n            }, this.props.context)), t));\n        },\n        renderFavorite: function() {\n            if (((this.props.isAdded === undefined))) {\n                return null;\n            }\n        ;\n        ;\n            var s = null;\n            if (this.props.litestandSidebar) {\n                s = ((this.props.isAdded ? p(\"/images/litestand/bookmarks/sidebar/remove.png\") : p(\"/images/litestand/bookmarks/sidebar/add.png\")));\n            }\n             else s = ((this.props.isAdded ? p(\"/images/chat/delete.png\") : p(\"/images/chat/add.png\")));\n        ;\n        ;\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__favoritebutton\") + ((!this.props.showEditButton ? ((\" \" + \"hidden_elem\")) : \"\"))));\n            return (m.DOM.div({\n                className: t,\n                onClick: this.props.onEditClick\n            }, k({\n                className: \"-cx-PRIVATE-chatSidebarItem__favoriteicon\",\n                src: s\n            })));\n        },\n        renderImage: function() {\n            var s = ((this.props.imageSize || j.IMAGE_SIZE));\n            return n({\n                size: s,\n                srcs: this.props.images\n            });\n        },\n        renderUnreadCount: function() {\n            var s = this.props.unreadCount;\n            if (((!s || !h.get(\"litestand_buddylist_count\")))) {\n                return null;\n            }\n        ;\n        ;\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__unreadcount\") + ((((s > q)) ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__largecount\")) : \"\"))));\n            if (((s > q))) {\n                s = ((q + \"+\"));\n            }\n        ;\n        ;\n            return (m.DOM.div({\n                className: t\n            }, s));\n        },\n        renderStatus: function() {\n            var s = this.getStatusSrc();\n            if (!s) {\n                return null;\n            }\n        ;\n        ;\n            if (((((this.props.unreadCount && h.get(\"litestand_blended_sidebar\"))) && h.get(\"litestand_buddylist_count\")))) {\n                return;\n            }\n        ;\n        ;\n            var t = ((h.get(\"divebar_favorite_list\", 0) && i.isEditMode()));\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__status\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__statustime\"\n            }, this.props.statusTime), k({\n                className: \"-cx-PRIVATE-chatSidebarItem__statusicon\",\n                src: s\n            })));\n        },\n        getStatusSrc: function() {\n            switch (this.props.JSBNG__status) {\n              case g.ACTIVE:\n            \n              case g.IDLE:\n                if (this.props.litestandSidebar) {\n                    return ((h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/online.png\") : p(\"/images/litestand/sidebar/online.png\")));\n                }\n            ;\n            ;\n                return p(\"/images/chat/status/online.png\");\n              case g.MOBILE:\n                if (this.props.litestandSidebar) {\n                    return ((h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/pushable.png\") : p(\"/images/litestand/sidebar/pushable.png\")));\n                }\n            ;\n            ;\n                return p(\"/images/chat/status/mobile.png\");\n            };\n        ;\n            return null;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatSidebarThread.react\", [\"ChatSidebarItem.react\",\"WebMessengerPermalinkConstants\",\"React\",\"MercuryThreadMetadataRawRenderer\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"React\"), j = b(\"MercuryThreadMetadataRawRenderer\"), k = i.createClass({\n        displayName: \"ChatSidebarThread\",\n        render: function() {\n            var n = this.props.JSBNG__name, o = l(this.props.threadID, this.props.participants), p = ((n ? o : undefined)), q = h.getURIPathForThreadID(this.props.threadID), r = m(this.props.image, this.props.participants), s = ((n ? n : o));\n            return (g({\n                context: p,\n                href: {\n                    url: q\n                },\n                imageSize: this.props.imageSize,\n                images: r,\n                litestandSidebar: this.props.litestandSidebar,\n                JSBNG__name: s,\n                JSBNG__status: this.props.JSBNG__status,\n                unreadCount: this.props.unreadCount\n            }));\n        }\n    });\n    function l(n, o) {\n        return j.renderRawParticipantList(n, o, o.length, {\n            names_renderer: j.renderShortNames\n        });\n    };\n;\n    function m(n, o) {\n        if (n) {\n            return n;\n        }\n    ;\n    ;\n        return o.map(function(p) {\n            return p.image_src;\n        });\n    };\n;\n    e.exports = k;\n});\n__d(\"ChatSidebarUser.react\", [\"ChatFavoriteList\",\"WebMessengerPermalinkConstants\",\"ChatConfig\",\"React\",\"ChatSidebarItem.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatFavoriteList\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"ChatConfig\"), j = b(\"React\"), k = b(\"ChatSidebarItem.react\"), l = j.createClass({\n        displayName: \"ChatSidebarUser\",\n        render: function() {\n            var m = h.getURIPathForIDOrVanity(this.props.userID), n = g.isFavored(this.props.userID), o = function() {\n                g.toggleID(this.props.userID);\n            }.bind(this), p = ((i.get(\"divebar_favorite_list\", 0) ? n : undefined));\n            return (k({\n                href: {\n                    url: m\n                },\n                imageSize: this.props.imageSize,\n                images: this.props.image,\n                litestandSidebar: this.props.litestandSidebar,\n                isAdded: p,\n                showEditButton: g.isEditMode(),\n                JSBNG__name: this.props.JSBNG__name,\n                onEditClick: o,\n                JSBNG__status: this.props.JSBNG__status,\n                statusTime: this.props.statusTime,\n                context: this.props.context\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatTypeaheadRenderer\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatSidebarConstants\",\"ChatSidebarHeader.react\",\"ChatSidebarThread.react\",\"ChatSidebarUser.react\",\"ChatTypeaheadConstants\",\"DOM\",\"LastMobileActiveTimes\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarHeader.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"ChatSidebarUser.react\"), m = b(\"ChatTypeaheadConstants\"), n = b(\"DOM\"), o = b(\"LastMobileActiveTimes\"), p = b(\"MercuryParticipants\"), q = b(\"PresenceStatus\"), r = b(\"React\"), s = {\n    };\n    function t(z, aa) {\n        if (!((z in s))) {\n            s[z] = n.create(\"li\");\n        }\n    ;\n    ;\n        r.renderComponent(aa, s[z]);\n        return s[z];\n    };\n;\n    function u(z) {\n        return t(z.text, j({\n            JSBNG__name: z.text\n        }));\n    };\n;\n    function v() {\n        if (((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\")))) {\n            return ((h.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE));\n        }\n    ;\n    ;\n        return i.IMAGE_SIZE;\n    };\n;\n    function w(z) {\n        var aa = z.mercury_thread.participants.map(function(ba) {\n            return p.getUserID(ba);\n        });\n        return t(z.uid, k({\n            image: z.mercury_thread.image_src,\n            imageSize: v(),\n            litestandSidebar: ((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\"))),\n            JSBNG__name: z.mercury_thread.JSBNG__name,\n            participants: z.participants_to_render,\n            JSBNG__status: q.getGroup(aa),\n            threadID: z.uid\n        }));\n    };\n;\n    function x(z) {\n        var aa = q.get(z.uid), ba = ((((aa === g.MOBILE)) ? o.getShortDisplay(z.uid) : null)), ca = ((((z.render_type == \"non_friend\")) ? z.subtext : null));\n        return t(z.uid, l({\n            image: z.photo,\n            imageSize: v(),\n            litestandSidebar: h.get(\"litestand\", 0),\n            JSBNG__name: z.text,\n            JSBNG__status: aa,\n            statusTime: ba,\n            userID: z.uid,\n            context: ca\n        }));\n    };\n;\n    function y(z, aa) {\n        if (((z.type === m.HEADER_TYPE))) {\n            return u(z);\n        }\n    ;\n    ;\n        if (((z.type == m.THREAD_TYPE))) {\n            return w(z);\n        }\n    ;\n    ;\n        return x(z);\n    };\n;\n    e.exports = y;\n});\n__d(\"ChatTypeaheadView\", [\"BucketedTypeaheadView\",\"ChatConfig\",\"Class\",\"ChatTypeaheadConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"ChatConfig\"), i = b(\"Class\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"copyProperties\"), l = b(\"tx\"), m = h.get(\"divebar_typeahead_group_fof\", 0);\n    function n(o, p) {\n        this.parent.construct(this, o, p);\n        this.typeObjects = {\n        };\n        this.typeObjectsOrder = [];\n        this.typeObjects[j.NON_FRIEND_TYPE] = {\n            uid: j.NON_FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS OF FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.NON_FRIEND_TYPE);\n        this.typeObjects[j.THREAD_TYPE] = {\n            uid: j.THREAD_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"GROUP CONVERSATIONS\"\n        };\n        this.typeObjectsOrder.push(j.THREAD_TYPE);\n        this.typeObjects[j.FRIEND_TYPE] = {\n            disabled: true,\n            uid: j.FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.FRIEND_TYPE);\n    };\n;\n    i.extend(n, g);\n    k(n.prototype, {\n        buildBuckets: function(o, p) {\n            if (m) {\n                p = p.reverse();\n            }\n        ;\n        ;\n            p = this.parent.buildBuckets(o, p);\n            if (!m) {\n                p = p.filter(function(q) {\n                    return ((q && !q.disabled));\n                });\n            }\n        ;\n        ;\n            return p;\n        },\n        getDefaultIndex: function(o) {\n            if (!m) {\n                return this.parent.getDefaultIndex(o);\n            }\n        ;\n        ;\n            if (((o.length === 0))) {\n                return -1;\n            }\n        ;\n        ;\n            var p = ((o.length - 1));\n            while (((!this.isHighlightable(o[p]) && ((p >= 0))))) {\n                p--;\n            ;\n            };\n        ;\n            return p;\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ChatTypeaheadBehavior\", [\"ChatTypeaheadBehavior\",], function(a, b, c, d) {\n    var e = b(\"ChatTypeaheadBehavior\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.chatTypeahead = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:cookie\", [\"Cookie\",], function(a, b, c, d) {\n    var e = b(\"Cookie\");\n    a.getCookie = e.get;\n    a.setCookie = e.set;\n    a.clearCookie = e.clear;\n}, 3);\n__d(\"LayerHideOnSuccess\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n;\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._layer.hide.bind(this._layer));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = h;\n});\n__d(\"Overlay\", [\"Class\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerButtons\",\"LayerDestroyOnHide\",\"LayerFadeOnHide\",\"LayerFadeOnShow\",\"LayerFormHooks\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"LayerHideOnSuccess\",\"LayerHideOnTransition\",\"LayerTabIsolation\",\"LayerMouseHooks\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Layer\"), l = b(\"LayerButtons\"), m = b(\"LayerDestroyOnHide\"), n = b(\"LayerFadeOnHide\"), o = b(\"LayerFadeOnShow\"), p = b(\"LayerFormHooks\"), q = b(\"LayerHideOnBlur\"), r = b(\"LayerHideOnEscape\"), s = b(\"LayerHideOnSuccess\"), t = b(\"LayerHideOnTransition\"), u = b(\"LayerTabIsolation\"), v = b(\"LayerMouseHooks\"), w = b(\"copyProperties\");\n    function x(y, z) {\n        y = w({\n            buildWrapper: true\n        }, ((y || {\n        })));\n        this._shouldBuildWrapper = y.buildWrapper;\n        this.parent.construct(this, y, z);\n    };\n;\n    g.extend(x, k);\n    w(x.prototype, {\n        _configure: function(y, z) {\n            this.parent._configure(y, z);\n            var aa = this.getRoot();\n            this._overlay = ((j.scry(aa, \"div.uiOverlay\")[0] || aa));\n            h.hide(aa);\n            j.appendContent(this.getInsertParent(), aa);\n            i.set(this._overlay, \"overlay\", this);\n            var ba = i.get(this._overlay, \"width\");\n            ((ba && this.setWidth(ba)));\n            if (this.setFixed) {\n                this.setFixed(((i.get(this._overlay, \"fixed\") == \"true\")));\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"fadeonshow\") != \"false\"))) {\n                this.enableBehavior(o);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"fadeonhide\") != \"false\"))) {\n                this.enableBehavior(n);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"hideonsuccess\") != \"false\"))) {\n                this.enableBehavior(s);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"hideonblur\") == \"true\"))) {\n                this.enableBehavior(q);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"destroyonhide\") != \"false\"))) {\n                this.enableBehavior(m);\n            }\n        ;\n        ;\n            return this;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([l,p,v,r,t,u,]);\n        },\n        initWithoutBuildingWrapper: function() {\n            this._shouldBuildWrapper = false;\n            return this.init.apply(this, arguments);\n        },\n        _buildWrapper: function(y, z) {\n            z = this.parent._buildWrapper(y, z);\n            if (!this._shouldBuildWrapper) {\n                this._contentRoot = z;\n                return z;\n            }\n        ;\n        ;\n            this._contentRoot = j.create(\"div\", {\n                className: \"uiOverlayContent\"\n            }, z);\n            return j.create(\"div\", {\n                className: \"uiOverlay\"\n            }, this._contentRoot);\n        },\n        getContentRoot: function() {\n            return this._contentRoot;\n        },\n        destroy: function() {\n            i.remove(this.getRoot(), \"overlay\");\n            this.parent.destroy();\n        }\n    });\n    e.exports = x;\n});\n__d(\"ReminderStory\", [\"AsyncRequest\",\"endsWith\",\"JSBNG__Event\",\"DOMQuery\",\"ScrollableArea\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"endsWith\"), i = b(\"JSBNG__Event\"), j = b(\"DOMQuery\"), k = b(\"ScrollableArea\");\n    function l(m, n, o) {\n        i.listen(m, \"click\", function(p) {\n            n.show();\n            if (o) {\n                var q = {\n                    context_data: o\n                };\n                new g().setURI(\"/growth/reminder/logging.php\").setData(q).send();\n            }\n        ;\n        ;\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.scry(p, \".inlineReplyTextArea\");\n            if (((q.length > 0))) {\n                q[0].JSBNG__focus();\n            }\n        ;\n        ;\n            var r = j.scry(p, \".jewelItemNew\"), s = [];\n            {\n                var fin240keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin240i = (0);\n                var t;\n                for (; (fin240i < fin240keys.length); (fin240i++)) {\n                    ((t) = (fin240keys[fin240i]));\n                    {\n                        var u = r[t].getAttribute(\"id\");\n                        if (((u && h(u, \"_1_req\")))) {\n                            s = s.concat(u.replace(\"_1_req\", \"\"));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((s.length > 0))) {\n                new g().setURI(\"/friends/requests/log_impressions\").setData({\n                    ids: s.join(\",\"),\n                    ref: \"reminder_box\"\n                }).send();\n            }\n        ;\n        ;\n            var v = j.JSBNG__find(p, \"#SuggestBelowInvite\");\n            if (v) {\n                new g().setURI(\"/ajax/pages/reminder/recommendations\").send();\n            }\n        ;\n        ;\n            k.poke(j.scry(p, \".uiScrollableArea\")[0]);\n        });\n    };\n;\n    e.exports = l;\n});\n__d(\"ContextualDialogFooterLink\", [\"JSBNG__Event\",\"copyProperties\",\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"DOM\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    h(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var l = this._layer.getRoot(), m = j.scry(l, \".uiContextualDialogFooterLink\")[0], n = \"uiContextualDialogHoverFooterArrow\";\n            this._subscriptions = [g.listen(m, \"mouseenter\", i.addClass.curry(l, n)),g.listen(m, \"mouseleave\", i.removeClass.curry(l, n)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(l) {\n                l.remove();\n            });\n            this._subscriptions = null;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LegacyContextualDialog\", [\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"Bootloader\",\"Class\",\"ContextualDialogFooterLink\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Locale\",\"Overlay\",\"Parent\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"getOverlayZIndex\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ARIA\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ContextualDialogFooterLink\"), m = b(\"ContextualThing\"), n = b(\"CSS\"), o = b(\"DataStore\"), p = b(\"DOM\"), q = b(\"JSBNG__Event\"), r = b(\"Locale\"), s = b(\"Overlay\"), t = b(\"Parent\"), u = b(\"Style\"), v = b(\"Vector\"), w = b(\"$\"), x = b(\"copyProperties\"), y = b(\"getOverlayZIndex\"), z = b(\"shield\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    k.extend(aa, s);\n    x(aa, h, {\n        ARROW_OFFSET: 15,\n        ARROW_LENGTH: 16,\n        ARROW_INSET: 22,\n        TOP_MARGIN: 50,\n        BOTTOM_MARGIN: 30,\n        LEFT_MARGIN: 15,\n        RIGHT_MARGIN: 30,\n        MIN_TOP_GAP: 5,\n        POSITION_TO_CLASS: {\n            above: \"uiContextualDialogAbove\",\n            below: \"uiContextualDialogBelow\",\n            left: \"uiContextualDialogLeft\",\n            right: \"uiContextualDialogRight\"\n        },\n        RIGHT_ALIGNED_CLASS: \"uiContextualDialogRightAligned\",\n        ARROW_CLASS: {\n            bottom: \"uiContextualDialogArrowBottom\",\n            JSBNG__top: \"uiContextualDialogArrowTop\",\n            right: \"uiContextualDialogArrowRight\",\n            left: \"uiContextualDialogArrowLeft\"\n        },\n        POSITION_TO_ARROW: {\n            above: \"bottom\",\n            below: \"JSBNG__top\",\n            left: \"right\",\n            right: \"left\"\n        },\n        getInstance: function(ba) {\n            var ca = o.get(ba, \"LegacyContextualDialog\");\n            if (!ca) {\n                var da = t.byClass(ba, \"uiOverlay\");\n                if (da) {\n                    ca = o.get(da, \"overlay\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ca;\n        }\n    });\n    x(aa.prototype, {\n        _scrollListener: null,\n        _scrollParent: null,\n        _width: null,\n        _fixed: false,\n        _hasFooter: false,\n        _showSubscription: null,\n        _hideSubscription: null,\n        _setContextSubscription: null,\n        _resizeListener: null,\n        _reflowSubscription: null,\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            var da = this.getRoot(), ea = o.get.curry(da);\n            this.setAlignH(ea(\"alignh\", \"left\"));\n            this.setOffsetX(ea(\"offsetx\", 0));\n            this.setOffsetY(ea(\"offsety\", 0));\n            this.setPosition(ea(\"position\", \"above\"));\n            this._hasFooter = ea(\"hasfooter\", false);\n            if (this._hasFooter) {\n                var fa = p.scry(da, \".uiContextualDialogFooterLink\")[0];\n                ((fa && this.enableBehavior(l)));\n            }\n        ;\n        ;\n            this._setContextSubscription = this.subscribe(\"beforeshow\", function() {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n                var ha = ea(\"context\");\n                if (ha) {\n                    this.setContext(w(ha));\n                }\n                 else {\n                    ha = ea(\"contextselector\");\n                    if (ha) {\n                        this.setContext(p.JSBNG__find(JSBNG__document, ha));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this._content = p.scry(da, \".uiContextualDialogContent\")[0];\n            if (this._content) {\n                this._content.setAttribute(\"role\", \"dialog\");\n                var ga = p.scry(this._content, \".legacyContextualDialogTitle\")[0];\n                if (ga) {\n                    this._content.setAttribute(\"aria-labelledby\", p.getID(ga));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._showSubscription = this.subscribe(\"show\", function() {\n                var ha = z(this.updatePosition, this);\n                this._resizeListener = q.listen(window, \"resize\", ha);\n                this._reflowSubscription = g.subscribe(\"reflow\", ha);\n                this._setupScrollListener(this._scrollParent);\n                m.register(da, this.context);\n                g.inform(\"layer_shown\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            this._hideSubscription = this.subscribe(\"hide\", function() {\n                this._teardownResizeAndReflowListeners();\n                this._teardownScrollListener();\n                g.inform(\"layer_hidden\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            return this;\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = this.parent._buildWrapper(ba, ca);\n            if (!this._shouldBuildWrapper) {\n                return da;\n            }\n        ;\n        ;\n            n.addClass(da, \"uiContextualDialog\");\n            return p.create(\"div\", {\n                className: \"uiContextualDialogPositioner\"\n            }, da);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            return this;\n        },\n        setFixed: function(ba) {\n            ba = !!ba;\n            n.conditionClass(this.getRoot(), \"uiContextualDialogFixed\", ba);\n            this._fixed = ba;\n            return this;\n        },\n        setAlignH: function(ba) {\n            this.alignH = ba;\n            this._updateAlignmentClass();\n            ((this._shown && this.updatePosition()));\n            ((this.position && this._updateArrow()));\n            return this;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            return this.context;\n        },\n        setContext: function(ba) {\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n        ;\n            ba = w(ba);\n            if (((this.context && ((this.context != ba))))) {\n                o.remove(this.context, \"LegacyContextualDialog\");\n            }\n        ;\n        ;\n            this.context = ba;\n            i.setPopup(this.getCausalElement(), this.getRoot());\n            var ca = t.byClass(ba, \"fbPhotoSnowlift\");\n            this.setInsertParent(((ca || JSBNG__document.body)));\n            if (((this._scrollListener && ((this._scrollParent !== ca))))) {\n                this._teardownScrollListener();\n                this._setupScrollListener(ca);\n            }\n        ;\n        ;\n            this._scrollParent = ca;\n            var da = y(ba, this._insertParent);\n            u.set(this.getRoot(), \"z-index\", ((((da > 200)) ? da : \"\")));\n            o.set(this.context, \"LegacyContextualDialog\", this);\n            return this;\n        },\n        getCausalElement: function() {\n            return ((this.parent.getCausalElement() || this.context));\n        },\n        listen: function(ba, ca) {\n            return q.listen(this.getRoot(), ba, ca);\n        },\n        setOffsetX: function(ba) {\n            this.offsetX = ((parseInt(ba, 10) || 0));\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setOffsetY: function(ba) {\n            this.offsetY = ((parseInt(ba, 10) || 0));\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setPosition: function(ba) {\n            this.position = ba;\n            {\n                var fin241keys = ((window.top.JSBNG_Replay.forInKeys)((aa.POSITION_TO_CLASS))), fin241i = (0);\n                var ca;\n                for (; (fin241i < fin241keys.length); (fin241i++)) {\n                    ((ca) = (fin241keys[fin241i]));\n                    {\n                        n.conditionClass(this.getRoot(), aa.POSITION_TO_CLASS[ca], ((ba == ca)));\n                    ;\n                    };\n                };\n            };\n        ;\n            this._updateAlignmentClass();\n            ((this._shown && this.updatePosition()));\n            this._updateArrow();\n            return this;\n        },\n        updatePosition: function() {\n            if (!this.context) {\n                return false;\n            }\n        ;\n        ;\n            if (this._width) {\n                u.set(this._overlay, \"width\", ((this._width + \"px\")));\n            }\n        ;\n        ;\n            var ba = ((this._fixed ? \"viewport\" : \"JSBNG__document\")), ca = v.getElementPosition(this.context, ba), da = this._scrollParent;\n            if (da) {\n                ca = ca.sub(v.getElementPosition(da, \"JSBNG__document\")).add(da.scrollLeft, da.scrollTop);\n            }\n        ;\n        ;\n            var ea = v.getElementDimensions(this.context), fa = ((((this.position == \"above\")) || ((this.position == \"below\")))), ga = r.isRTL();\n            if (((((((this.position == \"right\")) || ((fa && ((this.alignH == \"right\")))))) != ga))) {\n                ca = ca.add(ea.x, 0);\n            }\n        ;\n        ;\n            if (((this.position == \"below\"))) {\n                ca = ca.add(0, ea.y);\n            }\n        ;\n        ;\n            var ha = new v(0, 0);\n            if (((fa && ((this.alignH == \"center\"))))) {\n                ha = ha.add(((((ea.x - this._width)) / 2)), 0);\n            }\n             else {\n                var ia = ((fa ? ea.x : ea.y)), ja = ((2 * aa.ARROW_INSET));\n                if (((ia < ja))) {\n                    var ka = ((((ia / 2)) - aa.ARROW_INSET));\n                    if (((fa && ((((this.alignH == \"right\")) != ga))))) {\n                        ka = -ka;\n                    }\n                ;\n                ;\n                    ha = ha.add(((fa ? ka : 0)), ((fa ? 0 : ka)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ha = ha.add(this.offsetX, this.offsetY);\n            if (ga) {\n                ha = ha.mul(-1, 1);\n            }\n        ;\n        ;\n            ca = ca.add(ha);\n            if (this._fixed) {\n                ca = new v(ca.x, ca.y, \"JSBNG__document\");\n            }\n        ;\n        ;\n            ca.setElementPosition(this.getRoot());\n            this._adjustVerticalPosition();\n            this._adjustHorizontalPosition();\n            return true;\n        },\n        JSBNG__scrollTo: function() {\n            if (this.context) {\n                j.loadModules([\"DOMScroll\",], function(ba) {\n                    ba.JSBNG__scrollTo(this.context, true, true);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.unsubscribe(this._showSubscription);\n            this.unsubscribe(this._hideSubscription);\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n        ;\n            this._teardownScrollListener();\n            this._teardownResizeAndReflowListeners();\n            ((this.context && o.remove(this.context, \"LegacyContextualDialog\")));\n            this.parent.destroy();\n        },\n        _adjustVerticalPosition: function() {\n            if (((((this.position != \"left\")) && ((this.position != \"right\"))))) {\n                u.set(this._overlay, \"JSBNG__top\", \"\");\n                return;\n            }\n        ;\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").y, da = v.getElementDimensions(this._overlay).y, ea = v.getViewportDimensions().y, fa = Math.min(Math.max(ca, aa.MIN_TOP_GAP), aa.TOP_MARGIN), ga = Math.min(Math.max(0, ((((((ca + da)) + aa.BOTTOM_MARGIN)) - ea))), Math.max(-fa, ((ca - fa))), ((da - ((2 * aa.ARROW_INSET)))));\n            u.set(this._overlay, \"JSBNG__top\", ((((-1 * ga)) + \"px\")));\n            u.set(this._arrow, \"JSBNG__top\", ((aa.ARROW_OFFSET + \"px\")));\n            u.set(this._arrow, \"marginTop\", ((ga + \"px\")));\n        },\n        _adjustHorizontalPosition: function() {\n            if (((((((this.position != \"above\")) && ((this.position != \"below\")))) || ((this.alignH != \"left\"))))) {\n                u.set(this._overlay, \"left\", \"\");\n                u.set(this._overlay, \"right\", \"\");\n                return;\n            }\n        ;\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").x, da = v.getElementDimensions(this._overlay).x, ea = v.getViewportDimensions().x, fa = r.isRTL(), ga;\n            if (!fa) {\n                ga = ((((((ca + da)) + aa.RIGHT_MARGIN)) - ea));\n            }\n             else ga = ((((aa.LEFT_MARGIN + da)) - ca));\n        ;\n        ;\n            ga = Math.min(Math.max(0, ga), ((da - ((2 * aa.ARROW_INSET)))));\n            u.set(this._overlay, ((fa ? \"right\" : \"left\")), ((((-1 * ga)) + \"px\")));\n            u.set(this._arrow, ((fa ? \"right\" : \"left\")), ((aa.ARROW_OFFSET + \"px\")));\n            u.set(this._arrow, ((fa ? \"marginRight\" : \"marginLeft\")), ((ga + \"px\")));\n        },\n        _updateArrow: function() {\n            var ba = 0;\n            if (((((this.position == \"above\")) || ((this.position == \"below\"))))) {\n                switch (this.alignH) {\n                  case \"center\":\n                    ba = 50;\n                    break;\n                  case \"right\":\n                    ba = 100;\n                    break;\n                };\n            }\n        ;\n        ;\n            this._renderArrow(aa.POSITION_TO_ARROW[this.position], ba);\n        },\n        _renderArrow: function(ba, ca) {\n            {\n                var fin242keys = ((window.top.JSBNG_Replay.forInKeys)((aa.ARROW_CLASS))), fin242i = (0);\n                var da;\n                for (; (fin242i < fin242keys.length); (fin242i++)) {\n                    ((da) = (fin242keys[fin242i]));\n                    {\n                        n.conditionClass(this._overlay, aa.ARROW_CLASS[da], ((ba == da)));\n                    ;\n                    };\n                };\n            };\n        ;\n            n.conditionClass(this._overlay, \"uiContextualDialogWithFooterArrowBottom\", ((((ba == \"bottom\")) && this._hasFooter)));\n            if (((ba == \"none\"))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._arrow) {\n                this._arrow = p.create(\"i\", {\n                    className: \"uiContextualDialogArrow\"\n                });\n                p.appendContent(this._overlay, this._arrow);\n            }\n        ;\n        ;\n            u.set(this._arrow, \"JSBNG__top\", \"\");\n            u.set(this._arrow, \"left\", \"\");\n            u.set(this._arrow, \"right\", \"\");\n            u.set(this._arrow, \"margin\", \"\");\n            var ea = ((((ba == \"JSBNG__top\")) || ((ba == \"bottom\")))), fa = ((ea ? ((r.isRTL() ? \"right\" : \"left\")) : \"JSBNG__top\"));\n            ca = ((ca || 0));\n            u.set(this._arrow, fa, ((ca + \"%\")));\n            var ga = ((aa.ARROW_LENGTH + ((aa.ARROW_OFFSET * 2)))), ha = -((((((ga * ca)) / 100)) - aa.ARROW_OFFSET));\n            u.set(this._arrow, ((\"margin-\" + fa)), ((ha + \"px\")));\n        },\n        _updateAlignmentClass: function() {\n            n.conditionClass(this.getRoot(), aa.RIGHT_ALIGNED_CLASS, ((((((this.position == \"above\")) || ((this.position == \"below\")))) && ((this.alignH == \"right\")))));\n        },\n        _setupScrollListener: function(ba) {\n            this._scrollListener = q.listen(((ba || window)), \"JSBNG__scroll\", z(this._adjustVerticalPosition, this));\n        },\n        _teardownScrollListener: function() {\n            if (this._scrollListener) {\n                this._scrollListener.remove();\n                this._scrollListener = null;\n            }\n        ;\n        ;\n        },\n        _teardownResizeAndReflowListeners: function() {\n            if (this._resizeListener) {\n                this._resizeListener.remove();\n                this._resizeListener = null;\n            }\n        ;\n        ;\n            if (this._reflowSubscription) {\n                this._reflowSubscription.unsubscribe();\n                this._reflowSubscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = aa;\n});\n__d(\"TooltipLink\", [\"Parent\",\"Tooltip\",], function(a, b, c, d, e, f) {\n    var g = b(\"Parent\"), h = b(\"Tooltip\"), i = {\n        setTooltipText: function(j, k) {\n            j = g.byTag(j, \"a\");\n            ((j && h.set(j, k)));\n        }\n    };\n    e.exports = i;\n});");
// 13082
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o102,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/Lwtogw5v6Nb.js",o103);
// undefined
o102 = null;
// undefined
o103 = null;
// 13086
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"brbS1\",]);\n}\n;\n__d(\"BlackbirdUpsellConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        ACTION_UPSELL: \"upsell\",\n        CLICK_TYPE_DISMISS_PROMO: \"dismiss_promo\",\n        ACTION_EDUCATE: \"educate\",\n        CLICK_TYPE_ENABLE_CHAT: \"enable_chat\",\n        CLICK_TYPE_OPEN_SETTINGS: \"open_settings\"\n    };\n});\n__d(\"GenderConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        UNKNOWN: 0,\n        FEMALE_SINGULAR: 1,\n        MALE_SINGULAR: 2,\n        FEMALE_SINGULAR_GUESS: 3,\n        MALE_SINGULAR_GUESS: 4,\n        MIXED_SINGULAR: 5,\n        MIXED_PLURAL: 5,\n        NEUTER_SINGULAR: 6,\n        UNKNOWN_SINGULAR: 7,\n        FEMALE_PLURAL: 8,\n        MALE_PLURAL: 9,\n        NEUTER_PLURAL: 10,\n        UNKNOWN_PLURAL: 11\n    };\n    e.exports = g;\n});\n__d(\"AsyncLoader\", [\"copyProperties\",\"AsyncRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"AsyncRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        new h(k).setData({\n            ids: l\n        }).setHandler(n).setErrorHandler(o).setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n    };\n    e.exports = j;\n});\n__d(\"BlackbirdUpsell\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"LegacyContextualDialog\",\"DOM\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"PresencePrivacy\",\"copyProperties\",\"BlackbirdUpsellConfig\",\"BlackbirdUpsellConstants\",\"BlackbirdUpsellTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"LegacyContextualDialog\"), k = b(\"DOM\"), l = b(\"LayerDestroyOnHide\"), m = b(\"LayerHideOnTransition\"), n = b(\"PresencePrivacy\"), o = b(\"copyProperties\"), p = b(\"BlackbirdUpsellConfig\"), q = b(\"BlackbirdUpsellConstants\"), r = b(\"BlackbirdUpsellTemplates\"), s = \"/ajax/chat/blackbird/update_clicks.php\", t = \"/ajax/chat/blackbird/update_impressions.php\", u = \"/ajax/chat/blackbird/dismiss.php\", v = 235, w = null, x = null, y = false, z = false;\n    function aa() {\n    \n    };\n    o(aa, {\n        shouldShow: function() {\n            if (this._dialogDismissed) {\n                return false\n            };\n            if (this.isEducation()) {\n                return ((!!p.EducationGK && !p.EducationDismissed) && (p.EducationImpressions < p.EducationImpressionLimit));\n            }\n             else return (((!!p.UpsellGK && !p.UpsellDismissed) && (p.UpsellImpressions < p.UpsellImpressionLimit)) && (p.FriendCount >= p.UpsellMinFriendCount))\n        ;\n        },\n        isEducation: function() {\n            return (p.TimeOffline <= p.EducationTimeOfflineThresdhold);\n        },\n        getOfflineContent: function() {\n            if (this.isEducation()) {\n                return this._getEducationContent();\n            }\n             else return this._getUpsellContent()\n        ;\n        },\n        _getEducationContent: function() {\n            ga();\n            var ka = r[\":fb:chat:blackbird:offline-educate\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ja(q.CLICK_TYPE_OPEN_SETTINGS);\n                da();\n            });\n            return ka.getRoot();\n        },\n        _getUpsellContent: function() {\n            fa();\n            var ka = r[\":fb:chat:blackbird:upsell\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ia(q.CLICK_TYPE_OPEN_SETTINGS);\n                ca();\n            });\n            var ma = ka.getNode(\"enableChatButton\");\n            g.listen(ma, \"click\", function() {\n                ia(q.CLICK_TYPE_ENABLE_CHAT);\n                ca();\n            });\n            return ka.getRoot();\n        },\n        getBlackbirdContent: function(ka) {\n            ga();\n            switch (ka) {\n              case n.ONLINE:\n                return r[\":fb:chat:blackbird:most-friends-educate\"].build().getRoot();\n              case n.OFFLINE:\n                return r[\":fb:chat:blackbird:some-friends-educate\"].build().getRoot();\n            };\n        },\n        showOfflineDialog: function(ka) {\n            this.showDialog(ka, this.getOfflineContent.bind(this));\n        },\n        showBlackbirdDialog: function(ka, la) {\n            this.showDialog(ka, this.getBlackbirdContent.curry(la));\n        },\n        showDialog: function(ka, la) {\n            (!w && this._constructDialog());\n            k.setContent(x, la());\n            w.setContext(ka);\n            w.show();\n        },\n        hide: function() {\n            if ((w && w.isShown())) {\n                w.hide();\n            };\n        },\n        dismiss: function() {\n            this.hide();\n            if (this.isEducation()) {\n                da();\n            }\n             else ca();\n        ;\n        },\n        registerDismissClick: function() {\n            if (this.isEducation()) {\n                ja(q.CLICK_TYPE_DISMISS_PROMO);\n            }\n             else ia(q.CLICK_TYPE_DISMISS_PROMO);\n        ;\n        },\n        isVisible: function() {\n            return (z && !y);\n        },\n        _constructDialog: function() {\n            var ka = r[\":fb:chat:blackbird:dialog-frame\"].build();\n            x = ka.getNode(\"dialogContent\");\n            w = new j();\n            w.init(ka.getRoot());\n            w.setPosition(\"above\").setWidth(v).setFixed(true).disableBehavior(l).disableBehavior(m);\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.dismiss.bind(this));\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.registerDismissClick.bind(this));\n        }\n    });\n    function ba(ka, la) {\n        if ((!y && z)) {\n            y = true;\n            n.inform(\"privacy-user-presence-changed\");\n            var ma = new i(u);\n            ma.setData({\n                source: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                y = false;\n            });\n            ma.send();\n        }\n    ;\n    };\n    function ca() {\n        ba(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n    function da() {\n        ba(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n    function ea(ka, la) {\n        if (!z) {\n            z = true;\n            var ma = new i(t);\n            ma.setData({\n                action: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                z = false;\n            });\n            ma.send();\n        }\n    ;\n    };\n    function fa() {\n        ea(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n    function ga() {\n        ea(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n    function ha(ka, la, ma, na) {\n        var oa = new i(s);\n        oa.setData({\n            action: ka,\n            impressions: ma,\n            source: la,\n            time_offline: na\n        });\n        oa.send();\n    };\n    function ia(ka) {\n        ha(ka, q.ACTION_UPSELL, p.UpsellImpressions, p.TimeOffline);\n    };\n    function ja(ka) {\n        ha(ka, q.ACTION_EDUCATE, p.EducateImpressions, p.TimeOffline);\n    };\n    h.subscribe(\"chat/advanced-settings-dialog-opened\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-online\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-offline\", aa.dismiss.bind(aa));\n    e.exports = aa;\n});\n__d(\"ChatFavoriteNux\", [\"AsyncRequest\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = null, i = false, j = {\n        tryShow: function(k) {\n            if ((h && !i)) {\n                h.setContext(k);\n                h.show();\n                i = true;\n            }\n        ;\n        },\n        tryHide: function() {\n            if ((h && i)) {\n                h.hide();\n                h = null;\n            }\n        ;\n        },\n        registerDialog: function(k) {\n            h = k;\n            if (k) {\n                k.subscribe(\"confirm\", this.dismissDialog);\n            };\n        },\n        dismissDialog: function() {\n            if (h) {\n                new g(\"/ajax/chat/dismiss_favorite_nux.php\").send();\n                h.hide();\n                h = null;\n            }\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"ChatGroupThreadsController\", [\"ArbiterMixin\",\"ChatConfig\",\"InitialMultichatList\",\"MercuryOrderedThreadlist\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MessagingTag\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatConfig\"), i = b(\"InitialMultichatList\"), j = b(\"MercuryOrderedThreadlist\").get(), k = b(\"MercuryServerRequests\").get(), l = b(\"MercuryThreadInformer\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MessagingTag\"), o = b(\"copyProperties\"), p, q = [], r = h.get(\"max_sidebar_multichats\", 3);\n    function s(x) {\n        var y = m.getThreadMetaNow(x);\n        return ((y && !y.is_canonical) && m.canReply(x));\n    };\n    var t = i.payload;\n    if (t) {\n        k.handleUpdate(t);\n        var u = (t.threads || []);\n        q = u.map(function(x) {\n            return x.thread_id;\n        });\n    }\n;\n    if (q.length) {\n        var v = m.getThreadMetaNow(q[(q.length - 1)]);\n        p = (v && ((v.timestamp - 1)));\n    }\n;\n    if (!p) {\n        p = Date.now();\n    };\n    var w = {\n    };\n    o(w, g, {\n        getThreadIDs: function() {\n            var x = 0;\n            return q.filter(function(y) {\n                return (((x < r) && s(y)) && ++x);\n            });\n        }\n    });\n    l.subscribe(\"threadlist-updated\", function() {\n        q = j.getThreadlistUntilTimestamp(p, n.INBOX, n.GROUPS).filter(s);\n        w.inform(\"update\");\n    });\n    e.exports = w;\n});\n__d(\"ChatHovercard\", [\"Arbiter\",\"AsyncLoader\",\"Hovercard\",\"JSLogger\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncLoader\"), i = b(\"Hovercard\"), j = b(\"JSLogger\"), k = b(\"debounce\"), l = 5, m = new h(\"/ajax/chat/hovercard/sidebar.php\", \"hover\"), n = j.create(\"chat_hovercard\");\n    g.subscribe(\"Hovercard/dirty\", m.reset.bind(m));\n    function o(s, t) {\n        m.get(s, function(u) {\n            (function() {\n                if (!u) {\n                    n.error(\"fetch_failure\", {\n                        id: s\n                    });\n                    return;\n                }\n            ;\n                var v = i.getDialog(u);\n                if (!v) {\n                    n.error(\"no_hovercard\", {\n                        id: s,\n                        endpoint: u\n                    });\n                    return;\n                }\n            ;\n                if ((s == t.getActiveID())) {\n                    t.showHovercard(s, v);\n                };\n            }).defer();\n        });\n    };\n    function p(s, t) {\n        var u = [];\n        function v(y) {\n            if (((y >= 0) && (y < s.length))) {\n                u.push(s[y]);\n            };\n        };\n        var w = s.indexOf(t);\n        if ((w > -1)) {\n            v(w);\n            for (var x = 1; (x < l); x++) {\n                v((w + x));\n                v((w - x));\n            };\n        }\n    ;\n        return u.filter(function(y) {\n            return y;\n        });\n    };\n    function q(s, t) {\n        var u = t.getActiveID();\n        if (u) {\n            var v = s.getShowingUsers(), w = p(v, u);\n            m.get(w, function() {\n            \n            });\n        }\n    ;\n    };\n    function r(s) {\n        var t = s.getHoverController();\n        t.registerDefault(o);\n        t.subscribe(\"hover\", k(q.curry(s, t), 100));\n    };\n    e.exports = r;\n});\n__d(\"ChatOptions\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"PresenceUtil\",\"copyProperties\",\"ChatOptionsInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"PresenceUtil\"), k = b(\"copyProperties\"), l = i.create(\"chat_options\"), m = {\n    };\n    (function() {\n        var o = b(\"ChatOptionsInitialData\");\n        for (var p in o) {\n            var q = o[p];\n            m[p] = !!q;\n        };\n    })();\n    var n = k(new g(), {\n        getSetting: function(o) {\n            return m[o];\n        },\n        setSetting: function(o, p, q) {\n            if ((this.getSetting(o) == p)) {\n                return\n            };\n            if (q) {\n                q = (\"from_\" + q);\n                l.log(q, {\n                    name: o,\n                    new_value: p,\n                    old_value: this.getSetting(o)\n                });\n            }\n        ;\n            m[o] = !!p;\n            g.inform(\"chat/option-changed\", {\n                name: o,\n                value: p\n            });\n        }\n    });\n    g.subscribe(h.getArbiterType(\"setting\"), function(o, p) {\n        var q = p.obj;\n        if ((q.window_id === j.getSessionID())) {\n            return\n        };\n        n.setSetting(q.setting, !!q.value, \"channel\");\n    });\n    g.subscribe(i.DUMP_EVENT, function(o, p) {\n        p.chat_options = m;\n    });\n    e.exports = n;\n});\n__d(\"ChatOrderedListHover\", [\"function-extensions\",\"ArbiterMixin\",\"ChatFavoriteList\",\"CSS\",\"ErrorUtils\",\"Event\",\"LayerHideOnBlur\",\"Parent\",\"copyProperties\",\"cx\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatFavoriteList\"), i = b(\"CSS\"), j = b(\"ErrorUtils\"), k = b(\"Event\"), l = b(\"LayerHideOnBlur\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"setTimeoutAcrossTransitions\"), q = b(\"shield\");\n    function r(u) {\n        i.addClass(u, \"fetching\");\n    };\n    function s(u) {\n        i.removeClass(u, \"fetching\");\n    };\n    function t(u) {\n        this._orderedList = u;\n        this._root = u.getRoot();\n        k.listen(this._root, \"mouseover\", this._mouseOver.bind(this));\n        k.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        u.subscribe(\"click\", q(this._hide, this));\n    };\n    n(t.prototype, g, {\n        _root: null,\n        _activeItem: null,\n        _hideTimeout: null,\n        _showTimeout: null,\n        _showingDialog: null,\n        _showingID: null,\n        _handlers: {\n        },\n        _defaultHandler: null,\n        _mouseOver: function(event) {\n            if (this._paused) {\n                return\n            };\n            var u = event.getTarget(), v = (m.byClass(u, \"-cx-PRIVATE-fbChatOrderedList__item\") || m.byClass(u, \"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\"));\n            (v && this._setActiveItem(v));\n        },\n        _mouseLeave: function(event) {\n            this._setActiveItem(null);\n        },\n        _clearTimeouts: function() {\n            (this._showTimeout && clearTimeout(this._showTimeout));\n            this._showTimeout = null;\n            (this._hideTimeout && clearTimeout(this._hideTimeout));\n            this._hideTimeout = null;\n        },\n        _hide: function() {\n            if (this._showingDialog) {\n                this._showingDialog.hide();\n                this._showingDialog = null;\n                this._showingID = null;\n            }\n        ;\n        },\n        _show: function() {\n            var u = this.getActiveID(), v = false;\n            if (this._handlers[u]) {\n                v = true;\n                j.applyWithGuard(this._handlers[u], {\n                }, [u,this,]);\n            }\n             else if (this._defaultHandler) {\n                v = true;\n                j.applyWithGuard(this._defaultHandler, {\n                }, [u,this,]);\n            }\n            \n        ;\n            if ((v && (this._showingID != this.getActiveID()))) {\n                r(this._activeItem);\n            };\n        },\n        _setActiveItem: function(u) {\n            if (h.isEditMode()) {\n                this._clearTimeouts();\n                this._hide();\n                return;\n            }\n        ;\n            if ((u != this._activeItem)) {\n                this._clearTimeouts();\n                (this._activeItem && s(this._activeItem));\n                this._activeItem = null;\n                var v = (u ? 0 : 100);\n                this._hideTimeout = p(function() {\n                    if ((this.getActiveID() != this._showingID)) {\n                        this._hide();\n                    };\n                }.bind(this), v);\n                if (u) {\n                    this._activeItem = u;\n                    var w = (v + 500);\n                    this._showTimeout = p(function() {\n                        this._show();\n                    }.bind(this), w);\n                    this.inform(\"hover\");\n                }\n                 else this.inform(\"leave\");\n            ;\n            }\n        ;\n        },\n        register: function(u, v) {\n            if (!this._handlers[u]) {\n                this._handlers[u] = v;\n                return {\n                    unregister: function() {\n                        if ((u == this._showingID)) {\n                            this._hide();\n                        };\n                        delete this._handlers[u];\n                        var w = this._orderedList.getAllNodes(), x = w[u];\n                        (x && s(x));\n                    }.bind(this)\n                };\n            }\n        ;\n        },\n        registerDefault: function(u) {\n            this._defaultHandler = u;\n        },\n        getActiveID: function() {\n            var u = (this._activeItem && this._orderedList.getUserForNode(this._activeItem));\n            return (u || null);\n        },\n        showHovercard: function(u, v) {\n            if (((u == this.getActiveID()) && (u != this._showingID))) {\n                this._clearTimeouts();\n                s(this._activeItem);\n                this._hide();\n                this._showingDialog = v;\n                this._showingID = u;\n                var w = v.subscribe(\"mouseenter\", this._setActiveItem.bind(this, this._activeItem)), x = v.subscribe(\"mouseleave\", function() {\n                    w.unsubscribe();\n                    this._setActiveItem(null);\n                }.bind(this)), y = v.subscribe(\"hide\", function() {\n                    this.inform(\"hovercard_hide\");\n                    w.unsubscribe();\n                    x.unsubscribe();\n                    y.unsubscribe();\n                }.bind(this));\n                v.enableBehavior(l).setContext(this._activeItem).setPosition(\"left\").show();\n                this.inform(\"hovercard_show\");\n            }\n        ;\n        },\n        setPaused: function(u) {\n            this._paused = u;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatQuietLinks\", [\"Event\",\"DOM\",\"UserAgent\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = {\n    }, m = {\n        silenceLinks: function(q) {\n            n(q, this.removeEmptyHrefs.bind(this));\n        },\n        nukeLinks: function(q) {\n            n(q, this.removeAllHrefs.bind(this));\n        },\n        removeEmptyHrefs: function(q) {\n            o(q, function(r) {\n                return (!r || (r === \"#\"));\n            });\n        },\n        removeAllHrefs: function(q) {\n            o(q);\n        },\n        removeMessagesHrefs: function(q) {\n            o(q, function(r) {\n                return ((!r || (r === \"#\")) || (r.indexOf(\"/messages/\") != -1));\n            });\n        }\n    };\n    function n(q, r) {\n        var s = !!i.chrome(), t = ((!!i.chrome() || (i.ie() >= 9)) || (i.firefox() >= 4));\n        if (l[h.getID(q)]) {\n            return\n        };\n        l[h.getID(q)] = true;\n        if (!t) {\n            return\n        };\n        if (!s) {\n            (r && r(q));\n            return;\n        }\n    ;\n        g.listen(q, \"mouseover\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\");\n            if (w) {\n                var x = w.getAttribute(\"href\");\n                if (p(x)) {\n                    j.set(w, \"stashedHref\", w.getAttribute(\"href\"));\n                    w.removeAttribute(\"href\");\n                }\n            ;\n            }\n        ;\n        });\n        g.listen(q, \"mouseout\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\"), x = (w && j.remove(w, \"stashedHref\"));\n            if (p(x)) {\n                w.setAttribute(\"href\", x);\n            };\n        });\n        g.listen(q, \"mousedown\", function(u) {\n            if (!u.isDefaultRequested()) {\n                return true\n            };\n            var v = k.byTag(u.getTarget(), \"a\"), w = (v && j.get(v, \"stashedHref\"));\n            if (p(w)) {\n                v.setAttribute(\"href\", w);\n            };\n        });\n    };\n    function o(q, r) {\n        var s = h.scry(q, \"a\");\n        if (r) {\n            s = s.filter(function(t) {\n                return r(t.getAttribute(\"href\"));\n            });\n        };\n        s.forEach(function(t) {\n            t.removeAttribute(\"href\");\n            t.setAttribute(\"tabindex\", 0);\n        });\n    };\n    function p(q) {\n        return (q && (q !== \"#\"));\n    };\n    e.exports = m;\n});\n__d(\"ChatSidebarThreadlist.react\", [\"ChatConfig\",\"ChatGroupThreadsController\",\"ChatSidebarConstants\",\"ChatSidebarItem.react\",\"ChatSidebarThread.react\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",\"copyProperties\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfig\"), h = b(\"ChatGroupThreadsController\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarItem.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MercuryParticipants\"), o = b(\"PresenceStatus\"), p = b(\"React\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"fbt\"), t = b(\"ix\"), u = p.createClass({\n        displayName: \"ChatSidebarThreadlist\",\n        render: function() {\n            var v = this.state.threadData, w = this.state.participantData, x = i.IMAGE_SIZE, y = t(\"/images/chat/sidebar/newGroupChat.png\");\n            if (this.props.litestandSidebar) {\n                x = (g.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE);\n                y = (g.get(\"litestand_blended_sidebar\") ? t(\"/images/litestand/sidebar/blended/new_group_chat.png\") : t(\"/images/chat/sidebar/newGroupChatLitestand.png\"));\n            }\n        ;\n            var z = \"New Group Chat...\";\n            z = g.get(\"divebar_group_new_button_name\", z);\n            var aa = [];\n            if (this.props.showNewGroupsButton) {\n                aa.push(p.DOM.li({\n                    className: ((((\"-cx-PRIVATE-fbChatGroupThreadlist__item\") + ((\" \" + \"-cx-PRIVATE-chatSidebarItem__noborder\"))) + ((this.props.offlineItems ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\") : \"\")))),\n                    key: \"new\"\n                }, j({\n                    images: y,\n                    imageSize: x,\n                    litestandSidebar: this.props.litestandSidebar,\n                    name: z\n                })));\n            };\n            var ba = {\n            };\n            for (var ca in v) {\n                var da = v[ca], ea = da.participants.map(function(ia) {\n                    return ((w || {\n                    }))[ia];\n                }).filter(function(ia) {\n                    return ia;\n                }), fa = da.participants.map(function(ia) {\n                    return n.getUserID(ia);\n                }), ga = fa.sort().join(\"|\");\n                if ((!ba[ga] && ea.length)) {\n                    ba[ga] = 1;\n                    var ha = l.getServerThreadIDNow(ca);\n                    aa.push(p.DOM.li({\n                        className: ((((\"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\") + ((\" \" + \"-cx-PRIVATE-fbChatGroupThreadlist__item\"))) + ((this.props.offlineItems ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\") : \"\")))),\n                        \"data-serverthreadid\": ha,\n                        \"data-threadid\": ca,\n                        key: ca\n                    }, k({\n                        image: da.image_src,\n                        imageSize: x,\n                        litestandSidebar: this.props.litestandSidebar,\n                        name: da.name,\n                        participants: ea,\n                        status: o.getGroup(fa),\n                        threadID: ca,\n                        unreadCount: da.unread_count\n                    })));\n                }\n            ;\n            };\n            return p.DOM.ul(null, aa);\n        },\n        getInitialState: function() {\n            return {\n            };\n        },\n        componentWillMount: function() {\n            var v = function() {\n                this.setState(this._calculateState());\n            }.bind(this);\n            this.token = h.subscribe(\"update\", v);\n            v();\n        },\n        componentWillUnmount: function() {\n            (this.token && this.token.unsubscribe());\n            this.token = null;\n        },\n        _calculateState: function() {\n            var v = false, w = {\n            }, x = {\n            }, y = h.getThreadIDs(), z = y.length;\n            y.forEach(function(ba) {\n                m.getThreadMeta(ba, function(ca) {\n                    x[ba] = ca;\n                    n.getMulti(ca.participants, function(da) {\n                        delete da[n.user];\n                        if (v) {\n                            this.setState(this._calculateState());\n                        }\n                         else q(w, da);\n                    ;\n                        z--;\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n            if ((z === 0)) {\n                return {\n                    threadData: x,\n                    participantData: w\n                };\n            }\n             else {\n                v = true;\n                var aa = (this.state || {\n                });\n                return {\n                    threadData: q(aa.threadData, x),\n                    participantData: q(aa.participantData, w)\n                };\n            }\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"runAfterScrollingStops\", [\"Arbiter\",\"Event\",\"Run\",\"debounceAcrossTransitions\",\"emptyFunction\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"debounceAcrossTransitions\"), k = b(\"emptyFunction\"), l = b(\"throttle\");\n    function m(x, y, z) {\n        if ((y && p[y])) {\n            return\n        };\n        if (!o) {\n            g.subscribe(\"page_transition\", w);\n            o = true;\n        }\n    ;\n        if (!n) {\n            x();\n            return;\n        }\n    ;\n        (y && (p[y] = 1));\n        q.push(x);\n        if (!z) {\n            if (s) {\n                i.onLeave(w);\n                s = false;\n            }\n        ;\n            r.push((q.length - 1));\n        }\n    ;\n    };\n    var n, o, p = {\n    }, q = [], r = [], s = true, t = 500, u = j(function() {\n        n = false;\n        var x = q;\n        q = [];\n        r = [];\n        p = {\n        };\n        for (var y = 0, z = x.length; (y < z); ++y) {\n            x[y]();;\n        };\n    }, t);\n    function v() {\n        n = true;\n        u();\n    };\n    function w() {\n        var x = r;\n        r = [];\n        s = true;\n        for (var y = 0, z = x.length; (y < z); ++y) {\n            q[x[y]] = k;;\n        };\n    };\n    h.listen(window, \"scroll\", l.acrossTransitions(v, 250));\n    e.exports = m;\n});\n__d(\"ChatOrderedList\", [\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"CSS\",\"ChannelImplementation\",\"Chat\",\"ChatConfig\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatFavoriteNux\",\"ChatGroupThreadsController\",\"ChatOrderedListHover\",\"ChatQuietLinks\",\"ChatSidebarThreadlist.react\",\"ChatTypeaheadConstants\",\"ChatVisibility\",\"DOM\",\"DataStore\",\"Ease\",\"Event\",\"ImageSourceRequest\",\"ImageSourceType\",\"JSLogger\",\"JSXDOM\",\"LastMobileActiveTimes\",\"MercuryParticipantTypes\",\"MercuryThreadInformer\",\"MercuryThreads\",\"OrderedFriendsList\",\"Parent\",\"PhotoResizeModeConst\",\"PresencePrivacy\",\"React\",\"Rect\",\"ShortProfiles\",\"Style\",\"Tooltip\",\"TypeaheadUtil\",\"URI\",\"Vector\",\"XHPTemplate\",\"copyProperties\",\"createObjectFrom\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"guid\",\"requestAnimationFrame\",\"runAfterScrollingStops\",\"shield\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AvailableList\"), m = b(\"AvailableListConstants\"), n = b(\"Bootloader\"), o = b(\"CSS\"), p = b(\"ChannelImplementation\").instance, q = b(\"Chat\"), r = b(\"ChatConfig\"), s = b(\"ChatContexts\"), t = b(\"ChatFavoriteList\"), u = b(\"ChatFavoriteNux\"), v = b(\"ChatGroupThreadsController\"), w = b(\"ChatOrderedListHover\"), x = b(\"ChatQuietLinks\"), y = b(\"ChatSidebarThreadlist.react\"), z = b(\"ChatTypeaheadConstants\"), aa = b(\"ChatVisibility\"), ba = b(\"DOM\"), ca = b(\"DataStore\"), da = b(\"Ease\"), ea = b(\"Event\"), fa = b(\"ImageSourceRequest\"), ga = b(\"ImageSourceType\"), ha = b(\"JSLogger\"), ia = b(\"JSXDOM\"), ja = b(\"LastMobileActiveTimes\"), ka = b(\"MercuryParticipantTypes\"), la = b(\"MercuryThreadInformer\").get(), ma = b(\"MercuryThreads\").get(), na = b(\"OrderedFriendsList\"), oa = b(\"Parent\"), pa = b(\"PhotoResizeModeConst\"), qa = b(\"PresencePrivacy\"), ra = b(\"React\"), sa = b(\"Rect\"), ta = b(\"ShortProfiles\"), ua = b(\"Style\"), va = b(\"Tooltip\"), wa = b(\"TypeaheadUtil\"), xa = b(\"URI\"), ya = b(\"Vector\"), za = b(\"XHPTemplate\"), ab = b(\"copyProperties\"), bb = b(\"createObjectFrom\"), cb = b(\"csx\"), db = b(\"cx\"), eb = b(\"debounceAcrossTransitions\"), fb = b(\"guid\"), gb = b(\"requestAnimationFrame\"), hb = b(\"runAfterScrollingStops\"), ib = b(\"shield\"), jb = b(\"throttle\"), kb = b(\"tx\"), lb = r.get(\"chat_ranked_by_coefficient\", 0), mb = null, nb, ob, pb = 9;\n    function qb(xb, yb, zb, ac, bc, cc) {\n        this._isSidebar = xb;\n        this._isLitestand = (r.get(\"litestand\", 0) || r.get(\"test_litestand_sidebar\", 0));\n        this._isLitestandSidebar = (this._isSidebar && this._isLitestand);\n        this._hasChatFlyout = (this._isSidebar && r.get(\"litestand_sidebar_chat_flyout\", 0));\n        this._isSidebarFlyout = !!oa.byClass(yb, \"-cx-PUBLIC-litestandSidebarChatFlyout__root\");\n        this._isLeftCollapsedSidebar = !!oa.byClass(yb, \"-cx-PUBLIC-litestandLeftSidebar__root\");\n        this._root = yb;\n        this._itemsMap = {\n        };\n        this._isVisible = false;\n        this._excludedIds = {\n        };\n        this._numTopFriends = 5;\n        this._hasRendered = false;\n        this._preventRendering = false;\n        this._hoverController = null;\n        this._template = zb;\n        this._messageTemplate = ac;\n        this._favoriteMode = r.get(\"divebar_favorite_list\", 0);\n        this._contextualDialog = bc;\n        this._cachedItemHeight = null;\n        this._cachedItemPadding = null;\n        if ((cc && ba.scry(cc, \".-cx-PRIVATE-litestandSidebarPYMK__unit\").length)) {\n            o.show(cc);\n            this._pymk = cc;\n        }\n    ;\n        this._usePlaceholder = (this._isLitestand && this._isSidebar);\n        if (r.get(\"groups_in_divebar\")) {\n            this._groupThreadsNode = ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupthreads\"\n            });\n            this._updateGroupThreads();\n            this._groupsList = (this._favoriteMode && ba.find(this._root, \".-cx-PRIVATE-fbChat__groupslist\"));\n        }\n    ;\n        if (this._favoriteMode) {\n            this._favoriteSidebar = ba.find(this._root, \".-cx-PUBLIC-fbChatOrderedList__favoritesidebar\");\n            this._editButton = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__friendsstickyarea .-cx-PRIVATE-fbChat__editbutton\")[0];\n            this._favoriteList = ba.find(this._root, \".-cx-PRIVATE-fbChat__favoritelist\");\n            this._activeNowList = ba.find(this._root, \".-cx-PRIVATE-fbChat__activenowlist\");\n            this._activeNowLabel = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__activenowlabel\")[0];\n            if (this._activeNowLabel) {\n                this._activeNowArea = oa.byClass(this._activeNowLabel, \"-cx-PRIVATE-fbChatOrderedList__activenowlabelcontainer\");\n            };\n        }\n    ;\n        if (this._hasChatFlyout) {\n            this._sidebarFlyoutItemContainer = ba.find(this._root, \".-cx-PRIVATE-fbChatOrderedList__flyoutitem\");\n        };\n        this._orderedList = ba.find(this._root, \".fbChatOrderedList\");\n        this._scrollableOrderedList = oa.byClass(this._root, \"scrollableOrderedList\");\n        this._chatSidebar = oa.byClass(this._root, \"fbChatSidebar\");\n        this._scrollableArea = oa.byClass(this._root, \"scrollable\");\n        ea.listen(this._root, \"click\", this._onClick.bind(this));\n        ea.listen(this._root, \"mouseenter\", this._mouseEnter.bind(this));\n        ea.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        if (this._editButton) {\n            ea.listen(this._editButton, \"click\", this.toggleEditMode.bind(this));\n            h.subscribe([\"LitestandSidebarBookmarks/close\",\"LitestandSidebar/collapse\",], this._onEditEnd.bind(this));\n        }\n    ;\n        h.subscribe([\"LitestandSidebar/collapse\",\"LitestandSidebar/expand\",], function(event) {\n            if (this._isLitestandSidebar) {\n                this.getHoverController().setPaused((event === \"LitestandSidebar/collapse\"));\n            };\n            this.render();\n        }.bind(this));\n        l.subscribe(m.ON_AVAILABILITY_CHANGED, ib(this.update, this));\n        qa.subscribe(\"privacy-changed\", ib(this.update, this));\n        p.subscribe([p.CONNECTED,p.RECONNECTING,p.SHUTDOWN,p.MUTE_WARNING,p.UNMUTE_WARNING,], ib(this.update, this));\n        this.inform(\"initialized\", this, h.BEHAVIOR_PERSISTENT);\n        this.render();\n        h.subscribe(ha.DUMP_EVENT, function(dc, ec) {\n            ec.chat_lists = (ec.chat_lists || {\n                sorted_list: this.getCachedSortedList(),\n                ordered_list: na.getList(),\n                available_list: qb.getAvailableList(this._excludedIds),\n                excluded_list: this._excludedIds\n            });\n        }.bind(this));\n        h.subscribe(\"ChatOrderedList/itemHeightChange\", function() {\n            this._cachedItemHeight = null;\n            this._cachedItemPadding = null;\n        }.bind(this));\n        this._renderUnreadCount = r.get(\"divebar_message_count\");\n        if (this._renderUnreadCount) {\n            la.subscribe(\"threads-updated\", function(dc, ec) {\n                for (var fc in ec) {\n                    var gc = ma.getCanonicalUserInThread(fc);\n                    if (((!this._renderedTopUsers || !((gc in this._renderedTopUsers))) || !this._itemsMap[gc])) {\n                        continue;\n                    };\n                    ma.getThreadMeta(fc, function(hc) {\n                        var ic = (hc && hc.unread_count);\n                        this._updateUnreadCount(gc, ic);\n                    }.bind(this));\n                };\n            }.bind(this));\n        };\n    };\n    function rb(xb, yb) {\n        var zb = sb(xb, yb);\n        if ((zb !== 0)) {\n            return zb\n        };\n        if (!lb) {\n            var ac = vb(xb, yb);\n            if ((ac !== 0)) {\n                return ac\n            };\n        }\n    ;\n        return na.compare(xb, yb);\n    };\n    function sb(xb, yb) {\n        var zb = qa.allows(xb), ac = qa.allows(yb);\n        if ((zb !== ac)) {\n            return (zb ? -1 : 1)\n        };\n        return 0;\n    };\n    var tb = {\n    };\n    function ub(xb) {\n        return (tb[xb] || (tb[xb] = wa.flatten(xb)));\n    };\n    function vb(xb, yb) {\n        var zb = ta.getNowUnsafe(xb), ac = ta.getNowUnsafe(yb), bc = ub((((zb || {\n        })).name || \"~\")), cc = ub((((ac || {\n        })).name || \"~\"));\n        if ((bc !== cc)) {\n            return ((bc < cc) ? -1 : 1)\n        };\n        return 0;\n    };\n    function wb(xb, yb) {\n        var zb = (l.get(xb) === m.MOBILE), ac = (l.get(yb) === m.MOBILE);\n        if ((zb !== ac)) {\n            return (ac ? -1 : 1)\n        };\n        return vb(xb, yb);\n    };\n    ab(qb, {\n        CONTEXT_CLASSES: {\n            nearby: \"-cx-PRIVATE-fbChatOrderedList__contextnearby\",\n            visiting: \"-cx-PRIVATE-fbChatOrderedList__contextvisiting\",\n            neighbourhood: \"-cx-PRIVATE-fbChatOrderedList__contextneighbourhood\",\n            listening: \"-cx-PRIVATE-fbChatOrderedList__contextlistening\"\n        },\n        getSortedList: function(xb, yb) {\n            var zb = na.getList().filter(function(cc) {\n                return (!((cc in xb)) && (qa.getFriendVisibility(cc) !== qa.BLACKLISTED));\n            }), ac = [];\n            if (!aa.isOnline()) {\n                Array.prototype.push.apply(ac, zb);\n            }\n             else {\n                if ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)) {\n                    zb = this._filterByWhitelist(zb);\n                };\n                if (r.get(\"chat_web_ranking_with_presence\")) {\n                    Array.prototype.push.apply(ac, zb);\n                }\n                 else ac = this._splitOutTopFriends(zb, yb);\n            ;\n            }\n        ;\n            ac = ac.slice(0, yb);\n            if ((ac.length === yb)) {\n                var bc = qb.getAvailableList(ac.concat(xb)).length;\n                (bc && ac.splice(-1));\n            }\n        ;\n            if (!r.get(\"chat_web_ranking_with_presence\")) {\n                ac.sort(rb);\n            };\n            mb = ac.slice();\n            return ac;\n        },\n        _filterByWhitelist: function(xb) {\n            var yb = xb, zb = {\n            }, ac, bc;\n            xb = [];\n            for (ac = 0; (ac < yb.length); ++ac) {\n                bc = yb[ac];\n                if (qa.allows(bc)) {\n                    zb[bc] = true;\n                    xb.push(bc);\n                }\n            ;\n            };\n            var cc = qa.getWhitelist();\n            for (ac = 0; (ac < cc.length); ++ac) {\n                bc = cc[ac];\n                if (!((bc in zb))) {\n                    xb.push(bc);\n                };\n            };\n            for (ac = 0; (ac < yb.length); ++ac) {\n                bc = yb[ac];\n                if (!qa.allows(bc)) {\n                    xb.push(bc);\n                };\n            };\n            return xb;\n        },\n        _splitOutTopFriends: function(xb, yb) {\n            var zb = [], ac = [], bc = r.get(\"ordered_list.top_friends\", 0), cc = r.get(\"ordered_list.top_mobile\", 0), dc = yb, ec = xb.length;\n            for (var fc = 0; ((fc < ec) && (dc > 0)); fc++) {\n                var gc = xb[fc], hc = l.get(gc), ic = (hc === m.ACTIVE);\n                if (((ic || (((hc === m.MOBILE) && (fc < cc)))) || (fc < bc))) {\n                    zb.push(gc);\n                    (ic && dc--);\n                }\n                 else ac.push(gc);\n            ;\n            };\n            if ((fc < ec)) {\n                Array.prototype.push.apply(ac, xb.slice(fc));\n            };\n            if ((zb.length < yb)) {\n                Array.prototype.push.apply(zb, ac);\n            };\n            return zb;\n        },\n        getAvailableList: function(xb) {\n            var yb;\n            if ((r.get(\"divebar_show_mobile_more_friends\") || r.get(\"divebar_show_mobile_more_friends_alphabetical\"))) {\n                yb = l.getAvailableIDs();\n            };\n            if (!yb) {\n                yb = l.getOnlineIDs();\n            };\n            return yb.filter(function(zb) {\n                return !((zb in xb));\n            });\n        },\n        _pause: function() {\n            ob = true;\n        },\n        _unpause: function() {\n            ob = false;\n        },\n        _registerToggleRenderItem: function(xb) {\n            ea.listen(xb, \"click\", function() {\n                ob = !ob;\n                o.conditionClass(xb, \"checked\", ob);\n            });\n        }\n    });\n    ab(qb.prototype, i, {\n        getAllNodes: function() {\n            var xb = {\n            }, yb = ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\");\n            for (var zb = 0; (zb < yb.length); zb++) {\n                var ac = ca.get(yb[zb], \"id\");\n                if (ac) {\n                    xb[ac] = yb[zb];\n                };\n            };\n            return xb;\n        },\n        getShowingUsers: function() {\n            return ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item,li.-cx-PRIVATE-fbChatGroupThreadlist__groupchat\").map(this.getUserForNode);\n        },\n        getUserForNode: function(xb) {\n            return (ca.get(xb, \"id\") || ca.get(xb, \"serverthreadid\"));\n        },\n        getHoverController: function() {\n            if (!this._hoverController) {\n                this._hoverController = new w(this, this._contextualDialog);\n                if ((this._isLitestandSidebar && this._isLitestandSidebarCollapsed())) {\n                    this._hoverController.setPaused(true);\n                };\n            }\n        ;\n            return this._hoverController;\n        },\n        _isLitestandSidebarCollapsed: function() {\n            if (this._isLeftCollapsedSidebar) {\n                return true\n            };\n            if (nb) {\n                return !nb.isExpanded()\n            };\n            n.loadModules([\"LitestandSidebar\",], function(xb) {\n                nb = xb;\n            });\n            return o.hasClass(document.documentElement, \"-cx-PUBLIC-hasLitestandBookmarksSidebar__collapsed\");\n        },\n        getPaddingOffset: function() {\n            return (this._favoriteMode ? 24 : 8);\n        },\n        _calculateItemMeasurements: function() {\n            var xb = this._orderedList, yb = this._template.build(), zb = yb.getRoot();\n            ba.setContent(yb.getNode(\"name\"), \"test\");\n            if (this._favoriteSidebar) {\n                xb = this._favoriteList;\n                o.addClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            }\n        ;\n            zb.style.visibility = \"hidden\";\n            ba.appendContent(xb, zb);\n            this._cachedItemHeight = ya.getElementDimensions(zb).y;\n            this._cachedItemPadding = (ua.getFloat(yb.getNode(\"anchor\"), \"padding\") || 0);\n            ba.remove(zb);\n            if (this._favoriteSidebar) {\n                o.removeClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            };\n        },\n        getItemHeight: function() {\n            if ((this._cachedItemHeight === null)) {\n                this._calculateItemMeasurements();\n            };\n            return this._cachedItemHeight;\n        },\n        getItemPadding: function() {\n            if ((this._cachedItemPadding === null)) {\n                this._calculateItemMeasurements();\n            };\n            return this._cachedItemPadding;\n        },\n        _updateGroupThreads: function() {\n            if (this._groupThreadsNode) {\n                var xb = qa.getVisibility(), yb = y({\n                    offlineItems: (p.disconnected() || !xb),\n                    litestandSidebar: ((((this._isSidebar && this._isLitestand) && !r.get(\"test_old_divebar\"))) || this._isSidebarFlyout),\n                    showNewGroupsButton: r.get(\"divebar_has_new_groups_button\", false)\n                });\n                ra.renderComponent(yb, this._groupThreadsNode);\n            }\n        ;\n        },\n        _placeholderUpdate: function() {\n            if ((!this._usePlaceholder || !this._scrollContainer)) {\n                return\n            };\n            var xb = (this._root.offsetTop - this._scrollContainer.scrollTop);\n            this._scrollContainerHeight = (this._scrollContainerHeight || this._scrollContainer.offsetHeight);\n            var yb = this.getItemHeight(), zb = Math.ceil((this._scrollContainerHeight / yb)), ac = ((xb < 0) ? Math.max((Math.floor((-xb / yb)) - zb), 0) : 0), bc = ((ac + zb) + zb);\n            this._cachedItems = (this._cachedItems || ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\"));\n            for (var cc = 0, dc = this._cachedItems.length; (cc < dc); cc++) {\n                o.conditionClass(this._cachedItems[cc], \"-cx-PRIVATE-fbChatOrderedList__hiddenitem\", ((cc < ac) || (cc > bc)));;\n            };\n        },\n        _getListItem: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return\n            };\n            var ac = l.get(xb), bc = (qa.allows(xb) && !p.disconnected());\n            if ((zb.buttonNode === undefined)) {\n                zb.buttonNode = ba.scry(zb.node, \".-cx-PRIVATE-fbChat__favoritebutton\")[0];\n                zb.contextNode = ba.find(zb.node, \".-cx-PRIVATE-fbChatOrderedList__context\");\n                zb.timeNode = ba.scry(zb.node, \".active_time\")[0];\n                zb.statusNodes = ba.scry(zb.node, \"img.status\");\n            }\n        ;\n            o.conditionClass(zb.node, \"-cx-PRIVATE-fbChatOrderedList__isfavorite\", yb);\n            o.conditionClass(zb.node, \"-cx-PRIVATE-fbChat__isfavorite\", yb);\n            o.conditionClass(zb.node, \"-cx-PRIVATE-litestandSidebarFavorites__favorite\", (this._isLitestand && yb));\n            if (zb.buttonNode) {\n                if (!this._isLitestand) {\n                    o.conditionClass(zb.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__remove\", yb);\n                    o.conditionClass(zb.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__add\", !yb);\n                }\n            \n            };\n            var cc = {\n                active: false,\n                mobile: false\n            };\n            cc.active = (ac === m.ACTIVE);\n            cc.mobile = (ac === m.MOBILE);\n            if (cc.mobile) {\n                var dc = ja.getShortDisplay(xb);\n                if ((zb.timeNode && (zb.lastActiveTime !== dc))) {\n                    zb.lastActiveTime = dc;\n                    ba.setContent(zb.timeNode, dc);\n                }\n            ;\n            }\n             else if (zb.lastActiveTime) {\n                zb.lastActiveTime = null;\n                ba.empty(zb.timeNode);\n            }\n            \n        ;\n            for (var ec in cc) {\n                o.conditionClass(zb.node, ec, (cc[ec] && bc));;\n            };\n            o.conditionClass(zb.node, \"invis\", !bc);\n            zb.statusNodes.forEach(function(fc) {\n                if (((ac === m.ACTIVE) && bc)) {\n                    fc.alt = \"Online\";\n                }\n                 else if (((ac === m.MOBILE) && bc)) {\n                    fc.alt = \"Mobile\";\n                }\n                 else fc.alt = \"\";\n                \n            ;\n            });\n            this._applyContext(xb, zb);\n            return zb.node;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getSortedList: function(xb) {\n            return qb.getSortedList((xb || this._excludedIds), this._numTopFriends);\n        },\n        getCachedSortedList: function(xb) {\n            if ((mb == null)) {\n                mb = this.getSortedList(xb);\n            };\n            return mb;\n        },\n        toggleFavoriteSidebar: function(xb, yb) {\n            function zb(cc, dc) {\n                o.conditionShow(dc, cc);\n                var ec = oa.byClass(dc, \"uiContextualLayerPositioner\");\n                (ec && o.conditionShow(ec, cc));\n            };\n            o.conditionShow(this._orderedList, !xb);\n            if (this._favoriteSidebar) {\n                o.conditionShow(this._favoriteSidebar, xb);\n            };\n            var ac = ba.scry((this._scrollableOrderedList || this._root), \".-cx-PRIVATE-fbChatOrderedList__stickyarea\");\n            ac.forEach(zb.curry(xb));\n            var bc = ba.scry((this._scrollableOrderedList || this._root), \".-cx-PRIVATE-fbChatOrderedList__groupsstickyarea\");\n            (bc.length && zb(yb, bc[0]));\n        },\n        hide: function() {\n            if (!this._isVisible) {\n                return\n            };\n            this._isVisible = false;\n            u.tryHide();\n            o.hide((this._scrollableOrderedList || this._root));\n            this.inform(\"hide\");\n        },\n        _onFavoriteOrderChange: function() {\n            var xb = this.sortableGroup.getOrder();\n            t.updateList(xb);\n            t.save();\n        },\n        _getFavoriteItems: function() {\n            var xb = [], yb = t.get();\n            for (var zb = 0; (zb < yb.length); zb++) {\n                var ac = this._itemsMap[yb[zb]];\n                if (ac) {\n                    xb.push(ac.node);\n                };\n            };\n            return xb;\n        },\n        _getChatTabOpenLogData: function(xb) {\n            var yb = o.hasClass(document.documentElement, \"sidebarMode\"), zb = {\n                mode: (yb ? \"sidebar\" : \"chatNub\"),\n                typehead: false\n            };\n            if ((this._scrollableArea && this._scrollContainer)) {\n                var ac = ya.getElementPosition(this._scrollableArea, \"viewport\").y, bc = ya.getElementPosition(xb, \"viewport\").y, cc = this._scrollContainer.scrollTop;\n                if ((bc > ac)) {\n                    zb.visible_slot = Math.round((((bc - ac)) / 32));\n                    var dc = Math.round((cc / 32));\n                    zb.global_slot = (zb.visible_slot + dc);\n                }\n            ;\n            }\n        ;\n            if (yb) {\n                zb.sidebar_height = (this._chatSidebar && this._chatSidebar.clientHeight);\n                if (this._scrollContainer) {\n                    zb.buddylist_height = this._scrollContainer.clientHeight;\n                };\n            }\n        ;\n            return zb;\n        },\n        _resetFavoriteBounds: function() {\n            var xb = t.get(), yb = xb.length;\n            if (yb) {\n                var zb = xb[0], ac = xb[(yb - 1)], bc = this._itemsMap[zb], cc = this._itemsMap[ac], dc = new sa(ya.getElementPosition(bc.node).y, 0, (ya.getElementPosition(cc.node).y + ya.getElementDimensions(cc.node).y), 0);\n                this.sortableGroup.setBoundingBox(dc);\n            }\n        ;\n        },\n        _createSortableGroup: function() {\n            if (this.sortableGroup) {\n                this.sortableGroup.destroy();\n            };\n            n.loadModules([\"SortableGroup\",], function(xb) {\n                this.sortableGroup = new xb().setBeforeGrabCallback(this._resetFavoriteBounds.bind(this)).setOrderChangeHandler(this._onFavoriteOrderChange.bind(this));\n                if (this._isLitestand) {\n                    this.sortableGroup.gutter = 1;\n                };\n                var yb = this._getFavoriteItems();\n                for (var zb = 0; (zb < yb.length); zb++) {\n                    var ac = yb[zb];\n                    this.sortableGroup.addSortable(ca.get(ac, \"id\"), ac);\n                };\n            }.bind(this));\n        },\n        toggleEditMode: function() {\n            u.dismissDialog();\n            t.toggleEditMode();\n            if (t.isEditMode()) {\n                this._createSortableGroup();\n                ba.setContent(this._editButton, \"DONE\");\n                o.addClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n                this.inform(\"editStart\");\n            }\n             else this._onEditEnd();\n        ;\n        },\n        _onEditEnd: function() {\n            if (t.isEditMode()) {\n                t.toggleEditMode();\n            };\n            ba.setContent(this._editButton, \"EDIT\");\n            o.removeClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n            this.inform(\"editEnd\");\n        },\n        _onClick: function(event) {\n            var xb = event.getTarget(), yb = oa.byTag(xb, \"li\");\n            if (t.isEditMode()) {\n                var zb = oa.byClass(xb, \"-cx-PRIVATE-fbChat__favoritebutton\");\n                if ((zb && yb)) {\n                    var ac = ca.get(yb, \"id\");\n                    if (ac) {\n                        t.toggleID(ac);\n                        t.save();\n                    }\n                ;\n                    this.update();\n                }\n            ;\n                event.prevent();\n                return false;\n            }\n        ;\n            if (yb) {\n                if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                    var bc = new xa(\"/ajax/chat/privacy/settings_dialog.php\").addQueryData({\n                        ref: \"whitelist_separator\"\n                    });\n                    j.send(new k(bc));\n                    event.prevent();\n                    return false;\n                }\n            ;\n                var cc = ca.get(yb, \"id\"), dc = o.hasClass(yb, \"-cx-PRIVATE-fbChatGroupThreadlist__item\");\n                if ((cc || dc)) {\n                    var ec = this._getChatTabOpenLogData(yb), fc = o.hasClass(document.documentElement, \"sidebarMode\"), gc = (qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST), hc = (gc ? \"white_list\" : \"ordered_list\");\n                    if (dc) {\n                        cc = yb.getAttribute(\"data-threadid\");\n                        hc = (cc ? \"recent_threads_in_divebar\" : \"recent_threads_in_divebar_new\");\n                    }\n                     else if (((fc && this._favoriteMode) && !gc)) {\n                        while (yb.parentNode) {\n                            yb = yb.parentNode;\n                            if (o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__activenowlist\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                            if (o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__favoritelist\")) {\n                                break;\n                            };\n                        };\n                    }\n                     else while (yb.previousSibling) {\n                        yb = yb.previousSibling;\n                        if (o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\")) {\n                            if (o.hasClass(yb, \"moreOnlineFriends\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                            if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                                hc = \"blackbird_offline_section\";\n                                break;\n                            }\n                        ;\n                        }\n                    ;\n                    }\n                    \n                ;\n                    ec.source = hc;\n                    var ic = (dc ? z.THREAD_TYPE : ka.FRIEND);\n                    q.openTab(cc, ic, ec);\n                    this.inform(\"click\", {\n                        id: cc\n                    });\n                }\n                 else if ((o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\") && oa.byClass(xb, \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"))) {\n                    this.scrollTo(yb);\n                }\n                 else if (o.hasClass(yb, \"-cx-PRIVATE-litestandSidebarPYMK__root\")) {\n                    return\n                }\n                \n            ;\n                return false;\n            }\n        ;\n        },\n        _mouseEnter: function() {\n            this._preventRendering = true;\n        },\n        _mouseLeave: function() {\n            this._preventRendering = false;\n        },\n        setExcludedIds: function(xb) {\n            this._excludedIds = bb((xb || []));\n        },\n        setNumTopFriends: function(xb) {\n            if ((xb !== this._numTopFriends)) {\n                this._numTopFriends = xb;\n                this.render();\n            }\n        ;\n        },\n        _getOfflineToSectionItems: function() {\n            var xb = (\"subheader-text-\" + fb()), yb = ba.create(\"a\", {\n                href: \"#\",\n                \"aria-describedby\": xb\n            }, ba.tx._(\"Edit\")), zb = [], ac = ba.tx._(\"MORE FRIENDS\");\n            zb.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n            }, ac), ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n            }))))));\n            zb.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator blackbirdWhitelist\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorInner\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorSubheader\"\n            }, ia.span({\n                id: xb,\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorsubheadertext\"\n            }, kb._(\"These friends can't see you on chat. {=link}\", {\n                \"=link\": yb\n            })))))));\n            return zb;\n        },\n        _renderOrderedList: function() {\n            if (((!this._isVisible || ((this._preventRendering && this._hasRendered))) || ob)) {\n                return\n            };\n            this._hasRendered = true;\n            this._cachedItems = null;\n            var xb = [], yb, zb, ac = false, bc = false, cc = r.get(\"divebar_has_new_groups_button\", false), dc = o.hasClass(document.documentElement, \"sidebarMode\"), ec = qa.getVisibility(), fc = (qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST), gc = (this._isLitestandSidebar && this._isLitestandSidebarCollapsed()), hc = r.get(\"groups_in_divebar\");\n            (hc && this._updateGroupThreads());\n            var ic = (hc && v.getThreadIDs().length), jc = (((dc && this._favoriteMode) && ec) && !fc);\n            if ((((jc && hc) && ic) && this._groupThreadsNode)) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                x.nukeLinks(this._groupThreadsNode);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n        ;\n            var kc = ((jc && this._groupThreadsNode) && this._groupsList), lc = (kc && ic), mc = (this._isLitestand && !oa.byClass(this._root, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\"));\n            if ((kc && ((ic || (mc && cc))))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                o.show(this._groupsList);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n             else (this._groupsList && o.hide(this._groupsList));\n        ;\n            var nc = (ic || 0);\n            if ((cc && ((lc || !jc)))) {\n                nc++;\n            };\n            if ((this._hasChatFlyout && this._isLitestandSidebarCollapsed())) {\n                nc++;\n            };\n            var oc = [], pc, qc;\n            if (jc) {\n                (this._chatSidebar && o.addClass(this._chatSidebar, \"fbSidebarFavoriteList\"));\n                oc = t.get();\n                if (gc) {\n                    oc = oc.slice(0, Math.max(0, (this._numTopFriends - nc)));\n                };\n                for (pc = 0, qc = oc.length; (pc < qc); pc++) {\n                    yb = oc[pc];\n                    zb = this._getListItem(yb, true);\n                    if (zb) {\n                        xb.push(zb);\n                    }\n                     else {\n                        bc = true;\n                        this._renderListItem(yb, this.update.bind(this));\n                    }\n                ;\n                };\n            }\n        ;\n            this.toggleFavoriteSidebar(jc, lc);\n            var rc = (gc ? 1 : 0), sc = qb.getSortedList(bb(oc), Math.max(0, (((this._numTopFriends - oc.length) - nc) + rc)));\n            if (jc) {\n                if ((oc.length && sc.length)) {\n                    var tc = ba.create(\"li\", {\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separator\"\n                    });\n                    xb.push(tc);\n                }\n            ;\n            }\n             else if ((ic || cc)) {\n                (this._groupThreadsNode && xb.push(this._groupThreadsNode));\n            }\n        ;\n            var uc = (qa.getVisibility() && (qa.getOnlinePolicy() == qa.ONLINE_TO_WHITELIST));\n            for (var vc = 0, wc = sc.length; (vc < wc); vc++) {\n                yb = sc[vc];\n                if (uc) {\n                    if (!qa.allows(yb)) {\n                        if (((vc + 2) >= sc.length)) {\n                            break;\n                        };\n                        uc = false;\n                        var xc = this._getOfflineToSectionItems();\n                        xb.push(xc[0]);\n                        xb.push(xc[1]);\n                        wc -= 2;\n                    }\n                \n                };\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            };\n            if (jc) {\n                ba.setContent(this._favoriteList, xb);\n                if (xb.length) {\n                    x.nukeLinks(this._favoriteList);\n                };\n                this.inform(\"render\");\n            }\n        ;\n            var yc;\n            if (gc) {\n                yc = [];\n            }\n             else yc = qb.getAvailableList(this._excludedIds);\n        ;\n            var zc = oc.concat(sc), ad = bb(zc);\n            yc = yc.filter(function(jd) {\n                return !((jd in ad));\n            });\n            if (this._renderUnreadCount) {\n                var bd = [];\n                if (this._renderedTopUsers) {\n                    var cd = Object.keys(this._renderedTopUsers).filter(function(jd) {\n                        return !((jd in ad));\n                    });\n                    cd.forEach(function(jd) {\n                        this._updateUnreadCount(jd, 0);\n                    }.bind(this));\n                    zc.forEach(function(jd) {\n                        if (!((jd in this._renderedTopUsers))) {\n                            bd.push(jd);\n                        };\n                    }.bind(this));\n                }\n                 else bd = zc;\n            ;\n                bd.forEach(function(jd) {\n                    ma.getThreadMeta(ma.getThreadIdForUser(jd), function(kd) {\n                        this._updateUnreadCount(jd, (kd && kd.unread_count));\n                    }.bind(this));\n                }.bind(this));\n                this._renderedTopUsers = ad;\n            }\n        ;\n            if (r.get(\"divebar_show_mobile_more_friends_alphabetical\")) {\n                yc.sort(vb);\n            }\n             else yc.sort(wb);\n        ;\n            var dd = \"MORE FRIENDS\";\n            if (jc) {\n                xb = [];\n            }\n             else if ((yc.length && xb.length)) {\n                var ed;\n                if (this._isLitestand) {\n                    ed = ia.span(null, ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                    }, dd, \" \\u00b7 \", yc.length), ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                    }, \" +\", yc.length));\n                }\n                 else ed = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                    \"MORE ONLINE FRIENDS\": dd,\n                    \"=count\": yc.length\n                });\n            ;\n                if (this._pymk) {\n                    ac = true;\n                    xb.push(this._pymk);\n                }\n            ;\n                xb.push(ia.li({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator moreOnlineFriends\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n                }, ed), ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n                }))))));\n            }\n            \n        ;\n            for (pc = 0, qc = yc.length; (pc < qc); pc++) {\n                yb = yc[pc];\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            };\n            if (((!sc.length && !yc.length) && !nc)) {\n                var fd = this._messageTemplate.render(), gd = za.getNode(fd, \"message\");\n                ba.setContent(gd, \"No one is available to chat.\");\n                xb.push(fd);\n            }\n        ;\n            if (this._hasChatFlyout) {\n                var hd = (this._isLitestandSidebarCollapsed() ? this._getSidebarFlyoutItem() : null);\n                ba.setContent(this._sidebarFlyoutItemContainer, hd);\n            }\n        ;\n            if (xb.length) {\n                if (jc) {\n                    o.show(this._activeNowList);\n                    if (this._activeNowLabel) {\n                        var id;\n                        o.show(this._activeNowArea);\n                        if (this._isLitestand) {\n                            id = ia.span(null, ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                            }, dd, \" \\u00b7 \", yc.length), ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                            }, \" +\", yc.length));\n                        }\n                         else id = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                            \"MORE ONLINE FRIENDS\": \"ACTIVE NOW\",\n                            \"=count\": yc.length\n                        });\n                    ;\n                        ba.setContent(this._activeNowLabel, id);\n                    }\n                ;\n                    ba.setContent(this._activeNowList, xb);\n                    x.nukeLinks(this._activeNowList);\n                }\n                 else {\n                    if ((this._pymk && !ac)) {\n                        xb.push(this._pymk);\n                    };\n                    ba.setContent(this._orderedList, xb);\n                    if (this._pymk) {\n                        x.removeMessagesHrefs(this.getRoot());\n                    }\n                     else x.nukeLinks(this.getRoot());\n                ;\n                }\n            ;\n                this.inform(\"render\");\n                this._placeholderUpdate();\n                if (!this._renderingAfterScroll) {\n                    this._renderingAfterScroll = true;\n                    this.render = eb(hb.curry(this._renderOrderedList.bind(this), \"ChatOrderedList/render\", true), 300);\n                }\n            ;\n            }\n             else if (jc) {\n                o.hide(this._activeNowList);\n                if (this._activeNowArea) {\n                    o.hide(this._activeNowArea);\n                };\n            }\n            \n        ;\n            if (jc) {\n                (this._editButton && u.tryShow(this._editButton));\n            }\n             else u.tryHide();\n        ;\n            if ((jc && !bc)) {\n                if ((t.isEditMode() && t.hasChanged())) {\n                    this._createSortableGroup();\n                }\n            };\n        },\n        render: function() {\n            this.render = eb(this._renderOrderedList.bind(this), 300);\n            this.render();\n        },\n        _renderListItem: function(xb, yb) {\n            ta.get(xb, function(zb) {\n                var ac = this._template.render(), bc = za.getNode(ac, \"profile-photo\");\n                if (r.get(\"chat_use_client_side_image_requests\", 0)) {\n                    var cc = (this._isLitestand ? 24 : 28);\n                    new fa().setFBID(zb.id).setType(ga.PROFILE_PICTURE).setDimensions(cc, cc).setResizeMode(pa.COVER).setCallback(function(hc) {\n                        bc.setAttribute(\"src\", hc.uri);\n                    }).send();\n                }\n                 else bc.setAttribute(\"src\", zb.thumbSrc);\n            ;\n                var dc = za.getNode(ac, \"name\");\n                ba.setContent(dc, zb.name);\n                var ec = za.getNode(ac, \"accessible-name\");\n                ba.setContent(ec, zb.name);\n                var fc = za.getNode(ac, \"anchor\");\n                fc.setAttribute(\"href\", (\"/messages/\" + xb));\n                var gc = za.getNode(ac, \"tooltip\");\n                (gc && va.set(gc, zb.name, \"right\"));\n                ca.set(ac, \"id\", xb);\n                this._itemsMap[xb] = {\n                    node: ac\n                };\n                (yb && yb(ac));\n            }.bind(this));\n        },\n        _updateUnreadCount: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return\n            };\n            if (this._isSidebar) {\n                this._unreadMessages = (this._unreadMessages || {\n                });\n                if (!!yb) {\n                    this._unreadMessages[xb] = true;\n                }\n                 else delete this._unreadMessages[xb];\n            ;\n                h.inform(\"buddylist-nub/updateCount\", {\n                    count: Object.keys(this._unreadMessages).length\n                });\n            }\n        ;\n            zb.unreadCount = (zb.unreadCount || ba.find(zb.node, \".-cx-PRIVATE-fbChatOrderedList__unreadcount\"));\n            yb = (yb ? yb : 0);\n            ba.setContent(zb.unreadCount, ((yb > pb) ? (pb + \"+\") : yb));\n            o.conditionClass(zb.unreadCount, \"-cx-PRIVATE-fbChatOrderedList__largecount\", (yb > pb));\n            o.conditionClass(zb.node, \"-cx-PRIVATE-fbChatOrderedList__hasunreadcount\", yb);\n        },\n        _getSidebarFlyoutItem: function() {\n            if (this._flyoutItem) {\n                return this._flyoutItem\n            };\n            this._flyoutItem = (ia.li({\n                className: \"-cx-PRIVATE-litestandSidebarChatFlyoutItem__root\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-litestandSidebarChatFlyoutItem__img\"\n            })));\n            ea.listen(this._flyoutItem, \"mouseenter\", function() {\n                var yb = ia.span(null, \"Chat\", \" \\u00b7 \", l.getOnlineCount());\n                if ((this._flyoutInstance && this._flyoutInstance.isShown())) {\n                    va.remove(this._flyoutItem);\n                }\n                 else va.set(this._flyoutItem, yb, \"right\");\n            ;\n            }.bind(this));\n            var xb = this._showLitestandChatFlyout.bind(this);\n            h.subscribe(\"ChatBeeper/clicked\", xb);\n            ea.listen(this._flyoutItem, \"click\", xb);\n            return this._flyoutItem;\n        },\n        _showLitestandChatFlyout: function() {\n            if (this._loadingFlyout) {\n                return\n            };\n            if (this._flyoutInstance) {\n                this._flyoutInstance.toggle();\n                return;\n            }\n        ;\n            this._loadingFlyout = true;\n            new k(\"/ajax/chat/litestand_flyout\").setData({\n                contextID: ba.getID(this._flyoutItem)\n            }).setAllowCrossPageTransition(true).send();\n            var xb = h.subscribe(\"LitestandChatSidebarFlyout/init\", function(yb, zb) {\n                this._flyoutInstance = zb;\n                this._loadingFlyout = false;\n                xb.unsubscribe();\n                this.subscribe(\"render\", zb.contextPositionInvalidated.bind(zb));\n            }.bind(this));\n        },\n        show: function() {\n            if (this._isVisible) {\n                return\n            };\n            this._isVisible = true;\n            o.show((this._scrollableOrderedList || this._root));\n            this.render();\n            this.inform(\"show\");\n        },\n        isVisible: function() {\n            return this._isVisible;\n        },\n        update: function() {\n            this._hasRendered = false;\n            if (!this._renderRequest) {\n                this._renderRequest = gb(function() {\n                    this.render();\n                    this._renderRequest = null;\n                }.bind(this));\n            };\n        },\n        setScrollContainer: function(xb) {\n            if (ba.contains(xb, this._root)) {\n                this._scrollContainer = xb;\n                if (this._usePlaceholder) {\n                    ea.listen(xb, \"scroll\", jb.acrossTransitions(this._placeholderUpdate.bind(this)));\n                    ea.listen(window, \"resize\", jb.acrossTransitions(function() {\n                        this._scrollContainerHeight = null;\n                        this._placeholderUpdate();\n                    }.bind(this), 250));\n                }\n            ;\n            }\n        ;\n        },\n        scrollTo: function(xb) {\n            if (!this._scrollContainer) {\n                return\n            };\n            var yb = this._scrollContainer.scrollHeight, zb = this._scrollContainer.clientHeight, ac = this._scrollContainer.scrollTop, bc = Math.min(xb.offsetTop, (yb - zb));\n            if ((ac !== bc)) {\n                var cc = (this._isLitestand ? 600 : ((Math.abs((bc - ac)) / this._scrollContainer.clientHeight) * 500)), dc = (this._isLitestand ? da.easeOutExpo : g.ease.end);\n                new g(this._scrollContainer).to(\"scrollTop\", bc).ease(dc).duration(cc).go();\n            }\n        ;\n        },\n        _applyContext: function(xb, yb) {\n            var zb = (s.getShortDisplay(xb) || \"\");\n            if (yb.contextNode) {\n                ba.setContent(yb.contextNode, zb);\n                o.conditionClass(yb.node, \"-cx-PRIVATE-fbChatOrderedList__hascontext\", zb);\n                var ac = s.get(xb), bc = (ac ? ac.type : null);\n                for (var cc in qb.CONTEXT_CLASSES) {\n                    var dc = ((cc === bc)), ec = (qb.CONTEXT_CLASSES[cc] || \"-cx-PRIVATE-fbChatOrderedList__contextother\");\n                    o.conditionClass(yb.contextNode, ec, dc);\n                };\n            }\n        ;\n        }\n    });\n    e.exports = qb;\n});\n__d(\"TypingDetectorController\", [\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"ChannelConnection\",\"ChatVisibility\",\"Keys\",\"PresencePrivacy\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChannelConnection\"), k = b(\"ChatVisibility\"), l = b(\"Keys\"), m = b(\"PresencePrivacy\"), n = b(\"ShortProfiles\"), o = b(\"TypingDetector\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"shield\");\n    function s(u) {\n        if (!k.isOnline()) {\n            return false\n        };\n        if (u) {\n            var v = n.getNow(u);\n            return ((v && (v.type == \"friend\")) && m.allows(u));\n        }\n    ;\n        return true;\n    };\n    function t(u, v, w, x, y) {\n        this.userID = u;\n        this.input = v;\n        this.source = w;\n        this.threadID = y;\n        this.remoteState = o.INACTIVE;\n        this.notifyTimer = null;\n        x = (x || {\n        });\n        this.notifyDelay = (x.notifyDelay || this.notifyDelay);\n        this._typingDetector = new o(v);\n        this._typingDetector.init(x);\n        this._typingDetector.subscribe(\"change\", this._stateChange.bind(this));\n    };\n    p(t.prototype, {\n        notifyDelay: 1000,\n        setUserAndThread: function(u, v) {\n            if (((this.userID !== u) || (this.threadID !== v))) {\n                this.resetState();\n                this.userID = u;\n                this.threadID = v;\n            }\n        ;\n        },\n        setIgnoreEnter: function(u) {\n            var v = (u ? [l.RETURN,] : []);\n            this._typingDetector.setIgnoreKeys(v);\n        },\n        resetState: function() {\n            this.remoteState = t.INACTIVE;\n            this._typingDetector.reset();\n            clearTimeout(this.notifyTimer);\n            this.notifyTimer = null;\n        },\n        _stateChange: function(u, v) {\n            if ((v != o.QUITTING)) {\n                clearTimeout(this.notifyTimer);\n                this.notifyTimer = r(this._notifyState, this, v).defer(this.notifyDelay, false);\n            }\n             else this._notifyState(v, true);\n        ;\n        },\n        _notifyState: function(u, v) {\n            if ((!this.userID && !this.threadID)) {\n                return\n            };\n            var w = this.userID, x = s(w);\n            if ((x && (u != this.remoteState))) {\n                this.remoteState = u;\n                if (j.disconnected()) {\n                    return\n                };\n                var y = {\n                    typ: u,\n                    to: w,\n                    source: this.source,\n                    thread: this.threadID\n                };\n                new g().setHandler(this._onTypResponse.bind(this, w)).setErrorHandler(q).setData(y).setURI(\"/ajax/messaging/typ.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", !v).send();\n            }\n        ;\n        },\n        _onTypResponse: function(u, v) {\n            var w = (v.getPayload() || {\n            });\n            if (w.offline) {\n                h.set(u, i.OFFLINE, \"typing_response\");\n            };\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatBehavior\", [\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"ChatConfig\",\"copyProperties\",\"MercuryConstants\",\"ChatSidebarCalloutData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChatConfig\"), k = b(\"copyProperties\"), l = b(\"MercuryConstants\").ChatNotificationConstants, m = b(\"ChatSidebarCalloutData\").isShown, n = h.getWebChatNotification(), o = m, p = true, q = k(new g(), {\n        ON_CHANGED: \"changed\",\n        notifiesUserMessages: function() {\n            return (n !== l.NO_USER_MESSAGE_NOTIFICATION);\n        },\n        ignoresRemoteTabRaise: function() {\n            return o;\n        },\n        showsTabUnreadUI: function() {\n            if (j.get(\"web_messenger_suppress_tab_unread\")) {\n                return p\n            };\n            return true;\n        }\n    });\n    function r() {\n        q.inform(q.ON_CHANGED);\n    };\n    h.subscribe(i.ON_CHAT_NOTIFICATION_CHANGED, function() {\n        var s = n, t = h.getWebChatNotification();\n        n = t;\n        if ((s != t)) {\n            r();\n        };\n    });\n    g.subscribe(\"chat/set_does_page_occlude_tabs\", function(s, t) {\n        o = !!t;\n        r();\n    });\n    g.subscribe(\"chat/set_show_tab_unread_ui\", function(s, t) {\n        p = !!t;\n        r();\n    });\n    e.exports = q;\n});\n__d(\"ChatSidebarSheet\", [\"JSXDOM\",\"Event\",\"function-extensions\",\"ArbiterMixin\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSLogger\",\"PresencePrivacy\",\"Tooltip\",\"csx\",\"cx\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Event\");\n    b(\"function-extensions\");\n    var i = b(\"ArbiterMixin\"), j = b(\"BlackbirdUpsell\"), k = b(\"ChannelConnection\"), l = b(\"ChannelConstants\"), m = b(\"ChatBehavior\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"JSLogger\"), s = b(\"PresencePrivacy\"), t = b(\"Tooltip\"), u = b(\"csx\"), v = b(\"cx\"), w = b(\"copyProperties\"), x = b(\"tx\"), y = r.create(\"sidebar_sheet\");\n    function z(ca) {\n        switch (ca) {\n          case l.HINT_AUTH:\n            return \"Your session has timed out. Please log in.\";\n          case l.HINT_CONN:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n          case l.HINT_MAINT:\n            return x._(\"Facebook {Chat} is currently down for maintenance.\", {\n                Chat: \"Chat\"\n            });\n          default:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n        };\n    };\n    function aa(ca) {\n        var da;\n        if ((ca === null)) {\n            da = \"Unable to connect to chat. Check your Internet connection.\";\n        }\n         else if ((ca > n.get(\"warning_countdown_threshold_msec\"))) {\n            var ea = q.create(\"a\", {\n                href: \"#\",\n                className: \"fbChatReconnectLink\"\n            }, \"Try again\");\n            da = q.tx._(\"Unable to connect to chat. {try-again-link}\", {\n                \"try-again-link\": ea\n            });\n        }\n         else if ((ca > 1000)) {\n            da = x._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                seconds: Math.floor((ca / 1000))\n            });\n        }\n         else da = \"Unable to connect to chat. Reconnecting...\";\n        \n        \n    ;\n        return da;\n    };\n    function ba(ca) {\n        this._root = ca;\n        this._litestandOffline = q.scry(ca, \".-cx-PRIVATE-fbChatSidebarOffline__placeholder\");\n        this._message = q.find(ca, \"div.fbChatSidebarMessage div.message\");\n        k.subscribe([k.CONNECTED,k.SHUTDOWN,k.RECONNECTING,], this._handleConnectionChange.bind(this));\n        k.subscribe([k.MUTE_WARNING,k.UNMUTE_WARNING,], this._render.bind(this));\n        s.subscribe(\"privacy-user-presence-changed\", this._render.bind(this));\n        m.subscribe(m.ON_CHANGED, this._render.bind(this));\n        this._render();\n    };\n    w(ba.prototype, i, {\n        _channelStatus: null,\n        _channelData: null,\n        _handleConnectionChange: function(ca, da) {\n            this._channelStatus = ca;\n            this._channelData = da;\n            this._render();\n        },\n        _showWarningTimeout: null,\n        _warningMsgEventListener: null,\n        _renderChannelDisconnect: function() {\n            if ((this._channelStatus === k.SHUTDOWN)) {\n                return q.setContent(this._message, z(this._channelData));\n            }\n             else if ((this._channelStatus === k.RECONNECTING)) {\n                var ca = this._channelData;\n                q.setContent(this._message, aa(ca));\n                if ((ca > 1000)) {\n                    if ((ca > n.get(\"warning_countdown_threshold_msec\"))) {\n                        this._warningMsgEventListener = h.listen(this._message, \"click\", function(event) {\n                            if (p.hasClass(event.getTarget(), \"fbChatReconnectLink\")) {\n                                k.reconnect();\n                                return false;\n                            }\n                        ;\n                        });\n                    };\n                    this._showWarningTimeout = setTimeout(this._handleConnectionChange.bind(this, k.RECONNECTING, (ca - 1000)), 1000, false);\n                }\n            ;\n            }\n            \n        ;\n        },\n        _goOnlineEventListener: null,\n        _renderOffline: function() {\n            if (this._isLitestand) {\n                return\n            };\n            if ((this._litestandOffline && this._litestandOffline.length)) {\n                this._renderLitestandOffline();\n            };\n            var ca = \"fbChatGoOnlineLink\", da = \"Turn on chat\", ea = q.create(\"a\", {\n                href: \"#\",\n                className: ca\n            }, da), fa = q.tx._(\"{=Go online} to see who's available.\", {\n                \"=Go online\": ea\n            });\n            q.setContent(this._message, fa);\n            this._goOnlineEventListener = h.listen(this._message, \"click\", function(event) {\n                if (p.hasClass(event.getTarget(), ca)) {\n                    y.log(\"sidebar_go_online\");\n                    o.goOnline();\n                    return false;\n                }\n            ;\n            });\n        },\n        _renderLitestandOffline: function() {\n            this._litestandOffline = this._litestandOffline[0];\n            this._isLitestand = true;\n            var ca = g.div({\n                className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\"\n            }), da = g.a({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__root -cx-PUBLIC-litestandLiquid__hover\",\n                href: \"#\"\n            }, g.i({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__leftborder\"\n            }), g.div({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__center\"\n            }, g.div({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__content\"\n            }, g.i({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__offlineicon\"\n            }), g.div({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__message\"\n            }, q.tx._(\"Turn on Chat\")))), g.i({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__rightborder\"\n            }), ca);\n            t.set(ca, q.tx._(\"Turn on Chat\"), \"right\", \"center\");\n            q.replace(this._litestandOffline, da);\n            this._litestandOffline = null;\n            h.listen(da, \"click\", function(event) {\n                y.log(\"sidebar_go_online\");\n                o.goOnline();\n                event.prevent();\n            });\n        },\n        _renderBlackbirdUpsell: function() {\n            q.setContent(this._message, j.getOfflineContent());\n        },\n        _renderBlackbird: function(ca) {\n            q.setContent(this._message, j.getBlackbirdContent(ca));\n        },\n        _clear: function() {\n            if (this._showWarningTimeout) {\n                clearTimeout(this._showWarningTimeout);\n                this._showWarningTimeout = null;\n            }\n        ;\n            if (this._warningMsgEventListener) {\n                this._warningMsgEventListener.remove();\n                this._warningMsgEventListener = null;\n            }\n        ;\n            if (this._goOnlineEventListener) {\n                this._goOnlineEventListener.remove();\n                this._goOnlineEventListener = null;\n            }\n        ;\n            p.removeClass(this._root, \"upsell\");\n            p.removeClass(this._root, \"offline\");\n            p.removeClass(this._root, \"blackbird\");\n            p.removeClass(this._root, \"error\");\n            p.removeClass(this._root, \"notice\");\n            q.empty(this._message);\n        },\n        _render: function() {\n            this._clear();\n            if (j.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    var ca = (o.isOnline() ? \"blackbird\" : \"upsell\");\n                    p.addClass(this._root, ca);\n                    this._renderBlackbird(s.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    p.addClass(this._root, \"upsell\");\n                    this._renderBlackbirdUpsell();\n                }\n                \n            ;\n            }\n             else if (!o.isOnline()) {\n                p.addClass(this._root, \"offline\");\n                this._renderOffline();\n            }\n             else if (k.disconnected()) {\n                p.addClass(this._root, \"error\");\n                this._renderChannelDisconnect();\n            }\n             else if (!m.notifiesUserMessages()) {\n                p.addClass(this._root, \"notice\");\n                q.setContent(this._message, \"Alerts are off while you use another client to chat.\");\n            }\n            \n            \n            \n        ;\n            this.inform(\"updated\");\n        }\n    });\n    e.exports = ba;\n});\n__d(\"FBDesktopPlugin\", [\"CacheStorage\",\"DOM\",\"Env\",\"FBDesktopDetect\",\"URI\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"CacheStorage\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"FBDesktopDetect\"), k = b(\"URI\"), l = b(\"Style\"), m = new g(\"localstorage\", \"_socialfox_\"), n = {\n        _plugin: \"_not_checked\",\n        arbiterInform: function(o, p) {\n            var q = JSON.stringify({\n                name: o,\n                payload: p\n            });\n            this._transmitCommand(\"arbiterinform\", q);\n        },\n        bringToFront: function() {\n            this._transmitCommand(\"bringtofront\");\n        },\n        dock: function() {\n            this._transmitCommand(\"dock\");\n        },\n        getPlugin: function() {\n            if ((this._plugin === \"_not_checked\")) {\n                this._plugin = null;\n                if (j.isPluginInstalled()) {\n                    var o = h.create(\"object\", {\n                        id: \"kiwi_plugin\",\n                        type: j.mimeType\n                    });\n                    l.set(o, \"width\", 0);\n                    l.set(o, \"height\", 0);\n                    var p = h.create(\"div\", {\n                    }, o);\n                    l.set(p, \"width\", 0);\n                    l.set(p, \"height\", 0);\n                    document.body.appendChild(p);\n                    this._plugin = o;\n                }\n            ;\n            }\n        ;\n            return this._plugin;\n        },\n        getUserID: function() {\n            var o = this.getPlugin();\n            return ((o && (\"getUserID\" in o)) && o.getUserID());\n        },\n        getVersion: function() {\n            var o = this.getPlugin();\n            return ((o && (\"getVersion\" in o)) && o.getVersion());\n        },\n        isAppRunning: function() {\n            var o = this.getPlugin();\n            return ((o && (\"isAppRunning\" in o)) && o.isAppRunning());\n        },\n        launchApp: function() {\n            var o = this.getPlugin();\n            return ((o && (\"launchApp\" in o)) && o.launchApp());\n        },\n        login: function(o, p) {\n            if (((p && o) && (o.length > 0))) {\n                var q = this.getPlugin();\n                if (q) {\n                    this._transmitCommand((((\"relogin\\u000a\" + o) + \"\\u000a\") + p));\n                    return;\n                }\n            ;\n            }\n        ;\n        },\n        logout: function(o) {\n            o = (o || \"0\");\n            var p = this.getPlugin();\n            if (p) {\n                p.logout(o);\n            };\n        },\n        recheck: function() {\n            if ((this._plugin === null)) {\n                this._plugin = \"_not_checked\";\n            };\n        },\n        shouldSuppressBeeper: function() {\n            return this.isAppRunning();\n        },\n        shouldSuppressMessages: function() {\n            if ((m && m.get(\"connected\"))) {\n                return true\n            };\n            var o = this.getUserID();\n            if (o) {\n                return (o === i.user);\n            }\n             else return this.isAppRunning()\n        ;\n        },\n        shouldSuppressSidebar: function() {\n            var o = this.getPlugin(), p = ((o && (\"isAppDocked\" in o)) && o.isAppDocked()), q = (m && (m.get(\"active\") === \"true\"));\n            return (p || q);\n        },\n        transferAuthToken: function(o, p) {\n            if ((o && (o.length > 0))) {\n                var q = this.getPlugin();\n                if (q) {\n                    q.setAccessToken(o, p);\n                    var r = setInterval(function() {\n                        q.setAccessToken(o, p);\n                    }, 500);\n                    setTimeout(function() {\n                        clearInterval(r);\n                    }, (10 * 1000));\n                }\n            ;\n            }\n        ;\n            if (this.redirectHome) {\n                window.location.href = k().setPath().toString();\n            };\n        },\n        _transmitCommand: function(o, p) {\n            p = (p || \"\");\n            var q = this.getPlugin();\n            if ((q && (\"transmitCommand\" in q))) {\n                q.transmitCommand(o, p);\n            };\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatSidebar\", [\"ChatOrderedList\",\"ChatTypeaheadBehavior\",\"ChatTypeaheadCore\",\"ChatTypeaheadDataSource\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadView\",\"Typeahead\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConnection\",\"Chat\",\"ChatConfig\",\"ChatHovercard\",\"ChatImpressionLogger\",\"ChatOptions\",\"ChatSidebarSheet\",\"ChatVisibility\",\"CSS\",\"DOM\",\"DOMDimensions\",\"Event\",\"FBDesktopPlugin\",\"JSLogger\",\"JSXDOM\",\"KeyEventController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"ScrollableArea\",\"Style\",\"UserAgent\",\"ViewportBounds\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"cx\",\"debounce\",\"emptyFunction\",\"fbt\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"ChatTypeaheadBehavior\");\n    b(\"ChatTypeaheadCore\");\n    b(\"ChatTypeaheadDataSource\");\n    b(\"ChatTypeaheadRenderer\");\n    b(\"ChatTypeaheadView\");\n    b(\"Typeahead\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableList\"), k = b(\"AvailableListConstants\"), l = b(\"Bootloader\"), m = b(\"ChannelConnection\"), n = b(\"Chat\"), o = b(\"ChatConfig\"), p = b(\"ChatHovercard\"), q = b(\"ChatImpressionLogger\"), r = b(\"ChatOptions\"), s = b(\"ChatSidebarSheet\"), t = b(\"ChatVisibility\"), u = b(\"CSS\"), v = b(\"DOM\"), w = b(\"DOMDimensions\"), x = b(\"Event\"), y = b(\"FBDesktopPlugin\"), z = b(\"JSLogger\"), aa = b(\"JSXDOM\"), ba = b(\"KeyEventController\"), ca = b(\"OrderedFriendsList\"), da = b(\"Parent\"), ea = b(\"PresencePrivacy\"), fa = b(\"ScrollableArea\"), ga = b(\"Style\"), ha = b(\"UserAgent\"), ia = b(\"ViewportBounds\"), ja = b(\"copyProperties\"), ka = b(\"createArrayFrom\"), la = b(\"csx\"), ma = b(\"cx\"), na = b(\"debounce\"), oa = b(\"emptyFunction\"), pa = b(\"fbt\"), qa = b(\"ge\"), ra = b(\"tx\"), sa, ta = false, ua = false, va = false, wa = false, xa = false, ya = false, za, ab, bb, cb, db, eb = null, fb, gb, hb, ib, jb, kb, lb = 28, mb = 38, nb = z.create(\"chat_sidebar\");\n    function ob() {\n        if (gb) {\n            return\n        };\n        u.removeClass(document.documentElement, \"sidebarMode\");\n        if ((!wa || !yb.isVisible())) {\n            g.inform(\"reflow\");\n            return;\n        }\n    ;\n        va = false;\n        eb = null;\n        za.hide();\n        cb.getCore().reset();\n        u.hide(ab);\n        nb.rate(\"sidebar_hide\", wa);\n        yb.inform(\"sidebar/hide\", yb);\n        g.inform(\"sidebar/hide\", yb);\n        g.inform(\"reflow\");\n    };\n    function pb() {\n        var zb = yb.shouldShowSidebar();\n        u.conditionClass(document.documentElement, \"sidebarCapable\", zb);\n        if ((yb.isEnabled() && zb)) {\n            sb();\n            var ac;\n            if (fb) {\n                var bc = u.hasClass(ab, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\");\n                if (bc) {\n                    return\n                };\n                kb = (kb || v.find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\"));\n                if (fb.has_favorites_editing) {\n                    jb = (jb || v.scry(ab, \".-cx-PRIVATE-litestandSidebarFavorites__sectionheader\")[0]);\n                };\n                ac = [kb,];\n            }\n             else ac = ka(ab.childNodes);\n        ;\n            var cc = rb(ac), dc = (za.getItemHeight() || 32), ec = (za.getPaddingOffset() || 8), fc;\n            if (gb) {\n                if (gb.isExpanded()) {\n                    ec = (ec + lb);\n                    if ((fb && fb.always_show_one_see_more)) {\n                        ec += dc;\n                    };\n                }\n            ;\n                if (!n.isOnline()) {\n                    ec += mb;\n                };\n                var gc = Math.floor((za.getItemPadding() / 2));\n                fc = Math.floor(((((cc - ec) + gc)) / dc));\n                if (!za.isVisible()) {\n                    ga.set(sa, \"height\", (cc + \"px\"));\n                };\n            }\n             else {\n                fc = Math.floor((((cc - ec)) / ((dc + 1))));\n                ga.set(sa, \"height\", (cc + \"px\"));\n            }\n        ;\n            za.setNumTopFriends(fc);\n            var hc = Math.floor((((cc - ec)) / dc));\n            if (ub()) {\n                hc = ((((hc - 2)) > 0) ? (hc - 2) : 0);\n            };\n            cb.getData().setMaxResults(hc);\n            yb.inform(\"sidebar/resized\", yb);\n            g.inform(\"sidebar/resized\", yb);\n            g.inform(\"reflow\");\n        }\n         else ob();\n    ;\n        if (!wa) {\n            wb();\n            wa = true;\n        }\n    ;\n        eb = null;\n    };\n    function qb() {\n        if ((cb && yb.isVisible())) {\n            cb.getCore().getElement().focus();\n        };\n    };\n    function rb(zb) {\n        if (!zb) {\n            if (fb) {\n                kb = (kb || v.find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\"));\n                zb = [kb,];\n            }\n             else zb = ka(ab.childNodes);\n        \n        };\n        var ac = db.height;\n        if ((gb && hb)) {\n            ac -= hb.getFullHeight();\n        };\n        zb.forEach(function(bc) {\n            if ((bc && (bc !== sa))) {\n                ac -= w.getElementDimensions(bc).height;\n            };\n        });\n        return Math.max(0, ac);\n    };\n    function sb() {\n        if (yb.isVisible()) {\n            return\n        };\n        va = true;\n        eb = null;\n        u.show(ab);\n        u.addClass(document.documentElement, \"sidebarMode\");\n        za.show();\n        nb.rate(\"sidebar_show\", wa);\n        yb.inform(\"sidebar/show\", yb);\n        g.inform(\"sidebar/show\", yb);\n        (ib && xb());\n    };\n    function tb() {\n        r.setSetting(\"sidebar_mode\", yb.isEnabled(), \"sidebar\");\n        new i(\"/ajax/chat/settings.php\").setHandler(oa).setErrorHandler(oa).setData({\n            sidebar_mode: yb.isEnabled()\n        }).setAllowCrossPageTransition(true).send();\n    };\n    function ub() {\n        return o.get(\"divebar_typeahead_group_fof\", 0);\n    };\n    function vb() {\n        return (ca.getList().length <= o.get(\"sidebar.min_friends\"));\n    };\n    function wb() {\n        var zb = true;\n        if (!yb.isEnabled()) {\n            nb.log(\"state_not_enabled\");\n            zb = false;\n        }\n    ;\n        if (!yb.isViewportCapable()) {\n            nb.log(\"state_not_shown_viewport\");\n            zb = false;\n        }\n    ;\n        if (ua) {\n            nb.log(\"state_not_shown_hidden\");\n            zb = false;\n        }\n    ;\n        if (vb()) {\n            nb.log(\"state_not_shown_num_friends\");\n            zb = false;\n        }\n    ;\n        if (y.shouldSuppressSidebar()) {\n            nb.log(\"state_not_shown_fbdesktop\");\n            zb = false;\n        }\n    ;\n        nb.log((zb ? \"state_shown\" : \"state_not_shown\"));\n    };\n    function xb() {\n        if (!yb.isVisible()) {\n            return\n        };\n        var zb;\n        if (!t.isOnline()) {\n            zb = \"Offline\";\n        }\n         else if (m.disconnected()) {\n            zb = \"Connection Lost\";\n        }\n         else zb = ra._(\"{Chat} {number-available}\", {\n            Chat: \"Chat\",\n            \"number-available\": ((\"(\" + j.getOnlineCount()) + \")\")\n        });\n        \n    ;\n        v.setContent(ib, zb);\n    };\n    var yb = {\n        init: function(zb, ac, bc, cc) {\n            yb.init = oa;\n            xa = true;\n            ab = zb;\n            za = ac;\n            cb = bc;\n            bb = cc;\n            sa = v.find(zb, \"div.fbChatSidebarBody\");\n            gb = (cc && cc.ls_module);\n            fb = (cc && cc.ls_config);\n            if (gb) {\n                g.subscribe(\"ViewportSizeChange\", function() {\n                    g.inform(\"ChatOrderedList/itemHeightChange\");\n                    pb();\n                });\n                g.subscribe(\"Sidebar/BookmarksHeightChange\", pb);\n                l.loadModules([\"LitestandSidebarBookmarksDisplay\",], function(ec) {\n                    hb = ec;\n                });\n            }\n             else x.listen(window, \"resize\", pb);\n        ;\n            ba.registerKey(\"q\", function() {\n                var ec = null;\n                if (kb) {\n                    ec = v.scry(kb, \".inputsearch\")[0];\n                }\n                 else ec = v.scry(zb, \".inputsearch\")[0];\n            ;\n                if (ec) {\n                    ec.focus();\n                    return false;\n                }\n            ;\n            });\n            new p(ac);\n            var dc = new s(zb);\n            dc.subscribe(\"updated\", pb);\n            g.subscribe(\"sidebar/invalidate\", pb);\n            ac.setScrollContainer(da.byClass(ac.getRoot(), \"uiScrollableAreaWrap\"));\n            ac.subscribe([\"render\",\"show\",\"hide\",], na(function(ec) {\n                if (((ec === \"render\") && !ya)) {\n                    ya = true;\n                    yb.inform(\"sidebar/chatRendered\", null, g.BEHAVIOR_PERSISTENT);\n                }\n            ;\n                var fc = ac.getRoot(), gc = fa.getInstance(fc);\n                (gc && gc.adjustGripper());\n            }));\n            ac.subscribe([\"editStart\",\"editEnd\",], function(ec) {\n                u.conditionClass(cb.getView().element, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\", (ec == \"editStart\"));\n            });\n            if ((ha.firefox() >= 17)) {\n                x.listen(window, \"storage\", function(ec) {\n                    if (((ec.key == \"_socialfox_active\") && (ec.oldValue != ec.newValue))) {\n                        pb();\n                    };\n                });\n            };\n            g.subscribe(\"chat/option-changed\", function(ec, fc) {\n                if ((fc.name == \"sidebar_mode\")) {\n                    ta = !!r.getSetting(\"sidebar_mode\");\n                    pb();\n                }\n            ;\n            });\n            bc.getCore().subscribe(\"sidebar/typeahead/active\", yb.updateOnActiveTypeahead);\n            bc.subscribe(\"reset\", function() {\n                if ((!bc.getCore().getValue() && !za.isVisible())) {\n                    yb.updateOnActiveTypeahead(null, false);\n                };\n            });\n            if (gb) {\n                bc.getCore().subscribe(\"sidebar/typeahead/preActive\", function(ec, fc) {\n                    if ((ta && cb.getView().isVisible())) {\n                        g.inform(ec, fc);\n                    }\n                     else pb();\n                ;\n                });\n            }\n             else g.subscribe(\"buddylist-nub/initialized\", function(ec, fc) {\n                x.listen(fc.getButton(), \"click\", function(event) {\n                    yb.enable();\n                    return !yb.shouldShowSidebar();\n                });\n            });\n        ;\n            ta = !!r.getSetting(\"sidebar_mode\");\n            (ha.ie() && x.listen(zb, \"click\", function(ec) {\n                if (da.byClass(ec.getTarget(), \"-cx-PRIVATE-fbLitestandChatTypeahead__root\")) {\n                    qb();\n                };\n            }));\n            ea.subscribe(\"privacy-user-presence-changed\", pb);\n            pb();\n            q.init(za);\n            if (!gb) {\n                ia.addRight(yb.getVisibleWidth);\n            };\n            yb.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            g.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            if (o.get(\"litestand_blended_sidebar\")) {\n                ib = v.find(zb, \".-cx-PRIVATE-litestandBlendedSidebar__headertext\");\n                j.subscribe(k.ON_AVAILABILITY_CHANGED, na(xb, 2000));\n                m.subscribe([m.CONNECTED,m.RECONNECTING,m.SHUTDOWN,], xb);\n                ea.subscribe(\"privacy-changed\", xb);\n                xb();\n            }\n        ;\n        },\n        updateOnActiveTypeahead: function(zb, ac) {\n            if (!va) {\n                return\n            };\n            if (ac) {\n                za.hide();\n                if (gb) {\n                    u.addClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    var bc = rb();\n                    if (jb) {\n                        bc += w.getElementDimensions(jb).height;\n                    };\n                    ga.set(sa, \"height\", (bc + \"px\"));\n                }\n            ;\n            }\n             else {\n                za.show();\n                if (gb) {\n                    ga.set(sa, \"height\", \"auto\");\n                    u.removeClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    g.inform(\"sidebar/typeahead/active\", false);\n                    pb();\n                }\n                 else pb();\n            ;\n            }\n        ;\n        },\n        isInitialized: function() {\n            return wa;\n        },\n        disable: function() {\n            if (!yb.isEnabled()) {\n                return\n            };\n            ta = false;\n            tb();\n            ob();\n        },\n        enable: function() {\n            if (yb.isEnabled()) {\n                return\n            };\n            ta = true;\n            tb();\n            pb();\n            qb.defer();\n        },\n        forceEnsureLoaded: function() {\n            if (xa) {\n                return\n            };\n            if (qa(\"pagelet_sidebar\")) {\n                return\n            };\n            d([\"UIPagelet\",], function(zb) {\n                var ac = aa.div({\n                    id: \"pagelet_sidebar\"\n                });\n                v.appendContent(document.body, ac);\n                zb.loadFromEndpoint(\"SidebarPagelet\", \"pagelet_sidebar\");\n            });\n            xa = true;\n        },\n        ensureLoaded: function() {\n            if (!ta) {\n                return\n            };\n            yb.forceEnsureLoaded();\n        },\n        hide: function() {\n            if (ua) {\n                return\n            };\n            ua = true;\n            ob();\n        },\n        unhide: function() {\n            if (!ua) {\n                return\n            };\n            ua = false;\n            pb();\n        },\n        getBody: function() {\n            return sa;\n        },\n        getRoot: function() {\n            return ab;\n        },\n        getVisibleWidth: function() {\n            if ((!va || !ab)) {\n                return 0\n            };\n            if ((eb === null)) {\n                eb = ab.offsetWidth;\n            };\n            return eb;\n        },\n        isEnabled: function() {\n            return ta;\n        },\n        isViewportCapable: function() {\n            db = w.getViewportWithoutScrollbarDimensions();\n            if (gb) {\n                return true\n            };\n            var zb = o.get(\"sidebar.minimum_width\");\n            return (db.width > zb);\n        },\n        shouldShowSidebar: function() {\n            var zb = yb.isViewportCapable();\n            return (gb || ((((zb && !ua) && ((!vb() || o.get(\"litestand_blended_sidebar\", false)))) && !y.shouldSuppressSidebar())));\n        },\n        isVisible: function() {\n            return va;\n        },\n        resize: pb,\n        toggle: function() {\n            if (gb) {\n                gb.toggle();\n            }\n             else (yb.isEnabled() ? yb.disable() : yb.enable());\n        ;\n        },\n        isLitestandSidebar: function() {\n            return !!gb;\n        }\n    };\n    ja(yb, h);\n    e.exports = yb;\n});\n__d(\"VideoCallingTour\", [\"Arbiter\",\"ArbiterMixin\",\"Chat\",\"ChatSidebar\",\"ChatVisibility\",\"CSS\",\"DOM\",\"PresencePrivacy\",\"Run\",\"Toggler\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Chat\"), j = b(\"ChatSidebar\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"PresencePrivacy\"), o = b(\"Run\"), p = b(\"Toggler\"), q = b(\"Vector\"), r = b(\"copyProperties\"), s, t, u, v, w = [], x = function() {\n    \n    };\n    function y() {\n        if (j.isVisible()) {\n            z();\n        }\n         else if (u) {\n            aa();\n        }\n    ;\n    };\n    function z() {\n        s.setContext(t.getBody());\n        ba();\n        s.show();\n        ca();\n    };\n    function aa() {\n        if (!v) {\n            v = p.createInstance(u.getRoot());\n        };\n        var fa = m.scry(u.getRoot(), \"div.fbNubFlyout\")[0];\n        if (fa) {\n            s.setContext(fa);\n            ba();\n            s.show();\n            ca();\n        }\n    ;\n    };\n    function ba() {\n        var fa = q.getElementDimensions(s.getContext()).y;\n        s.setOffsetY((fa * 65414));\n        s.updatePosition();\n    };\n    function ca() {\n        if (u) {\n            w.push(u.subscribe(\"hide\", function() {\n                da();\n                if (!j.isVisible()) {\n                    s.hide();\n                };\n            }), u.subscribe(\"show\", function() {\n                s.show();\n            }), u.subscribe(\"resize\", function() {\n                ba();\n                s.updatePosition();\n            }));\n        };\n        w.push(g.subscribe(\"sidebar/show\", z), g.subscribe(\"sidebar/hide\", aa), g.subscribe(\"sidebar/resized\", ba));\n    };\n    function da() {\n        if (v) {\n            v.setSticky(false);\n            v = null;\n        }\n    ;\n    };\n    function ea() {\n        while (w.length) {\n            w.pop().unsubscribe();;\n        };\n        if (u) {\n            da();\n        };\n        s.hide();\n        l.show(\"fbVideoCallingGetStarted\");\n    };\n    r(x, h, {\n        start: function(fa) {\n            s = fa;\n            l.hide(\"fbVideoCallingGetStarted\");\n            k.goOnline(function() {\n                w.push(n.subscribe(\"privacy-user-presence-changed\", ea));\n                o.onLeave(ea);\n                i.openBuddyList();\n                var ga = null;\n                w.push(j.subscribe(\"sidebar/initialized\", function(ha, ia) {\n                    t = ia;\n                    clearTimeout(ga);\n                    ga = y.defer();\n                }), x.subscribe(\"videocallingtour/end\", ea));\n                w.push(g.subscribe(\"buddylist-nub/initialized\", function(ha, ia) {\n                    u = ia;\n                    clearTimeout(ga);\n                    ga = y.defer();\n                }));\n            });\n            x.inform(\"videocallingtour/start\");\n        }\n    });\n    e.exports = x;\n});\n__d(\"ModuleDependencies\", [], function(a, b, c, d, e, f) {\n    function g(k, l, m) {\n        var n = a.require.__debug.modules[m], o = a.require.__debug.deps;\n        if (l[m]) {\n            return\n        };\n        l[m] = true;\n        if (!n) {\n            (o[m] && (k[m] = true));\n            return;\n        }\n    ;\n        if ((!n.dependencies || !n.dependencies.length)) {\n            if (n.waiting) {\n                k[m] = true;\n            };\n            return;\n        }\n    ;\n        n.dependencies.forEach(function(p) {\n            g(k, l, p);\n        });\n    };\n    function h(k) {\n        if (a.require.__debug) {\n            var l = {\n            };\n            g(l, {\n            }, k);\n            var m = Object.keys(l);\n            m.sort();\n            return m;\n        }\n    ;\n        return null;\n    };\n    function i() {\n        var k = {\n            loading: {\n            },\n            missing: []\n        };\n        if (!a.require.__debug) {\n            return k\n        };\n        var l = {\n        }, m = a.require.__debug.modules, n = a.require.__debug.deps;\n        for (var o in m) {\n            var p = m[o];\n            if (p.waiting) {\n                var q = {\n                };\n                g(q, {\n                }, p.id);\n                delete q[p.id];\n                k.loading[p.id] = Object.keys(q);\n                k.loading[p.id].sort();\n                k.loading[p.id].forEach(function(r) {\n                    if ((!((r in m)) && n[r])) {\n                        l[r] = 1;\n                    };\n                });\n            }\n        ;\n        };\n        k.missing = Object.keys(l);\n        k.missing.sort();\n        return k;\n    };\n    var j = {\n        getMissing: h,\n        getNotLoadedModules: i\n    };\n    e.exports = j;\n});\n__d(\"ChatPeopleSuggestionList.react\", [\"ChatSidebarItem.react\",\"fbt\",\"React\",\"ShortProfiles\",\"PresenceStatus\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"fbt\"), i = b(\"React\"), j = b(\"ShortProfiles\"), k = b(\"PresenceStatus\"), l = b(\"cx\"), m = i.createClass({\n        displayName: \"ChatPeopleSuggestionList\",\n        _renderPeopleList: function() {\n            var n = [];\n            this.props.uids.map(function(o) {\n                var p = j.getNow(o);\n                if (p) {\n                    n.push(i.DOM.li(null, g({\n                        isAdded: false,\n                        showEditButton: true,\n                        images: p.thumbSrc,\n                        name: p.name,\n                        status: k.get(o),\n                        onClick: this.props.onClick.curry(o)\n                    })));\n                };\n            }.bind(this));\n            return n;\n        },\n        render: function() {\n            return (i.DOM.div(null, i.DOM.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__header\"\n            }, i.DOM.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__headertext\"\n            }, \"SUGGESTIONS\")), i.DOM.ul({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupslist\"\n            }, this._renderPeopleList())));\n        }\n    });\n    e.exports = m;\n});\n__d(\"Dock\", [\"function-extensions\",\"Event\",\"shield\",\"WebMessengerWidthControl\",\"Arbiter\",\"ArbiterMixin\",\"ChatQuietLinks\",\"CSS\",\"DataStore\",\"DOM\",\"Parent\",\"Style\",\"Toggler\",\"Vector\",\"copyProperties\",\"csx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Event\"), h = b(\"shield\");\n    b(\"WebMessengerWidthControl\");\n    var i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"ChatQuietLinks\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"Toggler\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    function w() {\n    \n    };\n    s(w, j, {\n        MIN_HEIGHT: 140,\n        INITIAL_FLYOUT_HEIGHT_OFFSET: 10,\n        init: function(x) {\n            this.init = u;\n            this.rootEl = x;\n            this.calculateViewportDimensions();\n            this.calculateFlyoutHeightOffset();\n            k.removeEmptyHrefs(this.rootEl);\n            g.listen(x, \"click\", this._onClick.bind(this));\n            g.listen(window, \"resize\", this._onWindowResize.bind(this));\n            q.subscribe([\"show\",\"hide\",], function(y, z) {\n                var aa = z.getActive();\n                if (!n.contains(x, aa)) {\n                    return\n                };\n                if (l.hasClass(aa, \"fbNub\")) {\n                    this.notifyNub(aa, y);\n                    if ((y === \"show\")) {\n                        this._resizeNubFlyout(aa);\n                    };\n                }\n                 else {\n                    var ba = o.byClass(aa, \"fbNubFlyout\");\n                    if (ba) {\n                        l.conditionClass(ba, \"menuOpened\", (y === \"show\"));\n                    };\n                }\n            ;\n            }.bind(this));\n            this.inform(\"init\", {\n            }, i.BEHAVIOR_PERSISTENT);\n        },\n        calculateViewportDimensions: function() {\n            return (this.viewportDimensions = r.getViewportDimensions());\n        },\n        calculateFlyoutHeightOffset: function() {\n            this.flyoutHeightOffset = (this.INITIAL_FLYOUT_HEIGHT_OFFSET + r.getElementDimensions(this.rootEl).y);\n            var x = v(\"blueBar\");\n            if (x) {\n                var y = (p.isFixed(x) ? \"viewport\" : \"document\");\n                this.flyoutHeightOffset += (r.getElementPosition(x, y).y + r.getElementDimensions(x).y);\n            }\n        ;\n        },\n        toggle: function(x) {\n            var y = this._findFlyout(x);\n            if (!y) {\n                return\n            };\n            this.subscribe(\"init\", function() {\n                q.toggle(x);\n            });\n        },\n        show: function(x) {\n            this.subscribe(\"init\", function() {\n                q.show(x);\n            });\n        },\n        showNub: function(x) {\n            l.show(x);\n        },\n        hide: function(x) {\n            this.subscribe(\"init\", function() {\n                var y = q.getInstance(x);\n                (n.contains(x, y.getActive()) && y.hide());\n            });\n        },\n        hideNub: function(x) {\n            l.hide(x);\n            this.hide(x);\n        },\n        setUseMaxHeight: function(x, y) {\n            l.conditionClass(x, \"maxHeight\", (y !== false));\n            this._resizeNubFlyout(x);\n        },\n        _resizeNubFlyout: function(x) {\n            var y = this._findFlyout(x);\n            if ((!y || !((l.hasClass(x, \"openToggler\") || l.hasClass(x, \"opened\"))))) {\n                return\n            };\n            var z = n.find(y, \"div.fbNubFlyoutOuter\"), aa = n.find(z, \"div.fbNubFlyoutInner\"), ba = n.find(aa, \"div.fbNubFlyoutBody\"), ca = ba.scrollTop, da = ba.offsetHeight;\n            p.set(ba, \"height\", \"auto\");\n            var ea = r.getElementDimensions(y), fa = r.getElementDimensions(ba), ga = this.getMaxFlyoutHeight(x);\n            p.set(y, \"max-height\", (ga + \"px\"));\n            p.set(z, \"max-height\", (ga + \"px\"));\n            ea = r.getElementDimensions(y);\n            var ha = r.getElementDimensions(aa), ia = (ha.y - fa.y), ja = (ea.y - ia), ka = parseInt((ba.style.height || ba.clientHeight), 10), la = (ja !== ka);\n            if (((ea.y > ia) && la)) {\n                p.set(ba, \"height\", (ja + \"px\"));\n            };\n            l.removeClass(y, \"swapDirection\");\n            var ma = r.getElementPosition(y).x;\n            l.conditionClass(y, \"swapDirection\", function() {\n                if ((ma < 0)) {\n                    return true\n                };\n                return (((ma + ea.x) > this.viewportDimensions.x));\n            }.bind(this)());\n            if ((la && ((ca + da) >= fa.y))) {\n                ba.scrollTop = ba.scrollHeight;\n            }\n             else ba.scrollTop = ca;\n        ;\n            this.notifyNub(x, \"resize\");\n        },\n        getMaxFlyoutHeight: function(x) {\n            var y = this._findFlyout(x), z = r.getElementPosition(y, \"viewport\"), aa = r.getElementDimensions(y), ba = (Math.max(this.MIN_HEIGHT, (this.viewportDimensions.y - this.flyoutHeightOffset)) - (((this.viewportDimensions.y - z.y) - aa.y)));\n            return Math.max(ba, 0);\n        },\n        resizeAllFlyouts: function() {\n            var x = n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.openToggler\");\n            x = x.concat(n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.opened\"));\n            var y = x.length;\n            while (y--) {\n                this._resizeNubFlyout(x[y]);;\n            };\n        },\n        _onClick: function(event) {\n            var x = event.getTarget(), y = o.byClass(x, \"fbNub\");\n            if (y) {\n                if (o.byClass(x, \"fbNubFlyoutTitlebar\")) {\n                    var z = o.byTag(x, \"a\"), aa = ((x.nodeName == \"INPUT\") && (x.getAttribute(\"type\") == \"submit\"));\n                    if ((!z && !aa)) {\n                        this.hide(y);\n                        return false;\n                    }\n                ;\n                }\n            ;\n                this.notifyNub(y, \"click\");\n            }\n        ;\n        },\n        _onWindowResize: function(event) {\n            this.calculateViewportDimensions();\n            this.resizeAllFlyouts();\n        },\n        _findFlyout: function(x) {\n            return (l.hasClass(x, \"fbNubFlyout\") ? x : (n.scry(x, \"div.fbNubFlyout\")[0] || null));\n        },\n        registerNubController: function(x, y) {\n            m.set(x, \"dock:nub:controller\", y);\n            y.subscribe(\"nub/button/content-changed\", h(this.inform, this, \"resize\", x));\n            y.subscribe(\"nub/flyout/content-changed\", h(this._resizeNubFlyout, this, x));\n        },\n        unregisterNubController: function(x) {\n            m.remove(x, \"dock:nub:controller\");\n        },\n        notifyNub: function(x, y, z) {\n            var aa = m.get(x, \"dock:nub:controller\");\n            (aa && aa.inform(y, z));\n        }\n    });\n    e.exports = (a.Dock || w);\n});\n__d(\"NubController\", [\"ArbiterMixin\",\"Dock\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"Dock\"), i = b(\"copyProperties\");\n    function j() {\n    \n    };\n    i(j.prototype, g, {\n        init: function(k) {\n            this.el = k;\n            h.registerNubController(k, this);\n            return this;\n        },\n        buttonContentChanged: function() {\n            this.inform(\"nub/button/content-changed\");\n        },\n        flyoutContentChanged: function() {\n            this.inform(\"nub/flyout/content-changed\");\n        },\n        hide: function() {\n            h.hide(this.el);\n        },\n        show: function() {\n            h.show(this.el);\n        }\n    });\n    e.exports = j;\n});\n__d(\"DropdownContextualHelpLink\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        set: function(j) {\n            var k = h(\"navHelpCenter\");\n            if ((k !== null)) {\n                g.replace(k, j);\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"ChatActivity\", [\"Event\",\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"JSLogger\",\"MercuryConfig\",\"PresenceState\",\"UserActivity\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AvailableList\"), j = b(\"AvailableListConstants\"), k = b(\"JSLogger\"), l = b(\"MercuryConfig\"), m = b(\"PresenceState\"), n = b(\"UserActivity\"), o = b(\"copyProperties\"), p = (l.activity_limit || 60000), q = (l.idle_limit || 1800000), r = (l.idle_poll_interval || 300000), s = k.create(\"chat_activity\"), t = Date.now(), u = t, v = true;\n    function w() {\n        var aa = Date.now();\n        return !!((v && (((aa - t) < p))));\n    };\n    var x = o(new h(), {\n        isActive: w\n    });\n    function y() {\n        var aa = t;\n        t = Date.now();\n        if (((t - aa) > q)) {\n            s.debug(\"idle_to_active\", aa);\n            m.doSync();\n        }\n    ;\n        x.inform(\"activity\");\n    };\n    i.subscribe(j.ON_AVAILABILITY_CHANGED, function() {\n        if (!i.isUserIdle()) {\n            u = Date.now();\n        };\n    });\n    g.listen(window, \"focus\", function() {\n        v = true;\n        y();\n    });\n    g.listen(window, \"blur\", function() {\n        v = false;\n    });\n    n.subscribe(function() {\n        y();\n    });\n    function z(aa) {\n        var ba = ((aa && aa.at) && m.verifyNumber(aa.at));\n        if ((typeof ba !== \"number\")) {\n            ba = null;\n        };\n        return (ba || 0);\n    };\n    setInterval(function() {\n        var aa = Date.now(), ba = z(m.get()), ca = Math.max(t, ba, u);\n        if (((aa - ca) > q)) {\n            s.debug(\"idle\", {\n                cookie: ba,\n                local: t,\n                presence: u\n            });\n            x.inform(\"idle\", (aa - ca));\n        }\n    ;\n    }, r);\n    m.registerStateStorer(function(aa) {\n        var ba = z(aa);\n        if ((ba < t)) {\n            aa.at = t;\n        };\n        return aa;\n    });\n    h.subscribe(k.DUMP_EVENT, function(aa, ba) {\n        ba.chat_activity = {\n            activity_limit: p,\n            idle_limit: q,\n            idle_poll_interval: r,\n            last_active_time: t,\n            last_global_active_time: u\n        };\n    });\n    e.exports = x;\n});\n__d(\"MercuryNotificationRenderer\", [\"MercuryAssert\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryThreads\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAssert\"), h = b(\"MercuryMessages\").get(), i = b(\"MercuryParticipants\"), j = b(\"MercuryThreads\").get(), k = b(\"tx\");\n    function l(m, n) {\n        g.isThreadID(m);\n        j.getThreadMeta(m, function(o) {\n            h.getThreadMessagesRange(m, 0, 1, function(p) {\n                var q = (p.length && p[(p.length - 1)]);\n                if ((q && (q.author != i.user))) {\n                    i.get(q.author, function(r) {\n                        if (o.name) {\n                            n(k._(\"{senderName} messaged {groupName}\", {\n                                senderName: r.short_name,\n                                groupName: o.name\n                            }));\n                        }\n                         else n(k._(\"{name} messaged you\", {\n                            name: r.short_name\n                        }));\n                    ;\n                    });\n                }\n                 else n(\"New message!\");\n            ;\n            });\n        });\n    };\n    e.exports = {\n        renderDocumentTitle: l\n    };\n});\n__d(\"MercuryTimestampTracker\", [\"MercuryActionTypeConstants\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryActionTypeConstants\"), h = b(\"MercuryPayloadSource\"), i = b(\"MercurySingletonMixin\"), j = b(\"MercuryServerRequests\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._fbid = m;\n        this._serverRequests = j.getForFBID(this._fbid);\n        this._lastTimestamp = 0;\n        this._serverRequests.subscribe(\"update-messages\", function(n, o) {\n            if ((!o.actions || !o.actions.length)) {\n                return\n            };\n            if (((o.payload_source == h.CLIENT_SEND_MESSAGE) || (o.payload_source == h.UNKNOWN))) {\n                return\n            };\n            for (var p = 0; (p < o.actions.length); p++) {\n                var q = o.actions[p], r = q.action_type;\n                if ((((r == g.USER_GENERATED_MESSAGE) && q.thread_id) && (q.timestamp > this._lastTimestamp))) {\n                    this._lastTimestamp = q.timestamp;\n                };\n            };\n        }.bind(this));\n    };\n    k(l.prototype, {\n        getLastUserMessageTimestamp: function() {\n            return this._lastTimestamp;\n        }\n    });\n    k(l, i);\n    e.exports = l;\n});\n__d(\"ChatTitleBarBlinker\", [\"ChatActivity\",\"DocumentTitle\",\"JSLogger\",\"MercuryThreadInformer\",\"MercuryNotificationRenderer\",\"PresenceState\",\"MercuryTimestampTracker\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = b(\"MercuryThreadInformer\").get(), k = b(\"MercuryNotificationRenderer\"), l = b(\"PresenceState\"), m = b(\"MercuryTimestampTracker\").get(), n = i.create(\"chat_title\"), o = null, p = 0, q = false;\n    function r() {\n        if (o) {\n            o.stop();\n            o = null;\n            return true;\n        }\n    ;\n        return false;\n    };\n    function s(x) {\n        var y = (x || m.getLastUserMessageTimestamp());\n        if ((p <= y)) {\n            p = y;\n            if ((r() || q)) {\n                l.doSync();\n            };\n        }\n    ;\n    };\n    var t = {\n        blink: function(x, y) {\n            if ((!o && (p < y))) {\n                k.renderDocumentTitle(x, function(z) {\n                    if (!o) {\n                        o = h.blink(z);\n                    };\n                });\n            };\n        },\n        stopBlinking: function() {\n            s();\n        },\n        blinkingElsewhere: function() {\n            q = true;\n        }\n    };\n    function u(x) {\n        var y = l.verifyNumber(x.sb2);\n        if ((!y || (y <= p))) {\n            return null\n        };\n        return y;\n    };\n    function v(x) {\n        var y = (x && u(x));\n        if (y) {\n            p = y;\n            n.debug(\"load\", p);\n            r();\n            q = false;\n        }\n    ;\n    };\n    function w(x) {\n        var y = u(x);\n        if (!y) {\n            n.debug(\"store\", p);\n            x.sb2 = p;\n            q = false;\n        }\n    ;\n        return x;\n    };\n    l.registerStateStorer(w);\n    l.registerStateLoader(v);\n    j.subscribe(\"thread-read-changed\", function(x, y) {\n        var z = m.getLastUserMessageTimestamp(), aa = 0;\n        for (var ba in y) {\n            if (((y[ba].mark_as_read && (y[ba].timestamp >= z)) && (y[ba].timestamp > aa))) {\n                aa = y[ba].timestamp;\n            };\n        };\n        (aa && s(aa));\n    });\n    g.subscribe(\"activity\", function() {\n        s();\n    });\n    (function() {\n        var x = l.getInitial();\n        if (x) {\n            p = (u(x) || 0);\n        };\n    })();\n    e.exports = t;\n});\n__d(\"swfobject\", [\"AsyncRequest\",\"Bootloader\",\"ControlledReferer\",\"copyProperties\",\"CSS\",\"DOM\",\"function-extensions\",\"ge\",\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"ControlledReferer\"), j = b(\"copyProperties\"), k = b(\"CSS\"), l = b(\"DOM\");\n    b(\"function-extensions\");\n    var m = b(\"ge\"), n = b(\"htmlSpecialChars\");\n    if ((typeof o == \"undefined\")) {\n        var o = {\n        }\n    };\n    if ((typeof o.util == \"undefined\")) {\n        o.util = {\n        };\n    };\n    if ((typeof o.SWFObjectUtil == \"undefined\")) {\n        o.SWFObjectUtil = {\n        };\n    };\n    o.SWFObject = function(u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!document.getElementById) {\n            return\n        };\n        this.DETECT_KEY = (da ? da : \"detectflash\");\n        this.skipDetect = o.util.getRequestParameter(this.DETECT_KEY);\n        this.params = {\n        };\n        this.variables = {\n        };\n        this.attributes = [];\n        this.fallback_html = \"\";\n        this.fallback_js_fcn = function() {\n        \n        };\n        if (u) {\n            this.setAttribute(\"swf\", u);\n        };\n        if (v) {\n            this.setAttribute(\"id\", v);\n        };\n        if (w) {\n            this.setAttribute(\"width\", w);\n        };\n        if (x) {\n            this.setAttribute(\"height\", x);\n        };\n        this.installedVer = o.SWFObjectUtil.getPlayerVersion();\n        if (y) {\n            if (!((y instanceof Array))) {\n                y = [y,];\n            };\n            var ea;\n            y.forEach(function(ha) {\n                ea = new o.PlayerVersion(ha.toString().split(\".\"));\n                if ((ea.major == this.installedVer.major)) {\n                    this.setAttribute(\"version\", ea);\n                    return;\n                }\n                 else if ((!this.getAttribute(\"version\") || (ea.major < this.getAttribute(\"version\").major))) {\n                    this.setAttribute(\"version\", ea);\n                }\n            ;\n            }.bind(this));\n        }\n    ;\n        if (((!window.opera && document.all) && (this.installedVer.major > 7))) {\n            if (!o.unloadSet) {\n                o.SWFObjectUtil.prepUnload = function() {\n                    var ha = function() {\n                    \n                    }, ia = function() {\n                    \n                    };\n                    window.attachEvent(\"onunload\", o.SWFObjectUtil.cleanupSWFs);\n                };\n                window.attachEvent(\"onbeforeunload\", o.SWFObjectUtil.prepUnload);\n                o.unloadSet = true;\n            }\n        \n        };\n        if (z) {\n            this.addParam(\"bgcolor\", z);\n        };\n        var fa = (aa ? aa : \"high\");\n        this.addParam(\"quality\", fa);\n        this.setAttribute(\"useExpressInstall\", false);\n        this.setAttribute(\"doExpressInstall\", false);\n        var ga = ((ba) ? ba : window.location);\n        this.setAttribute(\"xiRedirectUrl\", ga);\n        this.setAttribute(\"redirectUrl\", \"\");\n        if (ca) {\n            this.setAttribute(\"redirectUrl\", ca);\n        };\n        this.setAttribute(\"useIframe\", false);\n    };\n    o.SWFObject.ieWorkaroundApplied = false;\n    o.SWFObject.ensureIEWorkaroundAttached = function() {\n        if ((!o.SWFObject.ieWorkaroundApplied && document.attachEvent)) {\n            o.SWFObject.ieWorkaroundApplied = true;\n            document.attachEvent(\"onpropertychange\", o.SWFObject.onDocumentPropertyChange);\n        }\n    ;\n    };\n    o.SWFObject.onDocumentPropertyChange = function(event) {\n        if ((event.propertyName == \"title\")) {\n            var u = document.title;\n            if (((u != null) && (u.indexOf(\"#!\") != -1))) {\n                u = u.substring(0, u.indexOf(\"#!\"));\n                document.title = u;\n            }\n        ;\n        }\n    ;\n    };\n    j(o.SWFObject.prototype, {\n        useExpressInstall: function(u) {\n            this.xiSWFPath = (!u ? \"/swf/expressinstall.swf\" : u);\n            this.setAttribute(\"useExpressInstall\", true);\n        },\n        setAttribute: function(u, v) {\n            this.attributes[u] = v;\n        },\n        getAttribute: function(u) {\n            return (this.attributes[u] || \"\");\n        },\n        addParam: function(u, v) {\n            this.params[u] = v;\n        },\n        getParams: function() {\n            return this.params;\n        },\n        addVariable: function(u, v) {\n            this.variables[u] = v;\n        },\n        getVariable: function(u) {\n            return (this.variables[u] || \"\");\n        },\n        getVariables: function() {\n            return this.variables;\n        },\n        getVariablePairs: function() {\n            var u = [], v, w = this.getVariables();\n            for (v in w) {\n                u[u.length] = ((v + \"=\") + w[v]);;\n            };\n            return u.join(\"&\");\n        },\n        getSWFHTML: function() {\n            var u, v, w;\n            if (((navigator.plugins && navigator.mimeTypes) && navigator.mimeTypes.length)) {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"PlugIn\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n                v = {\n                    type: \"application/x-shockwave-flash\",\n                    src: this.getAttribute(\"swf\"),\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: (this.getAttribute(\"style\") || \"display: block;\"),\n                    id: this.getAttribute(\"id\"),\n                    name: this.getAttribute(\"id\")\n                };\n                var x = this.getParams();\n                for (var y in x) {\n                    v[y] = x[y];;\n                };\n                w = this.getVariablePairs();\n                if (w) {\n                    v.flashvars = w;\n                };\n                u = t(\"embed\", v, null);\n            }\n             else {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"ActiveX\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n                v = {\n                    id: this.getAttribute(\"id\"),\n                    classid: \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: (this.getAttribute(\"style\") || \"display: block;\")\n                };\n                var z = t(\"param\", {\n                    name: \"movie\",\n                    value: this.getAttribute(\"swf\")\n                }, null), x = this.getParams();\n                for (var y in x) {\n                    z += t(\"param\", {\n                        name: y,\n                        value: x[y]\n                    }, null);;\n                };\n                w = this.getVariablePairs();\n                if (w) {\n                    z += t(\"param\", {\n                        name: \"flashvars\",\n                        value: w\n                    }, null);\n                };\n                u = t(\"object\", v, z);\n            }\n        ;\n            return u;\n        },\n        write: function(u) {\n            if (this.getAttribute(\"useExpressInstall\")) {\n                var v = new o.PlayerVersion([6,0,65,]);\n                if ((this.installedVer.versionIsValid(v) && !this.installedVer.versionIsValid(this.getAttribute(\"version\")))) {\n                    this.setAttribute(\"doExpressInstall\", true);\n                    this.addVariable(\"MMredirectURL\", escape(this.getAttribute(\"xiRedirectUrl\")));\n                    document.title = (document.title.slice(0, 47) + \" - Flash Player Installation\");\n                    this.addVariable(\"MMdoctitle\", document.title);\n                }\n            ;\n            }\n        ;\n            var w = (((typeof u == \"string\")) ? document.getElementById(u) : u);\n            if (!w) {\n                return false\n            };\n            k.addClass(w, \"swfObject\");\n            w.setAttribute(\"data-swfid\", this.getAttribute(\"id\"));\n            if (((this.skipDetect || this.getAttribute(\"doExpressInstall\")) || this.installedVer.versionIsValid(this.getAttribute(\"version\")))) {\n                if (!this.getAttribute(\"useIframe\")) {\n                    o.SWFObject.ensureIEWorkaroundAttached();\n                    w.innerHTML = this.getSWFHTML();\n                }\n                 else this._createIframe(w);\n            ;\n                return true;\n            }\n             else {\n                if ((this.getAttribute(\"redirectUrl\") != \"\")) {\n                    document.location.replace(this.getAttribute(\"redirectUrl\"));\n                };\n                var x = ((((((this.getAttribute(\"version\").major + \".\") + this.getAttribute(\"version\").minor) + \".\") + this.getAttribute(\"version\").release) + \".\") + this.getAttribute(\"version\").build), y = ((((((this.installedVer.major + \".\") + this.installedVer.minor) + \".\") + this.installedVer.release) + \".\") + this.installedVer.build);\n                this.fallback_js_fcn(y, x);\n                w.innerHTML = this.fallback_html;\n            }\n        ;\n            return false;\n        },\n        _createIframe: function(u) {\n            var v = l.create(\"iframe\", {\n                width: this.getAttribute(\"width\"),\n                height: this.getAttribute(\"height\"),\n                frameBorder: 0\n            });\n            l.empty(u);\n            u.appendChild(v);\n            i.useFacebookRefererHtml(v, this.getSWFHTML(), this.getAttribute(\"iframeSource\"));\n        }\n    });\n    o.SWFObjectUtil.getPlayerVersion = function() {\n        var u = new o.PlayerVersion([0,0,0,0,]), v;\n        if ((navigator.plugins && navigator.mimeTypes.length)) {\n            for (var w = 0; (w < navigator.plugins.length); w++) {\n                try {\n                    var y = navigator.plugins[w];\n                    if ((y.name == \"Shockwave Flash\")) {\n                        v = new o.PlayerVersion(y.description.replace(/([a-zA-Z]|\\s)+/, \"\").replace(/(\\s+(r|d)|\\s+b[0-9]+)/, \".\").split(\".\"));\n                        if ((((typeof u == \"undefined\") || (v.major > u.major)) || (((v.major == u.major) && (((v.minor > u.minor) || (((v.minor == u.minor) && (((v.release > u.release) || (((v.release == u.release) && (v.build > u.build))))))))))))) {\n                            u = v;\n                        };\n                    }\n                ;\n                } catch (x) {\n                \n                };\n            };\n        }\n         else if ((navigator.userAgent && (navigator.userAgent.indexOf(\"Windows CE\") >= 0))) {\n            var z = 1, aa = 3;\n            while (z) {\n                try {\n                    aa++;\n                    z = new ActiveXObject((\"ShockwaveFlash.ShockwaveFlash.\" + aa));\n                    u = new o.PlayerVersion([aa,0,0,]);\n                } catch (ba) {\n                    z = null;\n                };\n            };\n        }\n         else {\n            try {\n                var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n            } catch (ca) {\n                try {\n                    var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n                    u = new o.PlayerVersion([6,0,21,]);\n                    z.AllowScriptAccess = \"always\";\n                } catch (da) {\n                    if ((u.major == 6)) {\n                        return u\n                    };\n                };\n                try {\n                    z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n                } catch (ea) {\n                \n                };\n            };\n            if ((z != null)) {\n                u = new o.PlayerVersion(z.GetVariable(\"$version\").split(\" \")[1].split(\",\"));\n            };\n        }\n        \n    ;\n        return u;\n    };\n    o.PlayerVersion = function(u) {\n        this.major = ((u[0] != null) ? parseInt(u[0], 10) : 0);\n        this.minor = ((u[1] != null) ? parseInt(u[1], 10) : 0);\n        this.release = ((u[2] != null) ? parseInt(u[2], 10) : 0);\n        this.build = ((u[3] != null) ? parseInt(u[3], 10) : 0);\n    };\n    o.PlayerVersion.prototype.versionIsValid = function(u) {\n        if ((this.major < u.major)) {\n            return false\n        };\n        if ((this.major > u.major)) {\n            return true\n        };\n        if ((this.minor < u.minor)) {\n            return false\n        };\n        if ((this.minor > u.minor)) {\n            return true\n        };\n        if ((this.release < u.release)) {\n            return false\n        };\n        if ((this.release > u.release)) {\n            return true\n        };\n        if ((this.build < u.build)) {\n            return false\n        };\n        return true;\n    };\n    o.util = {\n        getRequestParameter: function(u) {\n            var v = (document.location.search || document.location.hash);\n            if ((u == null)) {\n                return v\n            };\n            if (v) {\n                var w = v.substring(1).split(\"&\");\n                for (var x = 0; (x < w.length); x++) {\n                    if ((w[x].substring(0, w[x].indexOf(\"=\")) == u)) {\n                        return w[x].substring(((w[x].indexOf(\"=\") + 1)))\n                    };\n                };\n            }\n        ;\n            return \"\";\n        }\n    };\n    o.SWFObjectUtil.cleanupSWFs = function() {\n        var u = document.getElementsByTagName(\"OBJECT\");\n        for (var v = (u.length - 1); (v >= 0); v--) {\n            u[v].style.display = \"none\";\n            for (var w in u[v]) {\n                if ((typeof u[v][w] == \"function\")) {\n                    u[v][w] = function() {\n                    \n                    };\n                };\n            };\n        };\n    };\n    if ((!document.getElementById && document.all)) {\n        document.getElementById = function(u) {\n            return document.all[u];\n        };\n    };\n    var p = o.util.getRequestParameter, q = o.SWFObject, r = o.SWFObject;\n    o.spawn_flash_update_dialog = function() {\n        new g().setURI(\"/ajax/flash_update_dialog.php\").setMethod(\"GET\").setReadOnly(true).send();\n    };\n    function s(u, v) {\n        var w = m(u), x = o.SWFObjectUtil.getPlayerVersion(), y;\n        v.forEach(function(ba) {\n            ba = new o.PlayerVersion(ba.toString().split(\".\"));\n            if ((ba.major == x.major)) {\n                y = ba;\n                return;\n            }\n             else if (((typeof y == \"undefined\") || (ba.major < y.major))) {\n                y = ba;\n            }\n        ;\n        }.bind(this));\n        if ((w && (x.major > 0))) {\n            var z = ((((((x.major + \".\") + x.minor) + \".\") + x.release) + \".\") + x.build), aa = ((((((y.major + \".\") + y.minor) + \".\") + y.release) + \".\") + y.build);\n            l.setContent(w, l.tx._(\"Flash {required-version} is required to view this content. Your current version is {current-version}. Please download the latest Flash Player.\", {\n                \"required-version\": aa,\n                \"current-version\": z\n            }));\n        }\n    ;\n    };\n    o.showFlashErrorDialog = function(u, v) {\n        h.loadModules([\"ErrorDialog\",], function(w) {\n            w.show(u, v);\n        });\n    };\n    function t(u, v, w) {\n        var x = /^[A-Za-z0-9\\-]+$/;\n        if (!u.match(x)) {\n            throw new Error((\"Invalid tag \" + u))\n        };\n        var y = (\"\\u003C\" + u);\n        for (var z in v) {\n            if (!z.match(x)) {\n                throw new Error((\"Invalid attr \" + z))\n            };\n            y += ((((\" \" + z) + \"=\\\"\") + n(v[z])) + \"\\\"\");\n        };\n        if ((w === null)) {\n            return (y + \"/\\u003E\");\n        }\n         else return (((((y + \"\\u003E\") + w) + \"\\u003C/\") + u) + \"\\u003E\")\n    ;\n    };\n    e.exports = (a.deconcept || o);\n});\n__d(\"swfobject2\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"undefined\", i = \"object\", j = \"Shockwave Flash\", k = \"ShockwaveFlash.ShockwaveFlash\", l = \"application/x-shockwave-flash\", m = \"SWFObjectExprInst\", n = \"onreadystatechange\", o = window, p = document, q = navigator, r = false, s = [ka,], t = [], u = [], v = [], w, x, y, z, aa = false, ba = false, ca, da, ea = true, fa = function() {\n            var eb = (((typeof p.getElementById != h) && (typeof p.getElementsByTagName != h)) && (typeof p.createElement != h)), fb = q.userAgent.toLowerCase(), gb = q.platform.toLowerCase(), hb = (gb ? /win/.test(gb) : /win/.test(fb)), ib = (gb ? /mac/.test(gb) : /mac/.test(fb)), jb = (/webkit/.test(fb) ? parseFloat(fb.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/, \"$1\")) : false), kb = !+\"\\u000b1\", lb = [0,0,0,], mb = null;\n            if (((typeof q.plugins != h) && (typeof q.plugins[j] == i))) {\n                mb = q.plugins[j].description;\n                if ((mb && !((((typeof q.mimeTypes != h) && q.mimeTypes[l]) && !q.mimeTypes[l].enabledPlugin)))) {\n                    r = true;\n                    kb = false;\n                    mb = mb.replace(/^.*\\s+(\\S+\\s+\\S+$)/, \"$1\");\n                    lb[0] = parseInt(mb.replace(/^(.*)\\..*$/, \"$1\"), 10);\n                    lb[1] = parseInt(mb.replace(/^.*\\.(.*)\\s.*$/, \"$1\"), 10);\n                    lb[2] = (/[a-zA-Z]/.test(mb) ? parseInt(mb.replace(/^.*[a-zA-Z]+(.*)$/, \"$1\"), 10) : 0);\n                }\n            ;\n            }\n             else if ((typeof o.ActiveXObject != h)) {\n                try {\n                    var ob = new ActiveXObject(k);\n                    if (ob) {\n                        mb = ob.GetVariable(\"$version\");\n                        if (mb) {\n                            kb = true;\n                            mb = mb.split(\" \")[1].split(\",\");\n                            lb = [parseInt(mb[0], 10),parseInt(mb[1], 10),parseInt(mb[2], 10),];\n                        }\n                    ;\n                    }\n                ;\n                } catch (nb) {\n                \n                }\n            }\n        ;\n            return {\n                w3: eb,\n                pv: lb,\n                wk: jb,\n                ie: kb,\n                win: hb,\n                mac: ib\n            };\n        }(), ga = function() {\n            if (!fa.w3) {\n                return\n            };\n            if (((((typeof p.readyState != h) && (p.readyState == \"complete\"))) || (((typeof p.readyState == h) && ((p.getElementsByTagName(\"body\")[0] || p.body)))))) {\n                ha();\n            };\n            if (!aa) {\n                if ((typeof p.addEventListener != h)) {\n                    p.addEventListener(\"DOMContentLoaded\", ha, false);\n                };\n                if ((fa.ie && fa.win)) {\n                    p.attachEvent(n, function() {\n                        if ((p.readyState == \"complete\")) {\n                            p.detachEvent(n, arguments.callee);\n                            ha();\n                        }\n                    ;\n                    });\n                    if ((o == top)) {\n                        (function() {\n                            if (aa) {\n                                return\n                            };\n                            try {\n                                p.documentElement.doScroll(\"left\");\n                            } catch (eb) {\n                                setTimeout(arguments.callee, 0);\n                                return;\n                            };\n                            ha();\n                        })();\n                    };\n                }\n            ;\n                if (fa.wk) {\n                    (function() {\n                        if (aa) {\n                            return\n                        };\n                        if (!/loaded|complete/.test(p.readyState)) {\n                            setTimeout(arguments.callee, 0);\n                            return;\n                        }\n                    ;\n                        ha();\n                    })();\n                };\n                ja(ha);\n            }\n        ;\n        }();\n        function ha() {\n            if (aa) {\n                return\n            };\n            try {\n                var fb = p.getElementsByTagName(\"body\")[0].appendChild(xa(\"span\"));\n                fb.parentNode.removeChild(fb);\n            } catch (eb) {\n                return;\n            };\n            aa = true;\n            var gb = s.length;\n            for (var hb = 0; (hb < gb); hb++) {\n                s[hb]();;\n            };\n        };\n        function ia(eb) {\n            if (aa) {\n                eb();\n            }\n             else s[s.length] = eb;\n        ;\n        };\n        function ja(eb) {\n            if ((typeof o.addEventListener != h)) {\n                o.addEventListener(\"load\", eb, false);\n            }\n             else if ((typeof p.addEventListener != h)) {\n                p.addEventListener(\"load\", eb, false);\n            }\n             else if ((typeof o.attachEvent != h)) {\n                ya(o, \"onload\", eb);\n            }\n             else if ((typeof o.onload == \"function\")) {\n                var fb = o.onload;\n                o.onload = function() {\n                    fb();\n                    eb();\n                };\n            }\n             else o.onload = eb;\n            \n            \n            \n        ;\n        };\n        function ka() {\n            if (r) {\n                la();\n            }\n             else ma();\n        ;\n        };\n        function la() {\n            var eb = p.getElementsByTagName(\"body\")[0], fb = xa(i);\n            fb.setAttribute(\"type\", l);\n            fb.setAttribute(\"style\", \"visibility: hidden; position: absolute; top: -1000px;\");\n            var gb = eb.appendChild(fb);\n            if (gb) {\n                var hb = 0;\n                (function() {\n                    if ((typeof gb.GetVariable != h)) {\n                        var ib = gb.GetVariable(\"$version\");\n                        if (ib) {\n                            ib = ib.split(\" \")[1].split(\",\");\n                            fa.pv = [parseInt(ib[0], 10),parseInt(ib[1], 10),parseInt(ib[2], 10),];\n                        }\n                    ;\n                    }\n                     else if ((hb < 10)) {\n                        hb++;\n                        setTimeout(arguments.callee, 10);\n                        return;\n                    }\n                    \n                ;\n                    gb = null;\n                    ma();\n                })();\n            }\n             else ma();\n        ;\n        };\n        function ma() {\n            var eb = t.length;\n            if ((eb > 0)) {\n                for (var fb = 0; (fb < eb); fb++) {\n                    var gb = t[fb].id, hb = t[fb].callbackFn, ib = {\n                        success: false,\n                        id: gb\n                    };\n                    if ((fa.pv[0] > 0)) {\n                        var jb = wa(gb);\n                        if (jb) {\n                            if ((za(t[fb].swfVersion) && !((fa.wk && (fa.wk < 312))))) {\n                                bb(gb, true);\n                                if (hb) {\n                                    ib.success = true;\n                                    ib.ref = na(gb);\n                                    hb(ib);\n                                }\n                            ;\n                            }\n                             else if ((t[fb].expressInstall && oa())) {\n                                var kb = {\n                                };\n                                kb.data = t[fb].expressInstall;\n                                kb.width = (jb.getAttribute(\"width\") || \"0\");\n                                kb.height = (jb.getAttribute(\"height\") || \"0\");\n                                if (jb.getAttribute(\"class\")) {\n                                    kb.styleclass = jb.getAttribute(\"class\");\n                                };\n                                if (jb.getAttribute(\"align\")) {\n                                    kb.align = jb.getAttribute(\"align\");\n                                };\n                                var lb = {\n                                }, mb = jb.getElementsByTagName(\"param\"), nb = mb.length;\n                                for (var ob = 0; (ob < nb); ob++) {\n                                    if ((mb[ob].getAttribute(\"name\").toLowerCase() != \"movie\")) {\n                                        lb[mb[ob].getAttribute(\"name\")] = mb[ob].getAttribute(\"value\");\n                                    };\n                                };\n                                pa(kb, lb, gb, hb);\n                            }\n                             else {\n                                qa(jb);\n                                if (hb) {\n                                    hb(ib);\n                                };\n                            }\n                            \n                        \n                        };\n                    }\n                     else {\n                        bb(gb, true);\n                        if (hb) {\n                            var pb = na(gb);\n                            if ((pb && (typeof pb.SetVariable != h))) {\n                                ib.success = true;\n                                ib.ref = pb;\n                            }\n                        ;\n                            hb(ib);\n                        }\n                    ;\n                    }\n                ;\n                }\n            };\n        };\n        function na(eb) {\n            var fb = null, gb = wa(eb);\n            if ((gb && (gb.nodeName == \"OBJECT\"))) {\n                if ((typeof gb.SetVariable != h)) {\n                    fb = gb;\n                }\n                 else {\n                    var hb = gb.getElementsByTagName(i)[0];\n                    if (hb) {\n                        fb = hb;\n                    };\n                }\n            \n            };\n            return fb;\n        };\n        function oa() {\n            return (((!ba && za(\"6.0.65\")) && ((fa.win || fa.mac))) && !((fa.wk && (fa.wk < 312))));\n        };\n        function pa(eb, fb, gb, hb) {\n            ba = true;\n            y = (hb || null);\n            z = {\n                success: false,\n                id: gb\n            };\n            var ib = wa(gb);\n            if (ib) {\n                if ((ib.nodeName == \"OBJECT\")) {\n                    w = ra(ib);\n                    x = null;\n                }\n                 else {\n                    w = ib;\n                    x = gb;\n                }\n            ;\n                eb.id = m;\n                if (((typeof eb.width == h) || ((!/%$/.test(eb.width) && (parseInt(eb.width, 10) < 310))))) {\n                    eb.width = \"310\";\n                };\n                if (((typeof eb.height == h) || ((!/%$/.test(eb.height) && (parseInt(eb.height, 10) < 137))))) {\n                    eb.height = \"137\";\n                };\n                p.title = (p.title.slice(0, 47) + \" - Flash Player Installation\");\n                var jb = ((fa.ie && fa.win) ? \"ActiveX\" : \"PlugIn\"), kb = (((((\"MMredirectURL=\" + o.location.toString().replace(/&/g, \"%26\")) + \"&MMplayerType=\") + jb) + \"&MMdoctitle=\") + p.title);\n                if ((typeof fb.flashvars != h)) {\n                    fb.flashvars += (\"&\" + kb);\n                }\n                 else fb.flashvars = kb;\n            ;\n                if (((fa.ie && fa.win) && (ib.readyState != 4))) {\n                    var lb = xa(\"div\");\n                    gb += \"SWFObjectNew\";\n                    lb.setAttribute(\"id\", gb);\n                    ib.parentNode.insertBefore(lb, ib);\n                    ib.style.display = \"none\";\n                    (function() {\n                        if ((ib.readyState == 4)) {\n                            ib.parentNode.removeChild(ib);\n                        }\n                         else setTimeout(arguments.callee, 10);\n                    ;\n                    })();\n                }\n            ;\n                sa(eb, fb, gb);\n            }\n        ;\n        };\n        function qa(eb) {\n            if (((fa.ie && fa.win) && (eb.readyState != 4))) {\n                var fb = xa(\"div\");\n                eb.parentNode.insertBefore(fb, eb);\n                fb.parentNode.replaceChild(ra(eb), fb);\n                eb.style.display = \"none\";\n                (function() {\n                    if ((eb.readyState == 4)) {\n                        eb.parentNode.removeChild(eb);\n                    }\n                     else setTimeout(arguments.callee, 10);\n                ;\n                })();\n            }\n             else eb.parentNode.replaceChild(ra(eb), eb);\n        ;\n        };\n        function ra(eb) {\n            var fb = xa(\"div\");\n            if ((fa.win && fa.ie)) {\n                fb.innerHTML = eb.innerHTML;\n            }\n             else {\n                var gb = eb.getElementsByTagName(i)[0];\n                if (gb) {\n                    var hb = gb.childNodes;\n                    if (hb) {\n                        var ib = hb.length;\n                        for (var jb = 0; (jb < ib); jb++) {\n                            if ((!(((hb[jb].nodeType == 1) && (hb[jb].nodeName == \"PARAM\"))) && !((hb[jb].nodeType == 8)))) {\n                                fb.appendChild(hb[jb].cloneNode(true));\n                            };\n                        };\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n            return fb;\n        };\n        function sa(eb, fb, gb) {\n            var hb, ib = wa(gb);\n            if ((fa.wk && (fa.wk < 312))) {\n                return hb\n            };\n            if (ib) {\n                if ((typeof eb.id == h)) {\n                    eb.id = gb;\n                };\n                if ((fa.ie && fa.win)) {\n                    var jb = \"\";\n                    for (var kb in eb) {\n                        if ((eb[kb] != Object.prototype[kb])) {\n                            if ((kb.toLowerCase() == \"data\")) {\n                                fb.movie = eb[kb];\n                            }\n                             else if ((kb.toLowerCase() == \"styleclass\")) {\n                                jb += ((\" class=\\\"\" + eb[kb]) + \"\\\"\");\n                            }\n                             else if ((kb.toLowerCase() != \"classid\")) {\n                                jb += ((((\" \" + kb) + \"=\\\"\") + eb[kb]) + \"\\\"\");\n                            }\n                            \n                        \n                        };\n                    };\n                    var lb = \"\";\n                    for (var mb in fb) {\n                        if ((fb[mb] != Object.prototype[mb])) {\n                            lb += ((((\"\\u003Cparam name=\\\"\" + mb) + \"\\\" value=\\\"\") + fb[mb]) + \"\\\" /\\u003E\");\n                        };\n                    };\n                    ib.outerHTML = ((((\"\\u003Cobject classid=\\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\\"\" + jb) + \"\\u003E\") + lb) + \"\\u003C/object\\u003E\");\n                    u[u.length] = eb.id;\n                    hb = wa(eb.id);\n                }\n                 else {\n                    var nb = xa(i);\n                    nb.setAttribute(\"type\", l);\n                    for (var ob in eb) {\n                        if ((eb[ob] != Object.prototype[ob])) {\n                            if ((ob.toLowerCase() == \"styleclass\")) {\n                                nb.setAttribute(\"class\", eb[ob]);\n                            }\n                             else if ((ob.toLowerCase() != \"classid\")) {\n                                nb.setAttribute(ob, eb[ob]);\n                            }\n                        \n                        };\n                    };\n                    for (var pb in fb) {\n                        if (((fb[pb] != Object.prototype[pb]) && (pb.toLowerCase() != \"movie\"))) {\n                            ta(nb, pb, fb[pb]);\n                        };\n                    };\n                    ib.parentNode.replaceChild(nb, ib);\n                    hb = nb;\n                }\n            ;\n            }\n        ;\n            return hb;\n        };\n        function ta(eb, fb, gb) {\n            var hb = xa(\"param\");\n            hb.setAttribute(\"name\", fb);\n            hb.setAttribute(\"value\", gb);\n            eb.appendChild(hb);\n        };\n        function ua(eb) {\n            var fb = wa(eb);\n            if ((fb && (fb.nodeName == \"OBJECT\"))) {\n                if ((fa.ie && fa.win)) {\n                    fb.style.display = \"none\";\n                    (function() {\n                        if ((fb.readyState == 4)) {\n                            va(eb);\n                        }\n                         else setTimeout(arguments.callee, 10);\n                    ;\n                    })();\n                }\n                 else fb.parentNode.removeChild(fb);\n            \n            };\n        };\n        function va(eb) {\n            var fb = wa(eb);\n            if (fb) {\n                for (var gb in fb) {\n                    if ((typeof fb[gb] == \"function\")) {\n                        fb[gb] = null;\n                    };\n                };\n                fb.parentNode.removeChild(fb);\n            }\n        ;\n        };\n        function wa(eb) {\n            var fb = null;\n            try {\n                fb = p.getElementById(eb);\n            } catch (gb) {\n            \n            };\n            return fb;\n        };\n        function xa(eb) {\n            return p.createElement(eb);\n        };\n        function ya(eb, fb, gb) {\n            eb.attachEvent(fb, gb);\n            v[v.length] = [eb,fb,gb,];\n        };\n        function za(eb) {\n            var fb = fa.pv, gb = eb.split(\".\");\n            gb[0] = parseInt(gb[0], 10);\n            gb[1] = (parseInt(gb[1], 10) || 0);\n            gb[2] = (parseInt(gb[2], 10) || 0);\n            return (((((fb[0] > gb[0]) || (((fb[0] == gb[0]) && (fb[1] > gb[1])))) || ((((fb[0] == gb[0]) && (fb[1] == gb[1])) && (fb[2] >= gb[2]))))) ? true : false);\n        };\n        function ab(eb, fb, gb, hb) {\n            if ((fa.ie && fa.mac)) {\n                return\n            };\n            var ib = p.getElementsByTagName(\"head\")[0];\n            if (!ib) {\n                return\n            };\n            var jb = (((gb && (typeof gb == \"string\"))) ? gb : \"screen\");\n            if (hb) {\n                ca = null;\n                da = null;\n            }\n        ;\n            if ((!ca || (da != jb))) {\n                var kb = xa(\"style\");\n                kb.setAttribute(\"type\", \"text/css\");\n                kb.setAttribute(\"media\", jb);\n                ca = ib.appendChild(kb);\n                if ((((fa.ie && fa.win) && (typeof p.styleSheets != h)) && (p.styleSheets.length > 0))) {\n                    ca = p.styleSheets[(p.styleSheets.length - 1)];\n                };\n                da = jb;\n            }\n        ;\n            if ((fa.ie && fa.win)) {\n                if ((ca && (typeof ca.addRule == i))) {\n                    ca.addRule(eb, fb);\n                };\n            }\n             else if ((ca && (typeof p.createTextNode != h))) {\n                ca.appendChild(p.createTextNode((((eb + \" {\") + fb) + \"}\")));\n            }\n        ;\n        };\n        function bb(eb, fb) {\n            if (!ea) {\n                return\n            };\n            var gb = (fb ? \"visible\" : \"hidden\");\n            if ((aa && wa(eb))) {\n                wa(eb).style.visibility = gb;\n            }\n             else ab((\"#\" + eb), (\"visibility:\" + gb));\n        ;\n        };\n        function cb(eb) {\n            var fb = /[\\\\\\\"<>\\.;]/, gb = (fb.exec(eb) != null);\n            return ((gb && (typeof encodeURIComponent != h)) ? encodeURIComponent(eb) : eb);\n        };\n        var db = function() {\n            if ((fa.ie && fa.win)) {\n                window.attachEvent(\"onunload\", function() {\n                    var eb = v.length;\n                    for (var fb = 0; (fb < eb); fb++) {\n                        v[fb][0].detachEvent(v[fb][1], v[fb][2]);;\n                    };\n                    var gb = u.length;\n                    for (var hb = 0; (hb < gb); hb++) {\n                        ua(u[hb]);;\n                    };\n                    for (var ib in fa) {\n                        fa[ib] = null;;\n                    };\n                    fa = null;\n                    for (var jb in g) {\n                        g[jb] = null;;\n                    };\n                    g = null;\n                });\n            };\n        }();\n        return {\n            registerObject: function(eb, fb, gb, hb) {\n                if (((fa.w3 && eb) && fb)) {\n                    var ib = {\n                    };\n                    ib.id = eb;\n                    ib.swfVersion = fb;\n                    ib.expressInstall = gb;\n                    ib.callbackFn = hb;\n                    t[t.length] = ib;\n                    bb(eb, false);\n                }\n                 else if (hb) {\n                    hb({\n                        success: false,\n                        id: eb\n                    });\n                }\n            ;\n            },\n            getObjectById: function(eb) {\n                if (fa.w3) {\n                    return na(eb)\n                };\n            },\n            embedSWF: function(eb, fb, gb, hb, ib, jb, kb, lb, mb, nb) {\n                var ob = {\n                    success: false,\n                    id: fb\n                };\n                if (((((((fa.w3 && !((fa.wk && (fa.wk < 312)))) && eb) && fb) && gb) && hb) && ib)) {\n                    bb(fb, false);\n                    ia(function() {\n                        gb += \"\";\n                        hb += \"\";\n                        var pb = {\n                        };\n                        if ((mb && (typeof mb === i))) {\n                            for (var qb in mb) {\n                                pb[qb] = mb[qb];;\n                            }\n                        };\n                        pb.data = eb;\n                        pb.width = gb;\n                        pb.height = hb;\n                        var rb = {\n                        };\n                        if ((lb && (typeof lb === i))) {\n                            for (var sb in lb) {\n                                rb[sb] = lb[sb];;\n                            }\n                        };\n                        if ((kb && (typeof kb === i))) {\n                            for (var tb in kb) {\n                                if ((typeof rb.flashvars != h)) {\n                                    rb.flashvars += (((\"&\" + tb) + \"=\") + kb[tb]);\n                                }\n                                 else rb.flashvars = ((tb + \"=\") + kb[tb]);\n                            ;\n                            }\n                        };\n                        if (za(ib)) {\n                            var ub = sa(pb, rb, fb);\n                            if ((pb.id == fb)) {\n                                bb(fb, true);\n                            };\n                            ob.success = true;\n                            ob.ref = ub;\n                        }\n                         else if ((jb && oa())) {\n                            pb.data = jb;\n                            pa(pb, rb, fb, nb);\n                            return;\n                        }\n                         else bb(fb, true);\n                        \n                    ;\n                        if (nb) {\n                            nb(ob);\n                        };\n                    });\n                }\n                 else if (nb) {\n                    nb(ob);\n                }\n            ;\n            },\n            switchOffAutoHideShow: function() {\n                ea = false;\n            },\n            ua: fa,\n            getFlashPlayerVersion: function() {\n                return {\n                    major: fa.pv[0],\n                    minor: fa.pv[1],\n                    release: fa.pv[2]\n                };\n            },\n            hasFlashPlayerVersion: za,\n            createSWF: function(eb, fb, gb) {\n                if (fa.w3) {\n                    return sa(eb, fb, gb);\n                }\n                 else return undefined\n            ;\n            },\n            showExpressInstall: function(eb, fb, gb, hb) {\n                if ((fa.w3 && oa())) {\n                    pa(eb, fb, gb, hb);\n                };\n            },\n            removeSWF: function(eb) {\n                if (fa.w3) {\n                    ua(eb);\n                };\n            },\n            createCSS: function(eb, fb, gb, hb) {\n                if (fa.w3) {\n                    ab(eb, fb, gb, hb);\n                };\n            },\n            addDomLoadEvent: ia,\n            addLoadEvent: ja,\n            getQueryParamValue: function(eb) {\n                var fb = (p.location.search || p.location.hash);\n                if (fb) {\n                    if (/\\?/.test(fb)) {\n                        fb = fb.split(\"?\")[1];\n                    };\n                    if ((eb == null)) {\n                        return cb(fb)\n                    };\n                    var gb = fb.split(\"&\");\n                    for (var hb = 0; (hb < gb.length); hb++) {\n                        if ((gb[hb].substring(0, gb[hb].indexOf(\"=\")) == eb)) {\n                            return cb(gb[hb].substring(((gb[hb].indexOf(\"=\") + 1))))\n                        };\n                    };\n                }\n            ;\n                return \"\";\n            },\n            expressInstallCallback: function() {\n                if (ba) {\n                    var eb = wa(m);\n                    if ((eb && w)) {\n                        eb.parentNode.replaceChild(w, eb);\n                        if (x) {\n                            bb(x, true);\n                            if ((fa.ie && fa.win)) {\n                                w.style.display = \"block\";\n                            };\n                        }\n                    ;\n                        if (y) {\n                            y(z);\n                        };\n                    }\n                ;\n                    ba = false;\n                }\n            ;\n            }\n        };\n    }();\n    e.exports = g;\n});\n__d(\"SoundPlayer\", [\"Arbiter\",\"ChatConfig\",\"swfobject\",\"swfobject2\",\"URI\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatConfig\"), i = b(\"swfobject\").SWFObject, j = b(\"swfobject2\"), k = b(\"URI\"), l = b(\"createArrayFrom\"), m = {\n    }, n = null, o = false, p = \"so_sound_player\", q = \"/swf/SoundPlayer.swf?v=1\", r = \"10.0.22.87\", s = null, t = h.get(\"sound.useswfobject_2\", false), u = h.get(\"sound.force_flash\", false);\n    function v(da) {\n        var ea = k(da);\n        if (!ea.getDomain()) {\n            return k().setPath(ea.getPath()).toString()\n        };\n        return da;\n    };\n    function w(da) {\n        var ea = k(da).getPath();\n        if (/\\.mp3$/.test(ea)) {\n            return \"audio/mpeg\"\n        };\n        if (/\\.og[ga]$/.test(ea)) {\n            return \"audio/ogg\"\n        };\n        return \"\";\n    };\n    function x() {\n        if ((!s && !u)) {\n            var da = document.createElement(\"audio\");\n            if ((!da || !da.canPlayType)) {\n                return null\n            };\n            da.setAttribute(\"preload\", \"auto\");\n            document.body.appendChild(da);\n            s = da;\n        }\n    ;\n        return s;\n    };\n    function y() {\n        var da = (document[p] || window[p]);\n        if (da) {\n            if ((!da.playSound && da.length)) {\n                da = da[0];\n            }\n        };\n        return ((((da && da.playSound) && da.loopSound)) ? da : null);\n    };\n    function z() {\n        return o;\n    };\n    function aa(da, ea, fa) {\n        n = {\n            path: da,\n            sync: ea,\n            loop: fa\n        };\n    };\n    function ba() {\n        o = true;\n        if (n) {\n            var da = y();\n            if (n.loop) {\n                da.loopSound(n.path, n.sync);\n            }\n             else da.playSound(n.path, n.sync);\n        ;\n        }\n    ;\n    };\n    var ca = {\n        init: function(da) {\n            da = l(da);\n            var ea;\n            for (var fa = 0; (fa < da.length); ++fa) {\n                ea = da[fa];\n                if (m[ea]) {\n                    return\n                };\n            };\n            var ga = x();\n            for (fa = 0; (ga && (fa < da.length)); ++fa) {\n                ea = da[fa];\n                if (ga.canPlayType(ea)) {\n                    m[ea] = true;\n                    return;\n                }\n            ;\n            };\n            m[\"audio/mpeg\"] = true;\n            if (y()) {\n                return\n            };\n            try {\n                g.registerCallback(ba, [\"sound/player_ready\",\"sound/ready\",]);\n                var ia = document.createElement(\"div\");\n                ia.id = \"sound_player_holder\";\n                document.body.appendChild(ia);\n                if (t) {\n                    j.embedSWF(q, ia.id, \"1px\", \"1px\", r, null, {\n                        swf_id: p\n                    }, {\n                        allowscriptaccess: \"always\",\n                        wmode: \"transparent\"\n                    }, null, function(ka) {\n                        window[p] = ka.ref;\n                        g.inform(\"sound/player_ready\");\n                    });\n                }\n                 else {\n                    var ja = new i(q, p, \"1px\", \"1px\", [r,], \"#ffffff\");\n                    ja.addParam(\"allowscriptaccess\", \"always\");\n                    ja.addParam(\"wmode\", \"transparent\");\n                    ja.addVariable(\"swf_id\", p);\n                    ja.fallback_html = \" \";\n                    ja.write(ia.id);\n                    window[p] = ja;\n                    g.inform(\"sound/player_ready\");\n                }\n            ;\n            } catch (ha) {\n            \n            };\n        },\n        play: function(da, ea) {\n            da = l(da);\n            var fa = x(), ga, ha;\n            for (var ia = 0; (fa && (ia < da.length)); ++ia) {\n                ga = da[ia];\n                ha = w(ga);\n                if (!fa.canPlayType(ha)) {\n                    continue;\n                };\n                ca.init([ha,]);\n                fa.src = v(ga);\n                if (ea) {\n                    fa.setAttribute(\"loop\", \"\");\n                }\n                 else fa.removeAttribute(\"loop\");\n            ;\n                fa.play();\n                return;\n            };\n            for (ia = 0; (ia < da.length); ++ia) {\n                ga = v(da[ia]);\n                ha = w(ga);\n                if ((ha != \"audio/mpeg\")) {\n                    continue;\n                };\n                ca.init([ha,]);\n                var ja = y();\n                if (!z()) {\n                    aa(ga, true, ea);\n                    return;\n                }\n                 else if (ja) {\n                    if (ea) {\n                        ja.loopSound(ga, true);\n                    }\n                     else ja.playSound(ga, true);\n                ;\n                    return;\n                }\n                \n            ;\n            };\n        },\n        stop: function(da) {\n            da = l(da);\n            for (var ea = 0; (ea < da.length); ++ea) {\n                var fa = v(da[ea]), ga = x(), ha = y();\n                if ((ga && (ga.src == fa))) {\n                    ga.pause();\n                    ga.src = undefined;\n                }\n                 else (ha && ha.stopSound(fa));\n            ;\n            };\n        }\n    };\n    e.exports = ca;\n});\n__d(\"SoundSynchronizer\", [\"hasArrayNature\",\"SoundPlayer\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"SoundPlayer\"), i = b(\"createArrayFrom\"), j = \"fb_sounds_playing3\";\n    function k() {\n        if (window.localStorage) {\n            try {\n                var p = window.localStorage[j];\n                if (p) {\n                    p = JSON.parse(p);\n                    if (g(p)) {\n                        return p\n                    };\n                }\n            ;\n            } catch (o) {\n            \n            }\n        };\n        return [];\n    };\n    function l(o) {\n        if (window.localStorage) {\n            var p = k();\n            p.push(o);\n            while ((p.length > 5)) {\n                p.shift();;\n            };\n            try {\n                window.localStorage[j] = JSON.stringify(p);\n            } catch (q) {\n            \n            };\n        }\n    ;\n    };\n    function m(o) {\n        return k().some(function(p) {\n            return (p === o);\n        });\n    };\n    var n = {\n        play: function(o, p, q) {\n            o = i(o);\n            p = (p || ((o[0] + Math.floor((Date.now() / 1000)))));\n            if (m(p)) {\n                return\n            };\n            h.play(o, q);\n            l(p);\n        },\n        isSupported: function() {\n            return !!window.localStorage;\n        }\n    };\n    e.exports = n;\n});\n__d(\"SoundRPC\", [\"Event\",\"SoundSynchronizer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"SoundSynchronizer\");\n    function i(k, l, m) {\n        h.play(k, l, m);\n    };\n    var j = {\n        playLocal: i,\n        playRemote: function(k, l, m, n) {\n            var o = {\n                paths: l,\n                sync: m,\n                loop: n\n            };\n            k.postMessage(JSON.stringify(o), \"*\");\n        },\n        supportsRPC: function() {\n            return !!window.postMessage;\n        },\n        _listen: function() {\n            g.listen(window, \"message\", function(k) {\n                if (!/\\.facebook.com$/.test(k.origin)) {\n                    return\n                };\n                var l = JSON.parse(k.data);\n                i(l.paths, l.sync, l.loop);\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"Sound\", [\"SoundPlayer\",\"SoundRPC\",\"SoundSynchronizer\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SoundPlayer\"), h = b(\"SoundRPC\"), i = b(\"SoundSynchronizer\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = null, m = {\n        init: function(q) {\n            if (!l) {\n                g.init(q);\n            };\n        },\n        play: function(q, r, s) {\n            if (l) {\n                h.playRemote(l.contentWindow, q, r, false);\n            }\n             else h.playLocal(q, r, s);\n        ;\n        },\n        stop: function(q) {\n            if (!l) {\n                g.stop(q);\n            };\n        }\n    }, n = new j(location.href);\n    if ((n.getSubdomain() && (n.getSubdomain() !== \"www\"))) {\n        n.setSubdomain(\"www\");\n    };\n    var o = n.getDomain();\n    function p() {\n        if ((k.ie() < 9)) {\n            return false\n        };\n        return (i.isSupported() && h.supportsRPC());\n    };\n    if (((n.isFacebookURI() && (location.host !== o)) && p())) {\n        l = document.createElement(\"iframe\");\n        l.setAttribute(\"src\", ((\"//\" + o) + \"/sound_iframe.php\"));\n        l.style.display = \"none\";\n        document.body.appendChild(l);\n    }\n;\n    e.exports = m;\n});\n__d(\"MercuryBrowserAlerts\", [\"ArbiterMixin\",\"ChatActivity\",\"ChatConfig\",\"ChatOptions\",\"ChatTitleBarBlinker\",\"MercuryParticipants\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MessagingTag\",\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatOptions\"), k = b(\"ChatTitleBarBlinker\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryThreadMuter\"), n = b(\"MercuryThreads\").get(), o = b(\"MessagingTag\"), p = b(\"Sound\"), q = b(\"copyProperties\");\n    p.init([\"audio/ogg\",\"audio/mpeg\",]);\n    function r(t) {\n        if (j.getSetting(\"sound\")) {\n            p.play([i.get(\"sound.notif_ogg_url\"),i.get(\"sound.notif_mp3_url\"),], t, false);\n        };\n    };\n    var s = {\n        messageReceived: function(t) {\n            if ((((t.author == l.user) || !t.is_unread) || (((t.folder != o.INBOX) && (t.folder != o.ARCHIVED))))) {\n                return\n            };\n            var u = t.thread_id, v = h.isActive();\n            if (v) {\n                var w = false;\n                s.inform(\"before-alert\", {\n                    threadID: u,\n                    cancelAlert: function() {\n                        w = true;\n                    }\n                });\n            }\n        ;\n            n.getThreadMeta(u, function(x) {\n                var y = m.isThreadMuted(x);\n                if (y) {\n                    return\n                };\n                var z = t.timestamp;\n                if (v) {\n                    (!w && r(z));\n                }\n                 else {\n                    k.blink(u, z);\n                    r(z);\n                }\n            ;\n                k.blinkingElsewhere();\n            }.bind(this));\n        }\n    };\n    e.exports = q(s, g);\n});\n__d(\"ActiveXSupport\", [], function(a, b, c, d, e, f) {\n    var g = null, h = {\n        isSupported: function() {\n            if ((g !== null)) {\n                return g\n            };\n            try {\n                g = (!!window.ActiveXObject && !!new ActiveXObject(\"htmlfile\"));\n            } catch (i) {\n                g = false;\n            };\n            return g;\n        }\n    };\n    e.exports = h;\n});\n__d(\"VideoCallSupport\", [\"MercuryConfig\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"UserAgent\"), i = {\n        newVCIsSupported: function() {\n            return (g.NewVCGK && (((h.chrome() >= 24) || (h.firefox() >= 22))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"VideoCallRecordMessageDialog\", [\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"URI\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Dialog\"), j = b(\"URI\"), k = b(\"tx\"), l = {\n        get: function(m, n) {\n            var o = \"Would you like to leave a message?\", p = \"New Message\";\n            return new i().setTitle(k._(\"{firstname} is Unavailable\", {\n                firstname: n\n            })).setBody(o).setButtons([{\n                name: \"record-message\",\n                label: p\n            },i.CANCEL,]).setHandler(function() {\n                var q = j(\"/ajax/messaging/composer.php\").setQueryData({\n                    ids: [m,],\n                    autoloadvideo: true\n                }).toString();\n                g.send(new h(q));\n            });\n        }\n    };\n    e.exports = l;\n});\n__d(\"VideoCallCore\", [\"Event\",\"ActiveXSupport\",\"Arbiter\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConstants\",\"Cookie\",\"CSS\",\"Dialog\",\"MercuryConfig\",\"UserAgent\",\"VideoCallSupport\",\"emptyFunction\",\"ge\",\"VideoCallTemplates\",\"ShortProfiles\",\"VideoCallRecordMessageDialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ActiveXSupport\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AvailableList\"), l = b(\"AvailableListConstants\"), m = b(\"Bootloader\"), n = b(\"ChannelConstants\"), o = b(\"Cookie\"), p = b(\"CSS\"), q = b(\"Dialog\"), r = b(\"MercuryConfig\"), s = b(\"UserAgent\"), t = b(\"VideoCallSupport\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    b(\"VideoCallTemplates\");\n    var w = [], x = [], y = {\n        isSupported: function() {\n            if (t.newVCIsSupported()) {\n                return true\n            };\n            if (s.windows()) {\n                if (((s.ie() >= 9) && !s.ie64())) {\n                    return h.isSupported();\n                }\n                 else return ((((((s.ie() >= 7) && !s.ie64())) || (s.firefox() >= 3.6)) || (s.chrome() >= 5)) || (s.opera() >= 12))\n            ;\n            }\n             else if ((s.osx() > 10.4)) {\n                return (((((s.firefox() >= 3.6) || (s.chrome() >= 5)) || (s.webkit() >= 500)) || (s.opera() >= 12)))\n            }\n        ;\n            return false;\n        },\n        isInstalled: function() {\n            var ca = false;\n            if (this.isSupported()) {\n                if (z()) {\n                    var da = null;\n                    try {\n                        da = new ActiveXObject(\"SkypeLimited.SkypeWebPlugin\");\n                        ca = !!da;\n                    } catch (ea) {\n                    \n                    };\n                    da = null;\n                }\n                 else {\n                    ca = aa();\n                    if (r.VideoCallingNoJavaGK) {\n                        if ((ca && (s.osx() >= 10.8))) {\n                            if ((ca.description && (ca.description.charAt(0) != \"v\"))) {\n                                ca = false;\n                            }\n                        }\n                    };\n                }\n            \n            };\n            return ca;\n        },\n        mightReloadPostInstall: function() {\n            return s.windows();\n        },\n        onVideoMessage: function(ca) {\n            w.push(ca);\n            m.loadModules([\"VideoCallController\",], u);\n        },\n        onRTCMessage: function(ca) {\n            if (t.newVCIsSupported()) {\n                x.push(ca);\n                m.loadModules([\"FBRTCCallController\",], u);\n            }\n        ;\n        },\n        setMessageHandler: function(ca) {\n            this.onVideoMessage = ca;\n            if (ca) {\n                while (w.length) {\n                    ca(w.shift());;\n                }\n            };\n        },\n        setRTCMessageHandler: function(ca) {\n            this.onRTCMessage = ca;\n            if (ca) {\n                while (x.length) {\n                    ca(x.shift());;\n                }\n            };\n        },\n        availableForCall: function(ca) {\n            var da = k.get(ca);\n            return ((da == l.ACTIVE) || (da == l.IDLE));\n        },\n        onProfileButtonClick: function(ca) {\n            y.startCallOrLeaveMessage(ca, \"profile_button_click\");\n        },\n        attachListenerToProfileButton: function(ca) {\n            var da = v(\"videoCallProfileButton\");\n            if (da) {\n                if (!y.isSupported()) {\n                    p.hide(da);\n                    return;\n                }\n            ;\n                g.listen(da, \"click\", function(event) {\n                    y.startCallOrLeaveMessage(ca, \"profile_button_click_timeline\");\n                });\n            }\n        ;\n        },\n        startCallOrLeaveMessage: function(ca, da) {\n            if (this.availableForCall(ca)) {\n                y.showOutgoingCallDialog(ca, da);\n            }\n             else b(\"ShortProfiles\").get(ca, function(ea) {\n                b(\"VideoCallRecordMessageDialog\").get(ca, ea.firstName).show();\n            });\n        ;\n        },\n        showOutgoingCallDialog: function(ca, da) {\n            var ea = (da || \"unknown\");\n            y.logClick(ca, ea);\n            var fa = ((y.isInstalled() || r.NewVCGK) ? \"outgoing_dialog.php\" : \"intro.php\"), ga = (((\"/ajax/chat/video/\" + fa) + \"?idTarget=\") + ca);\n            new q().setAllowCrossPageTransition(true).setAsync(new j(ga)).show();\n        },\n        logClick: function(ca, da) {\n            new j().setURI(\"/ajax/chat/video/log_click.php\").setData({\n                targetUserID: ca,\n                clickSource: da\n            }).setAllowCrossPageTransition(true).setErrorHandler(u).send();\n        }\n    };\n    function z() {\n        return ((s.ie() && s.windows()) && !s.opera());\n    };\n    function aa() {\n        if (!navigator) {\n            return null\n        };\n        navigator.plugins.refresh(false);\n        var ca = navigator.mimeTypes[\"application/skypesdk-plugin\"];\n        return (ca && ca.enabledPlugin);\n    };\n    function ba() {\n        if (!y.mightReloadPostInstall()) {\n            return\n        };\n        var ca = o.get(\"vcpwn\");\n        if (ca) {\n            o.clear(\"vcpwn\");\n            var da = o.get(\"vctid\");\n            if (da) {\n                o.clear(\"vctid\");\n                if (o.get(\"vctid\")) {\n                    return\n                };\n                if ((da && y.isInstalled())) {\n                    var ea = (\"/ajax/chat/video/outgoing_dialog.php?idTarget=\" + da);\n                    new q().setAllowCrossPageTransition(true).setAsync(new j(ea)).show();\n                }\n            ;\n            }\n        ;\n        }\n    ;\n    };\n    i.subscribe(n.getArbiterType(\"video\"), function(ca, da) {\n        y.onVideoMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"webrtc\"), function(ca, da) {\n        y.onRTCMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"chat_event\"), function(ca, da) {\n        if ((da.obj.event_name == \"missed-call\")) {\n            m.loadModules([\"VideoCallController\",], function(ea) {\n                ea.onMissedCallEvent(da.obj);\n            });\n        };\n    });\n    ba();\n    e.exports = y;\n});\n__d(\"ChatApp\", [\"CSS\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"JSLogger\"), i = false, j = false, k = false, l = null, m = {\n        init: function(n, o, p) {\n            if (l) {\n                h.create(\"chat_app\").error(\"repeated_init\");\n                return;\n            }\n        ;\n            l = n;\n            d([\"TabsViewport\",\"ChatTabController\",\"ChatTabViewCoordinator\",\"MercuryServerRequests\",\"MercuryChannelHandler\",\"MercuryStateCheck\",], function(q, r, s, t, u, v) {\n                t.get().handleUpdate(p);\n                this.tabsViewport = new q(o);\n                this.tabController = new r(this.tabsViewport);\n                this.tabViewCoordinator = new s(o, this.tabsViewport);\n                i = j = true;\n            }.bind(this));\n        },\n        hide: function() {\n            if ((!i || k)) {\n                return\n            };\n            g.hide(l);\n            k = true;\n        },\n        unhide: function() {\n            if (i) {\n                if (k) {\n                    g.show(l);\n                    this.tabsViewport.checkWidth();\n                    d([\"Dock\",], function(n) {\n                        n.resizeAllFlyouts();\n                    });\n                    k = false;\n                }\n            ;\n            }\n             else if (!j) {\n                d([\"UIPagelet\",], function(n) {\n                    n.loadFromEndpoint(\"ChatTabsPagelet\", \"ChatTabsPagelet\");\n                    n.loadFromEndpoint(\"BuddylistPagelet\", \"BuddylistPagelet\");\n                });\n                j = true;\n            }\n            \n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"DataViewPolyfill\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i, j, k) {\n        if ((j === undefined)) {\n            this._ba = new Uint8Array(i);\n        }\n         else if ((k === undefined)) {\n            this._ba = new Uint8Array(i, j);\n        }\n         else this._ba = new Uint8Array(i, j, k);\n        \n    ;\n        this.byteLength = this._ba.byteLength;\n    };\n    g(h, {\n        isSupported: function() {\n            return !!a.Uint8Array;\n        }\n    });\n    g(h.prototype, {\n        getUint8: function(i) {\n            if ((i >= this._ba.length)) {\n                throw new Error(\"Trying to read beyond bounds of DataViewPolyfill\")\n            };\n            return this._ba[i];\n        },\n        getUint16: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8((i + 1));\n            return (j ? (((l * 256)) + k) : (((k * 256)) + l));\n        },\n        getUint32: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8((i + 1)), m = this.getUint8((i + 2)), n = this.getUint8((i + 3));\n            return (j ? (((((((((n * 256) + m)) * 256) + l)) * 256)) + k) : (((((((((k * 256) + l)) * 256) + m)) * 256)) + n));\n        }\n    });\n    e.exports = h;\n});\n__d(\"getImageSize\", [\"DataViewPolyfill\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataViewPolyfill\"), h = (a.DataView || g);\n    function i(m) {\n        return {\n            width: m.getUint16(6, true),\n            height: m.getUint16(8, true)\n        };\n    };\n    function j(m) {\n        return {\n            width: m.getUint32(16, false),\n            height: m.getUint32(20, false)\n        };\n    };\n    function k(m) {\n        var n = m.byteLength, o = 2;\n        while ((o < n)) {\n            var p = m.getUint16(o, false);\n            o += 2;\n            if (((p == 65472) || (p == 65474))) {\n                return {\n                    width: m.getUint16((o + 5), false),\n                    height: m.getUint16((o + 3), false)\n                };\n            }\n             else o += m.getUint16(o, false);\n        ;\n        };\n        return null;\n    };\n    function l(m) {\n        var n = new h(m);\n        if (((n.getUint8(0) == 255) && (n.getUint8(1) == 216))) {\n            return k(n)\n        };\n        if ((((n.getUint8(0) == 71) && (n.getUint8(1) == 73)) && (n.getUint8(2) == 70))) {\n            return i(n)\n        };\n        if (((((n.getUint8(0) == 137) && (n.getUint8(1) == 80)) && (n.getUint8(2) == 78)) && (n.getUint8(3) == 71))) {\n            return j(n)\n        };\n        return null;\n    };\n    e.exports = l;\n    l.gif = i;\n    l.png = j;\n    l.jpeg = k;\n});\n__d(\"ChatAutoSendPhotoUploader\", [\"ArbiterMixin\",\"DOM\",\"Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachmentType\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getImageSize\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"FileForm\"), k = b(\"FileFormResetOnSubmit\"), l = b(\"FileInput\"), m = b(\"FormSubmitOnChange\"), n = b(\"MercuryAttachmentType\"), o = b(\"SubscriptionsHandler\"), p = b(\"copyProperties\"), q = b(\"csx\"), r = b(\"getImageSize\"), s = b(\"removeFromArray\"), t = b(\"shield\"), u = 0;\n    function v(w, x, y) {\n        this._idElem = y;\n        this._input = x;\n        this._subscriptionsHandler = new o();\n        this._uploadBatches = [];\n        var z = new j(w, [m,k,]), aa = h.find(w, \".-cx-PRIVATE-mercuryFileUploader__root\"), ba = h.find(aa, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new l(aa, ba, x);\n        this._subscriptionsHandler.addSubscriptions(z.subscribe(\"submit\", this._onFileSubmit.bind(this)), z.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), z.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), i.listen(ba, \"click\", t(this.inform, this, \"open\")));\n    };\n    p(v.prototype, g, {\n        isUploading: function() {\n            return (this._uploadBatches.length > 0);\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n        },\n        _getPreviewAttachment: function(w) {\n            var x = {\n                attach_type: n.PHOTO,\n                preview_uploading: true\n            };\n            if (w) {\n                x.preview_width = w.width;\n                x.preview_height = w.height;\n            }\n        ;\n            return x;\n        },\n        _onFileSubmit: function() {\n            u += 1;\n            var w = (\"upload_\" + u);\n            this._idElem.value = w;\n            this._uploadBatches.push(w);\n            if (((((typeof FileReader !== \"undefined\") && FileReader.prototype.readAsArrayBuffer) && this._input.files) && (this._input.files.length === 1))) {\n                var x = new FileReader();\n                x.onload = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(r(x.result)),]\n                    });\n                }.bind(this);\n                x.onerror = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(null),]\n                    });\n                }.bind(this);\n                x.readAsArrayBuffer(this._input.files[0]);\n            }\n             else {\n                var y = 1;\n                if (this._input.files) {\n                    y = this._input.files.length;\n                };\n                var z = [];\n                for (var aa = 0; (aa < y); ++aa) {\n                    z.push(this._getPreviewAttachment(null));;\n                };\n                this.inform(\"submit\", {\n                    upload_id: w,\n                    raw_attachments: z\n                });\n            }\n        ;\n        },\n        _onFileUploadSuccess: function(event, w) {\n            var x = w.response.getPayload(), y = x.uploadID;\n            s(this._uploadBatches, y);\n            var z = [];\n            x.metadata.forEach(function(aa) {\n                z.push(aa.image_id);\n            });\n            this.inform(\"all-uploads-completed\", {\n                upload_id: x.uploadID,\n                image_ids: z\n            });\n        },\n        _onFileUploadFailure: function(event, w) {\n            var x = this._uploadBatches[(this._uploadBatches.length - 1)];\n            s(this._uploadBatches, x);\n            this.inform(\"all-uploads-failed\", {\n                upload_id: x\n            });\n        }\n    });\n    e.exports = v;\n});\n__d(\"ChatTabModel\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"ChatBehavior\",\"ChatConfig\",\"JSLogger\",\"MercuryAssert\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryTimestampTracker\",\"PresenceInitialData\",\"PresenceState\",\"PresenceUtil\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"JSLogger\"), l = b(\"MercuryAssert\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"MercuryTimestampTracker\").get(), p = b(\"PresenceInitialData\"), q = b(\"PresenceState\"), r = b(\"PresenceUtil\"), s = b(\"areObjectsEqual\"), t = b(\"copyProperties\"), u = [], v = null, w = null, x = null, y = null;\n    function z() {\n        return parseInt(p.serverTime, 10);\n    };\n    var aa = (j.get(\"tab_max_load_age\") || 3600000), ba = (z() - aa), ca = 0, da = 20, ea = k.create(\"chat_tab_model\"), fa = false;\n    function ga(xa) {\n        var ya = q.verifyNumber(xa.uct2);\n        if ((!ya || (typeof ya !== \"number\"))) {\n            ea.warn(\"bad_cookie_version\", xa.uct2);\n            return null;\n        }\n    ;\n        if (((ya < ca) || (ya < ba))) {\n            return null\n        };\n        return ya;\n    };\n    function ha(xa) {\n        var ya = ga(xa);\n        if (!ya) {\n            var za = {\n            };\n            za.old_tabs = ((xa && xa.t2) && JSON.stringify(xa.t2));\n            za.old_promoted = (xa && xa.lm2);\n            za.old_time = (xa && xa.uct2);\n            za.old_reason = (xa && xa.tr);\n            za.old_window = (xa && xa.tw);\n            var ab;\n            if ((w && xa.t2)) {\n                for (var bb = 0; (bb < xa.t2.length); bb++) {\n                    var cb = xa.t2[bb];\n                    if ((cb.i === w)) {\n                        ab = cb.r;\n                    };\n                }\n            };\n            var db = [];\n            u.forEach(function(eb) {\n                if (!eb.fragile) {\n                    var fb = {\n                        i: eb.id,\n                        si: eb.server_id\n                    };\n                    if ((eb.raised || (((eb.id === w) && ab)))) {\n                        fb.r = 1;\n                    };\n                    db.push(fb);\n                }\n            ;\n            });\n            xa.t2 = db;\n            xa.uct2 = ca;\n            xa.lm2 = v;\n            xa.tr = y;\n            xa.tw = r.getSessionID();\n            za.new_tabs = JSON.stringify(xa.t2);\n            za.new_promoted = xa.lm2;\n            za.new_time = xa.uct2;\n            za.new_reason = xa.tr;\n            za.new_window = xa.tw;\n            ea.debug(\"store\", za);\n        }\n    ;\n        return xa;\n    };\n    function ia(xa) {\n        if (xa) {\n            var ya = ga(xa);\n            if ((ya && (ya !== ca))) {\n                var za = {\n                };\n                za.old_tabs = JSON.stringify(u);\n                za.old_promoted = v;\n                za.old_time = ca;\n                za.old_reason = y;\n                za.window_id = r.getSessionID();\n                za.cookie_tabs = ((xa && xa.t2) && JSON.stringify(xa.t2));\n                za.cookie_promoted = (xa && xa.lm2);\n                za.cookie_time = (xa && xa.uct2);\n                za.cookie_reason = (xa && xa.tr);\n                za.cookie_window = (xa && xa.tw);\n                ca = ya;\n                y = \"load\";\n                var ab = ja(xa.t2, (xa.lm2 || null));\n                za.load_result = ab;\n                za.new_tabs = JSON.stringify(u);\n                za.new_promoted = v;\n                za.new_time = ca;\n                za.new_reason = y;\n                var event = \"load\";\n                if (!fa) {\n                    event += \"_init\";\n                };\n                ea.log(event, za);\n                return ab;\n            }\n        ;\n        }\n    ;\n        return false;\n    };\n    function ja(xa, ya) {\n        if (ka(xa, ya)) {\n            var za = u.filter(function(cb) {\n                return cb.fragile;\n            }), ab = {\n            };\n            v = null;\n            u = xa.map(function(cb) {\n                var db = {\n                    id: cb.i,\n                    server_id: cb.si\n                };\n                if ((db.id == ya)) {\n                    v = db.id;\n                };\n                if ((w == cb.i)) {\n                    var eb = pa(w);\n                    if ((eb != -1)) {\n                        db.raised = u[eb].raised;\n                        return db;\n                    }\n                     else return null\n                ;\n                }\n            ;\n                if (cb.r) {\n                    db.raised = true;\n                };\n                ab[db.id] = db;\n                return db;\n            });\n            u = u.filter(function(cb) {\n                return (cb != null);\n            });\n            if (x) {\n                for (var bb in x) {\n                    if ((!ab[bb] || !ab[bb].raised)) {\n                        delete x[bb];\n                    };\n                }\n            };\n            za = za.filter(function(cb) {\n                return !ab[cb.id];\n            });\n            u = u.concat(za);\n            oa();\n            return true;\n        }\n    ;\n        return false;\n    };\n    function ka(xa, ya) {\n        if ((ya != v)) {\n            return true\n        };\n        var za = u.filter(function(cb) {\n            return !cb.fragile;\n        });\n        if ((xa.length != za.length)) {\n            return true\n        };\n        for (var ab = 0, bb = xa.length; (ab < bb); ab++) {\n            if ((xa[ab].id === w)) {\n                continue;\n            };\n            if (!s(xa[ab], za[ab])) {\n                return true\n            };\n        };\n        return false;\n    };\n    function la(xa, ya, za) {\n        var ab = ia(q.get());\n        if (((ya === undefined) || (ya > ca))) {\n            if (xa()) {\n                ab = true;\n                y = (za || null);\n                na(ya);\n            }\n        ;\n        }\n         else ea.error(\"rejected\", {\n            change_time: ya,\n            state_time: ca\n        });\n    ;\n        (ab && ma());\n    };\n    function ma() {\n        if (fa) {\n            va.inform(\"chat/tabs-changed\", va.get());\n        };\n    };\n    function na(xa) {\n        if ((xa === undefined)) {\n            xa = Math.max((o.getLastUserMessageTimestamp() || 1), (ca + 1));\n        };\n        ca = xa;\n        q.doSync();\n    };\n    function oa() {\n        var xa = (u.length - da);\n        if ((xa > 0)) {\n            u = u.filter(function(ya) {\n                return (ya.raised || (xa-- <= 0));\n            });\n        };\n    };\n    function pa(xa) {\n        for (var ya = 0; (ya < u.length); ya++) {\n            if ((u[ya].id == xa)) {\n                return ya\n            };\n        };\n        return -1;\n    };\n    function qa(xa, ya) {\n        var za = n.getThreadMetaNow(xa);\n        if (!za) {\n            return false\n        };\n        if (za.is_canonical_user) {\n            return sa(xa, ya);\n        }\n         else {\n            var ab = ra(xa);\n            if (ab) {\n                m.getServerThreadID(xa, function(bb) {\n                    if (ta(xa, bb)) {\n                        na();\n                        ma();\n                    }\n                ;\n                });\n            };\n            return ab;\n        }\n    ;\n    };\n    function ra(xa) {\n        if ((pa(xa) === -1)) {\n            u.push({\n                id: xa,\n                fragile: true\n            });\n            ea.log(\"open_fragile_tab\", {\n                tabs: JSON.stringify(u),\n                opened: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    function sa(xa, ya) {\n        var za = pa(xa);\n        if ((za != -1)) {\n            if (u[za].fragile) {\n                u.splice(za, 1);\n            }\n             else {\n                u[za].signatureID = ya;\n                return true;\n            }\n        \n        };\n        for (var ab = 0; (ab <= u.length); ab++) {\n            if (((ab == u.length) || u[ab].fragile)) {\n                u.splice(ab, 0, {\n                    id: xa,\n                    signatureID: ya\n                });\n                oa();\n                ea.log(\"open_tab\", {\n                    tabs: JSON.stringify(u),\n                    opened: xa,\n                    window_id: r.getSessionID()\n                });\n                return true;\n            }\n        ;\n        };\n    };\n    function ta(xa, ya) {\n        var za = pa(xa);\n        if (((za != -1) && u[za].fragile)) {\n            var ab = u[za];\n            ab.fragile = false;\n            ab.server_id = ya;\n            var bb = [];\n            u.forEach(function(cb) {\n                if ((cb.id != xa)) {\n                    if ((ab && cb.fragile)) {\n                        bb.push(ab);\n                        ab = null;\n                    }\n                ;\n                    bb.push(cb);\n                }\n            ;\n            });\n            if (ab) {\n                bb.push(ab);\n            };\n            u = bb;\n            ea.log(\"make_permanent\", {\n                tabs: JSON.stringify(u),\n                tab_id: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    function ua(xa) {\n        var ya = pa(xa);\n        if ((xa == v)) {\n            v = null;\n        };\n        if ((ya != -1)) {\n            u.splice(ya, 1);\n            ea.log(\"close_tab\", {\n                tabs: JSON.stringify(u),\n                closed: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    q.registerStateStorer(ha);\n    q.registerStateLoader(function(xa) {\n        if (ia(xa)) {\n            ma();\n        };\n    });\n    function va() {\n    \n    };\n    t(va, h, {\n        indexOf: function(xa) {\n            return pa(xa);\n        },\n        getTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = this.indexOf(xa);\n            if ((ya > -1)) {\n                var za = u[ya];\n                return t({\n                }, za);\n            }\n        ;\n            return null;\n        },\n        getEmptyTab: function() {\n            for (var xa = 0; (xa < u.length); xa++) {\n                var ya = u[xa].id;\n                if (n.isNewEmptyLocalThread(ya)) {\n                    return ya\n                };\n            };\n            return null;\n        },\n        getServerTime: function() {\n            return z();\n        },\n        closeAllTabs: function() {\n            if (u.length) {\n                ea.log(\"close_all_tabs\", {\n                    closed_tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n                u = [];\n                v = null;\n                if (x) {\n                    x = {\n                    };\n                };\n                na();\n                ma();\n            }\n        ;\n        },\n        closeFragileTabs: function() {\n            var xa = [];\n            for (var ya = 0; (ya < u.length); ya++) {\n                if ((u[ya].fragile && !n.isNewEmptyLocalThread(u[ya].id))) {\n                    xa.push(u[ya]);\n                    u.splice(ya);\n                    ma();\n                    break;\n                }\n            ;\n            };\n            ea.log(\"close_fragile_tabs\", {\n                tabs: JSON.stringify(u),\n                fragile_closed: xa,\n                window_id: r.getSessionID()\n            });\n        },\n        closeTab: function(xa, ya) {\n            l.isThreadID(xa);\n            var za = false;\n            if (x) {\n                delete x[xa];\n                za = true;\n            }\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    za = true;\n                };\n                return za;\n            }, undefined, ya);\n        },\n        closeTabAndDemote: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (x) {\n                delete x[xa];\n                ab = true;\n            }\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    if (v) {\n                        var bb = pa(v);\n                        if ((bb > ya)) {\n                            var cb = u.splice(bb, 1)[0];\n                            u.splice(ya, 0, cb);\n                            v = null;\n                        }\n                    ;\n                    }\n                ;\n                    ab = true;\n                }\n            ;\n                return ab;\n            }, undefined, za);\n        },\n        raiseTab: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if ((x && ya)) {\n                x[xa] = true;\n                ab = true;\n            }\n        ;\n            if ((!ya && (xa === w))) {\n                (ab && ma());\n                return;\n            }\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    ab = true;\n                };\n                var bb = pa(xa);\n                if (((bb != -1) && !u[bb].raised)) {\n                    u[bb].raised = true;\n                    ab = true;\n                    ea.log(\"raise_tab\", {\n                        tabs: JSON.stringify(u),\n                        raised: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n                return ab;\n            });\n        },\n        get: function() {\n            var xa = u.map(function(ya) {\n                var za = t({\n                }, ya);\n                delete za.fragile;\n                if (x) {\n                    za.raised = x[za.id];\n                };\n                return za;\n            });\n            return {\n                tabs: xa,\n                promoted: v\n            };\n        },\n        openFragileTab: function(xa) {\n            l.isThreadID(xa);\n            if (ra(xa)) {\n                ma();\n            };\n        },\n        openTab: function(xa) {\n            l.isThreadID(xa);\n            la(qa.curry(xa));\n        },\n        lowerTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = false;\n            if (x) {\n                delete x[xa];\n                ya = true;\n            }\n        ;\n            la(function() {\n                var za = pa(xa);\n                if (((za != -1) && u[za].raised)) {\n                    delete u[za].raised;\n                    ea.log(\"lower_tab\", {\n                        tabs: JSON.stringify(u),\n                        lowered: xa,\n                        window_id: r.getSessionID()\n                    });\n                    ya = true;\n                }\n            ;\n                return ya;\n            });\n        },\n        raiseAndPromoteTab: function(xa, ya, za, ab, bb) {\n            l.isThreadID(xa);\n            var cb = false;\n            if ((x && ya)) {\n                x[xa] = true;\n                cb = true;\n            }\n        ;\n            if ((!ya && (xa === w))) {\n                (cb && ma());\n                return;\n            }\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    cb = true;\n                };\n                var db = pa(xa);\n                if (((db != -1) && ((!u[db].raised || (v != xa))))) {\n                    u[db].raised = true;\n                    v = xa;\n                    cb = true;\n                    ea.log(\"raise_and_promote_tab\", {\n                        tabs: JSON.stringify(u),\n                        promoted: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n                return cb;\n            }, ab, bb);\n        },\n        promoteThreadInPlaceOfThread: function(xa, ya) {\n            l.isThreadID(xa);\n            l.isThreadID(ya);\n            la(function() {\n                var za = pa(xa), ab = pa(ya);\n                if ((v === ya)) {\n                    v = xa;\n                };\n                var bb = u[za];\n                u[za] = u[ab];\n                u[ab] = bb;\n                return true;\n            });\n        },\n        squelchTab: function(xa) {\n            l.isThreadID(xa);\n            w = xa;\n            this.lowerTab(xa);\n            ea.log(\"squelch_tab\", {\n                squelched: xa,\n                tabs: JSON.stringify(u),\n                window_id: r.getSessionID()\n            });\n        },\n        clearSquelchedTab: function() {\n            if (w) {\n                ea.log(\"unsquelch_tab\", {\n                    squelched: w,\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            };\n            w = null;\n        },\n        persistLocalRaised: function() {\n            if (x) {\n                la(function() {\n                    var xa = false;\n                    u.forEach(function(ya) {\n                        if ((ya.raised != x[ya.id])) {\n                            xa = true;\n                            if (x[ya.id]) {\n                                ya.raised = true;\n                            }\n                             else delete ya.raised;\n                        ;\n                        }\n                    ;\n                    });\n                    return xa;\n                });\n                ea.log(\"persist_local_raise\", {\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        }\n    });\n    g.subscribe(k.DUMP_EVENT, function(xa, ya) {\n        ya.chat_tabs = {\n            promoted: v,\n            tabs: u.map(function(za) {\n                return t({\n                }, za);\n            }),\n            time: ca,\n            max_load_age: aa\n        };\n    });\n    function wa() {\n        var xa = i.ignoresRemoteTabRaise();\n        if ((xa && !x)) {\n            ea.log(\"start_ignore_remote_raise\");\n            x = {\n            };\n            ma();\n        }\n         else if ((!xa && x)) {\n            ea.log(\"stop_ignore_remote_raise\");\n            x = null;\n            ma();\n        }\n        \n    ;\n    };\n    i.subscribe(i.ON_CHANGED, wa);\n    wa();\n    ia(q.getInitial(), true);\n    if ((ca === 0)) {\n        ca = (z() - 600000);\n    };\n    fa = true;\n    e.exports = va;\n});\n__d(\"VideoCallPromo\", [\"ArbiterMixin\",\"AsyncRequest\",\"ChatConfig\",\"ChatVisibility\",\"LegacyContextualDialog\",\"CSS\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"LegacyContextualDialog\"), l = b(\"CSS\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"VideoCallCore\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\");\n    function s() {\n        this._dialog = null;\n    };\n    function t(v) {\n        if (!((p.isSupported() && i.get(\"video.show_promo\")))) {\n            return false\n        };\n        var w = n.getCanonicalUserInThread(v);\n        if (!w) {\n            return false\n        };\n        return (j.isOnline() && p.availableForCall(w));\n    };\n    function u(v) {\n        new h().setURI(\"/ajax/chat/video/log_promo.php\").setData({\n            viewedUserID: v\n        }).setAllowCrossPageTransition(true).setErrorHandler(r).send();\n    };\n    q(s.prototype, g);\n    q(s.prototype, {\n        render: function(v, w) {\n            var x = t(w);\n            if (!x) {\n                return\n            };\n            var y = n.getCanonicalUserInThread(w);\n            m.get((\"fbid:\" + y), function(z) {\n                if (!z.call_promo) {\n                    return\n                };\n                var aa = o[\":fb:mercury:call:promo\"].build();\n                this._dialog = new k();\n                this._dialog.init(aa.getRoot()).setWidth(250).setAlignH(\"center\").setContext(v).show();\n                l.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n                l.addClass(v, \"video_call_promo\");\n                u(n.getCanonicalUserInThread(w));\n                this.inform(\"chat/dialog-rendered\", {\n                    dialog: this,\n                    thread_id: w\n                });\n            }.bind(this));\n        },\n        updatePosition: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.updatePosition();\n            };\n        },\n        hide: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"VideoCallTourDialog\", [\"ArbiterMixin\",\"LegacyContextualDialog\",\"CSS\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"VideoCallingTour\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LegacyContextualDialog\"), i = b(\"CSS\"), j = b(\"MercuryThreads\").get(), k = b(\"ChatTabTemplates\"), l = b(\"VideoCallCore\"), m = b(\"VideoCallingTour\"), n = b(\"copyProperties\");\n    function o() {\n        this._dialog = null;\n    };\n    n(o.prototype, g);\n    n(o.prototype, {\n        render: function(p, q) {\n            var r = j.getCanonicalUserInThread(q);\n            if ((!r || !l.availableForCall(r))) {\n                return\n            };\n            var s = k[\":fb:mercury:call:tour\"].build();\n            this._dialog = new h();\n            this._dialog.init(s.getRoot()).setWidth(250).setAlignH(\"center\").setContext(p).show();\n            i.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n            i.addClass(p, \"video_call_tour\");\n            this.inform(\"chat/dialog-rendered\", {\n                dialog: this,\n                thread_id: q\n            });\n            m.inform(\"videocallingtour/end\");\n        },\n        updatePosition: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.updatePosition();\n            };\n        },\n        hide: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatContextualDialogController\", [\"Event\",\"ArbiterMixin\",\"ChatTabModel\",\"VideoCallingTour\",\"VideoCallPromo\",\"VideoCallTourDialog\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"VideoCallingTour\"), k = b(\"VideoCallPromo\"), l = b(\"VideoCallTourDialog\"), m = b(\"copyProperties\"), n = b(\"setTimeoutAcrossTransitions\"), o = 60000, p = false, q = false, r = function(y, z) {\n        this._videoCallPromo = new k();\n        this._videoCallTour = new l();\n        this._threadID = y;\n        this._tabMainElement = z;\n        this._openDialog = null;\n        this._subscriptionTokens = [];\n        this._scrollListener = null;\n        this._timeout = null;\n    };\n    function s(y, event, z) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        };\n    };\n    function t(y) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        };\n    };\n    function u(y) {\n        if (y._openDialog) {\n            y._openDialog.hide();\n            y._openDialog = null;\n        }\n    ;\n        if (y._timeout) {\n            clearTimeout(y._timeout);\n            y._timeout = null;\n        }\n    ;\n        while (y._subscriptionTokens.length) {\n            y._subscriptionTokens.pop().unsubscribe();;\n        };\n        if (y._scrollListener) {\n            y._scrollListener.remove();\n            y._scrollListener = null;\n        }\n    ;\n    };\n    function v(y, event, z) {\n        if ((z.thread_id === y._threadID)) {\n            y._openDialog = z.dialog;\n            p = true;\n            x(y);\n            y._timeout = n(y.destroy.bind(y, y._threadID), o);\n            y._scrollListener = g.listen(window, \"scroll\", t.curry(y));\n        }\n    ;\n    };\n    function w(y, z) {\n        if (!y._openDialog) {\n            y._subscriptionTokens.push(z.subscribe(\"chat/dialog-rendered\", v.curry(y)));\n            z.render(y._tabMainElement, y._threadID);\n        }\n    ;\n    };\n    function x(y) {\n        y._subscriptionTokens.push(i.subscribe(\"chat/tabs-changed\", s.curry(y)), r.subscribe(\"dialog/close-all\", u.curry(y)));\n    };\n    m(r, h);\n    m(r.prototype, {\n        destroy: function() {\n            u(this);\n        },\n        tabFocused: function() {\n            if (q) {\n                w(this, this._videoCallTour);\n                return;\n            }\n        ;\n            if (!p) {\n                w(this, this._videoCallPromo);\n            };\n        },\n        tabNotActive: function() {\n            u(this);\n        },\n        hideVideoCallouts: function() {\n            u(this);\n        }\n    });\n    j.subscribe(\"videocallingtour/start\", function() {\n        q = true;\n        r.inform(\"dialog/close-all\");\n    });\n    j.subscribe(\"videocallingtour/end\", function() {\n        q = false;\n    });\n    e.exports = r;\n});\n__d(\"ChatPrivacyActionController\", [\"ChatVisibility\",\"JSLogger\",\"PresencePrivacy\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatVisibility\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = b(\"copyProperties\"), k = function(l, m) {\n        this._userID = l;\n        this._logger = h.create(\"blackbird\");\n        this._getState = function() {\n            if (g.isOnline()) {\n                return (i.allows(this._userID) ? k.NORMAL : k.BLOCKED)\n            };\n            return k.OFFLINE;\n        };\n        this._togglePrivacy = function() {\n            var n = this._getState();\n            switch (this._getState()) {\n              case k.OFFLINE:\n                if (g.isOnline()) {\n                    this._logger.error(\"tabs_already_online\");\n                    break;\n                }\n            ;\n                this._logger.log(\"tabs_go_online\", {\n                    tab_id: this._userID\n                });\n                g.goOnline(function() {\n                    if (!i.allows(this._userID)) {\n                        if ((this._getState() !== k.BLOCKED)) {\n                            this._logger.error(\"privacy_action_controller_blocked_inconsistency\");\n                        };\n                        this._togglePrivacy();\n                    }\n                ;\n                }.bind(this));\n                break;\n              case k.BLOCKED:\n                i.allow(this._userID);\n                this._logger.log(\"tabs_unblock\", {\n                    tab_id: this._userID\n                });\n                break;\n              case k.NORMAL:\n                i.disallow(this._userID);\n                this._logger.log(\"tabs_block\", {\n                    tab_id: this._userID\n                });\n                break;\n            };\n        };\n        (function() {\n            var n = function() {\n                (m && m(this._getState()));\n            }.bind(this);\n            n();\n            this._subscribeToken = i.subscribe(\"privacy-changed\", n);\n        }.bind(this)).defer();\n    };\n    k.OFFLINE = \"offline\";\n    k.BLOCKED = \"blocked\";\n    k.NORMAL = \"normal\";\n    j(k.prototype, {\n        togglePrivacy: function() {\n            this._logger.log(\"gear_menu_toggle_privacy\", {\n                tab_id: this._userID\n            });\n            this._togglePrivacy();\n        },\n        destroy: function() {\n            i.unsubscribe(this._subscribeToken);\n        }\n    });\n    e.exports = k;\n});\n__d(\"MercuryTypingIndicator\", [\"Animation\",\"CSS\",\"DOM\",\"MercuryTypingReceiver\",\"MercuryParticipants\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Tooltip\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryTypingReceiver\"), k = b(\"MercuryParticipants\"), l = b(\"Style\"), m = b(\"ChatTabTemplates\"), n = b(\"MercuryThreadInformer\").get(), o = b(\"Tooltip\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\"), s = [];\n    n.subscribe(\"messages-received\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            (y && x.receivedMessages(y));\n        });\n    });\n    j.subscribe(\"state-changed\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            (y && x._handleStateChanged(y));\n        });\n    });\n    function t(v) {\n        var w = m[\":fb:chat:conversation:message-group\"].build(), x = m[\":fb:mercury:typing-indicator:typing\"].build();\n        h.addClass(w.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\");\n        var y = w.getNode(\"profileLink\");\n        o.set(y, v.name, \"left\");\n        y.href = v.href;\n        w.setNodeContent(\"profileName\", v.name);\n        w.setNodeProperty(\"profilePhoto\", \"src\", v.image_src);\n        var z = r._(\"{name} is typing...\", {\n            name: v.short_name\n        });\n        o.set(x.getRoot(), z, \"above\");\n        i.appendContent(w.getNode(\"messages\"), x.getRoot());\n        return w;\n    };\n    function u(v, w, x) {\n        this._animations = {\n        };\n        this._activeUsers = {\n        };\n        this._typingIndicator = w;\n        this._messagesView = x;\n        this._threadID = v;\n        this._subscription = j.subscribe(\"state-changed\", function(y, z) {\n            var aa = z[this._threadID];\n            (aa && this._handleStateChanged(aa));\n        }.bind(this));\n        s.push(this);\n    };\n    p(u.prototype, {\n        destroy: function() {\n            Object.keys(this._activeUsers).forEach(this._removeUserBubble.bind(this));\n            this._controller.destroy();\n            s.remove(this);\n        },\n        receivedMessages: function(v) {\n            v.forEach(function(w) {\n                if (!k.isAuthor(w.author)) {\n                    this._removeUserBubble(w.author);\n                };\n            }.bind(this));\n        },\n        _handleStateChanged: function(v) {\n            for (var w in this._activeUsers) {\n                if ((v.indexOf(w) === -1)) {\n                    this._slideOutUserBubble(w);\n                    delete this._activeUsers[w];\n                }\n            ;\n            };\n            if (v.length) {\n                k.getMulti(v, function(x) {\n                    var y = this._messagesView.isScrolledToBottom(), z = {\n                    };\n                    for (var aa in x) {\n                        var ba = this._activeUsers[aa];\n                        z[aa] = (ba || t(x[aa]).getRoot());\n                        if (!ba) {\n                            i.appendContent(this._typingIndicator, z[aa]);\n                        };\n                    };\n                    var ca = (Object.keys(z).length > 0);\n                    (y && this._messagesView.scrollToBottom(ca));\n                    this._activeUsers = z;\n                }.bind(this));\n            };\n        },\n        _removeUserBubble: function(v, w) {\n            var x = this._getCurrentAnimation(v, w);\n            if (x) {\n                x.animation.stop();\n                i.remove(x.elem);\n                delete this._animations[v];\n            }\n        ;\n            if ((v in this._activeUsers)) {\n                i.remove(this._activeUsers[v]);\n                delete this._activeUsers[v];\n            }\n        ;\n            (w && i.remove(w));\n        },\n        _slideOutUserBubble: function(v) {\n            var w = this._activeUsers[v];\n            if (this._getCurrentAnimation(v, w)) {\n                return;\n            }\n             else if (w) {\n                l.set(w, \"overflow\", \"hidden\");\n                var x = (new g(w)).from(\"opacity\", 1).from(\"height\", w.offsetHeight).to(\"height\", 0).to(\"opacity\", 0).ease(g.ease.end).duration(250).ondone(this._removeUserBubble.bind(this, v, w)).go();\n                this._animations[v] = {\n                    animation: x,\n                    elem: w\n                };\n            }\n            \n        ;\n        },\n        _getCurrentAnimation: function(v, w) {\n            if ((this._animations[v] && ((!w || (this._animations[v].elem === w))))) {\n                return this._animations[v]\n            };\n        }\n    });\n    e.exports = u;\n});\n__d(\"ChatTabMessagesView\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"MercuryAttachment\",\"MercuryAttachmentRenderer\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"createArrayFrom\",\"CSS\",\"DOM\",\"Env\",\"Event\",\"JoinableConversationMessageFilter\",\"LiveTimer\",\"MercuryActionTypeConstants\",\"MercuryAPIArgsSource\",\"MercuryLastMessageIndicator\",\"MercuryLogMessageType\",\"MercurySourceType\",\"shield\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"MercuryThreadlistConstants\",\"MercuryTypingIndicator\",\"MercuryMessageRenderer\",\"Parent\",\"MercuryParticipants\",\"React\",\"ServerTime\",\"MercuryStatusTemplates\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Timestamp.react\",\"Tooltip\",\"VideoCallCore\",\"copyProperties\",\"csx\",\"cx\",\"formatDate\",\"isRTL\",\"removeFromArray\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"MercuryAttachment\"), l = b(\"MercuryAttachmentRenderer\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"createArrayFrom\"), q = b(\"CSS\"), r = b(\"DOM\"), s = b(\"Env\"), t = b(\"Event\"), u = b(\"JoinableConversationMessageFilter\"), v = b(\"LiveTimer\"), w = b(\"MercuryActionTypeConstants\"), x = b(\"MercuryAPIArgsSource\"), y = b(\"MercuryLastMessageIndicator\"), z = b(\"MercuryLogMessageType\"), aa = b(\"MercurySourceType\"), ba = b(\"shield\"), ca = b(\"MercuryMessages\").get(), da = b(\"MercuryServerRequests\").get(), ea = b(\"MercuryThreadMetadataRawRenderer\"), fa = b(\"MercuryThreadMetadataRenderer\").get(), ga = b(\"MercuryThreads\").get(), ha = b(\"MercuryThreadlistConstants\"), ia = b(\"MercuryTypingIndicator\"), ja = b(\"MercuryMessageRenderer\"), ka = b(\"Parent\"), la = b(\"MercuryParticipants\"), ma = b(\"React\"), na = b(\"ServerTime\"), oa = b(\"MercuryStatusTemplates\"), pa = b(\"Style\"), qa = b(\"ChatTabTemplates\"), ra = b(\"MercuryThreadInformer\").get(), sa = b(\"Timestamp.react\"), ta = b(\"Tooltip\"), ua = b(\"VideoCallCore\"), va = b(\"copyProperties\"), wa = b(\"csx\"), xa = b(\"cx\"), ya = b(\"formatDate\"), za = b(\"isRTL\"), ab = b(\"removeFromArray\"), bb = b(\"throttle\"), cb = b(\"tx\"), db, eb = 34, fb = ((1000 * 60) * 60), gb = 70, hb = null, ib = 20;\n    function jb(tb) {\n        return ya(new Date(tb), (n.get(\"24h_times\") ? \"H:i\" : \"g:ia\"));\n    };\n    function kb(tb) {\n        var ub = qa[\":fb:chat:conversation:message-group\"].build(), vb = ub.getNode(\"profileLink\"), wb = n.get(\"chat_tab_bubbles\"), xb = la.isAuthor(tb.author), yb = da.tokenizeThreadID(tb.thread_id), zb = (yb.type !== \"user\"), ac = (!xb || !wb);\n        if (!wb) {\n            ub.setNodeContent(\"timestamp\", jb(tb.timestamp));\n        };\n        q.conditionClass(ub.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\", (!xb && wb));\n        q.conditionClass(ub.getRoot(), \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\", ((zb && !xb) && wb));\n        q.conditionShow(vb, ac);\n        la.get(tb.author, function(bc) {\n            if (ac) {\n                vb.href = bc.href;\n                var cc = (xb ? \"You\" : bc.name);\n                if ((!xb && wb)) {\n                    cc = g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__tooltipcontainer\"\n                    }, g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__timestamptooltip\"\n                    }, jb(tb.timestamp)), bc.name);\n                };\n                ta.set(vb, cc, \"left\");\n                if (((!xb && wb) && zb)) {\n                    ub.setNodeContent(\"profileName\", bc.name);\n                };\n                ub.setNodeProperty(\"profilePhoto\", \"src\", bc.image_src);\n            }\n        ;\n        });\n        return ub;\n    };\n    function lb(tb) {\n        var ub = qa[\":fb:chat:conversation:message:event\"].build(), vb = n.get(\"chat_tab_bubbles\"), wb = jb(tb.timestamp);\n        if (vb) {\n            ub.getRoot().setAttribute(\"title\", wb);\n        }\n         else ub.setNodeContent(\"timestamp\", wb);\n    ;\n        ja.renderLogMessage(ub.getNode(\"icon\"), ub.getNode(\"message\"), ub.getNode(\"attachment\"), tb);\n        var xb = nb(tb);\n        if (xb) {\n            r.appendContent(ub.getNode(\"message\"), xb);\n        };\n        return ub.getRoot();\n    };\n    function mb(tb, ub) {\n        if (!n.get(\"chat_tab_bubbles\")) {\n            return\n        };\n        if ((hb === null)) {\n            var vb = ub.childNodes[0];\n            pa.set(ub, \"overflow\", \"scroll\");\n            hb = (vb.clientWidth - gb);\n            pa.set(ub, \"overflow\", \"\");\n        }\n    ;\n        if (!q.hasClass(tb, \"-cx-PRIVATE-fbChatMessage__root\")) {\n            var wb = r.scry(tb, \".-cx-PRIVATE-fbChatMessage__root\");\n            if ((wb.length === 1)) {\n                tb = wb[0];\n            }\n             else return\n        ;\n        }\n    ;\n        pa.set(tb, \"max-width\", (hb + \"px\"));\n        var xb, yb, zb = tb.firstChild;\n        if (((tb.childNodes.length === 1) && zb.getAttribute(\"data-measureme\"))) {\n            xb = zb.getClientRects();\n            var ac = zb.offsetHeight;\n            if (((xb && (xb.length > 1)) && (xb[0].height < ac))) {\n                yb = true;\n                if (!db) {\n                    r.remove(zb);\n                    db = tb.offsetWidth;\n                    r.appendContent(tb, zb);\n                }\n            ;\n                var bc = zb.offsetWidth, cc = ((tb.offsetWidth - bc) - db);\n                if ((cc > 0)) {\n                    pa.set(tb, \"max-width\", (bc + \"px\"));\n                };\n            }\n        ;\n        }\n    ;\n        var dc = ka.byClass(tb, \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\");\n        if (dc) {\n            q.conditionClass(dc, \"-cx-PRIVATE-fbChatMessageGroup__onelineunderprofilename\", (xb ? !yb : (tb.offsetHeight < eb)));\n        };\n    };\n    function nb(tb) {\n        var ub, vb;\n        if ((tb.log_message_type == z.VIDEO_CALL)) {\n            if ((tb.log_message_data.event_name == \"install_canceled\")) {\n                ub = r.tx._(\"Retry setup and call back.\");\n                vb = \"callback_cancelinstall_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.to, vb);\n            }\n             else if (((!tb.log_message_data.event_name && (tb.log_message_data.callee == la.user)) && !tb.log_message_data.answered)) {\n                ub = r.tx._(\"Call Back\");\n                vb = \"callback_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.caller.split(\":\")[1], vb);\n            }\n            \n        \n        };\n        return null;\n    };\n    function ob(tb, ub, vb, wb) {\n        if (ua.isSupported()) {\n            var xb = (!o.isOnline() || !ua.availableForCall(vb)), yb = r.create(\"a\", {\n                href: \"#\",\n                className: \"callBackLink\"\n            }, tb);\n            if (xb) {\n                q.hide(yb);\n            };\n            yb.setAttribute(\"data-gt\", JSON.stringify({\n                videochat: \"clicked_callback_link\"\n            }));\n            t.listen(yb, \"click\", function() {\n                rb.inform(\"video-call-clicked\", {\n                    userID: vb,\n                    threadID: ub,\n                    clickSource: wb\n                });\n            });\n            return yb;\n        }\n    ;\n        return null;\n    };\n    function pb(tb) {\n        var ub = qa[\":fb:mercury:chat:message:forward\"].build(), vb = ub.getNode(\"forwardText\");\n        if (vb) {\n            q.hide(ub.getRoot());\n            fa.renderTitanLink(tb.thread_id, ub.getNode(\"forwardLink\"), q.show.bind(q, ub.getRoot()));\n            if ((tb.forward_count > 1)) {\n                r.appendContent(vb, cb._(\"{count} forwarded messages\", {\n                    count: tb.forward_count\n                }));\n            }\n             else r.appendContent(vb, \"1 forwarded message\");\n        ;\n        }\n    ;\n        return ub.getRoot();\n    };\n    var qb = [];\n    function rb(tb, ub, vb, wb, xb, yb, zb) {\n        this.loadingIcon = xb;\n        this.threadID = tb;\n        this.sheetController = ub;\n        this.scrollContainer = vb;\n        this.conversationElem = wb;\n        this.messageElements = {\n        };\n        this.messageGroup = null;\n        this.prevMessage = null;\n        v.restart((na.get() / 1000));\n        this._fetchMultiplier = 1;\n        this._oldestMessageDisplayedTimestamp = null;\n        this._loadingMoreMessages = false;\n        this._currentMessageCount = 0;\n        this._hasReachedClearedMessages = false;\n        var ac = ha.MESSAGE_TIMESTAMP_THRESHOLD;\n        this._oldestMessageDisplayedTimestamp = (Date.now() - ac);\n        qb.push(this);\n        this._subscription = i.subscribe(\"overflow-applied-to-body\", this.scrollToBottom.bind(this));\n        t.listen(this.scrollContainer, \"scroll\", bb(this.scrolling, 50, this));\n        var bc = n.get(\"chat_tab_bubbles\");\n        this.lastMessageIndicator = new y(this.threadID, yb, bc, this);\n        if (bc) {\n            this.typingIndicator = new ia(this.threadID, zb, this);\n        };\n        ca.getThreadMessagesRange(this.threadID, 0, ha.RECENT_MESSAGES_LIMIT, this._updateTimestamp.bind(this));\n        this.rerender();\n    };\n    va(rb, j);\n    va(rb.prototype, {\n        scrolling: function() {\n            if ((((!this._loadingMoreMessages && this.isScrolledNearTop()) && !this.isScrolledToBottom()) && !this._hasReachedClearedMessages)) {\n                this.loadMoreMessages();\n            };\n            if (!this._newMessagesSheetOpened) {\n                return\n            };\n            if (this.isScrolledToBottom()) {\n                this.sheetController.closeNewMessagesSheet();\n                this._newMessagesSheetOpened = false;\n            }\n        ;\n        },\n        destroy: function() {\n            r.empty(this.conversationElem);\n            this._subscription.unsubscribe();\n            ab(qb, this);\n            (this.lastMessageIndicator && this.lastMessageIndicator.destroy());\n            this.destroyed = true;\n        },\n        _appendMessage: function(tb) {\n            if ((tb == this.prevMessage)) {\n                return\n            };\n            var ub = ha, vb = ub.GROUPING_THRESHOLD, wb = ((tb.action_type == w.LOG_MESSAGE) && (tb.log_message_type == z.SERVER_ERROR));\n            if (tb.is_cleared) {\n                this._hasReachedClearedMessages = true;\n                return;\n            }\n        ;\n            var xb;\n            if ((this.prevMessage !== null)) {\n                xb = (tb.timestamp - this.prevMessage.timestamp);\n            }\n             else xb = Infinity;\n        ;\n            if ((!wb && ((xb >= fb)))) {\n                var yb = Math.round((tb.timestamp / 1000)), zb = tb.timestamp_datetime, ac = qa[\":fb:chat:conversation:date-break\"].build();\n                ma.renderComponent(sa({\n                    time: yb,\n                    verbose: zb,\n                    text: zb\n                }), ac.getNode(\"date\"));\n                r.appendContent(this.conversationElem, ac.getRoot());\n                this.messageGroup = null;\n            }\n        ;\n            if ((tb.action_type == w.LOG_MESSAGE)) {\n                r.appendContent(this.conversationElem, lb(tb));\n                this.messageGroup = null;\n                this.prevMessage = tb;\n                return;\n            }\n        ;\n            var bc = n.get(\"chat_tab_bubbles\");\n            if ((((!this.messageGroup || (bc && (tb.author !== la.user))) || (this.prevMessage.author != tb.author)) || (this.prevMessage.timestamp < (tb.timestamp - vb)))) {\n                this.messageGroup = kb(tb);\n                r.appendContent(this.conversationElem, this.messageGroup.getRoot());\n            }\n        ;\n            var cc = this._makeSingleMessage(tb);\n            this.messageElements[tb.message_id] = cc;\n            r.appendContent(this.messageGroup.getNode(\"messages\"), cc);\n            mb(cc, this.scrollContainer);\n            this.prevMessage = tb;\n        },\n        rerender: function() {\n            if (!this._oldestMessageDisplayedTimestamp) {\n                return\n            };\n            var tb = (this._finishedFetchingMoreMessages && this.scrollContainer.scrollHeight), ub = (this._finishedFetchingMoreMessages && this.scrollContainer.scrollTop), vb = this.isScrolledToBottom();\n            r.empty(this.conversationElem);\n            this.messageElements = {\n            };\n            this.messageGroup = null;\n            this.prevMessage = null;\n            var wb = ca.getThreadMessagesSinceTimestamp(this.threadID, this._oldestMessageDisplayedTimestamp);\n            this._renderOlderMessages(wb, tb, ub, vb);\n            this._finishedFetchingMoreMessages = false;\n        },\n        update: function(tb) {\n            for (var ub in tb) {\n                var vb = this.messageElements[ub];\n                if (vb) {\n                    var wb = this.isScrolledToBottom(), xb = this._makeSingleMessage(ca.getMessagesFromIDs([ub,])[0]);\n                    this.messageElements[ub] = xb;\n                    r.replace(vb, xb);\n                    mb(xb, this.scrollContainer);\n                    if (wb) {\n                        this.scrollToBottom();\n                    };\n                }\n            ;\n            };\n        },\n        _getLoadingHeight: function() {\n            return (this.loadingHeight || this.loadingIcon.clientHeight);\n        },\n        _appendMessages: function(tb) {\n            tb.forEach(this._appendMessage.bind(this));\n            (this.lastMessageIndicator && this.lastMessageIndicator.setLastMessage(this.prevMessage));\n        },\n        _appendNewMessages: function(tb) {\n            tb = u.filterMessages(function(wb) {\n                this.sheetController.openUserJoinStatusSheet(wb);\n            }.bind(this), tb, true);\n            var ub = this.isScrolledToBottom(), vb = this._messagesOnlySentFromSelf(tb);\n            this._appendMessages(tb);\n            if (ub) {\n                this.scrollToBottom();\n            }\n             else if (!vb) {\n                this.sheetController.openNewMessagesSheet();\n                this._newMessagesSheetOpened = true;\n            }\n            \n        ;\n        },\n        _messagesOnlySentFromSelf: function(tb) {\n            for (var ub = 0; (ub < tb.length); ub++) {\n                if ((tb[ub].author !== la.user)) {\n                    return false\n                };\n            };\n            return true;\n        },\n        _renderOlderMessages: function(tb, ub, vb, wb) {\n            if (!tb) {\n                return\n            };\n            tb = u.filterMessages(function(xb) {\n                this.sheetController.openUserJoinStatusSheet(xb);\n            }.bind(this), tb, false);\n            this._appendMessages(tb);\n            if (wb) {\n                this.scrollToBottom();\n            }\n             else if (this._finishedFetchingMoreMessages) {\n                this.scrollToPosition((((this.scrollContainer.scrollHeight - ub) - this.loadingHeight) + vb));\n            }\n        ;\n        },\n        _updateTimestamp: function(tb) {\n            if ((tb && tb.length)) {\n                this._oldestMessageDisplayedTimestamp = tb[0].timestamp;\n                this._currentMessageCount = tb.length;\n            }\n        ;\n            this._loadingMoreMessages = false;\n            this._finishedFetchingMoreMessages = true;\n            q.hide(this.loadingIcon);\n        },\n        isScrolledToBottom: function() {\n            var tb = this.scrollContainer;\n            return ((tb.scrollTop + tb.clientHeight) >= (tb.scrollHeight - ib));\n        },\n        isScrolledNearTop: function() {\n            return (this.scrollContainer.scrollTop < this.scrollContainer.clientHeight);\n        },\n        scrollToBottom: function(tb) {\n            this.scrollToPosition(this.scrollContainer.scrollHeight, tb);\n        },\n        scrollToPosition: function(tb, ub) {\n            (this._scrollTopAnimation && this._scrollTopAnimation.stop());\n            if ((ub === true)) {\n                this._scrollTopAnimation = (new h(this.scrollContainer)).to(\"scrollTop\", tb).ease(h.ease.end).duration(400).go();\n            }\n             else this.scrollContainer.scrollTop = tb;\n        ;\n        },\n        loadMoreMessages: function() {\n            if ((ca.hasLoadedExactlyNMessages(this.threadID, this._currentMessageCount) && ca.hasLoadedAllMessages(this.threadID))) {\n                return\n            };\n            if (ga.isNewEmptyLocalThread(this.threadID)) {\n                return\n            };\n            q.show(this.loadingIcon);\n            this.loadingHeight = this._getLoadingHeight();\n            this._loadingMoreMessages = true;\n            if ((this._fetchMultiplier < 10)) {\n                this._fetchMultiplier += 1;\n            };\n            var tb = (ha.RECENT_MESSAGES_LIMIT * this._fetchMultiplier), ub = (this._currentMessageCount + tb), vb = ca.hasLoadedNMessages(this.threadID, ub);\n            ca.getThreadMessagesRange(this.threadID, 0, ub, this._updateTimestamp.bind(this), null, x.CHAT);\n            if (vb) {\n                this.rerender();\n            };\n        },\n        _makeSingleMessage: function(tb) {\n            var ub = this._renderSingleMessage(tb);\n            q.addClass(ub, \"-cx-PRIVATE-fbChatMessage__singlemessage\");\n            return ub;\n        },\n        _renderSingleMessage: function(tb) {\n            var ub = qa[\":fb:chat:conversation:message\"].render(), vb = n.get(\"chat_tab_bubbles\");\n            if ((vb && la.isAuthor(tb.author))) {\n                ub.setAttribute(\"title\", jb(tb.timestamp));\n            };\n            if (tb.subject) {\n                var wb = qa[\":fb:chat:conversation:message:subject\"].render();\n                r.setContent(wb, tb.subject);\n                r.appendContent(ub, wb);\n            }\n        ;\n            function xb(fc) {\n                if (vb) {\n                    fc = r.create(\"span\", {\n                        \"data-measureme\": 1\n                    }, fc);\n                };\n                return fc;\n            };\n            if (tb.is_filtered_content) {\n                var yb = oa[\":fb:mercury:filtered-message\"].build();\n                r.appendContent(ub, xb(yb.getRoot()));\n                return ub;\n            }\n        ;\n            if ((tb.body.substr(0, 4) == \"?OTR\")) {\n                r.setContent(ub, xb(\"[encrypted message]\"));\n                q.addClass(ub, \"-cx-PRIVATE-fbChatMessage__cyphertext\");\n            }\n             else {\n                q.addClass(ub, (za(tb.body) ? \"direction_rtl\" : \"direction_ltr\"));\n                var zb = ja.formatMessageBody(tb.body);\n                r.appendContent(ub, xb(zb));\n            }\n        ;\n            if (tb.has_attachment) {\n                var ac = g.div(null), bc = this._appendMessageAttachments(ac, tb);\n                if (((vb && !tb.body) && !bc)) {\n                    return ac\n                };\n                r.appendContent(ub, p(ac.childNodes));\n            }\n        ;\n            if (tb.forward_count) {\n                r.appendContent(ub, pb(tb));\n            };\n            if (tb.is_spoof_warning) {\n                var cc = qa[\":fb:chat:conversation:message:undertext\"].build();\n                r.appendContent(cc.getNode(\"message\"), ub);\n                la.get(tb.author, function(fc) {\n                    fa.renderChatSpoofWarning(cc.getNode(\"status\"), tb.is_spoof_warning, fc);\n                });\n                return cc.getRoot();\n            }\n        ;\n            var dc = ea.renderStatusIndicator(tb.status, tb.error_data, ba(ca.resendMessage, ca, tb));\n            if (dc) {\n                var ec = qa[\":fb:chat:conversation:message:status\"].build();\n                r.appendContent(ec.getNode(\"message\"), ub);\n                r.appendContent(ec.getNode(\"status\"), dc);\n                return ec.getRoot();\n            }\n        ;\n            return ub;\n        },\n        _appendMessageAttachments: function(tb, ub) {\n            var vb = 0, wb = ub.attachments;\n            wb.sort(l.booleanLexicographicComparator([l.isPhotoAttachment,l.isShareAttachment,l.isFileAttachment,l.isErrorAttachment,]));\n            if ((ub.raw_attachments && (ub.raw_attachments.length > 0))) {\n                wb = k.convertRaw(ub.raw_attachments);\n            };\n            var xb = l.renderPhotoAttachments(wb.filter(l.isPhotoAttachment), ub, 176, 4);\n            if (xb) {\n                r.appendContent(tb, xb);\n            };\n            for (var yb = 0; (yb < wb.length); yb++) {\n                if (l.isPhotoAttachment(wb[yb])) {\n                    vb = 1;\n                    continue;\n                }\n            ;\n                var zb = l.renderAttachment(true, wb[yb], ub);\n                (zb.error && r.appendContent(tb, zb.error));\n                (zb.content && r.appendContent(tb, zb.content));\n                vb |= zb.bubblePreferred;\n            };\n            var ac = r.scry(tb, \"img\");\n            ac.forEach(function(bc) {\n                t.listen(bc, \"load\", ba(this._thumbLoaded, this, bc));\n            }.bind(this));\n            return !!vb;\n        },\n        _thumbLoaded: function(tb) {\n            var ub = (this.scrollContainer.scrollTop + this.scrollContainer.clientHeight);\n            if (((ub + tb.offsetHeight) >= this.scrollContainer.scrollHeight)) {\n                this.scrollToBottom();\n            };\n        }\n    });\n    ra.subscribe(\"messages-reordered\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            (ub[vb.threadID] && vb.rerender());\n        });\n    });\n    ra.subscribe(\"messages-updated\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            (ub[vb.threadID] && vb.update(ub[vb.threadID]));\n        });\n    });\n    ra.subscribe(\"messages-received\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            var wb = ub[vb.threadID];\n            if ((wb && wb.length)) {\n                vb._currentMessageCount += wb.length;\n            };\n            (wb && vb._appendNewMessages(wb));\n        });\n    });\n    i.subscribe(m.getArbiterType(\"chat_event\"), function(tb, ub) {\n        if (sb(ub.obj)) {\n            var vb = (((s.user == ub.obj.from)) ? ub.obj.to : ub.obj.from), wb = ga.getThreadIdForUser(vb), xb = qb.filter(function(ac) {\n                return (ac.threadID === wb);\n            });\n            if ((xb.length > 0)) {\n                var yb = xb[0], zb = ca.constructLogMessageObject(aa.CHAT_WEB, wb, z.VIDEO_CALL, ub.obj);\n                zb.author = (\"fbid:\" + ub.obj.from);\n                yb._appendNewMessages([zb,]);\n            }\n        ;\n        }\n    ;\n    });\n    function sb(tb) {\n        return (((tb.event_name === \"installing\") || (tb.event_name === \"install_canceled\")));\n    };\n    e.exports = rb;\n});\n__d(\"MercuryPeopleSuggestions\", [\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"OrderedFriendsList\",\"ShortProfiles\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"MercuryServerDispatcher\"), i = b(\"OrderedFriendsList\"), j = b(\"ShortProfiles\"), k = b(\"arrayContains\"), l = new g(), m = 6;\n    function n(s) {\n        return s.sort().join(\",\");\n    };\n    function o(s, t) {\n        if ((s.length < m)) {\n            var u = i.getList();\n            for (var v = 0; (v < u.length); v++) {\n                if (!((k(s, u[v]) || k(t, u[v])))) {\n                    s.push(u[v]);\n                    if ((s.length >= m)) {\n                        break;\n                    };\n                }\n            ;\n            };\n        }\n    ;\n        return s;\n    };\n    function p(s) {\n        h.trySend(\"/ajax/chat/people_suggest.php\", s);\n    };\n    function q(s, t, u) {\n        s = s.filter(function(w) {\n            return !k(t, w);\n        });\n        var v = o(s, t);\n        j.getMulti(v, function() {\n            u(v);\n        });\n    };\n    var r = {\n        getPeopleSuggestions: function(s, t) {\n            if (s) {\n                if (s.length) {\n                    var u = n(s), v = l.executeOrEnqueue(u, function(x) {\n                        q(x, s, t);\n                    }), w = l.getUnavailableResources(v);\n                    if (w.length) {\n                        p({\n                            query: u,\n                            size: m\n                        });\n                    };\n                    return v;\n                }\n                 else q([], [], t);\n            \n            };\n            return 0;\n        },\n        handleUpdate: function(s) {\n            if (s.query) {\n                var t = (s.suggestions || \"\"), u = (t.length ? t.split(\",\") : []);\n                l.setResource(s.query, u);\n            }\n        ;\n        }\n    };\n    h.registerEndpoints({\n        \"/ajax/chat/people_suggest.php\": {\n            mode: h.IMMEDIATE,\n            handler: r.handleUpdate\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatTabPeopleSuggestionView\", [\"ChatPeopleSuggestionList.react\",\"ChatQuietLinks\",\"CSS\",\"DOM\",\"Event\",\"MercuryPeopleSuggestions\",\"MercuryIDs\",\"React\",\"ShortProfiles\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPeopleSuggestionList.react\"), h = b(\"ChatQuietLinks\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"MercuryPeopleSuggestions\"), m = b(\"MercuryIDs\"), n = b(\"React\"), o = b(\"ShortProfiles\"), p = b(\"Style\"), q = b(\"copyProperties\");\n    function r(s, t, u) {\n        this.sheetController = s;\n        this.viewNode = t;\n        this.loadingIcon = u;\n        this.addFriendsSheet = s.getAddFriendsTabSheet();\n        this.mercuryTypeahead = (this.addFriendsSheet && this.addFriendsSheet._typeahead);\n        this.typeaheadInput = (this.mercuryTypeahead && this.mercuryTypeahead._input);\n        this.typeaheadView = (this.mercuryTypeahead && this.mercuryTypeahead.getTypeahead().getView());\n        var v = this.showSuggestions.bind(this);\n        if (this.typeaheadInput) {\n            k.listen(this.typeaheadInput, \"focus\", v);\n        };\n        if (this.typeaheadView) {\n            this.typeaheadView.subscribe(\"reset\", v);\n            this.typeaheadView.subscribe(\"render\", this.clearSuggestions.bind(this));\n        }\n    ;\n        this.tokenizer = (this.mercuryTypeahead && this.mercuryTypeahead.getTokenizer());\n        if (this.tokenizer) {\n            this.tokenizer.subscribe(\"removeToken\", v);\n        };\n        this.showSuggestions();\n    };\n    q(r.prototype, {\n        addSelectedParticipant: function(s) {\n            var t = o.getNow(s);\n            if ((t && this.tokenizer)) {\n                this.tokenizer.addToken(this.tokenizer.createToken({\n                    uid: s,\n                    text: t.name\n                }));\n                this.showSuggestions();\n            }\n        ;\n        },\n        showSuggestions: function() {\n            if (this.mercuryTypeahead) {\n                var s = this.mercuryTypeahead.getSelectedParticipantIDs();\n                s = s.map(m.getUserIDFromParticipantID);\n                j.empty(this.viewNode);\n                i.show(this.loadingIcon);\n                l.getPeopleSuggestions(s, function(t) {\n                    var u = g({\n                        uids: t,\n                        onClick: this.addSelectedParticipant.bind(this)\n                    });\n                    i.hide(this.loadingIcon);\n                    n.renderComponent(u, this.viewNode);\n                    h.removeAllHrefs(this.viewNode);\n                }.bind(this));\n            }\n        ;\n        },\n        clearSuggestions: function() {\n            j.empty(this.viewNode);\n            i.hide(this.loadingIcon);\n            p.set(this.viewNode, \"margin-top\", 0);\n        },\n        destroy: function() {\n            this.clearSuggestions();\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatAddFriendsTabSheetRawRenderer\", [\"ContextualTypeaheadView\",\"DOM\",\"Event\",\"MercuryTypeahead\",\"ChatTabTemplates\",\"tx\",\"MercuryDataSourceWrapper\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualTypeaheadView\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"MercuryTypeahead\"), k = b(\"ChatTabTemplates\"), l = b(\"tx\"), m = b(\"MercuryDataSourceWrapper\").source, n = {\n        render: function(o, p, q, r, s, t) {\n            var u = (t ? k[\":fb:mercury:chat:tab-sheet:add-friends-empty-tab\"].build() : k[\":fb:mercury:chat:tab-sheet:add-friends\"].build()), v = new j(m, g);\n            v.setExcludedParticipants(r.participants);\n            if (!t) {\n                v.setPlaceholder(\"Add friends to this chat\");\n            };\n            v.build();\n            h.replace(u.getNode(\"participantsTypeahead\"), v.getElement());\n            h.setContent(q, u.getRoot());\n            v.getTokenizer().adjustWidth();\n            v.focus();\n            if (!t) {\n                var w = function() {\n                    var x = v.getSelectedParticipantIDs();\n                    if (x.length) {\n                        s(x);\n                    };\n                    p.close(o);\n                };\n                i.listen(u.getNode(\"doneButton\"), \"click\", w);\n            }\n        ;\n            return v;\n        }\n    };\n    e.exports = n;\n});\n__d(\"MultiChatController\", [\"Arbiter\",\"AsyncSignal\",\"copyProperties\",\"Form\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncSignal\"), i = b(\"copyProperties\"), j = b(\"Form\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get();\n    function n() {\n    \n    };\n    i(n, {\n        subscribe: function(o, p) {\n            o.subscribe(\"confirm\", function() {\n                this.createGroupThreadFromChooserDialog(o, p);\n            }.bind(this));\n        },\n        createGroupThreadFromChooserDialog: function(o, p) {\n            var q = j.serialize(o.getRoot()), r = JSON.parse(q.profileChooserItems), s = [];\n            for (var t in r) {\n                if (r[t]) {\n                    s.push(t);\n                };\n            };\n            var u = n.createThreadForFBIDs(s);\n            l.subscribe(\"update-thread-ids\", function(v, w) {\n                for (var x in w) {\n                    if ((w[x] == u)) {\n                        new h(\"/ajax/groups/chat/log\", {\n                            group_id: p,\n                            message_id: x\n                        }).send();\n                    };\n                };\n            });\n            o.hide();\n        },\n        createThreadForTokens: function(o) {\n            if (!o.length) {\n                return\n            };\n            var p;\n            if ((o.length == 1)) {\n                p = (\"user:\" + o[0].split(\":\")[1]);\n            }\n             else p = (\"root:\" + k.generateNewClientMessageID(Date.now()));\n        ;\n            m.createNewLocalThread(p, o);\n            g.inform(\"chat/open-tab\", {\n                thread_id: p\n            });\n            return p;\n        },\n        createThreadForFBIDs: function(o) {\n            var p = [];\n            for (var q = 0; (q < o.length); q++) {\n                p.push((\"fbid:\" + o[q]));;\n            };\n            return n.createThreadForTokens(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatAddFriendsTabSheet\", [\"Arbiter\",\"ChatAddFriendsTabSheetRawRenderer\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MultiChatController\",\"Style\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatAddFriendsTabSheetRawRenderer\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercurySourceType\"), k = b(\"MercuryMessages\").get(), l = b(\"MultiChatController\"), m = b(\"Style\"), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\");\n    function p(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._sheetView = u;\n        this._typeahead = null;\n    };\n    o(p.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(s) {\n                var t = (s.is_canonical_user ? q : r);\n                this._typeahead = h.render(this, this._sheetView, this._rootElement, s, t.curry(s), n.isNewEmptyLocalThread(this._threadID));\n                this._typeahead.subscribe(\"resize\", function() {\n                    this._sheetView.inform(\"resize\");\n                }.bind(this));\n            }.bind(this));\n        },\n        getParticipants: function() {\n            if (!this._typeahead) {\n                return null\n            };\n            return this._typeahead.getSelectedParticipantIDs();\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"add_friends_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        getHeight: function() {\n            return m.get(this._rootElement, \"height\");\n        }\n    });\n    function q(s, t) {\n        var u = s.participants;\n        l.createThreadForTokens(u.concat(t));\n    };\n    function r(s, t) {\n        var u = s.thread_id;\n        if (n.isEmptyLocalThread(u)) {\n            n.addParticipantsToThreadLocally(u, t);\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n         else {\n            k.sendMessage(k.constructLogMessageObject(j.CHAT_WEB, u, i.SUBSCRIBE, {\n                added_participants: t\n            }));\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n    ;\n    };\n    e.exports = p;\n});\n__d(\"ChatNameConversationTabSheetRawRenderer\", [\"DOM\",\"Event\",\"Input\",\"Keys\",\"ChatTabTemplates\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"Input\"), j = b(\"Keys\"), k = b(\"ChatTabTemplates\"), l = b(\"fbt\"), m = {\n        render: function(n, o, p, q, r, s) {\n            var t = k[\":fb:mercury:chat:tab-sheet:name-conversation\"].build(), u = t.getNode(\"nameInput\"), v = t.getNode(\"doneButton\"), w = \"Done\", x = \"Hide\", y = q.name;\n            if (y) {\n                i.setValue(u, y);\n            }\n             else g.setContent(v, x);\n        ;\n            var z = function() {\n                var aa = i.getValue(u);\n                if (aa) {\n                    r(aa);\n                };\n                s();\n                o.close(n);\n            };\n            h.listen(u, \"input\", function() {\n                g.setContent(v, ((i.getValue(u).length === 0) ? x : w));\n            });\n            h.listen(v, \"click\", z);\n            h.listen(u, \"keyup\", function(aa) {\n                if ((aa.keyCode === j.RETURN)) {\n                    z();\n                    return false;\n                }\n            ;\n            });\n            g.setContent(p, t.getRoot());\n            (!n.isAutomatic() && u.focus());\n        }\n    };\n    e.exports = m;\n});\n__d(\"ChatNameConversationTabSheet\", [\"AsyncRequest\",\"ChatNameConversationTabSheetRawRenderer\",\"MercuryAPIArgsSource\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"ChatNameConversationTabSheetRawRenderer\"), i = b(\"MercuryAPIArgsSource\"), j = b(\"MercuryLogMessageType\"), k = b(\"MercurySourceType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = \"/ajax/chat/multichat/name_conversation/dismiss.php\";\n    function q(t, u, v) {\n        this._threadID = t;\n        this._rootElement = u;\n        this._sheetView = v;\n        this._isAutomatic = false;\n    };\n    o(q.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(t) {\n                h.render(this, this._sheetView, this._rootElement, t, r.curry(t), s.curry(t));\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"name_conversation_type\";\n        },\n        open: function(t) {\n            this._isAutomatic = t;\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        isAutomatic: function() {\n            return this._isAutomatic;\n        }\n    });\n    function r(t, u) {\n        var v = t.name;\n        if ((((u || v)) && ((u != v)))) {\n            l.sendMessage(l.constructLogMessageObject(k.CHAT_WEB, t.thread_id, j.THREAD_NAME, {\n                name: u\n            }), null, i.CHAT);\n        };\n    };\n    function s(t) {\n        if (!t.name_conversation_sheet_dismissed) {\n            t.name_conversation_sheet_dismissed = true;\n            m.getServerThreadID(t.thread_id, function(u) {\n                new g(p).setData({\n                    thread_id: u\n                }).send();\n            });\n        }\n    ;\n    };\n    e.exports = q;\n});\n__d(\"ChatNewMessagesTabSheet\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"Scroll down to see new messages.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getRoot(), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"new_messages_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatNoRecipientsTabSheet\", [\"DOM\",\"fbt\",\"MercuryParticipants\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"fbt\"), i = b(\"MercuryParticipants\"), j = b(\"ChatTabTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreads\").get(), m = b(\"copyProperties\");\n    function n(o, p, q) {\n        this._threadID = o;\n        this._rootElement = p;\n        this._sheetView = q;\n        k.subscribe(\"threads-updated\", this._handleThreadsUpdated.bind(this));\n    };\n    m(n.prototype, {\n        render: function() {\n            var o = j[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(o.getNode(\"text\"), \"Everyone has left the conversation.\");\n            g.setContent(this._rootElement, o.getRoot());\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"no_recipients_type\";\n        },\n        _handleThreadsUpdated: function() {\n            l.getThreadMeta(this._threadID, function(o) {\n                var p = i.user, q = o.participants.filter(function(r) {\n                    return (r != p);\n                });\n                if ((((q.length < 1) && !o.is_joinable) && !l.isNewEmptyLocalThread(this._threadID))) {\n                    this._sheetView.open(this);\n                }\n                 else this._sheetView.close(this);\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatOfflineTabSheet\", [\"ChatPrivacyActionController\",\"ChatVisibility\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"ChatVisibility\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\");\n    function r(s, t, u) {\n        this._rootElement = t;\n        this._sheetView = u;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(s);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        };\n    };\n    p(r.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"offline_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n            var s = o[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build(), t = (\"fbid:\" + this._canonicalUser);\n            m.get(t, function(u) {\n                var v = \"fbChatGoOnlineLink\", w = j.tx._(\"turn on chat\"), x = j.create(\"a\", {\n                    href: \"#\",\n                    className: v\n                }, w), y = j.tx._(\"To chat with {name} and other friends, {link}.\", {\n                    name: u.short_name,\n                    link: x\n                });\n                j.setContent(s.getNode(\"text\"), y);\n                i.addClass(s.getRoot(), \"-cx-PRIVATE-chatTabSheet__chatoffline\");\n                j.setContent(this._rootElement, s.getRoot());\n                k.listen(this._rootElement, \"click\", function(event) {\n                    if (i.hasClass(event.getTarget(), v)) {\n                        if (h.isOnline()) {\n                            this._logger.error(\"tab_sheet_already_online\");\n                        };\n                        this._privacyActionController.togglePrivacy();\n                        this._logger.log(\"tab_sheet_go_online\", {\n                            tab_id: this._canonicalUser\n                        });\n                        return false;\n                    }\n                ;\n                }.bind(this));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(s) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            };\n            switch (s) {\n              case g.OFFLINE:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.BLOCKED:\n                this._sheetView.close(this);\n                break;\n            };\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"offline_type\";\n        },\n        destroy: function() {\n            (this._privacyActionController && this._privacyActionController.destroy());\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatUploadWarningTabSheet\", [\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ChatTabTemplates\"), i = b(\"copyProperties\");\n    function j(k, l, m) {\n        this._threadID = k;\n        this._rootElement = l;\n        this._sheetView = m;\n    };\n    i(j.prototype, {\n        render: function() {\n            var k = h[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(k.getNode(\"text\"), g.tx._(\"Please wait until the upload is complete before you send your message.\"));\n            g.setContent(this._rootElement, k.getRoot());\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"upload_warning_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatThreadIsMutedTabSheet\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:message-mute-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"This conversation is muted. Chat tabs will not pop up for it and push notifications are off.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getNode(\"unmuteButton\"), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"chat-thread-is-muted\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatUserBlockedTabSheet\", [\"ChatPrivacyActionController\",\"CSS\",\"DOM\",\"Event\",\"GenderConst\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"GenderConst\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\");\n    function s(t, u, v) {\n        this._rootElement = u;\n        this._sheetView = v;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(t);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        };\n    };\n    p(s.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n            var t = o[\":fb:mercury:chat:tab-sheet:user-blocked\"].build(), u = (\"fbid:\" + this._canonicalUser);\n            m.get(u, function(v) {\n                var w = null;\n                switch (v.gender) {\n                  case k.FEMALE_SINGULAR:\n                \n                  case k.FEMALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send her a message. \", {\n                        name: v.short_name\n                    });\n                    break;\n                  case k.MALE_SINGULAR:\n                \n                  case k.MALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send him a message. \", {\n                        name: v.short_name\n                    });\n                    break;\n                  default:\n                    w = r._(\"You turned off chat for {name} but you can still send them a message. \", {\n                        name: v.short_name\n                    });\n                };\n                i.setContent(t.getNode(\"text\"), w);\n                var x = r._(\"Turn on chat for {name}?\", {\n                    name: v.short_name\n                });\n                i.setContent(t.getNode(\"actionLink\"), x);\n                h.addClass(t.getRoot(), \"-cx-PRIVATE-chatTabSheet__blocked\");\n                i.setContent(this._rootElement, t.getRoot());\n                j.listen(t.getNode(\"actionLink\"), \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(t) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            };\n            switch (t) {\n              case g.BLOCKED:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.OFFLINE:\n                this._sheetView.close(this);\n                break;\n            };\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"user_blocked_type\";\n        },\n        destroy: function() {\n            (this._privacyActionController && this._privacyActionController.destroy());\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatUserJoinStatusTabSheet\", [\"Class\",\"JoinStatusTabSheet\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JoinStatusTabSheet\"), i = b(\"ChatTabTemplates\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, h);\n    j(k.prototype, {\n        _getTemplate: function() {\n            return i[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"];\n        }\n    });\n    e.exports = k;\n});\n__d(\"ChatTabSheetController\", [\"ChatAddFriendsTabSheet\",\"ChatNameConversationTabSheet\",\"ChatNewMessagesTabSheet\",\"ChatNoRecipientsTabSheet\",\"ChatOfflineTabSheet\",\"ChatUploadWarningTabSheet\",\"ChatThreadIsMutedTabSheet\",\"ChatUserBlockedTabSheet\",\"ChatUserJoinStatusTabSheet\",\"copyProperties\",\"MercurySheetView\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatAddFriendsTabSheet\"), h = b(\"ChatNameConversationTabSheet\"), i = b(\"ChatNewMessagesTabSheet\"), j = b(\"ChatNoRecipientsTabSheet\"), k = b(\"ChatOfflineTabSheet\"), l = b(\"ChatUploadWarningTabSheet\"), m = b(\"ChatThreadIsMutedTabSheet\"), n = b(\"ChatUserBlockedTabSheet\"), o = b(\"ChatUserJoinStatusTabSheet\"), p = b(\"copyProperties\"), q = b(\"MercurySheetView\"), r = b(\"MercuryThreads\").get(), s = function(t, u, v) {\n        this._sheetView = new q(t, u, v);\n        this._addFriendsTabSheet = new g(t, u, this._sheetView);\n        this._nameConversationTabSheet = new h(t, u, this._sheetView);\n        this._userBlockedTabSheet = new n(t, u, this._sheetView);\n        this._offlineTabSheet = new k(t, u, this._sheetView);\n        this._newMessagesTabSheet = new i(t, u, this._sheetView);\n        this._uploadWarningTabSheet = new l(t, u, this._sheetView);\n        this._threadIsMutedTabSheet = new m(t, u, this._sheetView);\n        this._userJoinStatusTabSheet = new o(u, this._sheetView);\n        if (!r.getCanonicalUserInThread(t)) {\n            this._noRecipientsTabSheet = new j(t, u, this._sheetView);\n        };\n    };\n    p(s.prototype, {\n        openAddFriendsSheet: function() {\n            this._addFriendsTabSheet.open();\n        },\n        openUserJoinStatusSheet: function(t) {\n            this._userJoinStatusTabSheet.addToQueue(t);\n        },\n        getAddFriendsTabSheet: function() {\n            return this._addFriendsTabSheet;\n        },\n        getAddFriendsParticipants: function() {\n            var t = this._addFriendsTabSheet.getParticipants();\n            this._addFriendsTabSheet.close();\n            return t;\n        },\n        openNameConversationSheet: function(t) {\n            this._nameConversationTabSheet.open(t);\n        },\n        openNewMessagesSheet: function() {\n            this._newMessagesTabSheet.open();\n        },\n        openUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.open();\n        },\n        openThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.open();\n        },\n        closeAutomaticNameConversationSheet: function() {\n            if (this._nameConversationTabSheet.isAutomatic()) {\n                this._nameConversationTabSheet.close();\n            };\n        },\n        closeThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.close();\n        },\n        closeNewMessagesSheet: function() {\n            this._newMessagesTabSheet.close();\n        },\n        closeUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.close();\n        },\n        onClickNewMessagesSheet: function(t) {\n            this._newMessageClickSub = this._newMessagesTabSheet.subscribe(\"clicked\", t);\n        },\n        onClickThreadIsMutedSheet: function(t) {\n            this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", t);\n        },\n        onResize: function(t) {\n            this._sheetView.subscribe(\"resize\", t);\n        },\n        destroy: function() {\n            this._sheetView.destroy();\n            this._offlineTabSheet.destroy();\n            this._userBlockedTabSheet.destroy();\n            (this._newMessageClickSub && this._newMessageClickSub.unsubscribe());\n            (this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe());\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatTabView\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AsyncSignal\",\"AvailableListConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatContextualDialogController\",\"ChatAutoSendPhotoUploader\",\"ChatPrivacyActionController\",\"ChatQuietLinks\",\"ChatTabMessagesView\",\"ChatTabPeopleSuggestionView\",\"ChatTabSheetController\",\"ChatVisibility\",\"MercuryConstants\",\"CSS\",\"Dialog\",\"Dock\",\"DOM\",\"Input\",\"JSLogger\",\"Keys\",\"Locale\",\"MercuryActionStatus\",\"MercuryFileUploader\",\"MercuryLogMessageType\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercurySourceType\",\"MercuryStickers\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"MessagesEmoticonView\",\"NubController\",\"Parent\",\"PhotosUploadWaterfall\",\"PresencePrivacy\",\"PresenceStatus\",\"Run\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"TextAreaControl\",\"Tooltip\",\"TypingDetectorController\",\"URI\",\"UserAgent\",\"VideoCallCore\",\"WaterfallIDGenerator\",\"copyProperties\",\"cx\",\"setIntervalAcrossTransitions\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"AvailableListConstants\"), n = b(\"ChatBehavior\"), o = b(\"ChatConfig\"), p = b(\"ChatContextualDialogController\"), q = b(\"ChatAutoSendPhotoUploader\"), r = b(\"ChatPrivacyActionController\"), s = b(\"ChatQuietLinks\"), t = b(\"ChatTabMessagesView\"), u = b(\"ChatTabPeopleSuggestionView\"), v = b(\"ChatTabSheetController\"), w = b(\"ChatVisibility\"), x = b(\"MercuryConstants\"), y = b(\"CSS\"), z = b(\"Dialog\"), aa = b(\"Dock\"), ba = b(\"DOM\"), ca = b(\"Input\"), da = b(\"JSLogger\"), ea = b(\"Keys\"), fa = b(\"Locale\"), ga = b(\"MercuryActionStatus\"), ha = b(\"MercuryFileUploader\"), ia = b(\"MercuryLogMessageType\"), ja = b(\"MercuryMessages\").get(), ka = b(\"MercuryParticipants\"), la = b(\"MercuryServerRequests\").get(), ma = b(\"MercurySourceType\"), na = b(\"MercuryStickers\"), oa = b(\"MercuryThreadInformer\").get(), pa = b(\"MercuryThreadMetadataRawRenderer\"), qa = b(\"MercuryThreadMetadataRenderer\").get(), ra = b(\"MercuryThreadMuter\"), sa = b(\"MercuryThreads\").get(), ta = b(\"MercuryTypingReceiver\"), ua = b(\"MessagesEmoticonView\"), va = b(\"NubController\"), wa = b(\"Parent\"), xa = b(\"PhotosUploadWaterfall\"), ya = b(\"PresencePrivacy\"), za = b(\"PresenceStatus\"), ab = b(\"Run\"), bb = b(\"Style\"), cb = b(\"SubscriptionsHandler\"), db = b(\"ChatTabTemplates\"), eb = b(\"TextAreaControl\"), fb = b(\"Tooltip\"), gb = b(\"TypingDetectorController\"), hb = b(\"URI\"), ib = b(\"UserAgent\"), jb = b(\"VideoCallCore\"), kb = b(\"WaterfallIDGenerator\"), lb = b(\"copyProperties\"), mb = b(\"cx\"), nb = b(\"setIntervalAcrossTransitions\"), ob = b(\"tx\"), pb = /^\\s*$/, qb = da.create(\"tab_view\"), rb = {\n    }, sb = null, tb, ub;\n    function vb(qc, rc) {\n        var sc = ba.create(\"div\");\n        rc = rc.filter(function(tc) {\n            return (tc != ka.user);\n        });\n        if (!rc.length) {\n            return fb.remove(qc)\n        };\n        ka.getMulti(rc, function(tc) {\n            for (var uc in tc) {\n                var vc = tc[uc], wc = db[\":fb:mercury:chat:multichat-tooltip-item\"].build();\n                ba.setContent(wc.getNode(\"name\"), vc.name);\n                var xc = ka.getUserID(uc), yc = (xc && (za.get(xc) == m.ACTIVE));\n                y.conditionShow(wc.getNode(\"icon\"), yc);\n                y.conditionClass(wc.getNode(\"name\"), \"tooltipItemWithIcon\", yc);\n                ba.appendContent(sc, wc.getRoot());\n            };\n            fb.set(qc, sc, \"above\");\n        });\n    };\n    var wb = {\n    }, xb = null, yb = false;\n    function zb(qc, rc, sc) {\n        if (sc) {\n            wb[qc] = rc;\n            if (!xb) {\n                xb = nb(ac, 600);\n            };\n        }\n         else {\n            y.removeClass(rc, \"highlightTitle\");\n            delete wb[qc];\n        }\n    ;\n    };\n    function ac() {\n        for (var qc in wb) {\n            var rc = wb[qc];\n            if (rc.parentNode) {\n                y.conditionClass(rc, \"highlightTitle\", yb);\n            }\n             else delete wb[qc];\n        ;\n        };\n        yb = !yb;\n        if (!Object.keys(wb).length) {\n            clearInterval(xb);\n            xb = null;\n        }\n    ;\n    };\n    function bc(qc) {\n        var rc = la.tokenizeThreadID(qc);\n        switch (rc.type) {\n          case \"user\":\n            return db[\":fb:mercury:chat:user-tab\"].build();\n        };\n        return db[\":fb:mercury:chat:multichat-tab\"].build();\n    };\n    function cc(qc) {\n        var rc = (qc._tabTemplate.getNode(\"input\").value || \"\"), sc = qc._fileUploader.getAttachments();\n        if (ic(qc)) {\n            ec(qc, rc, sc, function(tc) {\n                var uc = qc._fileUploader.getImageIDs();\n                if ((uc.length > 0)) {\n                    tc.photo_fbids = uc;\n                    tc.has_attachment = true;\n                }\n            ;\n                ja.sendMessage(tc);\n                qc._fileUploader.removeAttachments();\n                qc._getNode(\"input\").value = \"\";\n                (qc._lastMessageIndicator && qc._lastMessageIndicator.resetState());\n                (qc._messagesView && qc._messagesView.scrollToBottom());\n            });\n        };\n    };\n    function dc(qc, rc) {\n        if ((rc === 0)) {\n            return\n        };\n        mc(qc, xa.POST_PUBLISHED, {\n            count: rc\n        });\n        qc._waterfallID = kb.generate();\n    };\n    function ec(qc, rc, sc, tc) {\n        sa.getThreadMeta(qc._threadID, function(uc) {\n            var vc = ja.constructUserGeneratedMessageObject(rc, ma.CHAT_WEB, qc._threadID);\n            if ((sc.length > 0)) {\n                vc.has_attachment = true;\n                vc.raw_attachments = sc;\n            }\n        ;\n            if (sa.isNewEmptyLocalThread(qc._threadID)) {\n                var wc = qc._sheetController.getAddFriendsParticipants();\n                if (((wc === null) || (wc.length === 0))) {\n                    return;\n                }\n                 else if ((wc.length === 1)) {\n                    var xc = (\"user:\" + ka.getUserID(wc[0]));\n                    vc.thread_id = xc;\n                }\n                 else sa.addParticipantsToThreadLocally(qc._threadID, wc);\n                \n            ;\n            }\n        ;\n            if (sa.isEmptyLocalThread(qc._threadID)) {\n                var yc = la.tokenizeThreadID(qc._threadID);\n                vc.message_id = yc.value;\n                vc.specific_to_list = uc.participants;\n            }\n        ;\n            if ((typeof vc != \"undefined\")) {\n                vc.signatureID = qc._signatureID;\n            };\n            vc.ui_push_phase = x.UIPushPhase;\n            tc(vc);\n            if ((qc._threadID !== vc.thread_id)) {\n                nc.inform(\"closed-tab\", qc._threadID);\n                h.inform(\"chat/open-tab\", {\n                    thread_id: vc.thread_id\n                });\n            }\n        ;\n        });\n    };\n    function fc(qc) {\n        qc._blocked = true;\n        qc._sheetController.openUploadWarningTabSheet();\n    };\n    function gc(qc) {\n        return ((qc._fileUploader.isUploading() || qc._photoUploader.isUploading()));\n    };\n    function hc(qc) {\n        return qc._fileUploader.isUploading();\n    };\n    function ic(qc) {\n        var rc = (qc._tabTemplate.getNode(\"input\").value || \"\");\n        if (!pb.test(rc)) {\n            return true\n        };\n        if (((qc._fileUploader.getAttachments().length > 0) || (qc._fileUploader.getImageIDs().length > 0))) {\n            return true\n        };\n        return false;\n    };\n    function jc(qc) {\n        if (qc._blocked) {\n            if (hc(qc)) {\n                return\n            };\n            qc._blocked = false;\n            cc(qc);\n            qc._sheetController.closeUploadWarningTabSheet();\n        }\n    ;\n    };\n    function kc(qc) {\n        qc._nubController.flyoutContentChanged();\n        qc._attachmentsDiv.scrollTop = qc._attachmentsDiv.scrollHeight;\n    };\n    function lc(qc, rc, sc) {\n        qc._subscriptionsHandler.addSubscriptions(qc._photoUploader.subscribe(rc, function(tc, uc) {\n            mc(qc, sc, uc);\n        }));\n    };\n    function mc(qc, rc, sc) {\n        xa.sendSignal(lb({\n            qn: qc._waterfallID,\n            step: rc,\n            uploader: xa.APP_CHAT\n        }, (sc || {\n        })));\n    };\n    function nc(qc, rc, sc) {\n        if (rc) {\n            la.ensureThreadIsFetched(rc);\n        };\n        this._threadID = qc;\n        this._signatureID = sc;\n        this._eventListeners = [];\n        this._tabTemplate = bc(qc);\n        this._tabElem = this._tabTemplate.getRoot();\n        this._waterfallID = kb.generate();\n        if (!((this._getNode instanceof Function))) {\n            qb.log(\"getnode_undefined\", {\n                is_getnode_set: !!this._getNode,\n                is_prototype_set: !!nc.prototype,\n                is_window: (window == this),\n                is_chat_tab_view: (this instanceof nc),\n                ctor_name: (this.constructor && this.constructor.name)\n            });\n        };\n        this._subscriptionsHandler = new cb();\n        this._fileUploader = new ha(this._tabTemplate.getNode(\"attachmentShelf\"), this._tabTemplate.getNode(\"attachButtonForm\"), this._tabTemplate.getNode(\"fileInput\"), this._tabTemplate.getNode(\"attachID\"));\n        this._initializeUploader(this._fileUploader);\n        this._initializeAutoSendPhotoUploader();\n        this._attachmentsDiv = this._getNode(\"attachmentShelf\");\n        this._sheetController = new v(this._threadID, this._getNode(\"sheet\"), this._tabElem);\n        this._sheetController.onClickNewMessagesSheet(function() {\n            (this._messagesView && this._messagesView.scrollToBottom());\n            this.focus();\n            nc.inform(\"read\", this._threadID);\n        }.bind(this));\n        this._sheetController.onClickThreadIsMutedSheet(function() {\n            ra.showMuteChangeDialog(0, this._threadID);\n            this.focus();\n        }.bind(this));\n        this._nubController = new va().init(this._tabElem);\n        this._sheetController.onResize(this._nubController.flyoutContentChanged.bind(this._nubController));\n        this._contextualDialogController = new p(this._threadID, this._getNode(\"videoCallLink\"));\n        if ((sb === null)) {\n            sb = !o.get(\"seen_autosend_photo_nux\");\n        };\n        if ((tb === undefined)) {\n            tb = o.get(\"show_sticker_nux\");\n        };\n        this._messagesView = null;\n        var tc = this._getNode(\"conversationLink\");\n        if (tc) {\n            y.hide(tc);\n            qa.renderTitanLink(qc, tc, y.show.bind(y, tc));\n        }\n    ;\n        if (!sa.getCanonicalUserInThread(this._threadID)) {\n            this._titlebarTooltipAnchor = this._getNode(\"titlebarText\");\n        };\n        var uc = this._getCanonicalUserID();\n        if (this._isTitleTextLinked()) {\n            ka.get((\"fbid:\" + uc), function(fd) {\n                if (fd.href) {\n                    var gd = this._getNode(\"titlebarText\");\n                    gd.setAttribute(\"href\", fd.href);\n                    gd.removeAttribute(\"rel\");\n                    y.removeClass(gd, \"noLink\");\n                }\n            ;\n            }.bind(this));\n        };\n        var vc = this._getNode(\"inputContainer\").clientHeight;\n        eb.getInstance(this._getNode(\"input\")).subscribe(\"resize\", function() {\n            var fd = this._getNode(\"inputContainer\").clientHeight;\n            if ((fd != vc)) {\n                this._nubController.flyoutContentChanged();\n            };\n            vc = fd;\n        }.bind(this));\n        var wc = null, xc = this._getNode(\"inputContainer\");\n        this._nubController.subscribe(\"resize\", function() {\n            if (!wc) {\n                wc = this._tabElem.clientWidth;\n            };\n            var fd = 2, gd = (wc - ((xc.clientWidth + fd))), hd = (fa.isRTL() ? \"left\" : \"right\");\n            bb.set(this._iconsContainerNode, hd, (gd + \"px\"));\n            eb.getInstance(this._getNode(\"input\")).update();\n        }.bind(this));\n        var yc = o.get(\"chat_tab_height\");\n        if (yc) {\n            var zc = this._tabTemplate.getNode(\"chatWrapper\");\n            bb.set(zc, \"height\", (yc + \"px\"));\n        }\n    ;\n        this._listen(\"closeButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"mousedown\", this._closePreClicked);\n        this._listen(\"dockButton\", \"click\", this._nubClicked);\n        this._listen(\"dockButton\", \"keydown\", this._dockKeyDown);\n        this._listen(\"nubFlyoutTitlebar\", \"click\", this._titleClicked);\n        this._listen(\"chatConv\", \"click\", this._chatConvClicked);\n        this._listen(\"inputContainer\", \"click\", this._inputContainerClicked);\n        this._listen(\"addFriendLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"addToThreadLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"nameConversationLink\", \"click\", this._nameConversationLinkClicked, true);\n        this._listen(\"clearWindowLink\", \"click\", this._clearHistory, true);\n        this._listen(\"unsubscribeLink\", \"click\", this._unsubscribeLinkClicked, true);\n        this._listen(\"videoCallLink\", \"click\", this._callClicked, true);\n        this._listen(\"reportSpamLink\", \"click\", this._reportSpamClicked, true);\n        this._listen(\"muteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, -1), true);\n        this._listen(\"unmuteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, 0), true);\n        this._listen(\"input\", \"focus\", this._focusTab);\n        this._listen(\"input\", \"blur\", this._blurTab);\n        this._listen(\"sheet\", \"keydown\", function(event) {\n            if ((!event.getModifiers().any && (event.keyCode === ea.TAB))) {\n                this._getNode(\"input\").focus();\n                event.kill();\n            }\n        ;\n        }.bind(this));\n        this._iconsContainerNode = this._getNode(\"iconsContainer\");\n        var ad = this._getNode(\"emoticons\");\n        this._emoticonView = null;\n        if (ad) {\n            this._emoticonView = new ua(ad, this._getNode(\"input\"));\n        };\n        var bd = this._getNode(\"stickers\");\n        if (bd) {\n            this._stickerController = new na(bd);\n            this._subscriptionsHandler.addSubscriptions(this._stickerController.subscribe(\"stickerselected\", function(fd, gd) {\n                this._stickerSelected(gd.id);\n            }.bind(this)));\n        }\n    ;\n        if (ib.firefox()) {\n            this._listen(\"input\", \"keypress\", this._inputKeyDown);\n        }\n         else this._listen(\"input\", \"keydown\", this._inputKeyDown);\n    ;\n        this._privacyLink = this._getNode(\"privacyLink\");\n        if (this._privacyLink) {\n            this._privacyActionController = new r(uc, this._updatePrivacyLink.bind(this));\n            this._eventListeners.push(g.listen(this._privacyLink, \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController)));\n        }\n    ;\n        sa.getThreadMeta(this._threadID, function(fd) {\n            var gd = (uc || ((o.get(\"chat_multi_typ_send\") && !fd.is_canonical)));\n            if (gd) {\n                la.getServerThreadID(this._threadID, function(hd) {\n                    this._lastMessageIndicator = new gb(uc, this._getNode(\"input\"), \"mercury-chat\", null, hd);\n                }.bind(this));\n            };\n            this._setUpMutingSettings(fd);\n        }.bind(this));\n        var cd = this._getNode(\"muteGroupLink\");\n        if (cd) {\n            var dd = sa.getCanonicalGroupInThread(this._threadID);\n            if (dd) {\n                cd.setAttribute(\"ajaxify\", hb(cd.getAttribute(\"ajaxify\")).addQueryData({\n                    id: dd\n                }));\n            };\n        }\n    ;\n        s.removeEmptyHrefs(this._tabElem);\n        rb[qc] = this;\n        this.updateAvailableStatus();\n        this.updateTab();\n        this._setCloseTooltip(false);\n        var ed = {\n            threadID: qc,\n            userID: uc,\n            signatureID: this._signatureID\n        };\n        new l(\"/ajax/chat/opentab_tracking.php\", ed).send();\n        ab.onBeforeUnload(function() {\n            if ((ic(this) || gc(this))) {\n                return \"You haven't sent your message yet. Do you want to leave without sending?\"\n            };\n            if (ja.getNumberLocalMessages(this._threadID)) {\n                return \"Your message is still being sent. Are you sure you want to leave?\"\n            };\n            return null;\n        }.bind(this), false);\n        ab.onUnload(function() {\n            oc(this);\n        }.bind(this));\n    };\n    function oc(qc) {\n        if (qc._photoUploader.isUploading()) {\n            mc(qc, xa.CANCEL_DURING_UPLOAD);\n        };\n    };\n    function pc() {\n        for (var qc in rb) {\n            rb[qc].updateAvailableStatus();\n            rb[qc].updateMultichatTooltip();\n        };\n    };\n    h.subscribe([\"buddylist/availability-changed\",], pc);\n    ya.subscribe([\"privacy-changed\",\"privacy-availability-changed\",], pc);\n    n.subscribe(n.ON_CHANGED, function() {\n        for (var qc in rb) {\n            sa.getThreadMeta(qc, function(rc) {\n                rb[qc]._updateUnreadCount(rc);\n            });;\n        };\n    });\n    ta.subscribe(\"state-changed\", function(qc, rc) {\n        for (var sc in rc) {\n            var tc = (rc[sc] && rc[sc].length), uc = rb[sc];\n            (uc && uc.showTypingIndicator(tc));\n        };\n    });\n    oa.subscribe(\"threads-updated\", function(qc, rc) {\n        for (var sc in rb) {\n            (rc[sc] && rb[sc].updateTab());;\n        };\n    });\n    oa.subscribe(\"threads-deleted\", function(qc, rc) {\n        for (var sc in rb) {\n            (rc[sc] && nc.inform(\"thread-deleted\", sc));;\n        };\n    });\n    lb(nc, i, {\n        get: function(qc) {\n            return rb[qc];\n        }\n    });\n    lb(nc.prototype, {\n        getThreadID: function() {\n            return this._threadID;\n        },\n        showAddFriend: function() {\n            (function() {\n                this._sheetController.openAddFriendsSheet();\n            }).bind(this).defer();\n        },\n        showPeopleSuggestions: function() {\n            (function() {\n                this._peopleSuggestions = new u(this._sheetController, this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"));\n            }).bind(this).defer();\n        },\n        showNameConversation: function(qc) {\n            (function() {\n                this._sheetController.openNameConversationSheet(qc);\n            }).bind(this).defer();\n        },\n        hideAutomaticNameConversation: function() {\n            (function() {\n                this._sheetController.closeAutomaticNameConversationSheet();\n            }).bind(this).defer();\n        },\n        isVisible: function() {\n            return y.shown(this._tabElem);\n        },\n        setVisibleState: function(qc, rc) {\n            var sc = y.shown(this._tabElem), tc = y.hasClass(this._tabElem, \"opened\");\n            y.conditionShow(this._tabElem, qc);\n            y.conditionClass(this._tabElem, \"opened\", rc);\n            if (((!((sc && tc)) && qc) && rc)) {\n                if (!this._messagesView) {\n                    this._messagesView = new t(this._threadID, this._sheetController, this._getNode(\"chatConv\"), this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"), this._getNode(\"lastMessageIndicator\"), this._getNode(\"typingIndicator\"));\n                };\n                this._nubController.flyoutContentChanged();\n                this._messagesView.scrollToBottom();\n            }\n        ;\n            if (((sc && tc) && !((qc && rc)))) {\n                this._contextualDialogController.tabNotActive();\n            };\n        },\n        focus: function() {\n            var qc = (y.hasClass(this._tabElem, \"opened\") ? \"input\" : \"dockButton\");\n            this._getNode(qc).focus();\n        },\n        isFocused: function() {\n            var qc = document.activeElement;\n            return (wa.byClass(qc, \"-cx-PRIVATE-fbMercuryChatTab__root\") === this._tabElem);\n        },\n        hasEmptyInput: function() {\n            return pb.test(this._getNode(\"input\").value);\n        },\n        getInputElem: function() {\n            return this._getNode(\"input\");\n        },\n        setInput: function(qc) {\n            this._getNode(\"input\").value = qc;\n        },\n        insertBefore: function(qc) {\n            ba.insertBefore(qc._tabElem, this._tabElem);\n        },\n        appendTo: function(qc) {\n            ba.appendContent(qc, this._tabElem);\n        },\n        nextTabIs: function(qc) {\n            var rc = (qc && qc._tabElem);\n            return (this._tabElem.nextSibling == rc);\n        },\n        getScrollTop: function() {\n            return ba.find(this._tabElem, \".scrollable\").scrollTop;\n        },\n        setScrollTop: function(qc) {\n            ba.find(this._tabElem, \".scrollable\").scrollTop = qc;\n        },\n        destroy: function() {\n            ba.remove(this._tabElem);\n            (this._emoticonView && this._emoticonView.destroy());\n            (this._stickerController && this._stickerController.destroy());\n            while (this._eventListeners.length) {\n                this._eventListeners.pop().remove();;\n            };\n            (this._messagesView && this._messagesView.destroy());\n            this._sheetController.destroy();\n            this._fileUploader.destroy();\n            this._photoUploader.destroy();\n            this._subscriptionsHandler.release();\n            this._contextualDialogController.destroy();\n            (this._privacyActionController && this._privacyActionController.destroy());\n            delete rb[this._threadID];\n            aa.unregisterNubController(this._nubController);\n            ca.reset(this._getNode(\"input\"));\n        },\n        updateAvailableStatus: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                var rc = m.OFFLINE, sc = this._getCanonicalUserID();\n                if (sc) {\n                    rc = za.get(sc);\n                }\n                 else {\n                    var tc = qc.participants.map(function(vc) {\n                        return ka.getUserID(vc);\n                    });\n                    rc = za.getGroup(tc);\n                }\n            ;\n                if (!w.isOnline()) {\n                    rc = m.OFFLINE;\n                };\n                if (sc) {\n                    this._updateCallLink(rc);\n                };\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__active\", (rc === m.ACTIVE));\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__mobile\", (rc === m.MOBILE));\n                var uc = this._getNode(\"presenceIndicator\");\n                switch (rc) {\n                  case m.ACTIVE:\n                    uc.setAttribute(\"alt\", \"Online\");\n                    break;\n                  case m.MOBILE:\n                    uc.setAttribute(\"alt\", \"Mobile\");\n                    break;\n                  default:\n                    uc.removeAttribute(\"alt\");\n                    break;\n                };\n            }.bind(this));\n        },\n        updateTab: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_subscribed) {\n                    nc.inform(\"unsubscribed\", this._threadID);\n                    return;\n                }\n            ;\n                qa.renderAndSeparatedParticipantList(this._threadID, [this._getNode(\"name\"),this._getNode(\"titlebarText\"),], {\n                    names_renderer: pa.renderShortNames,\n                    check_length: true\n                });\n                if ((qc.is_joinable && !o.get(\"joinable_conversation_is_modal\"))) {\n                    this._updateJoinableAddFriendSheet(qc);\n                };\n                this._updateMutingSettings(qc);\n                this._updateUnreadCount(qc);\n                this.updateMultichatTooltip();\n                this._updateArchiveWarning(qc);\n                this._updateNewThread(qc);\n                this._updateNameConversationSheet(qc);\n            }.bind(this));\n        },\n        _updateNameConversationSheet: function(qc) {\n            if ((((!qc.name && !qc.is_canonical) && !qc.name_conversation_sheet_dismissed) && !sa.isEmptyLocalThread(qc.thread_id))) {\n                this.showNameConversation(true);\n            }\n             else this.hideAutomaticNameConversation();\n        ;\n        },\n        _updateJoinableAddFriendSheet: function(qc) {\n            var rc = ka.user, sc = qc.participants.filter(function(tc) {\n                return (tc != rc);\n            });\n            if ((qc.is_joinable && (sc.length < 1))) {\n                this.showAddFriend();\n            };\n        },\n        updateSignatureID: function(qc) {\n            this._signatureID = qc;\n        },\n        _showPhotoNUXIfNecessary: function() {\n            if (sb) {\n                sb = false;\n                new k(\"/ajax/chat/photo_nux.php\").setRelativeTo(this._getNode(\"photoAttachLink\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        },\n        _showStickerNUXIfNecessary: function() {\n            if (tb) {\n                tb = false;\n                new k(\"/ajax/messaging/stickers/nux\").setRelativeTo(this._getNode(\"emoticons\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        },\n        _setUpMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if (rc) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            };\n            this._updateActionMenu(rc);\n        },\n        _updateMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if ((rc && y.shown(this._getNode(\"muteThreadLink\").parentNode))) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n             else if ((!rc && y.shown(this._getNode(\"unmuteThreadLink\").parentNode))) {\n                this._sheetController.closeThreadIsMutedTabSheet();\n            }\n        ;\n            this._updateActionMenu(rc);\n        },\n        _updateActionMenu: function(qc) {\n            y.conditionShow(this._getNode(\"muteThreadLink\").parentNode, !qc);\n            y.conditionShow(this._getNode(\"unmuteThreadLink\").parentNode, qc);\n        },\n        _updateArchiveWarning: function(qc) {\n            var rc = false;\n            ka.get(ka.user, function(sc) {\n                rc = sc.employee;\n                if (rc) {\n                    ka.getMulti(qc.participants, this._showArchiveWarningIfAllParticipantsAreEmployees.bind(this));\n                };\n            }.bind(this));\n        },\n        _updateNewThread: function(qc) {\n            var rc = sa.isNewEmptyLocalThread(qc.thread_id);\n            y.conditionShow(this._getNode(\"dropdown\"), !rc);\n            if (rc) {\n                this.showAddFriend();\n                if (o.get(\"www_chat_compose_suggestions\", 0)) {\n                    this.showPeopleSuggestions();\n                };\n            }\n             else if (this._peopleSuggestions) {\n                this._peopleSuggestions.destroy();\n                this._peopleSuggestions = null;\n            }\n            \n        ;\n        },\n        _showArchiveWarningIfAllParticipantsAreEmployees: function(qc) {\n            var rc = true;\n            for (var sc in qc) {\n                rc = (rc && qc[sc].employee);;\n            };\n            var tc = this._getNode(\"titanArchiveWarning\");\n            if (tc) {\n                if (this._titlebarTooltipAnchor) {\n                    y.conditionClass(this._titlebarTooltipAnchor, \"narrowTitleBar\", rc);\n                };\n                y.conditionShow(tc, rc);\n            }\n        ;\n        },\n        updateMultichatTooltip: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_canonical) {\n                    vb(this._titlebarTooltipAnchor, qc.participants);\n                };\n            }.bind(this));\n        },\n        _getNode: function(qc) {\n            return this._tabTemplate.getNode(qc);\n        },\n        _getCanonicalUserID: function() {\n            return sa.getCanonicalUserInThread(this._threadID);\n        },\n        _listen: function(qc, event, rc, sc) {\n            var tc = this._getNode(qc);\n            if (tc) {\n                this._eventListeners.push(g.listen(tc, event, rc.bind(this)));\n            }\n             else if (!sc) {\n                throw new Error(((\"Could not find node \\\"\" + qc) + \"\\\"\"))\n            }\n        ;\n        },\n        _closePreClicked: function(qc) {\n            this._closeMouseDown = true;\n        },\n        _closeClicked: function(qc) {\n            oc(this);\n            nc.inform(\"closed-tab\", this._threadID);\n            qc.kill();\n        },\n        _nubClicked: function(qc) {\n            qc.kill();\n            return nc.inform(\"nub-activated\", this._threadID);\n        },\n        _dockKeyDown: function(event) {\n            if (((event.keyCode === ea.RETURN) || (event.keyCode === ea.SPACE))) {\n                nc.inform(\"nub-activated\", this._threadID);\n                event.kill();\n            }\n             else this._handleHotkeyPressed(event);\n        ;\n        },\n        _handleHotkeyPressed: function(event) {\n            if ((event.keyCode === ea.ESC)) {\n                oc(this);\n                nc.inform(\"esc-pressed\", this._threadID);\n                event.kill();\n            }\n             else if (((event.keyCode === ea.TAB) && !event.ctrlKey)) {\n                var qc = nc.inform(\"tab-pressed\", {\n                    id: this._threadID,\n                    shiftPressed: event.shiftKey\n                });\n                (!qc && event.kill());\n            }\n            \n        ;\n        },\n        _isTitleTextLinked: function() {\n            var qc = this._getCanonicalUserID();\n            return (qc && o.get(\"chat_tab_title_link_timeline\"));\n        },\n        _titleClicked: function(event) {\n            var qc = event.getTarget(), rc = wa.byClass(qc, \"titlebarText\"), sc = (rc && this._isTitleTextLinked());\n            if (((!sc && !wa.byClass(qc, \"uiSelector\")) && !wa.byClass(qc, \"addToThread\"))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                event.kill();\n            }\n        ;\n        },\n        _callClicked: function(qc) {\n            var rc = this._getCanonicalUserID();\n            if (jb.availableForCall(rc)) {\n                var sc = \"chat_tab_icon\";\n                if ((qc.target && y.hasClass(qc.target, \"video_call_promo\"))) {\n                    sc = \"chat_tab_icon_promo\";\n                }\n                 else if ((qc.target && y.hasClass(qc.target, \"video_call_tour\"))) {\n                    sc = \"chat_tab_icon_tour\";\n                }\n            ;\n                nc.inform(\"video-call-clicked\", {\n                    threadID: this._threadID,\n                    userID: rc,\n                    clickSource: sc\n                });\n            }\n        ;\n            return false;\n        },\n        _addFriendLinkClicked: function() {\n            this.showAddFriend();\n        },\n        _nameConversationLinkClicked: function() {\n            this.showNameConversation();\n        },\n        _clearHistory: function() {\n            var qc = sa.getThreadMetaNow(this._threadID);\n            if (qc) {\n                var rc = this._getCanonicalUserID();\n                la.clearChat(this._threadID, rc, qc.timestamp);\n            }\n        ;\n        },\n        _unsubscribeLinkClicked: function() {\n            var qc = [];\n            qc.push({\n                name: \"unsubscribe\",\n                label: \"Leave Conversation\",\n                handler: this._unsubscribeToThread.bind(this)\n            });\n            qc.push(z.CANCEL);\n            new z().setTitle(\"Leave Conversation?\").setBody(\"You will stop receiving messages from this conversation and people will see that you left.\").setButtons(qc).show();\n        },\n        _reportSpamClicked: function() {\n            var qc = this._getCanonicalUserID(), rc = hb(\"/ajax/chat/report.php\").addQueryData({\n                id: qc\n            }).addQueryData({\n                src: \"top_report_link\"\n            });\n            j.send(new k(rc));\n        },\n        _showMuteSettingDialog: function(qc) {\n            ra.showMuteChangeDialog(qc, this._threadID);\n        },\n        _focusTab: function() {\n            y.addClass(this._tabElem, \"focusedTab\");\n            if (this._peopleSuggestions) {\n                this._peopleSuggestions.clearSuggestions();\n            };\n            this.tryMarkAsRead();\n            this._contextualDialogController.tabFocused();\n            if ((!ub && ((this._showPhotoNUXIfNecessary() || this._showStickerNUXIfNecessary())))) {\n                h.subscribe([\"ChatNUX/show\",\"ChatNUX/hide\",], function(event) {\n                    ub = (event === \"ChatNUX/show\");\n                });\n            };\n            this._closeMouseDown = false;\n            this._setCloseTooltip(true);\n        },\n        _blurTab: function() {\n            y.removeClass(this._tabElem, \"focusedTab\");\n            (!this._closeMouseDown && this._setCloseTooltip(false));\n        },\n        _setCloseTooltip: function(qc) {\n            var rc = this._getNode(\"titlebarCloseButton\"), sc = (qc ? \"Press Esc to close\" : \"Close tab\");\n            fb.set(rc, sc, \"above\");\n        },\n        _inputKeyDown: function(event) {\n            if (((event.keyCode === ea.RETURN) && !event.shiftKey)) {\n                if (hc(this)) {\n                    fc(this);\n                    event.kill();\n                    return;\n                }\n            ;\n                cc(this);\n                event.kill();\n                return;\n            }\n        ;\n            if ((((event.keyCode === ea.DOWN) && event.shiftKey) && (this._getNode(\"input\").value === \"\"))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                event.kill();\n                return;\n            }\n        ;\n            this._handleHotkeyPressed(event);\n        },\n        tryMarkAsRead: function() {\n            if ((!this._messagesView || this._messagesView.isScrolledToBottom())) {\n                nc.inform(\"read\", this._threadID);\n                return true;\n            }\n        ;\n            return false;\n        },\n        _chatConvClicked: function(qc) {\n            this.tryMarkAsRead();\n            if ((wa.byTag(qc.getTarget(), \"a\") || ba.getSelection())) {\n                return\n            };\n            this.focus();\n        },\n        _inputContainerClicked: function(qc) {\n            this.tryMarkAsRead();\n            this.focus();\n        },\n        showTypingIndicator: function(qc) {\n            var rc = sa.getThreadMetaNow(this._threadID), sc = (this._getCanonicalUserID() || (((o.get(\"chat_multi_typ\") && rc) && !rc.is_canonical)));\n            if (sc) {\n                y.conditionClass(this._tabElem, \"typing\", qc);\n            };\n        },\n        _updateUnreadCount: function(qc) {\n            var rc = qc.unread_count;\n            if ((typeof rc != \"undefined\")) {\n                var sc = (!!rc && ((!n.showsTabUnreadUI || n.showsTabUnreadUI()))), tc = this._getNode(\"numMessages\");\n                y.conditionShow(tc, sc);\n                y.conditionClass(this._tabElem, \"highlightTab\", sc);\n                zb(this._threadID, this._tabElem, sc);\n                ba.setContent(tc, rc);\n            }\n        ;\n        },\n        _updateCallLink: function(qc) {\n            var rc = this._getNode(\"videoCallLink\");\n            if (w.isOnline()) {\n                var sc = this._getCanonicalUserID(), tc = (\"fbid:\" + sc);\n                ka.get(tc, function(uc) {\n                    if (jb.availableForCall(sc)) {\n                        fb.set(rc, ob._(\"Start a video call with {firstname}\", {\n                            firstname: uc.short_name\n                        }));\n                        this._updateCallBackLinks(this._tabElem, true);\n                    }\n                     else {\n                        fb.set(rc, ob._(\"{firstname} is currently unavailable for video calling\", {\n                            firstname: uc.short_name\n                        }));\n                        this._hideVideoCallouts();\n                        this._updateCallBackLinks(this._tabElem, false);\n                    }\n                ;\n                }.bind(this));\n            }\n             else {\n                fb.set(rc, \"You must be online to make a call.\");\n                this._hideVideoCallouts();\n                this._updateCallBackLinks(document.body, false);\n            }\n        ;\n        },\n        _updateCallBackLinks: function(qc, rc) {\n            var sc = ba.scry(qc, \"a.callBackLink\");\n            if (rc) {\n                sc.forEach(y.show);\n            }\n             else sc.forEach(y.hide);\n        ;\n        },\n        _hideVideoCallouts: function() {\n            this._contextualDialogController.hideVideoCallouts();\n        },\n        _updatePrivacyLink: function(qc) {\n            if ((qc == r.OFFLINE)) {\n                ba.setContent(this._privacyLink, \"Go online\");\n            }\n             else {\n                var rc = this._getCanonicalUserID(), sc = (\"fbid:\" + rc);\n                ka.get(sc, function(tc) {\n                    var uc = null;\n                    if ((qc == r.BLOCKED)) {\n                        uc = ob._(\"Turn On Chat for {name}\", {\n                            name: tc.short_name\n                        });\n                    }\n                     else uc = ob._(\"Turn Off Chat for {name}\", {\n                        name: tc.short_name\n                    });\n                ;\n                    ba.setContent(this._privacyLink, uc);\n                }.bind(this));\n            }\n        ;\n        },\n        _unsubscribeToThread: function() {\n            if (sa.isEmptyLocalThread(this._threadID)) {\n                nc.inform(\"unsubscribed\", this._threadID);\n            }\n             else {\n                var qc = ja.constructLogMessageObject(ma.CHAT_WEB, this._threadID, ia.UNSUBSCRIBE, {\n                });\n                ja.sendMessage(qc);\n            }\n        ;\n            return true;\n        },\n        _initializeUploader: function(qc) {\n            this._subscriptionsHandler.addSubscriptions(qc.subscribe([\"all-uploads-completed\",\"upload-canceled\",], function() {\n                jc(this);\n            }.bind(this)), qc.subscribe(\"dom-updated\", function() {\n                kc(this);\n            }.bind(this)), qc.subscribe(\"submit\", function() {\n                this._getNode(\"input\").focus();\n            }.bind(this)));\n        },\n        _initializeAutoSendPhotoUploader: function() {\n            this._photoUploader = new q(this._tabTemplate.getNode(\"photoAttachButtonForm\"), this._tabTemplate.getNode(\"photoFileInput\"), this._tabTemplate.getNode(\"photoAttachID\"));\n            var qc = {\n            };\n            lc(this, \"submit\", xa.UPLOAD_START);\n            lc(this, \"all-uploads-completed\", xa.ALL_UPLOADS_DONE);\n            lc(this, \"all-uploads-failed\", xa.CLIENT_ERROR);\n            this._subscriptionsHandler.addSubscriptions(this._photoUploader.subscribe(\"submit\", function(rc, sc) {\n                ec(this, \"\", sc.raw_attachments, function(tc) {\n                    qc[sc.upload_id] = tc;\n                    tc.do_not_send_to_server = true;\n                    tc.status = ga.RESENDING;\n                    ja.sendMessage(tc);\n                });\n                this._getNode(\"input\").focus();\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-failed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                ja.deleteMessages(tc.thread_id, [tc.message_id,]);\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-completed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                delete tc.raw_attachments;\n                tc.image_ids = sc.image_ids;\n                tc.do_not_send_to_server = false;\n                ja.sendMessage(tc);\n                var uc = (sc.image_ids.length || sc.attachments.length);\n                dc(this, uc);\n            }.bind(this)));\n        },\n        _stickerSelected: function(qc) {\n            ec(this, \"\", [], function(rc) {\n                rc.has_attachment = true;\n                rc.sticker_id = qc;\n                ja.sendMessage(rc);\n                this.focus();\n            }.bind(this));\n        },\n        _emoticonView: null\n    });\n    e.exports = nc;\n});\n__d(\"ChatNewMessageHandler\", [\"ChatActivity\",\"ChatTabModel\",\"ChatTabView\",\"JSLogger\",\"MercuryAssert\",\"MercuryBrowserAlerts\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"JSLogger\"), k = b(\"MercuryAssert\"), l = b(\"MercuryBrowserAlerts\"), m = b(\"MercuryUnseenState\").get(), n = j.create(\"chat_new_message\"), o = {\n        _raiseTab: function(p, q) {\n            var r = h.getTab(p), s = false;\n            if (r) {\n                s = r.raised;\n            }\n             else {\n                h.raiseTab(p, false);\n                s = true;\n            }\n        ;\n            q.to_new_tab = !r;\n            q.to_raised_tab = !!s;\n        },\n        _notify: function(p, q, r) {\n            var s = i.get(p);\n            r.view_is_visible = (s && s.isVisible());\n            r.view_is_focused = (s && s.isFocused());\n            if (!r.view_is_visible) {\n                n.log(\"message_to_hidden\");\n            };\n            r.is_active = g.isActive();\n            l.messageReceived(q);\n        },\n        _promoteTab: function(p, q, r) {\n            if (((r && !r[p]) && q)) {\n                h.promoteThreadInPlaceOfThread(p, q);\n            };\n        },\n        newMessage: function(p, q, r, s) {\n            k.isThreadID(p);\n            var t = {\n                thread_id: p,\n                message_id: q.message_id\n            };\n            this._raiseTab(p, t);\n            this._promoteTab(p, r, s);\n            this._notify(p, q, t);\n            n.log(\"message\", t);\n        }\n    };\n    l.subscribe(\"before-alert\", function(p, event) {\n        var q = event.threadID, r = i.get(q), s = h.getTab(q);\n        if ((((((s && s.raised) && r) && r.isVisible()) && r.isFocused()) && r.tryMarkAsRead())) {\n            m.markThreadSeen(q);\n            event.cancelAlert();\n        }\n    ;\n    });\n    e.exports = o;\n});\n__d(\"ChatTabPresence\", [\"AvailableList\",\"ChatTabModel\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatTabModel\"), i = b(\"MercuryThreads\").get(), j = {\n    };\n    function k(l) {\n        var m = i.getCanonicalUserInThread(l);\n        if (m) {\n            g.updateForID(m);\n        };\n    };\n    h.subscribe(\"chat/tabs-changed\", function(event, l) {\n        l.tabs.forEach(function(m) {\n            if ((m.raised && !j[m.id])) {\n                k(m.id);\n            };\n        });\n        j = {\n        };\n        l.tabs.forEach(function(m) {\n            if (m.raised) {\n                j[m.id] = true;\n            };\n        });\n    });\n    e.exports = {\n    };\n});\n__d(\"ChatTabPolicy\", [\"ChatBehavior\",\"FBDesktopPlugin\",\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryParticipants\",\"MercuryParticipantTypes\",\"MercurySourceType\",\"MercuryThreadMode\",\"MercuryThreadMuter\",\"MercuryUnseenState\",\"MessagingTag\",\"PresencePrivacy\",\"ShortProfiles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatBehavior\"), h = b(\"FBDesktopPlugin\"), i = b(\"JSLogger\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryAssert\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryParticipantTypes\"), n = b(\"MercurySourceType\"), o = b(\"MercuryThreadMode\"), p = b(\"MercuryThreadMuter\"), q = b(\"MercuryUnseenState\").get(), r = b(\"MessagingTag\"), s = b(\"PresencePrivacy\"), t = b(\"ShortProfiles\"), u = i.create(\"tab_policy\");\n    function v(w, x) {\n        q.markThreadSeen(w, x);\n    };\n    e.exports = {\n        messageIsAllowed: function(w, x, y) {\n            var z = w.thread_id, aa = x.message_id;\n            k.isThreadID(z);\n            k.isParticipantID(x.author);\n            var ba;\n            if (p.isThreadMuted(w)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mute_settings: w.mute_settings\n                };\n                u.log(\"message_thread_muted\", ba);\n                return;\n            }\n        ;\n            if ((w.mode == o.OBJECT_ORIGINATED)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mode: w.mode\n                };\n                u.log(\"message_object_originated\", ba);\n                return;\n            }\n        ;\n            if (((x.source == n.EMAIL) || (x.source == n.TITAN_EMAIL_REPLY))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    source: x.source\n                };\n                u.log(\"message_source_not_allowed\", ba);\n                return;\n            }\n        ;\n            var ca = l.getUserID(x.author);\n            if (!ca) {\n                u.log(\"message_bad_author\", {\n                    thread_id: z,\n                    message_id: aa,\n                    user: ca\n                });\n                return;\n            }\n        ;\n            if ((x.action_type != j.USER_GENERATED_MESSAGE)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    type: x.action_type\n                };\n                u.log(\"message_non_user_generated\", ba);\n                return;\n            }\n        ;\n            if ((w.is_canonical_user && !g.notifiesUserMessages())) {\n                u.log(\"message_jabber\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                v(z, true);\n                return;\n            }\n        ;\n            if ((w.is_canonical && !w.canonical_fbid)) {\n                u.log(\"message_canonical_contact\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n            if (h.shouldSuppressMessages()) {\n                u.log(\"message_desktop\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n            if ((w.folder != r.INBOX)) {\n                u.log(\"message_folder\", {\n                    thread_id: z,\n                    message_id: aa,\n                    folder: w.folder\n                });\n                return;\n            }\n        ;\n            var da = l.getUserID(l.user);\n            t.getMulti([ca,da,], function(ea) {\n                if (!s.allows(ca)) {\n                    u.log(\"message_privacy\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n                var fa = (ea[ca].employee && ea[da].employee);\n                if ((!fa && (ea[ca].type !== m.FRIEND))) {\n                    u.log(\"message_non_friend\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n                y();\n            });\n        }\n    };\n});\n__d(\"ChatTabViewSelector\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"MenuDeprecated\",\"MercuryThreadInformer\",\"MercuryThreads\",\"NubController\",\"ChatTabTemplates\",\"MercuryThreadMetadataRenderer\",\"Toggler\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"NubController\"), p = b(\"ChatTabTemplates\"), q = b(\"MercuryThreadMetadataRenderer\").get(), r = b(\"Toggler\"), s = b(\"copyProperties\");\n    function t(u) {\n        var v = p[\":fb:chat:tab:selector\"].build(), w = v.getRoot(), x = v.getNode(\"menu\"), y = k.find(x, \".uiMenuInner\"), z = {\n        }, aa = new o().init(w);\n        i.hide(w);\n        k.insertBefore(u, w);\n        function ba(ea) {\n            var fa = 0;\n            for (var ga in z) {\n                var ha = z[ga], ia = n.getThreadMetaNow(ga), ja = ha.getNode(\"unreadCount\"), ka = (((ia && ia.unread_count)) || 0);\n                fa += ka;\n                if ((ka > 9)) {\n                    ka = \"+\";\n                };\n                i.conditionClass(ja, \"invisible_elem\", !ka);\n                k.setContent(ja, ka);\n            };\n            var la = v.getNode(\"numMessages\");\n            i.conditionShow(la, fa);\n            k.setContent(la, fa);\n        };\n        this.setTabData = function(ea) {\n            z = {\n            };\n            if ((ea.length < 1)) {\n                i.hide(w);\n                return;\n            }\n        ;\n            i.show(w);\n            k.empty(y);\n            ea.forEach(function(fa) {\n                var ga = p[\":fb:chat:tab:selector:item\"].build();\n                z[fa.id] = ga;\n                var ha = ga.getNode(\"content\");\n                q.renderAndSeparatedParticipantList(fa.id, ha);\n                k.prependContent(y, ga.getRoot());\n                j.set(ga.getRoot(), \"threadID\", fa.id);\n                var ia = ga.getNode(\"closeButton\");\n                g.listen(ia, \"click\", function(event) {\n                    t.inform(\"selector/close-tab\", fa.id);\n                    event.kill();\n                });\n            });\n            aa.flyoutContentChanged();\n            k.setContent(v.getNode(\"numTabs\"), ea.length);\n            ba();\n        };\n        function ca(event, ea) {\n            if ((ea.menu != x)) {\n                return\n            };\n            var fa = j.get(ea.item, \"threadID\");\n            t.inform(\"selected\", fa);\n            r.hide(w);\n        };\n        function da(event, ea) {\n            l.register(x);\n        };\n        l.subscribe(\"select\", ca.bind(this));\n        r.listen(\"show\", w, function() {\n            h.inform(\"layer_shown\", {\n                type: \"ChatTabSelector\"\n            });\n            da();\n        });\n        r.listen(\"hide\", w, function() {\n            h.inform(\"layer_hidden\", {\n                type: \"ChatTabSelector\"\n            });\n        });\n        m.subscribe(\"threads-updated\", ba);\n    };\n    s(t, new h());\n    e.exports = t;\n});\n__d(\"ChatTabController\", [\"ChatTabPresence\",\"ChatTypeaheadBehavior\",\"Arbiter\",\"ChatActivity\",\"ChatBehavior\",\"ChatConfig\",\"ChatNewMessageHandler\",\"ChatTabMessagesView\",\"ChatTabModel\",\"ChatTabPolicy\",\"ChatTabView\",\"ChatTabViewSelector\",\"JSLogger\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MercuryUnseenState\",\"Style\",\"UserAgent\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    b(\"ChatTabPresence\");\n    b(\"ChatTypeaheadBehavior\");\n    var g = b(\"Arbiter\"), h = b(\"ChatActivity\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"ChatNewMessageHandler\"), l = b(\"ChatTabMessagesView\"), m = b(\"ChatTabModel\"), n = b(\"ChatTabPolicy\"), o = b(\"ChatTabView\"), p = b(\"ChatTabViewSelector\"), q = b(\"JSLogger\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"MercuryThreads\").get(), v = b(\"MercuryUnseenState\").get(), w = b(\"Style\"), x = b(\"UserAgent\"), y = b(\"VideoCallCore\"), z = (j.get(\"tab_auto_close_timeout\") || 7200000), aa = q.create(\"tab_controller\");\n    function ba(na) {\n        u.changeThreadReadStatus(na, true);\n        ca(na);\n    };\n    function ca(na) {\n        v.markThreadSeen(na);\n    };\n    function da(na, oa, pa) {\n        var qa = m.get().tabs;\n        na += (oa ? 1 : -1);\n        while (((na >= 0) && (na < qa.length))) {\n            var ra = qa[na], sa = o.get(ra.id);\n            if (((sa && sa.isVisible()) && ((!pa || ra.raised)))) {\n                sa.focus();\n                return true;\n            }\n        ;\n            na += (oa ? 1 : -1);\n        };\n        return false;\n    };\n    function ea(na, oa, pa) {\n        var qa = oa.shouldPromoteOnRaise(na);\n        g.inform(\"chat/promote-tab\", na);\n        if (qa) {\n            m.raiseAndPromoteTab(na, true, pa);\n        }\n         else m.raiseTab(na, true, pa);\n    ;\n        var ra = o.get(na);\n        (ra && ra.focus());\n    };\n    function fa(na, oa, pa) {\n        var qa = pa.getMaxTabsToShow(), ra = m.indexOf(na);\n        m.closeTabAndDemote(na, (qa - 2), oa);\n        return ra;\n    };\n    function ga(na) {\n        var oa = Object.keys((na.getTabsToShow() || {\n        })), pa = (1 * 60), qa = null, ra = Infinity;\n        for (var sa = 0; (sa < oa.length); sa++) {\n            var ta = oa[sa], ua = u.getThreadMetaNow(ta);\n            if ((!o.get(ta).hasEmptyInput() || !ua)) {\n                continue;\n            };\n            var va = (((m.getServerTime() - ua.timestamp)) / 1000);\n            if ((!ua.timestamp || (((ua.timestamp && (ua.timestamp < ra)) && (va > pa))))) {\n                qa = ua.thread_id;\n                ra = ua.timestamp;\n            }\n        ;\n        };\n        return qa;\n    };\n    function ha(na) {\n        p.subscribe(\"selected\", function(pa, qa) {\n            ea(qa, na);\n        });\n        g.subscribe(\"chat/open-tab\", function(pa, qa) {\n            ea(qa.thread_id, na, qa.signature_id);\n        });\n        g.subscribe(\"page_transition\", function(pa, qa) {\n            m.closeFragileTabs();\n        });\n        o.subscribe(\"read\", function(event, pa) {\n            ba(pa);\n        });\n        h.subscribe(\"idle\", function(pa, qa) {\n            if ((qa > z)) {\n                var ra = m.get().tabs;\n                ra.forEach(function(sa) {\n                    var ta = sa.id;\n                    u.getThreadMeta(ta, function(ua) {\n                        if (!ua.unread_count) {\n                            aa.log(\"autoclose_idle_seen\", {\n                                thread_id: ta,\n                                idleness: qa\n                            });\n                            m.closeTab(ta, \"autoclose_idle_seen\");\n                        }\n                    ;\n                    });\n                });\n            }\n        ;\n        });\n        o.subscribe(\"nub-activated\", function(pa, qa) {\n            ea(qa, na);\n        });\n        o.subscribe(\"lower-activated\", function(pa, qa) {\n            m.lowerTab(qa);\n            var ra = o.get(qa);\n            (ra && ra.focus());\n        });\n        function oa(pa, qa) {\n            y.showOutgoingCallDialog(qa.userID, qa.clickSource);\n            m.lowerTab(qa.threadID);\n        };\n        o.subscribe(\"video-call-clicked\", oa);\n        l.subscribe(\"video-call-clicked\", oa);\n        o.subscribe(\"closed-tab\", function(pa, qa) {\n            aa.log(\"close_view\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view\", na);\n            return false;\n        });\n        o.subscribe(\"thread-deleted\", function(pa, qa) {\n            aa.log(\"close_thread_deleted\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_thread_deleted\", na);\n            return false;\n        });\n        o.subscribe(\"unsubscribed\", function(pa, qa) {\n            aa.log(\"close_view_unsubscribed\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view_unsubscribed\", na);\n            return false;\n        });\n        o.subscribe(\"esc-pressed\", function(pa, qa) {\n            aa.log(\"close_esc\", {\n                thread_id: qa\n            });\n            var ra = fa(qa, \"close_esc\", na);\n            (function() {\n                (da((ra - 1), true, true) || da(ra, false, true));\n            }).defer();\n        });\n        p.subscribe(\"selector/close-tab\", function(pa, qa) {\n            aa.log(\"close_chat_from_selector\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_chat_from_selector\", na);\n        });\n        t.subscribe(\"messages-received\", function(pa, qa) {\n            for (var ra in qa) {\n                var sa = qa[ra];\n                for (var ta = 0; (ta < sa.length); ta++) {\n                    var ua = sa[ta];\n                    if ((ua.author != r.user)) {\n                        if (!ua.is_unread) {\n                            aa.log(\"message_already_read\", {\n                                action_id: ua.action_id,\n                                thread_id: ua.thread_id\n                            });\n                            continue;\n                        }\n                    ;\n                        u.getThreadMeta(ra, function(va) {\n                            n.messageIsAllowed(va, ua, function() {\n                                var wa = (na.hasRoomForRaisedTab() ? undefined : ga(na));\n                                k.newMessage(ra, ua, wa, na.getTabsToShow());\n                            });\n                        });\n                    }\n                ;\n                };\n            };\n        });\n        t.subscribe(\"thread-read-changed\", function(pa, qa) {\n            for (var ra in qa) {\n                if (!qa[ra].mark_as_read) {\n                    aa.log(\"autoclose_marked_unread\", {\n                        thread_id: ra\n                    });\n                    m.closeTab(ra, \"autoclose_marked_unread\");\n                }\n            ;\n            };\n        });\n        o.subscribe(\"tab-pressed\", function(pa, qa) {\n            return !da(m.indexOf(qa.id), qa.shiftPressed);\n        });\n        g.subscribe(q.DUMP_EVENT, function(pa, qa) {\n            qa.chat_controller = {\n                auto_close_timeout: z\n            };\n        });\n    };\n    if (x.firefox()) {\n        var ia = function() {\n            return ((w.get(document.body, \"overflowX\") + \" \") + w.get(document.body, \"overflowY\"));\n        }, ja = ia(), ka = function() {\n            var na = ia();\n            if ((na !== ja)) {\n                ja = na;\n                g.inform(\"overflow-applied-to-body\");\n            }\n        ;\n        };\n        if ((\"MutationObserver\" in window)) {\n            var la = new MutationObserver(ka), ma = {\n                attributes: true,\n                attributeFilter: [\"class\",\"style\",]\n            };\n            la.observe(document.documentElement, ma);\n        }\n         else document.documentElement.addEventListener(\"DOMAttrModified\", function(event) {\n            if (((event.getTarget() === document.documentElement) && (((event.attrName === \"class\") || (event.attrName === \"style\"))))) {\n                ka();\n            };\n        }, false);\n    ;\n    }\n;\n    e.exports = ha;\n});\n__d(\"ChatTabViewCoordinator\", [\"Arbiter\",\"ChatTabModel\",\"ChatTabView\",\"ChatTabViewSelector\",\"CSS\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"ChatTabViewSelector\"), k = b(\"CSS\"), l = b(\"VideoCallCore\");\n    function m(n, o) {\n        var p = new j(n), q = {\n        }, r = false;\n        function s() {\n            var w = h.get(), x = {\n            };\n            w.tabs.forEach(function(z) {\n                x[z.id] = 1;\n            });\n            for (var y in q) {\n                if (!x[y]) {\n                    q[y].destroy();\n                    delete (q[y]);\n                }\n            ;\n            };\n            t(w);\n            u(w);\n        };\n        function t(w) {\n            var x = null;\n            w.tabs.forEach(function(y) {\n                var z = y.id, aa = false;\n                if (!q[z]) {\n                    q[z] = new i(z, y.server_id, y.signatureID);\n                    aa = true;\n                }\n                 else q[z].updateSignatureID(y.signatureID);\n            ;\n                if ((aa || !q[z].nextTabIs(x))) {\n                    var ba = q[z].getScrollTop();\n                    if (x) {\n                        q[z].insertBefore(x);\n                    }\n                     else q[z].appendTo(n);\n                ;\n                    if (ba) {\n                        q[z].setScrollTop(ba);\n                    };\n                }\n            ;\n                x = q[z];\n            });\n        };\n        function u(w) {\n            var x = o.getTabsToShow(w), y = [], z = false;\n            w.tabs.forEach(function(aa) {\n                if (!x[aa.id]) {\n                    q[aa.id].setVisibleState(false, aa.raised);\n                    y.push(aa);\n                }\n            ;\n            });\n            w.tabs.forEach(function(aa) {\n                if (x[aa.id]) {\n                    q[aa.id].setVisibleState(true, aa.raised);\n                    z |= aa.raised;\n                }\n            ;\n            });\n            p.setTabData(y);\n            v(z);\n        };\n        function v(w) {\n            if ((!w && r)) {\n                g.inform(\"layer_hidden\", {\n                    type: \"ChatTab\"\n                });\n                r = false;\n            }\n             else if ((w && !r)) {\n                g.inform(\"layer_shown\", {\n                    type: \"ChatTab\"\n                });\n                r = true;\n            }\n            \n        ;\n        };\n        if (l.isSupported()) {\n            k.addClass(n, \"videoCallEnabled\");\n        };\n        o.subscribe(\"tabs-changed\", s);\n        s();\n    };\n    e.exports = m;\n});\n__d(\"TabsViewport\", [\"Arbiter\",\"ArbiterMixin\",\"ChatTabModel\",\"Dock\",\"DOM\",\"DOMDimensions\",\"Event\",\"Parent\",\"Vector\",\"ViewportBounds\",\"areObjectsEqual\",\"copyProperties\",\"csx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"Dock\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Event\"), n = b(\"Parent\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"areObjectsEqual\"), r = b(\"copyProperties\"), s = b(\"csx\"), t = b(\"shield\"), u = 164, v = 264;\n    function w(x) {\n        this._root = x;\n        var y = this._recalculateWidth.bind(this);\n        m.listen(window, \"resize\", y);\n        j.subscribe(\"resize\", y);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], y);\n        g.subscribeOnce([\"sidebar/initialized\",\"LitestandSidebar/initialized\",], y, g.SUBSCRIBE_NEW);\n        i.subscribe(\"chat/tabs-changed\", t(this._recalculateTabs, this, true));\n        this._recalculateWidth();\n        this._initialized = true;\n    };\n    r(w.prototype, h, {\n        _root: null,\n        _initialized: false,\n        _availableWidth: 0,\n        _maxShown: 1,\n        _viewState: null,\n        _recalculateWidth: function() {\n            var x = w._getAvailableDockWidth(this._root), y = Math.max(1, Math.floor((x / v))), z = (y != this._maxShown);\n            if ((((!this._viewState || z) || (x <= this._viewState.usedWidth)) || (x > this._viewState.widthToShowNext))) {\n                this._availableWidth = x;\n                this._maxShown = y;\n                this._viewState = null;\n                this._recalculateTabs(z);\n            }\n        ;\n        },\n        _onTabsChanged: function() {\n            if (this._initialized) {\n                this.inform(\"tabs-changed\");\n                this.inform(\"max-to-show-changed\", this._maxShown);\n                this.inform(\"max-to-show-change-completed\");\n            }\n        ;\n        },\n        _recalculateTabs: function(x) {\n            var y = w._getTabsToShow(i.get(), this._availableWidth);\n            if ((x || !q(this._viewState, y))) {\n                this._viewState = y;\n                this._onTabsChanged();\n            }\n        ;\n        },\n        getMaxTabsToShow: function() {\n            return this._maxShown;\n        },\n        checkWidth: function() {\n            this._recalculateWidth();\n        },\n        hasRoomForRaisedTab: function() {\n            return ((this._availableWidth - this._viewState.usedWidth) > v);\n        },\n        getTabsToShow: function() {\n            return JSON.parse(JSON.stringify(this._viewState.tabsToShow));\n        },\n        shouldPromoteOnRaise: function(x) {\n            if (!this._viewState.tabsToShow[x]) {\n                return true\n            };\n            if ((this._viewState.nextToHide != x)) {\n                return false\n            };\n            var y = i.getTab(x), z = (y && y.raised);\n            return (!z && (((this._availableWidth - this._viewState.usedWidth) < 100)));\n        }\n    });\n    r(w, {\n        _getAvailableDockWidth: function(x) {\n            var y = l.getViewportWithoutScrollbarDimensions().width;\n            y -= (p.getLeft() + p.getRight());\n            y -= 50;\n            var z = n.byClass(x, \"fbDock\"), aa = k.find(z, \".-cx-PUBLIC-fbDockChatBuddyListNub__container\"), ba = o.getElementDimensions(aa).x;\n            y -= ba;\n            var ca = k.find(z, \".-cx-PUBLIC-fbMercuryChatTab__container\");\n            ba += o.getElementDimensions(ca).x;\n            var da = o.getElementDimensions(z), ea = (da.x - ba);\n            y -= ea;\n            y -= 15;\n            return Math.max(y, 0);\n        },\n        _getTabsToShow: function(x, y) {\n            y = Math.max(y, (v + 1));\n            function z(oa) {\n                return (oa.raised ? v : u);\n            };\n            var aa = JSON.parse(JSON.stringify(x.tabs)), ba = -1, ca = null;\n            if (x.promoted) {\n                aa.forEach(function(oa, pa) {\n                    if ((oa.id === x.promoted)) {\n                        ba = pa;\n                        ca = oa;\n                    }\n                ;\n                });\n            };\n            var da = 0, ea = 0, fa = !ca;\n            aa.forEach(function(oa, pa) {\n                var qa = z(oa);\n                oa.leftmostOffset = (da + v);\n                da += qa;\n                if ((oa.leftmostOffset < y)) {\n                    ea++;\n                };\n                fa |= (pa == ba);\n                oa.alreadyPlacedPromoted = fa;\n            });\n            function ga(oa, pa, qa) {\n                var ra = {\n                };\n                for (var sa = 0; (sa < pa); sa++) {\n                    var ta = oa[sa];\n                    if ((!ta.alreadyPlacedPromoted && (sa == (pa - 1)))) {\n                        ra[qa] = true;\n                    }\n                     else ra[ta.id] = true;\n                ;\n                };\n                return ra;\n            };\n            var ha = ga(aa, ea, x.promoted), ia = ga(aa, (ea - 1), x.promoted), ja = null;\n            for (var ka in ha) {\n                if (!ia[ka]) {\n                    ja = ka;\n                };\n            };\n            var la = aa[(ea - 1)], ma = (la ? la.leftmostOffset : 0), na = Infinity;\n            if ((ea < aa.length)) {\n                na = aa[ea].leftmostOffset;\n            };\n            return {\n                nextToHide: ja,\n                tabsToShow: ha,\n                usedWidth: ma,\n                widthToShowNext: na\n            };\n        }\n    });\n    e.exports = w;\n});\n__d(\"LinkshimHandler\", [\"Event\",\"LinkshimAsyncLink\",\"LinkshimHandlerConfig\",\"URI\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"LinkshimAsyncLink\"), i = b(\"LinkshimHandlerConfig\"), j = b(\"URI\"), k = b(\"shield\"), l = {\n        setUpLinkshimHandling: function(r) {\n            var s = j(r.getAttribute(\"href\")), t = m(s);\n            if ((t && n(s))) {\n                g.listen(r, \"mouseover\", k(h.swap, null, r, t));\n                var u = p(s);\n                g.listen(r, \"click\", function() {\n                    if (i.supports_meta_referrer) {\n                        h.referrer_log(r, u, o(s).toString());\n                    }\n                     else h.swap(r, s);\n                ;\n                });\n            }\n        ;\n        }\n    };\n    function m(r) {\n        return (r.getQueryData().u ? new j(r.getQueryData().u) : null);\n    };\n    function n(r) {\n        return r.getQueryData().hasOwnProperty(\"s\");\n    };\n    function o(r) {\n        return j(\"/si/ajax/l/render_linkshim_log/\").setSubdomain(\"www\").setQueryData(r.getQueryData());\n    };\n    function p(r) {\n        var s;\n        if (q()) {\n            s = j(r).addQueryData({\n                render_verification: true\n            });\n        }\n         else s = m(r);\n    ;\n        return s;\n    };\n    function q() {\n        var r = (i.render_verification_rate || 0);\n        return (Math.floor(((Math.random() * r) + 1)) === r);\n    };\n    e.exports = l;\n});\n__d(\"legacy:CompactTypeaheadRenderer\", [\"CompactTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    };\n    a.TypeaheadRenderers.compact = b(\"CompactTypeaheadRenderer\");\n}, 3);");
// 13087
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sa8aa2777ffd1168ca4b91592035689e963b20f7e");
// 13088
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"brbS1\",]);\n}\n;\n;\n__d(\"BlackbirdUpsellConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        ACTION_UPSELL: \"upsell\",\n        CLICK_TYPE_DISMISS_PROMO: \"dismiss_promo\",\n        ACTION_EDUCATE: \"educate\",\n        CLICK_TYPE_ENABLE_CHAT: \"enable_chat\",\n        CLICK_TYPE_OPEN_SETTINGS: \"open_settings\"\n    };\n});\n__d(\"GenderConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        UNKNOWN: 0,\n        FEMALE_SINGULAR: 1,\n        MALE_SINGULAR: 2,\n        FEMALE_SINGULAR_GUESS: 3,\n        MALE_SINGULAR_GUESS: 4,\n        MIXED_SINGULAR: 5,\n        MIXED_PLURAL: 5,\n        NEUTER_SINGULAR: 6,\n        UNKNOWN_SINGULAR: 7,\n        FEMALE_PLURAL: 8,\n        MALE_PLURAL: 9,\n        NEUTER_PLURAL: 10,\n        UNKNOWN_PLURAL: 11\n    };\n    e.exports = g;\n});\n__d(\"AsyncLoader\", [\"copyProperties\",\"AsyncRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"AsyncRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n;\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        new h(k).setData({\n            ids: l\n        }).setHandler(n).setErrorHandler(o).setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n    };\n    e.exports = j;\n});\n__d(\"BlackbirdUpsell\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"LegacyContextualDialog\",\"DOM\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"PresencePrivacy\",\"copyProperties\",\"BlackbirdUpsellConfig\",\"BlackbirdUpsellConstants\",\"BlackbirdUpsellTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"LegacyContextualDialog\"), k = b(\"DOM\"), l = b(\"LayerDestroyOnHide\"), m = b(\"LayerHideOnTransition\"), n = b(\"PresencePrivacy\"), o = b(\"copyProperties\"), p = b(\"BlackbirdUpsellConfig\"), q = b(\"BlackbirdUpsellConstants\"), r = b(\"BlackbirdUpsellTemplates\"), s = \"/ajax/chat/blackbird/update_clicks.php\", t = \"/ajax/chat/blackbird/update_impressions.php\", u = \"/ajax/chat/blackbird/dismiss.php\", v = 235, w = null, x = null, y = false, z = false;\n    function aa() {\n    \n    };\n;\n    o(aa, {\n        shouldShow: function() {\n            if (this._dialogDismissed) {\n                return false;\n            }\n        ;\n        ;\n            if (this.isEducation()) {\n                return ((((!!p.EducationGK && !p.EducationDismissed)) && ((p.EducationImpressions < p.EducationImpressionLimit))));\n            }\n             else return ((((((!!p.UpsellGK && !p.UpsellDismissed)) && ((p.UpsellImpressions < p.UpsellImpressionLimit)))) && ((p.FriendCount >= p.UpsellMinFriendCount))))\n        ;\n        },\n        isEducation: function() {\n            return ((p.TimeOffline <= p.EducationTimeOfflineThresdhold));\n        },\n        getOfflineContent: function() {\n            if (this.isEducation()) {\n                return this._getEducationContent();\n            }\n             else return this._getUpsellContent()\n        ;\n        },\n        _getEducationContent: function() {\n            ga();\n            var ka = r[\":fb:chat:blackbird:offline-educate\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ja(q.CLICK_TYPE_OPEN_SETTINGS);\n                da();\n            });\n            return ka.getRoot();\n        },\n        _getUpsellContent: function() {\n            fa();\n            var ka = r[\":fb:chat:blackbird:upsell\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ia(q.CLICK_TYPE_OPEN_SETTINGS);\n                ca();\n            });\n            var ma = ka.getNode(\"enableChatButton\");\n            g.listen(ma, \"click\", function() {\n                ia(q.CLICK_TYPE_ENABLE_CHAT);\n                ca();\n            });\n            return ka.getRoot();\n        },\n        getBlackbirdContent: function(ka) {\n            ga();\n            switch (ka) {\n              case n.ONLINE:\n                return r[\":fb:chat:blackbird:most-friends-educate\"].build().getRoot();\n              case n.OFFLINE:\n                return r[\":fb:chat:blackbird:some-friends-educate\"].build().getRoot();\n            };\n        ;\n        },\n        showOfflineDialog: function(ka) {\n            this.showDialog(ka, this.getOfflineContent.bind(this));\n        },\n        showBlackbirdDialog: function(ka, la) {\n            this.showDialog(ka, this.getBlackbirdContent.curry(la));\n        },\n        showDialog: function(ka, la) {\n            ((!w && this._constructDialog()));\n            k.setContent(x, la());\n            w.setContext(ka);\n            w.show();\n        },\n        hide: function() {\n            if (((w && w.isShown()))) {\n                w.hide();\n            }\n        ;\n        ;\n        },\n        dismiss: function() {\n            this.hide();\n            if (this.isEducation()) {\n                da();\n            }\n             else ca();\n        ;\n        ;\n        },\n        registerDismissClick: function() {\n            if (this.isEducation()) {\n                ja(q.CLICK_TYPE_DISMISS_PROMO);\n            }\n             else ia(q.CLICK_TYPE_DISMISS_PROMO);\n        ;\n        ;\n        },\n        isVisible: function() {\n            return ((z && !y));\n        },\n        _constructDialog: function() {\n            var ka = r[\":fb:chat:blackbird:dialog-frame\"].build();\n            x = ka.getNode(\"dialogContent\");\n            w = new j();\n            w.init(ka.getRoot());\n            w.setPosition(\"above\").setWidth(v).setFixed(true).disableBehavior(l).disableBehavior(m);\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.dismiss.bind(this));\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.registerDismissClick.bind(this));\n        }\n    });\n    function ba(ka, la) {\n        if (((!y && z))) {\n            y = true;\n            n.inform(\"privacy-user-presence-changed\");\n            var ma = new i(u);\n            ma.setData({\n                source: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                y = false;\n            });\n            ma.send();\n        }\n    ;\n    ;\n    };\n;\n    function ca() {\n        ba(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n;\n    function da() {\n        ba(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n;\n    function ea(ka, la) {\n        if (!z) {\n            z = true;\n            var ma = new i(t);\n            ma.setData({\n                action: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                z = false;\n            });\n            ma.send();\n        }\n    ;\n    ;\n    };\n;\n    function fa() {\n        ea(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n;\n    function ga() {\n        ea(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n;\n    function ha(ka, la, ma, na) {\n        var oa = new i(s);\n        oa.setData({\n            action: ka,\n            impressions: ma,\n            source: la,\n            time_offline: na\n        });\n        oa.send();\n    };\n;\n    function ia(ka) {\n        ha(ka, q.ACTION_UPSELL, p.UpsellImpressions, p.TimeOffline);\n    };\n;\n    function ja(ka) {\n        ha(ka, q.ACTION_EDUCATE, p.EducateImpressions, p.TimeOffline);\n    };\n;\n    h.subscribe(\"chat/advanced-settings-dialog-opened\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-online\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-offline\", aa.dismiss.bind(aa));\n    e.exports = aa;\n});\n__d(\"ChatFavoriteNux\", [\"AsyncRequest\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = null, i = false, j = {\n        tryShow: function(k) {\n            if (((h && !i))) {\n                h.setContext(k);\n                h.show();\n                i = true;\n            }\n        ;\n        ;\n        },\n        tryHide: function() {\n            if (((h && i))) {\n                h.hide();\n                h = null;\n            }\n        ;\n        ;\n        },\n        registerDialog: function(k) {\n            h = k;\n            if (k) {\n                k.subscribe(\"JSBNG__confirm\", this.dismissDialog);\n            }\n        ;\n        ;\n        },\n        dismissDialog: function() {\n            if (h) {\n                new g(\"/ajax/chat/dismiss_favorite_nux.php\").send();\n                h.hide();\n                h = null;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"ChatGroupThreadsController\", [\"ArbiterMixin\",\"ChatConfig\",\"InitialMultichatList\",\"MercuryOrderedThreadlist\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MessagingTag\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatConfig\"), i = b(\"InitialMultichatList\"), j = b(\"MercuryOrderedThreadlist\").get(), k = b(\"MercuryServerRequests\").get(), l = b(\"MercuryThreadInformer\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MessagingTag\"), o = b(\"copyProperties\"), p, q = [], r = h.get(\"max_sidebar_multichats\", 3);\n    function s(x) {\n        var y = m.getThreadMetaNow(x);\n        return ((((y && !y.is_canonical)) && m.canReply(x)));\n    };\n;\n    var t = i.payload;\n    if (t) {\n        k.handleUpdate(t);\n        var u = ((t.threads || []));\n        q = u.map(function(x) {\n            return x.thread_id;\n        });\n    }\n;\n;\n    if (q.length) {\n        var v = m.getThreadMetaNow(q[((q.length - 1))]);\n        p = ((v && ((v.timestamp - 1))));\n    }\n;\n;\n    if (!p) {\n        p = JSBNG__Date.now();\n    }\n;\n;\n    var w = {\n    };\n    o(w, g, {\n        getThreadIDs: function() {\n            var x = 0;\n            return q.filter(function(y) {\n                return ((((((x < r)) && s(y))) && ++x));\n            });\n        }\n    });\n    l.subscribe(\"threadlist-updated\", function() {\n        q = j.getThreadlistUntilTimestamp(p, n.INBOX, n.GROUPS).filter(s);\n        w.inform(\"update\");\n    });\n    e.exports = w;\n});\n__d(\"ChatHovercard\", [\"Arbiter\",\"AsyncLoader\",\"Hovercard\",\"JSLogger\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncLoader\"), i = b(\"Hovercard\"), j = b(\"JSLogger\"), k = b(\"debounce\"), l = 5, m = new h(\"/ajax/chat/hovercard/sidebar.php\", \"hover\"), n = j.create(\"chat_hovercard\");\n    g.subscribe(\"Hovercard/dirty\", m.reset.bind(m));\n    function o(s, t) {\n        m.get(s, function(u) {\n            (function() {\n                if (!u) {\n                    n.error(\"fetch_failure\", {\n                        id: s\n                    });\n                    return;\n                }\n            ;\n            ;\n                var v = i.getDialog(u);\n                if (!v) {\n                    n.error(\"no_hovercard\", {\n                        id: s,\n                        endpoint: u\n                    });\n                    return;\n                }\n            ;\n            ;\n                if (((s == t.getActiveID()))) {\n                    t.showHovercard(s, v);\n                }\n            ;\n            ;\n            }).defer();\n        });\n    };\n;\n    function p(s, t) {\n        var u = [];\n        function v(y) {\n            if (((((y >= 0)) && ((y < s.length))))) {\n                u.push(s[y]);\n            }\n        ;\n        ;\n        };\n    ;\n        var w = s.indexOf(t);\n        if (((w > -1))) {\n            v(w);\n            for (var x = 1; ((x < l)); x++) {\n                v(((w + x)));\n                v(((w - x)));\n            };\n        ;\n        }\n    ;\n    ;\n        return u.filter(function(y) {\n            return y;\n        });\n    };\n;\n    function q(s, t) {\n        var u = t.getActiveID();\n        if (u) {\n            var v = s.getShowingUsers(), w = p(v, u);\n            m.get(w, function() {\n            \n            });\n        }\n    ;\n    ;\n    };\n;\n    function r(s) {\n        var t = s.getHoverController();\n        t.registerDefault(o);\n        t.subscribe(\"hover\", k(q.curry(s, t), 100));\n    };\n;\n    e.exports = r;\n});\n__d(\"ChatOptions\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"PresenceUtil\",\"copyProperties\",\"ChatOptionsInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"PresenceUtil\"), k = b(\"copyProperties\"), l = i.create(\"chat_options\"), m = {\n    };\n    (function() {\n        var o = b(\"ChatOptionsInitialData\");\n        {\n            var fin243keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin243i = (0);\n            var p;\n            for (; (fin243i < fin243keys.length); (fin243i++)) {\n                ((p) = (fin243keys[fin243i]));\n                {\n                    var q = o[p];\n                    m[p] = !!q;\n                };\n            };\n        };\n    ;\n    })();\n    var n = k(new g(), {\n        getSetting: function(o) {\n            return m[o];\n        },\n        setSetting: function(o, p, q) {\n            if (((this.getSetting(o) == p))) {\n                return;\n            }\n        ;\n        ;\n            if (q) {\n                q = ((\"from_\" + q));\n                l.log(q, {\n                    JSBNG__name: o,\n                    new_value: p,\n                    old_value: this.getSetting(o)\n                });\n            }\n        ;\n        ;\n            m[o] = !!p;\n            g.inform(\"chat/option-changed\", {\n                JSBNG__name: o,\n                value: p\n            });\n        }\n    });\n    g.subscribe(h.getArbiterType(\"setting\"), function(o, p) {\n        var q = p.obj;\n        if (((q.window_id === j.getSessionID()))) {\n            return;\n        }\n    ;\n    ;\n        n.setSetting(q.setting, !!q.value, \"channel\");\n    });\n    g.subscribe(i.DUMP_EVENT, function(o, p) {\n        p.chat_options = m;\n    });\n    e.exports = n;\n});\n__d(\"ChatOrderedListHover\", [\"function-extensions\",\"ArbiterMixin\",\"ChatFavoriteList\",\"CSS\",\"ErrorUtils\",\"JSBNG__Event\",\"LayerHideOnBlur\",\"Parent\",\"copyProperties\",\"cx\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatFavoriteList\"), i = b(\"CSS\"), j = b(\"ErrorUtils\"), k = b(\"JSBNG__Event\"), l = b(\"LayerHideOnBlur\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"setTimeoutAcrossTransitions\"), q = b(\"shield\");\n    function r(u) {\n        i.addClass(u, \"fetching\");\n    };\n;\n    function s(u) {\n        i.removeClass(u, \"fetching\");\n    };\n;\n    function t(u) {\n        this._orderedList = u;\n        this._root = u.getRoot();\n        k.listen(this._root, \"mouseover\", this._mouseOver.bind(this));\n        k.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        u.subscribe(\"click\", q(this._hide, this));\n    };\n;\n    n(t.prototype, g, {\n        _root: null,\n        _activeItem: null,\n        _hideTimeout: null,\n        _showTimeout: null,\n        _showingDialog: null,\n        _showingID: null,\n        _handlers: {\n        },\n        _defaultHandler: null,\n        _mouseOver: function(JSBNG__event) {\n            if (this._paused) {\n                return;\n            }\n        ;\n        ;\n            var u = JSBNG__event.getTarget(), v = ((m.byClass(u, \"-cx-PRIVATE-fbChatOrderedList__item\") || m.byClass(u, \"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\")));\n            ((v && this._setActiveItem(v)));\n        },\n        _mouseLeave: function(JSBNG__event) {\n            this._setActiveItem(null);\n        },\n        _clearTimeouts: function() {\n            ((this._showTimeout && JSBNG__clearTimeout(this._showTimeout)));\n            this._showTimeout = null;\n            ((this._hideTimeout && JSBNG__clearTimeout(this._hideTimeout)));\n            this._hideTimeout = null;\n        },\n        _hide: function() {\n            if (this._showingDialog) {\n                this._showingDialog.hide();\n                this._showingDialog = null;\n                this._showingID = null;\n            }\n        ;\n        ;\n        },\n        _show: function() {\n            var u = this.getActiveID(), v = false;\n            if (this._handlers[u]) {\n                v = true;\n                j.applyWithGuard(this._handlers[u], {\n                }, [u,this,]);\n            }\n             else if (this._defaultHandler) {\n                v = true;\n                j.applyWithGuard(this._defaultHandler, {\n                }, [u,this,]);\n            }\n            \n        ;\n        ;\n            if (((v && ((this._showingID != this.getActiveID()))))) {\n                r(this._activeItem);\n            }\n        ;\n        ;\n        },\n        _setActiveItem: function(u) {\n            if (h.isEditMode()) {\n                this._clearTimeouts();\n                this._hide();\n                return;\n            }\n        ;\n        ;\n            if (((u != this._activeItem))) {\n                this._clearTimeouts();\n                ((this._activeItem && s(this._activeItem)));\n                this._activeItem = null;\n                var v = ((u ? 0 : 100));\n                this._hideTimeout = p(function() {\n                    if (((this.getActiveID() != this._showingID))) {\n                        this._hide();\n                    }\n                ;\n                ;\n                }.bind(this), v);\n                if (u) {\n                    this._activeItem = u;\n                    var w = ((v + 500));\n                    this._showTimeout = p(function() {\n                        this._show();\n                    }.bind(this), w);\n                    this.inform(\"hover\");\n                }\n                 else this.inform(\"leave\");\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        register: function(u, v) {\n            if (!this._handlers[u]) {\n                this._handlers[u] = v;\n                return {\n                    unregister: function() {\n                        if (((u == this._showingID))) {\n                            this._hide();\n                        }\n                    ;\n                    ;\n                        delete this._handlers[u];\n                        var w = this._orderedList.getAllNodes(), x = w[u];\n                        ((x && s(x)));\n                    }.bind(this)\n                };\n            }\n        ;\n        ;\n        },\n        registerDefault: function(u) {\n            this._defaultHandler = u;\n        },\n        getActiveID: function() {\n            var u = ((this._activeItem && this._orderedList.getUserForNode(this._activeItem)));\n            return ((u || null));\n        },\n        showHovercard: function(u, v) {\n            if (((((u == this.getActiveID())) && ((u != this._showingID))))) {\n                this._clearTimeouts();\n                s(this._activeItem);\n                this._hide();\n                this._showingDialog = v;\n                this._showingID = u;\n                var w = v.subscribe(\"mouseenter\", this._setActiveItem.bind(this, this._activeItem)), x = v.subscribe(\"mouseleave\", function() {\n                    w.unsubscribe();\n                    this._setActiveItem(null);\n                }.bind(this)), y = v.subscribe(\"hide\", function() {\n                    this.inform(\"hovercard_hide\");\n                    w.unsubscribe();\n                    x.unsubscribe();\n                    y.unsubscribe();\n                }.bind(this));\n                v.enableBehavior(l).setContext(this._activeItem).setPosition(\"left\").show();\n                this.inform(\"hovercard_show\");\n            }\n        ;\n        ;\n        },\n        setPaused: function(u) {\n            this._paused = u;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatQuietLinks\", [\"JSBNG__Event\",\"DOM\",\"UserAgent\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = {\n    }, m = {\n        silenceLinks: function(q) {\n            n(q, this.removeEmptyHrefs.bind(this));\n        },\n        nukeLinks: function(q) {\n            n(q, this.removeAllHrefs.bind(this));\n        },\n        removeEmptyHrefs: function(q) {\n            o(q, function(r) {\n                return ((!r || ((r === \"#\"))));\n            });\n        },\n        removeAllHrefs: function(q) {\n            o(q);\n        },\n        removeMessagesHrefs: function(q) {\n            o(q, function(r) {\n                return ((((!r || ((r === \"#\")))) || ((r.indexOf(\"/messages/\") != -1))));\n            });\n        }\n    };\n    function n(q, r) {\n        var s = !!i.chrome(), t = ((((!!i.chrome() || ((i.ie() >= 9)))) || ((i.firefox() >= 4))));\n        if (l[h.getID(q)]) {\n            return;\n        }\n    ;\n    ;\n        l[h.getID(q)] = true;\n        if (!t) {\n            return;\n        }\n    ;\n    ;\n        if (!s) {\n            ((r && r(q)));\n            return;\n        }\n    ;\n    ;\n        g.listen(q, \"mouseover\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\");\n            if (w) {\n                var x = w.getAttribute(\"href\");\n                if (p(x)) {\n                    j.set(w, \"stashedHref\", w.getAttribute(\"href\"));\n                    w.removeAttribute(\"href\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        g.listen(q, \"mouseout\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\"), x = ((w && j.remove(w, \"stashedHref\")));\n            if (p(x)) {\n                w.setAttribute(\"href\", x);\n            }\n        ;\n        ;\n        });\n        g.listen(q, \"mousedown\", function(u) {\n            if (!u.isDefaultRequested()) {\n                return true;\n            }\n        ;\n        ;\n            var v = k.byTag(u.getTarget(), \"a\"), w = ((v && j.get(v, \"stashedHref\")));\n            if (p(w)) {\n                v.setAttribute(\"href\", w);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function o(q, r) {\n        var s = h.scry(q, \"a\");\n        if (r) {\n            s = s.filter(function(t) {\n                return r(t.getAttribute(\"href\"));\n            });\n        }\n    ;\n    ;\n        s.forEach(function(t) {\n            t.removeAttribute(\"href\");\n            t.setAttribute(\"tabindex\", 0);\n        });\n    };\n;\n    function p(q) {\n        return ((q && ((q !== \"#\"))));\n    };\n;\n    e.exports = m;\n});\n__d(\"ChatSidebarThreadlist.react\", [\"ChatConfig\",\"ChatGroupThreadsController\",\"ChatSidebarConstants\",\"ChatSidebarItem.react\",\"ChatSidebarThread.react\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",\"copyProperties\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfig\"), h = b(\"ChatGroupThreadsController\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarItem.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MercuryParticipants\"), o = b(\"PresenceStatus\"), p = b(\"React\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"fbt\"), t = b(\"ix\"), u = p.createClass({\n        displayName: \"ChatSidebarThreadlist\",\n        render: function() {\n            var v = this.state.threadData, w = this.state.participantData, x = i.IMAGE_SIZE, y = t(\"/images/chat/sidebar/newGroupChat.png\");\n            if (this.props.litestandSidebar) {\n                x = ((g.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE));\n                y = ((g.get(\"litestand_blended_sidebar\") ? t(\"/images/litestand/sidebar/blended/new_group_chat.png\") : t(\"/images/chat/sidebar/newGroupChatLitestand.png\")));\n            }\n        ;\n        ;\n            var z = \"New Group Chat...\";\n            z = g.get(\"divebar_group_new_button_name\", z);\n            var aa = [];\n            if (this.props.showNewGroupsButton) {\n                aa.push(p.DOM.li({\n                    className: (((((\"-cx-PRIVATE-fbChatGroupThreadlist__item\") + ((\" \" + \"-cx-PRIVATE-chatSidebarItem__noborder\")))) + ((this.props.offlineItems ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\")) : \"\")))),\n                    key: \"new\"\n                }, j({\n                    images: y,\n                    imageSize: x,\n                    litestandSidebar: this.props.litestandSidebar,\n                    JSBNG__name: z\n                })));\n            }\n        ;\n        ;\n            var ba = {\n            };\n            {\n                var fin244keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin244i = (0);\n                var ca;\n                for (; (fin244i < fin244keys.length); (fin244i++)) {\n                    ((ca) = (fin244keys[fin244i]));\n                    {\n                        var da = v[ca], ea = da.participants.map(function(ia) {\n                            return ((w || {\n                            }))[ia];\n                        }).filter(function(ia) {\n                            return ia;\n                        }), fa = da.participants.map(function(ia) {\n                            return n.getUserID(ia);\n                        }), ga = fa.sort().join(\"|\");\n                        if (((!ba[ga] && ea.length))) {\n                            ba[ga] = 1;\n                            var ha = l.getServerThreadIDNow(ca);\n                            aa.push(p.DOM.li({\n                                className: (((((\"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\") + ((\" \" + \"-cx-PRIVATE-fbChatGroupThreadlist__item\")))) + ((this.props.offlineItems ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\")) : \"\")))),\n                                \"data-serverthreadid\": ha,\n                                \"data-threadid\": ca,\n                                key: ca\n                            }, k({\n                                image: da.image_src,\n                                imageSize: x,\n                                litestandSidebar: this.props.litestandSidebar,\n                                JSBNG__name: da.JSBNG__name,\n                                participants: ea,\n                                JSBNG__status: o.getGroup(fa),\n                                threadID: ca,\n                                unreadCount: da.unread_count\n                            })));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return p.DOM.ul(null, aa);\n        },\n        getInitialState: function() {\n            return {\n            };\n        },\n        componentWillMount: function() {\n            var v = function() {\n                this.setState(this._calculateState());\n            }.bind(this);\n            this.token = h.subscribe(\"update\", v);\n            v();\n        },\n        componentWillUnmount: function() {\n            ((this.token && this.token.unsubscribe()));\n            this.token = null;\n        },\n        _calculateState: function() {\n            var v = false, w = {\n            }, x = {\n            }, y = h.getThreadIDs(), z = y.length;\n            y.forEach(function(ba) {\n                m.getThreadMeta(ba, function(ca) {\n                    x[ba] = ca;\n                    n.getMulti(ca.participants, function(da) {\n                        delete da[n.user];\n                        if (v) {\n                            this.setState(this._calculateState());\n                        }\n                         else q(w, da);\n                    ;\n                    ;\n                        z--;\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n            if (((z === 0))) {\n                return {\n                    threadData: x,\n                    participantData: w\n                };\n            }\n             else {\n                v = true;\n                var aa = ((this.state || {\n                }));\n                return {\n                    threadData: q(aa.threadData, x),\n                    participantData: q(aa.participantData, w)\n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"runAfterScrollingStops\", [\"Arbiter\",\"JSBNG__Event\",\"Run\",\"debounceAcrossTransitions\",\"emptyFunction\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"debounceAcrossTransitions\"), k = b(\"emptyFunction\"), l = b(\"throttle\");\n    function m(x, y, z) {\n        if (((y && p[y]))) {\n            return;\n        }\n    ;\n    ;\n        if (!o) {\n            g.subscribe(\"page_transition\", w);\n            o = true;\n        }\n    ;\n    ;\n        if (!n) {\n            x();\n            return;\n        }\n    ;\n    ;\n        ((y && (p[y] = 1)));\n        q.push(x);\n        if (!z) {\n            if (s) {\n                i.onLeave(w);\n                s = false;\n            }\n        ;\n        ;\n            r.push(((q.length - 1)));\n        }\n    ;\n    ;\n    };\n;\n    var n, o, p = {\n    }, q = [], r = [], s = true, t = 500, u = j(function() {\n        n = false;\n        var x = q;\n        q = [];\n        r = [];\n        p = {\n        };\n        for (var y = 0, z = x.length; ((y < z)); ++y) {\n            x[y]();\n        ;\n        };\n    ;\n    }, t);\n    function v() {\n        n = true;\n        u();\n    };\n;\n    function w() {\n        var x = r;\n        r = [];\n        s = true;\n        for (var y = 0, z = x.length; ((y < z)); ++y) {\n            q[x[y]] = k;\n        ;\n        };\n    ;\n    };\n;\n    h.listen(window, \"JSBNG__scroll\", l.acrossTransitions(v, 250));\n    e.exports = m;\n});\n__d(\"ChatOrderedList\", [\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"CSS\",\"ChannelImplementation\",\"Chat\",\"ChatConfig\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatFavoriteNux\",\"ChatGroupThreadsController\",\"ChatOrderedListHover\",\"ChatQuietLinks\",\"ChatSidebarThreadlist.react\",\"ChatTypeaheadConstants\",\"ChatVisibility\",\"DOM\",\"DataStore\",\"Ease\",\"JSBNG__Event\",\"ImageSourceRequest\",\"ImageSourceType\",\"JSLogger\",\"JSXDOM\",\"LastMobileActiveTimes\",\"MercuryParticipantTypes\",\"MercuryThreadInformer\",\"MercuryThreads\",\"OrderedFriendsList\",\"Parent\",\"PhotoResizeModeConst\",\"PresencePrivacy\",\"React\",\"JSBNG__Rect\",\"ShortProfiles\",\"Style\",\"Tooltip\",\"TypeaheadUtil\",\"URI\",\"Vector\",\"XHPTemplate\",\"copyProperties\",\"createObjectFrom\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"guid\",\"JSBNG__requestAnimationFrame\",\"runAfterScrollingStops\",\"shield\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AvailableList\"), m = b(\"AvailableListConstants\"), n = b(\"Bootloader\"), o = b(\"CSS\"), p = b(\"ChannelImplementation\").instance, q = b(\"Chat\"), r = b(\"ChatConfig\"), s = b(\"ChatContexts\"), t = b(\"ChatFavoriteList\"), u = b(\"ChatFavoriteNux\"), v = b(\"ChatGroupThreadsController\"), w = b(\"ChatOrderedListHover\"), x = b(\"ChatQuietLinks\"), y = b(\"ChatSidebarThreadlist.react\"), z = b(\"ChatTypeaheadConstants\"), aa = b(\"ChatVisibility\"), ba = b(\"DOM\"), ca = b(\"DataStore\"), da = b(\"Ease\"), ea = b(\"JSBNG__Event\"), fa = b(\"ImageSourceRequest\"), ga = b(\"ImageSourceType\"), ha = b(\"JSLogger\"), ia = b(\"JSXDOM\"), ja = b(\"LastMobileActiveTimes\"), ka = b(\"MercuryParticipantTypes\"), la = b(\"MercuryThreadInformer\").get(), ma = b(\"MercuryThreads\").get(), na = b(\"OrderedFriendsList\"), oa = b(\"Parent\"), pa = b(\"PhotoResizeModeConst\"), qa = b(\"PresencePrivacy\"), ra = b(\"React\"), sa = b(\"JSBNG__Rect\"), ta = b(\"ShortProfiles\"), ua = b(\"Style\"), va = b(\"Tooltip\"), wa = b(\"TypeaheadUtil\"), xa = b(\"URI\"), ya = b(\"Vector\"), za = b(\"XHPTemplate\"), ab = b(\"copyProperties\"), bb = b(\"createObjectFrom\"), cb = b(\"csx\"), db = b(\"cx\"), eb = b(\"debounceAcrossTransitions\"), fb = b(\"guid\"), gb = b(\"JSBNG__requestAnimationFrame\"), hb = b(\"runAfterScrollingStops\"), ib = b(\"shield\"), jb = b(\"throttle\"), kb = b(\"tx\"), lb = r.get(\"chat_ranked_by_coefficient\", 0), mb = null, nb, ob, pb = 9;\n    function qb(xb, yb, zb, ac, bc, cc) {\n        this._isSidebar = xb;\n        this._isLitestand = ((r.get(\"litestand\", 0) || r.get(\"test_litestand_sidebar\", 0)));\n        this._isLitestandSidebar = ((this._isSidebar && this._isLitestand));\n        this._hasChatFlyout = ((this._isSidebar && r.get(\"litestand_sidebar_chat_flyout\", 0)));\n        this._isSidebarFlyout = !!oa.byClass(yb, \"-cx-PUBLIC-litestandSidebarChatFlyout__root\");\n        this._isLeftCollapsedSidebar = !!oa.byClass(yb, \"-cx-PUBLIC-litestandLeftSidebar__root\");\n        this._root = yb;\n        this._itemsMap = {\n        };\n        this._isVisible = false;\n        this._excludedIds = {\n        };\n        this._numTopFriends = 5;\n        this._hasRendered = false;\n        this._preventRendering = false;\n        this._hoverController = null;\n        this._template = zb;\n        this._messageTemplate = ac;\n        this._favoriteMode = r.get(\"divebar_favorite_list\", 0);\n        this._contextualDialog = bc;\n        this._cachedItemHeight = null;\n        this._cachedItemPadding = null;\n        if (((cc && ba.scry(cc, \".-cx-PRIVATE-litestandSidebarPYMK__unit\").length))) {\n            o.show(cc);\n            this._pymk = cc;\n        }\n    ;\n    ;\n        this._usePlaceholder = ((this._isLitestand && this._isSidebar));\n        if (r.get(\"groups_in_divebar\")) {\n            this._groupThreadsNode = ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupthreads\"\n            });\n            this._updateGroupThreads();\n            this._groupsList = ((this._favoriteMode && ba.JSBNG__find(this._root, \".-cx-PRIVATE-fbChat__groupslist\")));\n        }\n    ;\n    ;\n        if (this._favoriteMode) {\n            this._favoriteSidebar = ba.JSBNG__find(this._root, \".-cx-PUBLIC-fbChatOrderedList__favoritesidebar\");\n            this._editButton = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__friendsstickyarea .-cx-PRIVATE-fbChat__editbutton\")[0];\n            this._favoriteList = ba.JSBNG__find(this._root, \".-cx-PRIVATE-fbChat__favoritelist\");\n            this._activeNowList = ba.JSBNG__find(this._root, \".-cx-PRIVATE-fbChat__activenowlist\");\n            this._activeNowLabel = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__activenowlabel\")[0];\n            if (this._activeNowLabel) {\n                this._activeNowArea = oa.byClass(this._activeNowLabel, \"-cx-PRIVATE-fbChatOrderedList__activenowlabelcontainer\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (this._hasChatFlyout) {\n            this._sidebarFlyoutItemContainer = ba.JSBNG__find(this._root, \".-cx-PRIVATE-fbChatOrderedList__flyoutitem\");\n        }\n    ;\n    ;\n        this._orderedList = ba.JSBNG__find(this._root, \".fbChatOrderedList\");\n        this._scrollableOrderedList = oa.byClass(this._root, \"scrollableOrderedList\");\n        this._chatSidebar = oa.byClass(this._root, \"fbChatSidebar\");\n        this._scrollableArea = oa.byClass(this._root, \"scrollable\");\n        ea.listen(this._root, \"click\", this._onClick.bind(this));\n        ea.listen(this._root, \"mouseenter\", this._mouseEnter.bind(this));\n        ea.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        if (this._editButton) {\n            ea.listen(this._editButton, \"click\", this.toggleEditMode.bind(this));\n            h.subscribe([\"LitestandSidebarBookmarks/close\",\"LitestandSidebar/collapse\",], this._onEditEnd.bind(this));\n        }\n    ;\n    ;\n        h.subscribe([\"LitestandSidebar/collapse\",\"LitestandSidebar/expand\",], function(JSBNG__event) {\n            if (this._isLitestandSidebar) {\n                this.getHoverController().setPaused(((JSBNG__event === \"LitestandSidebar/collapse\")));\n            }\n        ;\n        ;\n            this.render();\n        }.bind(this));\n        l.subscribe(m.ON_AVAILABILITY_CHANGED, ib(this.update, this));\n        qa.subscribe(\"privacy-changed\", ib(this.update, this));\n        p.subscribe([p.CONNECTED,p.RECONNECTING,p.SHUTDOWN,p.MUTE_WARNING,p.UNMUTE_WARNING,], ib(this.update, this));\n        this.inform(\"initialized\", this, h.BEHAVIOR_PERSISTENT);\n        this.render();\n        h.subscribe(ha.DUMP_EVENT, function(dc, ec) {\n            ec.chat_lists = ((ec.chat_lists || {\n                sorted_list: this.getCachedSortedList(),\n                ordered_list: na.getList(),\n                available_list: qb.getAvailableList(this._excludedIds),\n                excluded_list: this._excludedIds\n            }));\n        }.bind(this));\n        h.subscribe(\"ChatOrderedList/itemHeightChange\", function() {\n            this._cachedItemHeight = null;\n            this._cachedItemPadding = null;\n        }.bind(this));\n        this._renderUnreadCount = r.get(\"divebar_message_count\");\n        if (this._renderUnreadCount) {\n            la.subscribe(\"threads-updated\", function(dc, ec) {\n                {\n                    var fin245keys = ((window.top.JSBNG_Replay.forInKeys)((ec))), fin245i = (0);\n                    var fc;\n                    for (; (fin245i < fin245keys.length); (fin245i++)) {\n                        ((fc) = (fin245keys[fin245i]));\n                        {\n                            var gc = ma.getCanonicalUserInThread(fc);\n                            if (((((!this._renderedTopUsers || !((gc in this._renderedTopUsers)))) || !this._itemsMap[gc]))) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            ma.getThreadMeta(fc, function(hc) {\n                                var ic = ((hc && hc.unread_count));\n                                this._updateUnreadCount(gc, ic);\n                            }.bind(this));\n                        };\n                    };\n                };\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    function rb(xb, yb) {\n        var zb = sb(xb, yb);\n        if (((zb !== 0))) {\n            return zb;\n        }\n    ;\n    ;\n        if (!lb) {\n            var ac = vb(xb, yb);\n            if (((ac !== 0))) {\n                return ac;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return na.compare(xb, yb);\n    };\n;\n    function sb(xb, yb) {\n        var zb = qa.allows(xb), ac = qa.allows(yb);\n        if (((zb !== ac))) {\n            return ((zb ? -1 : 1));\n        }\n    ;\n    ;\n        return 0;\n    };\n;\n    var tb = {\n    };\n    function ub(xb) {\n        return ((tb[xb] || (tb[xb] = wa.flatten(xb))));\n    };\n;\n    function vb(xb, yb) {\n        var zb = ta.getNowUnsafe(xb), ac = ta.getNowUnsafe(yb), bc = ub(((((zb || {\n        })).JSBNG__name || \"~\"))), cc = ub(((((ac || {\n        })).JSBNG__name || \"~\")));\n        if (((bc !== cc))) {\n            return ((((bc < cc)) ? -1 : 1));\n        }\n    ;\n    ;\n        return 0;\n    };\n;\n    function wb(xb, yb) {\n        var zb = ((l.get(xb) === m.MOBILE)), ac = ((l.get(yb) === m.MOBILE));\n        if (((zb !== ac))) {\n            return ((ac ? -1 : 1));\n        }\n    ;\n    ;\n        return vb(xb, yb);\n    };\n;\n    ab(qb, {\n        CONTEXT_CLASSES: {\n            nearby: \"-cx-PRIVATE-fbChatOrderedList__contextnearby\",\n            visiting: \"-cx-PRIVATE-fbChatOrderedList__contextvisiting\",\n            neighbourhood: \"-cx-PRIVATE-fbChatOrderedList__contextneighbourhood\",\n            listening: \"-cx-PRIVATE-fbChatOrderedList__contextlistening\"\n        },\n        getSortedList: function(xb, yb) {\n            var zb = na.getList().filter(function(cc) {\n                return ((!((cc in xb)) && ((qa.getFriendVisibility(cc) !== qa.BLACKLISTED))));\n            }), ac = [];\n            if (!aa.isOnline()) {\n                Array.prototype.push.apply(ac, zb);\n            }\n             else {\n                if (((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST))) {\n                    zb = this._filterByWhitelist(zb);\n                }\n            ;\n            ;\n                if (r.get(\"chat_web_ranking_with_presence\")) {\n                    Array.prototype.push.apply(ac, zb);\n                }\n                 else ac = this._splitOutTopFriends(zb, yb);\n            ;\n            ;\n            }\n        ;\n        ;\n            ac = ac.slice(0, yb);\n            if (((ac.length === yb))) {\n                var bc = qb.getAvailableList(ac.concat(xb)).length;\n                ((bc && ac.splice(-1)));\n            }\n        ;\n        ;\n            if (!r.get(\"chat_web_ranking_with_presence\")) {\n                ac.sort(rb);\n            }\n        ;\n        ;\n            mb = ac.slice();\n            return ac;\n        },\n        _filterByWhitelist: function(xb) {\n            var yb = xb, zb = {\n            }, ac, bc;\n            xb = [];\n            for (ac = 0; ((ac < yb.length)); ++ac) {\n                bc = yb[ac];\n                if (qa.allows(bc)) {\n                    zb[bc] = true;\n                    xb.push(bc);\n                }\n            ;\n            ;\n            };\n        ;\n            var cc = qa.getWhitelist();\n            for (ac = 0; ((ac < cc.length)); ++ac) {\n                bc = cc[ac];\n                if (!((bc in zb))) {\n                    xb.push(bc);\n                }\n            ;\n            ;\n            };\n        ;\n            for (ac = 0; ((ac < yb.length)); ++ac) {\n                bc = yb[ac];\n                if (!qa.allows(bc)) {\n                    xb.push(bc);\n                }\n            ;\n            ;\n            };\n        ;\n            return xb;\n        },\n        _splitOutTopFriends: function(xb, yb) {\n            var zb = [], ac = [], bc = r.get(\"ordered_list.top_friends\", 0), cc = r.get(\"ordered_list.top_mobile\", 0), dc = yb, ec = xb.length;\n            for (var fc = 0; ((((fc < ec)) && ((dc > 0)))); fc++) {\n                var gc = xb[fc], hc = l.get(gc), ic = ((hc === m.ACTIVE));\n                if (((((ic || ((((hc === m.MOBILE)) && ((fc < cc)))))) || ((fc < bc))))) {\n                    zb.push(gc);\n                    ((ic && dc--));\n                }\n                 else ac.push(gc);\n            ;\n            ;\n            };\n        ;\n            if (((fc < ec))) {\n                Array.prototype.push.apply(ac, xb.slice(fc));\n            }\n        ;\n        ;\n            if (((zb.length < yb))) {\n                Array.prototype.push.apply(zb, ac);\n            }\n        ;\n        ;\n            return zb;\n        },\n        getAvailableList: function(xb) {\n            var yb;\n            if (((r.get(\"divebar_show_mobile_more_friends\") || r.get(\"divebar_show_mobile_more_friends_alphabetical\")))) {\n                yb = l.getAvailableIDs();\n            }\n        ;\n        ;\n            if (!yb) {\n                yb = l.getOnlineIDs();\n            }\n        ;\n        ;\n            return yb.filter(function(zb) {\n                return !((zb in xb));\n            });\n        },\n        _pause: function() {\n            ob = true;\n        },\n        _unpause: function() {\n            ob = false;\n        },\n        _registerToggleRenderItem: function(xb) {\n            ea.listen(xb, \"click\", function() {\n                ob = !ob;\n                o.conditionClass(xb, \"checked\", ob);\n            });\n        }\n    });\n    ab(qb.prototype, i, {\n        getAllNodes: function() {\n            var xb = {\n            }, yb = ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\");\n            for (var zb = 0; ((zb < yb.length)); zb++) {\n                var ac = ca.get(yb[zb], \"id\");\n                if (ac) {\n                    xb[ac] = yb[zb];\n                }\n            ;\n            ;\n            };\n        ;\n            return xb;\n        },\n        getShowingUsers: function() {\n            return ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item,li.-cx-PRIVATE-fbChatGroupThreadlist__groupchat\").map(this.getUserForNode);\n        },\n        getUserForNode: function(xb) {\n            return ((ca.get(xb, \"id\") || ca.get(xb, \"serverthreadid\")));\n        },\n        getHoverController: function() {\n            if (!this._hoverController) {\n                this._hoverController = new w(this, this._contextualDialog);\n                if (((this._isLitestandSidebar && this._isLitestandSidebarCollapsed()))) {\n                    this._hoverController.setPaused(true);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._hoverController;\n        },\n        _isLitestandSidebarCollapsed: function() {\n            if (this._isLeftCollapsedSidebar) {\n                return true;\n            }\n        ;\n        ;\n            if (nb) {\n                return !nb.isExpanded();\n            }\n        ;\n        ;\n            n.loadModules([\"LitestandSidebar\",], function(xb) {\n                nb = xb;\n            });\n            return o.hasClass(JSBNG__document.documentElement, \"-cx-PUBLIC-hasLitestandBookmarksSidebar__collapsed\");\n        },\n        getPaddingOffset: function() {\n            return ((this._favoriteMode ? 24 : 8));\n        },\n        _calculateItemMeasurements: function() {\n            var xb = this._orderedList, yb = this._template.build(), zb = yb.getRoot();\n            ba.setContent(yb.getNode(\"JSBNG__name\"), \"test\");\n            if (this._favoriteSidebar) {\n                xb = this._favoriteList;\n                o.addClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            }\n        ;\n        ;\n            zb.style.visibility = \"hidden\";\n            ba.appendContent(xb, zb);\n            this._cachedItemHeight = ya.getElementDimensions(zb).y;\n            this._cachedItemPadding = ((ua.getFloat(yb.getNode(\"anchor\"), \"padding\") || 0));\n            ba.remove(zb);\n            if (this._favoriteSidebar) {\n                o.removeClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            }\n        ;\n        ;\n        },\n        getItemHeight: function() {\n            if (((this._cachedItemHeight === null))) {\n                this._calculateItemMeasurements();\n            }\n        ;\n        ;\n            return this._cachedItemHeight;\n        },\n        getItemPadding: function() {\n            if (((this._cachedItemPadding === null))) {\n                this._calculateItemMeasurements();\n            }\n        ;\n        ;\n            return this._cachedItemPadding;\n        },\n        _updateGroupThreads: function() {\n            if (this._groupThreadsNode) {\n                var xb = qa.getVisibility(), yb = y({\n                    offlineItems: ((p.disconnected() || !xb)),\n                    litestandSidebar: ((((((this._isSidebar && this._isLitestand)) && !r.get(\"test_old_divebar\"))) || this._isSidebarFlyout)),\n                    showNewGroupsButton: r.get(\"divebar_has_new_groups_button\", false)\n                });\n                ra.renderComponent(yb, this._groupThreadsNode);\n            }\n        ;\n        ;\n        },\n        _placeholderUpdate: function() {\n            if (((!this._usePlaceholder || !this._scrollContainer))) {\n                return;\n            }\n        ;\n        ;\n            var xb = ((this._root.offsetTop - this._scrollContainer.scrollTop));\n            this._scrollContainerHeight = ((this._scrollContainerHeight || this._scrollContainer.offsetHeight));\n            var yb = this.getItemHeight(), zb = Math.ceil(((this._scrollContainerHeight / yb))), ac = ((((xb < 0)) ? Math.max(((Math.floor(((-xb / yb))) - zb)), 0) : 0)), bc = ((((ac + zb)) + zb));\n            this._cachedItems = ((this._cachedItems || ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\")));\n            for (var cc = 0, dc = this._cachedItems.length; ((cc < dc)); cc++) {\n                o.conditionClass(this._cachedItems[cc], \"-cx-PRIVATE-fbChatOrderedList__hiddenitem\", ((((cc < ac)) || ((cc > bc)))));\n            ;\n            };\n        ;\n        },\n        _getListItem: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return;\n            }\n        ;\n        ;\n            var ac = l.get(xb), bc = ((qa.allows(xb) && !p.disconnected()));\n            if (((zb.buttonNode === undefined))) {\n                zb.buttonNode = ba.scry(zb.node, \".-cx-PRIVATE-fbChat__favoritebutton\")[0];\n                zb.contextNode = ba.JSBNG__find(zb.node, \".-cx-PRIVATE-fbChatOrderedList__context\");\n                zb.timeNode = ba.scry(zb.node, \".active_time\")[0];\n                zb.statusNodes = ba.scry(zb.node, \"img.JSBNG__status\");\n            }\n        ;\n        ;\n            o.conditionClass(zb.node, \"-cx-PRIVATE-fbChatOrderedList__isfavorite\", yb);\n            o.conditionClass(zb.node, \"-cx-PRIVATE-fbChat__isfavorite\", yb);\n            o.conditionClass(zb.node, \"-cx-PRIVATE-litestandSidebarFavorites__favorite\", ((this._isLitestand && yb)));\n            if (zb.buttonNode) {\n                if (!this._isLitestand) {\n                    o.conditionClass(zb.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__remove\", yb);\n                    o.conditionClass(zb.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__add\", !yb);\n                }\n            ;\n            }\n        ;\n        ;\n            var cc = {\n                active: false,\n                mobile: false\n            };\n            cc.active = ((ac === m.ACTIVE));\n            cc.mobile = ((ac === m.MOBILE));\n            if (cc.mobile) {\n                var dc = ja.getShortDisplay(xb);\n                if (((zb.timeNode && ((zb.lastActiveTime !== dc))))) {\n                    zb.lastActiveTime = dc;\n                    ba.setContent(zb.timeNode, dc);\n                }\n            ;\n            ;\n            }\n             else if (zb.lastActiveTime) {\n                zb.lastActiveTime = null;\n                ba.empty(zb.timeNode);\n            }\n            \n        ;\n        ;\n            {\n                var fin246keys = ((window.top.JSBNG_Replay.forInKeys)((cc))), fin246i = (0);\n                var ec;\n                for (; (fin246i < fin246keys.length); (fin246i++)) {\n                    ((ec) = (fin246keys[fin246i]));\n                    {\n                        o.conditionClass(zb.node, ec, ((cc[ec] && bc)));\n                    ;\n                    };\n                };\n            };\n        ;\n            o.conditionClass(zb.node, \"invis\", !bc);\n            zb.statusNodes.forEach(function(fc) {\n                if (((((ac === m.ACTIVE)) && bc))) {\n                    fc.alt = \"Online\";\n                }\n                 else if (((((ac === m.MOBILE)) && bc))) {\n                    fc.alt = \"Mobile\";\n                }\n                 else fc.alt = \"\";\n                \n            ;\n            ;\n            });\n            this._applyContext(xb, zb);\n            return zb.node;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getSortedList: function(xb) {\n            return qb.getSortedList(((xb || this._excludedIds)), this._numTopFriends);\n        },\n        getCachedSortedList: function(xb) {\n            if (((mb == null))) {\n                mb = this.getSortedList(xb);\n            }\n        ;\n        ;\n            return mb;\n        },\n        toggleFavoriteSidebar: function(xb, yb) {\n            function zb(cc, dc) {\n                o.conditionShow(dc, cc);\n                var ec = oa.byClass(dc, \"uiContextualLayerPositioner\");\n                ((ec && o.conditionShow(ec, cc)));\n            };\n        ;\n            o.conditionShow(this._orderedList, !xb);\n            if (this._favoriteSidebar) {\n                o.conditionShow(this._favoriteSidebar, xb);\n            }\n        ;\n        ;\n            var ac = ba.scry(((this._scrollableOrderedList || this._root)), \".-cx-PRIVATE-fbChatOrderedList__stickyarea\");\n            ac.forEach(zb.curry(xb));\n            var bc = ba.scry(((this._scrollableOrderedList || this._root)), \".-cx-PRIVATE-fbChatOrderedList__groupsstickyarea\");\n            ((bc.length && zb(yb, bc[0])));\n        },\n        hide: function() {\n            if (!this._isVisible) {\n                return;\n            }\n        ;\n        ;\n            this._isVisible = false;\n            u.tryHide();\n            o.hide(((this._scrollableOrderedList || this._root)));\n            this.inform(\"hide\");\n        },\n        _onFavoriteOrderChange: function() {\n            var xb = this.sortableGroup.getOrder();\n            t.updateList(xb);\n            t.save();\n        },\n        _getFavoriteItems: function() {\n            var xb = [], yb = t.get();\n            for (var zb = 0; ((zb < yb.length)); zb++) {\n                var ac = this._itemsMap[yb[zb]];\n                if (ac) {\n                    xb.push(ac.node);\n                }\n            ;\n            ;\n            };\n        ;\n            return xb;\n        },\n        _getChatTabOpenLogData: function(xb) {\n            var yb = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), zb = {\n                mode: ((yb ? \"JSBNG__sidebar\" : \"chatNub\")),\n                typehead: false\n            };\n            if (((this._scrollableArea && this._scrollContainer))) {\n                var ac = ya.getElementPosition(this._scrollableArea, \"viewport\").y, bc = ya.getElementPosition(xb, \"viewport\").y, cc = this._scrollContainer.scrollTop;\n                if (((bc > ac))) {\n                    zb.visible_slot = Math.round(((((bc - ac)) / 32)));\n                    var dc = Math.round(((cc / 32)));\n                    zb.global_slot = ((zb.visible_slot + dc));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (yb) {\n                zb.sidebar_height = ((this._chatSidebar && this._chatSidebar.clientHeight));\n                if (this._scrollContainer) {\n                    zb.buddylist_height = this._scrollContainer.clientHeight;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return zb;\n        },\n        _resetFavoriteBounds: function() {\n            var xb = t.get(), yb = xb.length;\n            if (yb) {\n                var zb = xb[0], ac = xb[((yb - 1))], bc = this._itemsMap[zb], cc = this._itemsMap[ac], dc = new sa(ya.getElementPosition(bc.node).y, 0, ((ya.getElementPosition(cc.node).y + ya.getElementDimensions(cc.node).y)), 0);\n                this.sortableGroup.setBoundingBox(dc);\n            }\n        ;\n        ;\n        },\n        _createSortableGroup: function() {\n            if (this.sortableGroup) {\n                this.sortableGroup.destroy();\n            }\n        ;\n        ;\n            n.loadModules([\"SortableGroup\",], function(xb) {\n                this.sortableGroup = new xb().setBeforeGrabCallback(this._resetFavoriteBounds.bind(this)).setOrderChangeHandler(this._onFavoriteOrderChange.bind(this));\n                if (this._isLitestand) {\n                    this.sortableGroup.gutter = 1;\n                }\n            ;\n            ;\n                var yb = this._getFavoriteItems();\n                for (var zb = 0; ((zb < yb.length)); zb++) {\n                    var ac = yb[zb];\n                    this.sortableGroup.addSortable(ca.get(ac, \"id\"), ac);\n                };\n            ;\n            }.bind(this));\n        },\n        toggleEditMode: function() {\n            u.dismissDialog();\n            t.toggleEditMode();\n            if (t.isEditMode()) {\n                this._createSortableGroup();\n                ba.setContent(this._editButton, \"DONE\");\n                o.addClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n                this.inform(\"editStart\");\n            }\n             else this._onEditEnd();\n        ;\n        ;\n        },\n        _onEditEnd: function() {\n            if (t.isEditMode()) {\n                t.toggleEditMode();\n            }\n        ;\n        ;\n            ba.setContent(this._editButton, \"EDIT\");\n            o.removeClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n            this.inform(\"editEnd\");\n        },\n        _onClick: function(JSBNG__event) {\n            var xb = JSBNG__event.getTarget(), yb = oa.byTag(xb, \"li\");\n            if (t.isEditMode()) {\n                var zb = oa.byClass(xb, \"-cx-PRIVATE-fbChat__favoritebutton\");\n                if (((zb && yb))) {\n                    var ac = ca.get(yb, \"id\");\n                    if (ac) {\n                        t.toggleID(ac);\n                        t.save();\n                    }\n                ;\n                ;\n                    this.update();\n                }\n            ;\n            ;\n                JSBNG__event.prevent();\n                return false;\n            }\n        ;\n        ;\n            if (yb) {\n                if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                    var bc = new xa(\"/ajax/chat/privacy/settings_dialog.php\").addQueryData({\n                        ref: \"whitelist_separator\"\n                    });\n                    j.send(new k(bc));\n                    JSBNG__event.prevent();\n                    return false;\n                }\n            ;\n            ;\n                var cc = ca.get(yb, \"id\"), dc = o.hasClass(yb, \"-cx-PRIVATE-fbChatGroupThreadlist__item\");\n                if (((cc || dc))) {\n                    var ec = this._getChatTabOpenLogData(yb), fc = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), gc = ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)), hc = ((gc ? \"white_list\" : \"ordered_list\"));\n                    if (dc) {\n                        cc = yb.getAttribute(\"data-threadid\");\n                        hc = ((cc ? \"recent_threads_in_divebar\" : \"recent_threads_in_divebar_new\"));\n                    }\n                     else if (((((fc && this._favoriteMode)) && !gc))) {\n                        while (yb.parentNode) {\n                            yb = yb.parentNode;\n                            if (o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__activenowlist\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                        ;\n                            if (o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__favoritelist\")) {\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else while (yb.previousSibling) {\n                        yb = yb.previousSibling;\n                        if (o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\")) {\n                            if (o.hasClass(yb, \"moreOnlineFriends\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                        ;\n                            if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                                hc = \"blackbird_offline_section\";\n                                break;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                    \n                ;\n                ;\n                    ec.source = hc;\n                    var ic = ((dc ? z.THREAD_TYPE : ka.FRIEND));\n                    q.openTab(cc, ic, ec);\n                    this.inform(\"click\", {\n                        id: cc\n                    });\n                }\n                 else if (((o.hasClass(yb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\") && oa.byClass(xb, \"-cx-PRIVATE-fbChatOrderedList__separatorinner\")))) {\n                    this.JSBNG__scrollTo(yb);\n                }\n                 else if (o.hasClass(yb, \"-cx-PRIVATE-litestandSidebarPYMK__root\")) {\n                    return;\n                }\n                \n                \n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n        },\n        _mouseEnter: function() {\n            this._preventRendering = true;\n        },\n        _mouseLeave: function() {\n            this._preventRendering = false;\n        },\n        setExcludedIds: function(xb) {\n            this._excludedIds = bb(((xb || [])));\n        },\n        setNumTopFriends: function(xb) {\n            if (((xb !== this._numTopFriends))) {\n                this._numTopFriends = xb;\n                this.render();\n            }\n        ;\n        ;\n        },\n        _getOfflineToSectionItems: function() {\n            var xb = ((\"subheader-text-\" + fb())), yb = ba.create(\"a\", {\n                href: \"#\",\n                \"aria-describedby\": xb\n            }, ba.tx._(\"Edit\")), zb = [], ac = ba.tx._(\"MORE FRIENDS\");\n            zb.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n            }, ac), ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n            }))))));\n            zb.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator blackbirdWhitelist\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorInner\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorSubheader\"\n            }, ia.span({\n                id: xb,\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorsubheadertext\"\n            }, kb._(\"These friends can't see you on chat. {=link}\", {\n                \"=link\": yb\n            })))))));\n            return zb;\n        },\n        _renderOrderedList: function() {\n            if (((((!this._isVisible || ((this._preventRendering && this._hasRendered)))) || ob))) {\n                return;\n            }\n        ;\n        ;\n            this._hasRendered = true;\n            this._cachedItems = null;\n            var xb = [], yb, zb, ac = false, bc = false, cc = r.get(\"divebar_has_new_groups_button\", false), dc = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), ec = qa.getVisibility(), fc = ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)), gc = ((this._isLitestandSidebar && this._isLitestandSidebarCollapsed())), hc = r.get(\"groups_in_divebar\");\n            ((hc && this._updateGroupThreads()));\n            var ic = ((hc && v.getThreadIDs().length)), jc = ((((((dc && this._favoriteMode)) && ec)) && !fc));\n            if (((((((jc && hc)) && ic)) && this._groupThreadsNode))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                x.nukeLinks(this._groupThreadsNode);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n        ;\n        ;\n            var kc = ((((jc && this._groupThreadsNode)) && this._groupsList)), lc = ((kc && ic)), mc = ((this._isLitestand && !oa.byClass(this._root, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\")));\n            if (((kc && ((ic || ((mc && cc))))))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                o.show(this._groupsList);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n             else ((this._groupsList && o.hide(this._groupsList)));\n        ;\n        ;\n            var nc = ((ic || 0));\n            if (((cc && ((lc || !jc))))) {\n                nc++;\n            }\n        ;\n        ;\n            if (((this._hasChatFlyout && this._isLitestandSidebarCollapsed()))) {\n                nc++;\n            }\n        ;\n        ;\n            var oc = [], pc, qc;\n            if (jc) {\n                ((this._chatSidebar && o.addClass(this._chatSidebar, \"fbSidebarFavoriteList\")));\n                oc = t.get();\n                if (gc) {\n                    oc = oc.slice(0, Math.max(0, ((this._numTopFriends - nc))));\n                }\n            ;\n            ;\n                for (pc = 0, qc = oc.length; ((pc < qc)); pc++) {\n                    yb = oc[pc];\n                    zb = this._getListItem(yb, true);\n                    if (zb) {\n                        xb.push(zb);\n                    }\n                     else {\n                        bc = true;\n                        this._renderListItem(yb, this.update.bind(this));\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this.toggleFavoriteSidebar(jc, lc);\n            var rc = ((gc ? 1 : 0)), sc = qb.getSortedList(bb(oc), Math.max(0, ((((((this._numTopFriends - oc.length)) - nc)) + rc))));\n            if (jc) {\n                if (((oc.length && sc.length))) {\n                    var tc = ba.create(\"li\", {\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separator\"\n                    });\n                    xb.push(tc);\n                }\n            ;\n            ;\n            }\n             else if (((ic || cc))) {\n                ((this._groupThreadsNode && xb.push(this._groupThreadsNode)));\n            }\n            \n        ;\n        ;\n            var uc = ((qa.getVisibility() && ((qa.getOnlinePolicy() == qa.ONLINE_TO_WHITELIST))));\n            for (var vc = 0, wc = sc.length; ((vc < wc)); vc++) {\n                yb = sc[vc];\n                if (uc) {\n                    if (!qa.allows(yb)) {\n                        if (((((vc + 2)) >= sc.length))) {\n                            break;\n                        }\n                    ;\n                    ;\n                        uc = false;\n                        var xc = this._getOfflineToSectionItems();\n                        xb.push(xc[0]);\n                        xb.push(xc[1]);\n                        wc -= 2;\n                    }\n                ;\n                }\n            ;\n            ;\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            ;\n            };\n        ;\n            if (jc) {\n                ba.setContent(this._favoriteList, xb);\n                if (xb.length) {\n                    x.nukeLinks(this._favoriteList);\n                }\n            ;\n            ;\n                this.inform(\"render\");\n            }\n        ;\n        ;\n            var yc;\n            if (gc) {\n                yc = [];\n            }\n             else yc = qb.getAvailableList(this._excludedIds);\n        ;\n        ;\n            var zc = oc.concat(sc), ad = bb(zc);\n            yc = yc.filter(function(jd) {\n                return !((jd in ad));\n            });\n            if (this._renderUnreadCount) {\n                var bd = [];\n                if (this._renderedTopUsers) {\n                    var cd = Object.keys(this._renderedTopUsers).filter(function(jd) {\n                        return !((jd in ad));\n                    });\n                    cd.forEach(function(jd) {\n                        this._updateUnreadCount(jd, 0);\n                    }.bind(this));\n                    zc.forEach(function(jd) {\n                        if (!((jd in this._renderedTopUsers))) {\n                            bd.push(jd);\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n                 else bd = zc;\n            ;\n            ;\n                bd.forEach(function(jd) {\n                    ma.getThreadMeta(ma.getThreadIdForUser(jd), function(kd) {\n                        this._updateUnreadCount(jd, ((kd && kd.unread_count)));\n                    }.bind(this));\n                }.bind(this));\n                this._renderedTopUsers = ad;\n            }\n        ;\n        ;\n            if (r.get(\"divebar_show_mobile_more_friends_alphabetical\")) {\n                yc.sort(vb);\n            }\n             else yc.sort(wb);\n        ;\n        ;\n            var dd = \"MORE FRIENDS\";\n            if (jc) {\n                xb = [];\n            }\n             else if (((yc.length && xb.length))) {\n                var ed;\n                if (this._isLitestand) {\n                    ed = ia.span(null, ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                    }, dd, \" \\u00b7 \", yc.length), ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                    }, \" +\", yc.length));\n                }\n                 else ed = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                    \"MORE ONLINE FRIENDS\": dd,\n                    \"=count\": yc.length\n                });\n            ;\n            ;\n                if (this._pymk) {\n                    ac = true;\n                    xb.push(this._pymk);\n                }\n            ;\n            ;\n                xb.push(ia.li({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator moreOnlineFriends\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n                }, ed), ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n                }))))));\n            }\n            \n        ;\n        ;\n            for (pc = 0, qc = yc.length; ((pc < qc)); pc++) {\n                yb = yc[pc];\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            ;\n            };\n        ;\n            if (((((!sc.length && !yc.length)) && !nc))) {\n                var fd = this._messageTemplate.render(), gd = za.getNode(fd, \"message\");\n                ba.setContent(gd, \"No one is available to chat.\");\n                xb.push(fd);\n            }\n        ;\n        ;\n            if (this._hasChatFlyout) {\n                var hd = ((this._isLitestandSidebarCollapsed() ? this._getSidebarFlyoutItem() : null));\n                ba.setContent(this._sidebarFlyoutItemContainer, hd);\n            }\n        ;\n        ;\n            if (xb.length) {\n                if (jc) {\n                    o.show(this._activeNowList);\n                    if (this._activeNowLabel) {\n                        var id;\n                        o.show(this._activeNowArea);\n                        if (this._isLitestand) {\n                            id = ia.span(null, ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                            }, dd, \" \\u00b7 \", yc.length), ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                            }, \" +\", yc.length));\n                        }\n                         else id = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                            \"MORE ONLINE FRIENDS\": \"ACTIVE NOW\",\n                            \"=count\": yc.length\n                        });\n                    ;\n                    ;\n                        ba.setContent(this._activeNowLabel, id);\n                    }\n                ;\n                ;\n                    ba.setContent(this._activeNowList, xb);\n                    x.nukeLinks(this._activeNowList);\n                }\n                 else {\n                    if (((this._pymk && !ac))) {\n                        xb.push(this._pymk);\n                    }\n                ;\n                ;\n                    ba.setContent(this._orderedList, xb);\n                    if (this._pymk) {\n                        x.removeMessagesHrefs(this.getRoot());\n                    }\n                     else x.nukeLinks(this.getRoot());\n                ;\n                ;\n                }\n            ;\n            ;\n                this.inform(\"render\");\n                this._placeholderUpdate();\n                if (!this._renderingAfterScroll) {\n                    this._renderingAfterScroll = true;\n                    this.render = eb(hb.curry(this._renderOrderedList.bind(this), \"ChatOrderedList/render\", true), 300);\n                }\n            ;\n            ;\n            }\n             else if (jc) {\n                o.hide(this._activeNowList);\n                if (this._activeNowArea) {\n                    o.hide(this._activeNowArea);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (jc) {\n                ((this._editButton && u.tryShow(this._editButton)));\n            }\n             else u.tryHide();\n        ;\n        ;\n            if (((jc && !bc))) {\n                if (((t.isEditMode() && t.hasChanged()))) {\n                    this._createSortableGroup();\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        render: function() {\n            this.render = eb(this._renderOrderedList.bind(this), 300);\n            this.render();\n        },\n        _renderListItem: function(xb, yb) {\n            ta.get(xb, function(zb) {\n                var ac = this._template.render(), bc = za.getNode(ac, \"profile-photo\");\n                if (r.get(\"chat_use_client_side_image_requests\", 0)) {\n                    var cc = ((this._isLitestand ? 24 : 28));\n                    new fa().setFBID(zb.id).setType(ga.PROFILE_PICTURE).setDimensions(cc, cc).setResizeMode(pa.COVER).setCallback(function(hc) {\n                        bc.setAttribute(\"src\", hc.uri);\n                    }).send();\n                }\n                 else bc.setAttribute(\"src\", zb.thumbSrc);\n            ;\n            ;\n                var dc = za.getNode(ac, \"JSBNG__name\");\n                ba.setContent(dc, zb.JSBNG__name);\n                var ec = za.getNode(ac, \"accessible-name\");\n                ba.setContent(ec, zb.JSBNG__name);\n                var fc = za.getNode(ac, \"anchor\");\n                fc.setAttribute(\"href\", ((\"/messages/\" + xb)));\n                var gc = za.getNode(ac, \"tooltip\");\n                ((gc && va.set(gc, zb.JSBNG__name, \"right\")));\n                ca.set(ac, \"id\", xb);\n                this._itemsMap[xb] = {\n                    node: ac\n                };\n                ((yb && yb(ac)));\n            }.bind(this));\n        },\n        _updateUnreadCount: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return;\n            }\n        ;\n        ;\n            if (this._isSidebar) {\n                this._unreadMessages = ((this._unreadMessages || {\n                }));\n                if (!!yb) {\n                    this._unreadMessages[xb] = true;\n                }\n                 else delete this._unreadMessages[xb];\n            ;\n            ;\n                h.inform(\"buddylist-nub/updateCount\", {\n                    count: Object.keys(this._unreadMessages).length\n                });\n            }\n        ;\n        ;\n            zb.unreadCount = ((zb.unreadCount || ba.JSBNG__find(zb.node, \".-cx-PRIVATE-fbChatOrderedList__unreadcount\")));\n            yb = ((yb ? yb : 0));\n            ba.setContent(zb.unreadCount, ((((yb > pb)) ? ((pb + \"+\")) : yb)));\n            o.conditionClass(zb.unreadCount, \"-cx-PRIVATE-fbChatOrderedList__largecount\", ((yb > pb)));\n            o.conditionClass(zb.node, \"-cx-PRIVATE-fbChatOrderedList__hasunreadcount\", yb);\n        },\n        _getSidebarFlyoutItem: function() {\n            if (this._flyoutItem) {\n                return this._flyoutItem;\n            }\n        ;\n        ;\n            this._flyoutItem = (ia.li({\n                className: \"-cx-PRIVATE-litestandSidebarChatFlyoutItem__root\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-litestandSidebarChatFlyoutItem__img\"\n            })));\n            ea.listen(this._flyoutItem, \"mouseenter\", function() {\n                var yb = ia.span(null, \"Chat\", \" \\u00b7 \", l.getOnlineCount());\n                if (((this._flyoutInstance && this._flyoutInstance.isShown()))) {\n                    va.remove(this._flyoutItem);\n                }\n                 else va.set(this._flyoutItem, yb, \"right\");\n            ;\n            ;\n            }.bind(this));\n            var xb = this._showLitestandChatFlyout.bind(this);\n            h.subscribe(\"ChatBeeper/clicked\", xb);\n            ea.listen(this._flyoutItem, \"click\", xb);\n            return this._flyoutItem;\n        },\n        _showLitestandChatFlyout: function() {\n            if (this._loadingFlyout) {\n                return;\n            }\n        ;\n        ;\n            if (this._flyoutInstance) {\n                this._flyoutInstance.toggle();\n                return;\n            }\n        ;\n        ;\n            this._loadingFlyout = true;\n            new k(\"/ajax/chat/litestand_flyout\").setData({\n                contextID: ba.getID(this._flyoutItem)\n            }).setAllowCrossPageTransition(true).send();\n            var xb = h.subscribe(\"LitestandChatSidebarFlyout/init\", function(yb, zb) {\n                this._flyoutInstance = zb;\n                this._loadingFlyout = false;\n                xb.unsubscribe();\n                this.subscribe(\"render\", zb.contextPositionInvalidated.bind(zb));\n            }.bind(this));\n        },\n        show: function() {\n            if (this._isVisible) {\n                return;\n            }\n        ;\n        ;\n            this._isVisible = true;\n            o.show(((this._scrollableOrderedList || this._root)));\n            this.render();\n            this.inform(\"show\");\n        },\n        isVisible: function() {\n            return this._isVisible;\n        },\n        update: function() {\n            this._hasRendered = false;\n            if (!this._renderRequest) {\n                this._renderRequest = gb(function() {\n                    this.render();\n                    this._renderRequest = null;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        setScrollContainer: function(xb) {\n            if (ba.contains(xb, this._root)) {\n                this._scrollContainer = xb;\n                if (this._usePlaceholder) {\n                    ea.listen(xb, \"JSBNG__scroll\", jb.acrossTransitions(this._placeholderUpdate.bind(this)));\n                    ea.listen(window, \"resize\", jb.acrossTransitions(function() {\n                        this._scrollContainerHeight = null;\n                        this._placeholderUpdate();\n                    }.bind(this), 250));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        JSBNG__scrollTo: function(xb) {\n            if (!this._scrollContainer) {\n                return;\n            }\n        ;\n        ;\n            var yb = this._scrollContainer.scrollHeight, zb = this._scrollContainer.clientHeight, ac = this._scrollContainer.scrollTop, bc = Math.min(xb.offsetTop, ((yb - zb)));\n            if (((ac !== bc))) {\n                var cc = ((this._isLitestand ? 600 : ((((Math.abs(((bc - ac))) / this._scrollContainer.clientHeight)) * 500)))), dc = ((this._isLitestand ? da.easeOutExpo : g.ease.end));\n                new g(this._scrollContainer).to(\"scrollTop\", bc).ease(dc).duration(cc).go();\n            }\n        ;\n        ;\n        },\n        _applyContext: function(xb, yb) {\n            var zb = ((s.getShortDisplay(xb) || \"\"));\n            if (yb.contextNode) {\n                ba.setContent(yb.contextNode, zb);\n                o.conditionClass(yb.node, \"-cx-PRIVATE-fbChatOrderedList__hascontext\", zb);\n                var ac = s.get(xb), bc = ((ac ? ac.type : null));\n                {\n                    var fin247keys = ((window.top.JSBNG_Replay.forInKeys)((qb.CONTEXT_CLASSES))), fin247i = (0);\n                    var cc;\n                    for (; (fin247i < fin247keys.length); (fin247i++)) {\n                        ((cc) = (fin247keys[fin247i]));\n                        {\n                            var dc = ((cc === bc)), ec = ((qb.CONTEXT_CLASSES[cc] || \"-cx-PRIVATE-fbChatOrderedList__contextother\"));\n                            o.conditionClass(yb.contextNode, ec, dc);\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = qb;\n});\n__d(\"TypingDetectorController\", [\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"ChannelConnection\",\"ChatVisibility\",\"Keys\",\"PresencePrivacy\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChannelConnection\"), k = b(\"ChatVisibility\"), l = b(\"Keys\"), m = b(\"PresencePrivacy\"), n = b(\"ShortProfiles\"), o = b(\"TypingDetector\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"shield\");\n    function s(u) {\n        if (!k.isOnline()) {\n            return false;\n        }\n    ;\n    ;\n        if (u) {\n            var v = n.getNow(u);\n            return ((((v && ((v.type == \"friend\")))) && m.allows(u)));\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function t(u, v, w, x, y) {\n        this.userID = u;\n        this.input = v;\n        this.source = w;\n        this.threadID = y;\n        this.remoteState = o.INACTIVE;\n        this.notifyTimer = null;\n        x = ((x || {\n        }));\n        this.notifyDelay = ((x.notifyDelay || this.notifyDelay));\n        this._typingDetector = new o(v);\n        this._typingDetector.init(x);\n        this._typingDetector.subscribe(\"change\", this._stateChange.bind(this));\n    };\n;\n    p(t.prototype, {\n        notifyDelay: 1000,\n        setUserAndThread: function(u, v) {\n            if (((((this.userID !== u)) || ((this.threadID !== v))))) {\n                this.resetState();\n                this.userID = u;\n                this.threadID = v;\n            }\n        ;\n        ;\n        },\n        setIgnoreEnter: function(u) {\n            var v = ((u ? [l.RETURN,] : []));\n            this._typingDetector.setIgnoreKeys(v);\n        },\n        resetState: function() {\n            this.remoteState = t.INACTIVE;\n            this._typingDetector.reset();\n            JSBNG__clearTimeout(this.notifyTimer);\n            this.notifyTimer = null;\n        },\n        _stateChange: function(u, v) {\n            if (((v != o.QUITTING))) {\n                JSBNG__clearTimeout(this.notifyTimer);\n                this.notifyTimer = r(this._notifyState, this, v).defer(this.notifyDelay, false);\n            }\n             else this._notifyState(v, true);\n        ;\n        ;\n        },\n        _notifyState: function(u, v) {\n            if (((!this.userID && !this.threadID))) {\n                return;\n            }\n        ;\n        ;\n            var w = this.userID, x = s(w);\n            if (((x && ((u != this.remoteState))))) {\n                this.remoteState = u;\n                if (j.disconnected()) {\n                    return;\n                }\n            ;\n            ;\n                var y = {\n                    typ: u,\n                    to: w,\n                    source: this.source,\n                    thread: this.threadID\n                };\n                new g().setHandler(this._onTypResponse.bind(this, w)).setErrorHandler(q).setData(y).setURI(\"/ajax/messaging/typ.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", !v).send();\n            }\n        ;\n        ;\n        },\n        _onTypResponse: function(u, v) {\n            var w = ((v.getPayload() || {\n            }));\n            if (w.offline) {\n                h.set(u, i.OFFLINE, \"typing_response\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatBehavior\", [\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"ChatConfig\",\"copyProperties\",\"MercuryConstants\",\"ChatSidebarCalloutData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChatConfig\"), k = b(\"copyProperties\"), l = b(\"MercuryConstants\").ChatNotificationConstants, m = b(\"ChatSidebarCalloutData\").isShown, n = h.getWebChatNotification(), o = m, p = true, q = k(new g(), {\n        ON_CHANGED: \"changed\",\n        notifiesUserMessages: function() {\n            return ((n !== l.NO_USER_MESSAGE_NOTIFICATION));\n        },\n        ignoresRemoteTabRaise: function() {\n            return o;\n        },\n        showsTabUnreadUI: function() {\n            if (j.get(\"web_messenger_suppress_tab_unread\")) {\n                return p;\n            }\n        ;\n        ;\n            return true;\n        }\n    });\n    function r() {\n        q.inform(q.ON_CHANGED);\n    };\n;\n    h.subscribe(i.ON_CHAT_NOTIFICATION_CHANGED, function() {\n        var s = n, t = h.getWebChatNotification();\n        n = t;\n        if (((s != t))) {\n            r();\n        }\n    ;\n    ;\n    });\n    g.subscribe(\"chat/set_does_page_occlude_tabs\", function(s, t) {\n        o = !!t;\n        r();\n    });\n    g.subscribe(\"chat/set_show_tab_unread_ui\", function(s, t) {\n        p = !!t;\n        r();\n    });\n    e.exports = q;\n});\n__d(\"ChatSidebarSheet\", [\"JSXDOM\",\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSLogger\",\"PresencePrivacy\",\"Tooltip\",\"csx\",\"cx\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var i = b(\"ArbiterMixin\"), j = b(\"BlackbirdUpsell\"), k = b(\"ChannelConnection\"), l = b(\"ChannelConstants\"), m = b(\"ChatBehavior\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"JSLogger\"), s = b(\"PresencePrivacy\"), t = b(\"Tooltip\"), u = b(\"csx\"), v = b(\"cx\"), w = b(\"copyProperties\"), x = b(\"tx\"), y = r.create(\"sidebar_sheet\");\n    function z(ca) {\n        switch (ca) {\n          case l.HINT_AUTH:\n            return \"Your session has timed out. Please log in.\";\n          case l.HINT_CONN:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n          case l.HINT_MAINT:\n            return x._(\"Facebook {Chat} is currently down for maintenance.\", {\n                Chat: \"Chat\"\n            });\n          default:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n        };\n    ;\n    };\n;\n    function aa(ca) {\n        var da;\n        if (((ca === null))) {\n            da = \"Unable to connect to chat. Check your Internet connection.\";\n        }\n         else if (((ca > n.get(\"warning_countdown_threshold_msec\")))) {\n            var ea = q.create(\"a\", {\n                href: \"#\",\n                className: \"fbChatReconnectLink\"\n            }, \"Try again\");\n            da = q.tx._(\"Unable to connect to chat. {try-again-link}\", {\n                \"try-again-link\": ea\n            });\n        }\n         else if (((ca > 1000))) {\n            da = x._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                seconds: Math.floor(((ca / 1000)))\n            });\n        }\n         else da = \"Unable to connect to chat. Reconnecting...\";\n        \n        \n    ;\n    ;\n        return da;\n    };\n;\n    function ba(ca) {\n        this._root = ca;\n        this._litestandOffline = q.scry(ca, \".-cx-PRIVATE-fbChatSidebarOffline__placeholder\");\n        this._message = q.JSBNG__find(ca, \"div.fbChatSidebarMessage div.message\");\n        k.subscribe([k.CONNECTED,k.SHUTDOWN,k.RECONNECTING,], this._handleConnectionChange.bind(this));\n        k.subscribe([k.MUTE_WARNING,k.UNMUTE_WARNING,], this._render.bind(this));\n        s.subscribe(\"privacy-user-presence-changed\", this._render.bind(this));\n        m.subscribe(m.ON_CHANGED, this._render.bind(this));\n        this._render();\n    };\n;\n    w(ba.prototype, i, {\n        _channelStatus: null,\n        _channelData: null,\n        _handleConnectionChange: function(ca, da) {\n            this._channelStatus = ca;\n            this._channelData = da;\n            this._render();\n        },\n        _showWarningTimeout: null,\n        _warningMsgEventListener: null,\n        _renderChannelDisconnect: function() {\n            if (((this._channelStatus === k.SHUTDOWN))) {\n                return q.setContent(this._message, z(this._channelData));\n            }\n             else if (((this._channelStatus === k.RECONNECTING))) {\n                var ca = this._channelData;\n                q.setContent(this._message, aa(ca));\n                if (((ca > 1000))) {\n                    if (((ca > n.get(\"warning_countdown_threshold_msec\")))) {\n                        this._warningMsgEventListener = h.listen(this._message, \"click\", function(JSBNG__event) {\n                            if (p.hasClass(JSBNG__event.getTarget(), \"fbChatReconnectLink\")) {\n                                k.reconnect();\n                                return false;\n                            }\n                        ;\n                        ;\n                        });\n                    }\n                ;\n                ;\n                    this._showWarningTimeout = JSBNG__setTimeout(this._handleConnectionChange.bind(this, k.RECONNECTING, ((ca - 1000))), 1000, false);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n        },\n        _goOnlineEventListener: null,\n        _renderOffline: function() {\n            if (this._isLitestand) {\n                return;\n            }\n        ;\n        ;\n            if (((this._litestandOffline && this._litestandOffline.length))) {\n                this._renderLitestandOffline();\n            }\n        ;\n        ;\n            var ca = \"fbChatGoOnlineLink\", da = \"Turn on chat\", ea = q.create(\"a\", {\n                href: \"#\",\n                className: ca\n            }, da), fa = q.tx._(\"{=Go online} to see who's available.\", {\n                \"=Go online\": ea\n            });\n            q.setContent(this._message, fa);\n            this._goOnlineEventListener = h.listen(this._message, \"click\", function(JSBNG__event) {\n                if (p.hasClass(JSBNG__event.getTarget(), ca)) {\n                    y.log(\"sidebar_go_online\");\n                    o.goOnline();\n                    return false;\n                }\n            ;\n            ;\n            });\n        },\n        _renderLitestandOffline: function() {\n            this._litestandOffline = this._litestandOffline[0];\n            this._isLitestand = true;\n            var ca = g.div({\n                className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\"\n            }), da = g.a({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__root -cx-PUBLIC-litestandLiquid__hover\",\n                href: \"#\"\n            }, g.i({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__leftborder\"\n            }), g.div({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__center\"\n            }, g.div({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__content\"\n            }, g.i({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__offlineicon\"\n            }), g.div({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__message\"\n            }, q.tx._(\"Turn on Chat\")))), g.i({\n                className: \"-cx-PRIVATE-fbChatSidebarOffline__rightborder\"\n            }), ca);\n            t.set(ca, q.tx._(\"Turn on Chat\"), \"right\", \"center\");\n            q.replace(this._litestandOffline, da);\n            this._litestandOffline = null;\n            h.listen(da, \"click\", function(JSBNG__event) {\n                y.log(\"sidebar_go_online\");\n                o.goOnline();\n                JSBNG__event.prevent();\n            });\n        },\n        _renderBlackbirdUpsell: function() {\n            q.setContent(this._message, j.getOfflineContent());\n        },\n        _renderBlackbird: function(ca) {\n            q.setContent(this._message, j.getBlackbirdContent(ca));\n        },\n        _clear: function() {\n            if (this._showWarningTimeout) {\n                JSBNG__clearTimeout(this._showWarningTimeout);\n                this._showWarningTimeout = null;\n            }\n        ;\n        ;\n            if (this._warningMsgEventListener) {\n                this._warningMsgEventListener.remove();\n                this._warningMsgEventListener = null;\n            }\n        ;\n        ;\n            if (this._goOnlineEventListener) {\n                this._goOnlineEventListener.remove();\n                this._goOnlineEventListener = null;\n            }\n        ;\n        ;\n            p.removeClass(this._root, \"upsell\");\n            p.removeClass(this._root, \"offline\");\n            p.removeClass(this._root, \"blackbird\");\n            p.removeClass(this._root, \"error\");\n            p.removeClass(this._root, \"notice\");\n            q.empty(this._message);\n        },\n        _render: function() {\n            this._clear();\n            if (j.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    var ca = ((o.isOnline() ? \"blackbird\" : \"upsell\"));\n                    p.addClass(this._root, ca);\n                    this._renderBlackbird(s.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    p.addClass(this._root, \"upsell\");\n                    this._renderBlackbirdUpsell();\n                }\n                \n            ;\n            ;\n            }\n             else if (!o.isOnline()) {\n                p.addClass(this._root, \"offline\");\n                this._renderOffline();\n            }\n             else if (k.disconnected()) {\n                p.addClass(this._root, \"error\");\n                this._renderChannelDisconnect();\n            }\n             else if (!m.notifiesUserMessages()) {\n                p.addClass(this._root, \"notice\");\n                q.setContent(this._message, \"Alerts are off while you use another client to chat.\");\n            }\n            \n            \n            \n        ;\n        ;\n            this.inform(\"updated\");\n        }\n    });\n    e.exports = ba;\n});\n__d(\"FBDesktopPlugin\", [\"CacheStorage\",\"DOM\",\"Env\",\"FBDesktopDetect\",\"URI\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"CacheStorage\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"FBDesktopDetect\"), k = b(\"URI\"), l = b(\"Style\"), m = new g(\"localstorage\", \"_socialfox_\"), n = {\n        _plugin: \"_not_checked\",\n        arbiterInform: function(o, p) {\n            var q = JSON.stringify({\n                JSBNG__name: o,\n                payload: p\n            });\n            this._transmitCommand(\"arbiterinform\", q);\n        },\n        bringToFront: function() {\n            this._transmitCommand(\"bringtofront\");\n        },\n        dock: function() {\n            this._transmitCommand(\"dock\");\n        },\n        getPlugin: function() {\n            if (((this._plugin === \"_not_checked\"))) {\n                this._plugin = null;\n                if (j.isPluginInstalled()) {\n                    var o = h.create(\"object\", {\n                        id: \"kiwi_plugin\",\n                        type: j.mimeType\n                    });\n                    l.set(o, \"width\", 0);\n                    l.set(o, \"height\", 0);\n                    var p = h.create(\"div\", {\n                    }, o);\n                    l.set(p, \"width\", 0);\n                    l.set(p, \"height\", 0);\n                    JSBNG__document.body.appendChild(p);\n                    this._plugin = o;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._plugin;\n        },\n        getUserID: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"getUserID\" in o)))) && o.getUserID()));\n        },\n        getVersion: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"getVersion\" in o)))) && o.getVersion()));\n        },\n        isAppRunning: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"isAppRunning\" in o)))) && o.isAppRunning()));\n        },\n        launchApp: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"launchApp\" in o)))) && o.launchApp()));\n        },\n        login: function(o, p) {\n            if (((((p && o)) && ((o.length > 0))))) {\n                var q = this.getPlugin();\n                if (q) {\n                    this._transmitCommand(((((((\"relogin\\u000a\" + o)) + \"\\u000a\")) + p)));\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        logout: function(o) {\n            o = ((o || \"0\"));\n            var p = this.getPlugin();\n            if (p) {\n                p.logout(o);\n            }\n        ;\n        ;\n        },\n        recheck: function() {\n            if (((this._plugin === null))) {\n                this._plugin = \"_not_checked\";\n            }\n        ;\n        ;\n        },\n        shouldSuppressBeeper: function() {\n            return this.isAppRunning();\n        },\n        shouldSuppressMessages: function() {\n            if (((m && m.get(\"connected\")))) {\n                return true;\n            }\n        ;\n        ;\n            var o = this.getUserID();\n            if (o) {\n                return ((o === i.user));\n            }\n             else return this.isAppRunning()\n        ;\n        },\n        shouldSuppressSidebar: function() {\n            var o = this.getPlugin(), p = ((((o && ((\"isAppDocked\" in o)))) && o.isAppDocked())), q = ((m && ((m.get(\"active\") === \"true\"))));\n            return ((p || q));\n        },\n        transferAuthToken: function(o, p) {\n            if (((o && ((o.length > 0))))) {\n                var q = this.getPlugin();\n                if (q) {\n                    q.setAccessToken(o, p);\n                    var r = JSBNG__setInterval(function() {\n                        q.setAccessToken(o, p);\n                    }, 500);\n                    JSBNG__setTimeout(function() {\n                        JSBNG__clearInterval(r);\n                    }, ((10 * 1000)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (this.redirectHome) {\n                window.JSBNG__location.href = k().setPath().toString();\n            }\n        ;\n        ;\n        },\n        _transmitCommand: function(o, p) {\n            p = ((p || \"\"));\n            var q = this.getPlugin();\n            if (((q && ((\"transmitCommand\" in q))))) {\n                q.transmitCommand(o, p);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatSidebar\", [\"ChatOrderedList\",\"ChatTypeaheadBehavior\",\"ChatTypeaheadCore\",\"ChatTypeaheadDataSource\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadView\",\"Typeahead\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConnection\",\"Chat\",\"ChatConfig\",\"ChatHovercard\",\"ChatImpressionLogger\",\"ChatOptions\",\"ChatSidebarSheet\",\"ChatVisibility\",\"CSS\",\"DOM\",\"DOMDimensions\",\"JSBNG__Event\",\"FBDesktopPlugin\",\"JSLogger\",\"JSXDOM\",\"KeyEventController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"ScrollableArea\",\"Style\",\"UserAgent\",\"ViewportBounds\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"cx\",\"debounce\",\"emptyFunction\",\"fbt\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"ChatTypeaheadBehavior\");\n    b(\"ChatTypeaheadCore\");\n    b(\"ChatTypeaheadDataSource\");\n    b(\"ChatTypeaheadRenderer\");\n    b(\"ChatTypeaheadView\");\n    b(\"Typeahead\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableList\"), k = b(\"AvailableListConstants\"), l = b(\"Bootloader\"), m = b(\"ChannelConnection\"), n = b(\"Chat\"), o = b(\"ChatConfig\"), p = b(\"ChatHovercard\"), q = b(\"ChatImpressionLogger\"), r = b(\"ChatOptions\"), s = b(\"ChatSidebarSheet\"), t = b(\"ChatVisibility\"), u = b(\"CSS\"), v = b(\"DOM\"), w = b(\"DOMDimensions\"), x = b(\"JSBNG__Event\"), y = b(\"FBDesktopPlugin\"), z = b(\"JSLogger\"), aa = b(\"JSXDOM\"), ba = b(\"KeyEventController\"), ca = b(\"OrderedFriendsList\"), da = b(\"Parent\"), ea = b(\"PresencePrivacy\"), fa = b(\"ScrollableArea\"), ga = b(\"Style\"), ha = b(\"UserAgent\"), ia = b(\"ViewportBounds\"), ja = b(\"copyProperties\"), ka = b(\"createArrayFrom\"), la = b(\"csx\"), ma = b(\"cx\"), na = b(\"debounce\"), oa = b(\"emptyFunction\"), pa = b(\"fbt\"), qa = b(\"ge\"), ra = b(\"tx\"), sa, ta = false, ua = false, va = false, wa = false, xa = false, ya = false, za, ab, bb, cb, db, eb = null, fb, gb, hb, ib, jb, kb, lb = 28, mb = 38, nb = z.create(\"chat_sidebar\");\n    function ob() {\n        if (gb) {\n            return;\n        }\n    ;\n    ;\n        u.removeClass(JSBNG__document.documentElement, \"sidebarMode\");\n        if (((!wa || !yb.isVisible()))) {\n            g.inform(\"reflow\");\n            return;\n        }\n    ;\n    ;\n        va = false;\n        eb = null;\n        za.hide();\n        cb.getCore().reset();\n        u.hide(ab);\n        nb.rate(\"sidebar_hide\", wa);\n        yb.inform(\"sidebar/hide\", yb);\n        g.inform(\"sidebar/hide\", yb);\n        g.inform(\"reflow\");\n    };\n;\n    function pb() {\n        var zb = yb.shouldShowSidebar();\n        u.conditionClass(JSBNG__document.documentElement, \"sidebarCapable\", zb);\n        if (((yb.isEnabled() && zb))) {\n            sb();\n            var ac;\n            if (fb) {\n                var bc = u.hasClass(ab, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\");\n                if (bc) {\n                    return;\n                }\n            ;\n            ;\n                kb = ((kb || v.JSBNG__find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\")));\n                if (fb.has_favorites_editing) {\n                    jb = ((jb || v.scry(ab, \".-cx-PRIVATE-litestandSidebarFavorites__sectionheader\")[0]));\n                }\n            ;\n            ;\n                ac = [kb,];\n            }\n             else ac = ka(ab.childNodes);\n        ;\n        ;\n            var cc = rb(ac), dc = ((za.getItemHeight() || 32)), ec = ((za.getPaddingOffset() || 8)), fc;\n            if (gb) {\n                if (gb.isExpanded()) {\n                    ec = ((ec + lb));\n                    if (((fb && fb.always_show_one_see_more))) {\n                        ec += dc;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (!n.isOnline()) {\n                    ec += mb;\n                }\n            ;\n            ;\n                var gc = Math.floor(((za.getItemPadding() / 2)));\n                fc = Math.floor(((((((cc - ec)) + gc)) / dc)));\n                if (!za.isVisible()) {\n                    ga.set(sa, \"height\", ((cc + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                fc = Math.floor(((((cc - ec)) / ((dc + 1)))));\n                ga.set(sa, \"height\", ((cc + \"px\")));\n            }\n        ;\n        ;\n            za.setNumTopFriends(fc);\n            var hc = Math.floor(((((cc - ec)) / dc)));\n            if (ub()) {\n                hc = ((((((hc - 2)) > 0)) ? ((hc - 2)) : 0));\n            }\n        ;\n        ;\n            cb.getData().setMaxResults(hc);\n            yb.inform(\"sidebar/resized\", yb);\n            g.inform(\"sidebar/resized\", yb);\n            g.inform(\"reflow\");\n        }\n         else ob();\n    ;\n    ;\n        if (!wa) {\n            wb();\n            wa = true;\n        }\n    ;\n    ;\n        eb = null;\n    };\n;\n    function qb() {\n        if (((cb && yb.isVisible()))) {\n            cb.getCore().getElement().JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function rb(zb) {\n        if (!zb) {\n            if (fb) {\n                kb = ((kb || v.JSBNG__find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\")));\n                zb = [kb,];\n            }\n             else zb = ka(ab.childNodes);\n        ;\n        }\n    ;\n    ;\n        var ac = db.height;\n        if (((gb && hb))) {\n            ac -= hb.getFullHeight();\n        }\n    ;\n    ;\n        zb.forEach(function(bc) {\n            if (((bc && ((bc !== sa))))) {\n                ac -= w.getElementDimensions(bc).height;\n            }\n        ;\n        ;\n        });\n        return Math.max(0, ac);\n    };\n;\n    function sb() {\n        if (yb.isVisible()) {\n            return;\n        }\n    ;\n    ;\n        va = true;\n        eb = null;\n        u.show(ab);\n        u.addClass(JSBNG__document.documentElement, \"sidebarMode\");\n        za.show();\n        nb.rate(\"sidebar_show\", wa);\n        yb.inform(\"sidebar/show\", yb);\n        g.inform(\"sidebar/show\", yb);\n        ((ib && xb()));\n    };\n;\n    function tb() {\n        r.setSetting(\"sidebar_mode\", yb.isEnabled(), \"JSBNG__sidebar\");\n        new i(\"/ajax/chat/settings.php\").setHandler(oa).setErrorHandler(oa).setData({\n            sidebar_mode: yb.isEnabled()\n        }).setAllowCrossPageTransition(true).send();\n    };\n;\n    function ub() {\n        return o.get(\"divebar_typeahead_group_fof\", 0);\n    };\n;\n    function vb() {\n        return ((ca.getList().length <= o.get(\"JSBNG__sidebar.min_friends\")));\n    };\n;\n    function wb() {\n        var zb = true;\n        if (!yb.isEnabled()) {\n            nb.log(\"state_not_enabled\");\n            zb = false;\n        }\n    ;\n    ;\n        if (!yb.isViewportCapable()) {\n            nb.log(\"state_not_shown_viewport\");\n            zb = false;\n        }\n    ;\n    ;\n        if (ua) {\n            nb.log(\"state_not_shown_hidden\");\n            zb = false;\n        }\n    ;\n    ;\n        if (vb()) {\n            nb.log(\"state_not_shown_num_friends\");\n            zb = false;\n        }\n    ;\n    ;\n        if (y.shouldSuppressSidebar()) {\n            nb.log(\"state_not_shown_fbdesktop\");\n            zb = false;\n        }\n    ;\n    ;\n        nb.log(((zb ? \"state_shown\" : \"state_not_shown\")));\n    };\n;\n    function xb() {\n        if (!yb.isVisible()) {\n            return;\n        }\n    ;\n    ;\n        var zb;\n        if (!t.isOnline()) {\n            zb = \"Offline\";\n        }\n         else if (m.disconnected()) {\n            zb = \"Connection Lost\";\n        }\n         else zb = ra._(\"{Chat} {number-available}\", {\n            Chat: \"Chat\",\n            \"number-available\": ((((\"(\" + j.getOnlineCount())) + \")\"))\n        });\n        \n    ;\n    ;\n        v.setContent(ib, zb);\n    };\n;\n    var yb = {\n        init: function(zb, ac, bc, cc) {\n            yb.init = oa;\n            xa = true;\n            ab = zb;\n            za = ac;\n            cb = bc;\n            bb = cc;\n            sa = v.JSBNG__find(zb, \"div.fbChatSidebarBody\");\n            gb = ((cc && cc.ls_module));\n            fb = ((cc && cc.ls_config));\n            if (gb) {\n                g.subscribe(\"ViewportSizeChange\", function() {\n                    g.inform(\"ChatOrderedList/itemHeightChange\");\n                    pb();\n                });\n                g.subscribe(\"Sidebar/BookmarksHeightChange\", pb);\n                l.loadModules([\"LitestandSidebarBookmarksDisplay\",], function(ec) {\n                    hb = ec;\n                });\n            }\n             else x.listen(window, \"resize\", pb);\n        ;\n        ;\n            ba.registerKey(\"q\", function() {\n                var ec = null;\n                if (kb) {\n                    ec = v.scry(kb, \".inputsearch\")[0];\n                }\n                 else ec = v.scry(zb, \".inputsearch\")[0];\n            ;\n            ;\n                if (ec) {\n                    ec.JSBNG__focus();\n                    return false;\n                }\n            ;\n            ;\n            });\n            new p(ac);\n            var dc = new s(zb);\n            dc.subscribe(\"updated\", pb);\n            g.subscribe(\"sidebar/invalidate\", pb);\n            ac.setScrollContainer(da.byClass(ac.getRoot(), \"uiScrollableAreaWrap\"));\n            ac.subscribe([\"render\",\"show\",\"hide\",], na(function(ec) {\n                if (((((ec === \"render\")) && !ya))) {\n                    ya = true;\n                    yb.inform(\"sidebar/chatRendered\", null, g.BEHAVIOR_PERSISTENT);\n                }\n            ;\n            ;\n                var fc = ac.getRoot(), gc = fa.getInstance(fc);\n                ((gc && gc.adjustGripper()));\n            }));\n            ac.subscribe([\"editStart\",\"editEnd\",], function(ec) {\n                u.conditionClass(cb.getView().element, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\", ((ec == \"editStart\")));\n            });\n            if (((ha.firefox() >= 17))) {\n                x.listen(window, \"storage\", function(ec) {\n                    if (((((ec.key == \"_socialfox_active\")) && ((ec.oldValue != ec.newValue))))) {\n                        pb();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            g.subscribe(\"chat/option-changed\", function(ec, fc) {\n                if (((fc.JSBNG__name == \"sidebar_mode\"))) {\n                    ta = !!r.getSetting(\"sidebar_mode\");\n                    pb();\n                }\n            ;\n            ;\n            });\n            bc.getCore().subscribe(\"sidebar/typeahead/active\", yb.updateOnActiveTypeahead);\n            bc.subscribe(\"reset\", function() {\n                if (((!bc.getCore().getValue() && !za.isVisible()))) {\n                    yb.updateOnActiveTypeahead(null, false);\n                }\n            ;\n            ;\n            });\n            if (gb) {\n                bc.getCore().subscribe(\"sidebar/typeahead/preActive\", function(ec, fc) {\n                    if (((ta && cb.getView().isVisible()))) {\n                        g.inform(ec, fc);\n                    }\n                     else pb();\n                ;\n                ;\n                });\n            }\n             else g.subscribe(\"buddylist-nub/initialized\", function(ec, fc) {\n                x.listen(fc.getButton(), \"click\", function(JSBNG__event) {\n                    yb.enable();\n                    return !yb.shouldShowSidebar();\n                });\n            });\n        ;\n        ;\n            ta = !!r.getSetting(\"sidebar_mode\");\n            ((ha.ie() && x.listen(zb, \"click\", function(ec) {\n                if (da.byClass(ec.getTarget(), \"-cx-PRIVATE-fbLitestandChatTypeahead__root\")) {\n                    qb();\n                }\n            ;\n            ;\n            })));\n            ea.subscribe(\"privacy-user-presence-changed\", pb);\n            pb();\n            q.init(za);\n            if (!gb) {\n                ia.addRight(yb.getVisibleWidth);\n            }\n        ;\n        ;\n            yb.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            g.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            if (o.get(\"litestand_blended_sidebar\")) {\n                ib = v.JSBNG__find(zb, \".-cx-PRIVATE-litestandBlendedSidebar__headertext\");\n                j.subscribe(k.ON_AVAILABILITY_CHANGED, na(xb, 2000));\n                m.subscribe([m.CONNECTED,m.RECONNECTING,m.SHUTDOWN,], xb);\n                ea.subscribe(\"privacy-changed\", xb);\n                xb();\n            }\n        ;\n        ;\n        },\n        updateOnActiveTypeahead: function(zb, ac) {\n            if (!va) {\n                return;\n            }\n        ;\n        ;\n            if (ac) {\n                za.hide();\n                if (gb) {\n                    u.addClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    var bc = rb();\n                    if (jb) {\n                        bc += w.getElementDimensions(jb).height;\n                    }\n                ;\n                ;\n                    ga.set(sa, \"height\", ((bc + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                za.show();\n                if (gb) {\n                    ga.set(sa, \"height\", \"auto\");\n                    u.removeClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    g.inform(\"sidebar/typeahead/active\", false);\n                    pb();\n                }\n                 else pb();\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        isInitialized: function() {\n            return wa;\n        },\n        disable: function() {\n            if (!yb.isEnabled()) {\n                return;\n            }\n        ;\n        ;\n            ta = false;\n            tb();\n            ob();\n        },\n        enable: function() {\n            if (yb.isEnabled()) {\n                return;\n            }\n        ;\n        ;\n            ta = true;\n            tb();\n            pb();\n            qb.defer();\n        },\n        forceEnsureLoaded: function() {\n            if (xa) {\n                return;\n            }\n        ;\n        ;\n            if (qa(\"pagelet_sidebar\")) {\n                return;\n            }\n        ;\n        ;\n            d([\"UIPagelet\",], function(zb) {\n                var ac = aa.div({\n                    id: \"pagelet_sidebar\"\n                });\n                v.appendContent(JSBNG__document.body, ac);\n                zb.loadFromEndpoint(\"SidebarPagelet\", \"pagelet_sidebar\");\n            });\n            xa = true;\n        },\n        ensureLoaded: function() {\n            if (!ta) {\n                return;\n            }\n        ;\n        ;\n            yb.forceEnsureLoaded();\n        },\n        hide: function() {\n            if (ua) {\n                return;\n            }\n        ;\n        ;\n            ua = true;\n            ob();\n        },\n        unhide: function() {\n            if (!ua) {\n                return;\n            }\n        ;\n        ;\n            ua = false;\n            pb();\n        },\n        getBody: function() {\n            return sa;\n        },\n        getRoot: function() {\n            return ab;\n        },\n        getVisibleWidth: function() {\n            if (((!va || !ab))) {\n                return 0;\n            }\n        ;\n        ;\n            if (((eb === null))) {\n                eb = ab.offsetWidth;\n            }\n        ;\n        ;\n            return eb;\n        },\n        isEnabled: function() {\n            return ta;\n        },\n        isViewportCapable: function() {\n            db = w.getViewportWithoutScrollbarDimensions();\n            if (gb) {\n                return true;\n            }\n        ;\n        ;\n            var zb = o.get(\"JSBNG__sidebar.minimum_width\");\n            return ((db.width > zb));\n        },\n        shouldShowSidebar: function() {\n            var zb = yb.isViewportCapable();\n            return ((gb || ((((((zb && !ua)) && ((!vb() || o.get(\"litestand_blended_sidebar\", false))))) && !y.shouldSuppressSidebar()))));\n        },\n        isVisible: function() {\n            return va;\n        },\n        resize: pb,\n        toggle: function() {\n            if (gb) {\n                gb.toggle();\n            }\n             else ((yb.isEnabled() ? yb.disable() : yb.enable()));\n        ;\n        ;\n        },\n        isLitestandSidebar: function() {\n            return !!gb;\n        }\n    };\n    ja(yb, h);\n    e.exports = yb;\n});\n__d(\"VideoCallingTour\", [\"Arbiter\",\"ArbiterMixin\",\"Chat\",\"ChatSidebar\",\"ChatVisibility\",\"CSS\",\"DOM\",\"PresencePrivacy\",\"Run\",\"Toggler\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Chat\"), j = b(\"ChatSidebar\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"PresencePrivacy\"), o = b(\"Run\"), p = b(\"Toggler\"), q = b(\"Vector\"), r = b(\"copyProperties\"), s, t, u, v, w = [], x = function() {\n    \n    };\n    function y() {\n        if (j.isVisible()) {\n            z();\n        }\n         else if (u) {\n            aa();\n        }\n        \n    ;\n    ;\n    };\n;\n    function z() {\n        s.setContext(t.getBody());\n        ba();\n        s.show();\n        ca();\n    };\n;\n    function aa() {\n        if (!v) {\n            v = p.createInstance(u.getRoot());\n        }\n    ;\n    ;\n        var fa = m.scry(u.getRoot(), \"div.fbNubFlyout\")[0];\n        if (fa) {\n            s.setContext(fa);\n            ba();\n            s.show();\n            ca();\n        }\n    ;\n    ;\n    };\n;\n    function ba() {\n        var fa = q.getElementDimensions(s.getContext()).y;\n        s.setOffsetY(((fa * 65414)));\n        s.updatePosition();\n    };\n;\n    function ca() {\n        if (u) {\n            w.push(u.subscribe(\"hide\", function() {\n                da();\n                if (!j.isVisible()) {\n                    s.hide();\n                }\n            ;\n            ;\n            }), u.subscribe(\"show\", function() {\n                s.show();\n            }), u.subscribe(\"resize\", function() {\n                ba();\n                s.updatePosition();\n            }));\n        }\n    ;\n    ;\n        w.push(g.subscribe(\"sidebar/show\", z), g.subscribe(\"sidebar/hide\", aa), g.subscribe(\"sidebar/resized\", ba));\n    };\n;\n    function da() {\n        if (v) {\n            v.setSticky(false);\n            v = null;\n        }\n    ;\n    ;\n    };\n;\n    function ea() {\n        while (w.length) {\n            w.pop().unsubscribe();\n        ;\n        };\n    ;\n        if (u) {\n            da();\n        }\n    ;\n    ;\n        s.hide();\n        l.show(\"fbVideoCallingGetStarted\");\n    };\n;\n    r(x, h, {\n        start: function(fa) {\n            s = fa;\n            l.hide(\"fbVideoCallingGetStarted\");\n            k.goOnline(function() {\n                w.push(n.subscribe(\"privacy-user-presence-changed\", ea));\n                o.onLeave(ea);\n                i.openBuddyList();\n                var ga = null;\n                w.push(j.subscribe(\"sidebar/initialized\", function(ha, ia) {\n                    t = ia;\n                    JSBNG__clearTimeout(ga);\n                    ga = y.defer();\n                }), x.subscribe(\"videocallingtour/end\", ea));\n                w.push(g.subscribe(\"buddylist-nub/initialized\", function(ha, ia) {\n                    u = ia;\n                    JSBNG__clearTimeout(ga);\n                    ga = y.defer();\n                }));\n            });\n            x.inform(\"videocallingtour/start\");\n        }\n    });\n    e.exports = x;\n});\n__d(\"ModuleDependencies\", [], function(a, b, c, d, e, f) {\n    function g(k, l, m) {\n        var n = a.require.__debug.modules[m], o = a.require.__debug.deps;\n        if (l[m]) {\n            return;\n        }\n    ;\n    ;\n        l[m] = true;\n        if (!n) {\n            ((o[m] && (k[m] = true)));\n            return;\n        }\n    ;\n    ;\n        if (((!n.dependencies || !n.dependencies.length))) {\n            if (n.waiting) {\n                k[m] = true;\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        n.dependencies.forEach(function(p) {\n            g(k, l, p);\n        });\n    };\n;\n    function h(k) {\n        if (a.require.__debug) {\n            var l = {\n            };\n            g(l, {\n            }, k);\n            var m = Object.keys(l);\n            m.sort();\n            return m;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function i() {\n        var k = {\n            loading: {\n            },\n            missing: []\n        };\n        if (!a.require.__debug) {\n            return k;\n        }\n    ;\n    ;\n        var l = {\n        }, m = a.require.__debug.modules, n = a.require.__debug.deps;\n        {\n            var fin248keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin248i = (0);\n            var o;\n            for (; (fin248i < fin248keys.length); (fin248i++)) {\n                ((o) = (fin248keys[fin248i]));\n                {\n                    var p = m[o];\n                    if (p.waiting) {\n                        var q = {\n                        };\n                        g(q, {\n                        }, p.id);\n                        delete q[p.id];\n                        k.loading[p.id] = Object.keys(q);\n                        k.loading[p.id].sort();\n                        k.loading[p.id].forEach(function(r) {\n                            if (((!((r in m)) && n[r]))) {\n                                l[r] = 1;\n                            }\n                        ;\n                        ;\n                        });\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        k.missing = Object.keys(l);\n        k.missing.sort();\n        return k;\n    };\n;\n    var j = {\n        getMissing: h,\n        getNotLoadedModules: i\n    };\n    e.exports = j;\n});\n__d(\"ChatPeopleSuggestionList.react\", [\"ChatSidebarItem.react\",\"fbt\",\"React\",\"ShortProfiles\",\"PresenceStatus\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"fbt\"), i = b(\"React\"), j = b(\"ShortProfiles\"), k = b(\"PresenceStatus\"), l = b(\"cx\"), m = i.createClass({\n        displayName: \"ChatPeopleSuggestionList\",\n        _renderPeopleList: function() {\n            var n = [];\n            this.props.uids.map(function(o) {\n                var p = j.getNow(o);\n                if (p) {\n                    n.push(i.DOM.li(null, g({\n                        isAdded: false,\n                        showEditButton: true,\n                        images: p.thumbSrc,\n                        JSBNG__name: p.JSBNG__name,\n                        JSBNG__status: k.get(o),\n                        onClick: this.props.onClick.curry(o)\n                    })));\n                }\n            ;\n            ;\n            }.bind(this));\n            return n;\n        },\n        render: function() {\n            return (i.DOM.div(null, i.DOM.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__header\"\n            }, i.DOM.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__headertext\"\n            }, \"SUGGESTIONS\")), i.DOM.ul({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupslist\"\n            }, this._renderPeopleList())));\n        }\n    });\n    e.exports = m;\n});\n__d(\"Dock\", [\"function-extensions\",\"JSBNG__Event\",\"shield\",\"WebMessengerWidthControl\",\"Arbiter\",\"ArbiterMixin\",\"ChatQuietLinks\",\"CSS\",\"DataStore\",\"DOM\",\"Parent\",\"Style\",\"Toggler\",\"Vector\",\"copyProperties\",\"csx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSBNG__Event\"), h = b(\"shield\");\n    b(\"WebMessengerWidthControl\");\n    var i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"ChatQuietLinks\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"Toggler\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    function w() {\n    \n    };\n;\n    s(w, j, {\n        MIN_HEIGHT: 140,\n        INITIAL_FLYOUT_HEIGHT_OFFSET: 10,\n        init: function(x) {\n            this.init = u;\n            this.rootEl = x;\n            this.calculateViewportDimensions();\n            this.calculateFlyoutHeightOffset();\n            k.removeEmptyHrefs(this.rootEl);\n            g.listen(x, \"click\", this._onClick.bind(this));\n            g.listen(window, \"resize\", this._onWindowResize.bind(this));\n            q.subscribe([\"show\",\"hide\",], function(y, z) {\n                var aa = z.getActive();\n                if (!n.contains(x, aa)) {\n                    return;\n                }\n            ;\n            ;\n                if (l.hasClass(aa, \"fbNub\")) {\n                    this.notifyNub(aa, y);\n                    if (((y === \"show\"))) {\n                        this._resizeNubFlyout(aa);\n                    }\n                ;\n                ;\n                }\n                 else {\n                    var ba = o.byClass(aa, \"fbNubFlyout\");\n                    if (ba) {\n                        l.conditionClass(ba, \"menuOpened\", ((y === \"show\")));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.inform(\"init\", {\n            }, i.BEHAVIOR_PERSISTENT);\n        },\n        calculateViewportDimensions: function() {\n            return (this.viewportDimensions = r.getViewportDimensions());\n        },\n        calculateFlyoutHeightOffset: function() {\n            this.flyoutHeightOffset = ((this.INITIAL_FLYOUT_HEIGHT_OFFSET + r.getElementDimensions(this.rootEl).y));\n            var x = v(\"blueBar\");\n            if (x) {\n                var y = ((p.isFixed(x) ? \"viewport\" : \"JSBNG__document\"));\n                this.flyoutHeightOffset += ((r.getElementPosition(x, y).y + r.getElementDimensions(x).y));\n            }\n        ;\n        ;\n        },\n        toggle: function(x) {\n            var y = this._findFlyout(x);\n            if (!y) {\n                return;\n            }\n        ;\n        ;\n            this.subscribe(\"init\", function() {\n                q.toggle(x);\n            });\n        },\n        show: function(x) {\n            this.subscribe(\"init\", function() {\n                q.show(x);\n            });\n        },\n        showNub: function(x) {\n            l.show(x);\n        },\n        hide: function(x) {\n            this.subscribe(\"init\", function() {\n                var y = q.getInstance(x);\n                ((n.contains(x, y.getActive()) && y.hide()));\n            });\n        },\n        hideNub: function(x) {\n            l.hide(x);\n            this.hide(x);\n        },\n        setUseMaxHeight: function(x, y) {\n            l.conditionClass(x, \"maxHeight\", ((y !== false)));\n            this._resizeNubFlyout(x);\n        },\n        _resizeNubFlyout: function(x) {\n            var y = this._findFlyout(x);\n            if (((!y || !((l.hasClass(x, \"openToggler\") || l.hasClass(x, \"opened\")))))) {\n                return;\n            }\n        ;\n        ;\n            var z = n.JSBNG__find(y, \"div.fbNubFlyoutOuter\"), aa = n.JSBNG__find(z, \"div.fbNubFlyoutInner\"), ba = n.JSBNG__find(aa, \"div.fbNubFlyoutBody\"), ca = ba.scrollTop, da = ba.offsetHeight;\n            p.set(ba, \"height\", \"auto\");\n            var ea = r.getElementDimensions(y), fa = r.getElementDimensions(ba), ga = this.getMaxFlyoutHeight(x);\n            p.set(y, \"max-height\", ((ga + \"px\")));\n            p.set(z, \"max-height\", ((ga + \"px\")));\n            ea = r.getElementDimensions(y);\n            var ha = r.getElementDimensions(aa), ia = ((ha.y - fa.y)), ja = ((ea.y - ia)), ka = parseInt(((ba.style.height || ba.clientHeight)), 10), la = ((ja !== ka));\n            if (((((ea.y > ia)) && la))) {\n                p.set(ba, \"height\", ((ja + \"px\")));\n            }\n        ;\n        ;\n            l.removeClass(y, \"swapDirection\");\n            var ma = r.getElementPosition(y).x;\n            l.conditionClass(y, \"swapDirection\", function() {\n                if (((ma < 0))) {\n                    return true;\n                }\n            ;\n            ;\n                return ((((ma + ea.x)) > this.viewportDimensions.x));\n            }.bind(this)());\n            if (((la && ((((ca + da)) >= fa.y))))) {\n                ba.scrollTop = ba.scrollHeight;\n            }\n             else ba.scrollTop = ca;\n        ;\n        ;\n            this.notifyNub(x, \"resize\");\n        },\n        getMaxFlyoutHeight: function(x) {\n            var y = this._findFlyout(x), z = r.getElementPosition(y, \"viewport\"), aa = r.getElementDimensions(y), ba = ((Math.max(this.MIN_HEIGHT, ((this.viewportDimensions.y - this.flyoutHeightOffset))) - ((((this.viewportDimensions.y - z.y)) - aa.y))));\n            return Math.max(ba, 0);\n        },\n        resizeAllFlyouts: function() {\n            var x = n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.openToggler\");\n            x = x.concat(n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.opened\"));\n            var y = x.length;\n            while (y--) {\n                this._resizeNubFlyout(x[y]);\n            ;\n            };\n        ;\n        },\n        _onClick: function(JSBNG__event) {\n            var x = JSBNG__event.getTarget(), y = o.byClass(x, \"fbNub\");\n            if (y) {\n                if (o.byClass(x, \"fbNubFlyoutTitlebar\")) {\n                    var z = o.byTag(x, \"a\"), aa = ((((x.nodeName == \"INPUT\")) && ((x.getAttribute(\"type\") == \"submit\"))));\n                    if (((!z && !aa))) {\n                        this.hide(y);\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.notifyNub(y, \"click\");\n            }\n        ;\n        ;\n        },\n        _onWindowResize: function(JSBNG__event) {\n            this.calculateViewportDimensions();\n            this.resizeAllFlyouts();\n        },\n        _findFlyout: function(x) {\n            return ((l.hasClass(x, \"fbNubFlyout\") ? x : ((n.scry(x, \"div.fbNubFlyout\")[0] || null))));\n        },\n        registerNubController: function(x, y) {\n            m.set(x, \"dock:nub:controller\", y);\n            y.subscribe(\"nub/button/content-changed\", h(this.inform, this, \"resize\", x));\n            y.subscribe(\"nub/flyout/content-changed\", h(this._resizeNubFlyout, this, x));\n        },\n        unregisterNubController: function(x) {\n            m.remove(x, \"dock:nub:controller\");\n        },\n        notifyNub: function(x, y, z) {\n            var aa = m.get(x, \"dock:nub:controller\");\n            ((aa && aa.inform(y, z)));\n        }\n    });\n    e.exports = ((a.Dock || w));\n});\n__d(\"NubController\", [\"ArbiterMixin\",\"Dock\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"Dock\"), i = b(\"copyProperties\");\n    function j() {\n    \n    };\n;\n    i(j.prototype, g, {\n        init: function(k) {\n            this.el = k;\n            h.registerNubController(k, this);\n            return this;\n        },\n        buttonContentChanged: function() {\n            this.inform(\"nub/button/content-changed\");\n        },\n        flyoutContentChanged: function() {\n            this.inform(\"nub/flyout/content-changed\");\n        },\n        hide: function() {\n            h.hide(this.el);\n        },\n        show: function() {\n            h.show(this.el);\n        }\n    });\n    e.exports = j;\n});\n__d(\"DropdownContextualHelpLink\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        set: function(j) {\n            var k = h(\"navHelpCenter\");\n            if (((k !== null))) {\n                g.replace(k, j);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"ChatActivity\", [\"JSBNG__Event\",\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"JSLogger\",\"MercuryConfig\",\"PresenceState\",\"UserActivity\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AvailableList\"), j = b(\"AvailableListConstants\"), k = b(\"JSLogger\"), l = b(\"MercuryConfig\"), m = b(\"PresenceState\"), n = b(\"UserActivity\"), o = b(\"copyProperties\"), p = ((l.activity_limit || 60000)), q = ((l.idle_limit || 1800000)), r = ((l.idle_poll_interval || 300000)), s = k.create(\"chat_activity\"), t = JSBNG__Date.now(), u = t, v = true;\n    function w() {\n        var aa = JSBNG__Date.now();\n        return !!((v && ((((aa - t)) < p))));\n    };\n;\n    var x = o(new h(), {\n        isActive: w\n    });\n    function y() {\n        var aa = t;\n        t = JSBNG__Date.now();\n        if (((((t - aa)) > q))) {\n            s.debug(\"idle_to_active\", aa);\n            m.doSync();\n        }\n    ;\n    ;\n        x.inform(\"activity\");\n    };\n;\n    i.subscribe(j.ON_AVAILABILITY_CHANGED, function() {\n        if (!i.isUserIdle()) {\n            u = JSBNG__Date.now();\n        }\n    ;\n    ;\n    });\n    g.listen(window, \"JSBNG__focus\", function() {\n        v = true;\n        y();\n    });\n    g.listen(window, \"JSBNG__blur\", function() {\n        v = false;\n    });\n    n.subscribe(function() {\n        y();\n    });\n    function z(aa) {\n        var ba = ((((aa && aa.at)) && m.verifyNumber(aa.at)));\n        if (((typeof ba !== \"number\"))) {\n            ba = null;\n        }\n    ;\n    ;\n        return ((ba || 0));\n    };\n;\n    JSBNG__setInterval(function() {\n        var aa = JSBNG__Date.now(), ba = z(m.get()), ca = Math.max(t, ba, u);\n        if (((((aa - ca)) > q))) {\n            s.debug(\"idle\", {\n                cookie: ba,\n                local: t,\n                presence: u\n            });\n            x.inform(\"idle\", ((aa - ca)));\n        }\n    ;\n    ;\n    }, r);\n    m.registerStateStorer(function(aa) {\n        var ba = z(aa);\n        if (((ba < t))) {\n            aa.at = t;\n        }\n    ;\n    ;\n        return aa;\n    });\n    h.subscribe(k.DUMP_EVENT, function(aa, ba) {\n        ba.chat_activity = {\n            activity_limit: p,\n            idle_limit: q,\n            idle_poll_interval: r,\n            last_active_time: t,\n            last_global_active_time: u\n        };\n    });\n    e.exports = x;\n});\n__d(\"MercuryNotificationRenderer\", [\"MercuryAssert\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryThreads\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAssert\"), h = b(\"MercuryMessages\").get(), i = b(\"MercuryParticipants\"), j = b(\"MercuryThreads\").get(), k = b(\"tx\");\n    function l(m, n) {\n        g.isThreadID(m);\n        j.getThreadMeta(m, function(o) {\n            h.getThreadMessagesRange(m, 0, 1, function(p) {\n                var q = ((p.length && p[((p.length - 1))]));\n                if (((q && ((q.author != i.user))))) {\n                    i.get(q.author, function(r) {\n                        if (o.JSBNG__name) {\n                            n(k._(\"{senderName} messaged {groupName}\", {\n                                senderName: r.short_name,\n                                groupName: o.JSBNG__name\n                            }));\n                        }\n                         else n(k._(\"{name} messaged you\", {\n                            JSBNG__name: r.short_name\n                        }));\n                    ;\n                    ;\n                    });\n                }\n                 else n(\"New message!\");\n            ;\n            ;\n            });\n        });\n    };\n;\n    e.exports = {\n        renderDocumentTitle: l\n    };\n});\n__d(\"MercuryTimestampTracker\", [\"MercuryActionTypeConstants\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryActionTypeConstants\"), h = b(\"MercuryPayloadSource\"), i = b(\"MercurySingletonMixin\"), j = b(\"MercuryServerRequests\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._fbid = m;\n        this._serverRequests = j.getForFBID(this._fbid);\n        this._lastTimestamp = 0;\n        this._serverRequests.subscribe(\"update-messages\", function(n, o) {\n            if (((!o.actions || !o.actions.length))) {\n                return;\n            }\n        ;\n        ;\n            if (((((o.payload_source == h.CLIENT_SEND_MESSAGE)) || ((o.payload_source == h.UNKNOWN))))) {\n                return;\n            }\n        ;\n        ;\n            for (var p = 0; ((p < o.actions.length)); p++) {\n                var q = o.actions[p], r = q.action_type;\n                if (((((((r == g.USER_GENERATED_MESSAGE)) && q.thread_id)) && ((q.timestamp > this._lastTimestamp))))) {\n                    this._lastTimestamp = q.timestamp;\n                }\n            ;\n            ;\n            };\n        ;\n        }.bind(this));\n    };\n;\n    k(l.prototype, {\n        getLastUserMessageTimestamp: function() {\n            return this._lastTimestamp;\n        }\n    });\n    k(l, i);\n    e.exports = l;\n});\n__d(\"ChatTitleBarBlinker\", [\"ChatActivity\",\"DocumentTitle\",\"JSLogger\",\"MercuryThreadInformer\",\"MercuryNotificationRenderer\",\"PresenceState\",\"MercuryTimestampTracker\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = b(\"MercuryThreadInformer\").get(), k = b(\"MercuryNotificationRenderer\"), l = b(\"PresenceState\"), m = b(\"MercuryTimestampTracker\").get(), n = i.create(\"chat_title\"), o = null, p = 0, q = false;\n    function r() {\n        if (o) {\n            o.JSBNG__stop();\n            o = null;\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function s(x) {\n        var y = ((x || m.getLastUserMessageTimestamp()));\n        if (((p <= y))) {\n            p = y;\n            if (((r() || q))) {\n                l.doSync();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var t = {\n        blink: function(x, y) {\n            if (((!o && ((p < y))))) {\n                k.renderDocumentTitle(x, function(z) {\n                    if (!o) {\n                        o = h.blink(z);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        },\n        stopBlinking: function() {\n            s();\n        },\n        blinkingElsewhere: function() {\n            q = true;\n        }\n    };\n    function u(x) {\n        var y = l.verifyNumber(x.sb2);\n        if (((!y || ((y <= p))))) {\n            return null;\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    function v(x) {\n        var y = ((x && u(x)));\n        if (y) {\n            p = y;\n            n.debug(\"load\", p);\n            r();\n            q = false;\n        }\n    ;\n    ;\n    };\n;\n    function w(x) {\n        var y = u(x);\n        if (!y) {\n            n.debug(\"store\", p);\n            x.sb2 = p;\n            q = false;\n        }\n    ;\n    ;\n        return x;\n    };\n;\n    l.registerStateStorer(w);\n    l.registerStateLoader(v);\n    j.subscribe(\"thread-read-changed\", function(x, y) {\n        var z = m.getLastUserMessageTimestamp(), aa = 0;\n        {\n            var fin249keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin249i = (0);\n            var ba;\n            for (; (fin249i < fin249keys.length); (fin249i++)) {\n                ((ba) = (fin249keys[fin249i]));\n                {\n                    if (((((y[ba].mark_as_read && ((y[ba].timestamp >= z)))) && ((y[ba].timestamp > aa))))) {\n                        aa = y[ba].timestamp;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        ((aa && s(aa)));\n    });\n    g.subscribe(\"activity\", function() {\n        s();\n    });\n    (function() {\n        var x = l.getInitial();\n        if (x) {\n            p = ((u(x) || 0));\n        }\n    ;\n    ;\n    })();\n    e.exports = t;\n});\n__d(\"swfobject\", [\"AsyncRequest\",\"Bootloader\",\"ControlledReferer\",\"copyProperties\",\"CSS\",\"DOM\",\"function-extensions\",\"ge\",\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"ControlledReferer\"), j = b(\"copyProperties\"), k = b(\"CSS\"), l = b(\"DOM\");\n    b(\"function-extensions\");\n    var m = b(\"ge\"), n = b(\"htmlSpecialChars\");\n    if (((typeof o == \"undefined\"))) {\n        var o = {\n        };\n    }\n;\n;\n    if (((typeof o.util == \"undefined\"))) {\n        o.util = {\n        };\n    }\n;\n;\n    if (((typeof o.SWFObjectUtil == \"undefined\"))) {\n        o.SWFObjectUtil = {\n        };\n    }\n;\n;\n    o.SWFObject = function(u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!JSBNG__document.getElementById) {\n            return;\n        }\n    ;\n    ;\n        this.DETECT_KEY = ((da ? da : \"detectflash\"));\n        this.skipDetect = o.util.getRequestParameter(this.DETECT_KEY);\n        this.params = {\n        };\n        this.variables = {\n        };\n        this.attributes = [];\n        this.fallback_html = \"\";\n        this.fallback_js_fcn = function() {\n        \n        };\n        if (u) {\n            this.setAttribute(\"swf\", u);\n        }\n    ;\n    ;\n        if (v) {\n            this.setAttribute(\"id\", v);\n        }\n    ;\n    ;\n        if (w) {\n            this.setAttribute(\"width\", w);\n        }\n    ;\n    ;\n        if (x) {\n            this.setAttribute(\"height\", x);\n        }\n    ;\n    ;\n        this.installedVer = o.SWFObjectUtil.getPlayerVersion();\n        if (y) {\n            if (!((y instanceof Array))) {\n                y = [y,];\n            }\n        ;\n        ;\n            var ea;\n            y.forEach(function(ha) {\n                ea = new o.PlayerVersion(ha.toString().split(\".\"));\n                if (((ea.major == this.installedVer.major))) {\n                    this.setAttribute(\"version\", ea);\n                    return;\n                }\n                 else if (((!this.getAttribute(\"version\") || ((ea.major < this.getAttribute(\"version\").major))))) {\n                    this.setAttribute(\"version\", ea);\n                }\n                \n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        if (((((!window.JSBNG__opera && JSBNG__document.all)) && ((this.installedVer.major > 7))))) {\n            if (!o.unloadSet) {\n                o.SWFObjectUtil.prepUnload = function() {\n                    var ha = function() {\n                    \n                    }, ia = function() {\n                    \n                    };\n                    window.JSBNG__attachEvent(\"JSBNG__onunload\", o.SWFObjectUtil.cleanupSWFs);\n                };\n                window.JSBNG__attachEvent(\"JSBNG__onbeforeunload\", o.SWFObjectUtil.prepUnload);\n                o.unloadSet = true;\n            }\n        ;\n        }\n    ;\n    ;\n        if (z) {\n            this.addParam(\"bgcolor\", z);\n        }\n    ;\n    ;\n        var fa = ((aa ? aa : \"high\"));\n        this.addParam(\"quality\", fa);\n        this.setAttribute(\"useExpressInstall\", false);\n        this.setAttribute(\"doExpressInstall\", false);\n        var ga = (((ba) ? ba : window.JSBNG__location));\n        this.setAttribute(\"xiRedirectUrl\", ga);\n        this.setAttribute(\"redirectUrl\", \"\");\n        if (ca) {\n            this.setAttribute(\"redirectUrl\", ca);\n        }\n    ;\n    ;\n        this.setAttribute(\"useIframe\", false);\n    };\n    o.SWFObject.ieWorkaroundApplied = false;\n    o.SWFObject.ensureIEWorkaroundAttached = function() {\n        if (((!o.SWFObject.ieWorkaroundApplied && JSBNG__document.JSBNG__attachEvent))) {\n            o.SWFObject.ieWorkaroundApplied = true;\n            JSBNG__document.JSBNG__attachEvent(\"onpropertychange\", o.SWFObject.onDocumentPropertyChange);\n        }\n    ;\n    ;\n    };\n    o.SWFObject.onDocumentPropertyChange = function(JSBNG__event) {\n        if (((JSBNG__event.propertyName == \"title\"))) {\n            var u = JSBNG__document.title;\n            if (((((u != null)) && ((u.indexOf(\"#!\") != -1))))) {\n                u = u.substring(0, u.indexOf(\"#!\"));\n                JSBNG__document.title = u;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    j(o.SWFObject.prototype, {\n        useExpressInstall: function(u) {\n            this.xiSWFPath = ((!u ? \"/swf/expressinstall.swf\" : u));\n            this.setAttribute(\"useExpressInstall\", true);\n        },\n        setAttribute: function(u, v) {\n            this.attributes[u] = v;\n        },\n        getAttribute: function(u) {\n            return ((this.attributes[u] || \"\"));\n        },\n        addParam: function(u, v) {\n            this.params[u] = v;\n        },\n        getParams: function() {\n            return this.params;\n        },\n        addVariable: function(u, v) {\n            this.variables[u] = v;\n        },\n        getVariable: function(u) {\n            return ((this.variables[u] || \"\"));\n        },\n        getVariables: function() {\n            return this.variables;\n        },\n        getVariablePairs: function() {\n            var u = [], v, w = this.getVariables();\n            {\n                var fin250keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin250i = (0);\n                (0);\n                for (; (fin250i < fin250keys.length); (fin250i++)) {\n                    ((v) = (fin250keys[fin250i]));\n                    {\n                        u[u.length] = ((((v + \"=\")) + w[v]));\n                    ;\n                    };\n                };\n            };\n        ;\n            return u.join(\"&\");\n        },\n        getSWFHTML: function() {\n            var u, v, w;\n            if (((((JSBNG__navigator.plugins && JSBNG__navigator.mimeTypes)) && JSBNG__navigator.mimeTypes.length))) {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"PlugIn\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n            ;\n                v = {\n                    type: \"application/x-shockwave-flash\",\n                    src: this.getAttribute(\"swf\"),\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: ((this.getAttribute(\"style\") || \"display: block;\")),\n                    id: this.getAttribute(\"id\"),\n                    JSBNG__name: this.getAttribute(\"id\")\n                };\n                var x = this.getParams();\n                {\n                    var fin251keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin251i = (0);\n                    var y;\n                    for (; (fin251i < fin251keys.length); (fin251i++)) {\n                        ((y) = (fin251keys[fin251i]));\n                        {\n                            v[y] = x[y];\n                        ;\n                        };\n                    };\n                };\n            ;\n                w = this.getVariablePairs();\n                if (w) {\n                    v.flashvars = w;\n                }\n            ;\n            ;\n                u = t(\"embed\", v, null);\n            }\n             else {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"ActiveX\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n            ;\n                v = {\n                    id: this.getAttribute(\"id\"),\n                    classid: \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: ((this.getAttribute(\"style\") || \"display: block;\"))\n                };\n                var z = t(\"param\", {\n                    JSBNG__name: \"movie\",\n                    value: this.getAttribute(\"swf\")\n                }, null), x = this.getParams();\n                {\n                    var fin252keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin252i = (0);\n                    var y;\n                    for (; (fin252i < fin252keys.length); (fin252i++)) {\n                        ((y) = (fin252keys[fin252i]));\n                        {\n                            z += t(\"param\", {\n                                JSBNG__name: y,\n                                value: x[y]\n                            }, null);\n                        ;\n                        };\n                    };\n                };\n            ;\n                w = this.getVariablePairs();\n                if (w) {\n                    z += t(\"param\", {\n                        JSBNG__name: \"flashvars\",\n                        value: w\n                    }, null);\n                }\n            ;\n            ;\n                u = t(\"object\", v, z);\n            }\n        ;\n        ;\n            return u;\n        },\n        write: function(u) {\n            if (this.getAttribute(\"useExpressInstall\")) {\n                var v = new o.PlayerVersion([6,0,65,]);\n                if (((this.installedVer.versionIsValid(v) && !this.installedVer.versionIsValid(this.getAttribute(\"version\"))))) {\n                    this.setAttribute(\"doExpressInstall\", true);\n                    this.addVariable(\"MMredirectURL\", escape(this.getAttribute(\"xiRedirectUrl\")));\n                    JSBNG__document.title = ((JSBNG__document.title.slice(0, 47) + \" - Flash Player Installation\"));\n                    this.addVariable(\"MMdoctitle\", JSBNG__document.title);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var w = ((((typeof u == \"string\")) ? JSBNG__document.getElementById(u) : u));\n            if (!w) {\n                return false;\n            }\n        ;\n        ;\n            k.addClass(w, \"swfObject\");\n            w.setAttribute(\"data-swfid\", this.getAttribute(\"id\"));\n            if (((((this.skipDetect || this.getAttribute(\"doExpressInstall\"))) || this.installedVer.versionIsValid(this.getAttribute(\"version\"))))) {\n                if (!this.getAttribute(\"useIframe\")) {\n                    o.SWFObject.ensureIEWorkaroundAttached();\n                    w.innerHTML = this.getSWFHTML();\n                }\n                 else this._createIframe(w);\n            ;\n            ;\n                return true;\n            }\n             else {\n                if (((this.getAttribute(\"redirectUrl\") != \"\"))) {\n                    JSBNG__document.JSBNG__location.replace(this.getAttribute(\"redirectUrl\"));\n                }\n            ;\n            ;\n                var x = ((((((((((((this.getAttribute(\"version\").major + \".\")) + this.getAttribute(\"version\").minor)) + \".\")) + this.getAttribute(\"version\").release)) + \".\")) + this.getAttribute(\"version\").build)), y = ((((((((((((this.installedVer.major + \".\")) + this.installedVer.minor)) + \".\")) + this.installedVer.release)) + \".\")) + this.installedVer.build));\n                this.fallback_js_fcn(y, x);\n                w.innerHTML = this.fallback_html;\n            }\n        ;\n        ;\n            return false;\n        },\n        _createIframe: function(u) {\n            var v = l.create(\"div\", {\n                width: this.getAttribute(\"width\"),\n                height: this.getAttribute(\"height\"),\n                frameBorder: 0\n            });\n            l.empty(u);\n            u.appendChild(v);\n            i.useFacebookRefererHtml(v, this.getSWFHTML(), this.getAttribute(\"iframeSource\"));\n        }\n    });\n    o.SWFObjectUtil.getPlayerVersion = function() {\n        var u = new o.PlayerVersion([0,0,0,0,]), v;\n        if (((JSBNG__navigator.plugins && JSBNG__navigator.mimeTypes.length))) {\n            for (var w = 0; ((w < JSBNG__navigator.plugins.length)); w++) {\n                try {\n                    var y = JSBNG__navigator.plugins[w];\n                    if (((y.JSBNG__name == \"Shockwave Flash\"))) {\n                        v = new o.PlayerVersion(y.description.replace(/([a-zA-Z]|\\s)+/, \"\").replace(/(\\s+(r|d)|\\s+b[0-9]+)/, \".\").split(\".\"));\n                        if (((((((typeof u == \"undefined\")) || ((v.major > u.major)))) || ((((v.major == u.major)) && ((((v.minor > u.minor)) || ((((v.minor == u.minor)) && ((((v.release > u.release)) || ((((v.release == u.release)) && ((v.build > u.build))))))))))))))) {\n                            u = v;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (x) {\n                \n                };\n            ;\n            };\n        ;\n        }\n         else if (((JSBNG__navigator.userAgent && ((JSBNG__navigator.userAgent.indexOf(\"Windows CE\") >= 0))))) {\n            var z = 1, aa = 3;\n            while (z) {\n                try {\n                    aa++;\n                    z = new ActiveXObject(((\"ShockwaveFlash.ShockwaveFlash.\" + aa)));\n                    u = new o.PlayerVersion([aa,0,0,]);\n                } catch (ba) {\n                    z = null;\n                };\n            ;\n            };\n        ;\n        }\n         else {\n            try {\n                var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n            } catch (ca) {\n                try {\n                    var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n                    u = new o.PlayerVersion([6,0,21,]);\n                    z.AllowScriptAccess = \"always\";\n                } catch (da) {\n                    if (((u.major == 6))) {\n                        return u;\n                    }\n                ;\n                ;\n                };\n            ;\n                try {\n                    z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n                } catch (ea) {\n                \n                };\n            ;\n            };\n        ;\n            if (((z != null))) {\n                u = new o.PlayerVersion(z.GetVariable(\"$version\").split(\" \")[1].split(\",\"));\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        return u;\n    };\n    o.PlayerVersion = function(u) {\n        this.major = ((((u[0] != null)) ? parseInt(u[0], 10) : 0));\n        this.minor = ((((u[1] != null)) ? parseInt(u[1], 10) : 0));\n        this.release = ((((u[2] != null)) ? parseInt(u[2], 10) : 0));\n        this.build = ((((u[3] != null)) ? parseInt(u[3], 10) : 0));\n    };\n    o.PlayerVersion.prototype.versionIsValid = function(u) {\n        if (((this.major < u.major))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.major > u.major))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.minor < u.minor))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.minor > u.minor))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.release < u.release))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.release > u.release))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.build < u.build))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n    o.util = {\n        getRequestParameter: function(u) {\n            var v = ((JSBNG__document.JSBNG__location.search || JSBNG__document.JSBNG__location.hash));\n            if (((u == null))) {\n                return v;\n            }\n        ;\n        ;\n            if (v) {\n                var w = v.substring(1).split(\"&\");\n                for (var x = 0; ((x < w.length)); x++) {\n                    if (((w[x].substring(0, w[x].indexOf(\"=\")) == u))) {\n                        return w[x].substring(((w[x].indexOf(\"=\") + 1)));\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return \"\";\n        }\n    };\n    o.SWFObjectUtil.cleanupSWFs = function() {\n        var u = JSBNG__document.getElementsByTagName(\"OBJECT\");\n        for (var v = ((u.length - 1)); ((v >= 0)); v--) {\n            u[v].style.display = \"none\";\n            {\n                var fin253keys = ((window.top.JSBNG_Replay.forInKeys)((u[v]))), fin253i = (0);\n                var w;\n                for (; (fin253i < fin253keys.length); (fin253i++)) {\n                    ((w) = (fin253keys[fin253i]));\n                    {\n                        if (((typeof u[v][w] == \"function\"))) {\n                            u[v][w] = function() {\n                            \n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        };\n    ;\n    };\n    if (((!JSBNG__document.getElementById && JSBNG__document.all))) {\n        JSBNG__document.getElementById = function(u) {\n            return JSBNG__document.all[u];\n        };\n    }\n;\n;\n    var p = o.util.getRequestParameter, q = o.SWFObject, r = o.SWFObject;\n    o.spawn_flash_update_dialog = function() {\n        new g().setURI(\"/ajax/flash_update_dialog.php\").setMethod(\"GET\").setReadOnly(true).send();\n    };\n    function s(u, v) {\n        var w = m(u), x = o.SWFObjectUtil.getPlayerVersion(), y;\n        v.forEach(function(ba) {\n            ba = new o.PlayerVersion(ba.toString().split(\".\"));\n            if (((ba.major == x.major))) {\n                y = ba;\n                return;\n            }\n             else if (((((typeof y == \"undefined\")) || ((ba.major < y.major))))) {\n                y = ba;\n            }\n            \n        ;\n        ;\n        }.bind(this));\n        if (((w && ((x.major > 0))))) {\n            var z = ((((((((((((x.major + \".\")) + x.minor)) + \".\")) + x.release)) + \".\")) + x.build)), aa = ((((((((((((y.major + \".\")) + y.minor)) + \".\")) + y.release)) + \".\")) + y.build));\n            l.setContent(w, l.tx._(\"Flash {required-version} is required to view this content. Your current version is {current-version}. Please download the latest Flash Player.\", {\n                \"required-version\": aa,\n                \"current-version\": z\n            }));\n        }\n    ;\n    ;\n    };\n;\n    o.showFlashErrorDialog = function(u, v) {\n        h.loadModules([\"ErrorDialog\",], function(w) {\n            w.show(u, v);\n        });\n    };\n    function t(u, v, w) {\n        var x = /^[A-Za-z0-9\\-]+$/;\n        if (!u.match(x)) {\n            throw new Error(((\"Invalid tag \" + u)));\n        }\n    ;\n    ;\n        var y = ((\"\\u003C\" + u));\n        {\n            var fin254keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin254i = (0);\n            var z;\n            for (; (fin254i < fin254keys.length); (fin254i++)) {\n                ((z) = (fin254keys[fin254i]));\n                {\n                    if (!z.match(x)) {\n                        throw new Error(((\"Invalid attr \" + z)));\n                    }\n                ;\n                ;\n                    y += ((((((((\" \" + z)) + \"=\\\"\")) + n(v[z]))) + \"\\\"\"));\n                };\n            };\n        };\n    ;\n        if (((w === null))) {\n            return ((y + \"/\\u003E\"));\n        }\n         else return ((((((((((y + \"\\u003E\")) + w)) + \"\\u003C/\")) + u)) + \"\\u003E\"))\n    ;\n    };\n;\n    e.exports = ((a.deconcept || o));\n});\n__d(\"swfobject2\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"undefined\", i = \"object\", j = \"Shockwave Flash\", k = \"ShockwaveFlash.ShockwaveFlash\", l = \"application/x-shockwave-flash\", m = \"SWFObjectExprInst\", n = \"onreadystatechange\", o = window, p = JSBNG__document, q = JSBNG__navigator, r = false, s = [ka,], t = [], u = [], v = [], w, x, y, z, aa = false, ba = false, ca, da, ea = true, fa = function() {\n            var eb = ((((((typeof p.getElementById != h)) && ((typeof p.getElementsByTagName != h)))) && ((typeof p.createElement != h)))), fb = q.userAgent.toLowerCase(), gb = q.platform.toLowerCase(), hb = ((gb ? /win/.test(gb) : /win/.test(fb))), ib = ((gb ? /mac/.test(gb) : /mac/.test(fb))), jb = ((/webkit/.test(fb) ? parseFloat(fb.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/, \"$1\")) : false)), kb = !+\"\\u000b1\", lb = [0,0,0,], mb = null;\n            if (((((typeof q.plugins != h)) && ((typeof q.plugins[j] == i))))) {\n                mb = q.plugins[j].description;\n                if (((mb && !((((((typeof q.mimeTypes != h)) && q.mimeTypes[l])) && !q.mimeTypes[l].enabledPlugin))))) {\n                    r = true;\n                    kb = false;\n                    mb = mb.replace(/^.*\\s+(\\S+\\s+\\S+$)/, \"$1\");\n                    lb[0] = parseInt(mb.replace(/^(.*)\\..*$/, \"$1\"), 10);\n                    lb[1] = parseInt(mb.replace(/^.*\\.(.*)\\s.*$/, \"$1\"), 10);\n                    lb[2] = ((/[a-zA-Z]/.test(mb) ? parseInt(mb.replace(/^.*[a-zA-Z]+(.*)$/, \"$1\"), 10) : 0));\n                }\n            ;\n            ;\n            }\n             else if (((typeof o.ActiveXObject != h))) {\n                try {\n                    var ob = new ActiveXObject(k);\n                    if (ob) {\n                        mb = ob.GetVariable(\"$version\");\n                        if (mb) {\n                            kb = true;\n                            mb = mb.split(\" \")[1].split(\",\");\n                            lb = [parseInt(mb[0], 10),parseInt(mb[1], 10),parseInt(mb[2], 10),];\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (nb) {\n                \n                };\n            }\n            \n        ;\n        ;\n            return {\n                w3: eb,\n                pv: lb,\n                wk: jb,\n                ie: kb,\n                win: hb,\n                mac: ib\n            };\n        }(), ga = function() {\n            if (!fa.w3) {\n                return;\n            }\n        ;\n        ;\n            if (((((((typeof p.readyState != h)) && ((p.readyState == \"complete\")))) || ((((typeof p.readyState == h)) && ((p.getElementsByTagName(\"body\")[0] || p.body))))))) {\n                ha();\n            }\n        ;\n        ;\n            if (!aa) {\n                if (((typeof p.JSBNG__addEventListener != h))) {\n                    p.JSBNG__addEventListener(\"DOMContentLoaded\", ha, false);\n                }\n            ;\n            ;\n                if (((fa.ie && fa.win))) {\n                    p.JSBNG__attachEvent(n, function() {\n                        if (((p.readyState == \"complete\"))) {\n                            p.JSBNG__detachEvent(n, arguments.callee);\n                            ha();\n                        }\n                    ;\n                    ;\n                    });\n                    if (((o == JSBNG__top))) {\n                        (function() {\n                            if (aa) {\n                                return;\n                            }\n                        ;\n                        ;\n                            try {\n                                p.documentElement.doScroll(\"left\");\n                            } catch (eb) {\n                                JSBNG__setTimeout(arguments.callee, 0);\n                                return;\n                            };\n                        ;\n                            ha();\n                        })();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (fa.wk) {\n                    (function() {\n                        if (aa) {\n                            return;\n                        }\n                    ;\n                    ;\n                        if (!/loaded|complete/.test(p.readyState)) {\n                            JSBNG__setTimeout(arguments.callee, 0);\n                            return;\n                        }\n                    ;\n                    ;\n                        ha();\n                    })();\n                }\n            ;\n            ;\n                ja(ha);\n            }\n        ;\n        ;\n        }();\n        function ha() {\n            if (aa) {\n                return;\n            }\n        ;\n        ;\n            try {\n                var fb = p.getElementsByTagName(\"body\")[0].appendChild(xa(\"span\"));\n                fb.parentNode.removeChild(fb);\n            } catch (eb) {\n                return;\n            };\n        ;\n            aa = true;\n            var gb = s.length;\n            for (var hb = 0; ((hb < gb)); hb++) {\n                s[hb]();\n            ;\n            };\n        ;\n        };\n    ;\n        function ia(eb) {\n            if (aa) {\n                eb();\n            }\n             else s[s.length] = eb;\n        ;\n        ;\n        };\n    ;\n        function ja(eb) {\n            if (((typeof o.JSBNG__addEventListener != h))) {\n                o.JSBNG__addEventListener(\"load\", eb, false);\n            }\n             else if (((typeof p.JSBNG__addEventListener != h))) {\n                p.JSBNG__addEventListener(\"load\", eb, false);\n            }\n             else if (((typeof o.JSBNG__attachEvent != h))) {\n                ya(o, \"JSBNG__onload\", eb);\n            }\n             else if (((typeof o.JSBNG__onload == \"function\"))) {\n                var fb = o.JSBNG__onload;\n                o.JSBNG__onload = function() {\n                    fb();\n                    eb();\n                };\n            }\n             else o.JSBNG__onload = eb;\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        function ka() {\n            if (r) {\n                la();\n            }\n             else ma();\n        ;\n        ;\n        };\n    ;\n        function la() {\n            var eb = p.getElementsByTagName(\"body\")[0], fb = xa(i);\n            fb.setAttribute(\"type\", l);\n            fb.setAttribute(\"style\", \"visibility: hidden; position: absolute; top: -1000px;\");\n            var gb = eb.appendChild(fb);\n            if (gb) {\n                var hb = 0;\n                (function() {\n                    if (((typeof gb.GetVariable != h))) {\n                        var ib = gb.GetVariable(\"$version\");\n                        if (ib) {\n                            ib = ib.split(\" \")[1].split(\",\");\n                            fa.pv = [parseInt(ib[0], 10),parseInt(ib[1], 10),parseInt(ib[2], 10),];\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((hb < 10))) {\n                        hb++;\n                        JSBNG__setTimeout(arguments.callee, 10);\n                        return;\n                    }\n                    \n                ;\n                ;\n                    gb = null;\n                    ma();\n                })();\n            }\n             else ma();\n        ;\n        ;\n        };\n    ;\n        function ma() {\n            var eb = t.length;\n            if (((eb > 0))) {\n                for (var fb = 0; ((fb < eb)); fb++) {\n                    var gb = t[fb].id, hb = t[fb].callbackFn, ib = {\n                        success: false,\n                        id: gb\n                    };\n                    if (((fa.pv[0] > 0))) {\n                        var jb = wa(gb);\n                        if (jb) {\n                            if (((za(t[fb].swfVersion) && !((fa.wk && ((fa.wk < 312))))))) {\n                                bb(gb, true);\n                                if (hb) {\n                                    ib.success = true;\n                                    ib.ref = na(gb);\n                                    hb(ib);\n                                }\n                            ;\n                            ;\n                            }\n                             else if (((t[fb].expressInstall && oa()))) {\n                                var kb = {\n                                };\n                                kb.data = t[fb].expressInstall;\n                                kb.width = ((jb.getAttribute(\"width\") || \"0\"));\n                                kb.height = ((jb.getAttribute(\"height\") || \"0\"));\n                                if (jb.getAttribute(\"class\")) {\n                                    kb.styleclass = jb.getAttribute(\"class\");\n                                }\n                            ;\n                            ;\n                                if (jb.getAttribute(\"align\")) {\n                                    kb.align = jb.getAttribute(\"align\");\n                                }\n                            ;\n                            ;\n                                var lb = {\n                                }, mb = jb.getElementsByTagName(\"param\"), nb = mb.length;\n                                for (var ob = 0; ((ob < nb)); ob++) {\n                                    if (((mb[ob].getAttribute(\"JSBNG__name\").toLowerCase() != \"movie\"))) {\n                                        lb[mb[ob].getAttribute(\"JSBNG__name\")] = mb[ob].getAttribute(\"value\");\n                                    }\n                                ;\n                                ;\n                                };\n                            ;\n                                pa(kb, lb, gb, hb);\n                            }\n                             else {\n                                qa(jb);\n                                if (hb) {\n                                    hb(ib);\n                                }\n                            ;\n                            ;\n                            }\n                            \n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                     else {\n                        bb(gb, true);\n                        if (hb) {\n                            var pb = na(gb);\n                            if (((pb && ((typeof pb.SetVariable != h))))) {\n                                ib.success = true;\n                                ib.ref = pb;\n                            }\n                        ;\n                        ;\n                            hb(ib);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n        };\n    ;\n        function na(eb) {\n            var fb = null, gb = wa(eb);\n            if (((gb && ((gb.nodeName == \"OBJECT\"))))) {\n                if (((typeof gb.SetVariable != h))) {\n                    fb = gb;\n                }\n                 else {\n                    var hb = gb.getElementsByTagName(i)[0];\n                    if (hb) {\n                        fb = hb;\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return fb;\n        };\n    ;\n        function oa() {\n            return ((((((!ba && za(\"6.0.65\"))) && ((fa.win || fa.mac)))) && !((fa.wk && ((fa.wk < 312))))));\n        };\n    ;\n        function pa(eb, fb, gb, hb) {\n            ba = true;\n            y = ((hb || null));\n            z = {\n                success: false,\n                id: gb\n            };\n            var ib = wa(gb);\n            if (ib) {\n                if (((ib.nodeName == \"OBJECT\"))) {\n                    w = ra(ib);\n                    x = null;\n                }\n                 else {\n                    w = ib;\n                    x = gb;\n                }\n            ;\n            ;\n                eb.id = m;\n                if (((((typeof eb.width == h)) || ((!/%$/.test(eb.width) && ((parseInt(eb.width, 10) < 310))))))) {\n                    eb.width = \"310\";\n                }\n            ;\n            ;\n                if (((((typeof eb.height == h)) || ((!/%$/.test(eb.height) && ((parseInt(eb.height, 10) < 137))))))) {\n                    eb.height = \"137\";\n                }\n            ;\n            ;\n                p.title = ((p.title.slice(0, 47) + \" - Flash Player Installation\"));\n                var jb = ((((fa.ie && fa.win)) ? \"ActiveX\" : \"PlugIn\")), kb = ((((((((((\"MMredirectURL=\" + o.JSBNG__location.toString().replace(/&/g, \"%26\"))) + \"&MMplayerType=\")) + jb)) + \"&MMdoctitle=\")) + p.title));\n                if (((typeof fb.flashvars != h))) {\n                    fb.flashvars += ((\"&\" + kb));\n                }\n                 else fb.flashvars = kb;\n            ;\n            ;\n                if (((((fa.ie && fa.win)) && ((ib.readyState != 4))))) {\n                    var lb = xa(\"div\");\n                    gb += \"SWFObjectNew\";\n                    lb.setAttribute(\"id\", gb);\n                    ib.parentNode.insertBefore(lb, ib);\n                    ib.style.display = \"none\";\n                    (function() {\n                        if (((ib.readyState == 4))) {\n                            ib.parentNode.removeChild(ib);\n                        }\n                         else JSBNG__setTimeout(arguments.callee, 10);\n                    ;\n                    ;\n                    })();\n                }\n            ;\n            ;\n                sa(eb, fb, gb);\n            }\n        ;\n        ;\n        };\n    ;\n        function qa(eb) {\n            if (((((fa.ie && fa.win)) && ((eb.readyState != 4))))) {\n                var fb = xa(\"div\");\n                eb.parentNode.insertBefore(fb, eb);\n                fb.parentNode.replaceChild(ra(eb), fb);\n                eb.style.display = \"none\";\n                (function() {\n                    if (((eb.readyState == 4))) {\n                        eb.parentNode.removeChild(eb);\n                    }\n                     else JSBNG__setTimeout(arguments.callee, 10);\n                ;\n                ;\n                })();\n            }\n             else eb.parentNode.replaceChild(ra(eb), eb);\n        ;\n        ;\n        };\n    ;\n        function ra(eb) {\n            var fb = xa(\"div\");\n            if (((fa.win && fa.ie))) {\n                fb.innerHTML = eb.innerHTML;\n            }\n             else {\n                var gb = eb.getElementsByTagName(i)[0];\n                if (gb) {\n                    var hb = gb.childNodes;\n                    if (hb) {\n                        var ib = hb.length;\n                        for (var jb = 0; ((jb < ib)); jb++) {\n                            if (((!((((hb[jb].nodeType == 1)) && ((hb[jb].nodeName == \"PARAM\")))) && !((hb[jb].nodeType == 8))))) {\n                                fb.appendChild(hb[jb].cloneNode(true));\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return fb;\n        };\n    ;\n        function sa(eb, fb, gb) {\n            var hb, ib = wa(gb);\n            if (((fa.wk && ((fa.wk < 312))))) {\n                return hb;\n            }\n        ;\n        ;\n            if (ib) {\n                if (((typeof eb.id == h))) {\n                    eb.id = gb;\n                }\n            ;\n            ;\n                if (((fa.ie && fa.win))) {\n                    var jb = \"\";\n                    {\n                        var fin255keys = ((window.top.JSBNG_Replay.forInKeys)((eb))), fin255i = (0);\n                        var kb;\n                        for (; (fin255i < fin255keys.length); (fin255i++)) {\n                            ((kb) = (fin255keys[fin255i]));\n                            {\n                                if (((eb[kb] != Object.prototype[kb]))) {\n                                    if (((kb.toLowerCase() == \"data\"))) {\n                                        fb.movie = eb[kb];\n                                    }\n                                     else if (((kb.toLowerCase() == \"styleclass\"))) {\n                                        jb += ((((\" class=\\\"\" + eb[kb])) + \"\\\"\"));\n                                    }\n                                     else if (((kb.toLowerCase() != \"classid\"))) {\n                                        jb += ((((((((\" \" + kb)) + \"=\\\"\")) + eb[kb])) + \"\\\"\"));\n                                    }\n                                    \n                                    \n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    var lb = \"\";\n                    {\n                        var fin256keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin256i = (0);\n                        var mb;\n                        for (; (fin256i < fin256keys.length); (fin256i++)) {\n                            ((mb) = (fin256keys[fin256i]));\n                            {\n                                if (((fb[mb] != Object.prototype[mb]))) {\n                                    lb += ((((((((\"\\u003Cparam name=\\\"\" + mb)) + \"\\\" value=\\\"\")) + fb[mb])) + \"\\\" /\\u003E\"));\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    ib.outerHTML = ((((((((\"\\u003Cobject classid=\\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\\"\" + jb)) + \"\\u003E\")) + lb)) + \"\\u003C/object\\u003E\"));\n                    u[u.length] = eb.id;\n                    hb = wa(eb.id);\n                }\n                 else {\n                    var nb = xa(i);\n                    nb.setAttribute(\"type\", l);\n                    {\n                        var fin257keys = ((window.top.JSBNG_Replay.forInKeys)((eb))), fin257i = (0);\n                        var ob;\n                        for (; (fin257i < fin257keys.length); (fin257i++)) {\n                            ((ob) = (fin257keys[fin257i]));\n                            {\n                                if (((eb[ob] != Object.prototype[ob]))) {\n                                    if (((ob.toLowerCase() == \"styleclass\"))) {\n                                        nb.setAttribute(\"class\", eb[ob]);\n                                    }\n                                     else if (((ob.toLowerCase() != \"classid\"))) {\n                                        nb.setAttribute(ob, eb[ob]);\n                                    }\n                                    \n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    {\n                        var fin258keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin258i = (0);\n                        var pb;\n                        for (; (fin258i < fin258keys.length); (fin258i++)) {\n                            ((pb) = (fin258keys[fin258i]));\n                            {\n                                if (((((fb[pb] != Object.prototype[pb])) && ((pb.toLowerCase() != \"movie\"))))) {\n                                    ta(nb, pb, fb[pb]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    ib.parentNode.replaceChild(nb, ib);\n                    hb = nb;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return hb;\n        };\n    ;\n        function ta(eb, fb, gb) {\n            var hb = xa(\"param\");\n            hb.setAttribute(\"JSBNG__name\", fb);\n            hb.setAttribute(\"value\", gb);\n            eb.appendChild(hb);\n        };\n    ;\n        function ua(eb) {\n            var fb = wa(eb);\n            if (((fb && ((fb.nodeName == \"OBJECT\"))))) {\n                if (((fa.ie && fa.win))) {\n                    fb.style.display = \"none\";\n                    (function() {\n                        if (((fb.readyState == 4))) {\n                            va(eb);\n                        }\n                         else JSBNG__setTimeout(arguments.callee, 10);\n                    ;\n                    ;\n                    })();\n                }\n                 else fb.parentNode.removeChild(fb);\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        function va(eb) {\n            var fb = wa(eb);\n            if (fb) {\n                {\n                    var fin259keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin259i = (0);\n                    var gb;\n                    for (; (fin259i < fin259keys.length); (fin259i++)) {\n                        ((gb) = (fin259keys[fin259i]));\n                        {\n                            if (((typeof fb[gb] == \"function\"))) {\n                                fb[gb] = null;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                fb.parentNode.removeChild(fb);\n            }\n        ;\n        ;\n        };\n    ;\n        function wa(eb) {\n            var fb = null;\n            try {\n                fb = p.getElementById(eb);\n            } catch (gb) {\n            \n            };\n        ;\n            return fb;\n        };\n    ;\n        function xa(eb) {\n            return p.createElement(eb);\n        };\n    ;\n        function ya(eb, fb, gb) {\n            eb.JSBNG__attachEvent(fb, gb);\n            v[v.length] = [eb,fb,gb,];\n        };\n    ;\n        function za(eb) {\n            var fb = fa.pv, gb = eb.split(\".\");\n            gb[0] = parseInt(gb[0], 10);\n            gb[1] = ((parseInt(gb[1], 10) || 0));\n            gb[2] = ((parseInt(gb[2], 10) || 0));\n            return ((((((((fb[0] > gb[0])) || ((((fb[0] == gb[0])) && ((fb[1] > gb[1])))))) || ((((((fb[0] == gb[0])) && ((fb[1] == gb[1])))) && ((fb[2] >= gb[2])))))) ? true : false));\n        };\n    ;\n        function ab(eb, fb, gb, hb) {\n            if (((fa.ie && fa.mac))) {\n                return;\n            }\n        ;\n        ;\n            var ib = p.getElementsByTagName(\"head\")[0];\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            var jb = ((((gb && ((typeof gb == \"string\")))) ? gb : \"JSBNG__screen\"));\n            if (hb) {\n                ca = null;\n                da = null;\n            }\n        ;\n        ;\n            if (((!ca || ((da != jb))))) {\n                var kb = xa(\"style\");\n                kb.setAttribute(\"type\", \"text/css\");\n                kb.setAttribute(\"media\", jb);\n                ca = ib.appendChild(kb);\n                if (((((((fa.ie && fa.win)) && ((typeof p.styleSheets != h)))) && ((p.styleSheets.length > 0))))) {\n                    ca = p.styleSheets[((p.styleSheets.length - 1))];\n                }\n            ;\n            ;\n                da = jb;\n            }\n        ;\n        ;\n            if (((fa.ie && fa.win))) {\n                if (((ca && ((typeof ca.addRule == i))))) {\n                    ca.addRule(eb, fb);\n                }\n            ;\n            ;\n            }\n             else if (((ca && ((typeof p.createTextNode != h))))) {\n                ca.appendChild(p.createTextNode(((((((eb + \" {\")) + fb)) + \"}\"))));\n            }\n            \n        ;\n        ;\n        };\n    ;\n        function bb(eb, fb) {\n            if (!ea) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((fb ? \"visible\" : \"hidden\"));\n            if (((aa && wa(eb)))) {\n                wa(eb).style.visibility = gb;\n            }\n             else ab(((\"#\" + eb)), ((\"visibility:\" + gb)));\n        ;\n        ;\n        };\n    ;\n        function cb(eb) {\n            var fb = /[\\\\\\\"<>\\.;]/, gb = ((fb.exec(eb) != null));\n            return ((((gb && ((typeof encodeURIComponent != h)))) ? encodeURIComponent(eb) : eb));\n        };\n    ;\n        var db = function() {\n            if (((fa.ie && fa.win))) {\n                window.JSBNG__attachEvent(\"JSBNG__onunload\", function() {\n                    var eb = v.length;\n                    for (var fb = 0; ((fb < eb)); fb++) {\n                        v[fb][0].JSBNG__detachEvent(v[fb][1], v[fb][2]);\n                    ;\n                    };\n                ;\n                    var gb = u.length;\n                    for (var hb = 0; ((hb < gb)); hb++) {\n                        ua(u[hb]);\n                    ;\n                    };\n                ;\n                    {\n                        var fin260keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin260i = (0);\n                        var ib;\n                        for (; (fin260i < fin260keys.length); (fin260i++)) {\n                            ((ib) = (fin260keys[fin260i]));\n                            {\n                                fa[ib] = null;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    fa = null;\n                    {\n                        var fin261keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin261i = (0);\n                        var jb;\n                        for (; (fin261i < fin261keys.length); (fin261i++)) {\n                            ((jb) = (fin261keys[fin261i]));\n                            {\n                                g[jb] = null;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    g = null;\n                });\n            }\n        ;\n        ;\n        }();\n        return {\n            registerObject: function(eb, fb, gb, hb) {\n                if (((((fa.w3 && eb)) && fb))) {\n                    var ib = {\n                    };\n                    ib.id = eb;\n                    ib.swfVersion = fb;\n                    ib.expressInstall = gb;\n                    ib.callbackFn = hb;\n                    t[t.length] = ib;\n                    bb(eb, false);\n                }\n                 else if (hb) {\n                    hb({\n                        success: false,\n                        id: eb\n                    });\n                }\n                \n            ;\n            ;\n            },\n            getObjectById: function(eb) {\n                if (fa.w3) {\n                    return na(eb);\n                }\n            ;\n            ;\n            },\n            embedSWF: function(eb, fb, gb, hb, ib, jb, kb, lb, mb, nb) {\n                var ob = {\n                    success: false,\n                    id: fb\n                };\n                if (((((((((((((fa.w3 && !((fa.wk && ((fa.wk < 312)))))) && eb)) && fb)) && gb)) && hb)) && ib))) {\n                    bb(fb, false);\n                    ia(function() {\n                        gb += \"\";\n                        hb += \"\";\n                        var pb = {\n                        };\n                        if (((mb && ((typeof mb === i))))) {\n                            {\n                                var fin262keys = ((window.top.JSBNG_Replay.forInKeys)((mb))), fin262i = (0);\n                                var qb;\n                                for (; (fin262i < fin262keys.length); (fin262i++)) {\n                                    ((qb) = (fin262keys[fin262i]));\n                                    {\n                                        pb[qb] = mb[qb];\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        pb.data = eb;\n                        pb.width = gb;\n                        pb.height = hb;\n                        var rb = {\n                        };\n                        if (((lb && ((typeof lb === i))))) {\n                            {\n                                var fin263keys = ((window.top.JSBNG_Replay.forInKeys)((lb))), fin263i = (0);\n                                var sb;\n                                for (; (fin263i < fin263keys.length); (fin263i++)) {\n                                    ((sb) = (fin263keys[fin263i]));\n                                    {\n                                        rb[sb] = lb[sb];\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        if (((kb && ((typeof kb === i))))) {\n                            {\n                                var fin264keys = ((window.top.JSBNG_Replay.forInKeys)((kb))), fin264i = (0);\n                                var tb;\n                                for (; (fin264i < fin264keys.length); (fin264i++)) {\n                                    ((tb) = (fin264keys[fin264i]));\n                                    {\n                                        if (((typeof rb.flashvars != h))) {\n                                            rb.flashvars += ((((((\"&\" + tb)) + \"=\")) + kb[tb]));\n                                        }\n                                         else rb.flashvars = ((((tb + \"=\")) + kb[tb]));\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        if (za(ib)) {\n                            var ub = sa(pb, rb, fb);\n                            if (((pb.id == fb))) {\n                                bb(fb, true);\n                            }\n                        ;\n                        ;\n                            ob.success = true;\n                            ob.ref = ub;\n                        }\n                         else if (((jb && oa()))) {\n                            pb.data = jb;\n                            pa(pb, rb, fb, nb);\n                            return;\n                        }\n                         else bb(fb, true);\n                        \n                    ;\n                    ;\n                        if (nb) {\n                            nb(ob);\n                        }\n                    ;\n                    ;\n                    });\n                }\n                 else if (nb) {\n                    nb(ob);\n                }\n                \n            ;\n            ;\n            },\n            switchOffAutoHideShow: function() {\n                ea = false;\n            },\n            ua: fa,\n            getFlashPlayerVersion: function() {\n                return {\n                    major: fa.pv[0],\n                    minor: fa.pv[1],\n                    release: fa.pv[2]\n                };\n            },\n            hasFlashPlayerVersion: za,\n            createSWF: function(eb, fb, gb) {\n                if (fa.w3) {\n                    return sa(eb, fb, gb);\n                }\n                 else return undefined\n            ;\n            },\n            showExpressInstall: function(eb, fb, gb, hb) {\n                if (((fa.w3 && oa()))) {\n                    pa(eb, fb, gb, hb);\n                }\n            ;\n            ;\n            },\n            removeSWF: function(eb) {\n                if (fa.w3) {\n                    ua(eb);\n                }\n            ;\n            ;\n            },\n            createCSS: function(eb, fb, gb, hb) {\n                if (fa.w3) {\n                    ab(eb, fb, gb, hb);\n                }\n            ;\n            ;\n            },\n            addDomLoadEvent: ia,\n            addLoadEvent: ja,\n            getQueryParamValue: function(eb) {\n                var fb = ((p.JSBNG__location.search || p.JSBNG__location.hash));\n                if (fb) {\n                    if (/\\?/.test(fb)) {\n                        fb = fb.split(\"?\")[1];\n                    }\n                ;\n                ;\n                    if (((eb == null))) {\n                        return cb(fb);\n                    }\n                ;\n                ;\n                    var gb = fb.split(\"&\");\n                    for (var hb = 0; ((hb < gb.length)); hb++) {\n                        if (((gb[hb].substring(0, gb[hb].indexOf(\"=\")) == eb))) {\n                            return cb(gb[hb].substring(((gb[hb].indexOf(\"=\") + 1))));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                return \"\";\n            },\n            expressInstallCallback: function() {\n                if (ba) {\n                    var eb = wa(m);\n                    if (((eb && w))) {\n                        eb.parentNode.replaceChild(w, eb);\n                        if (x) {\n                            bb(x, true);\n                            if (((fa.ie && fa.win))) {\n                                w.style.display = \"block\";\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        if (y) {\n                            y(z);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ba = false;\n                }\n            ;\n            ;\n            }\n        };\n    }();\n    e.exports = g;\n});\n__d(\"SoundPlayer\", [\"Arbiter\",\"ChatConfig\",\"swfobject\",\"swfobject2\",\"URI\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatConfig\"), i = b(\"swfobject\").SWFObject, j = b(\"swfobject2\"), k = b(\"URI\"), l = b(\"createArrayFrom\"), m = {\n    }, n = null, o = false, p = \"so_sound_player\", q = \"/swf/SoundPlayer.swf?v=1\", r = \"10.0.22.87\", s = null, t = h.get(\"sound.useswfobject_2\", false), u = h.get(\"sound.force_flash\", false);\n    function v(da) {\n        var ea = k(da);\n        if (!ea.getDomain()) {\n            return k().setPath(ea.getPath()).toString();\n        }\n    ;\n    ;\n        return da;\n    };\n;\n    function w(da) {\n        var ea = k(da).getPath();\n        if (/\\.mp3$/.test(ea)) {\n            return \"audio/mpeg\";\n        }\n    ;\n    ;\n        if (/\\.og[ga]$/.test(ea)) {\n            return \"audio/ogg\";\n        }\n    ;\n    ;\n        return \"\";\n    };\n;\n    function x() {\n        if (((!s && !u))) {\n            var da = JSBNG__document.createElement(\"audio\");\n            if (((!da || !da.canPlayType))) {\n                return null;\n            }\n        ;\n        ;\n            da.setAttribute(\"preload\", \"auto\");\n            JSBNG__document.body.appendChild(da);\n            s = da;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function y() {\n        var da = ((JSBNG__document[p] || window[p]));\n        if (da) {\n            if (((!da.playSound && da.length))) {\n                da = da[0];\n            }\n        ;\n        }\n    ;\n    ;\n        return ((((((da && da.playSound)) && da.loopSound)) ? da : null));\n    };\n;\n    function z() {\n        return o;\n    };\n;\n    function aa(da, ea, fa) {\n        n = {\n            path: da,\n            sync: ea,\n            loop: fa\n        };\n    };\n;\n    function ba() {\n        o = true;\n        if (n) {\n            var da = y();\n            if (n.loop) {\n                da.loopSound(n.path, n.sync);\n            }\n             else da.playSound(n.path, n.sync);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var ca = {\n        init: function(da) {\n            da = l(da);\n            var ea;\n            for (var fa = 0; ((fa < da.length)); ++fa) {\n                ea = da[fa];\n                if (m[ea]) {\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            var ga = x();\n            for (fa = 0; ((ga && ((fa < da.length)))); ++fa) {\n                ea = da[fa];\n                if (ga.canPlayType(ea)) {\n                    m[ea] = true;\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            m[\"audio/mpeg\"] = true;\n            if (y()) {\n                return;\n            }\n        ;\n        ;\n            try {\n                g.registerCallback(ba, [\"sound/player_ready\",\"sound/ready\",]);\n                var ia = JSBNG__document.createElement(\"div\");\n                ia.id = \"sound_player_holder\";\n                JSBNG__document.body.appendChild(ia);\n                if (t) {\n                    j.embedSWF(q, ia.id, \"1px\", \"1px\", r, null, {\n                        swf_id: p\n                    }, {\n                        allowscriptaccess: \"always\",\n                        wmode: \"transparent\"\n                    }, null, function(ka) {\n                        window[p] = ka.ref;\n                        g.inform(\"sound/player_ready\");\n                    });\n                }\n                 else {\n                    var ja = new i(q, p, \"1px\", \"1px\", [r,], \"#ffffff\");\n                    ja.addParam(\"allowscriptaccess\", \"always\");\n                    ja.addParam(\"wmode\", \"transparent\");\n                    ja.addVariable(\"swf_id\", p);\n                    ja.fallback_html = \" \";\n                    ja.write(ia.id);\n                    window[p] = ja;\n                    g.inform(\"sound/player_ready\");\n                }\n            ;\n            ;\n            } catch (ha) {\n            \n            };\n        ;\n        },\n        play: function(da, ea) {\n            da = l(da);\n            var fa = x(), ga, ha;\n            for (var ia = 0; ((fa && ((ia < da.length)))); ++ia) {\n                ga = da[ia];\n                ha = w(ga);\n                if (!fa.canPlayType(ha)) {\n                    continue;\n                }\n            ;\n            ;\n                ca.init([ha,]);\n                fa.src = v(ga);\n                if (ea) {\n                    fa.setAttribute(\"loop\", \"\");\n                }\n                 else fa.removeAttribute(\"loop\");\n            ;\n            ;\n                fa.play();\n                return;\n            };\n        ;\n            for (ia = 0; ((ia < da.length)); ++ia) {\n                ga = v(da[ia]);\n                ha = w(ga);\n                if (((ha != \"audio/mpeg\"))) {\n                    continue;\n                }\n            ;\n            ;\n                ca.init([ha,]);\n                var ja = y();\n                if (!z()) {\n                    aa(ga, true, ea);\n                    return;\n                }\n                 else if (ja) {\n                    if (ea) {\n                        ja.loopSound(ga, true);\n                    }\n                     else ja.playSound(ga, true);\n                ;\n                ;\n                    return;\n                }\n                \n            ;\n            ;\n            };\n        ;\n        },\n        JSBNG__stop: function(da) {\n            da = l(da);\n            for (var ea = 0; ((ea < da.length)); ++ea) {\n                var fa = v(da[ea]), ga = x(), ha = y();\n                if (((ga && ((ga.src == fa))))) {\n                    ga.pause();\n                    ga.src = undefined;\n                }\n                 else ((ha && ha.stopSound(fa)));\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = ca;\n});\n__d(\"SoundSynchronizer\", [\"hasArrayNature\",\"SoundPlayer\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"SoundPlayer\"), i = b(\"createArrayFrom\"), j = \"fb_sounds_playing3\";\n    function k() {\n        if (window.JSBNG__localStorage) {\n            try {\n                var p = window.JSBNG__localStorage[j];\n                if (p) {\n                    p = JSON.parse(p);\n                    if (g(p)) {\n                        return p;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            } catch (o) {\n            \n            };\n        }\n    ;\n    ;\n        return [];\n    };\n;\n    function l(o) {\n        if (window.JSBNG__localStorage) {\n            var p = k();\n            p.push(o);\n            while (((p.length > 5))) {\n                p.shift();\n            ;\n            };\n        ;\n            try {\n                window.JSBNG__localStorage[j] = JSON.stringify(p);\n            } catch (q) {\n            \n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function m(o) {\n        return k().some(function(p) {\n            return ((p === o));\n        });\n    };\n;\n    var n = {\n        play: function(o, p, q) {\n            o = i(o);\n            p = ((p || ((o[0] + Math.floor(((JSBNG__Date.now() / 1000)))))));\n            if (m(p)) {\n                return;\n            }\n        ;\n        ;\n            h.play(o, q);\n            l(p);\n        },\n        isSupported: function() {\n            return !!window.JSBNG__localStorage;\n        }\n    };\n    e.exports = n;\n});\n__d(\"SoundRPC\", [\"JSBNG__Event\",\"SoundSynchronizer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"SoundSynchronizer\");\n    function i(k, l, m) {\n        h.play(k, l, m);\n    };\n;\n    var j = {\n        playLocal: i,\n        playRemote: function(k, l, m, n) {\n            var o = {\n                paths: l,\n                sync: m,\n                loop: n\n            };\n            k.JSBNG__postMessage(JSON.stringify(o), \"*\");\n        },\n        supportsRPC: function() {\n            return !!window.JSBNG__postMessage;\n        },\n        _listen: function() {\n            g.listen(window, \"message\", function(k) {\n                if (!/\\.facebook.com$/.test(k.origin)) {\n                    return;\n                }\n            ;\n            ;\n                var l = JSON.parse(k.data);\n                i(l.paths, l.sync, l.loop);\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"Sound\", [\"SoundPlayer\",\"SoundRPC\",\"SoundSynchronizer\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SoundPlayer\"), h = b(\"SoundRPC\"), i = b(\"SoundSynchronizer\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = null, m = {\n        init: function(q) {\n            if (!l) {\n                g.init(q);\n            }\n        ;\n        ;\n        },\n        play: function(q, r, s) {\n            if (l) {\n                h.playRemote(l.contentWindow, q, r, false);\n            }\n             else h.playLocal(q, r, s);\n        ;\n        ;\n        },\n        JSBNG__stop: function(q) {\n            if (!l) {\n                g.JSBNG__stop(q);\n            }\n        ;\n        ;\n        }\n    }, n = new j(JSBNG__location.href);\n    if (((n.getSubdomain() && ((n.getSubdomain() !== \"www\"))))) {\n        n.setSubdomain(\"www\");\n    }\n;\n;\n    var o = n.getDomain();\n    function p() {\n        if (((k.ie() < 9))) {\n            return false;\n        }\n    ;\n    ;\n        return ((i.isSupported() && h.supportsRPC()));\n    };\n;\n    if (((((n.isFacebookURI() && ((JSBNG__location.host !== o)))) && p()))) {\n        l = JSBNG__document.createElement(\"div\");\n        l.setAttribute(\"src\", ((((\"//\" + o)) + \"/sound_iframe.php\")));\n        l.style.display = \"none\";\n        JSBNG__document.body.appendChild(l);\n    }\n;\n;\n    e.exports = m;\n});\n__d(\"MercuryBrowserAlerts\", [\"ArbiterMixin\",\"ChatActivity\",\"ChatConfig\",\"ChatOptions\",\"ChatTitleBarBlinker\",\"MercuryParticipants\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MessagingTag\",\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatOptions\"), k = b(\"ChatTitleBarBlinker\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryThreadMuter\"), n = b(\"MercuryThreads\").get(), o = b(\"MessagingTag\"), p = b(\"Sound\"), q = b(\"copyProperties\");\n    p.init([\"audio/ogg\",\"audio/mpeg\",]);\n    function r(t) {\n        if (j.getSetting(\"sound\")) {\n            p.play([i.get(\"sound.notif_ogg_url\"),i.get(\"sound.notif_mp3_url\"),], t, false);\n        }\n    ;\n    ;\n    };\n;\n    var s = {\n        messageReceived: function(t) {\n            if (((((((t.author == l.user)) || !t.is_unread)) || ((((t.folder != o.INBOX)) && ((t.folder != o.ARCHIVED))))))) {\n                return;\n            }\n        ;\n        ;\n            var u = t.thread_id, v = h.isActive();\n            if (v) {\n                var w = false;\n                s.inform(\"before-alert\", {\n                    threadID: u,\n                    cancelAlert: function() {\n                        w = true;\n                    }\n                });\n            }\n        ;\n        ;\n            n.getThreadMeta(u, function(x) {\n                var y = m.isThreadMuted(x);\n                if (y) {\n                    return;\n                }\n            ;\n            ;\n                var z = t.timestamp;\n                if (v) {\n                    ((!w && r(z)));\n                }\n                 else {\n                    k.blink(u, z);\n                    r(z);\n                }\n            ;\n            ;\n                k.blinkingElsewhere();\n            }.bind(this));\n        }\n    };\n    e.exports = q(s, g);\n});\n__d(\"ActiveXSupport\", [], function(a, b, c, d, e, f) {\n    var g = null, h = {\n        isSupported: function() {\n            if (((g !== null))) {\n                return g;\n            }\n        ;\n        ;\n            try {\n                g = ((!!window.ActiveXObject && !!new ActiveXObject(\"htmlfile\")));\n            } catch (i) {\n                g = false;\n            };\n        ;\n            return g;\n        }\n    };\n    e.exports = h;\n});\n__d(\"VideoCallSupport\", [\"MercuryConfig\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"UserAgent\"), i = {\n        newVCIsSupported: function() {\n            return ((g.NewVCGK && ((((h.chrome() >= 24)) || ((h.firefox() >= 22))))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"VideoCallRecordMessageDialog\", [\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"URI\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Dialog\"), j = b(\"URI\"), k = b(\"tx\"), l = {\n        get: function(m, n) {\n            var o = \"Would you like to leave a message?\", p = \"New Message\";\n            return new i().setTitle(k._(\"{firstname} is Unavailable\", {\n                firstname: n\n            })).setBody(o).setButtons([{\n                JSBNG__name: \"record-message\",\n                label: p\n            },i.CANCEL,]).setHandler(function() {\n                var q = j(\"/ajax/messaging/composer.php\").setQueryData({\n                    ids: [m,],\n                    autoloadvideo: true\n                }).toString();\n                g.send(new h(q));\n            });\n        }\n    };\n    e.exports = l;\n});\n__d(\"VideoCallCore\", [\"JSBNG__Event\",\"ActiveXSupport\",\"Arbiter\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConstants\",\"Cookie\",\"CSS\",\"Dialog\",\"MercuryConfig\",\"UserAgent\",\"VideoCallSupport\",\"emptyFunction\",\"ge\",\"VideoCallTemplates\",\"ShortProfiles\",\"VideoCallRecordMessageDialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ActiveXSupport\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AvailableList\"), l = b(\"AvailableListConstants\"), m = b(\"Bootloader\"), n = b(\"ChannelConstants\"), o = b(\"Cookie\"), p = b(\"CSS\"), q = b(\"Dialog\"), r = b(\"MercuryConfig\"), s = b(\"UserAgent\"), t = b(\"VideoCallSupport\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    b(\"VideoCallTemplates\");\n    var w = [], x = [], y = {\n        isSupported: function() {\n            if (t.newVCIsSupported()) {\n                return true;\n            }\n        ;\n        ;\n            if (s.windows()) {\n                if (((((s.ie() >= 9)) && !s.ie64()))) {\n                    return h.isSupported();\n                }\n                 else return ((((((((((s.ie() >= 7)) && !s.ie64())) || ((s.firefox() >= 3.6)))) || ((s.chrome() >= 5)))) || ((s.JSBNG__opera() >= 12))))\n            ;\n            }\n             else if (((s.osx() > 10.4))) {\n                return ((((((((s.firefox() >= 3.6)) || ((s.chrome() >= 5)))) || ((s.webkit() >= 500)))) || ((s.JSBNG__opera() >= 12))));\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        isInstalled: function() {\n            var ca = false;\n            if (this.isSupported()) {\n                if (z()) {\n                    var da = null;\n                    try {\n                        da = new ActiveXObject(\"SkypeLimited.SkypeWebPlugin\");\n                        ca = !!da;\n                    } catch (ea) {\n                    \n                    };\n                ;\n                    da = null;\n                }\n                 else {\n                    ca = aa();\n                    if (r.VideoCallingNoJavaGK) {\n                        if (((ca && ((s.osx() >= 10.8))))) {\n                            if (((ca.description && ((ca.description.charAt(0) != \"v\"))))) {\n                                ca = false;\n                            }\n                        ;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return ca;\n        },\n        mightReloadPostInstall: function() {\n            return s.windows();\n        },\n        onVideoMessage: function(ca) {\n            w.push(ca);\n            m.loadModules([\"VideoCallController\",], u);\n        },\n        onRTCMessage: function(ca) {\n            if (t.newVCIsSupported()) {\n                x.push(ca);\n                m.loadModules([\"FBRTCCallController\",], u);\n            }\n        ;\n        ;\n        },\n        setMessageHandler: function(ca) {\n            this.onVideoMessage = ca;\n            if (ca) {\n                while (w.length) {\n                    ca(w.shift());\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        setRTCMessageHandler: function(ca) {\n            this.onRTCMessage = ca;\n            if (ca) {\n                while (x.length) {\n                    ca(x.shift());\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        availableForCall: function(ca) {\n            var da = k.get(ca);\n            return ((((da == l.ACTIVE)) || ((da == l.IDLE))));\n        },\n        onProfileButtonClick: function(ca) {\n            y.startCallOrLeaveMessage(ca, \"profile_button_click\");\n        },\n        attachListenerToProfileButton: function(ca) {\n            var da = v(\"videoCallProfileButton\");\n            if (da) {\n                if (!y.isSupported()) {\n                    p.hide(da);\n                    return;\n                }\n            ;\n            ;\n                g.listen(da, \"click\", function(JSBNG__event) {\n                    y.startCallOrLeaveMessage(ca, \"profile_button_click_timeline\");\n                });\n            }\n        ;\n        ;\n        },\n        startCallOrLeaveMessage: function(ca, da) {\n            if (this.availableForCall(ca)) {\n                y.showOutgoingCallDialog(ca, da);\n            }\n             else b(\"ShortProfiles\").get(ca, function(ea) {\n                b(\"VideoCallRecordMessageDialog\").get(ca, ea.firstName).show();\n            });\n        ;\n        ;\n        },\n        showOutgoingCallDialog: function(ca, da) {\n            var ea = ((da || \"unknown\"));\n            y.logClick(ca, ea);\n            var fa = ((((y.isInstalled() || r.NewVCGK)) ? \"outgoing_dialog.php\" : \"intro.php\")), ga = ((((((\"/ajax/chat/video/\" + fa)) + \"?idTarget=\")) + ca));\n            new q().setAllowCrossPageTransition(true).setAsync(new j(ga)).show();\n        },\n        logClick: function(ca, da) {\n            new j().setURI(\"/ajax/chat/video/log_click.php\").setData({\n                targetUserID: ca,\n                clickSource: da\n            }).setAllowCrossPageTransition(true).setErrorHandler(u).send();\n        }\n    };\n    function z() {\n        return ((((s.ie() && s.windows())) && !s.JSBNG__opera()));\n    };\n;\n    function aa() {\n        if (!JSBNG__navigator) {\n            return null;\n        }\n    ;\n    ;\n        JSBNG__navigator.plugins.refresh(false);\n        var ca = JSBNG__navigator.mimeTypes[\"application/skypesdk-plugin\"];\n        return ((ca && ca.enabledPlugin));\n    };\n;\n    function ba() {\n        if (!y.mightReloadPostInstall()) {\n            return;\n        }\n    ;\n    ;\n        var ca = o.get(\"vcpwn\");\n        if (ca) {\n            o.clear(\"vcpwn\");\n            var da = o.get(\"vctid\");\n            if (da) {\n                o.clear(\"vctid\");\n                if (o.get(\"vctid\")) {\n                    return;\n                }\n            ;\n            ;\n                if (((da && y.isInstalled()))) {\n                    var ea = ((\"/ajax/chat/video/outgoing_dialog.php?idTarget=\" + da));\n                    new q().setAllowCrossPageTransition(true).setAsync(new j(ea)).show();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    i.subscribe(n.getArbiterType(\"video\"), function(ca, da) {\n        y.onVideoMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"webrtc\"), function(ca, da) {\n        y.onRTCMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"chat_event\"), function(ca, da) {\n        if (((da.obj.event_name == \"missed-call\"))) {\n            m.loadModules([\"VideoCallController\",], function(ea) {\n                ea.onMissedCallEvent(da.obj);\n            });\n        }\n    ;\n    ;\n    });\n    ba();\n    e.exports = y;\n});\n__d(\"ChatApp\", [\"CSS\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"JSLogger\"), i = false, j = false, k = false, l = null, m = {\n        init: function(n, o, p) {\n            if (l) {\n                h.create(\"chat_app\").error(\"repeated_init\");\n                return;\n            }\n        ;\n        ;\n            l = n;\n            d([\"TabsViewport\",\"ChatTabController\",\"ChatTabViewCoordinator\",\"MercuryServerRequests\",\"MercuryChannelHandler\",\"MercuryStateCheck\",], function(q, r, s, t, u, v) {\n                t.get().handleUpdate(p);\n                this.tabsViewport = new q(o);\n                this.tabController = new r(this.tabsViewport);\n                this.tabViewCoordinator = new s(o, this.tabsViewport);\n                i = j = true;\n            }.bind(this));\n        },\n        hide: function() {\n            if (((!i || k))) {\n                return;\n            }\n        ;\n        ;\n            g.hide(l);\n            k = true;\n        },\n        unhide: function() {\n            if (i) {\n                if (k) {\n                    g.show(l);\n                    this.tabsViewport.checkWidth();\n                    d([\"Dock\",], function(n) {\n                        n.resizeAllFlyouts();\n                    });\n                    k = false;\n                }\n            ;\n            ;\n            }\n             else if (!j) {\n                d([\"UIPagelet\",], function(n) {\n                    n.loadFromEndpoint(\"ChatTabsPagelet\", \"ChatTabsPagelet\");\n                    n.loadFromEndpoint(\"BuddylistPagelet\", \"BuddylistPagelet\");\n                });\n                j = true;\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"DataViewPolyfill\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i, j, k) {\n        if (((j === undefined))) {\n            this._ba = new JSBNG__Uint8Array(i);\n        }\n         else if (((k === undefined))) {\n            this._ba = new JSBNG__Uint8Array(i, j);\n        }\n         else this._ba = new JSBNG__Uint8Array(i, j, k);\n        \n    ;\n    ;\n        this.byteLength = this._ba.byteLength;\n    };\n;\n    g(h, {\n        isSupported: function() {\n            return !!a.JSBNG__Uint8Array;\n        }\n    });\n    g(h.prototype, {\n        getUint8: function(i) {\n            if (((i >= this._ba.length))) {\n                throw new Error(\"Trying to read beyond bounds of DataViewPolyfill\");\n            }\n        ;\n        ;\n            return this._ba[i];\n        },\n        getUint16: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8(((i + 1)));\n            return ((j ? ((((l * 256)) + k)) : ((((k * 256)) + l))));\n        },\n        getUint32: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8(((i + 1))), m = this.getUint8(((i + 2))), n = this.getUint8(((i + 3)));\n            return ((j ? ((((((((((((n * 256)) + m)) * 256)) + l)) * 256)) + k)) : ((((((((((((k * 256)) + l)) * 256)) + m)) * 256)) + n))));\n        }\n    });\n    e.exports = h;\n});\n__d(\"getImageSize\", [\"DataViewPolyfill\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataViewPolyfill\"), h = ((a.JSBNG__DataView || g));\n    function i(m) {\n        return {\n            width: m.getUint16(6, true),\n            height: m.getUint16(8, true)\n        };\n    };\n;\n    function j(m) {\n        return {\n            width: m.getUint32(16, false),\n            height: m.getUint32(20, false)\n        };\n    };\n;\n    function k(m) {\n        var n = m.byteLength, o = 2;\n        while (((o < n))) {\n            var p = m.getUint16(o, false);\n            o += 2;\n            if (((((p == 65472)) || ((p == 65474))))) {\n                return {\n                    width: m.getUint16(((o + 5)), false),\n                    height: m.getUint16(((o + 3)), false)\n                };\n            }\n             else o += m.getUint16(o, false);\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function l(m) {\n        var n = new h(m);\n        if (((((n.getUint8(0) == 255)) && ((n.getUint8(1) == 216))))) {\n            return k(n);\n        }\n    ;\n    ;\n        if (((((((n.getUint8(0) == 71)) && ((n.getUint8(1) == 73)))) && ((n.getUint8(2) == 70))))) {\n            return i(n);\n        }\n    ;\n    ;\n        if (((((((((n.getUint8(0) == 137)) && ((n.getUint8(1) == 80)))) && ((n.getUint8(2) == 78)))) && ((n.getUint8(3) == 71))))) {\n            return j(n);\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    e.exports = l;\n    l.gif = i;\n    l.png = j;\n    l.jpeg = k;\n});\n__d(\"ChatAutoSendPhotoUploader\", [\"ArbiterMixin\",\"DOM\",\"JSBNG__Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachmentType\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getImageSize\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"FileForm\"), k = b(\"FileFormResetOnSubmit\"), l = b(\"FileInput\"), m = b(\"FormSubmitOnChange\"), n = b(\"MercuryAttachmentType\"), o = b(\"SubscriptionsHandler\"), p = b(\"copyProperties\"), q = b(\"csx\"), r = b(\"getImageSize\"), s = b(\"removeFromArray\"), t = b(\"shield\"), u = 0;\n    function v(w, x, y) {\n        this._idElem = y;\n        this._input = x;\n        this._subscriptionsHandler = new o();\n        this._uploadBatches = [];\n        var z = new j(w, [m,k,]), aa = h.JSBNG__find(w, \".-cx-PRIVATE-mercuryFileUploader__root\"), ba = h.JSBNG__find(aa, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new l(aa, ba, x);\n        this._subscriptionsHandler.addSubscriptions(z.subscribe(\"submit\", this._onFileSubmit.bind(this)), z.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), z.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), i.listen(ba, \"click\", t(this.inform, this, \"open\")));\n    };\n;\n    p(v.prototype, g, {\n        isUploading: function() {\n            return ((this._uploadBatches.length > 0));\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n        },\n        _getPreviewAttachment: function(w) {\n            var x = {\n                attach_type: n.PHOTO,\n                preview_uploading: true\n            };\n            if (w) {\n                x.preview_width = w.width;\n                x.preview_height = w.height;\n            }\n        ;\n        ;\n            return x;\n        },\n        _onFileSubmit: function() {\n            u += 1;\n            var w = ((\"upload_\" + u));\n            this._idElem.value = w;\n            this._uploadBatches.push(w);\n            if (((((((((typeof JSBNG__FileReader !== \"undefined\")) && JSBNG__FileReader.prototype.readAsArrayBuffer)) && this._input.files)) && ((this._input.files.length === 1))))) {\n                var x = new JSBNG__FileReader();\n                x.JSBNG__onload = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(r(x.result)),]\n                    });\n                }.bind(this);\n                x.JSBNG__onerror = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(null),]\n                    });\n                }.bind(this);\n                x.readAsArrayBuffer(this._input.files[0]);\n            }\n             else {\n                var y = 1;\n                if (this._input.files) {\n                    y = this._input.files.length;\n                }\n            ;\n            ;\n                var z = [];\n                for (var aa = 0; ((aa < y)); ++aa) {\n                    z.push(this._getPreviewAttachment(null));\n                ;\n                };\n            ;\n                this.inform(\"submit\", {\n                    upload_id: w,\n                    raw_attachments: z\n                });\n            }\n        ;\n        ;\n        },\n        _onFileUploadSuccess: function(JSBNG__event, w) {\n            var x = w.response.getPayload(), y = x.uploadID;\n            s(this._uploadBatches, y);\n            var z = [];\n            x.metadata.forEach(function(aa) {\n                z.push(aa.image_id);\n            });\n            this.inform(\"all-uploads-completed\", {\n                upload_id: x.uploadID,\n                image_ids: z\n            });\n        },\n        _onFileUploadFailure: function(JSBNG__event, w) {\n            var x = this._uploadBatches[((this._uploadBatches.length - 1))];\n            s(this._uploadBatches, x);\n            this.inform(\"all-uploads-failed\", {\n                upload_id: x\n            });\n        }\n    });\n    e.exports = v;\n});\n__d(\"ChatTabModel\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"ChatBehavior\",\"ChatConfig\",\"JSLogger\",\"MercuryAssert\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryTimestampTracker\",\"PresenceInitialData\",\"PresenceState\",\"PresenceUtil\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"JSLogger\"), l = b(\"MercuryAssert\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"MercuryTimestampTracker\").get(), p = b(\"PresenceInitialData\"), q = b(\"PresenceState\"), r = b(\"PresenceUtil\"), s = b(\"areObjectsEqual\"), t = b(\"copyProperties\"), u = [], v = null, w = null, x = null, y = null;\n    function z() {\n        return parseInt(p.serverTime, 10);\n    };\n;\n    var aa = ((j.get(\"tab_max_load_age\") || 3600000)), ba = ((z() - aa)), ca = 0, da = 20, ea = k.create(\"chat_tab_model\"), fa = false;\n    function ga(xa) {\n        var ya = q.verifyNumber(xa.uct2);\n        if (((!ya || ((typeof ya !== \"number\"))))) {\n            ea.warn(\"bad_cookie_version\", xa.uct2);\n            return null;\n        }\n    ;\n    ;\n        if (((((ya < ca)) || ((ya < ba))))) {\n            return null;\n        }\n    ;\n    ;\n        return ya;\n    };\n;\n    function ha(xa) {\n        var ya = ga(xa);\n        if (!ya) {\n            var za = {\n            };\n            za.old_tabs = ((((xa && xa.t2)) && JSON.stringify(xa.t2)));\n            za.old_promoted = ((xa && xa.lm2));\n            za.old_time = ((xa && xa.uct2));\n            za.old_reason = ((xa && xa.tr));\n            za.old_window = ((xa && xa.tw));\n            var ab;\n            if (((w && xa.t2))) {\n                for (var bb = 0; ((bb < xa.t2.length)); bb++) {\n                    var cb = xa.t2[bb];\n                    if (((cb.i === w))) {\n                        ab = cb.r;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            var db = [];\n            u.forEach(function(eb) {\n                if (!eb.fragile) {\n                    var fb = {\n                        i: eb.id,\n                        si: eb.server_id\n                    };\n                    if (((eb.raised || ((((eb.id === w)) && ab))))) {\n                        fb.r = 1;\n                    }\n                ;\n                ;\n                    db.push(fb);\n                }\n            ;\n            ;\n            });\n            xa.t2 = db;\n            xa.uct2 = ca;\n            xa.lm2 = v;\n            xa.tr = y;\n            xa.tw = r.getSessionID();\n            za.new_tabs = JSON.stringify(xa.t2);\n            za.new_promoted = xa.lm2;\n            za.new_time = xa.uct2;\n            za.new_reason = xa.tr;\n            za.new_window = xa.tw;\n            ea.debug(\"store\", za);\n        }\n    ;\n    ;\n        return xa;\n    };\n;\n    function ia(xa) {\n        if (xa) {\n            var ya = ga(xa);\n            if (((ya && ((ya !== ca))))) {\n                var za = {\n                };\n                za.old_tabs = JSON.stringify(u);\n                za.old_promoted = v;\n                za.old_time = ca;\n                za.old_reason = y;\n                za.window_id = r.getSessionID();\n                za.cookie_tabs = ((((xa && xa.t2)) && JSON.stringify(xa.t2)));\n                za.cookie_promoted = ((xa && xa.lm2));\n                za.cookie_time = ((xa && xa.uct2));\n                za.cookie_reason = ((xa && xa.tr));\n                za.cookie_window = ((xa && xa.tw));\n                ca = ya;\n                y = \"load\";\n                var ab = ja(xa.t2, ((xa.lm2 || null)));\n                za.load_result = ab;\n                za.new_tabs = JSON.stringify(u);\n                za.new_promoted = v;\n                za.new_time = ca;\n                za.new_reason = y;\n                var JSBNG__event = \"load\";\n                if (!fa) {\n                    JSBNG__event += \"_init\";\n                }\n            ;\n            ;\n                ea.log(JSBNG__event, za);\n                return ab;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ja(xa, ya) {\n        if (ka(xa, ya)) {\n            var za = u.filter(function(cb) {\n                return cb.fragile;\n            }), ab = {\n            };\n            v = null;\n            u = xa.map(function(cb) {\n                var db = {\n                    id: cb.i,\n                    server_id: cb.si\n                };\n                if (((db.id == ya))) {\n                    v = db.id;\n                }\n            ;\n            ;\n                if (((w == cb.i))) {\n                    var eb = pa(w);\n                    if (((eb != -1))) {\n                        db.raised = u[eb].raised;\n                        return db;\n                    }\n                     else return null\n                ;\n                }\n            ;\n            ;\n                if (cb.r) {\n                    db.raised = true;\n                }\n            ;\n            ;\n                ab[db.id] = db;\n                return db;\n            });\n            u = u.filter(function(cb) {\n                return ((cb != null));\n            });\n            if (x) {\n                {\n                    var fin265keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin265i = (0);\n                    var bb;\n                    for (; (fin265i < fin265keys.length); (fin265i++)) {\n                        ((bb) = (fin265keys[fin265i]));\n                        {\n                            if (((!ab[bb] || !ab[bb].raised))) {\n                                delete x[bb];\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            za = za.filter(function(cb) {\n                return !ab[cb.id];\n            });\n            u = u.concat(za);\n            oa();\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ka(xa, ya) {\n        if (((ya != v))) {\n            return true;\n        }\n    ;\n    ;\n        var za = u.filter(function(cb) {\n            return !cb.fragile;\n        });\n        if (((xa.length != za.length))) {\n            return true;\n        }\n    ;\n    ;\n        for (var ab = 0, bb = xa.length; ((ab < bb)); ab++) {\n            if (((xa[ab].id === w))) {\n                continue;\n            }\n        ;\n        ;\n            if (!s(xa[ab], za[ab])) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    function la(xa, ya, za) {\n        var ab = ia(q.get());\n        if (((((ya === undefined)) || ((ya > ca))))) {\n            if (xa()) {\n                ab = true;\n                y = ((za || null));\n                na(ya);\n            }\n        ;\n        ;\n        }\n         else ea.error(\"rejected\", {\n            change_time: ya,\n            state_time: ca\n        });\n    ;\n    ;\n        ((ab && ma()));\n    };\n;\n    function ma() {\n        if (fa) {\n            va.inform(\"chat/tabs-changed\", va.get());\n        }\n    ;\n    ;\n    };\n;\n    function na(xa) {\n        if (((xa === undefined))) {\n            xa = Math.max(((o.getLastUserMessageTimestamp() || 1)), ((ca + 1)));\n        }\n    ;\n    ;\n        ca = xa;\n        q.doSync();\n    };\n;\n    function oa() {\n        var xa = ((u.length - da));\n        if (((xa > 0))) {\n            u = u.filter(function(ya) {\n                return ((ya.raised || ((xa-- <= 0))));\n            });\n        }\n    ;\n    ;\n    };\n;\n    function pa(xa) {\n        for (var ya = 0; ((ya < u.length)); ya++) {\n            if (((u[ya].id == xa))) {\n                return ya;\n            }\n        ;\n        ;\n        };\n    ;\n        return -1;\n    };\n;\n    function qa(xa, ya) {\n        var za = n.getThreadMetaNow(xa);\n        if (!za) {\n            return false;\n        }\n    ;\n    ;\n        if (za.is_canonical_user) {\n            return sa(xa, ya);\n        }\n         else {\n            var ab = ra(xa);\n            if (ab) {\n                m.getServerThreadID(xa, function(bb) {\n                    if (ta(xa, bb)) {\n                        na();\n                        ma();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            return ab;\n        }\n    ;\n    ;\n    };\n;\n    function ra(xa) {\n        if (((pa(xa) === -1))) {\n            u.push({\n                id: xa,\n                fragile: true\n            });\n            ea.log(\"open_fragile_tab\", {\n                tabs: JSON.stringify(u),\n                opened: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function sa(xa, ya) {\n        var za = pa(xa);\n        if (((za != -1))) {\n            if (u[za].fragile) {\n                u.splice(za, 1);\n            }\n             else {\n                u[za].signatureID = ya;\n                return true;\n            }\n        ;\n        }\n    ;\n    ;\n        for (var ab = 0; ((ab <= u.length)); ab++) {\n            if (((((ab == u.length)) || u[ab].fragile))) {\n                u.splice(ab, 0, {\n                    id: xa,\n                    signatureID: ya\n                });\n                oa();\n                ea.log(\"open_tab\", {\n                    tabs: JSON.stringify(u),\n                    opened: xa,\n                    window_id: r.getSessionID()\n                });\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function ta(xa, ya) {\n        var za = pa(xa);\n        if (((((za != -1)) && u[za].fragile))) {\n            var ab = u[za];\n            ab.fragile = false;\n            ab.server_id = ya;\n            var bb = [];\n            u.forEach(function(cb) {\n                if (((cb.id != xa))) {\n                    if (((ab && cb.fragile))) {\n                        bb.push(ab);\n                        ab = null;\n                    }\n                ;\n                ;\n                    bb.push(cb);\n                }\n            ;\n            ;\n            });\n            if (ab) {\n                bb.push(ab);\n            }\n        ;\n        ;\n            u = bb;\n            ea.log(\"make_permanent\", {\n                tabs: JSON.stringify(u),\n                tab_id: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ua(xa) {\n        var ya = pa(xa);\n        if (((xa == v))) {\n            v = null;\n        }\n    ;\n    ;\n        if (((ya != -1))) {\n            u.splice(ya, 1);\n            ea.log(\"close_tab\", {\n                tabs: JSON.stringify(u),\n                JSBNG__closed: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    q.registerStateStorer(ha);\n    q.registerStateLoader(function(xa) {\n        if (ia(xa)) {\n            ma();\n        }\n    ;\n    ;\n    });\n    function va() {\n    \n    };\n;\n    t(va, h, {\n        indexOf: function(xa) {\n            return pa(xa);\n        },\n        getTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = this.indexOf(xa);\n            if (((ya > -1))) {\n                var za = u[ya];\n                return t({\n                }, za);\n            }\n        ;\n        ;\n            return null;\n        },\n        getEmptyTab: function() {\n            for (var xa = 0; ((xa < u.length)); xa++) {\n                var ya = u[xa].id;\n                if (n.isNewEmptyLocalThread(ya)) {\n                    return ya;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getServerTime: function() {\n            return z();\n        },\n        closeAllTabs: function() {\n            if (u.length) {\n                ea.log(\"close_all_tabs\", {\n                    closed_tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n                u = [];\n                v = null;\n                if (x) {\n                    x = {\n                    };\n                }\n            ;\n            ;\n                na();\n                ma();\n            }\n        ;\n        ;\n        },\n        closeFragileTabs: function() {\n            var xa = [];\n            for (var ya = 0; ((ya < u.length)); ya++) {\n                if (((u[ya].fragile && !n.isNewEmptyLocalThread(u[ya].id)))) {\n                    xa.push(u[ya]);\n                    u.splice(ya);\n                    ma();\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            ea.log(\"close_fragile_tabs\", {\n                tabs: JSON.stringify(u),\n                fragile_closed: xa,\n                window_id: r.getSessionID()\n            });\n        },\n        closeTab: function(xa, ya) {\n            l.isThreadID(xa);\n            var za = false;\n            if (x) {\n                delete x[xa];\n                za = true;\n            }\n        ;\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    za = true;\n                }\n            ;\n            ;\n                return za;\n            }, undefined, ya);\n        },\n        closeTabAndDemote: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (x) {\n                delete x[xa];\n                ab = true;\n            }\n        ;\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    if (v) {\n                        var bb = pa(v);\n                        if (((bb > ya))) {\n                            var cb = u.splice(bb, 1)[0];\n                            u.splice(ya, 0, cb);\n                            v = null;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ab = true;\n                }\n            ;\n            ;\n                return ab;\n            }, undefined, za);\n        },\n        raiseTab: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (((x && ya))) {\n                x[xa] = true;\n                ab = true;\n            }\n        ;\n        ;\n            if (((!ya && ((xa === w))))) {\n                ((ab && ma()));\n                return;\n            }\n        ;\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    ab = true;\n                }\n            ;\n            ;\n                var bb = pa(xa);\n                if (((((bb != -1)) && !u[bb].raised))) {\n                    u[bb].raised = true;\n                    ab = true;\n                    ea.log(\"raise_tab\", {\n                        tabs: JSON.stringify(u),\n                        raised: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n            ;\n                return ab;\n            });\n        },\n        get: function() {\n            var xa = u.map(function(ya) {\n                var za = t({\n                }, ya);\n                delete za.fragile;\n                if (x) {\n                    za.raised = x[za.id];\n                }\n            ;\n            ;\n                return za;\n            });\n            return {\n                tabs: xa,\n                promoted: v\n            };\n        },\n        openFragileTab: function(xa) {\n            l.isThreadID(xa);\n            if (ra(xa)) {\n                ma();\n            }\n        ;\n        ;\n        },\n        openTab: function(xa) {\n            l.isThreadID(xa);\n            la(qa.curry(xa));\n        },\n        lowerTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = false;\n            if (x) {\n                delete x[xa];\n                ya = true;\n            }\n        ;\n        ;\n            la(function() {\n                var za = pa(xa);\n                if (((((za != -1)) && u[za].raised))) {\n                    delete u[za].raised;\n                    ea.log(\"lower_tab\", {\n                        tabs: JSON.stringify(u),\n                        lowered: xa,\n                        window_id: r.getSessionID()\n                    });\n                    ya = true;\n                }\n            ;\n            ;\n                return ya;\n            });\n        },\n        raiseAndPromoteTab: function(xa, ya, za, ab, bb) {\n            l.isThreadID(xa);\n            var cb = false;\n            if (((x && ya))) {\n                x[xa] = true;\n                cb = true;\n            }\n        ;\n        ;\n            if (((!ya && ((xa === w))))) {\n                ((cb && ma()));\n                return;\n            }\n        ;\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    cb = true;\n                }\n            ;\n            ;\n                var db = pa(xa);\n                if (((((db != -1)) && ((!u[db].raised || ((v != xa))))))) {\n                    u[db].raised = true;\n                    v = xa;\n                    cb = true;\n                    ea.log(\"raise_and_promote_tab\", {\n                        tabs: JSON.stringify(u),\n                        promoted: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n            ;\n                return cb;\n            }, ab, bb);\n        },\n        promoteThreadInPlaceOfThread: function(xa, ya) {\n            l.isThreadID(xa);\n            l.isThreadID(ya);\n            la(function() {\n                var za = pa(xa), ab = pa(ya);\n                if (((v === ya))) {\n                    v = xa;\n                }\n            ;\n            ;\n                var bb = u[za];\n                u[za] = u[ab];\n                u[ab] = bb;\n                return true;\n            });\n        },\n        squelchTab: function(xa) {\n            l.isThreadID(xa);\n            w = xa;\n            this.lowerTab(xa);\n            ea.log(\"squelch_tab\", {\n                squelched: xa,\n                tabs: JSON.stringify(u),\n                window_id: r.getSessionID()\n            });\n        },\n        clearSquelchedTab: function() {\n            if (w) {\n                ea.log(\"unsquelch_tab\", {\n                    squelched: w,\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        ;\n            w = null;\n        },\n        persistLocalRaised: function() {\n            if (x) {\n                la(function() {\n                    var xa = false;\n                    u.forEach(function(ya) {\n                        if (((ya.raised != x[ya.id]))) {\n                            xa = true;\n                            if (x[ya.id]) {\n                                ya.raised = true;\n                            }\n                             else delete ya.raised;\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    });\n                    return xa;\n                });\n                ea.log(\"persist_local_raise\", {\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        ;\n        }\n    });\n    g.subscribe(k.DUMP_EVENT, function(xa, ya) {\n        ya.chat_tabs = {\n            promoted: v,\n            tabs: u.map(function(za) {\n                return t({\n                }, za);\n            }),\n            time: ca,\n            max_load_age: aa\n        };\n    });\n    function wa() {\n        var xa = i.ignoresRemoteTabRaise();\n        if (((xa && !x))) {\n            ea.log(\"start_ignore_remote_raise\");\n            x = {\n            };\n            ma();\n        }\n         else if (((!xa && x))) {\n            ea.log(\"stop_ignore_remote_raise\");\n            x = null;\n            ma();\n        }\n        \n    ;\n    ;\n    };\n;\n    i.subscribe(i.ON_CHANGED, wa);\n    wa();\n    ia(q.getInitial(), true);\n    if (((ca === 0))) {\n        ca = ((z() - 600000));\n    }\n;\n;\n    fa = true;\n    e.exports = va;\n});\n__d(\"VideoCallPromo\", [\"ArbiterMixin\",\"AsyncRequest\",\"ChatConfig\",\"ChatVisibility\",\"LegacyContextualDialog\",\"CSS\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"LegacyContextualDialog\"), l = b(\"CSS\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"VideoCallCore\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\");\n    function s() {\n        this._dialog = null;\n    };\n;\n    function t(v) {\n        if (!((p.isSupported() && i.get(\"video.show_promo\")))) {\n            return false;\n        }\n    ;\n    ;\n        var w = n.getCanonicalUserInThread(v);\n        if (!w) {\n            return false;\n        }\n    ;\n    ;\n        return ((j.isOnline() && p.availableForCall(w)));\n    };\n;\n    function u(v) {\n        new h().setURI(\"/ajax/chat/video/log_promo.php\").setData({\n            viewedUserID: v\n        }).setAllowCrossPageTransition(true).setErrorHandler(r).send();\n    };\n;\n    q(s.prototype, g);\n    q(s.prototype, {\n        render: function(v, w) {\n            var x = t(w);\n            if (!x) {\n                return;\n            }\n        ;\n        ;\n            var y = n.getCanonicalUserInThread(w);\n            m.get(((\"fbid:\" + y)), function(z) {\n                if (!z.call_promo) {\n                    return;\n                }\n            ;\n            ;\n                var aa = o[\":fb:mercury:call:promo\"].build();\n                this._dialog = new k();\n                this._dialog.init(aa.getRoot()).setWidth(250).setAlignH(\"center\").setContext(v).show();\n                l.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n                l.addClass(v, \"video_call_promo\");\n                u(n.getCanonicalUserInThread(w));\n                this.inform(\"chat/dialog-rendered\", {\n                    dialog: this,\n                    thread_id: w\n                });\n            }.bind(this));\n        },\n        updatePosition: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.updatePosition();\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"VideoCallTourDialog\", [\"ArbiterMixin\",\"LegacyContextualDialog\",\"CSS\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"VideoCallingTour\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LegacyContextualDialog\"), i = b(\"CSS\"), j = b(\"MercuryThreads\").get(), k = b(\"ChatTabTemplates\"), l = b(\"VideoCallCore\"), m = b(\"VideoCallingTour\"), n = b(\"copyProperties\");\n    function o() {\n        this._dialog = null;\n    };\n;\n    n(o.prototype, g);\n    n(o.prototype, {\n        render: function(p, q) {\n            var r = j.getCanonicalUserInThread(q);\n            if (((!r || !l.availableForCall(r)))) {\n                return;\n            }\n        ;\n        ;\n            var s = k[\":fb:mercury:call:tour\"].build();\n            this._dialog = new h();\n            this._dialog.init(s.getRoot()).setWidth(250).setAlignH(\"center\").setContext(p).show();\n            i.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n            i.addClass(p, \"video_call_tour\");\n            this.inform(\"chat/dialog-rendered\", {\n                dialog: this,\n                thread_id: q\n            });\n            m.inform(\"videocallingtour/end\");\n        },\n        updatePosition: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.updatePosition();\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatContextualDialogController\", [\"JSBNG__Event\",\"ArbiterMixin\",\"ChatTabModel\",\"VideoCallingTour\",\"VideoCallPromo\",\"VideoCallTourDialog\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"VideoCallingTour\"), k = b(\"VideoCallPromo\"), l = b(\"VideoCallTourDialog\"), m = b(\"copyProperties\"), n = b(\"setTimeoutAcrossTransitions\"), o = 60000, p = false, q = false, r = function(y, z) {\n        this._videoCallPromo = new k();\n        this._videoCallTour = new l();\n        this._threadID = y;\n        this._tabMainElement = z;\n        this._openDialog = null;\n        this._subscriptionTokens = [];\n        this._scrollListener = null;\n        this._timeout = null;\n    };\n    function s(y, JSBNG__event, z) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        }\n    ;\n    ;\n    };\n;\n    function t(y) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        }\n    ;\n    ;\n    };\n;\n    function u(y) {\n        if (y._openDialog) {\n            y._openDialog.hide();\n            y._openDialog = null;\n        }\n    ;\n    ;\n        if (y._timeout) {\n            JSBNG__clearTimeout(y._timeout);\n            y._timeout = null;\n        }\n    ;\n    ;\n        while (y._subscriptionTokens.length) {\n            y._subscriptionTokens.pop().unsubscribe();\n        ;\n        };\n    ;\n        if (y._scrollListener) {\n            y._scrollListener.remove();\n            y._scrollListener = null;\n        }\n    ;\n    ;\n    };\n;\n    function v(y, JSBNG__event, z) {\n        if (((z.thread_id === y._threadID))) {\n            y._openDialog = z.dialog;\n            p = true;\n            x(y);\n            y._timeout = n(y.destroy.bind(y, y._threadID), o);\n            y._scrollListener = g.listen(window, \"JSBNG__scroll\", t.curry(y));\n        }\n    ;\n    ;\n    };\n;\n    function w(y, z) {\n        if (!y._openDialog) {\n            y._subscriptionTokens.push(z.subscribe(\"chat/dialog-rendered\", v.curry(y)));\n            z.render(y._tabMainElement, y._threadID);\n        }\n    ;\n    ;\n    };\n;\n    function x(y) {\n        y._subscriptionTokens.push(i.subscribe(\"chat/tabs-changed\", s.curry(y)), r.subscribe(\"dialog/close-all\", u.curry(y)));\n    };\n;\n    m(r, h);\n    m(r.prototype, {\n        destroy: function() {\n            u(this);\n        },\n        tabFocused: function() {\n            if (q) {\n                w(this, this._videoCallTour);\n                return;\n            }\n        ;\n        ;\n            if (!p) {\n                w(this, this._videoCallPromo);\n            }\n        ;\n        ;\n        },\n        tabNotActive: function() {\n            u(this);\n        },\n        hideVideoCallouts: function() {\n            u(this);\n        }\n    });\n    j.subscribe(\"videocallingtour/start\", function() {\n        q = true;\n        r.inform(\"dialog/close-all\");\n    });\n    j.subscribe(\"videocallingtour/end\", function() {\n        q = false;\n    });\n    e.exports = r;\n});\n__d(\"ChatPrivacyActionController\", [\"ChatVisibility\",\"JSLogger\",\"PresencePrivacy\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatVisibility\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = b(\"copyProperties\"), k = function(l, m) {\n        this._userID = l;\n        this._logger = h.create(\"blackbird\");\n        this._getState = function() {\n            if (g.isOnline()) {\n                return ((i.allows(this._userID) ? k.NORMAL : k.BLOCKED));\n            }\n        ;\n        ;\n            return k.OFFLINE;\n        };\n        this._togglePrivacy = function() {\n            var n = this._getState();\n            switch (this._getState()) {\n              case k.OFFLINE:\n                if (g.isOnline()) {\n                    this._logger.error(\"tabs_already_online\");\n                    break;\n                }\n            ;\n            ;\n                this._logger.log(\"tabs_go_online\", {\n                    tab_id: this._userID\n                });\n                g.goOnline(function() {\n                    if (!i.allows(this._userID)) {\n                        if (((this._getState() !== k.BLOCKED))) {\n                            this._logger.error(\"privacy_action_controller_blocked_inconsistency\");\n                        }\n                    ;\n                    ;\n                        this._togglePrivacy();\n                    }\n                ;\n                ;\n                }.bind(this));\n                break;\n              case k.BLOCKED:\n                i.allow(this._userID);\n                this._logger.log(\"tabs_unblock\", {\n                    tab_id: this._userID\n                });\n                break;\n              case k.NORMAL:\n                i.disallow(this._userID);\n                this._logger.log(\"tabs_block\", {\n                    tab_id: this._userID\n                });\n                break;\n            };\n        ;\n        };\n        (function() {\n            var n = function() {\n                ((m && m(this._getState())));\n            }.bind(this);\n            n();\n            this._subscribeToken = i.subscribe(\"privacy-changed\", n);\n        }.bind(this)).defer();\n    };\n    k.OFFLINE = \"offline\";\n    k.BLOCKED = \"blocked\";\n    k.NORMAL = \"normal\";\n    j(k.prototype, {\n        togglePrivacy: function() {\n            this._logger.log(\"gear_menu_toggle_privacy\", {\n                tab_id: this._userID\n            });\n            this._togglePrivacy();\n        },\n        destroy: function() {\n            i.unsubscribe(this._subscribeToken);\n        }\n    });\n    e.exports = k;\n});\n__d(\"MercuryTypingIndicator\", [\"Animation\",\"CSS\",\"DOM\",\"MercuryTypingReceiver\",\"MercuryParticipants\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Tooltip\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryTypingReceiver\"), k = b(\"MercuryParticipants\"), l = b(\"Style\"), m = b(\"ChatTabTemplates\"), n = b(\"MercuryThreadInformer\").get(), o = b(\"Tooltip\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\"), s = [];\n    n.subscribe(\"messages-received\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            ((y && x.receivedMessages(y)));\n        });\n    });\n    j.subscribe(\"state-changed\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            ((y && x._handleStateChanged(y)));\n        });\n    });\n    function t(v) {\n        var w = m[\":fb:chat:conversation:message-group\"].build(), x = m[\":fb:mercury:typing-indicator:typing\"].build();\n        h.addClass(w.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\");\n        var y = w.getNode(\"profileLink\");\n        o.set(y, v.JSBNG__name, \"left\");\n        y.href = v.href;\n        w.setNodeContent(\"profileName\", v.JSBNG__name);\n        w.setNodeProperty(\"profilePhoto\", \"src\", v.image_src);\n        var z = r._(\"{name} is typing...\", {\n            JSBNG__name: v.short_name\n        });\n        o.set(x.getRoot(), z, \"above\");\n        i.appendContent(w.getNode(\"messages\"), x.getRoot());\n        return w;\n    };\n;\n    function u(v, w, x) {\n        this._animations = {\n        };\n        this._activeUsers = {\n        };\n        this._typingIndicator = w;\n        this._messagesView = x;\n        this._threadID = v;\n        this._subscription = j.subscribe(\"state-changed\", function(y, z) {\n            var aa = z[this._threadID];\n            ((aa && this._handleStateChanged(aa)));\n        }.bind(this));\n        s.push(this);\n    };\n;\n    p(u.prototype, {\n        destroy: function() {\n            Object.keys(this._activeUsers).forEach(this._removeUserBubble.bind(this));\n            this._controller.destroy();\n            s.remove(this);\n        },\n        receivedMessages: function(v) {\n            v.forEach(function(w) {\n                if (!k.isAuthor(w.author)) {\n                    this._removeUserBubble(w.author);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _handleStateChanged: function(v) {\n            {\n                var fin266keys = ((window.top.JSBNG_Replay.forInKeys)((this._activeUsers))), fin266i = (0);\n                var w;\n                for (; (fin266i < fin266keys.length); (fin266i++)) {\n                    ((w) = (fin266keys[fin266i]));\n                    {\n                        if (((v.indexOf(w) === -1))) {\n                            this._slideOutUserBubble(w);\n                            delete this._activeUsers[w];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (v.length) {\n                k.getMulti(v, function(x) {\n                    var y = this._messagesView.isScrolledToBottom(), z = {\n                    };\n                    {\n                        var fin267keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin267i = (0);\n                        var aa;\n                        for (; (fin267i < fin267keys.length); (fin267i++)) {\n                            ((aa) = (fin267keys[fin267i]));\n                            {\n                                var ba = this._activeUsers[aa];\n                                z[aa] = ((ba || t(x[aa]).getRoot()));\n                                if (!ba) {\n                                    i.appendContent(this._typingIndicator, z[aa]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    var ca = ((Object.keys(z).length > 0));\n                    ((y && this._messagesView.scrollToBottom(ca)));\n                    this._activeUsers = z;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _removeUserBubble: function(v, w) {\n            var x = this._getCurrentAnimation(v, w);\n            if (x) {\n                x.animation.JSBNG__stop();\n                i.remove(x.elem);\n                delete this._animations[v];\n            }\n        ;\n        ;\n            if (((v in this._activeUsers))) {\n                i.remove(this._activeUsers[v]);\n                delete this._activeUsers[v];\n            }\n        ;\n        ;\n            ((w && i.remove(w)));\n        },\n        _slideOutUserBubble: function(v) {\n            var w = this._activeUsers[v];\n            if (this._getCurrentAnimation(v, w)) {\n                return;\n            }\n             else if (w) {\n                l.set(w, \"overflow\", \"hidden\");\n                var x = (new g(w)).from(\"opacity\", 1).from(\"height\", w.offsetHeight).to(\"height\", 0).to(\"opacity\", 0).ease(g.ease.end).duration(250).ondone(this._removeUserBubble.bind(this, v, w)).go();\n                this._animations[v] = {\n                    animation: x,\n                    elem: w\n                };\n            }\n            \n        ;\n        ;\n        },\n        _getCurrentAnimation: function(v, w) {\n            if (((this._animations[v] && ((!w || ((this._animations[v].elem === w))))))) {\n                return this._animations[v];\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"ChatTabMessagesView\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"MercuryAttachment\",\"MercuryAttachmentRenderer\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"createArrayFrom\",\"CSS\",\"DOM\",\"Env\",\"JSBNG__Event\",\"JoinableConversationMessageFilter\",\"LiveTimer\",\"MercuryActionTypeConstants\",\"MercuryAPIArgsSource\",\"MercuryLastMessageIndicator\",\"MercuryLogMessageType\",\"MercurySourceType\",\"shield\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"MercuryThreadlistConstants\",\"MercuryTypingIndicator\",\"MercuryMessageRenderer\",\"Parent\",\"MercuryParticipants\",\"React\",\"ServerTime\",\"MercuryStatusTemplates\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Timestamp.react\",\"Tooltip\",\"VideoCallCore\",\"copyProperties\",\"csx\",\"cx\",\"formatDate\",\"isRTL\",\"removeFromArray\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"MercuryAttachment\"), l = b(\"MercuryAttachmentRenderer\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"createArrayFrom\"), q = b(\"CSS\"), r = b(\"DOM\"), s = b(\"Env\"), t = b(\"JSBNG__Event\"), u = b(\"JoinableConversationMessageFilter\"), v = b(\"LiveTimer\"), w = b(\"MercuryActionTypeConstants\"), x = b(\"MercuryAPIArgsSource\"), y = b(\"MercuryLastMessageIndicator\"), z = b(\"MercuryLogMessageType\"), aa = b(\"MercurySourceType\"), ba = b(\"shield\"), ca = b(\"MercuryMessages\").get(), da = b(\"MercuryServerRequests\").get(), ea = b(\"MercuryThreadMetadataRawRenderer\"), fa = b(\"MercuryThreadMetadataRenderer\").get(), ga = b(\"MercuryThreads\").get(), ha = b(\"MercuryThreadlistConstants\"), ia = b(\"MercuryTypingIndicator\"), ja = b(\"MercuryMessageRenderer\"), ka = b(\"Parent\"), la = b(\"MercuryParticipants\"), ma = b(\"React\"), na = b(\"ServerTime\"), oa = b(\"MercuryStatusTemplates\"), pa = b(\"Style\"), qa = b(\"ChatTabTemplates\"), ra = b(\"MercuryThreadInformer\").get(), sa = b(\"Timestamp.react\"), ta = b(\"Tooltip\"), ua = b(\"VideoCallCore\"), va = b(\"copyProperties\"), wa = b(\"csx\"), xa = b(\"cx\"), ya = b(\"formatDate\"), za = b(\"isRTL\"), ab = b(\"removeFromArray\"), bb = b(\"throttle\"), cb = b(\"tx\"), db, eb = 34, fb = ((((1000 * 60)) * 60)), gb = 70, hb = null, ib = 20;\n    function jb(tb) {\n        return ya(new JSBNG__Date(tb), ((n.get(\"24h_times\") ? \"H:i\" : \"g:ia\")));\n    };\n;\n    function kb(tb) {\n        var ub = qa[\":fb:chat:conversation:message-group\"].build(), vb = ub.getNode(\"profileLink\"), wb = n.get(\"chat_tab_bubbles\"), xb = la.isAuthor(tb.author), yb = da.tokenizeThreadID(tb.thread_id), zb = ((yb.type !== \"user\")), ac = ((!xb || !wb));\n        if (!wb) {\n            ub.setNodeContent(\"timestamp\", jb(tb.timestamp));\n        }\n    ;\n    ;\n        q.conditionClass(ub.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\", ((!xb && wb)));\n        q.conditionClass(ub.getRoot(), \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\", ((((zb && !xb)) && wb)));\n        q.conditionShow(vb, ac);\n        la.get(tb.author, function(bc) {\n            if (ac) {\n                vb.href = bc.href;\n                var cc = ((xb ? \"You\" : bc.JSBNG__name));\n                if (((!xb && wb))) {\n                    cc = g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__tooltipcontainer\"\n                    }, g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__timestamptooltip\"\n                    }, jb(tb.timestamp)), bc.JSBNG__name);\n                }\n            ;\n            ;\n                ta.set(vb, cc, \"left\");\n                if (((((!xb && wb)) && zb))) {\n                    ub.setNodeContent(\"profileName\", bc.JSBNG__name);\n                }\n            ;\n            ;\n                ub.setNodeProperty(\"profilePhoto\", \"src\", bc.image_src);\n            }\n        ;\n        ;\n        });\n        return ub;\n    };\n;\n    function lb(tb) {\n        var ub = qa[\":fb:chat:conversation:message:event\"].build(), vb = n.get(\"chat_tab_bubbles\"), wb = jb(tb.timestamp);\n        if (vb) {\n            ub.getRoot().setAttribute(\"title\", wb);\n        }\n         else ub.setNodeContent(\"timestamp\", wb);\n    ;\n    ;\n        ja.renderLogMessage(ub.getNode(\"icon\"), ub.getNode(\"message\"), ub.getNode(\"attachment\"), tb);\n        var xb = nb(tb);\n        if (xb) {\n            r.appendContent(ub.getNode(\"message\"), xb);\n        }\n    ;\n    ;\n        return ub.getRoot();\n    };\n;\n    function mb(tb, ub) {\n        if (!n.get(\"chat_tab_bubbles\")) {\n            return;\n        }\n    ;\n    ;\n        if (((hb === null))) {\n            var vb = ub.childNodes[0];\n            pa.set(ub, \"overflow\", \"JSBNG__scroll\");\n            hb = ((vb.clientWidth - gb));\n            pa.set(ub, \"overflow\", \"\");\n        }\n    ;\n    ;\n        if (!q.hasClass(tb, \"-cx-PRIVATE-fbChatMessage__root\")) {\n            var wb = r.scry(tb, \".-cx-PRIVATE-fbChatMessage__root\");\n            if (((wb.length === 1))) {\n                tb = wb[0];\n            }\n             else return\n        ;\n        }\n    ;\n    ;\n        pa.set(tb, \"max-width\", ((hb + \"px\")));\n        var xb, yb, zb = tb.firstChild;\n        if (((((tb.childNodes.length === 1)) && zb.getAttribute(\"data-measureme\")))) {\n            xb = zb.getClientRects();\n            var ac = zb.offsetHeight;\n            if (((((xb && ((xb.length > 1)))) && ((xb[0].height < ac))))) {\n                yb = true;\n                if (!db) {\n                    r.remove(zb);\n                    db = tb.offsetWidth;\n                    r.appendContent(tb, zb);\n                }\n            ;\n            ;\n                var bc = zb.offsetWidth, cc = ((((tb.offsetWidth - bc)) - db));\n                if (((cc > 0))) {\n                    pa.set(tb, \"max-width\", ((bc + \"px\")));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var dc = ka.byClass(tb, \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\");\n        if (dc) {\n            q.conditionClass(dc, \"-cx-PRIVATE-fbChatMessageGroup__onelineunderprofilename\", ((xb ? !yb : ((tb.offsetHeight < eb)))));\n        }\n    ;\n    ;\n    };\n;\n    function nb(tb) {\n        var ub, vb;\n        if (((tb.log_message_type == z.VIDEO_CALL))) {\n            if (((tb.log_message_data.event_name == \"install_canceled\"))) {\n                ub = r.tx._(\"Retry setup and call back.\");\n                vb = \"callback_cancelinstall_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.to, vb);\n            }\n             else if (((((!tb.log_message_data.event_name && ((tb.log_message_data.callee == la.user)))) && !tb.log_message_data.answered))) {\n                ub = r.tx._(\"Call Back\");\n                vb = \"callback_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.caller.split(\":\")[1], vb);\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function ob(tb, ub, vb, wb) {\n        if (ua.isSupported()) {\n            var xb = ((!o.isOnline() || !ua.availableForCall(vb))), yb = r.create(\"a\", {\n                href: \"#\",\n                className: \"callBackLink\"\n            }, tb);\n            if (xb) {\n                q.hide(yb);\n            }\n        ;\n        ;\n            yb.setAttribute(\"data-gt\", JSON.stringify({\n                videochat: \"clicked_callback_link\"\n            }));\n            t.listen(yb, \"click\", function() {\n                rb.inform(\"video-call-clicked\", {\n                    userID: vb,\n                    threadID: ub,\n                    clickSource: wb\n                });\n            });\n            return yb;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function pb(tb) {\n        var ub = qa[\":fb:mercury:chat:message:forward\"].build(), vb = ub.getNode(\"forwardText\");\n        if (vb) {\n            q.hide(ub.getRoot());\n            fa.renderTitanLink(tb.thread_id, ub.getNode(\"forwardLink\"), q.show.bind(q, ub.getRoot()));\n            if (((tb.forward_count > 1))) {\n                r.appendContent(vb, cb._(\"{count} forwarded messages\", {\n                    count: tb.forward_count\n                }));\n            }\n             else r.appendContent(vb, \"1 forwarded message\");\n        ;\n        ;\n        }\n    ;\n    ;\n        return ub.getRoot();\n    };\n;\n    var qb = [];\n    function rb(tb, ub, vb, wb, xb, yb, zb) {\n        this.loadingIcon = xb;\n        this.threadID = tb;\n        this.sheetController = ub;\n        this.scrollContainer = vb;\n        this.conversationElem = wb;\n        this.messageElements = {\n        };\n        this.messageGroup = null;\n        this.prevMessage = null;\n        v.restart(((na.get() / 1000)));\n        this._fetchMultiplier = 1;\n        this._oldestMessageDisplayedTimestamp = null;\n        this._loadingMoreMessages = false;\n        this._currentMessageCount = 0;\n        this._hasReachedClearedMessages = false;\n        var ac = ha.MESSAGE_TIMESTAMP_THRESHOLD;\n        this._oldestMessageDisplayedTimestamp = ((JSBNG__Date.now() - ac));\n        qb.push(this);\n        this._subscription = i.subscribe(\"overflow-applied-to-body\", this.scrollToBottom.bind(this));\n        t.listen(this.scrollContainer, \"JSBNG__scroll\", bb(this.scrolling, 50, this));\n        var bc = n.get(\"chat_tab_bubbles\");\n        this.lastMessageIndicator = new y(this.threadID, yb, bc, this);\n        if (bc) {\n            this.typingIndicator = new ia(this.threadID, zb, this);\n        }\n    ;\n    ;\n        ca.getThreadMessagesRange(this.threadID, 0, ha.RECENT_MESSAGES_LIMIT, this._updateTimestamp.bind(this));\n        this.rerender();\n    };\n;\n    va(rb, j);\n    va(rb.prototype, {\n        scrolling: function() {\n            if (((((((!this._loadingMoreMessages && this.isScrolledNearTop())) && !this.isScrolledToBottom())) && !this._hasReachedClearedMessages))) {\n                this.loadMoreMessages();\n            }\n        ;\n        ;\n            if (!this._newMessagesSheetOpened) {\n                return;\n            }\n        ;\n        ;\n            if (this.isScrolledToBottom()) {\n                this.sheetController.closeNewMessagesSheet();\n                this._newMessagesSheetOpened = false;\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            r.empty(this.conversationElem);\n            this._subscription.unsubscribe();\n            ab(qb, this);\n            ((this.lastMessageIndicator && this.lastMessageIndicator.destroy()));\n            this.destroyed = true;\n        },\n        _appendMessage: function(tb) {\n            if (((tb == this.prevMessage))) {\n                return;\n            }\n        ;\n        ;\n            var ub = ha, vb = ub.GROUPING_THRESHOLD, wb = ((((tb.action_type == w.LOG_MESSAGE)) && ((tb.log_message_type == z.SERVER_ERROR))));\n            if (tb.is_cleared) {\n                this._hasReachedClearedMessages = true;\n                return;\n            }\n        ;\n        ;\n            var xb;\n            if (((this.prevMessage !== null))) {\n                xb = ((tb.timestamp - this.prevMessage.timestamp));\n            }\n             else xb = Infinity;\n        ;\n        ;\n            if (((!wb && ((xb >= fb))))) {\n                var yb = Math.round(((tb.timestamp / 1000))), zb = tb.timestamp_datetime, ac = qa[\":fb:chat:conversation:date-break\"].build();\n                ma.renderComponent(sa({\n                    time: yb,\n                    verbose: zb,\n                    text: zb\n                }), ac.getNode(\"date\"));\n                r.appendContent(this.conversationElem, ac.getRoot());\n                this.messageGroup = null;\n            }\n        ;\n        ;\n            if (((tb.action_type == w.LOG_MESSAGE))) {\n                r.appendContent(this.conversationElem, lb(tb));\n                this.messageGroup = null;\n                this.prevMessage = tb;\n                return;\n            }\n        ;\n        ;\n            var bc = n.get(\"chat_tab_bubbles\");\n            if (((((((!this.messageGroup || ((bc && ((tb.author !== la.user)))))) || ((this.prevMessage.author != tb.author)))) || ((this.prevMessage.timestamp < ((tb.timestamp - vb))))))) {\n                this.messageGroup = kb(tb);\n                r.appendContent(this.conversationElem, this.messageGroup.getRoot());\n            }\n        ;\n        ;\n            var cc = this._makeSingleMessage(tb);\n            this.messageElements[tb.message_id] = cc;\n            r.appendContent(this.messageGroup.getNode(\"messages\"), cc);\n            mb(cc, this.scrollContainer);\n            this.prevMessage = tb;\n        },\n        rerender: function() {\n            if (!this._oldestMessageDisplayedTimestamp) {\n                return;\n            }\n        ;\n        ;\n            var tb = ((this._finishedFetchingMoreMessages && this.scrollContainer.scrollHeight)), ub = ((this._finishedFetchingMoreMessages && this.scrollContainer.scrollTop)), vb = this.isScrolledToBottom();\n            r.empty(this.conversationElem);\n            this.messageElements = {\n            };\n            this.messageGroup = null;\n            this.prevMessage = null;\n            var wb = ca.getThreadMessagesSinceTimestamp(this.threadID, this._oldestMessageDisplayedTimestamp);\n            this._renderOlderMessages(wb, tb, ub, vb);\n            this._finishedFetchingMoreMessages = false;\n        },\n        update: function(tb) {\n            {\n                var fin268keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin268i = (0);\n                var ub;\n                for (; (fin268i < fin268keys.length); (fin268i++)) {\n                    ((ub) = (fin268keys[fin268i]));\n                    {\n                        var vb = this.messageElements[ub];\n                        if (vb) {\n                            var wb = this.isScrolledToBottom(), xb = this._makeSingleMessage(ca.getMessagesFromIDs([ub,])[0]);\n                            this.messageElements[ub] = xb;\n                            r.replace(vb, xb);\n                            mb(xb, this.scrollContainer);\n                            if (wb) {\n                                this.scrollToBottom();\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _getLoadingHeight: function() {\n            return ((this.loadingHeight || this.loadingIcon.clientHeight));\n        },\n        _appendMessages: function(tb) {\n            tb.forEach(this._appendMessage.bind(this));\n            ((this.lastMessageIndicator && this.lastMessageIndicator.setLastMessage(this.prevMessage)));\n        },\n        _appendNewMessages: function(tb) {\n            tb = u.filterMessages(function(wb) {\n                this.sheetController.openUserJoinStatusSheet(wb);\n            }.bind(this), tb, true);\n            var ub = this.isScrolledToBottom(), vb = this._messagesOnlySentFromSelf(tb);\n            this._appendMessages(tb);\n            if (ub) {\n                this.scrollToBottom();\n            }\n             else if (!vb) {\n                this.sheetController.openNewMessagesSheet();\n                this._newMessagesSheetOpened = true;\n            }\n            \n        ;\n        ;\n        },\n        _messagesOnlySentFromSelf: function(tb) {\n            for (var ub = 0; ((ub < tb.length)); ub++) {\n                if (((tb[ub].author !== la.user))) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        _renderOlderMessages: function(tb, ub, vb, wb) {\n            if (!tb) {\n                return;\n            }\n        ;\n        ;\n            tb = u.filterMessages(function(xb) {\n                this.sheetController.openUserJoinStatusSheet(xb);\n            }.bind(this), tb, false);\n            this._appendMessages(tb);\n            if (wb) {\n                this.scrollToBottom();\n            }\n             else if (this._finishedFetchingMoreMessages) {\n                this.scrollToPosition(((((((this.scrollContainer.scrollHeight - ub)) - this.loadingHeight)) + vb)));\n            }\n            \n        ;\n        ;\n        },\n        _updateTimestamp: function(tb) {\n            if (((tb && tb.length))) {\n                this._oldestMessageDisplayedTimestamp = tb[0].timestamp;\n                this._currentMessageCount = tb.length;\n            }\n        ;\n        ;\n            this._loadingMoreMessages = false;\n            this._finishedFetchingMoreMessages = true;\n            q.hide(this.loadingIcon);\n        },\n        isScrolledToBottom: function() {\n            var tb = this.scrollContainer;\n            return ((((tb.scrollTop + tb.clientHeight)) >= ((tb.scrollHeight - ib))));\n        },\n        isScrolledNearTop: function() {\n            return ((this.scrollContainer.scrollTop < this.scrollContainer.clientHeight));\n        },\n        scrollToBottom: function(tb) {\n            this.scrollToPosition(this.scrollContainer.scrollHeight, tb);\n        },\n        scrollToPosition: function(tb, ub) {\n            ((this._scrollTopAnimation && this._scrollTopAnimation.JSBNG__stop()));\n            if (((ub === true))) {\n                this._scrollTopAnimation = (new h(this.scrollContainer)).to(\"scrollTop\", tb).ease(h.ease.end).duration(400).go();\n            }\n             else this.scrollContainer.scrollTop = tb;\n        ;\n        ;\n        },\n        loadMoreMessages: function() {\n            if (((ca.hasLoadedExactlyNMessages(this.threadID, this._currentMessageCount) && ca.hasLoadedAllMessages(this.threadID)))) {\n                return;\n            }\n        ;\n        ;\n            if (ga.isNewEmptyLocalThread(this.threadID)) {\n                return;\n            }\n        ;\n        ;\n            q.show(this.loadingIcon);\n            this.loadingHeight = this._getLoadingHeight();\n            this._loadingMoreMessages = true;\n            if (((this._fetchMultiplier < 10))) {\n                this._fetchMultiplier += 1;\n            }\n        ;\n        ;\n            var tb = ((ha.RECENT_MESSAGES_LIMIT * this._fetchMultiplier)), ub = ((this._currentMessageCount + tb)), vb = ca.hasLoadedNMessages(this.threadID, ub);\n            ca.getThreadMessagesRange(this.threadID, 0, ub, this._updateTimestamp.bind(this), null, x.CHAT);\n            if (vb) {\n                this.rerender();\n            }\n        ;\n        ;\n        },\n        _makeSingleMessage: function(tb) {\n            var ub = this._renderSingleMessage(tb);\n            q.addClass(ub, \"-cx-PRIVATE-fbChatMessage__singlemessage\");\n            return ub;\n        },\n        _renderSingleMessage: function(tb) {\n            var ub = qa[\":fb:chat:conversation:message\"].render(), vb = n.get(\"chat_tab_bubbles\");\n            if (((vb && la.isAuthor(tb.author)))) {\n                ub.setAttribute(\"title\", jb(tb.timestamp));\n            }\n        ;\n        ;\n            if (tb.subject) {\n                var wb = qa[\":fb:chat:conversation:message:subject\"].render();\n                r.setContent(wb, tb.subject);\n                r.appendContent(ub, wb);\n            }\n        ;\n        ;\n            function xb(fc) {\n                if (vb) {\n                    fc = r.create(\"span\", {\n                        \"data-measureme\": 1\n                    }, fc);\n                }\n            ;\n            ;\n                return fc;\n            };\n        ;\n            if (tb.is_filtered_content) {\n                var yb = oa[\":fb:mercury:filtered-message\"].build();\n                r.appendContent(ub, xb(yb.getRoot()));\n                return ub;\n            }\n        ;\n        ;\n            if (((tb.body.substr(0, 4) == \"?OTR\"))) {\n                r.setContent(ub, xb(\"[encrypted message]\"));\n                q.addClass(ub, \"-cx-PRIVATE-fbChatMessage__cyphertext\");\n            }\n             else {\n                q.addClass(ub, ((za(tb.body) ? \"direction_rtl\" : \"direction_ltr\")));\n                var zb = ja.formatMessageBody(tb.body);\n                r.appendContent(ub, xb(zb));\n            }\n        ;\n        ;\n            if (tb.has_attachment) {\n                var ac = g.div(null), bc = this._appendMessageAttachments(ac, tb);\n                if (((((vb && !tb.body)) && !bc))) {\n                    return ac;\n                }\n            ;\n            ;\n                r.appendContent(ub, p(ac.childNodes));\n            }\n        ;\n        ;\n            if (tb.forward_count) {\n                r.appendContent(ub, pb(tb));\n            }\n        ;\n        ;\n            if (tb.is_spoof_warning) {\n                var cc = qa[\":fb:chat:conversation:message:undertext\"].build();\n                r.appendContent(cc.getNode(\"message\"), ub);\n                la.get(tb.author, function(fc) {\n                    fa.renderChatSpoofWarning(cc.getNode(\"JSBNG__status\"), tb.is_spoof_warning, fc);\n                });\n                return cc.getRoot();\n            }\n        ;\n        ;\n            var dc = ea.renderStatusIndicator(tb.JSBNG__status, tb.error_data, ba(ca.resendMessage, ca, tb));\n            if (dc) {\n                var ec = qa[\":fb:chat:conversation:message:status\"].build();\n                r.appendContent(ec.getNode(\"message\"), ub);\n                r.appendContent(ec.getNode(\"JSBNG__status\"), dc);\n                return ec.getRoot();\n            }\n        ;\n        ;\n            return ub;\n        },\n        _appendMessageAttachments: function(tb, ub) {\n            var vb = 0, wb = ub.attachments;\n            wb.sort(l.booleanLexicographicComparator([l.isPhotoAttachment,l.isShareAttachment,l.isFileAttachment,l.isErrorAttachment,]));\n            if (((ub.raw_attachments && ((ub.raw_attachments.length > 0))))) {\n                wb = k.convertRaw(ub.raw_attachments);\n            }\n        ;\n        ;\n            var xb = l.renderPhotoAttachments(wb.filter(l.isPhotoAttachment), ub, 176, 4);\n            if (xb) {\n                r.appendContent(tb, xb);\n            }\n        ;\n        ;\n            for (var yb = 0; ((yb < wb.length)); yb++) {\n                if (l.isPhotoAttachment(wb[yb])) {\n                    vb = 1;\n                    continue;\n                }\n            ;\n            ;\n                var zb = l.renderAttachment(true, wb[yb], ub);\n                ((zb.error && r.appendContent(tb, zb.error)));\n                ((zb.JSBNG__content && r.appendContent(tb, zb.JSBNG__content)));\n                vb |= zb.bubblePreferred;\n            };\n        ;\n            var ac = r.scry(tb, \"img\");\n            ac.forEach(function(bc) {\n                t.listen(bc, \"load\", ba(this._thumbLoaded, this, bc));\n            }.bind(this));\n            return !!vb;\n        },\n        _thumbLoaded: function(tb) {\n            var ub = ((this.scrollContainer.scrollTop + this.scrollContainer.clientHeight));\n            if (((((ub + tb.offsetHeight)) >= this.scrollContainer.scrollHeight))) {\n                this.scrollToBottom();\n            }\n        ;\n        ;\n        }\n    });\n    ra.subscribe(\"messages-reordered\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            ((ub[vb.threadID] && vb.rerender()));\n        });\n    });\n    ra.subscribe(\"messages-updated\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            ((ub[vb.threadID] && vb.update(ub[vb.threadID])));\n        });\n    });\n    ra.subscribe(\"messages-received\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            var wb = ub[vb.threadID];\n            if (((wb && wb.length))) {\n                vb._currentMessageCount += wb.length;\n            }\n        ;\n        ;\n            ((wb && vb._appendNewMessages(wb)));\n        });\n    });\n    i.subscribe(m.getArbiterType(\"chat_event\"), function(tb, ub) {\n        if (sb(ub.obj)) {\n            var vb = ((((s.user == ub.obj.from)) ? ub.obj.to : ub.obj.from)), wb = ga.getThreadIdForUser(vb), xb = qb.filter(function(ac) {\n                return ((ac.threadID === wb));\n            });\n            if (((xb.length > 0))) {\n                var yb = xb[0], zb = ca.constructLogMessageObject(aa.CHAT_WEB, wb, z.VIDEO_CALL, ub.obj);\n                zb.author = ((\"fbid:\" + ub.obj.from));\n                yb._appendNewMessages([zb,]);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    function sb(tb) {\n        return ((((tb.event_name === \"installing\")) || ((tb.event_name === \"install_canceled\"))));\n    };\n;\n    e.exports = rb;\n});\n__d(\"MercuryPeopleSuggestions\", [\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"OrderedFriendsList\",\"ShortProfiles\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"MercuryServerDispatcher\"), i = b(\"OrderedFriendsList\"), j = b(\"ShortProfiles\"), k = b(\"arrayContains\"), l = new g(), m = 6;\n    function n(s) {\n        return s.sort().join(\",\");\n    };\n;\n    function o(s, t) {\n        if (((s.length < m))) {\n            var u = i.getList();\n            for (var v = 0; ((v < u.length)); v++) {\n                if (!((k(s, u[v]) || k(t, u[v])))) {\n                    s.push(u[v]);\n                    if (((s.length >= m))) {\n                        break;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function p(s) {\n        h.trySend(\"/ajax/chat/people_suggest.php\", s);\n    };\n;\n    function q(s, t, u) {\n        s = s.filter(function(w) {\n            return !k(t, w);\n        });\n        var v = o(s, t);\n        j.getMulti(v, function() {\n            u(v);\n        });\n    };\n;\n    var r = {\n        getPeopleSuggestions: function(s, t) {\n            if (s) {\n                if (s.length) {\n                    var u = n(s), v = l.executeOrEnqueue(u, function(x) {\n                        q(x, s, t);\n                    }), w = l.getUnavailableResources(v);\n                    if (w.length) {\n                        p({\n                            query: u,\n                            size: m\n                        });\n                    }\n                ;\n                ;\n                    return v;\n                }\n                 else q([], [], t);\n            ;\n            }\n        ;\n        ;\n            return 0;\n        },\n        handleUpdate: function(s) {\n            if (s.query) {\n                var t = ((s.suggestions || \"\")), u = ((t.length ? t.split(\",\") : []));\n                l.setResource(s.query, u);\n            }\n        ;\n        ;\n        }\n    };\n    h.registerEndpoints({\n        \"/ajax/chat/people_suggest.php\": {\n            mode: h.IMMEDIATE,\n            handler: r.handleUpdate\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatTabPeopleSuggestionView\", [\"ChatPeopleSuggestionList.react\",\"ChatQuietLinks\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"MercuryPeopleSuggestions\",\"MercuryIDs\",\"React\",\"ShortProfiles\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPeopleSuggestionList.react\"), h = b(\"ChatQuietLinks\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryPeopleSuggestions\"), m = b(\"MercuryIDs\"), n = b(\"React\"), o = b(\"ShortProfiles\"), p = b(\"Style\"), q = b(\"copyProperties\");\n    function r(s, t, u) {\n        this.sheetController = s;\n        this.viewNode = t;\n        this.loadingIcon = u;\n        this.addFriendsSheet = s.getAddFriendsTabSheet();\n        this.mercuryTypeahead = ((this.addFriendsSheet && this.addFriendsSheet._typeahead));\n        this.typeaheadInput = ((this.mercuryTypeahead && this.mercuryTypeahead._input));\n        this.typeaheadView = ((this.mercuryTypeahead && this.mercuryTypeahead.getTypeahead().getView()));\n        var v = this.showSuggestions.bind(this);\n        if (this.typeaheadInput) {\n            k.listen(this.typeaheadInput, \"JSBNG__focus\", v);\n        }\n    ;\n    ;\n        if (this.typeaheadView) {\n            this.typeaheadView.subscribe(\"reset\", v);\n            this.typeaheadView.subscribe(\"render\", this.clearSuggestions.bind(this));\n        }\n    ;\n    ;\n        this.tokenizer = ((this.mercuryTypeahead && this.mercuryTypeahead.getTokenizer()));\n        if (this.tokenizer) {\n            this.tokenizer.subscribe(\"removeToken\", v);\n        }\n    ;\n    ;\n        this.showSuggestions();\n    };\n;\n    q(r.prototype, {\n        addSelectedParticipant: function(s) {\n            var t = o.getNow(s);\n            if (((t && this.tokenizer))) {\n                this.tokenizer.addToken(this.tokenizer.createToken({\n                    uid: s,\n                    text: t.JSBNG__name\n                }));\n                this.showSuggestions();\n            }\n        ;\n        ;\n        },\n        showSuggestions: function() {\n            if (this.mercuryTypeahead) {\n                var s = this.mercuryTypeahead.getSelectedParticipantIDs();\n                s = s.map(m.getUserIDFromParticipantID);\n                j.empty(this.viewNode);\n                i.show(this.loadingIcon);\n                l.getPeopleSuggestions(s, function(t) {\n                    var u = g({\n                        uids: t,\n                        onClick: this.addSelectedParticipant.bind(this)\n                    });\n                    i.hide(this.loadingIcon);\n                    n.renderComponent(u, this.viewNode);\n                    h.removeAllHrefs(this.viewNode);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        clearSuggestions: function() {\n            j.empty(this.viewNode);\n            i.hide(this.loadingIcon);\n            p.set(this.viewNode, \"margin-top\", 0);\n        },\n        destroy: function() {\n            this.clearSuggestions();\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatAddFriendsTabSheetRawRenderer\", [\"ContextualTypeaheadView\",\"DOM\",\"JSBNG__Event\",\"MercuryTypeahead\",\"ChatTabTemplates\",\"tx\",\"MercuryDataSourceWrapper\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualTypeaheadView\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"MercuryTypeahead\"), k = b(\"ChatTabTemplates\"), l = b(\"tx\"), m = b(\"MercuryDataSourceWrapper\").source, n = {\n        render: function(o, p, q, r, s, t) {\n            var u = ((t ? k[\":fb:mercury:chat:tab-sheet:add-friends-empty-tab\"].build() : k[\":fb:mercury:chat:tab-sheet:add-friends\"].build())), v = new j(m, g);\n            v.setExcludedParticipants(r.participants);\n            if (!t) {\n                v.setPlaceholder(\"Add friends to this chat\");\n            }\n        ;\n        ;\n            v.build();\n            h.replace(u.getNode(\"participantsTypeahead\"), v.getElement());\n            h.setContent(q, u.getRoot());\n            v.getTokenizer().adjustWidth();\n            v.JSBNG__focus();\n            if (!t) {\n                var w = function() {\n                    var x = v.getSelectedParticipantIDs();\n                    if (x.length) {\n                        s(x);\n                    }\n                ;\n                ;\n                    p.close(o);\n                };\n                i.listen(u.getNode(\"doneButton\"), \"click\", w);\n            }\n        ;\n        ;\n            return v;\n        }\n    };\n    e.exports = n;\n});\n__d(\"MultiChatController\", [\"Arbiter\",\"AsyncSignal\",\"copyProperties\",\"Form\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncSignal\"), i = b(\"copyProperties\"), j = b(\"Form\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get();\n    function n() {\n    \n    };\n;\n    i(n, {\n        subscribe: function(o, p) {\n            o.subscribe(\"JSBNG__confirm\", function() {\n                this.createGroupThreadFromChooserDialog(o, p);\n            }.bind(this));\n        },\n        createGroupThreadFromChooserDialog: function(o, p) {\n            var q = j.serialize(o.getRoot()), r = JSON.parse(q.profileChooserItems), s = [];\n            {\n                var fin269keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin269i = (0);\n                var t;\n                for (; (fin269i < fin269keys.length); (fin269i++)) {\n                    ((t) = (fin269keys[fin269i]));\n                    {\n                        if (r[t]) {\n                            s.push(t);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var u = n.createThreadForFBIDs(s);\n            l.subscribe(\"update-thread-ids\", function(v, w) {\n                {\n                    var fin270keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin270i = (0);\n                    var x;\n                    for (; (fin270i < fin270keys.length); (fin270i++)) {\n                        ((x) = (fin270keys[fin270i]));\n                        {\n                            if (((w[x] == u))) {\n                                new h(\"/ajax/groups/chat/log\", {\n                                    group_id: p,\n                                    message_id: x\n                                }).send();\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            });\n            o.hide();\n        },\n        createThreadForTokens: function(o) {\n            if (!o.length) {\n                return;\n            }\n        ;\n        ;\n            var p;\n            if (((o.length == 1))) {\n                p = ((\"user:\" + o[0].split(\":\")[1]));\n            }\n             else p = ((\"root:\" + k.generateNewClientMessageID(JSBNG__Date.now())));\n        ;\n        ;\n            m.createNewLocalThread(p, o);\n            g.inform(\"chat/open-tab\", {\n                thread_id: p\n            });\n            return p;\n        },\n        createThreadForFBIDs: function(o) {\n            var p = [];\n            for (var q = 0; ((q < o.length)); q++) {\n                p.push(((\"fbid:\" + o[q])));\n            ;\n            };\n        ;\n            return n.createThreadForTokens(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatAddFriendsTabSheet\", [\"Arbiter\",\"ChatAddFriendsTabSheetRawRenderer\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MultiChatController\",\"Style\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatAddFriendsTabSheetRawRenderer\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercurySourceType\"), k = b(\"MercuryMessages\").get(), l = b(\"MultiChatController\"), m = b(\"Style\"), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\");\n    function p(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._sheetView = u;\n        this._typeahead = null;\n    };\n;\n    o(p.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(s) {\n                var t = ((s.is_canonical_user ? q : r));\n                this._typeahead = h.render(this, this._sheetView, this._rootElement, s, t.curry(s), n.isNewEmptyLocalThread(this._threadID));\n                this._typeahead.subscribe(\"resize\", function() {\n                    this._sheetView.inform(\"resize\");\n                }.bind(this));\n            }.bind(this));\n        },\n        getParticipants: function() {\n            if (!this._typeahead) {\n                return null;\n            }\n        ;\n        ;\n            return this._typeahead.getSelectedParticipantIDs();\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"add_friends_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        getHeight: function() {\n            return m.get(this._rootElement, \"height\");\n        }\n    });\n    function q(s, t) {\n        var u = s.participants;\n        l.createThreadForTokens(u.concat(t));\n    };\n;\n    function r(s, t) {\n        var u = s.thread_id;\n        if (n.isEmptyLocalThread(u)) {\n            n.addParticipantsToThreadLocally(u, t);\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n         else {\n            k.sendMessage(k.constructLogMessageObject(j.CHAT_WEB, u, i.SUBSCRIBE, {\n                added_participants: t\n            }));\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n    ;\n    ;\n    };\n;\n    e.exports = p;\n});\n__d(\"ChatNameConversationTabSheetRawRenderer\", [\"DOM\",\"JSBNG__Event\",\"Input\",\"Keys\",\"ChatTabTemplates\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"Input\"), j = b(\"Keys\"), k = b(\"ChatTabTemplates\"), l = b(\"fbt\"), m = {\n        render: function(n, o, p, q, r, s) {\n            var t = k[\":fb:mercury:chat:tab-sheet:name-conversation\"].build(), u = t.getNode(\"nameInput\"), v = t.getNode(\"doneButton\"), w = \"Done\", x = \"Hide\", y = q.JSBNG__name;\n            if (y) {\n                i.setValue(u, y);\n            }\n             else g.setContent(v, x);\n        ;\n        ;\n            var z = function() {\n                var aa = i.getValue(u);\n                if (aa) {\n                    r(aa);\n                }\n            ;\n            ;\n                s();\n                o.close(n);\n            };\n            h.listen(u, \"input\", function() {\n                g.setContent(v, ((((i.getValue(u).length === 0)) ? x : w)));\n            });\n            h.listen(v, \"click\", z);\n            h.listen(u, \"keyup\", function(aa) {\n                if (((aa.keyCode === j.RETURN))) {\n                    z();\n                    return false;\n                }\n            ;\n            ;\n            });\n            g.setContent(p, t.getRoot());\n            ((!n.isAutomatic() && u.JSBNG__focus()));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ChatNameConversationTabSheet\", [\"AsyncRequest\",\"ChatNameConversationTabSheetRawRenderer\",\"MercuryAPIArgsSource\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"ChatNameConversationTabSheetRawRenderer\"), i = b(\"MercuryAPIArgsSource\"), j = b(\"MercuryLogMessageType\"), k = b(\"MercurySourceType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = \"/ajax/chat/multichat/name_conversation/dismiss.php\";\n    function q(t, u, v) {\n        this._threadID = t;\n        this._rootElement = u;\n        this._sheetView = v;\n        this._isAutomatic = false;\n    };\n;\n    o(q.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(t) {\n                h.render(this, this._sheetView, this._rootElement, t, r.curry(t), s.curry(t));\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"name_conversation_type\";\n        },\n        open: function(t) {\n            this._isAutomatic = t;\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        isAutomatic: function() {\n            return this._isAutomatic;\n        }\n    });\n    function r(t, u) {\n        var v = t.JSBNG__name;\n        if (((((u || v)) && ((u != v))))) {\n            l.sendMessage(l.constructLogMessageObject(k.CHAT_WEB, t.thread_id, j.THREAD_NAME, {\n                JSBNG__name: u\n            }), null, i.CHAT);\n        }\n    ;\n    ;\n    };\n;\n    function s(t) {\n        if (!t.name_conversation_sheet_dismissed) {\n            t.name_conversation_sheet_dismissed = true;\n            m.getServerThreadID(t.thread_id, function(u) {\n                new g(p).setData({\n                    thread_id: u\n                }).send();\n            });\n        }\n    ;\n    ;\n    };\n;\n    e.exports = q;\n});\n__d(\"ChatNewMessagesTabSheet\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n;\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"Scroll down to see new messages.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getRoot(), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"new_messages_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatNoRecipientsTabSheet\", [\"DOM\",\"fbt\",\"MercuryParticipants\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"fbt\"), i = b(\"MercuryParticipants\"), j = b(\"ChatTabTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreads\").get(), m = b(\"copyProperties\");\n    function n(o, p, q) {\n        this._threadID = o;\n        this._rootElement = p;\n        this._sheetView = q;\n        k.subscribe(\"threads-updated\", this._handleThreadsUpdated.bind(this));\n    };\n;\n    m(n.prototype, {\n        render: function() {\n            var o = j[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(o.getNode(\"text\"), \"Everyone has left the conversation.\");\n            g.setContent(this._rootElement, o.getRoot());\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"no_recipients_type\";\n        },\n        _handleThreadsUpdated: function() {\n            l.getThreadMeta(this._threadID, function(o) {\n                var p = i.user, q = o.participants.filter(function(r) {\n                    return ((r != p));\n                });\n                if (((((((q.length < 1)) && !o.is_joinable)) && !l.isNewEmptyLocalThread(this._threadID)))) {\n                    this._sheetView.open(this);\n                }\n                 else this._sheetView.close(this);\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatOfflineTabSheet\", [\"ChatPrivacyActionController\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"ChatVisibility\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\");\n    function r(s, t, u) {\n        this._rootElement = t;\n        this._sheetView = u;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(s);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    p(r.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"offline_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n        ;\n            var s = o[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build(), t = ((\"fbid:\" + this._canonicalUser));\n            m.get(t, function(u) {\n                var v = \"fbChatGoOnlineLink\", w = j.tx._(\"turn on chat\"), x = j.create(\"a\", {\n                    href: \"#\",\n                    className: v\n                }, w), y = j.tx._(\"To chat with {name} and other friends, {link}.\", {\n                    JSBNG__name: u.short_name,\n                    link: x\n                });\n                j.setContent(s.getNode(\"text\"), y);\n                i.addClass(s.getRoot(), \"-cx-PRIVATE-chatTabSheet__chatoffline\");\n                j.setContent(this._rootElement, s.getRoot());\n                k.listen(this._rootElement, \"click\", function(JSBNG__event) {\n                    if (i.hasClass(JSBNG__event.getTarget(), v)) {\n                        if (h.isOnline()) {\n                            this._logger.error(\"tab_sheet_already_online\");\n                        }\n                    ;\n                    ;\n                        this._privacyActionController.togglePrivacy();\n                        this._logger.log(\"tab_sheet_go_online\", {\n                            tab_id: this._canonicalUser\n                        });\n                        return false;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(s) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            }\n        ;\n        ;\n            switch (s) {\n              case g.OFFLINE:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.BLOCKED:\n                this._sheetView.close(this);\n                break;\n            };\n        ;\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"offline_type\";\n        },\n        destroy: function() {\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatUploadWarningTabSheet\", [\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ChatTabTemplates\"), i = b(\"copyProperties\");\n    function j(k, l, m) {\n        this._threadID = k;\n        this._rootElement = l;\n        this._sheetView = m;\n    };\n;\n    i(j.prototype, {\n        render: function() {\n            var k = h[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(k.getNode(\"text\"), g.tx._(\"Please wait until the upload is complete before you send your message.\"));\n            g.setContent(this._rootElement, k.getRoot());\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"upload_warning_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatThreadIsMutedTabSheet\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n;\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:message-mute-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"This conversation is muted. Chat tabs will not pop up for it and push notifications are off.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getNode(\"unmuteButton\"), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"chat-thread-is-muted\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatUserBlockedTabSheet\", [\"ChatPrivacyActionController\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"GenderConst\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"GenderConst\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\");\n    function s(t, u, v) {\n        this._rootElement = u;\n        this._sheetView = v;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(t);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    p(s.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n        ;\n            var t = o[\":fb:mercury:chat:tab-sheet:user-blocked\"].build(), u = ((\"fbid:\" + this._canonicalUser));\n            m.get(u, function(v) {\n                var w = null;\n                switch (v.gender) {\n                  case k.FEMALE_SINGULAR:\n                \n                  case k.FEMALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send her a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                    break;\n                  case k.MALE_SINGULAR:\n                \n                  case k.MALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send him a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                    break;\n                  default:\n                    w = r._(\"You turned off chat for {name} but you can still send them a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                };\n            ;\n                i.setContent(t.getNode(\"text\"), w);\n                var x = r._(\"Turn on chat for {name}?\", {\n                    JSBNG__name: v.short_name\n                });\n                i.setContent(t.getNode(\"actionLink\"), x);\n                h.addClass(t.getRoot(), \"-cx-PRIVATE-chatTabSheet__blocked\");\n                i.setContent(this._rootElement, t.getRoot());\n                j.listen(t.getNode(\"actionLink\"), \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(t) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            }\n        ;\n        ;\n            switch (t) {\n              case g.BLOCKED:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.OFFLINE:\n                this._sheetView.close(this);\n                break;\n            };\n        ;\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"user_blocked_type\";\n        },\n        destroy: function() {\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatUserJoinStatusTabSheet\", [\"Class\",\"JoinStatusTabSheet\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JoinStatusTabSheet\"), i = b(\"ChatTabTemplates\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, h);\n    j(k.prototype, {\n        _getTemplate: function() {\n            return i[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"];\n        }\n    });\n    e.exports = k;\n});\n__d(\"ChatTabSheetController\", [\"ChatAddFriendsTabSheet\",\"ChatNameConversationTabSheet\",\"ChatNewMessagesTabSheet\",\"ChatNoRecipientsTabSheet\",\"ChatOfflineTabSheet\",\"ChatUploadWarningTabSheet\",\"ChatThreadIsMutedTabSheet\",\"ChatUserBlockedTabSheet\",\"ChatUserJoinStatusTabSheet\",\"copyProperties\",\"MercurySheetView\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatAddFriendsTabSheet\"), h = b(\"ChatNameConversationTabSheet\"), i = b(\"ChatNewMessagesTabSheet\"), j = b(\"ChatNoRecipientsTabSheet\"), k = b(\"ChatOfflineTabSheet\"), l = b(\"ChatUploadWarningTabSheet\"), m = b(\"ChatThreadIsMutedTabSheet\"), n = b(\"ChatUserBlockedTabSheet\"), o = b(\"ChatUserJoinStatusTabSheet\"), p = b(\"copyProperties\"), q = b(\"MercurySheetView\"), r = b(\"MercuryThreads\").get(), s = function(t, u, v) {\n        this._sheetView = new q(t, u, v);\n        this._addFriendsTabSheet = new g(t, u, this._sheetView);\n        this._nameConversationTabSheet = new h(t, u, this._sheetView);\n        this._userBlockedTabSheet = new n(t, u, this._sheetView);\n        this._offlineTabSheet = new k(t, u, this._sheetView);\n        this._newMessagesTabSheet = new i(t, u, this._sheetView);\n        this._uploadWarningTabSheet = new l(t, u, this._sheetView);\n        this._threadIsMutedTabSheet = new m(t, u, this._sheetView);\n        this._userJoinStatusTabSheet = new o(u, this._sheetView);\n        if (!r.getCanonicalUserInThread(t)) {\n            this._noRecipientsTabSheet = new j(t, u, this._sheetView);\n        }\n    ;\n    ;\n    };\n    p(s.prototype, {\n        openAddFriendsSheet: function() {\n            this._addFriendsTabSheet.open();\n        },\n        openUserJoinStatusSheet: function(t) {\n            this._userJoinStatusTabSheet.addToQueue(t);\n        },\n        getAddFriendsTabSheet: function() {\n            return this._addFriendsTabSheet;\n        },\n        getAddFriendsParticipants: function() {\n            var t = this._addFriendsTabSheet.getParticipants();\n            this._addFriendsTabSheet.close();\n            return t;\n        },\n        openNameConversationSheet: function(t) {\n            this._nameConversationTabSheet.open(t);\n        },\n        openNewMessagesSheet: function() {\n            this._newMessagesTabSheet.open();\n        },\n        openUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.open();\n        },\n        openThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.open();\n        },\n        closeAutomaticNameConversationSheet: function() {\n            if (this._nameConversationTabSheet.isAutomatic()) {\n                this._nameConversationTabSheet.close();\n            }\n        ;\n        ;\n        },\n        closeThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.close();\n        },\n        closeNewMessagesSheet: function() {\n            this._newMessagesTabSheet.close();\n        },\n        closeUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.close();\n        },\n        onClickNewMessagesSheet: function(t) {\n            this._newMessageClickSub = this._newMessagesTabSheet.subscribe(\"clicked\", t);\n        },\n        onClickThreadIsMutedSheet: function(t) {\n            this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", t);\n        },\n        onResize: function(t) {\n            this._sheetView.subscribe(\"resize\", t);\n        },\n        destroy: function() {\n            this._sheetView.destroy();\n            this._offlineTabSheet.destroy();\n            this._userBlockedTabSheet.destroy();\n            ((this._newMessageClickSub && this._newMessageClickSub.unsubscribe()));\n            ((this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe()));\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatTabView\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AsyncSignal\",\"AvailableListConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatContextualDialogController\",\"ChatAutoSendPhotoUploader\",\"ChatPrivacyActionController\",\"ChatQuietLinks\",\"ChatTabMessagesView\",\"ChatTabPeopleSuggestionView\",\"ChatTabSheetController\",\"ChatVisibility\",\"MercuryConstants\",\"CSS\",\"Dialog\",\"Dock\",\"DOM\",\"Input\",\"JSLogger\",\"Keys\",\"Locale\",\"MercuryActionStatus\",\"MercuryFileUploader\",\"MercuryLogMessageType\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercurySourceType\",\"MercuryStickers\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"MessagesEmoticonView\",\"NubController\",\"Parent\",\"PhotosUploadWaterfall\",\"PresencePrivacy\",\"PresenceStatus\",\"Run\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"TextAreaControl\",\"Tooltip\",\"TypingDetectorController\",\"URI\",\"UserAgent\",\"VideoCallCore\",\"WaterfallIDGenerator\",\"copyProperties\",\"cx\",\"setIntervalAcrossTransitions\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"AvailableListConstants\"), n = b(\"ChatBehavior\"), o = b(\"ChatConfig\"), p = b(\"ChatContextualDialogController\"), q = b(\"ChatAutoSendPhotoUploader\"), r = b(\"ChatPrivacyActionController\"), s = b(\"ChatQuietLinks\"), t = b(\"ChatTabMessagesView\"), u = b(\"ChatTabPeopleSuggestionView\"), v = b(\"ChatTabSheetController\"), w = b(\"ChatVisibility\"), x = b(\"MercuryConstants\"), y = b(\"CSS\"), z = b(\"Dialog\"), aa = b(\"Dock\"), ba = b(\"DOM\"), ca = b(\"Input\"), da = b(\"JSLogger\"), ea = b(\"Keys\"), fa = b(\"Locale\"), ga = b(\"MercuryActionStatus\"), ha = b(\"MercuryFileUploader\"), ia = b(\"MercuryLogMessageType\"), ja = b(\"MercuryMessages\").get(), ka = b(\"MercuryParticipants\"), la = b(\"MercuryServerRequests\").get(), ma = b(\"MercurySourceType\"), na = b(\"MercuryStickers\"), oa = b(\"MercuryThreadInformer\").get(), pa = b(\"MercuryThreadMetadataRawRenderer\"), qa = b(\"MercuryThreadMetadataRenderer\").get(), ra = b(\"MercuryThreadMuter\"), sa = b(\"MercuryThreads\").get(), ta = b(\"MercuryTypingReceiver\"), ua = b(\"MessagesEmoticonView\"), va = b(\"NubController\"), wa = b(\"Parent\"), xa = b(\"PhotosUploadWaterfall\"), ya = b(\"PresencePrivacy\"), za = b(\"PresenceStatus\"), ab = b(\"Run\"), bb = b(\"Style\"), cb = b(\"SubscriptionsHandler\"), db = b(\"ChatTabTemplates\"), eb = b(\"TextAreaControl\"), fb = b(\"Tooltip\"), gb = b(\"TypingDetectorController\"), hb = b(\"URI\"), ib = b(\"UserAgent\"), jb = b(\"VideoCallCore\"), kb = b(\"WaterfallIDGenerator\"), lb = b(\"copyProperties\"), mb = b(\"cx\"), nb = b(\"setIntervalAcrossTransitions\"), ob = b(\"tx\"), pb = /^\\s*$/, qb = da.create(\"tab_view\"), rb = {\n    }, sb = null, tb, ub;\n    function vb(qc, rc) {\n        var sc = ba.create(\"div\");\n        rc = rc.filter(function(tc) {\n            return ((tc != ka.user));\n        });\n        if (!rc.length) {\n            return fb.remove(qc);\n        }\n    ;\n    ;\n        ka.getMulti(rc, function(tc) {\n            {\n                var fin271keys = ((window.top.JSBNG_Replay.forInKeys)((tc))), fin271i = (0);\n                var uc;\n                for (; (fin271i < fin271keys.length); (fin271i++)) {\n                    ((uc) = (fin271keys[fin271i]));\n                    {\n                        var vc = tc[uc], wc = db[\":fb:mercury:chat:multichat-tooltip-item\"].build();\n                        ba.setContent(wc.getNode(\"JSBNG__name\"), vc.JSBNG__name);\n                        var xc = ka.getUserID(uc), yc = ((xc && ((za.get(xc) == m.ACTIVE))));\n                        y.conditionShow(wc.getNode(\"icon\"), yc);\n                        y.conditionClass(wc.getNode(\"JSBNG__name\"), \"tooltipItemWithIcon\", yc);\n                        ba.appendContent(sc, wc.getRoot());\n                    };\n                };\n            };\n        ;\n            fb.set(qc, sc, \"above\");\n        });\n    };\n;\n    var wb = {\n    }, xb = null, yb = false;\n    function zb(qc, rc, sc) {\n        if (sc) {\n            wb[qc] = rc;\n            if (!xb) {\n                xb = nb(ac, 600);\n            }\n        ;\n        ;\n        }\n         else {\n            y.removeClass(rc, \"highlightTitle\");\n            delete wb[qc];\n        }\n    ;\n    ;\n    };\n;\n    function ac() {\n        {\n            var fin272keys = ((window.top.JSBNG_Replay.forInKeys)((wb))), fin272i = (0);\n            var qc;\n            for (; (fin272i < fin272keys.length); (fin272i++)) {\n                ((qc) = (fin272keys[fin272i]));\n                {\n                    var rc = wb[qc];\n                    if (rc.parentNode) {\n                        y.conditionClass(rc, \"highlightTitle\", yb);\n                    }\n                     else delete wb[qc];\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        yb = !yb;\n        if (!Object.keys(wb).length) {\n            JSBNG__clearInterval(xb);\n            xb = null;\n        }\n    ;\n    ;\n    };\n;\n    function bc(qc) {\n        var rc = la.tokenizeThreadID(qc);\n        switch (rc.type) {\n          case \"user\":\n            return db[\":fb:mercury:chat:user-tab\"].build();\n        };\n    ;\n        return db[\":fb:mercury:chat:multichat-tab\"].build();\n    };\n;\n    function cc(qc) {\n        var rc = ((qc._tabTemplate.getNode(\"input\").value || \"\")), sc = qc._fileUploader.getAttachments();\n        if (ic(qc)) {\n            ec(qc, rc, sc, function(tc) {\n                var uc = qc._fileUploader.getImageIDs();\n                if (((uc.length > 0))) {\n                    tc.photo_fbids = uc;\n                    tc.has_attachment = true;\n                }\n            ;\n            ;\n                ja.sendMessage(tc);\n                qc._fileUploader.removeAttachments();\n                qc._getNode(\"input\").value = \"\";\n                ((qc._lastMessageIndicator && qc._lastMessageIndicator.resetState()));\n                ((qc._messagesView && qc._messagesView.scrollToBottom()));\n            });\n        }\n    ;\n    ;\n    };\n;\n    function dc(qc, rc) {\n        if (((rc === 0))) {\n            return;\n        }\n    ;\n    ;\n        mc(qc, xa.POST_PUBLISHED, {\n            count: rc\n        });\n        qc._waterfallID = kb.generate();\n    };\n;\n    function ec(qc, rc, sc, tc) {\n        sa.getThreadMeta(qc._threadID, function(uc) {\n            var vc = ja.constructUserGeneratedMessageObject(rc, ma.CHAT_WEB, qc._threadID);\n            if (((sc.length > 0))) {\n                vc.has_attachment = true;\n                vc.raw_attachments = sc;\n            }\n        ;\n        ;\n            if (sa.isNewEmptyLocalThread(qc._threadID)) {\n                var wc = qc._sheetController.getAddFriendsParticipants();\n                if (((((wc === null)) || ((wc.length === 0))))) {\n                    return;\n                }\n                 else if (((wc.length === 1))) {\n                    var xc = ((\"user:\" + ka.getUserID(wc[0])));\n                    vc.thread_id = xc;\n                }\n                 else sa.addParticipantsToThreadLocally(qc._threadID, wc);\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            if (sa.isEmptyLocalThread(qc._threadID)) {\n                var yc = la.tokenizeThreadID(qc._threadID);\n                vc.message_id = yc.value;\n                vc.specific_to_list = uc.participants;\n            }\n        ;\n        ;\n            if (((typeof vc != \"undefined\"))) {\n                vc.signatureID = qc._signatureID;\n            }\n        ;\n        ;\n            vc.ui_push_phase = x.UIPushPhase;\n            tc(vc);\n            if (((qc._threadID !== vc.thread_id))) {\n                nc.inform(\"closed-tab\", qc._threadID);\n                h.inform(\"chat/open-tab\", {\n                    thread_id: vc.thread_id\n                });\n            }\n        ;\n        ;\n        });\n    };\n;\n    function fc(qc) {\n        qc._blocked = true;\n        qc._sheetController.openUploadWarningTabSheet();\n    };\n;\n    function gc(qc) {\n        return ((qc._fileUploader.isUploading() || qc._photoUploader.isUploading()));\n    };\n;\n    function hc(qc) {\n        return qc._fileUploader.isUploading();\n    };\n;\n    function ic(qc) {\n        var rc = ((qc._tabTemplate.getNode(\"input\").value || \"\"));\n        if (!pb.test(rc)) {\n            return true;\n        }\n    ;\n    ;\n        if (((((qc._fileUploader.getAttachments().length > 0)) || ((qc._fileUploader.getImageIDs().length > 0))))) {\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function jc(qc) {\n        if (qc._blocked) {\n            if (hc(qc)) {\n                return;\n            }\n        ;\n        ;\n            qc._blocked = false;\n            cc(qc);\n            qc._sheetController.closeUploadWarningTabSheet();\n        }\n    ;\n    ;\n    };\n;\n    function kc(qc) {\n        qc._nubController.flyoutContentChanged();\n        qc._attachmentsDiv.scrollTop = qc._attachmentsDiv.scrollHeight;\n    };\n;\n    function lc(qc, rc, sc) {\n        qc._subscriptionsHandler.addSubscriptions(qc._photoUploader.subscribe(rc, function(tc, uc) {\n            mc(qc, sc, uc);\n        }));\n    };\n;\n    function mc(qc, rc, sc) {\n        xa.sendSignal(lb({\n            qn: qc._waterfallID,\n            step: rc,\n            uploader: xa.APP_CHAT\n        }, ((sc || {\n        }))));\n    };\n;\n    function nc(qc, rc, sc) {\n        if (rc) {\n            la.ensureThreadIsFetched(rc);\n        }\n    ;\n    ;\n        this._threadID = qc;\n        this._signatureID = sc;\n        this._eventListeners = [];\n        this._tabTemplate = bc(qc);\n        this._tabElem = this._tabTemplate.getRoot();\n        this._waterfallID = kb.generate();\n        if (!((this._getNode instanceof Function))) {\n            qb.log(\"getnode_undefined\", {\n                is_getnode_set: !!this._getNode,\n                is_prototype_set: !!nc.prototype,\n                is_window: ((window == this)),\n                is_chat_tab_view: ((this instanceof nc)),\n                ctor_name: ((this.constructor && this.constructor.JSBNG__name))\n            });\n        }\n    ;\n    ;\n        this._subscriptionsHandler = new cb();\n        this._fileUploader = new ha(this._tabTemplate.getNode(\"attachmentShelf\"), this._tabTemplate.getNode(\"attachButtonForm\"), this._tabTemplate.getNode(\"fileInput\"), this._tabTemplate.getNode(\"attachID\"));\n        this._initializeUploader(this._fileUploader);\n        this._initializeAutoSendPhotoUploader();\n        this._attachmentsDiv = this._getNode(\"attachmentShelf\");\n        this._sheetController = new v(this._threadID, this._getNode(\"sheet\"), this._tabElem);\n        this._sheetController.onClickNewMessagesSheet(function() {\n            ((this._messagesView && this._messagesView.scrollToBottom()));\n            this.JSBNG__focus();\n            nc.inform(\"read\", this._threadID);\n        }.bind(this));\n        this._sheetController.onClickThreadIsMutedSheet(function() {\n            ra.showMuteChangeDialog(0, this._threadID);\n            this.JSBNG__focus();\n        }.bind(this));\n        this._nubController = new va().init(this._tabElem);\n        this._sheetController.onResize(this._nubController.flyoutContentChanged.bind(this._nubController));\n        this._contextualDialogController = new p(this._threadID, this._getNode(\"videoCallLink\"));\n        if (((sb === null))) {\n            sb = !o.get(\"seen_autosend_photo_nux\");\n        }\n    ;\n    ;\n        if (((tb === undefined))) {\n            tb = o.get(\"show_sticker_nux\");\n        }\n    ;\n    ;\n        this._messagesView = null;\n        var tc = this._getNode(\"conversationLink\");\n        if (tc) {\n            y.hide(tc);\n            qa.renderTitanLink(qc, tc, y.show.bind(y, tc));\n        }\n    ;\n    ;\n        if (!sa.getCanonicalUserInThread(this._threadID)) {\n            this._titlebarTooltipAnchor = this._getNode(\"titlebarText\");\n        }\n    ;\n    ;\n        var uc = this._getCanonicalUserID();\n        if (this._isTitleTextLinked()) {\n            ka.get(((\"fbid:\" + uc)), function(fd) {\n                if (fd.href) {\n                    var gd = this._getNode(\"titlebarText\");\n                    gd.setAttribute(\"href\", fd.href);\n                    gd.removeAttribute(\"rel\");\n                    y.removeClass(gd, \"noLink\");\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        var vc = this._getNode(\"inputContainer\").clientHeight;\n        eb.getInstance(this._getNode(\"input\")).subscribe(\"resize\", function() {\n            var fd = this._getNode(\"inputContainer\").clientHeight;\n            if (((fd != vc))) {\n                this._nubController.flyoutContentChanged();\n            }\n        ;\n        ;\n            vc = fd;\n        }.bind(this));\n        var wc = null, xc = this._getNode(\"inputContainer\");\n        this._nubController.subscribe(\"resize\", function() {\n            if (!wc) {\n                wc = this._tabElem.clientWidth;\n            }\n        ;\n        ;\n            var fd = 2, gd = ((wc - ((xc.clientWidth + fd)))), hd = ((fa.isRTL() ? \"left\" : \"right\"));\n            bb.set(this._iconsContainerNode, hd, ((gd + \"px\")));\n            eb.getInstance(this._getNode(\"input\")).update();\n        }.bind(this));\n        var yc = o.get(\"chat_tab_height\");\n        if (yc) {\n            var zc = this._tabTemplate.getNode(\"chatWrapper\");\n            bb.set(zc, \"height\", ((yc + \"px\")));\n        }\n    ;\n    ;\n        this._listen(\"closeButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"mousedown\", this._closePreClicked);\n        this._listen(\"dockButton\", \"click\", this._nubClicked);\n        this._listen(\"dockButton\", \"keydown\", this._dockKeyDown);\n        this._listen(\"nubFlyoutTitlebar\", \"click\", this._titleClicked);\n        this._listen(\"chatConv\", \"click\", this._chatConvClicked);\n        this._listen(\"inputContainer\", \"click\", this._inputContainerClicked);\n        this._listen(\"addFriendLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"addToThreadLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"nameConversationLink\", \"click\", this._nameConversationLinkClicked, true);\n        this._listen(\"clearWindowLink\", \"click\", this._clearHistory, true);\n        this._listen(\"unsubscribeLink\", \"click\", this._unsubscribeLinkClicked, true);\n        this._listen(\"videoCallLink\", \"click\", this._callClicked, true);\n        this._listen(\"reportSpamLink\", \"click\", this._reportSpamClicked, true);\n        this._listen(\"muteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, -1), true);\n        this._listen(\"unmuteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, 0), true);\n        this._listen(\"input\", \"JSBNG__focus\", this._focusTab);\n        this._listen(\"input\", \"JSBNG__blur\", this._blurTab);\n        this._listen(\"sheet\", \"keydown\", function(JSBNG__event) {\n            if (((!JSBNG__event.getModifiers().any && ((JSBNG__event.keyCode === ea.TAB))))) {\n                this._getNode(\"input\").JSBNG__focus();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        }.bind(this));\n        this._iconsContainerNode = this._getNode(\"iconsContainer\");\n        var ad = this._getNode(\"emoticons\");\n        this._emoticonView = null;\n        if (ad) {\n            this._emoticonView = new ua(ad, this._getNode(\"input\"));\n        }\n    ;\n    ;\n        var bd = this._getNode(\"stickers\");\n        if (bd) {\n            this._stickerController = new na(bd);\n            this._subscriptionsHandler.addSubscriptions(this._stickerController.subscribe(\"stickerselected\", function(fd, gd) {\n                this._stickerSelected(gd.id);\n            }.bind(this)));\n        }\n    ;\n    ;\n        if (ib.firefox()) {\n            this._listen(\"input\", \"keypress\", this._inputKeyDown);\n        }\n         else this._listen(\"input\", \"keydown\", this._inputKeyDown);\n    ;\n    ;\n        this._privacyLink = this._getNode(\"privacyLink\");\n        if (this._privacyLink) {\n            this._privacyActionController = new r(uc, this._updatePrivacyLink.bind(this));\n            this._eventListeners.push(g.listen(this._privacyLink, \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController)));\n        }\n    ;\n    ;\n        sa.getThreadMeta(this._threadID, function(fd) {\n            var gd = ((uc || ((o.get(\"chat_multi_typ_send\") && !fd.is_canonical))));\n            if (gd) {\n                la.getServerThreadID(this._threadID, function(hd) {\n                    this._lastMessageIndicator = new gb(uc, this._getNode(\"input\"), \"mercury-chat\", null, hd);\n                }.bind(this));\n            }\n        ;\n        ;\n            this._setUpMutingSettings(fd);\n        }.bind(this));\n        var cd = this._getNode(\"muteGroupLink\");\n        if (cd) {\n            var dd = sa.getCanonicalGroupInThread(this._threadID);\n            if (dd) {\n                cd.setAttribute(\"ajaxify\", hb(cd.getAttribute(\"ajaxify\")).addQueryData({\n                    id: dd\n                }));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        s.removeEmptyHrefs(this._tabElem);\n        rb[qc] = this;\n        this.updateAvailableStatus();\n        this.updateTab();\n        this._setCloseTooltip(false);\n        var ed = {\n            threadID: qc,\n            userID: uc,\n            signatureID: this._signatureID\n        };\n        new l(\"/ajax/chat/opentab_tracking.php\", ed).send();\n        ab.onBeforeUnload(function() {\n            if (((ic(this) || gc(this)))) {\n                return \"You haven't sent your message yet. Do you want to leave without sending?\";\n            }\n        ;\n        ;\n            if (ja.getNumberLocalMessages(this._threadID)) {\n                return \"Your message is still being sent. Are you sure you want to leave?\";\n            }\n        ;\n        ;\n            return null;\n        }.bind(this), false);\n        ab.onUnload(function() {\n            oc(this);\n        }.bind(this));\n    };\n;\n    function oc(qc) {\n        if (qc._photoUploader.isUploading()) {\n            mc(qc, xa.CANCEL_DURING_UPLOAD);\n        }\n    ;\n    ;\n    };\n;\n    function pc() {\n        {\n            var fin273keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin273i = (0);\n            var qc;\n            for (; (fin273i < fin273keys.length); (fin273i++)) {\n                ((qc) = (fin273keys[fin273i]));\n                {\n                    rb[qc].updateAvailableStatus();\n                    rb[qc].updateMultichatTooltip();\n                };\n            };\n        };\n    ;\n    };\n;\n    h.subscribe([\"buddylist/availability-changed\",], pc);\n    ya.subscribe([\"privacy-changed\",\"privacy-availability-changed\",], pc);\n    n.subscribe(n.ON_CHANGED, function() {\n        {\n            var fin274keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin274i = (0);\n            var qc;\n            for (; (fin274i < fin274keys.length); (fin274i++)) {\n                ((qc) = (fin274keys[fin274i]));\n                {\n                    sa.getThreadMeta(qc, function(rc) {\n                        rb[qc]._updateUnreadCount(rc);\n                    });\n                ;\n                };\n            };\n        };\n    ;\n    });\n    ta.subscribe(\"state-changed\", function(qc, rc) {\n        {\n            var fin275keys = ((window.top.JSBNG_Replay.forInKeys)((rc))), fin275i = (0);\n            var sc;\n            for (; (fin275i < fin275keys.length); (fin275i++)) {\n                ((sc) = (fin275keys[fin275i]));\n                {\n                    var tc = ((rc[sc] && rc[sc].length)), uc = rb[sc];\n                    ((uc && uc.showTypingIndicator(tc)));\n                };\n            };\n        };\n    ;\n    });\n    oa.subscribe(\"threads-updated\", function(qc, rc) {\n        {\n            var fin276keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin276i = (0);\n            var sc;\n            for (; (fin276i < fin276keys.length); (fin276i++)) {\n                ((sc) = (fin276keys[fin276i]));\n                {\n                    ((rc[sc] && rb[sc].updateTab()));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    oa.subscribe(\"threads-deleted\", function(qc, rc) {\n        {\n            var fin277keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin277i = (0);\n            var sc;\n            for (; (fin277i < fin277keys.length); (fin277i++)) {\n                ((sc) = (fin277keys[fin277i]));\n                {\n                    ((rc[sc] && nc.inform(\"thread-deleted\", sc)));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    lb(nc, i, {\n        get: function(qc) {\n            return rb[qc];\n        }\n    });\n    lb(nc.prototype, {\n        getThreadID: function() {\n            return this._threadID;\n        },\n        showAddFriend: function() {\n            (function() {\n                this._sheetController.openAddFriendsSheet();\n            }).bind(this).defer();\n        },\n        showPeopleSuggestions: function() {\n            (function() {\n                this._peopleSuggestions = new u(this._sheetController, this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"));\n            }).bind(this).defer();\n        },\n        showNameConversation: function(qc) {\n            (function() {\n                this._sheetController.openNameConversationSheet(qc);\n            }).bind(this).defer();\n        },\n        hideAutomaticNameConversation: function() {\n            (function() {\n                this._sheetController.closeAutomaticNameConversationSheet();\n            }).bind(this).defer();\n        },\n        isVisible: function() {\n            return y.shown(this._tabElem);\n        },\n        setVisibleState: function(qc, rc) {\n            var sc = y.shown(this._tabElem), tc = y.hasClass(this._tabElem, \"opened\");\n            y.conditionShow(this._tabElem, qc);\n            y.conditionClass(this._tabElem, \"opened\", rc);\n            if (((((!((sc && tc)) && qc)) && rc))) {\n                if (!this._messagesView) {\n                    this._messagesView = new t(this._threadID, this._sheetController, this._getNode(\"chatConv\"), this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"), this._getNode(\"lastMessageIndicator\"), this._getNode(\"typingIndicator\"));\n                }\n            ;\n            ;\n                this._nubController.flyoutContentChanged();\n                this._messagesView.scrollToBottom();\n            }\n        ;\n        ;\n            if (((((sc && tc)) && !((qc && rc))))) {\n                this._contextualDialogController.tabNotActive();\n            }\n        ;\n        ;\n        },\n        JSBNG__focus: function() {\n            var qc = ((y.hasClass(this._tabElem, \"opened\") ? \"input\" : \"dockButton\"));\n            this._getNode(qc).JSBNG__focus();\n        },\n        isFocused: function() {\n            var qc = JSBNG__document.activeElement;\n            return ((wa.byClass(qc, \"-cx-PRIVATE-fbMercuryChatTab__root\") === this._tabElem));\n        },\n        hasEmptyInput: function() {\n            return pb.test(this._getNode(\"input\").value);\n        },\n        getInputElem: function() {\n            return this._getNode(\"input\");\n        },\n        setInput: function(qc) {\n            this._getNode(\"input\").value = qc;\n        },\n        insertBefore: function(qc) {\n            ba.insertBefore(qc._tabElem, this._tabElem);\n        },\n        appendTo: function(qc) {\n            ba.appendContent(qc, this._tabElem);\n        },\n        nextTabIs: function(qc) {\n            var rc = ((qc && qc._tabElem));\n            return ((this._tabElem.nextSibling == rc));\n        },\n        getScrollTop: function() {\n            return ba.JSBNG__find(this._tabElem, \".scrollable\").scrollTop;\n        },\n        setScrollTop: function(qc) {\n            ba.JSBNG__find(this._tabElem, \".scrollable\").scrollTop = qc;\n        },\n        destroy: function() {\n            ba.remove(this._tabElem);\n            ((this._emoticonView && this._emoticonView.destroy()));\n            ((this._stickerController && this._stickerController.destroy()));\n            while (this._eventListeners.length) {\n                this._eventListeners.pop().remove();\n            ;\n            };\n        ;\n            ((this._messagesView && this._messagesView.destroy()));\n            this._sheetController.destroy();\n            this._fileUploader.destroy();\n            this._photoUploader.destroy();\n            this._subscriptionsHandler.release();\n            this._contextualDialogController.destroy();\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n            delete rb[this._threadID];\n            aa.unregisterNubController(this._nubController);\n            ca.reset(this._getNode(\"input\"));\n        },\n        updateAvailableStatus: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                var rc = m.OFFLINE, sc = this._getCanonicalUserID();\n                if (sc) {\n                    rc = za.get(sc);\n                }\n                 else {\n                    var tc = qc.participants.map(function(vc) {\n                        return ka.getUserID(vc);\n                    });\n                    rc = za.getGroup(tc);\n                }\n            ;\n            ;\n                if (!w.isOnline()) {\n                    rc = m.OFFLINE;\n                }\n            ;\n            ;\n                if (sc) {\n                    this._updateCallLink(rc);\n                }\n            ;\n            ;\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__active\", ((rc === m.ACTIVE)));\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__mobile\", ((rc === m.MOBILE)));\n                var uc = this._getNode(\"presenceIndicator\");\n                switch (rc) {\n                  case m.ACTIVE:\n                    uc.setAttribute(\"alt\", \"Online\");\n                    break;\n                  case m.MOBILE:\n                    uc.setAttribute(\"alt\", \"Mobile\");\n                    break;\n                  default:\n                    uc.removeAttribute(\"alt\");\n                    break;\n                };\n            ;\n            }.bind(this));\n        },\n        updateTab: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_subscribed) {\n                    nc.inform(\"unsubscribed\", this._threadID);\n                    return;\n                }\n            ;\n            ;\n                qa.renderAndSeparatedParticipantList(this._threadID, [this._getNode(\"JSBNG__name\"),this._getNode(\"titlebarText\"),], {\n                    names_renderer: pa.renderShortNames,\n                    check_length: true\n                });\n                if (((qc.is_joinable && !o.get(\"joinable_conversation_is_modal\")))) {\n                    this._updateJoinableAddFriendSheet(qc);\n                }\n            ;\n            ;\n                this._updateMutingSettings(qc);\n                this._updateUnreadCount(qc);\n                this.updateMultichatTooltip();\n                this._updateArchiveWarning(qc);\n                this._updateNewThread(qc);\n                this._updateNameConversationSheet(qc);\n            }.bind(this));\n        },\n        _updateNameConversationSheet: function(qc) {\n            if (((((((!qc.JSBNG__name && !qc.is_canonical)) && !qc.name_conversation_sheet_dismissed)) && !sa.isEmptyLocalThread(qc.thread_id)))) {\n                this.showNameConversation(true);\n            }\n             else this.hideAutomaticNameConversation();\n        ;\n        ;\n        },\n        _updateJoinableAddFriendSheet: function(qc) {\n            var rc = ka.user, sc = qc.participants.filter(function(tc) {\n                return ((tc != rc));\n            });\n            if (((qc.is_joinable && ((sc.length < 1))))) {\n                this.showAddFriend();\n            }\n        ;\n        ;\n        },\n        updateSignatureID: function(qc) {\n            this._signatureID = qc;\n        },\n        _showPhotoNUXIfNecessary: function() {\n            if (sb) {\n                sb = false;\n                new k(\"/ajax/chat/photo_nux.php\").setRelativeTo(this._getNode(\"photoAttachLink\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        ;\n        },\n        _showStickerNUXIfNecessary: function() {\n            if (tb) {\n                tb = false;\n                new k(\"/ajax/messaging/stickers/nux\").setRelativeTo(this._getNode(\"emoticons\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        ;\n        },\n        _setUpMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if (rc) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n        ;\n        ;\n            this._updateActionMenu(rc);\n        },\n        _updateMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if (((rc && y.shown(this._getNode(\"muteThreadLink\").parentNode)))) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n             else if (((!rc && y.shown(this._getNode(\"unmuteThreadLink\").parentNode)))) {\n                this._sheetController.closeThreadIsMutedTabSheet();\n            }\n            \n        ;\n        ;\n            this._updateActionMenu(rc);\n        },\n        _updateActionMenu: function(qc) {\n            y.conditionShow(this._getNode(\"muteThreadLink\").parentNode, !qc);\n            y.conditionShow(this._getNode(\"unmuteThreadLink\").parentNode, qc);\n        },\n        _updateArchiveWarning: function(qc) {\n            var rc = false;\n            ka.get(ka.user, function(sc) {\n                rc = sc.employee;\n                if (rc) {\n                    ka.getMulti(qc.participants, this._showArchiveWarningIfAllParticipantsAreEmployees.bind(this));\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _updateNewThread: function(qc) {\n            var rc = sa.isNewEmptyLocalThread(qc.thread_id);\n            y.conditionShow(this._getNode(\"dropdown\"), !rc);\n            if (rc) {\n                this.showAddFriend();\n                if (o.get(\"www_chat_compose_suggestions\", 0)) {\n                    this.showPeopleSuggestions();\n                }\n            ;\n            ;\n            }\n             else if (this._peopleSuggestions) {\n                this._peopleSuggestions.destroy();\n                this._peopleSuggestions = null;\n            }\n            \n        ;\n        ;\n        },\n        _showArchiveWarningIfAllParticipantsAreEmployees: function(qc) {\n            var rc = true;\n            {\n                var fin278keys = ((window.top.JSBNG_Replay.forInKeys)((qc))), fin278i = (0);\n                var sc;\n                for (; (fin278i < fin278keys.length); (fin278i++)) {\n                    ((sc) = (fin278keys[fin278i]));\n                    {\n                        rc = ((rc && qc[sc].employee));\n                    ;\n                    };\n                };\n            };\n        ;\n            var tc = this._getNode(\"titanArchiveWarning\");\n            if (tc) {\n                if (this._titlebarTooltipAnchor) {\n                    y.conditionClass(this._titlebarTooltipAnchor, \"narrowTitleBar\", rc);\n                }\n            ;\n            ;\n                y.conditionShow(tc, rc);\n            }\n        ;\n        ;\n        },\n        updateMultichatTooltip: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_canonical) {\n                    vb(this._titlebarTooltipAnchor, qc.participants);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _getNode: function(qc) {\n            return this._tabTemplate.getNode(qc);\n        },\n        _getCanonicalUserID: function() {\n            return sa.getCanonicalUserInThread(this._threadID);\n        },\n        _listen: function(qc, JSBNG__event, rc, sc) {\n            var tc = this._getNode(qc);\n            if (tc) {\n                this._eventListeners.push(g.listen(tc, JSBNG__event, rc.bind(this)));\n            }\n             else if (!sc) {\n                throw new Error(((((\"Could not find node \\\"\" + qc)) + \"\\\"\")));\n            }\n            \n        ;\n        ;\n        },\n        _closePreClicked: function(qc) {\n            this._closeMouseDown = true;\n        },\n        _closeClicked: function(qc) {\n            oc(this);\n            nc.inform(\"closed-tab\", this._threadID);\n            qc.kill();\n        },\n        _nubClicked: function(qc) {\n            qc.kill();\n            return nc.inform(\"nub-activated\", this._threadID);\n        },\n        _dockKeyDown: function(JSBNG__event) {\n            if (((((JSBNG__event.keyCode === ea.RETURN)) || ((JSBNG__event.keyCode === ea.SPACE))))) {\n                nc.inform(\"nub-activated\", this._threadID);\n                JSBNG__event.kill();\n            }\n             else this._handleHotkeyPressed(JSBNG__event);\n        ;\n        ;\n        },\n        _handleHotkeyPressed: function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === ea.ESC))) {\n                oc(this);\n                nc.inform(\"esc-pressed\", this._threadID);\n                JSBNG__event.kill();\n            }\n             else if (((((JSBNG__event.keyCode === ea.TAB)) && !JSBNG__event.ctrlKey))) {\n                var qc = nc.inform(\"tab-pressed\", {\n                    id: this._threadID,\n                    shiftPressed: JSBNG__event.shiftKey\n                });\n                ((!qc && JSBNG__event.kill()));\n            }\n            \n        ;\n        ;\n        },\n        _isTitleTextLinked: function() {\n            var qc = this._getCanonicalUserID();\n            return ((qc && o.get(\"chat_tab_title_link_timeline\")));\n        },\n        _titleClicked: function(JSBNG__event) {\n            var qc = JSBNG__event.getTarget(), rc = wa.byClass(qc, \"titlebarText\"), sc = ((rc && this._isTitleTextLinked()));\n            if (((((!sc && !wa.byClass(qc, \"uiSelector\"))) && !wa.byClass(qc, \"addToThread\")))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _callClicked: function(qc) {\n            var rc = this._getCanonicalUserID();\n            if (jb.availableForCall(rc)) {\n                var sc = \"chat_tab_icon\";\n                if (((qc.target && y.hasClass(qc.target, \"video_call_promo\")))) {\n                    sc = \"chat_tab_icon_promo\";\n                }\n                 else if (((qc.target && y.hasClass(qc.target, \"video_call_tour\")))) {\n                    sc = \"chat_tab_icon_tour\";\n                }\n                \n            ;\n            ;\n                nc.inform(\"video-call-clicked\", {\n                    threadID: this._threadID,\n                    userID: rc,\n                    clickSource: sc\n                });\n            }\n        ;\n        ;\n            return false;\n        },\n        _addFriendLinkClicked: function() {\n            this.showAddFriend();\n        },\n        _nameConversationLinkClicked: function() {\n            this.showNameConversation();\n        },\n        _clearHistory: function() {\n            var qc = sa.getThreadMetaNow(this._threadID);\n            if (qc) {\n                var rc = this._getCanonicalUserID();\n                la.clearChat(this._threadID, rc, qc.timestamp);\n            }\n        ;\n        ;\n        },\n        _unsubscribeLinkClicked: function() {\n            var qc = [];\n            qc.push({\n                JSBNG__name: \"unsubscribe\",\n                label: \"Leave Conversation\",\n                handler: this._unsubscribeToThread.bind(this)\n            });\n            qc.push(z.CANCEL);\n            new z().setTitle(\"Leave Conversation?\").setBody(\"You will stop receiving messages from this conversation and people will see that you left.\").setButtons(qc).show();\n        },\n        _reportSpamClicked: function() {\n            var qc = this._getCanonicalUserID(), rc = hb(\"/ajax/chat/report.php\").addQueryData({\n                id: qc\n            }).addQueryData({\n                src: \"top_report_link\"\n            });\n            j.send(new k(rc));\n        },\n        _showMuteSettingDialog: function(qc) {\n            ra.showMuteChangeDialog(qc, this._threadID);\n        },\n        _focusTab: function() {\n            y.addClass(this._tabElem, \"focusedTab\");\n            if (this._peopleSuggestions) {\n                this._peopleSuggestions.clearSuggestions();\n            }\n        ;\n        ;\n            this.tryMarkAsRead();\n            this._contextualDialogController.tabFocused();\n            if (((!ub && ((this._showPhotoNUXIfNecessary() || this._showStickerNUXIfNecessary()))))) {\n                h.subscribe([\"ChatNUX/show\",\"ChatNUX/hide\",], function(JSBNG__event) {\n                    ub = ((JSBNG__event === \"ChatNUX/show\"));\n                });\n            }\n        ;\n        ;\n            this._closeMouseDown = false;\n            this._setCloseTooltip(true);\n        },\n        _blurTab: function() {\n            y.removeClass(this._tabElem, \"focusedTab\");\n            ((!this._closeMouseDown && this._setCloseTooltip(false)));\n        },\n        _setCloseTooltip: function(qc) {\n            var rc = this._getNode(\"titlebarCloseButton\"), sc = ((qc ? \"Press Esc to close\" : \"Close tab\"));\n            fb.set(rc, sc, \"above\");\n        },\n        _inputKeyDown: function(JSBNG__event) {\n            if (((((JSBNG__event.keyCode === ea.RETURN)) && !JSBNG__event.shiftKey))) {\n                if (hc(this)) {\n                    fc(this);\n                    JSBNG__event.kill();\n                    return;\n                }\n            ;\n            ;\n                cc(this);\n                JSBNG__event.kill();\n                return;\n            }\n        ;\n        ;\n            if (((((((JSBNG__event.keyCode === ea.DOWN)) && JSBNG__event.shiftKey)) && ((this._getNode(\"input\").value === \"\"))))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                JSBNG__event.kill();\n                return;\n            }\n        ;\n        ;\n            this._handleHotkeyPressed(JSBNG__event);\n        },\n        tryMarkAsRead: function() {\n            if (((!this._messagesView || this._messagesView.isScrolledToBottom()))) {\n                nc.inform(\"read\", this._threadID);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        _chatConvClicked: function(qc) {\n            this.tryMarkAsRead();\n            if (((wa.byTag(qc.getTarget(), \"a\") || ba.JSBNG__getSelection()))) {\n                return;\n            }\n        ;\n        ;\n            this.JSBNG__focus();\n        },\n        _inputContainerClicked: function(qc) {\n            this.tryMarkAsRead();\n            this.JSBNG__focus();\n        },\n        showTypingIndicator: function(qc) {\n            var rc = sa.getThreadMetaNow(this._threadID), sc = ((this._getCanonicalUserID() || ((((o.get(\"chat_multi_typ\") && rc)) && !rc.is_canonical))));\n            if (sc) {\n                y.conditionClass(this._tabElem, \"typing\", qc);\n            }\n        ;\n        ;\n        },\n        _updateUnreadCount: function(qc) {\n            var rc = qc.unread_count;\n            if (((typeof rc != \"undefined\"))) {\n                var sc = ((!!rc && ((!n.showsTabUnreadUI || n.showsTabUnreadUI())))), tc = this._getNode(\"numMessages\");\n                y.conditionShow(tc, sc);\n                y.conditionClass(this._tabElem, \"highlightTab\", sc);\n                zb(this._threadID, this._tabElem, sc);\n                ba.setContent(tc, rc);\n            }\n        ;\n        ;\n        },\n        _updateCallLink: function(qc) {\n            var rc = this._getNode(\"videoCallLink\");\n            if (w.isOnline()) {\n                var sc = this._getCanonicalUserID(), tc = ((\"fbid:\" + sc));\n                ka.get(tc, function(uc) {\n                    if (jb.availableForCall(sc)) {\n                        fb.set(rc, ob._(\"Start a video call with {firstname}\", {\n                            firstname: uc.short_name\n                        }));\n                        this._updateCallBackLinks(this._tabElem, true);\n                    }\n                     else {\n                        fb.set(rc, ob._(\"{firstname} is currently unavailable for video calling\", {\n                            firstname: uc.short_name\n                        }));\n                        this._hideVideoCallouts();\n                        this._updateCallBackLinks(this._tabElem, false);\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else {\n                fb.set(rc, \"You must be online to make a call.\");\n                this._hideVideoCallouts();\n                this._updateCallBackLinks(JSBNG__document.body, false);\n            }\n        ;\n        ;\n        },\n        _updateCallBackLinks: function(qc, rc) {\n            var sc = ba.scry(qc, \"a.callBackLink\");\n            if (rc) {\n                sc.forEach(y.show);\n            }\n             else sc.forEach(y.hide);\n        ;\n        ;\n        },\n        _hideVideoCallouts: function() {\n            this._contextualDialogController.hideVideoCallouts();\n        },\n        _updatePrivacyLink: function(qc) {\n            if (((qc == r.OFFLINE))) {\n                ba.setContent(this._privacyLink, \"Go online\");\n            }\n             else {\n                var rc = this._getCanonicalUserID(), sc = ((\"fbid:\" + rc));\n                ka.get(sc, function(tc) {\n                    var uc = null;\n                    if (((qc == r.BLOCKED))) {\n                        uc = ob._(\"Turn On Chat for {name}\", {\n                            JSBNG__name: tc.short_name\n                        });\n                    }\n                     else uc = ob._(\"Turn Off Chat for {name}\", {\n                        JSBNG__name: tc.short_name\n                    });\n                ;\n                ;\n                    ba.setContent(this._privacyLink, uc);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _unsubscribeToThread: function() {\n            if (sa.isEmptyLocalThread(this._threadID)) {\n                nc.inform(\"unsubscribed\", this._threadID);\n            }\n             else {\n                var qc = ja.constructLogMessageObject(ma.CHAT_WEB, this._threadID, ia.UNSUBSCRIBE, {\n                });\n                ja.sendMessage(qc);\n            }\n        ;\n        ;\n            return true;\n        },\n        _initializeUploader: function(qc) {\n            this._subscriptionsHandler.addSubscriptions(qc.subscribe([\"all-uploads-completed\",\"upload-canceled\",], function() {\n                jc(this);\n            }.bind(this)), qc.subscribe(\"dom-updated\", function() {\n                kc(this);\n            }.bind(this)), qc.subscribe(\"submit\", function() {\n                this._getNode(\"input\").JSBNG__focus();\n            }.bind(this)));\n        },\n        _initializeAutoSendPhotoUploader: function() {\n            this._photoUploader = new q(this._tabTemplate.getNode(\"photoAttachButtonForm\"), this._tabTemplate.getNode(\"photoFileInput\"), this._tabTemplate.getNode(\"photoAttachID\"));\n            var qc = {\n            };\n            lc(this, \"submit\", xa.UPLOAD_START);\n            lc(this, \"all-uploads-completed\", xa.ALL_UPLOADS_DONE);\n            lc(this, \"all-uploads-failed\", xa.CLIENT_ERROR);\n            this._subscriptionsHandler.addSubscriptions(this._photoUploader.subscribe(\"submit\", function(rc, sc) {\n                ec(this, \"\", sc.raw_attachments, function(tc) {\n                    qc[sc.upload_id] = tc;\n                    tc.do_not_send_to_server = true;\n                    tc.JSBNG__status = ga.RESENDING;\n                    ja.sendMessage(tc);\n                });\n                this._getNode(\"input\").JSBNG__focus();\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-failed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                ja.deleteMessages(tc.thread_id, [tc.message_id,]);\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-completed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                delete tc.raw_attachments;\n                tc.image_ids = sc.image_ids;\n                tc.do_not_send_to_server = false;\n                ja.sendMessage(tc);\n                var uc = ((sc.image_ids.length || sc.attachments.length));\n                dc(this, uc);\n            }.bind(this)));\n        },\n        _stickerSelected: function(qc) {\n            ec(this, \"\", [], function(rc) {\n                rc.has_attachment = true;\n                rc.sticker_id = qc;\n                ja.sendMessage(rc);\n                this.JSBNG__focus();\n            }.bind(this));\n        },\n        _emoticonView: null\n    });\n    e.exports = nc;\n});\n__d(\"ChatNewMessageHandler\", [\"ChatActivity\",\"ChatTabModel\",\"ChatTabView\",\"JSLogger\",\"MercuryAssert\",\"MercuryBrowserAlerts\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"JSLogger\"), k = b(\"MercuryAssert\"), l = b(\"MercuryBrowserAlerts\"), m = b(\"MercuryUnseenState\").get(), n = j.create(\"chat_new_message\"), o = {\n        _raiseTab: function(p, q) {\n            var r = h.getTab(p), s = false;\n            if (r) {\n                s = r.raised;\n            }\n             else {\n                h.raiseTab(p, false);\n                s = true;\n            }\n        ;\n        ;\n            q.to_new_tab = !r;\n            q.to_raised_tab = !!s;\n        },\n        _notify: function(p, q, r) {\n            var s = i.get(p);\n            r.view_is_visible = ((s && s.isVisible()));\n            r.view_is_focused = ((s && s.isFocused()));\n            if (!r.view_is_visible) {\n                n.log(\"message_to_hidden\");\n            }\n        ;\n        ;\n            r.is_active = g.isActive();\n            l.messageReceived(q);\n        },\n        _promoteTab: function(p, q, r) {\n            if (((((r && !r[p])) && q))) {\n                h.promoteThreadInPlaceOfThread(p, q);\n            }\n        ;\n        ;\n        },\n        newMessage: function(p, q, r, s) {\n            k.isThreadID(p);\n            var t = {\n                thread_id: p,\n                message_id: q.message_id\n            };\n            this._raiseTab(p, t);\n            this._promoteTab(p, r, s);\n            this._notify(p, q, t);\n            n.log(\"message\", t);\n        }\n    };\n    l.subscribe(\"before-alert\", function(p, JSBNG__event) {\n        var q = JSBNG__event.threadID, r = i.get(q), s = h.getTab(q);\n        if (((((((((((s && s.raised)) && r)) && r.isVisible())) && r.isFocused())) && r.tryMarkAsRead()))) {\n            m.markThreadSeen(q);\n            JSBNG__event.cancelAlert();\n        }\n    ;\n    ;\n    });\n    e.exports = o;\n});\n__d(\"ChatTabPresence\", [\"AvailableList\",\"ChatTabModel\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatTabModel\"), i = b(\"MercuryThreads\").get(), j = {\n    };\n    function k(l) {\n        var m = i.getCanonicalUserInThread(l);\n        if (m) {\n            g.updateForID(m);\n        }\n    ;\n    ;\n    };\n;\n    h.subscribe(\"chat/tabs-changed\", function(JSBNG__event, l) {\n        l.tabs.forEach(function(m) {\n            if (((m.raised && !j[m.id]))) {\n                k(m.id);\n            }\n        ;\n        ;\n        });\n        j = {\n        };\n        l.tabs.forEach(function(m) {\n            if (m.raised) {\n                j[m.id] = true;\n            }\n        ;\n        ;\n        });\n    });\n    e.exports = {\n    };\n});\n__d(\"ChatTabPolicy\", [\"ChatBehavior\",\"FBDesktopPlugin\",\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryParticipants\",\"MercuryParticipantTypes\",\"MercurySourceType\",\"MercuryThreadMode\",\"MercuryThreadMuter\",\"MercuryUnseenState\",\"MessagingTag\",\"PresencePrivacy\",\"ShortProfiles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatBehavior\"), h = b(\"FBDesktopPlugin\"), i = b(\"JSLogger\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryAssert\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryParticipantTypes\"), n = b(\"MercurySourceType\"), o = b(\"MercuryThreadMode\"), p = b(\"MercuryThreadMuter\"), q = b(\"MercuryUnseenState\").get(), r = b(\"MessagingTag\"), s = b(\"PresencePrivacy\"), t = b(\"ShortProfiles\"), u = i.create(\"tab_policy\");\n    function v(w, x) {\n        q.markThreadSeen(w, x);\n    };\n;\n    e.exports = {\n        messageIsAllowed: function(w, x, y) {\n            var z = w.thread_id, aa = x.message_id;\n            k.isThreadID(z);\n            k.isParticipantID(x.author);\n            var ba;\n            if (p.isThreadMuted(w)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mute_settings: w.mute_settings\n                };\n                u.log(\"message_thread_muted\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((w.mode == o.OBJECT_ORIGINATED))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mode: w.mode\n                };\n                u.log(\"message_object_originated\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((((x.source == n.EMAIL)) || ((x.source == n.TITAN_EMAIL_REPLY))))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    source: x.source\n                };\n                u.log(\"message_source_not_allowed\", ba);\n                return;\n            }\n        ;\n        ;\n            var ca = l.getUserID(x.author);\n            if (!ca) {\n                u.log(\"message_bad_author\", {\n                    thread_id: z,\n                    message_id: aa,\n                    user: ca\n                });\n                return;\n            }\n        ;\n        ;\n            if (((x.action_type != j.USER_GENERATED_MESSAGE))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    type: x.action_type\n                };\n                u.log(\"message_non_user_generated\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((w.is_canonical_user && !g.notifiesUserMessages()))) {\n                u.log(\"message_jabber\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                v(z, true);\n                return;\n            }\n        ;\n        ;\n            if (((w.is_canonical && !w.canonical_fbid))) {\n                u.log(\"message_canonical_contact\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n        ;\n            if (h.shouldSuppressMessages()) {\n                u.log(\"message_desktop\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n        ;\n            if (((w.folder != r.INBOX))) {\n                u.log(\"message_folder\", {\n                    thread_id: z,\n                    message_id: aa,\n                    folder: w.folder\n                });\n                return;\n            }\n        ;\n        ;\n            var da = l.getUserID(l.user);\n            t.getMulti([ca,da,], function(ea) {\n                if (!s.allows(ca)) {\n                    u.log(\"message_privacy\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n            ;\n                var fa = ((ea[ca].employee && ea[da].employee));\n                if (((!fa && ((ea[ca].type !== m.FRIEND))))) {\n                    u.log(\"message_non_friend\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n            ;\n                y();\n            });\n        }\n    };\n});\n__d(\"ChatTabViewSelector\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"MenuDeprecated\",\"MercuryThreadInformer\",\"MercuryThreads\",\"NubController\",\"ChatTabTemplates\",\"MercuryThreadMetadataRenderer\",\"Toggler\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"NubController\"), p = b(\"ChatTabTemplates\"), q = b(\"MercuryThreadMetadataRenderer\").get(), r = b(\"Toggler\"), s = b(\"copyProperties\");\n    function t(u) {\n        var v = p[\":fb:chat:tab:selector\"].build(), w = v.getRoot(), x = v.getNode(\"menu\"), y = k.JSBNG__find(x, \".uiMenuInner\"), z = {\n        }, aa = new o().init(w);\n        i.hide(w);\n        k.insertBefore(u, w);\n        function ba(ea) {\n            var fa = 0;\n            {\n                var fin279keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin279i = (0);\n                var ga;\n                for (; (fin279i < fin279keys.length); (fin279i++)) {\n                    ((ga) = (fin279keys[fin279i]));\n                    {\n                        var ha = z[ga], ia = n.getThreadMetaNow(ga), ja = ha.getNode(\"unreadCount\"), ka = ((((ia && ia.unread_count)) || 0));\n                        fa += ka;\n                        if (((ka > 9))) {\n                            ka = \"+\";\n                        }\n                    ;\n                    ;\n                        i.conditionClass(ja, \"invisible_elem\", !ka);\n                        k.setContent(ja, ka);\n                    };\n                };\n            };\n        ;\n            var la = v.getNode(\"numMessages\");\n            i.conditionShow(la, fa);\n            k.setContent(la, fa);\n        };\n    ;\n        this.setTabData = function(ea) {\n            z = {\n            };\n            if (((ea.length < 1))) {\n                i.hide(w);\n                return;\n            }\n        ;\n        ;\n            i.show(w);\n            k.empty(y);\n            ea.forEach(function(fa) {\n                var ga = p[\":fb:chat:tab:selector:item\"].build();\n                z[fa.id] = ga;\n                var ha = ga.getNode(\"JSBNG__content\");\n                q.renderAndSeparatedParticipantList(fa.id, ha);\n                k.prependContent(y, ga.getRoot());\n                j.set(ga.getRoot(), \"threadID\", fa.id);\n                var ia = ga.getNode(\"closeButton\");\n                g.listen(ia, \"click\", function(JSBNG__event) {\n                    t.inform(\"selector/close-tab\", fa.id);\n                    JSBNG__event.kill();\n                });\n            });\n            aa.flyoutContentChanged();\n            k.setContent(v.getNode(\"numTabs\"), ea.length);\n            ba();\n        };\n        function ca(JSBNG__event, ea) {\n            if (((ea.menu != x))) {\n                return;\n            }\n        ;\n        ;\n            var fa = j.get(ea.item, \"threadID\");\n            t.inform(\"selected\", fa);\n            r.hide(w);\n        };\n    ;\n        function da(JSBNG__event, ea) {\n            l.register(x);\n        };\n    ;\n        l.subscribe(\"select\", ca.bind(this));\n        r.listen(\"show\", w, function() {\n            h.inform(\"layer_shown\", {\n                type: \"ChatTabSelector\"\n            });\n            da();\n        });\n        r.listen(\"hide\", w, function() {\n            h.inform(\"layer_hidden\", {\n                type: \"ChatTabSelector\"\n            });\n        });\n        m.subscribe(\"threads-updated\", ba);\n    };\n;\n    s(t, new h());\n    e.exports = t;\n});\n__d(\"ChatTabController\", [\"ChatTabPresence\",\"ChatTypeaheadBehavior\",\"Arbiter\",\"ChatActivity\",\"ChatBehavior\",\"ChatConfig\",\"ChatNewMessageHandler\",\"ChatTabMessagesView\",\"ChatTabModel\",\"ChatTabPolicy\",\"ChatTabView\",\"ChatTabViewSelector\",\"JSLogger\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MercuryUnseenState\",\"Style\",\"UserAgent\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    b(\"ChatTabPresence\");\n    b(\"ChatTypeaheadBehavior\");\n    var g = b(\"Arbiter\"), h = b(\"ChatActivity\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"ChatNewMessageHandler\"), l = b(\"ChatTabMessagesView\"), m = b(\"ChatTabModel\"), n = b(\"ChatTabPolicy\"), o = b(\"ChatTabView\"), p = b(\"ChatTabViewSelector\"), q = b(\"JSLogger\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"MercuryThreads\").get(), v = b(\"MercuryUnseenState\").get(), w = b(\"Style\"), x = b(\"UserAgent\"), y = b(\"VideoCallCore\"), z = ((j.get(\"tab_auto_close_timeout\") || 7200000)), aa = q.create(\"tab_controller\");\n    function ba(na) {\n        u.changeThreadReadStatus(na, true);\n        ca(na);\n    };\n;\n    function ca(na) {\n        v.markThreadSeen(na);\n    };\n;\n    function da(na, oa, pa) {\n        var qa = m.get().tabs;\n        na += ((oa ? 1 : -1));\n        while (((((na >= 0)) && ((na < qa.length))))) {\n            var ra = qa[na], sa = o.get(ra.id);\n            if (((((sa && sa.isVisible())) && ((!pa || ra.raised))))) {\n                sa.JSBNG__focus();\n                return true;\n            }\n        ;\n        ;\n            na += ((oa ? 1 : -1));\n        };\n    ;\n        return false;\n    };\n;\n    function ea(na, oa, pa) {\n        var qa = oa.shouldPromoteOnRaise(na);\n        g.inform(\"chat/promote-tab\", na);\n        if (qa) {\n            m.raiseAndPromoteTab(na, true, pa);\n        }\n         else m.raiseTab(na, true, pa);\n    ;\n    ;\n        var ra = o.get(na);\n        ((ra && ra.JSBNG__focus()));\n    };\n;\n    function fa(na, oa, pa) {\n        var qa = pa.getMaxTabsToShow(), ra = m.indexOf(na);\n        m.closeTabAndDemote(na, ((qa - 2)), oa);\n        return ra;\n    };\n;\n    function ga(na) {\n        var oa = Object.keys(((na.getTabsToShow() || {\n        }))), pa = ((1 * 60)), qa = null, ra = Infinity;\n        for (var sa = 0; ((sa < oa.length)); sa++) {\n            var ta = oa[sa], ua = u.getThreadMetaNow(ta);\n            if (((!o.get(ta).hasEmptyInput() || !ua))) {\n                continue;\n            }\n        ;\n        ;\n            var va = ((((m.getServerTime() - ua.timestamp)) / 1000));\n            if (((!ua.timestamp || ((((ua.timestamp && ((ua.timestamp < ra)))) && ((va > pa))))))) {\n                qa = ua.thread_id;\n                ra = ua.timestamp;\n            }\n        ;\n        ;\n        };\n    ;\n        return qa;\n    };\n;\n    function ha(na) {\n        p.subscribe(\"selected\", function(pa, qa) {\n            ea(qa, na);\n        });\n        g.subscribe(\"chat/open-tab\", function(pa, qa) {\n            ea(qa.thread_id, na, qa.signature_id);\n        });\n        g.subscribe(\"page_transition\", function(pa, qa) {\n            m.closeFragileTabs();\n        });\n        o.subscribe(\"read\", function(JSBNG__event, pa) {\n            ba(pa);\n        });\n        h.subscribe(\"idle\", function(pa, qa) {\n            if (((qa > z))) {\n                var ra = m.get().tabs;\n                ra.forEach(function(sa) {\n                    var ta = sa.id;\n                    u.getThreadMeta(ta, function(ua) {\n                        if (!ua.unread_count) {\n                            aa.log(\"autoclose_idle_seen\", {\n                                thread_id: ta,\n                                idleness: qa\n                            });\n                            m.closeTab(ta, \"autoclose_idle_seen\");\n                        }\n                    ;\n                    ;\n                    });\n                });\n            }\n        ;\n        ;\n        });\n        o.subscribe(\"nub-activated\", function(pa, qa) {\n            ea(qa, na);\n        });\n        o.subscribe(\"lower-activated\", function(pa, qa) {\n            m.lowerTab(qa);\n            var ra = o.get(qa);\n            ((ra && ra.JSBNG__focus()));\n        });\n        function oa(pa, qa) {\n            y.showOutgoingCallDialog(qa.userID, qa.clickSource);\n            m.lowerTab(qa.threadID);\n        };\n    ;\n        o.subscribe(\"video-call-clicked\", oa);\n        l.subscribe(\"video-call-clicked\", oa);\n        o.subscribe(\"closed-tab\", function(pa, qa) {\n            aa.log(\"close_view\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view\", na);\n            return false;\n        });\n        o.subscribe(\"thread-deleted\", function(pa, qa) {\n            aa.log(\"close_thread_deleted\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_thread_deleted\", na);\n            return false;\n        });\n        o.subscribe(\"unsubscribed\", function(pa, qa) {\n            aa.log(\"close_view_unsubscribed\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view_unsubscribed\", na);\n            return false;\n        });\n        o.subscribe(\"esc-pressed\", function(pa, qa) {\n            aa.log(\"close_esc\", {\n                thread_id: qa\n            });\n            var ra = fa(qa, \"close_esc\", na);\n            (function() {\n                ((da(((ra - 1)), true, true) || da(ra, false, true)));\n            }).defer();\n        });\n        p.subscribe(\"selector/close-tab\", function(pa, qa) {\n            aa.log(\"close_chat_from_selector\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_chat_from_selector\", na);\n        });\n        t.subscribe(\"messages-received\", function(pa, qa) {\n            {\n                var fin280keys = ((window.top.JSBNG_Replay.forInKeys)((qa))), fin280i = (0);\n                var ra;\n                for (; (fin280i < fin280keys.length); (fin280i++)) {\n                    ((ra) = (fin280keys[fin280i]));\n                    {\n                        var sa = qa[ra];\n                        for (var ta = 0; ((ta < sa.length)); ta++) {\n                            var ua = sa[ta];\n                            if (((ua.author != r.user))) {\n                                if (!ua.is_unread) {\n                                    aa.log(\"message_already_read\", {\n                                        action_id: ua.action_id,\n                                        thread_id: ua.thread_id\n                                    });\n                                    continue;\n                                }\n                            ;\n                            ;\n                                u.getThreadMeta(ra, function(va) {\n                                    n.messageIsAllowed(va, ua, function() {\n                                        var wa = ((na.hasRoomForRaisedTab() ? undefined : ga(na)));\n                                        k.newMessage(ra, ua, wa, na.getTabsToShow());\n                                    });\n                                });\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n        });\n        t.subscribe(\"thread-read-changed\", function(pa, qa) {\n            {\n                var fin281keys = ((window.top.JSBNG_Replay.forInKeys)((qa))), fin281i = (0);\n                var ra;\n                for (; (fin281i < fin281keys.length); (fin281i++)) {\n                    ((ra) = (fin281keys[fin281i]));\n                    {\n                        if (!qa[ra].mark_as_read) {\n                            aa.log(\"autoclose_marked_unread\", {\n                                thread_id: ra\n                            });\n                            m.closeTab(ra, \"autoclose_marked_unread\");\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        });\n        o.subscribe(\"tab-pressed\", function(pa, qa) {\n            return !da(m.indexOf(qa.id), qa.shiftPressed);\n        });\n        g.subscribe(q.DUMP_EVENT, function(pa, qa) {\n            qa.chat_controller = {\n                auto_close_timeout: z\n            };\n        });\n    };\n;\n    if (x.firefox()) {\n        var ia = function() {\n            return ((((w.get(JSBNG__document.body, \"overflowX\") + \" \")) + w.get(JSBNG__document.body, \"overflowY\")));\n        }, ja = ia(), ka = function() {\n            var na = ia();\n            if (((na !== ja))) {\n                ja = na;\n                g.inform(\"overflow-applied-to-body\");\n            }\n        ;\n        ;\n        };\n        if (((\"JSBNG__MutationObserver\" in window))) {\n            var la = new JSBNG__MutationObserver(ka), ma = {\n                attributes: true,\n                attributeFilter: [\"class\",\"style\",]\n            };\n            la.observe(JSBNG__document.documentElement, ma);\n        }\n         else JSBNG__document.documentElement.JSBNG__addEventListener(\"DOMAttrModified\", function(JSBNG__event) {\n            if (((((JSBNG__event.getTarget() === JSBNG__document.documentElement)) && ((((JSBNG__event.attrName === \"class\")) || ((JSBNG__event.attrName === \"style\"))))))) {\n                ka();\n            }\n        ;\n        ;\n        }, false);\n    ;\n    ;\n    }\n;\n;\n    e.exports = ha;\n});\n__d(\"ChatTabViewCoordinator\", [\"Arbiter\",\"ChatTabModel\",\"ChatTabView\",\"ChatTabViewSelector\",\"CSS\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"ChatTabViewSelector\"), k = b(\"CSS\"), l = b(\"VideoCallCore\");\n    function m(n, o) {\n        var p = new j(n), q = {\n        }, r = false;\n        function s() {\n            var w = h.get(), x = {\n            };\n            w.tabs.forEach(function(z) {\n                x[z.id] = 1;\n            });\n            {\n                var fin282keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin282i = (0);\n                var y;\n                for (; (fin282i < fin282keys.length); (fin282i++)) {\n                    ((y) = (fin282keys[fin282i]));\n                    {\n                        if (!x[y]) {\n                            q[y].destroy();\n                            delete (q[y]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            t(w);\n            u(w);\n        };\n    ;\n        function t(w) {\n            var x = null;\n            w.tabs.forEach(function(y) {\n                var z = y.id, aa = false;\n                if (!q[z]) {\n                    q[z] = new i(z, y.server_id, y.signatureID);\n                    aa = true;\n                }\n                 else q[z].updateSignatureID(y.signatureID);\n            ;\n            ;\n                if (((aa || !q[z].nextTabIs(x)))) {\n                    var ba = q[z].getScrollTop();\n                    if (x) {\n                        q[z].insertBefore(x);\n                    }\n                     else q[z].appendTo(n);\n                ;\n                ;\n                    if (ba) {\n                        q[z].setScrollTop(ba);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                x = q[z];\n            });\n        };\n    ;\n        function u(w) {\n            var x = o.getTabsToShow(w), y = [], z = false;\n            w.tabs.forEach(function(aa) {\n                if (!x[aa.id]) {\n                    q[aa.id].setVisibleState(false, aa.raised);\n                    y.push(aa);\n                }\n            ;\n            ;\n            });\n            w.tabs.forEach(function(aa) {\n                if (x[aa.id]) {\n                    q[aa.id].setVisibleState(true, aa.raised);\n                    z |= aa.raised;\n                }\n            ;\n            ;\n            });\n            p.setTabData(y);\n            v(z);\n        };\n    ;\n        function v(w) {\n            if (((!w && r))) {\n                g.inform(\"layer_hidden\", {\n                    type: \"ChatTab\"\n                });\n                r = false;\n            }\n             else if (((w && !r))) {\n                g.inform(\"layer_shown\", {\n                    type: \"ChatTab\"\n                });\n                r = true;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (l.isSupported()) {\n            k.addClass(n, \"videoCallEnabled\");\n        }\n    ;\n    ;\n        o.subscribe(\"tabs-changed\", s);\n        s();\n    };\n;\n    e.exports = m;\n});\n__d(\"TabsViewport\", [\"Arbiter\",\"ArbiterMixin\",\"ChatTabModel\",\"Dock\",\"DOM\",\"DOMDimensions\",\"JSBNG__Event\",\"Parent\",\"Vector\",\"ViewportBounds\",\"areObjectsEqual\",\"copyProperties\",\"csx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"Dock\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"JSBNG__Event\"), n = b(\"Parent\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"areObjectsEqual\"), r = b(\"copyProperties\"), s = b(\"csx\"), t = b(\"shield\"), u = 164, v = 264;\n    function w(x) {\n        this._root = x;\n        var y = this._recalculateWidth.bind(this);\n        m.listen(window, \"resize\", y);\n        j.subscribe(\"resize\", y);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], y);\n        g.subscribeOnce([\"sidebar/initialized\",\"LitestandSidebar/initialized\",], y, g.SUBSCRIBE_NEW);\n        i.subscribe(\"chat/tabs-changed\", t(this._recalculateTabs, this, true));\n        this._recalculateWidth();\n        this._initialized = true;\n    };\n;\n    r(w.prototype, h, {\n        _root: null,\n        _initialized: false,\n        _availableWidth: 0,\n        _maxShown: 1,\n        _viewState: null,\n        _recalculateWidth: function() {\n            var x = w._getAvailableDockWidth(this._root), y = Math.max(1, Math.floor(((x / v)))), z = ((y != this._maxShown));\n            if (((((((!this._viewState || z)) || ((x <= this._viewState.usedWidth)))) || ((x > this._viewState.widthToShowNext))))) {\n                this._availableWidth = x;\n                this._maxShown = y;\n                this._viewState = null;\n                this._recalculateTabs(z);\n            }\n        ;\n        ;\n        },\n        _onTabsChanged: function() {\n            if (this._initialized) {\n                this.inform(\"tabs-changed\");\n                this.inform(\"max-to-show-changed\", this._maxShown);\n                this.inform(\"max-to-show-change-completed\");\n            }\n        ;\n        ;\n        },\n        _recalculateTabs: function(x) {\n            var y = w._getTabsToShow(i.get(), this._availableWidth);\n            if (((x || !q(this._viewState, y)))) {\n                this._viewState = y;\n                this._onTabsChanged();\n            }\n        ;\n        ;\n        },\n        getMaxTabsToShow: function() {\n            return this._maxShown;\n        },\n        checkWidth: function() {\n            this._recalculateWidth();\n        },\n        hasRoomForRaisedTab: function() {\n            return ((((this._availableWidth - this._viewState.usedWidth)) > v));\n        },\n        getTabsToShow: function() {\n            return JSON.parse(JSON.stringify(this._viewState.tabsToShow));\n        },\n        shouldPromoteOnRaise: function(x) {\n            if (!this._viewState.tabsToShow[x]) {\n                return true;\n            }\n        ;\n        ;\n            if (((this._viewState.nextToHide != x))) {\n                return false;\n            }\n        ;\n        ;\n            var y = i.getTab(x), z = ((y && y.raised));\n            return ((!z && ((((this._availableWidth - this._viewState.usedWidth)) < 100))));\n        }\n    });\n    r(w, {\n        _getAvailableDockWidth: function(x) {\n            var y = l.getViewportWithoutScrollbarDimensions().width;\n            y -= ((p.getLeft() + p.getRight()));\n            y -= 50;\n            var z = n.byClass(x, \"fbDock\"), aa = k.JSBNG__find(z, \".-cx-PUBLIC-fbDockChatBuddyListNub__container\"), ba = o.getElementDimensions(aa).x;\n            y -= ba;\n            var ca = k.JSBNG__find(z, \".-cx-PUBLIC-fbMercuryChatTab__container\");\n            ba += o.getElementDimensions(ca).x;\n            var da = o.getElementDimensions(z), ea = ((da.x - ba));\n            y -= ea;\n            y -= 15;\n            return Math.max(y, 0);\n        },\n        _getTabsToShow: function(x, y) {\n            y = Math.max(y, ((v + 1)));\n            function z(oa) {\n                return ((oa.raised ? v : u));\n            };\n        ;\n            var aa = JSON.parse(JSON.stringify(x.tabs)), ba = -1, ca = null;\n            if (x.promoted) {\n                aa.forEach(function(oa, pa) {\n                    if (((oa.id === x.promoted))) {\n                        ba = pa;\n                        ca = oa;\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            var da = 0, ea = 0, fa = !ca;\n            aa.forEach(function(oa, pa) {\n                var qa = z(oa);\n                oa.leftmostOffset = ((da + v));\n                da += qa;\n                if (((oa.leftmostOffset < y))) {\n                    ea++;\n                }\n            ;\n            ;\n                fa |= ((pa == ba));\n                oa.alreadyPlacedPromoted = fa;\n            });\n            function ga(oa, pa, qa) {\n                var ra = {\n                };\n                for (var sa = 0; ((sa < pa)); sa++) {\n                    var ta = oa[sa];\n                    if (((!ta.alreadyPlacedPromoted && ((sa == ((pa - 1))))))) {\n                        ra[qa] = true;\n                    }\n                     else ra[ta.id] = true;\n                ;\n                ;\n                };\n            ;\n                return ra;\n            };\n        ;\n            var ha = ga(aa, ea, x.promoted), ia = ga(aa, ((ea - 1)), x.promoted), ja = null;\n            {\n                var fin283keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin283i = (0);\n                var ka;\n                for (; (fin283i < fin283keys.length); (fin283i++)) {\n                    ((ka) = (fin283keys[fin283i]));\n                    {\n                        if (!ia[ka]) {\n                            ja = ka;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var la = aa[((ea - 1))], ma = ((la ? la.leftmostOffset : 0)), na = Infinity;\n            if (((ea < aa.length))) {\n                na = aa[ea].leftmostOffset;\n            }\n        ;\n        ;\n            return {\n                nextToHide: ja,\n                tabsToShow: ha,\n                usedWidth: ma,\n                widthToShowNext: na\n            };\n        }\n    });\n    e.exports = w;\n});\n__d(\"LinkshimHandler\", [\"JSBNG__Event\",\"LinkshimAsyncLink\",\"LinkshimHandlerConfig\",\"URI\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"LinkshimAsyncLink\"), i = b(\"LinkshimHandlerConfig\"), j = b(\"URI\"), k = b(\"shield\"), l = {\n        setUpLinkshimHandling: function(r) {\n            var s = j(r.getAttribute(\"href\")), t = m(s);\n            if (((t && n(s)))) {\n                g.listen(r, \"mouseover\", k(h.swap, null, r, t));\n                var u = p(s);\n                g.listen(r, \"click\", function() {\n                    if (i.supports_meta_referrer) {\n                        h.referrer_log(r, u, o(s).toString());\n                    }\n                     else h.swap(r, s);\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        }\n    };\n    function m(r) {\n        return ((r.getQueryData().u ? new j(r.getQueryData().u) : null));\n    };\n;\n    function n(r) {\n        return r.getQueryData().hasOwnProperty(\"s\");\n    };\n;\n    function o(r) {\n        return j(\"/si/ajax/l/render_linkshim_log/\").setSubdomain(\"www\").setQueryData(r.getQueryData());\n    };\n;\n    function p(r) {\n        var s;\n        if (q()) {\n            s = j(r).addQueryData({\n                render_verification: true\n            });\n        }\n         else s = m(r);\n    ;\n    ;\n        return s;\n    };\n;\n    function q() {\n        var r = ((i.render_verification_rate || 0));\n        return ((Math.floor(((((Math.JSBNG__random() * r)) + 1))) === r));\n    };\n;\n    e.exports = l;\n});\n__d(\"legacy:CompactTypeaheadRenderer\", [\"CompactTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    }\n;\n;\n    a.TypeaheadRenderers.compact = b(\"CompactTypeaheadRenderer\");\n}, 3);");
// 14034
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o61,o62);
// undefined
o62 = null;
// 14039
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o63,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yE/r/kK2ZohtlkyG.js",o100);
// undefined
o63 = null;
// undefined
o100 = null;
// 14043
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"H+v1W\",]);\n}\n;\n__d(\"CanvasAppRequestUpdater\", [\"Arbiter\",\"CSS\",\"ChannelConstants\",\"DOM\",\"copyProperties\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"ChannelConstants\"), j = b(\"DOM\"), k = b(\"copyProperties\"), l = b(\"csx\");\n    function m(n) {\n        this._root = n;\n        g.subscribe(i.getArbiterType(\"app_request_create\"), function(o, p) {\n            var q = j.scry(this._root, (\".item_\" + p.obj.appid))[0], r = (q && j.scry(q, \".-cx-PRIVATE-fbCanvasNavigation__requestslist\")[0]);\n            (r && j.appendContent(r, p.obj.request));\n            (q && this._updateBookmark(q, 1));\n        }.bind(this));\n        g.subscribe(i.getArbiterType(\"app_request_delete\"), function(o, p) {\n            var q = j.scry(this._root, (\".item_\" + p.obj.appid))[0], r = (q && j.scry(q, ((\"[data-requestid='\" + p.obj.requestid) + \"']\"))[0]);\n            (r && j.remove(r.parentNode));\n            (q && this._updateBookmark(q, -1));\n        }.bind(this));\n    };\n    k(m.prototype, {\n        _updateBookmark: function(n, o) {\n            var p = j.find(n, \".-cx-PRIVATE-fbCanvasNavigation__flyout\"), q = j.find(n, \".countValue\"), r = parseInt(j.getText(q), 10), s = Math.max(0, (r + o));\n            j.setContent(q, s);\n            if ((s < 1)) {\n                h.hide(q.parentNode);\n                h.hide(p);\n            }\n             else {\n                h.show(q.parentNode);\n                h.show(p);\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"CanvasFlyoutLoader\", [\"AsyncRequest\",\"Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/flyouts\",\n        init: function(k, l, m) {\n            this.root = k;\n            this.largeApps = l;\n            this.seeAllApps = m;\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.largeApps,\n                all_apps: this.seeAllApps\n            };\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"CanvasRecommendationFlyoutLoader\", [\"AsyncRequest\",\"Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/recommendation/flyouts\",\n        init: function(k, l, m, n) {\n            this.root = k;\n            this.apps = l;\n            this.editorialApps = m;\n            if (n) {\n                this.egoRedirectUrls = n;\n            };\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.apps\n            };\n            if (this.editorialApps) {\n                k.editorial_items = this.editorialApps;\n            };\n            if (this.egoRedirectUrls) {\n                k.egoredirecturls = this.egoRedirectUrls;\n            };\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"BuddyListNub\", [\"JSXDOM\",\"Event\",\"Arbiter\",\"AvailableList\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"Class\",\"CSS\",\"Dock\",\"DOM\",\"HTML\",\"Keys\",\"NubController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"Toggler\",\"copyProperties\",\"csx\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Event\"), i = b(\"Arbiter\"), j = b(\"AvailableList\"), k = b(\"BlackbirdUpsell\"), l = b(\"ChannelConnection\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"Class\"), q = b(\"CSS\"), r = b(\"Dock\"), s = b(\"DOM\"), t = b(\"HTML\"), u = b(\"Keys\"), v = b(\"NubController\"), w = b(\"OrderedFriendsList\"), x = b(\"Parent\"), y = b(\"PresencePrivacy\"), z = b(\"Toggler\"), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"tx\"), ea = 32, fa = 10;\n    function ga(ha, ia, ja) {\n        this.parent.construct(this);\n        this.parent.init(ha);\n        this.root = ha;\n        this.orderedList = ia;\n        this.typeahead = ja;\n        this.button = s.find(ha, \"a.fbNubButton\");\n        this.unreadCount = s.find(ha, \"span.-cx-PRIVATE-fbDockChatBuddyListNub__unreadcount\");\n        this.label = s.find(ha, \"span.label\");\n        this.body = s.scry(ha, \"div.fbNubFlyoutBody\")[0];\n        this.container = x.byClass(ha, \"-cx-PUBLIC-fbDockChatBuddyListNub__container\");\n        var ka = s.find(ha, \"div.fbNubFlyoutTitlebar\");\n        z.createInstance(ka).setSticky(false);\n        ia.subscribe(\"render\", this.flyoutContentChanged.bind(this));\n        ia.setScrollContainer(this.body);\n        j.subscribe(\"buddylist/availability-changed\", this._updateCount.bind(this));\n        i.subscribe(\"chat/connect\", this._handleConnect.bind(this));\n        y.subscribe(\"privacy-user-presence-changed\", this._handleVisibilityChange.bind(this));\n        this.message = s.find(ha, \"div.-cx-PRIVATE-fbDockChatBuddyListNub__message\");\n        this.warningMsgText = null;\n        this.warningMsgEventListener = null;\n        this.showWarningTimeout = null;\n        l.subscribe(l.CONNECTED, this._handleChannelConnected.bind(this));\n        l.subscribe(l.SHUTDOWN, this._handleChannelShutdown.bind(this));\n        l.subscribe(l.RECONNECTING, this._handleChannelReconnecting.bind(this));\n        l.subscribe([l.MUTE_WARNING,l.UNMUTE_WARNING,], this._updateView.bind(this));\n        this.subscribe(\"show\", this.onShow.bind(this));\n        this.subscribe(\"hide\", this.onHide.bind(this));\n        this.subscribe(\"resize\", this.onResize.bind(this));\n        h.listen(ha, \"keydown\", this._onKeyDown.bind(this));\n        h.listen(this.button, \"click\", this.onButtonClick.bind(this));\n        ja.subscribe([\"respond\",\"reset\",], function(la, ma) {\n            if (this._isOpen) {\n                var na = this.orderedList.isVisible();\n                if ((((ma && ma.value) && (ma.value === ja.getCore().getValue())) && ja.getView().isVisible())) {\n                    r.setUseMaxHeight(this.root, false);\n                    this.orderedList.hide();\n                }\n                 else this._showBuddyList();\n            ;\n                if ((na !== this.orderedList.isVisible())) {\n                    this.flyoutContentChanged();\n                };\n            }\n        ;\n        }.bind(this));\n        i.subscribe(\"sidebar/show\", this.hide.bind(this));\n        if (n.get(\"litestand_buddylist_count\")) {\n            i.subscribe(\"buddylist-nub/updateCount\", function(la, ma) {\n                this._unreadMessageCount = ma.count;\n                this._updateView();\n            }.bind(this));\n        };\n        this._orderedListCount = w.getList().length;\n        i.inform(\"buddylist-nub/initialized\", this, i.BEHAVIOR_PERSISTENT);\n        this._handleVisibilityChange();\n    };\n    p.extend(ga, v);\n    aa(ga.prototype, {\n        getButton: function() {\n            return this.button;\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        _handleConnect: function(ha) {\n            this._updateView(true);\n        },\n        _getShutdownReason: function(ha) {\n            switch (ha) {\n              case m.HINT_AUTH:\n                return \"Your session has timed out. Please log in.\";\n              case m.HINT_CONN:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n              case m.HINT_MAINT:\n                return da._(\"Facebook {Chat} is currently down for maintenance.\", {\n                    Chat: \"Chat\"\n                });\n              default:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n            };\n        },\n        _getReconnectMsg: function(ha) {\n            var ia;\n            if ((ha === null)) {\n                ia = \"Unable to connect to chat. Check your Internet connection.\";\n            }\n             else if ((ha > n.get(\"warning_countdown_threshold_msec\"))) {\n                var ja = s.create(\"a\", {\n                    href: \"#\",\n                    className: \"fbChatReconnectLink\"\n                }, \"Try again\"), ka = s.create(\"div\", null, ja), la = ka.innerHTML;\n                ia = t(da._(\"Unable to connect to chat. {try-again-link}\", {\n                    \"try-again-link\": la\n                }));\n            }\n             else if ((ha > 1000)) {\n                ia = da._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                    seconds: Math.floor((ha / 1000))\n                });\n            }\n             else ia = \"Unable to connect to chat. Reconnecting...\";\n            \n            \n        ;\n            return ia;\n        },\n        _resetShowWarningTimeout: function() {\n            if (this.showWarningTimeout) {\n                clearTimeout(this.showWarningTimeout);\n                this.showWarningTimeout = null;\n            }\n        ;\n        },\n        _handleChannelConnected: function(ha) {\n            this._resetShowWarningTimeout();\n            if (this.orderedList.isVisible()) {\n                o.goOnline();\n            };\n            this.warningMsgText = null;\n            this._updateView();\n        },\n        _handleChannelShutdown: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getShutdownReason(ia);\n            this._updateView();\n        },\n        _handleChannelReconnecting: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getReconnectMsg(ia);\n            if ((ia > 1000)) {\n                if ((ia > n.get(\"warning_countdown_threshold_msec\"))) {\n                    if (this.warningMsgEventListener) {\n                        this.warningMsgEventListener.remove();\n                        this.warningMsgEventListener = null;\n                    }\n                ;\n                    this.warningMsgEventListener = h.listen(this.message, \"click\", function(event) {\n                        if (q.hasClass(event.getTarget(), \"fbChatReconnectLink\")) {\n                            this._tryReconnect();\n                            event.kill();\n                        }\n                    ;\n                    }.bind(this));\n                }\n            ;\n                this.showWarningTimeout = setTimeout(this._handleChannelReconnecting.bind(this, ha, (ia - 1000)), 1000, false);\n            }\n        ;\n            this._updateView();\n        },\n        _tryReconnect: function() {\n            if (l.disconnected()) {\n                l.reconnect();\n            };\n        },\n        _handleVisibilityChange: function() {\n            this._updateView();\n            if (k.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    k.showBlackbirdDialog(this.getButton(), y.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    k.showOfflineDialog(this.getButton());\n                }\n            ;\n            }\n             else k.hide();\n        ;\n            if (!o.isOnline()) {\n                this.hide();\n            };\n        },\n        _updateView: function(ha) {\n            var ia = this.container;\n            if (ia) {\n                q.conditionClass(ia, \"offline\", !o.isOnline());\n                q.conditionClass(ia, \"error\", l.disconnected());\n            }\n        ;\n            if (l.disconnected()) {\n                s.setContent(this.message, this.warningMsgText);\n            };\n            var ja, ka;\n            if (!o.isOnline()) {\n                ja = da._(\"{Chat} (Off)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else if (l.disconnected()) {\n                ja = da._(\"{Chat} (Disconnected)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else {\n                var la = j.getOnlineCount();\n                if (la) {\n                    ja = da._(\"{Chat} {number-available}\", {\n                        Chat: \"Chat\",\n                        \"number-available\": g.span({\n                            className: \"count\"\n                        }, \" (\", g.strong(null, la), \") \")\n                    });\n                }\n                 else {\n                    ja = \"Chat\";\n                    ka = true;\n                }\n            ;\n            }\n            \n        ;\n            this._setUnread(this._unreadMessageCount);\n            this._setLabel(ja, ka);\n            this.buttonContentChanged();\n        },\n        onButtonClick: function() {\n            this._conditionallyShowTypeahead();\n            if (q.shown(this.typeahead.getElement())) {\n                var ha = this.subscribe(\"show\", function() {\n                    this.typeahead.getCore().getElement().focus();\n                    k.dismiss();\n                }.bind(this));\n                this.unsubscribe.bind(this, ha).defer();\n            }\n        ;\n        },\n        onHide: function() {\n            this._isOpen = false;\n            if (this._buddyListRenderSubscription) {\n                this.orderedList.unsubscribe(this._buddyListRenderSubscription);\n                this._buddyListRenderSubscription = null;\n            }\n        ;\n            this.orderedList.hide();\n            this.typeahead.getCore().reset();\n        },\n        _onKeyDown: function(event) {\n            var ha = h.getKeyCode(event);\n            if (((ha === u.ESC) && !q.hasClass(this.root, \"menuOpened\"))) {\n                this.hide();\n                return false;\n            }\n        ;\n        },\n        onResize: function() {\n            var ha = (r.getMaxFlyoutHeight(this.root) - 60), ia = Math.max(250, ha);\n            this.orderedList.setNumTopFriends(Math.floor((ia / ea)));\n        },\n        _showBuddyList: function() {\n            if (!this._buddyListRenderSubscription) {\n                this._buddyListRenderSubscription = this.orderedList.subscribe(\"render\", r.setUseMaxHeight.bind(r, this.root, false));\n            };\n            this.orderedList.show();\n        },\n        onShow: function() {\n            this._isOpen = true;\n            if (l.disconnected()) {\n                this._tryReconnect();\n                this._showBuddyList();\n            }\n             else o.goOnline(this._showBuddyList.bind(this));\n        ;\n        },\n        _setLabel: function(ha, ia) {\n            var ja = this.label.cloneNode(true);\n            s.setContent(ja, ha);\n            s.replace(this.label, ja);\n            this.label = ja;\n            (this.throbber && q.conditionShow(this.throbber, !!ia));\n        },\n        _setUnread: function(ha) {\n            q.conditionShow(this.unreadCount, !!ha);\n            if (ha) {\n                ha = g.span({\n                    className: \"-cx-PRIVATE-fbMercuryChatTab__nummessages -cx-PRIVATE-fbMercuryChatTab__numbluegrey\"\n                }, ha);\n                s.setContent(this.unreadCount, ha);\n            }\n        ;\n        },\n        _conditionallyShowTypeahead: function() {\n            q.conditionShow(this.typeahead.getElement(), (this._orderedListCount >= fa));\n        },\n        _updateCount: function() {\n            this._updateView();\n            this._conditionallyShowTypeahead();\n        }\n    });\n    e.exports = ga;\n});\n__d(\"LiveBarData\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"ChannelConstants\",\"LayerDestroyOnHide\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"LayerDestroyOnHide\"), l = b(\"copyProperties\"), m = b(\"setTimeoutAcrossTransitions\"), n = false, o = {\n    }, p = {\n    }, q = {\n    };\n    function r(y) {\n        if (((((y.expires * 1000)) - Date.now()) > 0)) {\n            return true\n        };\n        return false;\n    };\n    function s(y) {\n        var z = y.payload.actions;\n        if (!((z && z.length))) {\n            return\n        };\n        var aa;\n        for (var ba = 0; (ba < z.length); ba++) {\n            aa = z[ba].actor_id;\n            if ((!o[aa] || (z[ba].action_id != o[aa].action_id))) {\n                continue;\n            };\n            if ((z[ba].delete_action || z[ba].remove)) {\n                v(z[ba]);\n                continue;\n            }\n        ;\n        };\n    };\n    function t(y) {\n        var z = false;\n        for (var aa = 0; (aa < y.length); aa++) {\n            if ((y[aa].delete_action || y[aa].remove)) {\n                v(y[aa]);\n                continue;\n            }\n        ;\n            var ba = y[aa].actor_id, ca = y[aa].action_id;\n            if (o[ba]) {\n                if ((o[ba].action_id == ca)) {\n                    continue;\n                };\n                v(o[ba]);\n            }\n        ;\n            z = true;\n            o[ba] = y[aa];\n            u(y[aa]);\n        };\n        if (z) {\n            x.inform(\"new-actions\");\n        };\n    };\n    function u(y) {\n        var z = (((y.expires * 1000)) - Date.now());\n        p[y.actor_id] = m(v.curry(y), Math.max(0, z));\n    };\n    function v(y) {\n        if (!o[y.actor_id]) {\n            return\n        };\n        if ((o[y.actor_id].action_id != y.action_id)) {\n            return\n        };\n        delete o[y.actor_id];\n        var z = y.actor_id;\n        if (p[z]) {\n            clearTimeout(p[z]);\n            delete p[z];\n        }\n    ;\n        w(z);\n        x.inform(\"remove-action\", y);\n    };\n    function w(y) {\n        var z = q[y];\n        if (z) {\n            z.enableBehavior(k);\n            if (!z.isShown()) {\n                z.destroy();\n            };\n            delete q[y];\n        }\n    ;\n    };\n    g.subscribe(j.getArbiterType(\"livebar_update\"), function(y, z) {\n        t(z.obj.actions);\n    });\n    var x = {\n    };\n    l(x, h, {\n        fetch: function() {\n            if (n) {\n                return\n            };\n            var y = [];\n            for (var z in o) {\n                var aa = o[z];\n                if (aa.suppress_callout) {\n                    continue;\n                };\n                if (!q[aa.actor_id]) {\n                    y.push(o[z]);\n                };\n            };\n            if ((y.length > 0)) {\n                n = true;\n                new i().setURI(\"/ajax/chat/livebar.php\").setData({\n                    actions: y\n                }).setHandler(s).setFinallyHandler(function() {\n                    n = false;\n                }).setAllowCrossPageTransition(true).send();\n            }\n        ;\n        },\n        addActions: t,\n        getAction: function(y) {\n            var z = o[y];\n            if ((z && r(z))) {\n                return z\n            };\n            return null;\n        },\n        getDialog: function(y) {\n            var z = this.getAction(y);\n            if ((z && q[z.actor_id])) {\n                return q[z.actor_id]\n            };\n            return null;\n        },\n        setDialog: function(y, z, aa) {\n            var ba = o[y];\n            if ((ba && (ba.action_id == z))) {\n                w(y);\n                q[y] = aa;\n                x.inform(\"dialog-fetched\", y);\n            }\n        ;\n        }\n    });\n    e.exports = x;\n});\n__d(\"LiveBar\", [\"ChatOrderedList\",\"function-extensions\",\"LegacyContextualDialog\",\"ChatConfig\",\"CSS\",\"LiveBarData\",\"copyProperties\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"function-extensions\");\n    b(\"LegacyContextualDialog\");\n    var g = b(\"ChatConfig\"), h = b(\"CSS\"), i = b(\"LiveBarData\"), j = b(\"copyProperties\"), k = b(\"setTimeoutAcrossTransitions\"), l = b(\"shield\"), m = (g.get(\"livebar_fetch_defer\") || 1000);\n    function n(o, p, q) {\n        this._orderedList = o;\n        this._root = o.getRoot();\n        this._liveBarTypes = q;\n        this._hoverController = o.getHoverController();\n        this._hoverController.subscribe(\"hover\", this._mouseMove.bind(this));\n        this._hoverController.subscribe(\"leave\", this._mouseLeave.bind(this));\n        o.subscribe(\"render\", l(this._handleChatListUpdate, this));\n        i.subscribe(\"new-actions\", this._updateIcons.bind(this));\n        i.subscribe(\"remove-action\", this._handleRemoveAction.bind(this));\n        i.subscribe(\"dialog-fetched\", function(r, s) {\n            this._setDialogContent(s);\n        }.bind(this));\n        i.addActions(p);\n    };\n    j(n, {\n        setDialog: function(o, p, q) {\n            i.setDialog(o, p, q);\n        }\n    });\n    j(n.prototype, {\n        _root: null,\n        _liveBarTypes: null,\n        _hoverController: null,\n        _registrations: {\n        },\n        _renderedIcons: {\n        },\n        _fetchTimer: null,\n        _mouseLeftRoot: false,\n        _chatListRendered: false,\n        _getLiveBarTypes: function() {\n            return this._liveBarTypes;\n        },\n        _handleChatListUpdate: function() {\n            if (!this._chatListRendered) {\n                this._chatListRendered = true;\n                this._updateIcons();\n            }\n        ;\n        },\n        _handleShow: function(o) {\n            this._setDialogContent(o);\n        },\n        _mouseMove: function() {\n            if (!this._fetchTimer) {\n                this._fetchTimer = k(this._fetch.bind(this), m);\n                this._mouseLeftRoot = false;\n            }\n        ;\n        },\n        _mouseLeave: function() {\n            this._mouseLeftRoot = true;\n            clearTimeout(this._fetchTimer);\n            this._fetchTimer = null;\n        },\n        _setDialogContent: function(o) {\n            var p = i.getDialog(o);\n            if (p) {\n                this._hoverController.showHovercard(o, p);\n            };\n        },\n        _fetch: function() {\n            if (this._mouseLeftRoot) {\n                return\n            };\n            this._fetchTimer = null;\n            i.fetch();\n        },\n        _updateIcons: function() {\n            if (!this._chatListRendered) {\n                return\n            };\n            var o = this._orderedList.getAllNodes(), p = this._getLiveBarTypes();\n            for (var q in o) {\n                var r = i.getAction(q);\n                if ((r && ((!this._renderedIcons[q] || (this._renderedIcons[q] != r.action_id))))) {\n                    for (var s = 0; (s < p.length); s++) {\n                        h.removeClass(o[q], p[s]);;\n                    };\n                    h.addClass(o[q], r.livebar_type);\n                    this._renderedIcons[q] = r.action_id;\n                    var t = this._hoverController.register(q, this._handleShow.bind(this));\n                    if (t) {\n                        this._registrations[q] = t;\n                    };\n                }\n            ;\n            };\n        },\n        _handleRemoveAction: function(o, p) {\n            var q = p.action_id, r = p.actor_id;\n            (this._registrations[r] && this._registrations[r].unregister());\n            delete this._registrations[r];\n            if ((this._renderedIcons[r] == q)) {\n                var s = this._getLiveBarTypes(), t = this._orderedList.getAllNodes();\n                if (t[r]) {\n                    for (var u = 0; (u < s.length); u++) {\n                        h.removeClass(t[r], s[u]);;\n                    }\n                };\n                delete this._renderedIcons[r];\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"LiveBarDark\", [\"Class\",\"LiveBar\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LiveBar\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l, m, n) {\n        this.parent.construct(this, l, m, n);\n    };\n    g.extend(k, h);\n    i(k.prototype, {\n        _setupDialogContent: j,\n        _show: j,\n        _updateIcons: j,\n        _handleRemoveAction: j,\n        _handleChatListUpdate: j\n    });\n    e.exports = k;\n});\n__d(\"ChatSidebarDropdown\", [\"Arbiter\",\"AsyncRequest\",\"Chat\",\"ChatOptions\",\"ChatVisibility\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"PresenceState\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Chat\"), j = b(\"ChatOptions\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"Event\"), o = b(\"JSLogger\"), p = b(\"PresenceState\"), q = b(\"SelectorDeprecated\"), r = b(\"copyProperties\");\n    function s(t, u) {\n        this._root = t;\n        this._logger = o.create(\"blackbird\");\n        this._displayBrowserNotificationsIfNeeded();\n        q.listen(t, \"select\", this._onSelect.bind(this));\n        q.listen(t, \"toggle\", this._onToggle.bind(this));\n        if (u) {\n            q.listen(t, \"close\", u.allowCollapse.curry(true, \"SidebarMenu\"));\n            q.listen(t, \"open\", u.allowCollapse.curry(false, \"SidebarMenu\"));\n        }\n    ;\n        g.subscribe(\"chat/option-changed\", this._onOptionChanged.bind(this));\n    };\n    r(s, {\n        registerEditFavorites: function(t, u, v) {\n            function w(x) {\n                l.conditionShow(t, !x);\n                l.conditionShow(u, x);\n            };\n            n.listen(t, \"click\", function() {\n                v.toggleEditMode();\n                w(true);\n            });\n            n.listen(u, \"click\", function() {\n                v.toggleEditMode();\n                w(false);\n            });\n            v.subscribe(\"editStart\", w.curry(true));\n            v.subscribe(\"editEnd\", w.curry(false));\n        }\n    });\n    r(s.prototype, {\n        changeSetting: function(t, u) {\n            if (this._pendingChange) {\n                return false\n            };\n            this._pendingChange = true;\n            var v = {\n            };\n            v[t] = u;\n            j.setSetting(t, u, \"sidebar_menu\");\n            new h(\"/ajax/chat/settings.php\").setHandler(this._onChangeSettingResponse.bind(this, t, u)).setErrorHandler(this._onChangeSettingError.bind(this, t, u)).setFinallyHandler(this._onChangeFinally.bind(this)).setData(v).setAllowCrossPageTransition(true).send();\n        },\n        _displayBrowserNotificationsIfNeeded: function() {\n            if (window.webkitNotifications) {\n                m.scry(document, \"li.sidebar-browser-notif\").forEach(l.show);\n                if ((window.webkitNotifications.checkPermission() !== 0)) {\n                    m.scry(document, \"li.sidebar-browser-notif\").forEach(function(t) {\n                        l.removeClass(t, \"checked\");\n                    });\n                };\n            }\n        ;\n        },\n        _conditionEnabled: function(t, u) {\n            var v = q.getOption(this._root, t);\n            (v && q.setOptionEnabled(v, u));\n        },\n        _onChangeSettingResponse: function(t, u, v) {\n            p.doSync();\n        },\n        _onChangeSettingError: function(t, u, v) {\n            j.setSetting(t, !u, \"sidebar_menu_error\");\n        },\n        _onChangeFinally: function() {\n            this._pendingChange = false;\n        },\n        _onOptionChanged: function(t, u) {\n            var v = u.name, w = u.value;\n            if (((v === \"sound\") || (v === \"browser_notif\"))) {\n                var x = q.getOption(this._root, v);\n                if ((w !== q.isOptionSelected(x))) {\n                    q.setSelected(this._root, v, w);\n                };\n            }\n        ;\n        },\n        _onSelect: function(t) {\n            if (this._pendingChange) {\n                return false\n            };\n            var u = false, v = false, w = q.getOptionValue(t.option);\n            switch (w) {\n              case \"sidebar\":\n                return this.toggleSidebar();\n              case \"online\":\n                if (!k.isOnline()) {\n                    k.goOnline();\n                }\n                 else v = true;\n            ;\n                u = true;\n                break;\n              case \"offline\":\n                if (k.isOnline()) {\n                    k.goOffline();\n                }\n                 else v = true;\n            ;\n                u = true;\n                break;\n              case \"advanced_settings\":\n            \n              case \"turn_off_dialog\":\n                g.inform(\"chat/advanced-settings-dialog-opened\");\n                u = true;\n                break;\n            };\n            if (v) {\n                this._logger.error(\"sidebar_dropdown_visibility_error\", {\n                    action: w\n                });\n            }\n             else this._logger.log(\"sidebar_dropdown_set_visibility\", {\n                action: w\n            });\n        ;\n            if (u) {\n                q.toggle(this._root);\n                return false;\n            }\n        ;\n        },\n        _onToggle: function(t) {\n            if (this._pendingChange) {\n                return false\n            };\n            var u = q.getOptionValue(t.option), v = q.isOptionSelected(t.option);\n            switch (u) {\n              case \"visibility\":\n                if (!k) {\n                    this._jslogger.error(\"on_toggle_visibility_undefined\");\n                    return;\n                }\n            ;\n                k.toggleVisibility();\n                this._logger.log(\"sidebar_dropdown_toggle_visibility\", {\n                    available: v\n                });\n                break;\n              case \"browser_notif\":\n                if (((v && window.webkitNotifications) && (window.webkitNotifications.checkPermission() !== 0))) {\n                    window.webkitNotifications.requestPermission(function() {\n                        this.changeSetting(u, v);\n                    }.bind(this));\n                }\n                 else this.changeSetting(u, v);\n            ;\n                break;\n              case \"sound\":\n                this.changeSetting(u, v);\n                break;\n            };\n            q.toggle(this._root);\n        },\n        _onVisibilityChanged: function() {\n            var t = k.isOnline(), u = q.getOption(this._root, \"visibility\");\n            if ((t !== q.isOptionSelected(u))) {\n                q.setSelected(this._root, \"visibility\", t);\n            };\n        },\n        toggleSidebar: function() {\n            i.toggleSidebar();\n            q.toggle(this._root);\n            return false;\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatSidebarLog\", [\"AsyncSignal\",\"Bootloader\",\"ModuleDependencies\",\"JSLogger\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Bootloader\"), i = b(\"ModuleDependencies\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = j.create(\"chat_sidebar_load\"), m = null, n = false, o = (((Math.random() * 2147483648) | 0)).toString(36);\n    k.onLoad(function() {\n        n = true;\n    });\n    try {\n        d([\"ChatSidebar\",], function(t) {\n            m = t;\n        });\n    } catch (p) {\n        l.warn(\"exception\", {\n            reason: p.toString()\n        });\n    };\n    function q(t, u) {\n        if ((t.length > u)) {\n            return t[u]\n        };\n        return null;\n    };\n    function r(t) {\n        setTimeout(function() {\n            var u = i.getMissing(\"ChatSidebar\"), v = h.getErrorUrls(), w = h.getLoadingUrls(), x = [];\n            for (var y in w) {\n                x.push({\n                    url: y,\n                    time: w[y]\n                });;\n            };\n            x.sort(function(aa, ba) {\n                return (ba.time - aa.time);\n            });\n            var z = {\n                page_loaded: n,\n                page_id: o,\n                timeout: t,\n                missing_total: u.length,\n                module_1: q(u, 0),\n                module_2: q(u, 1),\n                module_3: q(u, 2),\n                error_url_total: v.length,\n                error_url_1: q(v, 0),\n                error_url_2: q(v, 1),\n                error_url_3: q(v, 2),\n                loading_url_total: x.length,\n                loading_url_1: (q(x, 0) ? q(x, 0).url : null),\n                loading_time_1: (q(x, 0) ? q(x, 0).time : null),\n                loading_url_2: (q(x, 1) ? q(x, 1).url : null),\n                loading_time_2: (q(x, 1) ? q(x, 1).time : null),\n                loading_url_3: (q(x, 2) ? q(x, 2).url : null),\n                loading_time_3: (q(x, 2) ? q(x, 2).time : null)\n            };\n            if (!m) {\n                l.warn((\"require_\" + t), {\n                    missing: u\n                });\n                z.symptom = \"require\";\n            }\n        ;\n            if ((m && !m.isInitialized())) {\n                l.warn((\"init_\" + t), {\n                    missing: u\n                });\n                z.symptom = \"init\";\n            }\n        ;\n            if (z.symptom) {\n                new g(\"/ajax/chat/sidebar_load.php\", z).send();\n            };\n        }, t);\n    };\n    var s = {\n        start: function() {\n            r(5000);\n            r(10000);\n            r(15000);\n            r(30000);\n            r(60000);\n        }\n    };\n    e.exports = s;\n});\n__d(\"NotificationConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PayloadSourceType: {\n            UNKNOWN: 0,\n            USER_ACTION: 1,\n            LIVE_SEND: 2,\n            ENDPOINT: 3,\n            INITIAL_LOAD: 4,\n            OTHER_APPLICATION: 5\n        }\n    };\n});\n__d(\"NotificationTokens\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        tokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return ((g.user + \":\") + j);\n            });\n        },\n        untokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return j.split(\":\")[1];\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationImpressions\", [\"AsyncSignal\",\"NotificationTokens\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"NotificationTokens\"), i = b(\"URI\"), j = \"/ajax/notifications/impression.php\";\n    function k(l, m) {\n        var n = {\n            ref: m\n        };\n        h.untokenizeIDs(l).forEach(function(o, p) {\n            n[((\"alert_ids[\" + p) + \"]\")] = o;\n        });\n        new g(i(j).getQualifiedURI().toString(), n).send();\n    };\n    e.exports = {\n        log: k\n    };\n});\n__d(\"NotificationPhotoThumbnail\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((i.style == \"photo\") ? i.media.image : null);\n    };\n    var h = {\n        getThumbnail: function(i, j) {\n            var k;\n            if ((i && i.length)) {\n                k = g(i[0]);\n                if (k) {\n                    return k\n                };\n            }\n        ;\n            if (j) {\n                var l = j.attachments;\n                if ((l && l.length)) {\n                    return g(l[0])\n                };\n            }\n        ;\n            return null;\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationUpdates\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"NotificationConstants\",\"NotificationTokens\",\"LiveTimer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"NotificationConstants\"), k = b(\"NotificationTokens\"), l = b(\"LiveTimer\"), m = b(\"copyProperties\"), n = b(\"createObjectFrom\"), o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [], t = 0, u = i.create(\"notification_updates\");\n    function v() {\n        if (t) {\n            return\n        };\n        var z = o, aa = p, ba = q, ca = r;\n        o = {\n        };\n        p = {\n        };\n        q = {\n        };\n        r = {\n        };\n        x(\"notifications-updated\", z);\n        if (Object.keys(aa).length) {\n            x(\"seen-state-updated\", aa);\n        };\n        if (Object.keys(ba).length) {\n            x(\"read-state-updated\", ba);\n        };\n        if (Object.keys(ca).length) {\n            x(\"hidden-state-updated\", ca);\n        };\n        s.pop();\n    };\n    function w() {\n        if (s.length) {\n            return s[(s.length - 1)]\n        };\n        return j.PayloadSourceType.UNKNOWN;\n    };\n    function x(event, z) {\n        y.inform(event, {\n            updates: z,\n            source: w()\n        });\n    };\n    g.subscribe(h.getArbiterType(\"notification_json\"), function(z, aa) {\n        var ba = Date.now(), ca = aa.obj.nodes;\n        if (ca) {\n            ca.forEach(function(da) {\n                da.receivedTime = ba;\n            });\n            u.debug(\"notifications_received\", ca);\n            y.handleUpdate(j.PayloadSourceType.LIVE_SEND, aa.obj);\n        }\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"notifications_seen\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            seenState: n(ba)\n        });\n    });\n    g.subscribe(h.getArbiterType(\"notifications_read\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            readState: n(ba)\n        });\n    });\n    var y = m(new g(), {\n        handleUpdate: function(z, aa) {\n            if (aa.servertime) {\n                l.restart(aa.servertime);\n            };\n            if (Object.keys(aa).length) {\n                this.synchronizeInforms(function() {\n                    s.push(z);\n                    var ba = m({\n                        payloadsource: w()\n                    }, aa);\n                    this.inform(\"update-notifications\", ba);\n                    this.inform(\"update-seen\", ba);\n                    this.inform(\"update-read\", ba);\n                    this.inform(\"update-hidden\", ba);\n                }.bind(this));\n            };\n        },\n        didUpdateNotifications: function(z) {\n            m(o, n(z));\n            v();\n        },\n        didUpdateSeenState: function(z) {\n            m(p, n(z));\n            v();\n        },\n        didUpdateReadState: function(z) {\n            m(q, n(z));\n            v();\n        },\n        didUpdateHiddenState: function(z) {\n            m(r, n(z));\n            v();\n        },\n        synchronizeInforms: function(z) {\n            t++;\n            try {\n                z();\n            } catch (aa) {\n                throw aa;\n            } finally {\n                t--;\n                v();\n            };\n        }\n    });\n    e.exports = y;\n});\n__d(\"NotificationStore\", [\"KeyedCallbackManager\",\"NotificationConstants\",\"NotificationUpdates\",\"RangedCallbackManager\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"NotificationConstants\"), i = b(\"NotificationUpdates\"), j = b(\"RangedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = new g(), m = new j(function(p) {\n        var q = l.getResource(p);\n        return q.creation_time;\n    }, function(p, q) {\n        return (q - p);\n    }), n = {\n    };\n    i.subscribe(\"update-notifications\", function(p, q) {\n        if (q.page_info) {\n            n = q.page_info;\n        };\n        if ((q.nodes === undefined)) {\n            return\n        };\n        var r, s = [], t = {\n        }, u = (q.nodes || []), v;\n        u.forEach(function(w) {\n            r = w.alert_id;\n            v = l.getResource(r);\n            if ((!v || (v.creation_time < w.creation_time))) {\n                s.push(r);\n                t[r] = w;\n            }\n        ;\n        });\n        l.addResourcesAndExecute(t);\n        m.addResources(s);\n        i.didUpdateNotifications(s);\n    });\n    k.registerEndpoints({\n        \"/ajax/notifications/client/get.php\": {\n            mode: k.IMMEDIATE,\n            handler: function(p) {\n                i.handleUpdate(h.PayloadSourceType.ENDPOINT, p);\n            }\n        }\n    });\n    var o = {\n        getNotifications: function(p, q) {\n            var r = m.executeOrEnqueue(0, p, function(w) {\n                var x = l.executeOrEnqueue(w, function(y) {\n                    q(y);\n                });\n            }), s = m.getUnavailableResources(r);\n            if (s.length) {\n                m.unsubscribe(r);\n                if (!o.canFetchMore()) {\n                    l.executeOrEnqueue(m.getAllResources(), q);\n                    return;\n                }\n            ;\n                var t = (n.end_cursor || null), u;\n                if (t) {\n                    var v = Math.max.apply(null, s);\n                    u = ((v - m.getCurrentArraySize()) + 1);\n                }\n                 else u = p;\n            ;\n                k.trySend(\"/ajax/notifications/client/get.php\", {\n                    cursor: t,\n                    length: u\n                });\n            }\n        ;\n        },\n        getAll: function(p) {\n            o.getNotifications(o.getCount(), p);\n        },\n        getCount: function() {\n            return m.getCurrentArraySize();\n        },\n        canFetchMore: function() {\n            if (n.hasOwnProperty(\"has_next_page\")) {\n                return n.has_next_page\n            };\n            return true;\n        }\n    };\n    e.exports = o;\n});\n__d(\"NotificationUserActions\", [\"AsyncRequest\",\"AsyncSignal\",\"NotificationConstants\",\"NotificationStore\",\"NotificationTokens\",\"NotificationUpdates\",\"URI\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AsyncSignal\"), i = b(\"NotificationConstants\"), j = b(\"NotificationStore\"), k = b(\"NotificationTokens\"), l = b(\"NotificationUpdates\"), m = b(\"URI\"), n = b(\"createObjectFrom\"), o = b(\"emptyFunction\"), p = i.PayloadSourceType.USER_ACTION, q = \"mark_spam\", r = \"turn_off\", s = \"undo\", t = \"first_receipt_yes\", u = \"first_receipt_no\";\n    function v(aa) {\n        var ba = m(\"/ajax/notifications/mark_read.php\").getQualifiedURI().toString();\n        new h(ba, aa).send();\n    };\n    function w(aa) {\n        var ba = {\n        };\n        aa.forEach(function(ca, da) {\n            ba[((\"alert_ids[\" + da) + \"]\")] = ca;\n        });\n        return ba;\n    };\n    function x(aa, ba, ca, da) {\n        var ea = k.untokenizeIDs([aa,])[0];\n        new g(\"/ajax/notifications/negative_req.php\").setData({\n            notification_id: ea,\n            client_rendered: true,\n            request_type: ba\n        }).setHandler((ca || o)).setErrorHandler((da || o)).send();\n    };\n    function y(aa, ba, ca, da, ea) {\n        var fa = (ea ? s : r);\n        j.getAll(function(ga) {\n            var ha = Object.keys(ga).filter(function(ia) {\n                var ja = ga[ia];\n                return !!(((ja.application && ja.application.id) && (ja.application.id == ba)));\n            });\n            x(aa, fa, function(ia) {\n                ca(ia);\n                l.handleUpdate(p, {\n                    hiddenState: n(ha, !ea)\n                });\n            }, da);\n        });\n    };\n    var z = {\n        markNotificationsAsSeen: function(aa) {\n            l.handleUpdate(p, {\n                seenState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa), ca = w(ba);\n            ca.seen = true;\n            v(ca);\n            if (a.presenceNotifications) {\n                a.presenceNotifications.alertList.markSeen(ba);\n            };\n        },\n        markNotificationsAsRead: function(aa) {\n            l.handleUpdate(p, {\n                readState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa);\n            v(w(ba));\n            if (a.presenceNotifications) {\n                a.presenceNotifications.markRead(false, ba);\n            };\n        },\n        markNotificationAsHidden: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,])\n            });\n            x(aa, r, ba, ca);\n        },\n        markNotificationAsVisible: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, s, ba, ca);\n        },\n        markNotificationAsSpam: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, q, ba, ca);\n        },\n        markAppAsHidden: function(aa, ba, ca, da) {\n            var ea = false;\n            y(aa, ba, ca, da, ea);\n        },\n        markAppAsVisible: function(aa, ba, ca, da) {\n            var ea = true;\n            y(aa, ba, ca, da, ea);\n        },\n        markFirstReceiptYes: function(aa, ba, ca) {\n            x(aa, t, ba, ca);\n        },\n        markFirstReceiptNo: function(aa, ba, ca) {\n            x(aa, u, ba, ca);\n        }\n    };\n    e.exports = z;\n});\n__d(\"NotificationBeeperItemContents.react\", [\"Animation\",\"CloseButton.react\",\"ImageBlock.react\",\"NotificationURI\",\"NotificationUserActions\",\"React\",\"TextWithEntities.react\",\"Timestamp.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CloseButton.react\"), i = b(\"ImageBlock.react\"), j = b(\"NotificationURI\"), k = b(\"NotificationUserActions\"), l = b(\"React\"), m = b(\"TextWithEntities.react\"), n = b(\"Timestamp.react\"), o = b(\"cx\");\n    function p(r, s) {\n        return l.DOM.span({\n            className: \"fwb\"\n        }, r);\n    };\n    var q = l.createClass({\n        displayName: \"NotificationBeeperItemContents\",\n        _markAsRead: function() {\n            k.markNotificationsAsRead([this.props.beep.notificationID,]);\n            this.props.onHide();\n        },\n        _onClose: function() {\n            this._markAsRead();\n            this.props.onHide();\n        },\n        _doFlash: function() {\n            new g(this.refs.inner.getDOMNode()).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(200).go();\n        },\n        componentDidUpdate: function(r) {\n            if ((r.beep.beepID !== this.props.beep.beepID)) {\n                this._doFlash();\n            };\n        },\n        render: function() {\n            var r = this.props.beep, s = r.icon.uri, t = (r.link ? j.localize(r.link) : \"#\"), u = (r.photo && j.snowliftable(t));\n            return (l.DOM.div({\n                ref: \"inner\"\n            }, h({\n                className: \"-cx-PRIVATE-notificationBeeperItem__closebutton\",\n                onClick: this._onClose,\n                size: \"medium\"\n            }), l.DOM.a({\n                href: t,\n                ajaxify: (u ? t : null),\n                onClick: this._markAsRead,\n                rel: (u ? \"theater\" : null),\n                className: \"-cx-PRIVATE-notificationBeeperItem__anchor\"\n            }, i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblock\"\n            }, l.DOM.img({\n                src: r.actors[0].profile_picture.uri,\n                className: \"-cx-PRIVATE-notificationBeeperItem__photo\"\n            }), l.DOM.div({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblockcontent\"\n            }, m({\n                renderEmoticons: true,\n                renderEmoji: true,\n                interpolator: p,\n                ranges: r.text.ranges,\n                aggregatedranges: r.text.aggregated_ranges,\n                text: r.text.text\n            }), i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__metadata\"\n            }, l.DOM.img({\n                src: s\n            }), n({\n                time: r.timestamp.time,\n                text: r.timestamp.text,\n                verbose: r.timestamp.verbose\n            })))))));\n        }\n    });\n    e.exports = q;\n});\n__d(\"NotificationBeeperItem.react\", [\"Animation\",\"BrowserSupport\",\"NotificationBeeperItemContents.react\",\"React\",\"cx\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"BrowserSupport\"), i = b(\"NotificationBeeperItemContents.react\"), j = b(\"React\"), k = b(\"cx\"), l = b(\"setTimeoutAcrossTransitions\"), m = j.createClass({\n        displayName: \"NotificationBeeperItem\",\n        getInitialState: function() {\n            return {\n                fadedIn: false,\n                hidden: false\n            };\n        },\n        componentDidMount: function() {\n            var n;\n            if (h.hasCSSAnimations()) {\n                n = this.setState.bind(this, {\n                    fadedIn: true\n                });\n            }\n             else n = function() {\n                new g(this.refs.item.getDOMNode()).from(\"top\", \"-30px\").from(\"opacity\", \"0\").to(\"top\", \"0px\").to(\"opacity\", \"1\").duration(200).ondone(this.setState.bind(this, {\n                    fadedIn: true\n                })).go();\n            }.bind(this);\n        ;\n            l(n, 50);\n            this.props.onInserted(this.props.beep);\n        },\n        render: function() {\n            var n = this.props.beep, o = ((((\"-cx-PRIVATE-notificationBeeperItem__beeperitem\") + ((this.state.fadedIn ? (\" \" + \"-cx-PRIVATE-notificationBeeperItem__fadedin\") : \"\"))) + ((this.state.hidden ? (\" \" + \"-cx-PRIVATE-notificationBeeperItem__hiddenitem\") : \"\")))), p = (n.beepRenderer || i);\n            return (j.DOM.li({\n                className: o,\n                ref: \"item\",\n                \"data-gt\": n.tracking\n            }, p({\n                beep: n,\n                onHide: this.setState.bind(this, {\n                    hidden: true\n                })\n            })));\n        }\n    });\n    e.exports = m;\n});\n__d(\"NotificationSound\", [\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Sound\"), h = b(\"copyProperties\"), i = 5000;\n    g.init([\"audio/mpeg\",]);\n    function j(k) {\n        this._soundPath = k;\n        this._lastPlayed = 0;\n    };\n    h(j.prototype, {\n        play: function(k) {\n            if (!this._soundPath) {\n                return\n            };\n            var l = Date.now();\n            if ((((l - this._lastPlayed)) < i)) {\n                return\n            };\n            this._lastPlayed = l;\n            g.play(this._soundPath, k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"NotificationBeeper.react\", [\"Animation\",\"Arbiter\",\"ChannelConstants\",\"NotificationBeeperItem.react\",\"NotificationConstants\",\"NotificationImpressions\",\"NotificationPhotoThumbnail\",\"NotificationSound\",\"NotificationUpdates\",\"NotificationUserActions\",\"React\",\"Style\",\"cx\",\"isEmpty\",\"merge\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ChannelConstants\"), j = b(\"NotificationBeeperItem.react\"), k = b(\"NotificationConstants\"), l = b(\"NotificationImpressions\"), m = b(\"NotificationPhotoThumbnail\"), n = b(\"NotificationSound\"), o = b(\"NotificationUpdates\"), p = b(\"NotificationUserActions\"), q = b(\"React\"), r = b(\"Style\"), s = b(\"cx\"), t = b(\"isEmpty\"), u = b(\"merge\"), v = b(\"setTimeoutAcrossTransitions\"), w = b(\"shield\"), x = 5000, y = 2000, z = \"beeper\", aa = k.PayloadSourceType.LIVE_SEND, ba = k.PayloadSourceType.OTHER_APPLICATION, ca = q.createClass({\n        displayName: \"NotificationBeeper\",\n        getInitialState: function() {\n            return {\n                soundEnabled: this.props.soundEnabled,\n                hovering: false,\n                fading: false,\n                paused: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            };\n        },\n        componentWillMount: function() {\n            var ea = i.getArbiterType(\"notif_sound_pref_changed\"), fa = \"update-notifications\";\n            this.subscriptions = [o.subscribe(fa, function(ga, ha) {\n                if (((ha.payloadsource === aa) || (ha.payloadsource === ba))) {\n                    var ia = ha.nodes;\n                    if ((ia && ia.length)) {\n                        this._handleBeepChanges(da(ia));\n                    };\n                }\n            ;\n            }.bind(this)),h.subscribe(ea, function(ga, ha) {\n                this.setState({\n                    soundEnabled: ha.obj.enabled\n                });\n            }.bind(this)),];\n            h.inform(\"NotificationBeeper/mounted\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        componentWillUnmount: function() {\n            this.subscriptions.forEach(function(ea) {\n                ea.unsubscribe();\n            });\n            this.subscriptions = null;\n        },\n        _onMouseEnter: function() {\n            if (this.state.paused) {\n                return\n            };\n            (this._hideWait && clearTimeout(this._hideWait));\n            if (this.state.fading) {\n                this._animation.stop();\n                this._animation = null;\n                r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n            }\n        ;\n            var ea = Object.keys(this.state.renderedBeeps);\n            if (this.props.unseenVsUnread) {\n                p.markNotificationsAsSeen(ea);\n            }\n             else p.markNotificationsAsRead(ea);\n        ;\n            this.setState({\n                hovering: true,\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: u(this.state.renderedBeeps, this.state.pendingBeeps)\n            });\n        },\n        _onMouseLeave: function() {\n            if (this.state.paused) {\n                return\n            };\n            this._waitToHide(y);\n            this.setState({\n                hovering: false\n            });\n        },\n        _onInsertedItem: function(ea) {\n            if (!this.state.hovering) {\n                this._waitToHide();\n            };\n            if ((this.state.soundEnabled && ea.sound)) {\n                if (!this._notifSound) {\n                    this._notifSound = new n(this.props.soundPath);\n                };\n                this._notifSound.play(ea.beepID);\n            }\n        ;\n            if (this.props.shouldLogImpressions) {\n                l.log([ea.notificationID,], z);\n            };\n        },\n        _waitToHide: function(ea) {\n            (this._hideWait && clearTimeout(this._hideWait));\n            this._hideWait = v(w(this._hide, this), (ea || x));\n        },\n        _hide: function() {\n            (this._animation && this._animation.stop());\n            this._animation = new g(this.refs.container.getDOMNode()).from(\"opacity\", \"0.96\").to(\"opacity\", \"0\").duration(1500).ondone(this._finishHide).go();\n            this.setState({\n                fading: true\n            });\n        },\n        _finishHide: function() {\n            var ea = this.state.pendingBeeps;\n            this.setState({\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            });\n            v(this.setState.bind(this, {\n                renderedBeeps: ea\n            }));\n            r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n        },\n        _handleBeepChanges: function(ea) {\n            var fa = (this.state.fading ? this.state.pendingBeeps : this.state.renderedBeeps);\n            Object.keys(ea).reverse().forEach(function(ga) {\n                var ha = ea[ga], ia = ha.beepID, ja = (this.state.renderedBeeps[ga] || {\n                });\n                if ((ja.beepID != ia)) {\n                    delete fa[ga];\n                    fa[ga] = ha;\n                }\n            ;\n            }.bind(this));\n            if (!this.state.paused) {\n                this._waitToHide();\n            };\n            this.forceUpdate();\n        },\n        _togglePause: function() {\n            if (!this.state.paused) {\n                (this._animation && this._animation.stop());\n                (this._hideWait && clearTimeout(this._hideWait));\n            }\n             else this._waitToHide();\n        ;\n            this.setState({\n                paused: !this.state.paused\n            });\n        },\n        render: function() {\n            var ea = this.state.renderedBeeps, fa = {\n            };\n            Object.keys(ea).reverse().forEach(function(ja) {\n                var ka = ea[ja];\n                fa[ja] = j({\n                    beep: ka,\n                    onInserted: this._onInsertedItem\n                });\n            }, this);\n            var ga = !t(fa), ha = null;\n            if ((ga && this.props.canPause)) {\n                ha = q.DOM.li({\n                    className: \"-cx-PRIVATE-notificationBeeper__pause\",\n                    onClick: this._togglePause\n                }, (this.state.paused ? \"Continue\" : \"Pause [fb]\"));\n            };\n            var ia = ((((!ga ? \"hidden_elem\" : \"\")) + ((\" \" + \"-cx-PUBLIC-notificationBeeper__list\"))));\n            return (q.DOM.ul({\n                ref: \"container\",\n                className: ia,\n                \"data-gt\": this.props.tracking,\n                onMouseEnter: this._onMouseEnter,\n                onMouseLeave: this._onMouseLeave\n            }, fa, ha));\n        }\n    });\n    function da(ea) {\n        var fa = {\n        };\n        ea.forEach(function(ga) {\n            var ha = ga.alert_id, ia = ((ha + \"-\") + ga.receivedTime), ja = m.getThumbnail(ga.attachments, ga.attached_story);\n            fa[ha] = {\n                notificationID: ha,\n                beepID: ia,\n                beepRenderer: ga.beepRenderer,\n                actors: ga.actors,\n                icon: ga.icon,\n                link: ga.url,\n                photo: ja,\n                text: (ga.unaggregatedTitle || ga.title),\n                timestamp: ga.timestamp,\n                receivedTime: ga.receivedTime,\n                sound: !!ga.sound,\n                tracking: ga.tracking\n            };\n        });\n        return fa;\n    };\n    e.exports = ca;\n});\n__d(\"FbdEventLog\", [\"URI\",\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"AsyncSignal\"), i = {\n        log: function(j, k, l, m) {\n            if (!j) {\n                return\n            };\n            var n = g(\"/desktop/eventlog.php\"), o = new h(n.toString(), {\n                event: j,\n                category: (k || \"unknown\"),\n                payload: (l || \"\")\n            });\n            o.setHandler(m).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"DownloadDialog\", [\"Event\",\"Arbiter\",\"Class\",\"DataStore\",\"ModalMask\",\"Overlay\",\"Parent\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DataStore\"), k = b(\"ModalMask\"), l = b(\"Overlay\"), m = b(\"Parent\"), n = b(\"Style\"), o = b(\"copyProperties\"), p = b(\"emptyFunction\");\n    function q() {\n        this.parent.construct(this);\n        return this;\n    };\n    i.extend(q, l);\n    o(q, {\n        POSITIONS: {\n            BOTTOM_LEFT: \"bottom_left\",\n            TOP_LEFT: \"top_left\",\n            IE9_BOTTOM: \"ie9_bottom\"\n        },\n        activeDialogs: {\n        },\n        dismissAll: function() {\n            for (var r in this.POSITIONS) {\n                this.hideDialog(this.POSITIONS[r]);;\n            };\n        },\n        hideDialog: function(r) {\n            var s = this.activeDialogs[r];\n            (s && s.hide());\n            this.activeDialogs[r] = null;\n        }\n    });\n    o(q.prototype, {\n        _cancelHandler: p,\n        _closeHandler: p,\n        _width: null,\n        position: q.POSITIONS.BOTTOM_LEFT,\n        init: function(r, s) {\n            this.parent.init(r);\n            this.position = s;\n            var t = ((j.get(this._root, \"modal\") === \"true\"));\n            q.hideDialog(s);\n            q.activeDialogs[s] = this;\n            g.listen(this._root, \"click\", function(event) {\n                if (m.byClass(event.getTarget(), \"closeButton\")) {\n                    if ((this._cancelHandler() !== false)) {\n                        q.hideDialog(this.position);\n                    }\n                };\n            }.bind(this));\n            this.subscribe(\"show\", function() {\n                if (t) {\n                    k.show();\n                };\n                h.inform(\"layer_shown\", {\n                    type: \"DownloadDialog\"\n                });\n            }.bind(this));\n            this.subscribe(\"hide\", function() {\n                if (t) {\n                    k.hide();\n                };\n                h.inform(\"layer_hidden\", {\n                    type: \"DownloadDialog\"\n                });\n                this._closeHandler();\n            }.bind(this));\n        },\n        setWidth: function(r) {\n            this._width = Math.floor(r);\n            return this;\n        },\n        updatePosition: function() {\n            if (this._width) {\n                n.set(this._overlay, \"width\", (this._width + \"px\"));\n            };\n            return true;\n        },\n        setCancelHandler: function(r) {\n            this._cancelHandler = (r || p);\n            return this;\n        },\n        setCloseHandler: function(r) {\n            this._closeHandler = (r || p);\n            return this;\n        }\n    });\n    e.exports = q;\n    a.DownloadDialog = q;\n});\n__d(\"FbdConversionTracking\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\"), i = {\n        logClick: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            };\n            new g().setURI(\"/ajax/desktop/log_clicks.php\").setData({\n                click_source: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        },\n        logConversion: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            };\n            new g().setURI(\"/ajax/desktop/log_conversions.php\").setData({\n                conversion_action: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"MegaphoneHelper\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"DOM\",\"DOMDimensions\",\"Dialog\",\"LitestandMessages\",\"Parent\",\"Run\",\"Style\",\"csx\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Dialog\"), n = b(\"LitestandMessages\"), o = b(\"Parent\"), p = b(\"Run\"), q = b(\"Style\"), r = b(\"csx\"), s = b(\"cx\"), t = b(\"ge\");\n    function u() {\n        var w = k.scry(document.body, \".megaphone_story_wrapper\")[0];\n        (w && k.remove(w));\n        v.removeLitestandHomeWash();\n    };\n    var v = {\n        hideStory: function(w, x, y, z, aa) {\n            var ba = {\n                mp_id: w,\n                location: x,\n                context: z\n            };\n            new j().setURI(\"/ajax/megaphone/megaphone_hide.php\").setMethod(\"POST\").setData(ba).setHandler(function(da) {\n                (aa && aa(da));\n            }).send();\n            var ca = t(y);\n            if (ca) {\n                new h(ca).to(\"height\", 0).duration(500).hide().go();\n            };\n        },\n        createModalStory: function(w, x, y, z) {\n            var aa;\n            if ((!w.buttons || !w.buttons.length)) {\n                w.buttons = m.CLOSE;\n                aa = v.hideStory(x, y, z, null);\n            }\n        ;\n            var ba = new m(w);\n            if (aa) {\n                ba.setHandler(aa);\n            };\n            ba.show();\n        },\n        buttonOnClick: function(w, x, y, z, aa, ba) {\n            var ca = function() {\n                if (aa) {\n                    new j().setURI(z).send();\n                }\n                 else document.location.href = z;\n            ;\n            };\n            if (ba) {\n                v.hideStory(w, x, \"\", y, ca);\n            }\n             else ca();\n        ;\n        },\n        renderFullWidth: function(w, x, y) {\n            var z = t(w);\n            k.prependContent(z, x);\n            if (y) {\n                var aa = l.getElementDimensions(x), ba = g.div({\n                    className: \"-cx-PRIVATE-litestandMegaphone__whitewash\"\n                });\n                q.set(ba, \"height\", (aa.height + \"px\"));\n                var ca = o.byClass(z, \"-cx-PUBLIC-litestandContent__root\");\n                k.prependContent(ca, ba);\n                p.onLeave(u);\n                i.subscribeOnce(n.FILTER_SWITCH_BEGIN, u);\n            }\n        ;\n            i.inform(\"Megaphone/show\", w, i.BEHAVIOR_PERSISTENT);\n        },\n        removeLitestandHomeWash: function() {\n            var w = k.find(document.body, \".-cx-PRIVATE-litestandMegaphone__whitewash\");\n            k.remove(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"FbdInstall\", [\"$\",\"AsyncRequest\",\"CSS\",\"DOM\",\"DownloadDialog\",\"FbdConversionTracking\",\"FbdEventLog\",\"FBDesktopDetect\",\"FBDesktopPlugin\",\"MegaphoneHelper\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DownloadDialog\"), l = b(\"FbdConversionTracking\"), m = b(\"FbdEventLog\"), n = b(\"FBDesktopDetect\"), o = b(\"FBDesktopPlugin\"), p = b(\"MegaphoneHelper\"), q = 1000, r = (300 * q), s = {\n        cancelSetup: function() {\n            var t = JSON.stringify({\n                ref: this.ref\n            });\n            m.log(\"download_canceled\", \"setup\", t);\n            l.logConversion(\"download_canceled\");\n        },\n        hideMegaphone: function() {\n            if ((this.megaphoneId && this.megaphoneLoc)) {\n                p.hideStory(this.megaphoneId, this.megaphoneLoc, this.elementId, \"\", null);\n            };\n        },\n        init: function(t, u) {\n            this.downloadUrl = t;\n            this.ref = (u || \"unknown\");\n        },\n        initInstallWait: function(t, u, v) {\n            this.megaphoneId = t;\n            this.megaphoneLoc = u;\n            this.elementId = v;\n            this._waitForInstall(r);\n        },\n        promptDownload: function(t) {\n            t = (t || this.downloadUrl);\n            if (t) {\n                var u = JSON.stringify({\n                    ref: this.ref\n                });\n                m.log(\"download_prompted\", \"setup\", u);\n                l.logConversion(\"download_prompted\");\n                var v = j.create(\"iframe\", {\n                    src: t,\n                    className: \"hidden_elem\"\n                });\n                j.appendContent(document.body, v);\n            }\n        ;\n        },\n        _responseHandler: function(t) {\n            if (t.payload) {\n                this._authToken = t.payload.access_token;\n                this._userId = t.payload.id;\n            }\n        ;\n            if ((this._authToken && this._userId)) {\n                this._waitForRunningStart = Date.now();\n                setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        },\n        setupPlugin: function() {\n            new h(\"/ajax/desktop/download\").send();\n            this.promptDownload();\n        },\n        updateSidebarLinkVisibility: function() {\n            if (!n.isPluginInstalled()) {\n                i.show(g(\"sidebar-messenger-install-link\"));\n                i.show(g(\"sidebar-messenger-install-separator\"));\n            }\n        ;\n        },\n        _waitForInstall: function(t) {\n            var u = JSON.stringify({\n                ref: this.ref\n            });\n            if (n.isPluginInstalled()) {\n                m.log(\"install_success\", \"setup\", u);\n                l.logConversion(\"install_success\");\n                o.recheck();\n                new h(\"/desktop/fbdesktop2/transfer.php\").setMethod(\"POST\").setHandler(this._responseHandler.bind(this)).send();\n                k.dismissAll();\n                this.hideMegaphone();\n                return;\n            }\n        ;\n            if ((t <= 0)) {\n                m.log(\"install_timeout\", \"setup\", u);\n                l.logConversion(\"install_timeout\");\n                k.dismissAll();\n            }\n             else setTimeout(this._waitForInstall.bind(this, (t - q)), q);\n        ;\n        },\n        _waitForRunning: function() {\n            var t = (Date.now() - this._waitForRunningStart);\n            if (o.isAppRunning()) {\n                o.transferAuthToken(this._authToken, this._userId);\n            }\n             else if ((t < r)) {\n                setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:fbdesktop2-install-js\", [\"FbdInstall\",], function(a, b, c, d) {\n    a.FbdInstall = b(\"FbdInstall\");\n}, 3);\n__d(\"legacy:fbdesktop-conversion-tracking\", [\"FbdConversionTracking\",], function(a, b, c, d) {\n    a.FbdConversionTracking = b(\"FbdConversionTracking\");\n}, 3);\n__d(\"SidebarTicker\", [\"Arbiter\",\"ChatSidebar\",\"CSS\",\"DOM\",\"Run\",\"TickerController\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatSidebar\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Run\"), l = b(\"TickerController\"), m = b(\"$\"), n = b(\"copyProperties\");\n    function o() {\n        this._ticker = m(\"pagelet_ticker\");\n        this._initSubscriptions();\n        if (i.hasClass(document.documentElement, \"sidebarMode\")) {\n            this._onSidebarShow();\n        };\n    };\n    o.hide = function() {\n        k.onAfterLoad(function() {\n            j.remove(m(\"pagelet_ticker\"));\n            j.remove(j.find(document.body, \"div.fbSidebarGripper\"));\n            h.resize();\n        });\n    };\n    n(o.prototype, {\n        _initSubscriptions: function() {\n            this._subscriptions = [g.subscribe(\"sidebar/show\", this._onSidebarShow.bind(this)),];\n        },\n        _onSidebarShow: function() {\n            l.show(this._ticker);\n        }\n    });\n    e.exports = o;\n});\n__d(\"SidebarTickerResizer\", [\"Arbiter\",\"AsyncRequest\",\"ChatSidebar\",\"SimpleDrag\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"ChatSidebar\"), j = b(\"SimpleDrag\"), k = b(\"$\"), l = 1e-7;\n    function m(n) {\n        var o = k(\"pagelet_ticker\"), p = o.parentNode, q = this._saveResizedState.bind(this), r, s, t, u = function(x, event) {\n            r = event.clientY;\n            s = o.offsetHeight;\n            t = p.offsetHeight;\n        }, v = function(x, event) {\n            var y = (s + ((event.clientY - r))), z = (100 - ((((((t - y)) / t)) * 100)));\n            z = Math.max(l, Math.min(90, z));\n            o.style.height = (z + \"%\");\n            if ((x == \"end\")) {\n                q(z);\n                g.inform(\"Ticker/resized\");\n            }\n        ;\n            i.resize();\n        }, w = new j(n);\n        w.subscribe(\"start\", u);\n        w.subscribe([\"update\",\"end\",], v);\n    };\n    m.prototype._saveResizedState = function(n) {\n        new h(\"/ajax/feed/ticker/resize\").setData({\n            height: (\"\" + n)\n        }).setMethod(\"POST\").send();\n    };\n    e.exports = m;\n});\n__d(\"legacy:megaphone\", [\"MegaphoneHelper\",], function(a, b, c, d) {\n    a.MegaphoneHelper = b(\"MegaphoneHelper\");\n}, 3);\n__d(\"NotificationXOut\", [\"Arbiter\",\"Event\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"userAction\");\n    function j(p, q, r) {\n        g.inform(\"notif/negativeCancel\", {\n            id: p\n        });\n        k(q, r);\n        h.$E(r).kill();\n    };\n    function k(p, q) {\n        i(\"click\", null, q, null, {\n            gt: p\n        });\n    };\n    function l(p, q) {\n        k(p, q);\n        h.$E(q).prevent();\n    };\n    function m(p, q) {\n        h.listen(p, \"click\", k.curry(q));\n    };\n    function n(p, q, r) {\n        h.listen(p, \"click\", j.curry(q, r));\n    };\n    function o(p, q) {\n        h.listen(p, \"click\", l.curry(q));\n    };\n    e.exports = {\n        setupConfirmListener: m,\n        setupCancelListener: n,\n        setupNoListener: o\n    };\n});\n__d(\"LiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\"), k = b(\"shield\");\n    function l(m) {\n        this.eventName = m;\n        this.subs = null;\n        this.handler = j;\n        this.shutdownHandler = null;\n        this.registered = false;\n        this.appId = 1;\n    };\n    i(l, {\n        getAppMessageType: function(m, n) {\n            return (((\"live_message/\" + m) + \":\") + n);\n        },\n        route: function(m) {\n            var n = function(o) {\n                var p = l.getAppMessageType(m.app_id, m.event_name);\n                g.inform(p, o, g.BEHAVIOR_PERSISTENT);\n            };\n            n(m.response);\n        }\n    });\n    i(l.prototype, {\n        setAppId: function(m) {\n            this.appId = m;\n            return this;\n        },\n        setHandler: function(m) {\n            this.handler = m;\n            this._dirty();\n            return this;\n        },\n        setRestartHandler: j,\n        setShutdownHandler: function(m) {\n            this.shutdownHandler = k(m);\n            this._dirty();\n            return this;\n        },\n        _dirty: function() {\n            if (this.registered) {\n                this.unregister();\n                this.register();\n            }\n        ;\n        },\n        register: function() {\n            var m = function(o, p) {\n                return this.handler(p);\n            }.bind(this), n = l.getAppMessageType(this.appId, this.eventName);\n            this.subs = {\n            };\n            this.subs.main = g.subscribe(n, m);\n            if (this.shutdownHandler) {\n                this.subs.shut = g.subscribe(h.ON_SHUTDOWN, this.shutdownHandler);\n            };\n            this.registered = true;\n            return this;\n        },\n        unregister: function() {\n            if (!this.subs) {\n                return this\n            };\n            for (var m in this.subs) {\n                if (this.subs[m]) {\n                    this.subs[m].unsubscribe();\n                };\n            };\n            this.subs = null;\n            this.registered = false;\n            return this;\n        }\n    });\n    e.exports = l;\n});\n__d(\"initLiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"LiveMessageReceiver\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveMessageReceiver\");\n    g.subscribe(h.getArbiterType(\"app_msg\"), function(j, k) {\n        i.route(k.obj);\n    });\n});\n__d(\"Slideshow\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"Event\",\"Locale\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"Locale\"), l = b(\"Parent\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"shield\");\n    function q(r, s) {\n        this._root = r;\n        this._config = s;\n        this._currentIndex = 0;\n        this._animating = false;\n        this._autoplayTimer = null;\n        this._init();\n    };\n    m(q.prototype, g, {\n        getIndex: function() {\n            return this._currentIndex;\n        },\n        getNumItems: function() {\n            return this._items.length;\n        },\n        page: function(r) {\n            if ((typeof r === \"undefined\")) {\n                r = \"next\";\n            };\n            if ((r === \"next\")) {\n                if ((this._config.wrap || (this.getIndex() < (this.getNumItems() - 1)))) {\n                    this._animateTo((this._currentIndex + 1));\n                };\n            }\n             else if ((r === \"prev\")) {\n                if ((this._config.wrap || (this.getIndex() > 0))) {\n                    this._animateTo((this._currentIndex - 1));\n                }\n            }\n        ;\n        },\n        pageTo: function(r) {\n            this._animateTo(r, p(this._setCurrent, this, r));\n        },\n        insert: function(r, s) {\n            if ((r > this._currentIndex)) {\n                i.insertAfter(this._items[(r - 1)], s);\n            }\n             else {\n                i.insertBefore(this._items[r], s);\n                this._currentIndex++;\n            }\n        ;\n            this._items.splice(r, 0, s);\n            this._updateArrowState(this._currentIndex);\n            this.inform(\"items_updated\");\n        },\n        push: function(r) {\n            this.insert(this._items.length, r);\n        },\n        _init: function() {\n            this._container = i.find(this._root, \"ul.-cx-PRIVATE-uiSlideshow__container\");\n            this._items = i.scry(this._container, \"li.-cx-PRIVATE-uiSlideshow__item\");\n            if (this._config.arrows) {\n                j.listen(this._root, \"click\", this._clickListener.bind(this));\n                var r = i.find(this._root, \"a.-cx-PRIVATE-uiSlideshow__next\"), s = i.find(this._root, \"a.-cx-PRIVATE-uiSlideshow__prev\");\n                this._arrowLeft = (k.isRTL() ? r : s);\n                this._arrowRight = (k.isRTL() ? s : r);\n            }\n        ;\n            if (this._config.autoplay) {\n                j.listen(this._root, \"mouseenter\", this.stopAutoplay.bind(this));\n                j.listen(this._root, \"mouseleave\", this.resetAutoplay.bind(this));\n                this.resetAutoplay();\n            }\n        ;\n            this.subscribe([\"page_start\",\"page_end\",], function(t, u) {\n                h.conditionClass(this._root, \"-cx-PUBLIC-uiSlideshow__animating\", (t === \"page_start\"));\n            }.bind(this));\n        },\n        _clickListener: function(event) {\n            var r = event.getTarget(), s = l.byTag(r, \"a\");\n            if ((s && !h.hasClass(s, \"-cx-PUBLIC-uiSlideshow__disabled\"))) {\n                if (h.hasClass(s, \"-cx-PRIVATE-uiSlideshow__next\")) {\n                    this.page(\"next\");\n                }\n                 else if (h.hasClass(s, \"-cx-PRIVATE-uiSlideshow__prev\")) {\n                    this.page(\"prev\");\n                }\n            \n            };\n        },\n        _updateArrowState: function(r) {\n            if (!this._config.arrows) {\n                return\n            };\n            h.conditionClass(this._arrowRight, \"-cx-PUBLIC-uiSlideshow__disabled\", (this._items.length === 1));\n            h.conditionClass(this._arrowLeft, \"-cx-PUBLIC-uiSlideshow__disabled\", (this._items.length === 1));\n        },\n        _animateTo: function(r) {\n        \n        },\n        _setCurrent: function(r) {\n            h.removeClass(this._items[this._currentIndex], \"-cx-PUBLIC-uiSlideshow__current\");\n            h.addClass(this._items[r], \"-cx-PUBLIC-uiSlideshow__current\");\n            h.removeClass(this._root, \"-cx-PUBLIC-uiSlideshow__animating\");\n            this._currentIndex = r;\n            this._animating = false;\n            this.inform(\"page_end\", r);\n        },\n        resetAutoplay: function() {\n            if (this._config.autoplay) {\n                clearTimeout(this._autoplayTimer);\n                this._autoplayTimer = setTimeout(this._autoplay.bind(this), this._config.autoplayTimeout);\n            }\n        ;\n        },\n        stopAutoplay: function() {\n            clearTimeout(this._autoplayTimer);\n            this._autoplayTimer = null;\n        },\n        _autoplay: function() {\n            this.resetAutoplay();\n            if ((this._items.length > 1)) {\n                this.page();\n            };\n        }\n    });\n    e.exports = q;\n});\n__d(\"Carousel\", [\"Animation\",\"Class\",\"CSS\",\"Ease\",\"Locale\",\"Slideshow\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"Ease\"), k = b(\"Locale\"), l = b(\"Slideshow\"), m = b(\"Style\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"shield\"), q = (k.isRTL() ? \"right\" : \"left\"), r = j.sineInOut;\n    function s(t, u) {\n        this.parent.construct(this, t, u);\n        this.subscribe(\"items_updated\", this._updateItemState.bind(this));\n    };\n    h.extend(s, l);\n    n(s.prototype, {\n        _updateItemState: function(t, u) {\n            this._setContainerPos(t);\n            m.set(this._container, \"width\", (((this._items.length * this._config.width)) + \"px\"));\n        },\n        _updateArrowState: function(t) {\n            if (!this._config.arrows) {\n                return\n            };\n            var u = this._config.wrap, v = this._items.length, w = Math.floor((v / this._config.photosperframe));\n            i.conditionClass(this._arrowRight, \"-cx-PUBLIC-uiSlideshow__disabled\", ((w === 1) || ((!u && (t === (w - 1))))));\n            i.conditionClass(this._arrowLeft, \"-cx-PUBLIC-uiSlideshow__disabled\", ((w === 1) || ((!u && (t === 0)))));\n        },\n        _animate: function(t, u) {\n            this._animating = true;\n            this.inform(\"page_start\", t);\n            new g(this._container).to(q, (-t * this._config.width)).duration(this._config.animationDuration).ease(r).ondone(u).go();\n        },\n        _setContainerPos: function(t) {\n            m.set(this._container, q, ((-t * this._config.width) + \"px\"));\n        },\n        _animateTo: function(t) {\n            if (this._animating) {\n                return\n            };\n            var u = this._items.length;\n            if (((((0 <= t) && (t < u))) || !this._config.wrap)) {\n                var v = (((t + u)) % u);\n                this._updateArrowState(v);\n                return this._animate(v, p(this._setCurrent, this, v));\n            }\n        ;\n            var w = (t % u), x = (w ? (u - 1) : 0), y = this._items[(u - 1)];\n            m.set(y, \"position\", \"absolute\");\n            m.set(y, q, (-this._config.width + \"px\"));\n            if ((x === 0)) {\n                this._setContainerPos(-1);\n            };\n            this._animate(w, function() {\n                m.set(y, \"position\", \"static\");\n                m.set(y, q, \"auto\");\n                this._setContainerPos(x);\n                this._setCurrent(x);\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});");
// 14044
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"sedba73fa8ed79e84359ef405d7a57caf24a0f008");
// 14045
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"H+v1W\",]);\n}\n;\n;\n__d(\"CanvasAppRequestUpdater\", [\"Arbiter\",\"CSS\",\"ChannelConstants\",\"DOM\",\"copyProperties\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"ChannelConstants\"), j = b(\"DOM\"), k = b(\"copyProperties\"), l = b(\"csx\");\n    function m(n) {\n        this._root = n;\n        g.subscribe(i.getArbiterType(\"app_request_create\"), function(o, p) {\n            var q = j.scry(this._root, ((\".item_\" + p.obj.appid)))[0], r = ((q && j.scry(q, \".-cx-PRIVATE-fbCanvasNavigation__requestslist\")[0]));\n            ((r && j.appendContent(r, p.obj.request)));\n            ((q && this._updateBookmark(q, 1)));\n        }.bind(this));\n        g.subscribe(i.getArbiterType(\"app_request_delete\"), function(o, p) {\n            var q = j.scry(this._root, ((\".item_\" + p.obj.appid)))[0], r = ((q && j.scry(q, ((((\"[data-requestid='\" + p.obj.requestid)) + \"']\")))[0]));\n            ((r && j.remove(r.parentNode)));\n            ((q && this._updateBookmark(q, -1)));\n        }.bind(this));\n    };\n;\n    k(m.prototype, {\n        _updateBookmark: function(n, o) {\n            var p = j.JSBNG__find(n, \".-cx-PRIVATE-fbCanvasNavigation__flyout\"), q = j.JSBNG__find(n, \".countValue\"), r = parseInt(j.getText(q), 10), s = Math.max(0, ((r + o)));\n            j.setContent(q, s);\n            if (((s < 1))) {\n                h.hide(q.parentNode);\n                h.hide(p);\n            }\n             else {\n                h.show(q.parentNode);\n                h.show(p);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"CanvasFlyoutLoader\", [\"AsyncRequest\",\"JSBNG__Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/flyouts\",\n        init: function(k, l, m) {\n            this.root = k;\n            this.largeApps = l;\n            this.seeAllApps = m;\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.largeApps,\n                all_apps: this.seeAllApps\n            };\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"CanvasRecommendationFlyoutLoader\", [\"AsyncRequest\",\"JSBNG__Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/recommendation/flyouts\",\n        init: function(k, l, m, n) {\n            this.root = k;\n            this.apps = l;\n            this.editorialApps = m;\n            if (n) {\n                this.egoRedirectUrls = n;\n            }\n        ;\n        ;\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.apps\n            };\n            if (this.editorialApps) {\n                k.editorial_items = this.editorialApps;\n            }\n        ;\n        ;\n            if (this.egoRedirectUrls) {\n                k.egoredirecturls = this.egoRedirectUrls;\n            }\n        ;\n        ;\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"BuddyListNub\", [\"JSXDOM\",\"JSBNG__Event\",\"Arbiter\",\"AvailableList\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"Class\",\"CSS\",\"Dock\",\"DOM\",\"HTML\",\"Keys\",\"NubController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"Toggler\",\"copyProperties\",\"csx\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\"), i = b(\"Arbiter\"), j = b(\"AvailableList\"), k = b(\"BlackbirdUpsell\"), l = b(\"ChannelConnection\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"Class\"), q = b(\"CSS\"), r = b(\"Dock\"), s = b(\"DOM\"), t = b(\"HTML\"), u = b(\"Keys\"), v = b(\"NubController\"), w = b(\"OrderedFriendsList\"), x = b(\"Parent\"), y = b(\"PresencePrivacy\"), z = b(\"Toggler\"), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"tx\"), ea = 32, fa = 10;\n    function ga(ha, ia, ja) {\n        this.parent.construct(this);\n        this.parent.init(ha);\n        this.root = ha;\n        this.orderedList = ia;\n        this.typeahead = ja;\n        this.button = s.JSBNG__find(ha, \"a.fbNubButton\");\n        this.unreadCount = s.JSBNG__find(ha, \"span.-cx-PRIVATE-fbDockChatBuddyListNub__unreadcount\");\n        this.label = s.JSBNG__find(ha, \"span.label\");\n        this.body = s.scry(ha, \"div.fbNubFlyoutBody\")[0];\n        this.container = x.byClass(ha, \"-cx-PUBLIC-fbDockChatBuddyListNub__container\");\n        var ka = s.JSBNG__find(ha, \"div.fbNubFlyoutTitlebar\");\n        z.createInstance(ka).setSticky(false);\n        ia.subscribe(\"render\", this.flyoutContentChanged.bind(this));\n        ia.setScrollContainer(this.body);\n        j.subscribe(\"buddylist/availability-changed\", this._updateCount.bind(this));\n        i.subscribe(\"chat/connect\", this._handleConnect.bind(this));\n        y.subscribe(\"privacy-user-presence-changed\", this._handleVisibilityChange.bind(this));\n        this.message = s.JSBNG__find(ha, \"div.-cx-PRIVATE-fbDockChatBuddyListNub__message\");\n        this.warningMsgText = null;\n        this.warningMsgEventListener = null;\n        this.showWarningTimeout = null;\n        l.subscribe(l.CONNECTED, this._handleChannelConnected.bind(this));\n        l.subscribe(l.SHUTDOWN, this._handleChannelShutdown.bind(this));\n        l.subscribe(l.RECONNECTING, this._handleChannelReconnecting.bind(this));\n        l.subscribe([l.MUTE_WARNING,l.UNMUTE_WARNING,], this._updateView.bind(this));\n        this.subscribe(\"show\", this.onShow.bind(this));\n        this.subscribe(\"hide\", this.onHide.bind(this));\n        this.subscribe(\"resize\", this.onResize.bind(this));\n        h.listen(ha, \"keydown\", this._onKeyDown.bind(this));\n        h.listen(this.button, \"click\", this.onButtonClick.bind(this));\n        ja.subscribe([\"respond\",\"reset\",], function(la, ma) {\n            if (this._isOpen) {\n                var na = this.orderedList.isVisible();\n                if (((((((ma && ma.value)) && ((ma.value === ja.getCore().getValue())))) && ja.getView().isVisible()))) {\n                    r.setUseMaxHeight(this.root, false);\n                    this.orderedList.hide();\n                }\n                 else this._showBuddyList();\n            ;\n            ;\n                if (((na !== this.orderedList.isVisible()))) {\n                    this.flyoutContentChanged();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n        i.subscribe(\"sidebar/show\", this.hide.bind(this));\n        if (n.get(\"litestand_buddylist_count\")) {\n            i.subscribe(\"buddylist-nub/updateCount\", function(la, ma) {\n                this._unreadMessageCount = ma.count;\n                this._updateView();\n            }.bind(this));\n        }\n    ;\n    ;\n        this._orderedListCount = w.getList().length;\n        i.inform(\"buddylist-nub/initialized\", this, i.BEHAVIOR_PERSISTENT);\n        this._handleVisibilityChange();\n    };\n;\n    p.extend(ga, v);\n    aa(ga.prototype, {\n        getButton: function() {\n            return this.button;\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        _handleConnect: function(ha) {\n            this._updateView(true);\n        },\n        _getShutdownReason: function(ha) {\n            switch (ha) {\n              case m.HINT_AUTH:\n                return \"Your session has timed out. Please log in.\";\n              case m.HINT_CONN:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n              case m.HINT_MAINT:\n                return da._(\"Facebook {Chat} is currently down for maintenance.\", {\n                    Chat: \"Chat\"\n                });\n              default:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n            };\n        ;\n        },\n        _getReconnectMsg: function(ha) {\n            var ia;\n            if (((ha === null))) {\n                ia = \"Unable to connect to chat. Check your Internet connection.\";\n            }\n             else if (((ha > n.get(\"warning_countdown_threshold_msec\")))) {\n                var ja = s.create(\"a\", {\n                    href: \"#\",\n                    className: \"fbChatReconnectLink\"\n                }, \"Try again\"), ka = s.create(\"div\", null, ja), la = ka.innerHTML;\n                ia = t(da._(\"Unable to connect to chat. {try-again-link}\", {\n                    \"try-again-link\": la\n                }));\n            }\n             else if (((ha > 1000))) {\n                ia = da._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                    seconds: Math.floor(((ha / 1000)))\n                });\n            }\n             else ia = \"Unable to connect to chat. Reconnecting...\";\n            \n            \n        ;\n        ;\n            return ia;\n        },\n        _resetShowWarningTimeout: function() {\n            if (this.showWarningTimeout) {\n                JSBNG__clearTimeout(this.showWarningTimeout);\n                this.showWarningTimeout = null;\n            }\n        ;\n        ;\n        },\n        _handleChannelConnected: function(ha) {\n            this._resetShowWarningTimeout();\n            if (this.orderedList.isVisible()) {\n                o.goOnline();\n            }\n        ;\n        ;\n            this.warningMsgText = null;\n            this._updateView();\n        },\n        _handleChannelShutdown: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getShutdownReason(ia);\n            this._updateView();\n        },\n        _handleChannelReconnecting: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getReconnectMsg(ia);\n            if (((ia > 1000))) {\n                if (((ia > n.get(\"warning_countdown_threshold_msec\")))) {\n                    if (this.warningMsgEventListener) {\n                        this.warningMsgEventListener.remove();\n                        this.warningMsgEventListener = null;\n                    }\n                ;\n                ;\n                    this.warningMsgEventListener = h.listen(this.message, \"click\", function(JSBNG__event) {\n                        if (q.hasClass(JSBNG__event.getTarget(), \"fbChatReconnectLink\")) {\n                            this._tryReconnect();\n                            JSBNG__event.kill();\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n            ;\n            ;\n                this.showWarningTimeout = JSBNG__setTimeout(this._handleChannelReconnecting.bind(this, ha, ((ia - 1000))), 1000, false);\n            }\n        ;\n        ;\n            this._updateView();\n        },\n        _tryReconnect: function() {\n            if (l.disconnected()) {\n                l.reconnect();\n            }\n        ;\n        ;\n        },\n        _handleVisibilityChange: function() {\n            this._updateView();\n            if (k.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    k.showBlackbirdDialog(this.getButton(), y.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    k.showOfflineDialog(this.getButton());\n                }\n                \n            ;\n            ;\n            }\n             else k.hide();\n        ;\n        ;\n            if (!o.isOnline()) {\n                this.hide();\n            }\n        ;\n        ;\n        },\n        _updateView: function(ha) {\n            var ia = this.container;\n            if (ia) {\n                q.conditionClass(ia, \"offline\", !o.isOnline());\n                q.conditionClass(ia, \"error\", l.disconnected());\n            }\n        ;\n        ;\n            if (l.disconnected()) {\n                s.setContent(this.message, this.warningMsgText);\n            }\n        ;\n        ;\n            var ja, ka;\n            if (!o.isOnline()) {\n                ja = da._(\"{Chat} (Off)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else if (l.disconnected()) {\n                ja = da._(\"{Chat} (Disconnected)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else {\n                var la = j.getOnlineCount();\n                if (la) {\n                    ja = da._(\"{Chat} {number-available}\", {\n                        Chat: \"Chat\",\n                        \"number-available\": g.span({\n                            className: \"count\"\n                        }, \" (\", g.strong(null, la), \") \")\n                    });\n                }\n                 else {\n                    ja = \"Chat\";\n                    ka = true;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            this._setUnread(this._unreadMessageCount);\n            this._setLabel(ja, ka);\n            this.buttonContentChanged();\n        },\n        onButtonClick: function() {\n            this._conditionallyShowTypeahead();\n            if (q.shown(this.typeahead.getElement())) {\n                var ha = this.subscribe(\"show\", function() {\n                    this.typeahead.getCore().getElement().JSBNG__focus();\n                    k.dismiss();\n                }.bind(this));\n                this.unsubscribe.bind(this, ha).defer();\n            }\n        ;\n        ;\n        },\n        onHide: function() {\n            this._isOpen = false;\n            if (this._buddyListRenderSubscription) {\n                this.orderedList.unsubscribe(this._buddyListRenderSubscription);\n                this._buddyListRenderSubscription = null;\n            }\n        ;\n        ;\n            this.orderedList.hide();\n            this.typeahead.getCore().reset();\n        },\n        _onKeyDown: function(JSBNG__event) {\n            var ha = h.getKeyCode(JSBNG__event);\n            if (((((ha === u.ESC)) && !q.hasClass(this.root, \"menuOpened\")))) {\n                this.hide();\n                return false;\n            }\n        ;\n        ;\n        },\n        onResize: function() {\n            var ha = ((r.getMaxFlyoutHeight(this.root) - 60)), ia = Math.max(250, ha);\n            this.orderedList.setNumTopFriends(Math.floor(((ia / ea))));\n        },\n        _showBuddyList: function() {\n            if (!this._buddyListRenderSubscription) {\n                this._buddyListRenderSubscription = this.orderedList.subscribe(\"render\", r.setUseMaxHeight.bind(r, this.root, false));\n            }\n        ;\n        ;\n            this.orderedList.show();\n        },\n        onShow: function() {\n            this._isOpen = true;\n            if (l.disconnected()) {\n                this._tryReconnect();\n                this._showBuddyList();\n            }\n             else o.goOnline(this._showBuddyList.bind(this));\n        ;\n        ;\n        },\n        _setLabel: function(ha, ia) {\n            var ja = this.label.cloneNode(true);\n            s.setContent(ja, ha);\n            s.replace(this.label, ja);\n            this.label = ja;\n            ((this.throbber && q.conditionShow(this.throbber, !!ia)));\n        },\n        _setUnread: function(ha) {\n            q.conditionShow(this.unreadCount, !!ha);\n            if (ha) {\n                ha = g.span({\n                    className: \"-cx-PRIVATE-fbMercuryChatTab__nummessages -cx-PRIVATE-fbMercuryChatTab__numbluegrey\"\n                }, ha);\n                s.setContent(this.unreadCount, ha);\n            }\n        ;\n        ;\n        },\n        _conditionallyShowTypeahead: function() {\n            q.conditionShow(this.typeahead.getElement(), ((this._orderedListCount >= fa)));\n        },\n        _updateCount: function() {\n            this._updateView();\n            this._conditionallyShowTypeahead();\n        }\n    });\n    e.exports = ga;\n});\n__d(\"LiveBarData\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"ChannelConstants\",\"LayerDestroyOnHide\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"LayerDestroyOnHide\"), l = b(\"copyProperties\"), m = b(\"setTimeoutAcrossTransitions\"), n = false, o = {\n    }, p = {\n    }, q = {\n    };\n    function r(y) {\n        if (((((((y.expires * 1000)) - JSBNG__Date.now())) > 0))) {\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function s(y) {\n        var z = y.payload.actions;\n        if (!((z && z.length))) {\n            return;\n        }\n    ;\n    ;\n        var aa;\n        for (var ba = 0; ((ba < z.length)); ba++) {\n            aa = z[ba].actor_id;\n            if (((!o[aa] || ((z[ba].action_id != o[aa].action_id))))) {\n                continue;\n            }\n        ;\n        ;\n            if (((z[ba].delete_action || z[ba].remove))) {\n                v(z[ba]);\n                continue;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function t(y) {\n        var z = false;\n        for (var aa = 0; ((aa < y.length)); aa++) {\n            if (((y[aa].delete_action || y[aa].remove))) {\n                v(y[aa]);\n                continue;\n            }\n        ;\n        ;\n            var ba = y[aa].actor_id, ca = y[aa].action_id;\n            if (o[ba]) {\n                if (((o[ba].action_id == ca))) {\n                    continue;\n                }\n            ;\n            ;\n                v(o[ba]);\n            }\n        ;\n        ;\n            z = true;\n            o[ba] = y[aa];\n            u(y[aa]);\n        };\n    ;\n        if (z) {\n            x.inform(\"new-actions\");\n        }\n    ;\n    ;\n    };\n;\n    function u(y) {\n        var z = ((((y.expires * 1000)) - JSBNG__Date.now()));\n        p[y.actor_id] = m(v.curry(y), Math.max(0, z));\n    };\n;\n    function v(y) {\n        if (!o[y.actor_id]) {\n            return;\n        }\n    ;\n    ;\n        if (((o[y.actor_id].action_id != y.action_id))) {\n            return;\n        }\n    ;\n    ;\n        delete o[y.actor_id];\n        var z = y.actor_id;\n        if (p[z]) {\n            JSBNG__clearTimeout(p[z]);\n            delete p[z];\n        }\n    ;\n    ;\n        w(z);\n        x.inform(\"remove-action\", y);\n    };\n;\n    function w(y) {\n        var z = q[y];\n        if (z) {\n            z.enableBehavior(k);\n            if (!z.isShown()) {\n                z.destroy();\n            }\n        ;\n        ;\n            delete q[y];\n        }\n    ;\n    ;\n    };\n;\n    g.subscribe(j.getArbiterType(\"livebar_update\"), function(y, z) {\n        t(z.obj.actions);\n    });\n    var x = {\n    };\n    l(x, h, {\n        fetch: function() {\n            if (n) {\n                return;\n            }\n        ;\n        ;\n            var y = [];\n            {\n                var fin284keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin284i = (0);\n                var z;\n                for (; (fin284i < fin284keys.length); (fin284i++)) {\n                    ((z) = (fin284keys[fin284i]));\n                    {\n                        var aa = o[z];\n                        if (aa.suppress_callout) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (!q[aa.actor_id]) {\n                            y.push(o[z]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((y.length > 0))) {\n                n = true;\n                new i().setURI(\"/ajax/chat/livebar.php\").setData({\n                    actions: y\n                }).setHandler(s).setFinallyHandler(function() {\n                    n = false;\n                }).setAllowCrossPageTransition(true).send();\n            }\n        ;\n        ;\n        },\n        addActions: t,\n        getAction: function(y) {\n            var z = o[y];\n            if (((z && r(z)))) {\n                return z;\n            }\n        ;\n        ;\n            return null;\n        },\n        getDialog: function(y) {\n            var z = this.getAction(y);\n            if (((z && q[z.actor_id]))) {\n                return q[z.actor_id];\n            }\n        ;\n        ;\n            return null;\n        },\n        setDialog: function(y, z, aa) {\n            var ba = o[y];\n            if (((ba && ((ba.action_id == z))))) {\n                w(y);\n                q[y] = aa;\n                x.inform(\"dialog-fetched\", y);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = x;\n});\n__d(\"LiveBar\", [\"ChatOrderedList\",\"function-extensions\",\"LegacyContextualDialog\",\"ChatConfig\",\"CSS\",\"LiveBarData\",\"copyProperties\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"function-extensions\");\n    b(\"LegacyContextualDialog\");\n    var g = b(\"ChatConfig\"), h = b(\"CSS\"), i = b(\"LiveBarData\"), j = b(\"copyProperties\"), k = b(\"setTimeoutAcrossTransitions\"), l = b(\"shield\"), m = ((g.get(\"livebar_fetch_defer\") || 1000));\n    function n(o, p, q) {\n        this._orderedList = o;\n        this._root = o.getRoot();\n        this._liveBarTypes = q;\n        this._hoverController = o.getHoverController();\n        this._hoverController.subscribe(\"hover\", this._mouseMove.bind(this));\n        this._hoverController.subscribe(\"leave\", this._mouseLeave.bind(this));\n        o.subscribe(\"render\", l(this._handleChatListUpdate, this));\n        i.subscribe(\"new-actions\", this._updateIcons.bind(this));\n        i.subscribe(\"remove-action\", this._handleRemoveAction.bind(this));\n        i.subscribe(\"dialog-fetched\", function(r, s) {\n            this._setDialogContent(s);\n        }.bind(this));\n        i.addActions(p);\n    };\n;\n    j(n, {\n        setDialog: function(o, p, q) {\n            i.setDialog(o, p, q);\n        }\n    });\n    j(n.prototype, {\n        _root: null,\n        _liveBarTypes: null,\n        _hoverController: null,\n        _registrations: {\n        },\n        _renderedIcons: {\n        },\n        _fetchTimer: null,\n        _mouseLeftRoot: false,\n        _chatListRendered: false,\n        _getLiveBarTypes: function() {\n            return this._liveBarTypes;\n        },\n        _handleChatListUpdate: function() {\n            if (!this._chatListRendered) {\n                this._chatListRendered = true;\n                this._updateIcons();\n            }\n        ;\n        ;\n        },\n        _handleShow: function(o) {\n            this._setDialogContent(o);\n        },\n        _mouseMove: function() {\n            if (!this._fetchTimer) {\n                this._fetchTimer = k(this._fetch.bind(this), m);\n                this._mouseLeftRoot = false;\n            }\n        ;\n        ;\n        },\n        _mouseLeave: function() {\n            this._mouseLeftRoot = true;\n            JSBNG__clearTimeout(this._fetchTimer);\n            this._fetchTimer = null;\n        },\n        _setDialogContent: function(o) {\n            var p = i.getDialog(o);\n            if (p) {\n                this._hoverController.showHovercard(o, p);\n            }\n        ;\n        ;\n        },\n        _fetch: function() {\n            if (this._mouseLeftRoot) {\n                return;\n            }\n        ;\n        ;\n            this._fetchTimer = null;\n            i.fetch();\n        },\n        _updateIcons: function() {\n            if (!this._chatListRendered) {\n                return;\n            }\n        ;\n        ;\n            var o = this._orderedList.getAllNodes(), p = this._getLiveBarTypes();\n            {\n                var fin285keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin285i = (0);\n                var q;\n                for (; (fin285i < fin285keys.length); (fin285i++)) {\n                    ((q) = (fin285keys[fin285i]));\n                    {\n                        var r = i.getAction(q);\n                        if (((r && ((!this._renderedIcons[q] || ((this._renderedIcons[q] != r.action_id))))))) {\n                            for (var s = 0; ((s < p.length)); s++) {\n                                h.removeClass(o[q], p[s]);\n                            ;\n                            };\n                        ;\n                            h.addClass(o[q], r.livebar_type);\n                            this._renderedIcons[q] = r.action_id;\n                            var t = this._hoverController.register(q, this._handleShow.bind(this));\n                            if (t) {\n                                this._registrations[q] = t;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _handleRemoveAction: function(o, p) {\n            var q = p.action_id, r = p.actor_id;\n            ((this._registrations[r] && this._registrations[r].unregister()));\n            delete this._registrations[r];\n            if (((this._renderedIcons[r] == q))) {\n                var s = this._getLiveBarTypes(), t = this._orderedList.getAllNodes();\n                if (t[r]) {\n                    for (var u = 0; ((u < s.length)); u++) {\n                        h.removeClass(t[r], s[u]);\n                    ;\n                    };\n                }\n            ;\n            ;\n                delete this._renderedIcons[r];\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"LiveBarDark\", [\"Class\",\"LiveBar\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LiveBar\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l, m, n) {\n        this.parent.construct(this, l, m, n);\n    };\n;\n    g.extend(k, h);\n    i(k.prototype, {\n        _setupDialogContent: j,\n        _show: j,\n        _updateIcons: j,\n        _handleRemoveAction: j,\n        _handleChatListUpdate: j\n    });\n    e.exports = k;\n});\n__d(\"ChatSidebarDropdown\", [\"Arbiter\",\"AsyncRequest\",\"Chat\",\"ChatOptions\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"PresenceState\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Chat\"), j = b(\"ChatOptions\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"JSBNG__Event\"), o = b(\"JSLogger\"), p = b(\"PresenceState\"), q = b(\"SelectorDeprecated\"), r = b(\"copyProperties\");\n    function s(t, u) {\n        this._root = t;\n        this._logger = o.create(\"blackbird\");\n        this._displayBrowserNotificationsIfNeeded();\n        q.listen(t, \"select\", this._onSelect.bind(this));\n        q.listen(t, \"toggle\", this._onToggle.bind(this));\n        if (u) {\n            q.listen(t, \"close\", u.allowCollapse.curry(true, \"SidebarMenu\"));\n            q.listen(t, \"open\", u.allowCollapse.curry(false, \"SidebarMenu\"));\n        }\n    ;\n    ;\n        g.subscribe(\"chat/option-changed\", this._onOptionChanged.bind(this));\n    };\n;\n    r(s, {\n        registerEditFavorites: function(t, u, v) {\n            function w(x) {\n                l.conditionShow(t, !x);\n                l.conditionShow(u, x);\n            };\n        ;\n            n.listen(t, \"click\", function() {\n                v.toggleEditMode();\n                w(true);\n            });\n            n.listen(u, \"click\", function() {\n                v.toggleEditMode();\n                w(false);\n            });\n            v.subscribe(\"editStart\", w.curry(true));\n            v.subscribe(\"editEnd\", w.curry(false));\n        }\n    });\n    r(s.prototype, {\n        changeSetting: function(t, u) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            this._pendingChange = true;\n            var v = {\n            };\n            v[t] = u;\n            j.setSetting(t, u, \"sidebar_menu\");\n            new h(\"/ajax/chat/settings.php\").setHandler(this._onChangeSettingResponse.bind(this, t, u)).setErrorHandler(this._onChangeSettingError.bind(this, t, u)).setFinallyHandler(this._onChangeFinally.bind(this)).setData(v).setAllowCrossPageTransition(true).send();\n        },\n        _displayBrowserNotificationsIfNeeded: function() {\n            if (window.JSBNG__webkitNotifications) {\n                m.scry(JSBNG__document, \"li.sidebar-browser-notif\").forEach(l.show);\n                if (((window.JSBNG__webkitNotifications.checkPermission() !== 0))) {\n                    m.scry(JSBNG__document, \"li.sidebar-browser-notif\").forEach(function(t) {\n                        l.removeClass(t, \"checked\");\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _conditionEnabled: function(t, u) {\n            var v = q.getOption(this._root, t);\n            ((v && q.setOptionEnabled(v, u)));\n        },\n        _onChangeSettingResponse: function(t, u, v) {\n            p.doSync();\n        },\n        _onChangeSettingError: function(t, u, v) {\n            j.setSetting(t, !u, \"sidebar_menu_error\");\n        },\n        _onChangeFinally: function() {\n            this._pendingChange = false;\n        },\n        _onOptionChanged: function(t, u) {\n            var v = u.JSBNG__name, w = u.value;\n            if (((((v === \"sound\")) || ((v === \"browser_notif\"))))) {\n                var x = q.getOption(this._root, v);\n                if (((w !== q.isOptionSelected(x)))) {\n                    q.setSelected(this._root, v, w);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _onSelect: function(t) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            var u = false, v = false, w = q.getOptionValue(t.option);\n            switch (w) {\n              case \"JSBNG__sidebar\":\n                return this.toggleSidebar();\n              case \"online\":\n                if (!k.isOnline()) {\n                    k.goOnline();\n                }\n                 else v = true;\n            ;\n            ;\n                u = true;\n                break;\n              case \"offline\":\n                if (k.isOnline()) {\n                    k.goOffline();\n                }\n                 else v = true;\n            ;\n            ;\n                u = true;\n                break;\n              case \"advanced_settings\":\n            \n              case \"turn_off_dialog\":\n                g.inform(\"chat/advanced-settings-dialog-opened\");\n                u = true;\n                break;\n            };\n        ;\n            if (v) {\n                this._logger.error(\"sidebar_dropdown_visibility_error\", {\n                    action: w\n                });\n            }\n             else this._logger.log(\"sidebar_dropdown_set_visibility\", {\n                action: w\n            });\n        ;\n        ;\n            if (u) {\n                q.toggle(this._root);\n                return false;\n            }\n        ;\n        ;\n        },\n        _onToggle: function(t) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            var u = q.getOptionValue(t.option), v = q.isOptionSelected(t.option);\n            switch (u) {\n              case \"visibility\":\n                if (!k) {\n                    this._jslogger.error(\"on_toggle_visibility_undefined\");\n                    return;\n                }\n            ;\n            ;\n                k.toggleVisibility();\n                this._logger.log(\"sidebar_dropdown_toggle_visibility\", {\n                    available: v\n                });\n                break;\n              case \"browser_notif\":\n                if (((((v && window.JSBNG__webkitNotifications)) && ((window.JSBNG__webkitNotifications.checkPermission() !== 0))))) {\n                    window.JSBNG__webkitNotifications.requestPermission(function() {\n                        this.changeSetting(u, v);\n                    }.bind(this));\n                }\n                 else this.changeSetting(u, v);\n            ;\n            ;\n                break;\n              case \"sound\":\n                this.changeSetting(u, v);\n                break;\n            };\n        ;\n            q.toggle(this._root);\n        },\n        _onVisibilityChanged: function() {\n            var t = k.isOnline(), u = q.getOption(this._root, \"visibility\");\n            if (((t !== q.isOptionSelected(u)))) {\n                q.setSelected(this._root, \"visibility\", t);\n            }\n        ;\n        ;\n        },\n        toggleSidebar: function() {\n            i.toggleSidebar();\n            q.toggle(this._root);\n            return false;\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatSidebarLog\", [\"AsyncSignal\",\"Bootloader\",\"ModuleDependencies\",\"JSLogger\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Bootloader\"), i = b(\"ModuleDependencies\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = j.create(\"chat_sidebar_load\"), m = null, n = false, o = ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(36);\n    k.onLoad(function() {\n        n = true;\n    });\n    try {\n        d([\"ChatSidebar\",], function(t) {\n            m = t;\n        });\n    } catch (p) {\n        l.warn(\"exception\", {\n            reason: p.toString()\n        });\n    };\n;\n    function q(t, u) {\n        if (((t.length > u))) {\n            return t[u];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function r(t) {\n        JSBNG__setTimeout(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sedba73fa8ed79e84359ef405d7a57caf24a0f008_91), function() {\n            var u = i.getMissing(\"ChatSidebar\"), v = h.getErrorUrls(), w = h.getLoadingUrls(), x = [];\n            {\n                var fin286keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin286i = (0);\n                var y;\n                for (; (fin286i < fin286keys.length); (fin286i++)) {\n                    ((y) = (fin286keys[fin286i]));\n                    {\n                        x.push({\n                            url: y,\n                            time: w[y]\n                        });\n                    ;\n                    };\n                };\n            };\n        ;\n            x.sort(function(aa, ba) {\n                return ((ba.time - aa.time));\n            });\n            var z = {\n                page_loaded: n,\n                page_id: o,\n                timeout: t,\n                missing_total: u.length,\n                module_1: q(u, 0),\n                module_2: q(u, 1),\n                module_3: q(u, 2),\n                error_url_total: v.length,\n                error_url_1: q(v, 0),\n                error_url_2: q(v, 1),\n                error_url_3: q(v, 2),\n                loading_url_total: x.length,\n                loading_url_1: ((q(x, 0) ? q(x, 0).url : null)),\n                loading_time_1: ((q(x, 0) ? q(x, 0).time : null)),\n                loading_url_2: ((q(x, 1) ? q(x, 1).url : null)),\n                loading_time_2: ((q(x, 1) ? q(x, 1).time : null)),\n                loading_url_3: ((q(x, 2) ? q(x, 2).url : null)),\n                loading_time_3: ((q(x, 2) ? q(x, 2).time : null))\n            };\n            if (!m) {\n                l.warn(((\"require_\" + t)), {\n                    missing: u\n                });\n                z.symptom = \"require\";\n            }\n        ;\n        ;\n            if (((m && !m.isInitialized()))) {\n                l.warn(((\"init_\" + t)), {\n                    missing: u\n                });\n                z.symptom = \"init\";\n            }\n        ;\n        ;\n            if (z.symptom) {\n                new g(\"/ajax/chat/sidebar_load.php\", z).send();\n            }\n        ;\n        ;\n        })), t);\n    };\n;\n    var s = {\n        start: function() {\n            r(5000);\n            r(10000);\n            r(15000);\n            r(30000);\n            r(60000);\n        }\n    };\n    e.exports = s;\n});\n__d(\"NotificationConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PayloadSourceType: {\n            UNKNOWN: 0,\n            USER_ACTION: 1,\n            LIVE_SEND: 2,\n            ENDPOINT: 3,\n            INITIAL_LOAD: 4,\n            OTHER_APPLICATION: 5\n        }\n    };\n});\n__d(\"NotificationTokens\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        tokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return ((((g.user + \":\")) + j));\n            });\n        },\n        untokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return j.split(\":\")[1];\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationImpressions\", [\"AsyncSignal\",\"NotificationTokens\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"NotificationTokens\"), i = b(\"URI\"), j = \"/ajax/notifications/impression.php\";\n    function k(l, m) {\n        var n = {\n            ref: m\n        };\n        h.untokenizeIDs(l).forEach(function(o, p) {\n            n[((((\"alert_ids[\" + p)) + \"]\"))] = o;\n        });\n        new g(i(j).getQualifiedURI().toString(), n).send();\n    };\n;\n    e.exports = {\n        log: k\n    };\n});\n__d(\"NotificationPhotoThumbnail\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((((i.style == \"photo\")) ? i.media.image : null));\n    };\n;\n    var h = {\n        getThumbnail: function(i, j) {\n            var k;\n            if (((i && i.length))) {\n                k = g(i[0]);\n                if (k) {\n                    return k;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (j) {\n                var l = j.attachments;\n                if (((l && l.length))) {\n                    return g(l[0]);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return null;\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationUpdates\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"NotificationConstants\",\"NotificationTokens\",\"LiveTimer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"NotificationConstants\"), k = b(\"NotificationTokens\"), l = b(\"LiveTimer\"), m = b(\"copyProperties\"), n = b(\"createObjectFrom\"), o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [], t = 0, u = i.create(\"notification_updates\");\n    function v() {\n        if (t) {\n            return;\n        }\n    ;\n    ;\n        var z = o, aa = p, ba = q, ca = r;\n        o = {\n        };\n        p = {\n        };\n        q = {\n        };\n        r = {\n        };\n        x(\"notifications-updated\", z);\n        if (Object.keys(aa).length) {\n            x(\"seen-state-updated\", aa);\n        }\n    ;\n    ;\n        if (Object.keys(ba).length) {\n            x(\"read-state-updated\", ba);\n        }\n    ;\n    ;\n        if (Object.keys(ca).length) {\n            x(\"hidden-state-updated\", ca);\n        }\n    ;\n    ;\n        s.pop();\n    };\n;\n    function w() {\n        if (s.length) {\n            return s[((s.length - 1))];\n        }\n    ;\n    ;\n        return j.PayloadSourceType.UNKNOWN;\n    };\n;\n    function x(JSBNG__event, z) {\n        y.inform(JSBNG__event, {\n            updates: z,\n            source: w()\n        });\n    };\n;\n    g.subscribe(h.getArbiterType(\"notification_json\"), function(z, aa) {\n        var ba = JSBNG__Date.now(), ca = aa.obj.nodes;\n        if (ca) {\n            ca.forEach(function(da) {\n                da.receivedTime = ba;\n            });\n            u.debug(\"notifications_received\", ca);\n            y.handleUpdate(j.PayloadSourceType.LIVE_SEND, aa.obj);\n        }\n    ;\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"notifications_seen\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            seenState: n(ba)\n        });\n    });\n    g.subscribe(h.getArbiterType(\"notifications_read\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            readState: n(ba)\n        });\n    });\n    var y = m(new g(), {\n        handleUpdate: function(z, aa) {\n            if (aa.servertime) {\n                l.restart(aa.servertime);\n            }\n        ;\n        ;\n            if (Object.keys(aa).length) {\n                this.synchronizeInforms(function() {\n                    s.push(z);\n                    var ba = m({\n                        payloadsource: w()\n                    }, aa);\n                    this.inform(\"update-notifications\", ba);\n                    this.inform(\"update-seen\", ba);\n                    this.inform(\"update-read\", ba);\n                    this.inform(\"update-hidden\", ba);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        didUpdateNotifications: function(z) {\n            m(o, n(z));\n            v();\n        },\n        didUpdateSeenState: function(z) {\n            m(p, n(z));\n            v();\n        },\n        didUpdateReadState: function(z) {\n            m(q, n(z));\n            v();\n        },\n        didUpdateHiddenState: function(z) {\n            m(r, n(z));\n            v();\n        },\n        synchronizeInforms: function(z) {\n            t++;\n            try {\n                z();\n            } catch (aa) {\n                throw aa;\n            } finally {\n                t--;\n                v();\n            };\n        ;\n        }\n    });\n    e.exports = y;\n});\n__d(\"NotificationStore\", [\"KeyedCallbackManager\",\"NotificationConstants\",\"NotificationUpdates\",\"RangedCallbackManager\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"NotificationConstants\"), i = b(\"NotificationUpdates\"), j = b(\"RangedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = new g(), m = new j(function(p) {\n        var q = l.getResource(p);\n        return q.creation_time;\n    }, function(p, q) {\n        return ((q - p));\n    }), n = {\n    };\n    i.subscribe(\"update-notifications\", function(p, q) {\n        if (q.page_info) {\n            n = q.page_info;\n        }\n    ;\n    ;\n        if (((q.nodes === undefined))) {\n            return;\n        }\n    ;\n    ;\n        var r, s = [], t = {\n        }, u = ((q.nodes || [])), v;\n        u.forEach(function(w) {\n            r = w.alert_id;\n            v = l.getResource(r);\n            if (((!v || ((v.creation_time < w.creation_time))))) {\n                s.push(r);\n                t[r] = w;\n            }\n        ;\n        ;\n        });\n        l.addResourcesAndExecute(t);\n        m.addResources(s);\n        i.didUpdateNotifications(s);\n    });\n    k.registerEndpoints({\n        \"/ajax/notifications/client/get.php\": {\n            mode: k.IMMEDIATE,\n            handler: function(p) {\n                i.handleUpdate(h.PayloadSourceType.ENDPOINT, p);\n            }\n        }\n    });\n    var o = {\n        getNotifications: function(p, q) {\n            var r = m.executeOrEnqueue(0, p, function(w) {\n                var x = l.executeOrEnqueue(w, function(y) {\n                    q(y);\n                });\n            }), s = m.getUnavailableResources(r);\n            if (s.length) {\n                m.unsubscribe(r);\n                if (!o.canFetchMore()) {\n                    l.executeOrEnqueue(m.getAllResources(), q);\n                    return;\n                }\n            ;\n            ;\n                var t = ((n.end_cursor || null)), u;\n                if (t) {\n                    var v = Math.max.apply(null, s);\n                    u = ((((v - m.getCurrentArraySize())) + 1));\n                }\n                 else u = p;\n            ;\n            ;\n                k.trySend(\"/ajax/notifications/client/get.php\", {\n                    cursor: t,\n                    length: u\n                });\n            }\n        ;\n        ;\n        },\n        getAll: function(p) {\n            o.getNotifications(o.getCount(), p);\n        },\n        getCount: function() {\n            return m.getCurrentArraySize();\n        },\n        canFetchMore: function() {\n            if (n.hasOwnProperty(\"has_next_page\")) {\n                return n.has_next_page;\n            }\n        ;\n        ;\n            return true;\n        }\n    };\n    e.exports = o;\n});\n__d(\"NotificationUserActions\", [\"AsyncRequest\",\"AsyncSignal\",\"NotificationConstants\",\"NotificationStore\",\"NotificationTokens\",\"NotificationUpdates\",\"URI\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AsyncSignal\"), i = b(\"NotificationConstants\"), j = b(\"NotificationStore\"), k = b(\"NotificationTokens\"), l = b(\"NotificationUpdates\"), m = b(\"URI\"), n = b(\"createObjectFrom\"), o = b(\"emptyFunction\"), p = i.PayloadSourceType.USER_ACTION, q = \"mark_spam\", r = \"turn_off\", s = \"undo\", t = \"first_receipt_yes\", u = \"first_receipt_no\";\n    function v(aa) {\n        var ba = m(\"/ajax/notifications/mark_read.php\").getQualifiedURI().toString();\n        new h(ba, aa).send();\n    };\n;\n    function w(aa) {\n        var ba = {\n        };\n        aa.forEach(function(ca, da) {\n            ba[((((\"alert_ids[\" + da)) + \"]\"))] = ca;\n        });\n        return ba;\n    };\n;\n    function x(aa, ba, ca, da) {\n        var ea = k.untokenizeIDs([aa,])[0];\n        new g(\"/ajax/notifications/negative_req.php\").setData({\n            notification_id: ea,\n            client_rendered: true,\n            request_type: ba\n        }).setHandler(((ca || o))).setErrorHandler(((da || o))).send();\n    };\n;\n    function y(aa, ba, ca, da, ea) {\n        var fa = ((ea ? s : r));\n        j.getAll(function(ga) {\n            var ha = Object.keys(ga).filter(function(ia) {\n                var ja = ga[ia];\n                return !!((((ja.application && ja.application.id)) && ((ja.application.id == ba))));\n            });\n            x(aa, fa, function(ia) {\n                ca(ia);\n                l.handleUpdate(p, {\n                    hiddenState: n(ha, !ea)\n                });\n            }, da);\n        });\n    };\n;\n    var z = {\n        markNotificationsAsSeen: function(aa) {\n            l.handleUpdate(p, {\n                seenState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa), ca = w(ba);\n            ca.seen = true;\n            v(ca);\n            if (a.presenceNotifications) {\n                a.presenceNotifications.alertList.markSeen(ba);\n            }\n        ;\n        ;\n        },\n        markNotificationsAsRead: function(aa) {\n            l.handleUpdate(p, {\n                readState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa);\n            v(w(ba));\n            if (a.presenceNotifications) {\n                a.presenceNotifications.markRead(false, ba);\n            }\n        ;\n        ;\n        },\n        markNotificationAsHidden: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,])\n            });\n            x(aa, r, ba, ca);\n        },\n        markNotificationAsVisible: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, s, ba, ca);\n        },\n        markNotificationAsSpam: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, q, ba, ca);\n        },\n        markAppAsHidden: function(aa, ba, ca, da) {\n            var ea = false;\n            y(aa, ba, ca, da, ea);\n        },\n        markAppAsVisible: function(aa, ba, ca, da) {\n            var ea = true;\n            y(aa, ba, ca, da, ea);\n        },\n        markFirstReceiptYes: function(aa, ba, ca) {\n            x(aa, t, ba, ca);\n        },\n        markFirstReceiptNo: function(aa, ba, ca) {\n            x(aa, u, ba, ca);\n        }\n    };\n    e.exports = z;\n});\n__d(\"NotificationBeeperItemContents.react\", [\"Animation\",\"CloseButton.react\",\"ImageBlock.react\",\"NotificationURI\",\"NotificationUserActions\",\"React\",\"TextWithEntities.react\",\"Timestamp.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CloseButton.react\"), i = b(\"ImageBlock.react\"), j = b(\"NotificationURI\"), k = b(\"NotificationUserActions\"), l = b(\"React\"), m = b(\"TextWithEntities.react\"), n = b(\"Timestamp.react\"), o = b(\"cx\");\n    function p(r, s) {\n        return l.DOM.span({\n            className: \"fwb\"\n        }, r);\n    };\n;\n    var q = l.createClass({\n        displayName: \"NotificationBeeperItemContents\",\n        _markAsRead: function() {\n            k.markNotificationsAsRead([this.props.beep.notificationID,]);\n            this.props.onHide();\n        },\n        _onClose: function() {\n            this._markAsRead();\n            this.props.onHide();\n        },\n        _doFlash: function() {\n            new g(this.refs.JSBNG__inner.getDOMNode()).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(200).go();\n        },\n        componentDidUpdate: function(r) {\n            if (((r.beep.beepID !== this.props.beep.beepID))) {\n                this._doFlash();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var r = this.props.beep, s = r.icon.uri, t = ((r.link ? j.localize(r.link) : \"#\")), u = ((r.photo && j.snowliftable(t)));\n            return (l.DOM.div({\n                ref: \"JSBNG__inner\"\n            }, h({\n                className: \"-cx-PRIVATE-notificationBeeperItem__closebutton\",\n                onClick: this._onClose,\n                size: \"medium\"\n            }), l.DOM.a({\n                href: t,\n                ajaxify: ((u ? t : null)),\n                onClick: this._markAsRead,\n                rel: ((u ? \"theater\" : null)),\n                className: \"-cx-PRIVATE-notificationBeeperItem__anchor\"\n            }, i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblock\"\n            }, l.DOM.img({\n                src: r.actors[0].profile_picture.uri,\n                className: \"-cx-PRIVATE-notificationBeeperItem__photo\"\n            }), l.DOM.div({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblockcontent\"\n            }, m({\n                renderEmoticons: true,\n                renderEmoji: true,\n                interpolator: p,\n                ranges: r.text.ranges,\n                aggregatedranges: r.text.aggregated_ranges,\n                text: r.text.text\n            }), i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__metadata\"\n            }, l.DOM.img({\n                src: s\n            }), n({\n                time: r.timestamp.time,\n                text: r.timestamp.text,\n                verbose: r.timestamp.verbose\n            })))))));\n        }\n    });\n    e.exports = q;\n});\n__d(\"NotificationBeeperItem.react\", [\"Animation\",\"BrowserSupport\",\"NotificationBeeperItemContents.react\",\"React\",\"cx\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"BrowserSupport\"), i = b(\"NotificationBeeperItemContents.react\"), j = b(\"React\"), k = b(\"cx\"), l = b(\"setTimeoutAcrossTransitions\"), m = j.createClass({\n        displayName: \"NotificationBeeperItem\",\n        getInitialState: function() {\n            return {\n                fadedIn: false,\n                hidden: false\n            };\n        },\n        componentDidMount: function() {\n            var n;\n            if (h.hasCSSAnimations()) {\n                n = this.setState.bind(this, {\n                    fadedIn: true\n                });\n            }\n             else n = function() {\n                new g(this.refs.item.getDOMNode()).from(\"JSBNG__top\", \"-30px\").from(\"opacity\", \"0\").to(\"JSBNG__top\", \"0px\").to(\"opacity\", \"1\").duration(200).ondone(this.setState.bind(this, {\n                    fadedIn: true\n                })).go();\n            }.bind(this);\n        ;\n        ;\n            l(n, 50);\n            this.props.onInserted(this.props.beep);\n        },\n        render: function() {\n            var n = this.props.beep, o = (((((\"-cx-PRIVATE-notificationBeeperItem__beeperitem\") + ((this.state.fadedIn ? ((\" \" + \"-cx-PRIVATE-notificationBeeperItem__fadedin\")) : \"\")))) + ((this.state.hidden ? ((\" \" + \"-cx-PRIVATE-notificationBeeperItem__hiddenitem\")) : \"\")))), p = ((n.beepRenderer || i));\n            return (j.DOM.li({\n                className: o,\n                ref: \"item\",\n                \"data-gt\": n.tracking\n            }, p({\n                beep: n,\n                onHide: this.setState.bind(this, {\n                    hidden: true\n                })\n            })));\n        }\n    });\n    e.exports = m;\n});\n__d(\"NotificationSound\", [\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Sound\"), h = b(\"copyProperties\"), i = 5000;\n    g.init([\"audio/mpeg\",]);\n    function j(k) {\n        this._soundPath = k;\n        this._lastPlayed = 0;\n    };\n;\n    h(j.prototype, {\n        play: function(k) {\n            if (!this._soundPath) {\n                return;\n            }\n        ;\n        ;\n            var l = JSBNG__Date.now();\n            if (((((l - this._lastPlayed)) < i))) {\n                return;\n            }\n        ;\n        ;\n            this._lastPlayed = l;\n            g.play(this._soundPath, k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"NotificationBeeper.react\", [\"Animation\",\"Arbiter\",\"ChannelConstants\",\"NotificationBeeperItem.react\",\"NotificationConstants\",\"NotificationImpressions\",\"NotificationPhotoThumbnail\",\"NotificationSound\",\"NotificationUpdates\",\"NotificationUserActions\",\"React\",\"Style\",\"cx\",\"isEmpty\",\"merge\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ChannelConstants\"), j = b(\"NotificationBeeperItem.react\"), k = b(\"NotificationConstants\"), l = b(\"NotificationImpressions\"), m = b(\"NotificationPhotoThumbnail\"), n = b(\"NotificationSound\"), o = b(\"NotificationUpdates\"), p = b(\"NotificationUserActions\"), q = b(\"React\"), r = b(\"Style\"), s = b(\"cx\"), t = b(\"isEmpty\"), u = b(\"merge\"), v = b(\"setTimeoutAcrossTransitions\"), w = b(\"shield\"), x = 5000, y = 2000, z = \"beeper\", aa = k.PayloadSourceType.LIVE_SEND, ba = k.PayloadSourceType.OTHER_APPLICATION, ca = q.createClass({\n        displayName: \"NotificationBeeper\",\n        getInitialState: function() {\n            return {\n                soundEnabled: this.props.soundEnabled,\n                hovering: false,\n                fading: false,\n                paused: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            };\n        },\n        componentWillMount: function() {\n            var ea = i.getArbiterType(\"notif_sound_pref_changed\"), fa = \"update-notifications\";\n            this.subscriptions = [o.subscribe(fa, function(ga, ha) {\n                if (((((ha.payloadsource === aa)) || ((ha.payloadsource === ba))))) {\n                    var ia = ha.nodes;\n                    if (((ia && ia.length))) {\n                        this._handleBeepChanges(da(ia));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this)),h.subscribe(ea, function(ga, ha) {\n                this.setState({\n                    soundEnabled: ha.obj.enabled\n                });\n            }.bind(this)),];\n            h.inform(\"NotificationBeeper/mounted\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        componentWillUnmount: function() {\n            this.subscriptions.forEach(function(ea) {\n                ea.unsubscribe();\n            });\n            this.subscriptions = null;\n        },\n        _onMouseEnter: function() {\n            if (this.state.paused) {\n                return;\n            }\n        ;\n        ;\n            ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            if (this.state.fading) {\n                this._animation.JSBNG__stop();\n                this._animation = null;\n                r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n            }\n        ;\n        ;\n            var ea = Object.keys(this.state.renderedBeeps);\n            if (this.props.unseenVsUnread) {\n                p.markNotificationsAsSeen(ea);\n            }\n             else p.markNotificationsAsRead(ea);\n        ;\n        ;\n            this.setState({\n                hovering: true,\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: u(this.state.renderedBeeps, this.state.pendingBeeps)\n            });\n        },\n        _onMouseLeave: function() {\n            if (this.state.paused) {\n                return;\n            }\n        ;\n        ;\n            this._waitToHide(y);\n            this.setState({\n                hovering: false\n            });\n        },\n        _onInsertedItem: function(ea) {\n            if (!this.state.hovering) {\n                this._waitToHide();\n            }\n        ;\n        ;\n            if (((this.state.soundEnabled && ea.sound))) {\n                if (!this._notifSound) {\n                    this._notifSound = new n(this.props.soundPath);\n                }\n            ;\n            ;\n                this._notifSound.play(ea.beepID);\n            }\n        ;\n        ;\n            if (this.props.shouldLogImpressions) {\n                l.log([ea.notificationID,], z);\n            }\n        ;\n        ;\n        },\n        _waitToHide: function(ea) {\n            ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            this._hideWait = v(w(this._hide, this), ((ea || x)));\n        },\n        _hide: function() {\n            ((this._animation && this._animation.JSBNG__stop()));\n            this._animation = new g(this.refs.container.getDOMNode()).from(\"opacity\", \"0.96\").to(\"opacity\", \"0\").duration(1500).ondone(this._finishHide).go();\n            this.setState({\n                fading: true\n            });\n        },\n        _finishHide: function() {\n            var ea = this.state.pendingBeeps;\n            this.setState({\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            });\n            v(this.setState.bind(this, {\n                renderedBeeps: ea\n            }));\n            r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n        },\n        _handleBeepChanges: function(ea) {\n            var fa = ((this.state.fading ? this.state.pendingBeeps : this.state.renderedBeeps));\n            Object.keys(ea).reverse().forEach(function(ga) {\n                var ha = ea[ga], ia = ha.beepID, ja = ((this.state.renderedBeeps[ga] || {\n                }));\n                if (((ja.beepID != ia))) {\n                    delete fa[ga];\n                    fa[ga] = ha;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (!this.state.paused) {\n                this._waitToHide();\n            }\n        ;\n        ;\n            this.forceUpdate();\n        },\n        _togglePause: function() {\n            if (!this.state.paused) {\n                ((this._animation && this._animation.JSBNG__stop()));\n                ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            }\n             else this._waitToHide();\n        ;\n        ;\n            this.setState({\n                paused: !this.state.paused\n            });\n        },\n        render: function() {\n            var ea = this.state.renderedBeeps, fa = {\n            };\n            Object.keys(ea).reverse().forEach(function(ja) {\n                var ka = ea[ja];\n                fa[ja] = j({\n                    beep: ka,\n                    onInserted: this._onInsertedItem\n                });\n            }, this);\n            var ga = !t(fa), ha = null;\n            if (((ga && this.props.canPause))) {\n                ha = q.DOM.li({\n                    className: \"-cx-PRIVATE-notificationBeeper__pause\",\n                    onClick: this._togglePause\n                }, ((this.state.paused ? \"Continue\" : \"Pause [fb]\")));\n            }\n        ;\n        ;\n            var ia = ((((!ga ? \"hidden_elem\" : \"\")) + ((\" \" + \"-cx-PUBLIC-notificationBeeper__list\"))));\n            return (q.DOM.ul({\n                ref: \"container\",\n                className: ia,\n                \"data-gt\": this.props.tracking,\n                onMouseEnter: this._onMouseEnter,\n                onMouseLeave: this._onMouseLeave\n            }, fa, ha));\n        }\n    });\n    function da(ea) {\n        var fa = {\n        };\n        ea.forEach(function(ga) {\n            var ha = ga.alert_id, ia = ((((ha + \"-\")) + ga.receivedTime)), ja = m.getThumbnail(ga.attachments, ga.attached_story);\n            fa[ha] = {\n                notificationID: ha,\n                beepID: ia,\n                beepRenderer: ga.beepRenderer,\n                actors: ga.actors,\n                icon: ga.icon,\n                link: ga.url,\n                photo: ja,\n                text: ((ga.unaggregatedTitle || ga.title)),\n                timestamp: ga.timestamp,\n                receivedTime: ga.receivedTime,\n                sound: !!ga.sound,\n                tracking: ga.tracking\n            };\n        });\n        return fa;\n    };\n;\n    e.exports = ca;\n});\n__d(\"FbdEventLog\", [\"URI\",\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"AsyncSignal\"), i = {\n        log: function(j, k, l, m) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            var n = g(\"/desktop/eventlog.php\"), o = new h(n.toString(), {\n                JSBNG__event: j,\n                category: ((k || \"unknown\")),\n                payload: ((l || \"\"))\n            });\n            o.setHandler(m).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"DownloadDialog\", [\"JSBNG__Event\",\"Arbiter\",\"Class\",\"DataStore\",\"ModalMask\",\"Overlay\",\"Parent\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DataStore\"), k = b(\"ModalMask\"), l = b(\"Overlay\"), m = b(\"Parent\"), n = b(\"Style\"), o = b(\"copyProperties\"), p = b(\"emptyFunction\");\n    function q() {\n        this.parent.construct(this);\n        return this;\n    };\n;\n    i.extend(q, l);\n    o(q, {\n        POSITIONS: {\n            BOTTOM_LEFT: \"bottom_left\",\n            TOP_LEFT: \"top_left\",\n            IE9_BOTTOM: \"ie9_bottom\"\n        },\n        activeDialogs: {\n        },\n        dismissAll: function() {\n            {\n                var fin287keys = ((window.top.JSBNG_Replay.forInKeys)((this.POSITIONS))), fin287i = (0);\n                var r;\n                for (; (fin287i < fin287keys.length); (fin287i++)) {\n                    ((r) = (fin287keys[fin287i]));\n                    {\n                        this.hideDialog(this.POSITIONS[r]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        hideDialog: function(r) {\n            var s = this.activeDialogs[r];\n            ((s && s.hide()));\n            this.activeDialogs[r] = null;\n        }\n    });\n    o(q.prototype, {\n        _cancelHandler: p,\n        _closeHandler: p,\n        _width: null,\n        position: q.POSITIONS.BOTTOM_LEFT,\n        init: function(r, s) {\n            this.parent.init(r);\n            this.position = s;\n            var t = ((j.get(this._root, \"modal\") === \"true\"));\n            q.hideDialog(s);\n            q.activeDialogs[s] = this;\n            g.listen(this._root, \"click\", function(JSBNG__event) {\n                if (m.byClass(JSBNG__event.getTarget(), \"closeButton\")) {\n                    if (((this._cancelHandler() !== false))) {\n                        q.hideDialog(this.position);\n                    }\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.subscribe(\"show\", function() {\n                if (t) {\n                    k.show();\n                }\n            ;\n            ;\n                h.inform(\"layer_shown\", {\n                    type: \"DownloadDialog\"\n                });\n            }.bind(this));\n            this.subscribe(\"hide\", function() {\n                if (t) {\n                    k.hide();\n                }\n            ;\n            ;\n                h.inform(\"layer_hidden\", {\n                    type: \"DownloadDialog\"\n                });\n                this._closeHandler();\n            }.bind(this));\n        },\n        setWidth: function(r) {\n            this._width = Math.floor(r);\n            return this;\n        },\n        updatePosition: function() {\n            if (this._width) {\n                n.set(this._overlay, \"width\", ((this._width + \"px\")));\n            }\n        ;\n        ;\n            return true;\n        },\n        setCancelHandler: function(r) {\n            this._cancelHandler = ((r || p));\n            return this;\n        },\n        setCloseHandler: function(r) {\n            this._closeHandler = ((r || p));\n            return this;\n        }\n    });\n    e.exports = q;\n    a.DownloadDialog = q;\n});\n__d(\"FbdConversionTracking\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\"), i = {\n        logClick: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/desktop/log_clicks.php\").setData({\n                click_source: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        },\n        logConversion: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/desktop/log_conversions.php\").setData({\n                conversion_action: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"MegaphoneHelper\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"DOM\",\"DOMDimensions\",\"Dialog\",\"LitestandMessages\",\"Parent\",\"Run\",\"Style\",\"csx\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Dialog\"), n = b(\"LitestandMessages\"), o = b(\"Parent\"), p = b(\"Run\"), q = b(\"Style\"), r = b(\"csx\"), s = b(\"cx\"), t = b(\"ge\");\n    function u() {\n        var w = k.scry(JSBNG__document.body, \".megaphone_story_wrapper\")[0];\n        ((w && k.remove(w)));\n        v.removeLitestandHomeWash();\n    };\n;\n    var v = {\n        hideStory: function(w, x, y, z, aa) {\n            var ba = {\n                mp_id: w,\n                JSBNG__location: x,\n                context: z\n            };\n            new j().setURI(\"/ajax/megaphone/megaphone_hide.php\").setMethod(\"POST\").setData(ba).setHandler(function(da) {\n                ((aa && aa(da)));\n            }).send();\n            var ca = t(y);\n            if (ca) {\n                new h(ca).to(\"height\", 0).duration(500).hide().go();\n            }\n        ;\n        ;\n        },\n        createModalStory: function(w, x, y, z) {\n            var aa;\n            if (((!w.buttons || !w.buttons.length))) {\n                w.buttons = m.CLOSE;\n                aa = v.hideStory(x, y, z, null);\n            }\n        ;\n        ;\n            var ba = new m(w);\n            if (aa) {\n                ba.setHandler(aa);\n            }\n        ;\n        ;\n            ba.show();\n        },\n        buttonOnClick: function(w, x, y, z, aa, ba) {\n            var ca = function() {\n                if (aa) {\n                    new j().setURI(z).send();\n                }\n                 else JSBNG__document.JSBNG__location.href = z;\n            ;\n            ;\n            };\n            if (ba) {\n                v.hideStory(w, x, \"\", y, ca);\n            }\n             else ca();\n        ;\n        ;\n        },\n        renderFullWidth: function(w, x, y) {\n            var z = t(w);\n            k.prependContent(z, x);\n            if (y) {\n                var aa = l.getElementDimensions(x), ba = g.div({\n                    className: \"-cx-PRIVATE-litestandMegaphone__whitewash\"\n                });\n                q.set(ba, \"height\", ((aa.height + \"px\")));\n                var ca = o.byClass(z, \"-cx-PUBLIC-litestandContent__root\");\n                k.prependContent(ca, ba);\n                p.onLeave(u);\n                i.subscribeOnce(n.FILTER_SWITCH_BEGIN, u);\n            }\n        ;\n        ;\n            i.inform(\"Megaphone/show\", w, i.BEHAVIOR_PERSISTENT);\n        },\n        removeLitestandHomeWash: function() {\n            var w = k.JSBNG__find(JSBNG__document.body, \".-cx-PRIVATE-litestandMegaphone__whitewash\");\n            k.remove(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"FbdInstall\", [\"$\",\"AsyncRequest\",\"CSS\",\"DOM\",\"DownloadDialog\",\"FbdConversionTracking\",\"FbdEventLog\",\"FBDesktopDetect\",\"FBDesktopPlugin\",\"MegaphoneHelper\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DownloadDialog\"), l = b(\"FbdConversionTracking\"), m = b(\"FbdEventLog\"), n = b(\"FBDesktopDetect\"), o = b(\"FBDesktopPlugin\"), p = b(\"MegaphoneHelper\"), q = 1000, r = ((300 * q)), s = {\n        cancelSetup: function() {\n            var t = JSON.stringify({\n                ref: this.ref\n            });\n            m.log(\"download_canceled\", \"setup\", t);\n            l.logConversion(\"download_canceled\");\n        },\n        hideMegaphone: function() {\n            if (((this.megaphoneId && this.megaphoneLoc))) {\n                p.hideStory(this.megaphoneId, this.megaphoneLoc, this.elementId, \"\", null);\n            }\n        ;\n        ;\n        },\n        init: function(t, u) {\n            this.downloadUrl = t;\n            this.ref = ((u || \"unknown\"));\n        },\n        initInstallWait: function(t, u, v) {\n            this.megaphoneId = t;\n            this.megaphoneLoc = u;\n            this.elementId = v;\n            this._waitForInstall(r);\n        },\n        promptDownload: function(t) {\n            t = ((t || this.downloadUrl));\n            if (t) {\n                var u = JSON.stringify({\n                    ref: this.ref\n                });\n                m.log(\"download_prompted\", \"setup\", u);\n                l.logConversion(\"download_prompted\");\n                var v = j.create(\"div\", {\n                    src: t,\n                    className: \"hidden_elem\"\n                });\n                j.appendContent(JSBNG__document.body, v);\n            }\n        ;\n        ;\n        },\n        _responseHandler: function(t) {\n            if (t.payload) {\n                this._authToken = t.payload.access_token;\n                this._userId = t.payload.id;\n            }\n        ;\n        ;\n            if (((this._authToken && this._userId))) {\n                this._waitForRunningStart = JSBNG__Date.now();\n                JSBNG__setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        ;\n        },\n        setupPlugin: function() {\n            new h(\"/ajax/desktop/download\").send();\n            this.promptDownload();\n        },\n        updateSidebarLinkVisibility: function() {\n            if (!n.isPluginInstalled()) {\n                i.show(g(\"sidebar-messenger-install-link\"));\n                i.show(g(\"sidebar-messenger-install-separator\"));\n            }\n        ;\n        ;\n        },\n        _waitForInstall: function(t) {\n            var u = JSON.stringify({\n                ref: this.ref\n            });\n            if (n.isPluginInstalled()) {\n                m.log(\"install_success\", \"setup\", u);\n                l.logConversion(\"install_success\");\n                o.recheck();\n                new h(\"/desktop/fbdesktop2/transfer.php\").setMethod(\"POST\").setHandler(this._responseHandler.bind(this)).send();\n                k.dismissAll();\n                this.hideMegaphone();\n                return;\n            }\n        ;\n        ;\n            if (((t <= 0))) {\n                m.log(\"install_timeout\", \"setup\", u);\n                l.logConversion(\"install_timeout\");\n                k.dismissAll();\n            }\n             else JSBNG__setTimeout(this._waitForInstall.bind(this, ((t - q))), q);\n        ;\n        ;\n        },\n        _waitForRunning: function() {\n            var t = ((JSBNG__Date.now() - this._waitForRunningStart));\n            if (o.isAppRunning()) {\n                o.transferAuthToken(this._authToken, this._userId);\n            }\n             else if (((t < r))) {\n                JSBNG__setTimeout(this._waitForRunning.bind(this), q);\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:fbdesktop2-install-js\", [\"FbdInstall\",], function(a, b, c, d) {\n    a.FbdInstall = b(\"FbdInstall\");\n}, 3);\n__d(\"legacy:fbdesktop-conversion-tracking\", [\"FbdConversionTracking\",], function(a, b, c, d) {\n    a.FbdConversionTracking = b(\"FbdConversionTracking\");\n}, 3);\n__d(\"SidebarTicker\", [\"Arbiter\",\"ChatSidebar\",\"CSS\",\"DOM\",\"Run\",\"TickerController\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatSidebar\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Run\"), l = b(\"TickerController\"), m = b(\"$\"), n = b(\"copyProperties\");\n    function o() {\n        this._ticker = m(\"pagelet_ticker\");\n        this._initSubscriptions();\n        if (i.hasClass(JSBNG__document.documentElement, \"sidebarMode\")) {\n            this._onSidebarShow();\n        }\n    ;\n    ;\n    };\n;\n    o.hide = function() {\n        k.onAfterLoad(function() {\n            j.remove(m(\"pagelet_ticker\"));\n            j.remove(j.JSBNG__find(JSBNG__document.body, \"div.fbSidebarGripper\"));\n            h.resize();\n        });\n    };\n    n(o.prototype, {\n        _initSubscriptions: function() {\n            this._subscriptions = [g.subscribe(\"sidebar/show\", this._onSidebarShow.bind(this)),];\n        },\n        _onSidebarShow: function() {\n            l.show(this._ticker);\n        }\n    });\n    e.exports = o;\n});\n__d(\"SidebarTickerResizer\", [\"Arbiter\",\"AsyncRequest\",\"ChatSidebar\",\"SimpleDrag\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"ChatSidebar\"), j = b(\"SimpleDrag\"), k = b(\"$\"), l = 1e-7;\n    function m(n) {\n        var o = k(\"pagelet_ticker\"), p = o.parentNode, q = this._saveResizedState.bind(this), r, s, t, u = function(x, JSBNG__event) {\n            r = JSBNG__event.clientY;\n            s = o.offsetHeight;\n            t = p.offsetHeight;\n        }, v = function(x, JSBNG__event) {\n            var y = ((s + ((JSBNG__event.clientY - r)))), z = ((100 - ((((((t - y)) / t)) * 100))));\n            z = Math.max(l, Math.min(90, z));\n            o.style.height = ((z + \"%\"));\n            if (((x == \"end\"))) {\n                q(z);\n                g.inform(\"Ticker/resized\");\n            }\n        ;\n        ;\n            i.resize();\n        }, w = new j(n);\n        w.subscribe(\"start\", u);\n        w.subscribe([\"update\",\"end\",], v);\n    };\n;\n    m.prototype._saveResizedState = function(n) {\n        new h(\"/ajax/feed/ticker/resize\").setData({\n            height: ((\"\" + n))\n        }).setMethod(\"POST\").send();\n    };\n    e.exports = m;\n});\n__d(\"legacy:megaphone\", [\"MegaphoneHelper\",], function(a, b, c, d) {\n    a.MegaphoneHelper = b(\"MegaphoneHelper\");\n}, 3);\n__d(\"NotificationXOut\", [\"Arbiter\",\"JSBNG__Event\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"userAction\");\n    function j(p, q, r) {\n        g.inform(\"notif/negativeCancel\", {\n            id: p\n        });\n        k(q, r);\n        h.$E(r).kill();\n    };\n;\n    function k(p, q) {\n        i(\"click\", null, q, null, {\n            gt: p\n        });\n    };\n;\n    function l(p, q) {\n        k(p, q);\n        h.$E(q).prevent();\n    };\n;\n    function m(p, q) {\n        h.listen(p, \"click\", k.curry(q));\n    };\n;\n    function n(p, q, r) {\n        h.listen(p, \"click\", j.curry(q, r));\n    };\n;\n    function o(p, q) {\n        h.listen(p, \"click\", l.curry(q));\n    };\n;\n    e.exports = {\n        setupConfirmListener: m,\n        setupCancelListener: n,\n        setupNoListener: o\n    };\n});\n__d(\"LiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\"), k = b(\"shield\");\n    function l(m) {\n        this.eventName = m;\n        this.subs = null;\n        this.handler = j;\n        this.shutdownHandler = null;\n        this.registered = false;\n        this.appId = 1;\n    };\n;\n    i(l, {\n        getAppMessageType: function(m, n) {\n            return ((((((\"live_message/\" + m)) + \":\")) + n));\n        },\n        route: function(m) {\n            var n = function(o) {\n                var p = l.getAppMessageType(m.app_id, m.event_name);\n                g.inform(p, o, g.BEHAVIOR_PERSISTENT);\n            };\n            n(m.response);\n        }\n    });\n    i(l.prototype, {\n        setAppId: function(m) {\n            this.appId = m;\n            return this;\n        },\n        setHandler: function(m) {\n            this.handler = m;\n            this._dirty();\n            return this;\n        },\n        setRestartHandler: j,\n        setShutdownHandler: function(m) {\n            this.shutdownHandler = k(m);\n            this._dirty();\n            return this;\n        },\n        _dirty: function() {\n            if (this.registered) {\n                this.unregister();\n                this.register();\n            }\n        ;\n        ;\n        },\n        register: function() {\n            var m = function(o, p) {\n                return this.handler(p);\n            }.bind(this), n = l.getAppMessageType(this.appId, this.eventName);\n            this.subs = {\n            };\n            this.subs.main = g.subscribe(n, m);\n            if (this.shutdownHandler) {\n                this.subs.shut = g.subscribe(h.ON_SHUTDOWN, this.shutdownHandler);\n            }\n        ;\n        ;\n            this.registered = true;\n            return this;\n        },\n        unregister: function() {\n            if (!this.subs) {\n                return this;\n            }\n        ;\n        ;\n            {\n                var fin288keys = ((window.top.JSBNG_Replay.forInKeys)((this.subs))), fin288i = (0);\n                var m;\n                for (; (fin288i < fin288keys.length); (fin288i++)) {\n                    ((m) = (fin288keys[fin288i]));\n                    {\n                        if (this.subs[m]) {\n                            this.subs[m].unsubscribe();\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.subs = null;\n            this.registered = false;\n            return this;\n        }\n    });\n    e.exports = l;\n});\n__d(\"initLiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"LiveMessageReceiver\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveMessageReceiver\");\n    g.subscribe(h.getArbiterType(\"app_msg\"), function(j, k) {\n        i.route(k.obj);\n    });\n});\n__d(\"Slideshow\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"Locale\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Locale\"), l = b(\"Parent\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"shield\");\n    function q(r, s) {\n        this._root = r;\n        this._config = s;\n        this._currentIndex = 0;\n        this._animating = false;\n        this._autoplayTimer = null;\n        this._init();\n    };\n;\n    m(q.prototype, g, {\n        getIndex: function() {\n            return this._currentIndex;\n        },\n        getNumItems: function() {\n            return this._items.length;\n        },\n        page: function(r) {\n            if (((typeof r === \"undefined\"))) {\n                r = \"next\";\n            }\n        ;\n        ;\n            if (((r === \"next\"))) {\n                if (((this._config.wrap || ((this.getIndex() < ((this.getNumItems() - 1))))))) {\n                    this._animateTo(((this._currentIndex + 1)));\n                }\n            ;\n            ;\n            }\n             else if (((r === \"prev\"))) {\n                if (((this._config.wrap || ((this.getIndex() > 0))))) {\n                    this._animateTo(((this._currentIndex - 1)));\n                }\n            ;\n            }\n            \n        ;\n        ;\n        },\n        pageTo: function(r) {\n            this._animateTo(r, p(this._setCurrent, this, r));\n        },\n        insert: function(r, s) {\n            if (((r > this._currentIndex))) {\n                i.insertAfter(this._items[((r - 1))], s);\n            }\n             else {\n                i.insertBefore(this._items[r], s);\n                this._currentIndex++;\n            }\n        ;\n        ;\n            this._items.splice(r, 0, s);\n            this._updateArrowState(this._currentIndex);\n            this.inform(\"items_updated\");\n        },\n        push: function(r) {\n            this.insert(this._items.length, r);\n        },\n        _init: function() {\n            this._container = i.JSBNG__find(this._root, \"ul.-cx-PRIVATE-uiSlideshow__container\");\n            this._items = i.scry(this._container, \"li.-cx-PRIVATE-uiSlideshow__item\");\n            if (this._config.arrows) {\n                j.listen(this._root, \"click\", this._clickListener.bind(this));\n                var r = i.JSBNG__find(this._root, \"a.-cx-PRIVATE-uiSlideshow__next\"), s = i.JSBNG__find(this._root, \"a.-cx-PRIVATE-uiSlideshow__prev\");\n                this._arrowLeft = ((k.isRTL() ? r : s));\n                this._arrowRight = ((k.isRTL() ? s : r));\n            }\n        ;\n        ;\n            if (this._config.autoplay) {\n                j.listen(this._root, \"mouseenter\", this.stopAutoplay.bind(this));\n                j.listen(this._root, \"mouseleave\", this.resetAutoplay.bind(this));\n                this.resetAutoplay();\n            }\n        ;\n        ;\n            this.subscribe([\"page_start\",\"page_end\",], function(t, u) {\n                h.conditionClass(this._root, \"-cx-PUBLIC-uiSlideshow__animating\", ((t === \"page_start\")));\n            }.bind(this));\n        },\n        _clickListener: function(JSBNG__event) {\n            var r = JSBNG__event.getTarget(), s = l.byTag(r, \"a\");\n            if (((s && !h.hasClass(s, \"-cx-PUBLIC-uiSlideshow__disabled\")))) {\n                if (h.hasClass(s, \"-cx-PRIVATE-uiSlideshow__next\")) {\n                    this.page(\"next\");\n                }\n                 else if (h.hasClass(s, \"-cx-PRIVATE-uiSlideshow__prev\")) {\n                    this.page(\"prev\");\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        _updateArrowState: function(r) {\n            if (!this._config.arrows) {\n                return;\n            }\n        ;\n        ;\n            h.conditionClass(this._arrowRight, \"-cx-PUBLIC-uiSlideshow__disabled\", ((this._items.length === 1)));\n            h.conditionClass(this._arrowLeft, \"-cx-PUBLIC-uiSlideshow__disabled\", ((this._items.length === 1)));\n        },\n        _animateTo: function(r) {\n        \n        },\n        _setCurrent: function(r) {\n            h.removeClass(this._items[this._currentIndex], \"-cx-PUBLIC-uiSlideshow__current\");\n            h.addClass(this._items[r], \"-cx-PUBLIC-uiSlideshow__current\");\n            h.removeClass(this._root, \"-cx-PUBLIC-uiSlideshow__animating\");\n            this._currentIndex = r;\n            this._animating = false;\n            this.inform(\"page_end\", r);\n        },\n        resetAutoplay: function() {\n            if (this._config.autoplay) {\n                JSBNG__clearTimeout(this._autoplayTimer);\n                this._autoplayTimer = JSBNG__setTimeout(this._autoplay.bind(this), this._config.autoplayTimeout);\n            }\n        ;\n        ;\n        },\n        stopAutoplay: function() {\n            JSBNG__clearTimeout(this._autoplayTimer);\n            this._autoplayTimer = null;\n        },\n        _autoplay: function() {\n            this.resetAutoplay();\n            if (((this._items.length > 1))) {\n                this.page();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = q;\n});\n__d(\"Carousel\", [\"Animation\",\"Class\",\"CSS\",\"Ease\",\"Locale\",\"Slideshow\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"Ease\"), k = b(\"Locale\"), l = b(\"Slideshow\"), m = b(\"Style\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"shield\"), q = ((k.isRTL() ? \"right\" : \"left\")), r = j.sineInOut;\n    function s(t, u) {\n        this.parent.construct(this, t, u);\n        this.subscribe(\"items_updated\", this._updateItemState.bind(this));\n    };\n;\n    h.extend(s, l);\n    n(s.prototype, {\n        _updateItemState: function(t, u) {\n            this._setContainerPos(t);\n            m.set(this._container, \"width\", ((((this._items.length * this._config.width)) + \"px\")));\n        },\n        _updateArrowState: function(t) {\n            if (!this._config.arrows) {\n                return;\n            }\n        ;\n        ;\n            var u = this._config.wrap, v = this._items.length, w = Math.floor(((v / this._config.photosperframe)));\n            i.conditionClass(this._arrowRight, \"-cx-PUBLIC-uiSlideshow__disabled\", ((((w === 1)) || ((!u && ((t === ((w - 1)))))))));\n            i.conditionClass(this._arrowLeft, \"-cx-PUBLIC-uiSlideshow__disabled\", ((((w === 1)) || ((!u && ((t === 0)))))));\n        },\n        _animate: function(t, u) {\n            this._animating = true;\n            this.inform(\"page_start\", t);\n            new g(this._container).to(q, ((-t * this._config.width))).duration(this._config.animationDuration).ease(r).ondone(u).go();\n        },\n        _setContainerPos: function(t) {\n            m.set(this._container, q, ((((-t * this._config.width)) + \"px\")));\n        },\n        _animateTo: function(t) {\n            if (this._animating) {\n                return;\n            }\n        ;\n        ;\n            var u = this._items.length;\n            if (((((((0 <= t)) && ((t < u)))) || !this._config.wrap))) {\n                var v = ((((t + u)) % u));\n                this._updateArrowState(v);\n                return this._animate(v, p(this._setCurrent, this, v));\n            }\n        ;\n        ;\n            var w = ((t % u)), x = ((w ? ((u - 1)) : 0)), y = this._items[((u - 1))];\n            m.set(y, \"position\", \"absolute\");\n            m.set(y, q, ((-this._config.width + \"px\")));\n            if (((x === 0))) {\n                this._setContainerPos(-1);\n            }\n        ;\n        ;\n            this._animate(w, function() {\n                m.set(y, \"position\", \"static\");\n                m.set(y, q, \"auto\");\n                this._setContainerPos(x);\n                this._setCurrent(x);\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});");
// 14192
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o3,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/LUiDH5-xN0p.js",o5);
// undefined
o3 = null;
// undefined
o5 = null;
// 14204
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"LpC/l\",]);\n}\n;\n__d(\"DOMWrapper\", [], function(a, b, c, d, e, f) {\n    var g, h, i = {\n        setRoot: function(j) {\n            g = j;\n        },\n        getRoot: function() {\n            return (g || document.body);\n        },\n        setWindow: function(j) {\n            h = j;\n        },\n        getWindow: function() {\n            return (h || self);\n        }\n    };\n    e.exports = i;\n});\n__d(\"Flash\", [\"DOMWrapper\",\"QueryString\",\"UserAgent\",\"copyProperties\",\"guid\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMWrapper\"), h = b(\"QueryString\"), i = b(\"UserAgent\"), j = b(\"copyProperties\"), k = b(\"guid\"), l = {\n    }, m, n = g.getWindow().document;\n    function o(t) {\n        var u = n.getElementById(t);\n        if (u) {\n            u.parentNode.removeChild(u);\n        };\n        delete l[t];\n    };\n    function p() {\n        for (var t in l) {\n            if (l.hasOwnProperty(t)) {\n                o(t);\n            };\n        };\n    };\n    function q(t) {\n        return t.replace(/\\d+/g, function(u) {\n            return (\"000\".substring(u.length) + u);\n        });\n    };\n    function r(t) {\n        if (!m) {\n            if ((i.ie() >= 9)) {\n                window.attachEvent(\"onunload\", p);\n            };\n            m = true;\n        }\n    ;\n        l[t] = t;\n    };\n    var s = {\n        embed: function(t, u, v, w) {\n            var x = k();\n            t = encodeURI(t);\n            v = j({\n                allowscriptaccess: \"always\",\n                flashvars: w,\n                movie: t\n            }, (v || {\n            }));\n            if ((typeof v.flashvars == \"object\")) {\n                v.flashvars = h.encode(v.flashvars);\n            };\n            var y = [];\n            for (var z in v) {\n                if ((v.hasOwnProperty(z) && v[z])) {\n                    y.push(((((\"\\u003Cparam name=\\\"\" + encodeURI(z)) + \"\\\" value=\\\"\") + encodeURI(v[z])) + \"\\\"\\u003E\"));\n                };\n            };\n            var aa = n.createElement(\"div\"), ba = (((((((((\"\\u003Cobject \" + ((i.ie() ? \"classid=\\\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\\\" \" : \"type=\\\"application/x-shockwave-flash\\\"\"))) + \"data=\\\"\") + t) + \"\\\" \") + \"id=\\\"\") + x) + \"\\\"\\u003E\") + y.join(\"\")) + \"\\u003C/object\\u003E\");\n            aa.innerHTML = ba;\n            var ca = u.appendChild(aa.firstChild);\n            r(x);\n            return ca;\n        },\n        remove: o,\n        getVersion: function() {\n            var t = \"Shockwave Flash\", u = \"application/x-shockwave-flash\", v = \"ShockwaveFlash.ShockwaveFlash\", w;\n            if ((navigator.plugins && (typeof navigator.plugins[t] == \"object\"))) {\n                var x = navigator.plugins[t].description;\n                if ((((x && navigator.mimeTypes) && navigator.mimeTypes[u]) && navigator.mimeTypes[u].enabledPlugin)) {\n                    w = x.match(/\\d+/g);\n                };\n            }\n        ;\n            if (!w) {\n                try {\n                    w = (new ActiveXObject(v)).GetVariable(\"$version\").match(/(\\d+),(\\d+),(\\d+),(\\d+)/);\n                    w = Array.prototype.slice.call(w, 1);\n                } catch (y) {\n                \n                }\n            };\n            return w;\n        },\n        checkMinVersion: function(t) {\n            var u = s.getVersion();\n            if (!u) {\n                return false\n            };\n            return (q(u.join(\".\")) >= q(t));\n        },\n        isAvailable: function() {\n            return !!s.getVersion();\n        }\n    };\n    e.exports = s;\n});\n__d(\"MercuryAudioPlayer\", [\"Event\",\"Arbiter\",\"DOM\",\"Flash\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"Flash\"), k = b(\"copyProperties\"), l = 200;\n    function m() {\n        var v = i.create(\"audio\"), w = false;\n        try {\n            if (!!v.canPlayType) {\n                if (v.canPlayType(\"video/mp4;\").replace(/^no$/, \"\")) {\n                    w = true;\n                }\n            };\n        } finally {\n            return w;\n        };\n    };\n    function n() {\n        return j.isAvailable();\n    };\n    var o = function() {\n        this.interval = null;\n        this.arbiterInstance = null;\n        this.audio = i.create(\"audio\");\n        g.listen(this.audio, \"playing\", function() {\n            this.informAttachment(\"playing\", this.audio.currentTime);\n            this.interval = setInterval(function() {\n                this.informAttachment(\"playing\", this.audio.currentTime);\n            }.bind(this), l);\n        }.bind(this));\n        g.listen(this.audio, \"ended\", function() {\n            clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(o.prototype, {\n        setAudio: function(v, w) {\n            this.audio.setAttribute(\"src\", v);\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            };\n        },\n        play: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            this.audio.pause();\n            clearInterval(this.interval);\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"html5\";\n        }\n    });\n    var p = function() {\n        this.src = null;\n        this.arbiterInstance = null;\n        var v = i.create(\"div\");\n        document.body.appendChild(v);\n        this.swf = j.embed(\"/swf/SoundStreamPlayer.swf\", v, null, {\n        });\n        this.interval = null;\n        h.subscribe(\"soundstream/finished\", function() {\n            clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(p.prototype, {\n        setAudio: function(v, w) {\n            this.src = v;\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            };\n        },\n        play: function() {\n            this.swf.playSound(this.src);\n            this.interval = setInterval(function() {\n                var v = this.swf.getCurrentTime();\n                this.informAttachment(\"playing\", v);\n            }.bind(this), l);\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.swf.resume();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            clearInterval(this.interval);\n            this.swf.pause();\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"flash\";\n        }\n    });\n    function q() {\n        if (m()) {\n            return new o();\n        }\n         else if (n()) {\n            return new p()\n        }\n    ;\n        return false;\n    };\n    var r = null, s = null, t = 0;\n    function u(v, w) {\n        this.src = v;\n        this.arbiterInstance = w;\n        this.audio_id = ++t;\n        ((r !== null) || (r = q()));\n        if (!r) {\n            return false\n        };\n    };\n    k(u.prototype, {\n        getType: function() {\n            if (!r) {\n                return false;\n            }\n             else return r.getType()\n        ;\n        },\n        play: function(v) {\n            if ((v && (s == this.audio_id))) {\n                r.resume();\n            }\n             else {\n                this.pause();\n                s = this.audio_id;\n                r.setAudio(this.src, this.arbiterInstance);\n                r.play();\n            }\n        ;\n        },\n        pause: function() {\n            r.pause();\n        }\n    });\n    e.exports = u;\n});\n__d(\"MercuryAttachmentAudioClip.react\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryAudioPlayer\",\"Env\",\"JSLogger\",\"LeftRight.react\",\"React\",\"cx\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryAudioPlayer\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"LeftRight.react\"), m = b(\"React\"), n = b(\"cx\"), o = b(\"shield\"), p = b(\"tx\"), q = \"MercuryAttachmentAudioClip/play\", r = k.create(\"mercury_audio_clip\"), s = m.createClass({\n        displayName: \"AudioClip\",\n        mixins: [h,],\n        getInitialState: function() {\n            this.subscribe(\"playing\", this.updateTime);\n            this.subscribe(\"played\", o(this.setState, this, {\n                playing: true,\n                started: true\n            }));\n            this.subscribe(\"paused\", o(this.setState, this, {\n                playing: false\n            }));\n            this.subscribe(\"finished\", o(this.setState, this, {\n                playing: false,\n                started: false,\n                time: this.props.duration\n            }));\n            this.logged = false;\n            var t = (this.props.downloadOnly ? false : new i(this.props.src, this));\n            g.subscribe(q, function(u, v) {\n                if ((this.props.src != v)) {\n                    this.setState({\n                        time: 0\n                    });\n                };\n            }.bind(this));\n            return {\n                time: 0,\n                playing: false,\n                started: false,\n                duration: this.props.duration,\n                audioPlayer: t\n            };\n        },\n        updateTime: function(t, u) {\n            this.setState({\n                time: u\n            });\n        },\n        play: function() {\n            if (this.state.playing) {\n                this.state.audioPlayer.pause();\n            }\n             else {\n                this.state.audioPlayer.play(this.state.started);\n                g.inform(q, this.props.src);\n                if (!this.logged) {\n                    this.logged = true;\n                    r.log(\"play\", {\n                        uid: j.user,\n                        duration: this.props.duration\n                    });\n                }\n            ;\n            }\n        ;\n        },\n        _formatSeconds: function(t) {\n            if (t) {\n                t = Math.ceil(t);\n                var u = (t % 60);\n                if ((u < 10)) {\n                    u = (\"0\" + u);\n                };\n                var v = Math.floor((t / 60));\n                return ((v + \":\") + u);\n            }\n             else return null\n        ;\n        },\n        _renderPlayer: function(t, u) {\n            return (m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\",\n                style: {\n                    width: t\n                },\n                onClick: this.play\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__play\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__playicon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__duration\"\n            }, u), m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__scrubber\"\n            })));\n        },\n        render: function() {\n            var t = this.state.time, u = this.state.playing, v = this._formatSeconds(this.state.duration), w = (this.props.width || 170), x = null, y = Math.ceil((((t * ((w + 2)))) / this.state.duration));\n            if ((this.state.audioPlayer && this.state.audioPlayer.getType())) {\n                var z = this._renderPlayer(w, v), aa = this._renderPlayer(w, v), ba = ((((\"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\") + (((u && ((t !== 0))) ? (\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__playing\") : \"\"))) + (((u && ((t === 0))) ? (\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__loading\") : \"\"))));\n                x = (m.DOM.div({\n                    className: ba\n                }, z, m.DOM.div({\n                    className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__progresser\",\n                    style: {\n                        width: y\n                    }\n                }, aa)));\n            }\n             else x = (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\"\n            }, l(null, m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadbox\",\n                href: this.props.src\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speaker\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speakericon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadtext\"\n            }, \"Voice Message\"), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__durationinline\"\n            }, v)), m.DOM.a({\n                href: this.props.src,\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__download\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadicon\"\n            }))))));\n        ;\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__root\"\n            }, x));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryStickersFlyoutList.react\", [\"Animation\",\"React\",\"Image.react\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"React\"), i = b(\"Image.react\"), j = b(\"cx\"), k = b(\"fbt\"), l = b(\"ix\"), m = 5, n = \"Sticker Store\", o = h.createClass({\n        displayName: \"MercuryStickersFlyoutList\",\n        _calculateNumPages: function(q) {\n            return Math.max(1, Math.ceil((((q.length - 1)) / m)));\n        },\n        getInitialState: function() {\n            return {\n                animating: false,\n                selectedId: this.props.packs[0].id,\n                page: 0,\n                numPages: this._calculateNumPages(this.props.packs)\n            };\n        },\n        componentWillReceiveProps: function(q) {\n            this.setState({\n                numPages: this._calculateNumPages(q.packs)\n            });\n        },\n        shouldComponentUpdate: function(q, r) {\n            return !r.animating;\n        },\n        _canGoPrev: function() {\n            return (this.state.page > 0);\n        },\n        _canGoNext: function() {\n            return ((this.state.page + 1) < this.state.numPages);\n        },\n        _setPage: function(q) {\n            if (this.state.animating) {\n                return\n            };\n            this.setState({\n                animating: true,\n                page: q\n            });\n            var r = this.refs.positioner.getDOMNode();\n            new g(r).to(\"marginLeft\", (-r.childNodes[q].offsetLeft + \"px\")).ondone(function() {\n                this.setState({\n                    animating: false\n                });\n            }.bind(this)).duration(200).go();\n        },\n        _back: function() {\n            (this._canGoPrev() && this._setPage((this.state.page - 1)));\n        },\n        _next: function() {\n            (this._canGoNext() && this._setPage((this.state.page + 1)));\n        },\n        render: function() {\n            var q = this.props.packs, r = this.props.onPackClick, s = [];\n            q.forEach(function(y, z) {\n                s.push(p({\n                    key: y.id,\n                    onClick: function() {\n                        (r && r(y.id));\n                        this.setState({\n                            selectedId: y.id\n                        });\n                    }.bind(this),\n                    pack: y,\n                    selected: (this.state.selectedId === y.id)\n                }));\n            }.bind(this));\n            var t = [], u = [];\n            s.forEach(function(y, z) {\n                u.push(y);\n                if (((z > 0) && ((((z % m) === 0) || (z === (s.length - 1)))))) {\n                    t.push(h.DOM.div({\n                        className: \"-cx-PRIVATE-fbMercuryStickersSelector__page\"\n                    }, u));\n                    u = [];\n                }\n            ;\n            });\n            var v = ((((\"-cx-PRIVATE-fbMercuryStickersSelector__left\") + ((\" \" + \"lfloat\"))) + ((!this._canGoPrev() ? (\" \" + \"hidden_elem\") : \"\")))), w = ((((\"-cx-PRIVATE-fbMercuryStickersSelector__right\") + ((\" \" + \"rfloat\"))) + ((!this._canGoNext() ? (\" \" + \"hidden_elem\") : \"\")))), x;\n            if ((t.length > 1)) {\n                x = h.DOM.a({\n                    className: w,\n                    onClick: this._next\n                }, i({\n                    className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                    src: l(\"/images/messaging/stickers/selector/rightarrow.png\")\n                }));\n            };\n            return (h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__root\"\n            }, h.DOM.a({\n                ajaxify: \"/ajax/messaging/stickers/store\",\n                \"aria-label\": n,\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__store rfloat\",\n                \"data-hover\": \"tooltip\",\n                ref: \"store\",\n                rel: \"dialog\"\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__storeicon\",\n                src: l(\"/images/messaging/stickers/selector/store.png\")\n            })), h.DOM.a({\n                className: v,\n                onClick: this._back\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                src: l(\"/images/messaging/stickers/selector/leftarrow.png\")\n            })), x, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__icons\"\n            }, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__positioner\",\n                ref: \"positioner\"\n            }, t))));\n        }\n    }), p = h.createClass({\n        displayName: \"PackIcon\",\n        render: function() {\n            var q = this.props.pack, r = (((\"-cx-PRIVATE-fbMercuryStickersFlyout__packselector\") + ((this.props.selected ? (\" \" + \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedpack\") : \"\"))));\n            return (h.DOM.a({\n                \"aria-label\": q.name,\n                className: r,\n                \"data-id\": q.id,\n                \"data-hover\": \"tooltip\",\n                onClick: function() {\n                    (this.props.onClick && this.props.onClick(q.id));\n                }.bind(this)\n            }, h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__packicon\",\n                src: q.icon\n            }), h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedicon\",\n                src: q.selectedIcon\n            })));\n        }\n    });\n    e.exports = o;\n});\n__d(\"str2rstr\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = \"\", j, k;\n        for (var l = 0; (l < h.length); l++) {\n            j = h.charCodeAt(l);\n            k = (((l + 1) < h.length) ? h.charCodeAt((l + 1)) : 0);\n            if (((((55296 <= j) && (j <= 56319)) && (56320 <= k)) && (k <= 57343))) {\n                j = ((65536 + ((((j & 1023)) << 10))) + ((k & 1023)));\n                l++;\n            }\n        ;\n            if ((j <= 127)) {\n                i += String.fromCharCode(j);\n            }\n             else if ((j <= 2047)) {\n                i += String.fromCharCode((192 | ((((j >>> 6)) & 31))), (128 | ((j & 63))));\n            }\n             else if ((j <= 65535)) {\n                i += String.fromCharCode((224 | ((((j >>> 12)) & 15))), (128 | ((((j >>> 6)) & 63))), (128 | ((j & 63))));\n            }\n             else if ((j <= 2097151)) {\n                i += String.fromCharCode((240 | ((((j >>> 18)) & 7))), (128 | ((((j >>> 12)) & 63))), (128 | ((((j >>> 6)) & 63))), (128 | ((j & 63))));\n            }\n            \n            \n        ;\n        };\n        return i;\n    };\n    e.exports = g;\n});\n__d(\"md5\", [\"str2rstr\",], function(a, b, c, d, e, f) {\n    var g = b(\"str2rstr\");\n    function h(u, v) {\n        var w = u[0], x = u[1], y = u[2], z = u[3];\n        w = j(w, x, y, z, v[0], 7, -680876936);\n        z = j(z, w, x, y, v[1], 12, -389564586);\n        y = j(y, z, w, x, v[2], 17, 606105819);\n        x = j(x, y, z, w, v[3], 22, -1044525330);\n        w = j(w, x, y, z, v[4], 7, -176418897);\n        z = j(z, w, x, y, v[5], 12, 1200080426);\n        y = j(y, z, w, x, v[6], 17, -1473231341);\n        x = j(x, y, z, w, v[7], 22, -45705983);\n        w = j(w, x, y, z, v[8], 7, 1770035416);\n        z = j(z, w, x, y, v[9], 12, -1958414417);\n        y = j(y, z, w, x, v[10], 17, -42063);\n        x = j(x, y, z, w, v[11], 22, -1990404162);\n        w = j(w, x, y, z, v[12], 7, 1804603682);\n        z = j(z, w, x, y, v[13], 12, -40341101);\n        y = j(y, z, w, x, v[14], 17, -1502002290);\n        x = j(x, y, z, w, v[15], 22, 1236535329);\n        w = k(w, x, y, z, v[1], 5, -165796510);\n        z = k(z, w, x, y, v[6], 9, -1069501632);\n        y = k(y, z, w, x, v[11], 14, 643717713);\n        x = k(x, y, z, w, v[0], 20, -373897302);\n        w = k(w, x, y, z, v[5], 5, -701558691);\n        z = k(z, w, x, y, v[10], 9, 38016083);\n        y = k(y, z, w, x, v[15], 14, -660478335);\n        x = k(x, y, z, w, v[4], 20, -405537848);\n        w = k(w, x, y, z, v[9], 5, 568446438);\n        z = k(z, w, x, y, v[14], 9, -1019803690);\n        y = k(y, z, w, x, v[3], 14, -187363961);\n        x = k(x, y, z, w, v[8], 20, 1163531501);\n        w = k(w, x, y, z, v[13], 5, -1444681467);\n        z = k(z, w, x, y, v[2], 9, -51403784);\n        y = k(y, z, w, x, v[7], 14, 1735328473);\n        x = k(x, y, z, w, v[12], 20, -1926607734);\n        w = l(w, x, y, z, v[5], 4, -378558);\n        z = l(z, w, x, y, v[8], 11, -2022574463);\n        y = l(y, z, w, x, v[11], 16, 1839030562);\n        x = l(x, y, z, w, v[14], 23, -35309556);\n        w = l(w, x, y, z, v[1], 4, -1530992060);\n        z = l(z, w, x, y, v[4], 11, 1272893353);\n        y = l(y, z, w, x, v[7], 16, -155497632);\n        x = l(x, y, z, w, v[10], 23, -1094730640);\n        w = l(w, x, y, z, v[13], 4, 681279174);\n        z = l(z, w, x, y, v[0], 11, -358537222);\n        y = l(y, z, w, x, v[3], 16, -722521979);\n        x = l(x, y, z, w, v[6], 23, 76029189);\n        w = l(w, x, y, z, v[9], 4, -640364487);\n        z = l(z, w, x, y, v[12], 11, -421815835);\n        y = l(y, z, w, x, v[15], 16, 530742520);\n        x = l(x, y, z, w, v[2], 23, -995338651);\n        w = m(w, x, y, z, v[0], 6, -198630844);\n        z = m(z, w, x, y, v[7], 10, 1126891415);\n        y = m(y, z, w, x, v[14], 15, -1416354905);\n        x = m(x, y, z, w, v[5], 21, -57434055);\n        w = m(w, x, y, z, v[12], 6, 1700485571);\n        z = m(z, w, x, y, v[3], 10, -1894986606);\n        y = m(y, z, w, x, v[10], 15, -1051523);\n        x = m(x, y, z, w, v[1], 21, -2054922799);\n        w = m(w, x, y, z, v[8], 6, 1873313359);\n        z = m(z, w, x, y, v[15], 10, -30611744);\n        y = m(y, z, w, x, v[6], 15, -1560198380);\n        x = m(x, y, z, w, v[13], 21, 1309151649);\n        w = m(w, x, y, z, v[4], 6, -145523070);\n        z = m(z, w, x, y, v[11], 10, -1120210379);\n        y = m(y, z, w, x, v[2], 15, 718787259);\n        x = m(x, y, z, w, v[9], 21, -343485551);\n        u[0] = s(w, u[0]);\n        u[1] = s(x, u[1]);\n        u[2] = s(y, u[2]);\n        u[3] = s(z, u[3]);\n    };\n    function i(u, v, w, x, y, z) {\n        v = s(s(v, u), s(x, z));\n        return s((((v << y)) | ((v >>> ((32 - y))))), w);\n    };\n    function j(u, v, w, x, y, z, aa) {\n        return i((((v & w)) | (((~v) & x))), u, v, y, z, aa);\n    };\n    function k(u, v, w, x, y, z, aa) {\n        return i((((v & x)) | ((w & (~x)))), u, v, y, z, aa);\n    };\n    function l(u, v, w, x, y, z, aa) {\n        return i(((v ^ w) ^ x), u, v, y, z, aa);\n    };\n    function m(u, v, w, x, y, z, aa) {\n        return i((w ^ ((v | (~x)))), u, v, y, z, aa);\n    };\n    function n(u) {\n        var v = u.length, w = [1732584193,-271733879,-1732584194,271733878,], x;\n        for (x = 64; (x <= u.length); x += 64) {\n            h(w, o(u.substring((x - 64), x)));;\n        };\n        u = u.substring((x - 64));\n        var y = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,];\n        for (x = 0; (x < u.length); x++) {\n            y[(x >> 2)] |= (u.charCodeAt(x) << ((((x & 3)) << 3)));;\n        };\n        y[(x >> 2)] |= (128 << ((((x & 3)) << 3)));\n        if ((x > 55)) {\n            h(w, y);\n            for (x = 0; (x < 16); x++) {\n                y[x] = 0;;\n            };\n        }\n    ;\n        y[14] = (v * 8);\n        h(w, y);\n        return w;\n    };\n    function o(u) {\n        var v = [], w = 0;\n        while ((w < 64)) {\n            v[(w >> 2)] = (((u.charCodeAt(w++) | ((u.charCodeAt(w++) << 8))) | ((u.charCodeAt(w++) << 16))) | ((u.charCodeAt(w++) << 24)));;\n        };\n        return v;\n    };\n    var p = \"0123456789abcdef\".split(\"\");\n    function q(u) {\n        var v = \"\", w = 0;\n        for (; (w < 4); w++) {\n            v += (p[(((u >> ((((w << 3)) + 4)))) & 15)] + p[(((u >> ((w << 3)))) & 15)]);;\n        };\n        return v;\n    };\n    function r(u) {\n        for (var v = 0; (v < u.length); v++) {\n            u[v] = q(u[v]);;\n        };\n        return u.join(\"\");\n    };\n    var s = function(u, v) {\n        return (((u + v)) & 4294967295);\n    };\n    function t(u) {\n        if (((null === u) || (undefined === u))) {\n            return null;\n        }\n         else {\n            for (var v = 0; (v < u.length); v++) {\n                if ((u[v] > \"\")) {\n                    u = g(u);\n                    break;\n                }\n            ;\n            };\n            return r(n(u));\n        }\n    ;\n    };\n    if ((t(\"hello\") != \"5d41402abc4b2a76b9719d911017c592\")) {\n        s = function(u, v) {\n            var w = (((u & 65535)) + ((v & 65535))), x = ((((u >> 16)) + ((v >> 16))) + ((w >> 16)));\n            return (((x << 16)) | ((w & 65535)));\n        };\n    };\n    e.exports = t;\n});\n__d(\"isRTL\", [], function(a, b, c, d, e, f) {\n    var g = (\"A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02b8\\u0300-\\u0590\\u0800-\\u1fff\" + \"\\u200e\\u2c00-\\ufb1c\\ufe00-\\ufe6f\\ufefd-\\uffff\"), h = \"\\u0591-\\u07ff\\u200f\\ufb1d-\\ufdff\\ufe70-\\ufefc\", i = new RegExp(((((\"^[^\" + g) + \"]*[\") + h) + \"]\")), j = new RegExp(((\"[\" + g) + \"]\"));\n    function k(l) {\n        var m = 0, n = 0;\n        l.split(/\\s+/, 20).forEach(function(o) {\n            if (/^https?:\\/\\//.test(o)) {\n                return\n            };\n            if (i.test(o)) {\n                n++;\n                m++;\n            }\n             else if (j.test(o)) {\n                m++;\n            }\n        ;\n        });\n        return !!((m && (((n / m) > 15895))));\n    };\n    e.exports = k;\n});\n__d(\"WaterfallIDGenerator\", [\"Env\",\"md5\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"md5\");\n    function i() {\n        var l = 2147483647;\n        return (Math.random() * l);\n    };\n    function j() {\n        return Math.floor((Date.now() / 1000));\n    };\n    var k = {\n        generate: function() {\n            return h([g.user,j(),i(),].join(\":\"));\n        }\n    };\n    e.exports = k;\n});\n__d(\"FeatureDetection\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\");\n    e.exports = {\n        isFileAPISupported: function() {\n            if (((g.webkit() && !g.chrome()) && g.windows())) {\n                return false\n            };\n            return (((\"FileList\" in window)) && ((\"FormData\" in window)));\n        },\n        isBlobFactorySupported: function() {\n            return !!a.Blob;\n        }\n    };\n});\n__d(\"AsyncUploadBase\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"Form\",\"FeatureDetection\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Form\"), k = b(\"FeatureDetection\"), l = b(\"copyProperties\"), m = b(\"removeFromArray\");\n    function n(p) {\n        this.setURI(p);\n    };\n    n.isSupported = function() {\n        return k.isFileAPISupported();\n    };\n    l(n.prototype, g, {\n        _limit: 10,\n        setAllowCrossOrigin: function(p) {\n            this._allowCrossOrigin = !!p;\n            return this;\n        },\n        setData: function(p) {\n            this._data = p;\n            return this;\n        },\n        setLimit: function(p) {\n            this._limit = p;\n            return this;\n        },\n        setRelativeTo: function(p) {\n            this._relativeTo = p;\n            return this;\n        },\n        setStatusElement: function(p) {\n            this._statusElement = p;\n            return this;\n        },\n        setURI: function(p) {\n            this._uri = p;\n            return this;\n        },\n        suspend: function() {\n            this._suspended = true;\n            return this;\n        },\n        resume: function() {\n            this._suspended = false;\n            this._processQueue();\n            return this;\n        },\n        isUploading: function() {\n            return this._inFlight;\n        },\n        _createFileUpload: function(p, q, r) {\n            return new o(p, q, r);\n        },\n        _parseFiles: function(p) {\n            var q = {\n            };\n            for (var r in p) {\n                var s = p[r];\n                if (Array.isArray(s)) {\n                    q[r] = s;\n                }\n                 else {\n                    q[r] = [];\n                    if ((s instanceof window.FileList)) {\n                        for (var t = 0; (t < s.length); t++) {\n                            q[r].push(s.item(t));;\n                        };\n                    }\n                     else if (((s instanceof window.File) || (s instanceof window.Blob))) {\n                        q[r].push(s);\n                    }\n                ;\n                }\n            ;\n            };\n            return q;\n        },\n        _processQueue: function() {\n            if (this._suspended) {\n                return\n            };\n            while ((this._pending.length < this._limit)) {\n                if (!this._waiting.length) {\n                    break;\n                };\n                var p = this._waiting.shift();\n                this._processUpload(p);\n                this._pending.push(p);\n            };\n        },\n        _processUpload: function(p) {\n            var q = j.createFormData((p.getData() || this._data));\n            if (p.getFile()) {\n                q.append(p.getName(), p.getFile());\n                q.append(\"upload_id\", p.getFile().uploadID);\n            }\n        ;\n            var r = new h().setAllowCrossOrigin(this._allowCrossOrigin).setURI(this._uri).setRawData(q).setRelativeTo(this._relativeTo).setStatusElement(this._statusElement).setHandler(this._success.bind(this, p)).setErrorHandler(this._failure.bind(this, p)).setUploadProgressHandler(this._progress.bind(this, p)).setInitialHandler(this._initial.bind(this, p));\n            r.send();\n            p.setAsyncRequest(r);\n            this._inFlight = true;\n            this.inform(\"start\", p);\n        },\n        _abort: function(p) {\n            m(this._waiting, p);\n            p.abort();\n        },\n        _initial: function(p) {\n            this.inform(\"initial\", p);\n        },\n        _success: function(p, q) {\n            this._complete(p);\n            this.inform(\"success\", p.handleSuccess(q));\n            this._processQueue();\n        },\n        _failure: function(p, q) {\n            this._complete(p);\n            if ((this.inform(\"failure\", p.handleFailure(q)) !== false)) {\n                i.defaultErrorHandler(q);\n            };\n            this._processQueue();\n        },\n        _progress: function(p, event) {\n            this.inform(\"progress\", p.handleProgress(event));\n        },\n        _complete: function(p) {\n            m(this._pending, p);\n            if (!this._pending.length) {\n                this._inFlight = false;\n            };\n        }\n    });\n    var o = function(p, q, r) {\n        this._name = p;\n        this._file = q;\n        this._data = r;\n        this._success = null;\n        this._response = null;\n        this._progressEvent = null;\n        this._request = null;\n    };\n    l(o.prototype, {\n        getName: function() {\n            return this._name;\n        },\n        getFile: function() {\n            return this._file;\n        },\n        getData: function() {\n            return this._data;\n        },\n        isComplete: function() {\n            return (this._success !== null);\n        },\n        isSuccess: function() {\n            return (this._success === true);\n        },\n        getResponse: function() {\n            return this._response;\n        },\n        getProgressEvent: function() {\n            return this._progressEvent;\n        },\n        setAsyncRequest: function(p) {\n            this._request = p;\n            return this;\n        },\n        isWaiting: function() {\n            return !this._request;\n        },\n        abort: function() {\n            (this._request && this._request.abort());\n            this._request = null;\n        },\n        handleSuccess: function(p) {\n            this._success = true;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleFailure: function(p) {\n            this._success = false;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleProgress: function(event) {\n            this._progressEvent = event;\n            return this;\n        }\n    });\n    e.exports = n;\n});\n__d(\"AsyncUploadRequest\", [\"AsyncUploadBase\",\"Class\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncUploadBase\"), h = b(\"Class\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n    j.isSupported = function() {\n        return g.isSupported();\n    };\n    h.extend(j, g);\n    i(j.prototype, {\n        setFiles: function(k) {\n            this._files = this._parseFiles(k);\n            return this;\n        },\n        send: function() {\n            if (this._inFlight) {\n                return\n            };\n            this._inFlight = true;\n            this._uploads = [];\n            for (var k in this._files) {\n                this._files[k].forEach(function(l) {\n                    this._uploads.push(this._createFileUpload(k, l));\n                }.bind(this));;\n            };\n            if (this._uploads.length) {\n                this._waiting = this._uploads.slice(0);\n                this._pending = [];\n                this._processQueue();\n            }\n             else this._processUpload(this._createFileUpload(null, null));\n        ;\n        },\n        _processQueue: function() {\n            this.parent._processQueue();\n            if ((!this._pending.length && !this._waiting.length)) {\n                this.inform(\"complete\", this._uploads);\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"FileForm\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"AsyncUploadRequest\",\"BehaviorsMixin\",\"DataStore\",\"DOMQuery\",\"Env\",\"Event\",\"Form\",\"JSONPTransport\",\"Parent\",\"URI\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"AsyncUploadRequest\"), k = b(\"BehaviorsMixin\"), l = b(\"DataStore\"), m = b(\"DOMQuery\"), n = b(\"Env\"), o = b(\"Event\"), p = b(\"Form\"), q = b(\"JSONPTransport\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"copyProperties\"), u = b(\"shield\");\n    function v(y) {\n        var z = {\n        }, aa = m.scry(y, \"input[type=\\\"file\\\"]\");\n        aa.forEach(function(ba) {\n            z[ba.name] = ba.files;\n        });\n        return z;\n    };\n    function w(y) {\n        var z = m.scry(y, \"input[type=\\\"file\\\"]\");\n        z.forEach(function(aa) {\n            aa.files = null;\n        });\n    };\n    function x(y, z, aa) {\n        if ((y.getAttribute(\"rel\") === \"async\")) {\n            throw new Error(\"FileForm cannot be used with Primer forms.\")\n        };\n        if ((y.getAttribute(\"method\").toUpperCase() !== \"POST\")) {\n            throw new Error(\"FileForm must be used with POST forms.\")\n        };\n        this._form = y;\n        this._previousEncoding = this._form.enctype;\n        this._form.enctype = this._form.encoding = \"multipart/form-data\";\n        (z && this.enableBehaviors(z));\n        this._options = (aa || {\n        });\n        this.setAllowCrossOrigin(this._options.allowCrossOrigin);\n        this.setUploadInParallel(this._options.uploadInParallel);\n        this._listener = o.listen(this._form, \"submit\", this._submit.bind(this));\n        l.set(this._form, \"FileForm\", this);\n    };\n    t(x, {\n        EVENTS: [\"start\",\"submit\",\"initial\",\"progress\",\"success\",\"failure\",],\n        getInstance: function(y) {\n            return l.get(y, \"FileForm\");\n        }\n    });\n    t(x.prototype, g, k, {\n        getRoot: function() {\n            return this._form;\n        },\n        setAllowCrossOrigin: function(y) {\n            this._allowCrossOrigin = !!y;\n            return this;\n        },\n        setUploadInParallel: function(y) {\n            this._uploadInParallel = !!y;\n            return this;\n        },\n        _submit: function(event) {\n            if ((this.inform(\"submit\") === false)) {\n                event.prevent();\n                return;\n            }\n        ;\n            var y = (\"FormData\" in window);\n            if (y) {\n                if ((!s(this._form.action).isSameOrigin() && !this._allowCrossOrigin)) {\n                    y = false;\n                }\n            };\n            return (y ? this._sendViaXHR(event) : this._sendViaFrame(event));\n        },\n        _sendViaFrame: function(event) {\n            var y = this._request = new h();\n            y.setStatusElement(this._getStatusElement());\n            y.addStatusIndicator();\n            y.setOption(\"useIframeTransport\", true);\n            var z = y.handleResponse.bind(y), aa = new q(\"iframe\", this._form.action, z), ba = aa.getTransportFrame(), ca = aa.getRequestURI().addQueryData({\n                __iframe: true,\n                __user: n.user\n            });\n            this._form.setAttribute(\"action\", ca.toString());\n            this._form.setAttribute(\"target\", ba.name);\n            y.setJSONPTransport(aa);\n            y.setURI(ca);\n            y.setHandler(this.success.bind(this, null));\n            y.setErrorHandler(this.failure.bind(this, null));\n            y.setInitialHandler(u(this.initial, this, null));\n        },\n        _sendViaXHR: function(event) {\n            var y;\n            if ((this._uploadInParallel && j.isSupported())) {\n                y = new j().setData(p.serialize(this._form)).setFiles(v(this._form));\n                var z = [y.subscribe(\"progress\", function(aa, ba) {\n                    this.progress(ba, ba.getProgressEvent());\n                }.bind(this)),y.subscribe(\"initial\", function(aa, ba) {\n                    this.initial(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"success\", function(aa, ba) {\n                    this.success(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"start\", function(aa, ba) {\n                    this.inform(\"start\", {\n                        upload: ba\n                    });\n                }.bind(this)),y.subscribe(\"failure\", function(aa, ba) {\n                    this.failure(ba, ba.getResponse());\n                    return false;\n                }.bind(this)),y.subscribe(\"complete\", function() {\n                    while (z.length) {\n                        z.pop().unsubscribe();;\n                    };\n                }),];\n            }\n             else y = new h().setRawData(p.createFormData(this._form)).setHandler(this.success.bind(this, null)).setErrorHandler(this.failure.bind(this, null)).setUploadProgressHandler(this.progress.bind(this, null)).setInitialHandler(u(this.initial, this, null));\n        ;\n            y.setAllowCrossOrigin(this._allowCrossOrigin).setRelativeTo(this._form).setStatusElement(this._getStatusElement()).setURI(this._form.action).send();\n            this._request = y;\n            event.prevent();\n        },\n        initial: function(y) {\n            return this.inform(\"initial\", {\n                upload: y\n            });\n        },\n        success: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if ((this.inform(\"success\", aa) !== false)) {\n                o.fire(this._form, \"success\", aa);\n            };\n            this._cleanup();\n        },\n        failure: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if ((this.inform(\"failure\", aa) !== false)) {\n                if ((o.fire(this._form, \"error\", aa) !== false)) {\n                    i.defaultErrorHandler(z);\n                }\n            };\n            this._cleanup();\n        },\n        progress: function(y, event) {\n            this.inform(\"progress\", {\n                event: event,\n                upload: y\n            });\n        },\n        abort: function() {\n            if (this._request) {\n                this._request.abort();\n                this._cleanup();\n            }\n        ;\n        },\n        clear: function() {\n            w(this._form);\n        },\n        destroy: function() {\n            this._cleanup();\n            this._listener.remove();\n            this._listener = null;\n            this._form.enctype = this._form.encoding = this._previousEncoding;\n            l.remove(this._form, \"FileForm\");\n        },\n        _cleanup: function() {\n            this._request = null;\n        },\n        _getStatusElement: function() {\n            return (r.byClass(this._form, \"stat_elem\") || this._form);\n        }\n    });\n    e.exports = x;\n});\n__d(\"FileFormResetOnSubmit\", [\"DOMQuery\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._form = j;\n    };\n    h(i.prototype, {\n        enable: function() {\n            this._subscription = this._form.subscribe(\"submit\", Function.prototype.defer.bind(this._reset.bind(this)));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _reset: function() {\n            var j = g.scry(this._form.getRoot(), \"input[type=\\\"file\\\"]\");\n            j.forEach(function(k) {\n                k.value = \"\";\n            });\n        }\n    });\n    e.exports = i;\n});\n__d(\"submitForm\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = function(i) {\n        var j = g.scry(i, \"input[type=\\\"submit\\\"]\")[0];\n        if (j) {\n            j.click();\n        }\n         else {\n            j = g.create(\"input\", {\n                type: \"submit\",\n                className: \"hidden_elem\"\n            });\n            g.appendContent(i, j);\n            j.click();\n            g.remove(j);\n        }\n    ;\n    };\n    e.exports = h;\n});\n__d(\"FormSubmitOnChange\", [\"Event\",\"copyProperties\",\"submitForm\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"submitForm\");\n    function j(k) {\n        this._form = k;\n    };\n    h(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._form.getRoot(), \"change\", this._submit.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _submit: function() {\n            i(this._form.getRoot());\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFileUploader\", [\"ArbiterMixin\",\"CSS\",\"Dialog\",\"DOM\",\"Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachment\",\"MercuryAttachmentTemplates\",\"MercuryConstants\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getObjectValues\",\"shield\",\"startsWith\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"Dialog\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"FileForm\"), m = b(\"FileFormResetOnSubmit\"), n = b(\"FileInput\"), o = b(\"FormSubmitOnChange\"), p = b(\"MercuryAttachment\"), q = b(\"MercuryAttachmentTemplates\"), r = b(\"MercuryConstants\"), s = b(\"SubscriptionsHandler\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"getObjectValues\"), w = b(\"shield\"), x = b(\"startsWith\"), y = b(\"tx\"), z = 0;\n    function aa(ca, da, ea, fa) {\n        this._parentElem = ca;\n        this._attachments = {\n        };\n        this._imageIDs = {\n        };\n        this._uploading = {\n        };\n        this._uploadTemplates = {\n        };\n        this._uploadStartTimes = {\n        };\n        this._subscriptionsHandler = new s();\n        this._fileForm = new l(da, [o,m,]);\n        this._fileForm.setAllowCrossOrigin(true);\n        this._fileForm.setUploadInParallel(true);\n        var ga = j.find(da, \".-cx-PRIVATE-mercuryFileUploader__root\"), ha = j.find(ga, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new n(ga, ha, ea);\n        h.hide(this._parentElem);\n        this._subscriptionsHandler.addSubscriptions(this._fileForm.subscribe(\"submit\", function() {\n            var ia = (\"upload_\" + z++);\n            fa.value = ia;\n            var ja = {\n                count: 0,\n                file_sizes: []\n            };\n            if (ea.files) {\n                for (var ka = 0; (ka < ea.files.length); ka++) {\n                    if ((ea.files[ka].size > r.AttachmentMaxSize)) {\n                        this._fileForm.abort();\n                        this._fileForm.clear();\n                        new i().setTitle(\"The file you have selected is too large\").setBody(\"The file you have selected is too large. The maximum size is 25MB.\").setButtons(i.OK).setSemiModal(true).show();\n                        return false;\n                    }\n                ;\n                };\n                for (var la = 0; (la < ea.files.length); la++) {\n                    this._addFileUploadRow(ia, ea.files[la].name);\n                    ja.count++;\n                    ja.file_sizes.push(ea.files[la].size);\n                };\n            }\n             else {\n                this._addFileUploadRow(ia, ea.value);\n                ja.count = 1;\n            }\n        ;\n            this.inform(\"submit\", ja);\n        }.bind(this)), this._fileForm.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), this._fileForm.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), k.listen(ha, \"click\", w(this.inform, this, \"open\")));\n    };\n    t(aa.prototype, g, {\n        isUploading: function() {\n            return !!Object.keys(this._uploading).length;\n        },\n        getAttachments: function() {\n            return v(this._attachments);\n        },\n        getImageIDs: function() {\n            return v(this._imageIDs);\n        },\n        removeAttachments: function() {\n            v(this._uploadTemplates).forEach(function(ca) {\n                if (ca) {\n                    j.remove(ca.getRoot());\n                };\n            });\n            this._attachments = {\n            };\n            this._imageIDs = {\n            };\n            this._uploadTemplates = {\n            };\n            this._uploading = {\n            };\n            this._uploadStartTimes = {\n            };\n            h.hide(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n            this._fileForm.destroy();\n            this.removeAttachments();\n        },\n        _addFileUploadRow: function(ca, da) {\n            var ea = q[\":fb:mercury:upload-file-row\"].build(), fa = ba(da), ga = ((ca + \"/\") + fa);\n            this._uploadTemplates[ga] = ea;\n            this._uploading[ga] = true;\n            this._uploadStartTimes[ga] = Date.now();\n            j.appendContent(ea.getNode(\"iconText\"), fa);\n            k.listen(ea.getNode(\"closeFileUpload\"), \"click\", this._removeFileUploader.bind(this, ga));\n            j.appendContent(this._parentElem, ea.getRoot());\n            h.show(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        _removeFileUploader: function(ca, event) {\n            if (this._uploading[ca]) {\n                this.inform(\"upload-canceled-during-upload\");\n            }\n             else if ((this._attachments[ca] || this._imageIDs[ca])) {\n                this.inform(\"upload-canceled-after-uploaded\");\n            }\n        ;\n            delete this._attachments[ca];\n            delete this._imageIDs[ca];\n            delete this._uploading[ca];\n            delete this._uploadStartTimes[ca];\n            var da = this._uploadTemplates[ca];\n            delete this._uploadTemplates[ca];\n            if (da) {\n                j.remove(da.getRoot());\n                this.inform(\"dom-updated\");\n            }\n        ;\n            this.inform(\"upload-canceled\");\n            return false;\n        },\n        _updateFileUploader: function(ca, da) {\n            var ea = this._uploadTemplates[ca], fa = p.getAttachIconClassByMime(da);\n            h.addClass(ea.getNode(\"iconText\"), fa);\n            h.addClass(ea.getRoot(), \"done\");\n        },\n        _onFileUploadSuccess: function(event, ca) {\n            var da = ca.response.getPayload(), ea = da.uploadID, fa = da.metadata;\n            for (var ga = 0; (ga < fa.length); ga++) {\n                var ha = ((ea + \"/\") + fa[ga].filename);\n                if (this._uploading[ha]) {\n                    delete this._uploading[ha];\n                    if (fa[ga].image_id) {\n                        this._imageIDs[ha] = fa[ga].image_id;\n                    }\n                     else this._attachments[ha] = fa[ga];\n                ;\n                    this._updateFileUploader(ha, fa[ga].filetype);\n                    this.inform(\"one-upload-completed\", {\n                        upload_time_ms: (Date.now() - this._uploadStartTimes[ha])\n                    });\n                }\n            ;\n            };\n            if (!this.isUploading()) {\n                this.inform(\"all-uploads-completed\", {\n                    count: this.getAttachments().length\n                });\n            };\n        },\n        _onFileUploadFailure: function(event, ca) {\n            this.inform(\"one-upload-failed\");\n        }\n    });\n    function ba(ca) {\n        if ((ca && x(ca, \"C:\\\\fakepath\\\\\"))) {\n            return ca.substring(12)\n        };\n        return ca;\n    };\n    e.exports = aa;\n});\n__d(\"JoinableConversationMessageFilter\", [\"MercuryLogMessageType\",\"MercuryThreads\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryLogMessageType\"), h = b(\"MercuryThreads\").get(), i = b(\"MercuryParticipants\"), j = {\n        _isFilterable: function(k) {\n            var l = k.log_message_type;\n            if (!l) {\n                return false\n            };\n            if ((l == g.JOINABLE_JOINED)) {\n                return (k.log_message_data.joined_participant !== i.user)\n            };\n            if (((l == g.UNSUBSCRIBE) || (l == g.SUBSCRIBE))) {\n                var m = h.getThreadMetaNow(k.thread_id);\n                if ((m && m.is_joinable)) {\n                    return (k.author !== i.user)\n                };\n                return false;\n            }\n        ;\n            return false;\n        },\n        filterMessages: function(k, l, m) {\n            var n = [];\n            for (var o = 0; (o < l.length); o++) {\n                var p = l[o];\n                if (j._isFilterable(p)) {\n                    if (m) {\n                        k(p);\n                    };\n                }\n                 else n.push(p);\n            ;\n            };\n            return n;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreadMuter\", [\"AsyncDialog\",\"AsyncRequest\",\"Env\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"MercuryThreads\").get(), k = {\n        getUserIDEmail: function() {\n            return (i.user + \"@facebook.com\");\n        },\n        getThreadMuteSettingForUser: function(l) {\n            return (l.mute_settings && l.mute_settings[k.getUserIDEmail()]);\n        },\n        isThreadMuted: function(l) {\n            return (k.getThreadMuteSettingForUser(l) !== undefined);\n        },\n        showMuteChangeDialog: function(l, m) {\n            g.send(new h(\"/ajax/mercury/mute_thread_dialog.php\").setData({\n                muting: l\n            }), function(n) {\n                n.subscribe(\"confirm\", function() {\n                    this.hide();\n                    j.updateThreadMuteSetting(m, l);\n                }.bind(n));\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"JoinStatusTabSheet\", [\"copyProperties\",\"DOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"DOM\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercuryParticipants\");\n    function k(l, m) {\n        this._rootElement = l;\n        this._messageQueue = [];\n        this._sheetView = m;\n    };\n    g(k.prototype, {\n        _setMessage: function(l, m) {\n            var n = l.author, o = l.log_message_type;\n            if ((o == i.JOINABLE_JOINED)) {\n                var p = l.log_message_data.joined_participant;\n                if ((p !== j.user)) {\n                    j.get(p, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} joined the chat.\", {\n                            actor: s.name\n                        }));\n                    });\n                };\n            }\n             else if ((o == i.UNSUBSCRIBE)) {\n                if ((n !== j.user)) {\n                    j.get(n, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} left the conversation.\", {\n                            actor: s.name\n                        }));\n                    });\n                };\n            }\n             else if ((o == i.SUBSCRIBE)) {\n                if ((n !== j.user)) {\n                    var q = l.log_message_data.added_participants;\n                    if ((q && (q.length > 0))) {\n                        var r = [n,q[0],];\n                        j.getMulti(r, function(s) {\n                            h.setContent(m, h.tx._(\"{actor} added {subscriber1}.\", {\n                                actor: s[n].name,\n                                subscriber1: s[q[0]].name\n                            }));\n                        });\n                    }\n                ;\n                }\n            \n            }\n            \n        ;\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getCloseTimeout: function() {\n            return 2000;\n        },\n        getType: function() {\n            return \"join_status_type\";\n        },\n        addToQueue: function(l) {\n            this._messageQueue.push(l);\n            if ((this._messageQueue.length === 1)) {\n                this._open();\n            };\n        },\n        render: function() {\n            var l = this._messageQueue[0], m = this._getTemplate().build();\n            this._setMessage(l, m.getNode(\"text\"));\n            h.setContent(this._rootElement, m.getRoot());\n        },\n        _open: function() {\n            this._sheetView.open(this);\n        },\n        autoCloseCallback: function() {\n            this._messageQueue.shift();\n            if ((this._messageQueue.length > 0)) {\n                this._open();\n            };\n        },\n        couldNotReplace: function() {\n            this._open.bind(this).defer(this.getCloseTimeout(), false);\n        }\n    });\n    e.exports = k;\n});\n__d(\"WebMessengerEvents\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = h(new g(), {\n        MASTER_DOM_CHANGED: \"master-dom-changed\",\n        DETAIL_DOM_CHANGED: \"detail-dom-changed\",\n        FOCUS_COMPOSER: \"focus-composer\",\n        FOCUS_SEARCH: \"focus-search\",\n        FOCUS_AND_SELECT_SEARCH: \"focus-and-select-search\",\n        SUBMIT_REPLY: \"submit-reply\",\n        UPDATE_SELECTION: \"update-selection\",\n        masterDOMChanged: function() {\n            this.inform(i.MASTER_DOM_CHANGED);\n        },\n        detailDOMChanged: function() {\n            this.inform(i.DETAIL_DOM_CHANGED);\n        },\n        focusComposer: function() {\n            this.inform(i.FOCUS_COMPOSER);\n        },\n        focusSearch: function() {\n            this.inform(i.FOCUS_SEARCH);\n        },\n        focusAndSelectSearch: function() {\n            this.inform(i.FOCUS_AND_SELECT_SEARCH);\n        },\n        updateSelection: function(j) {\n            this.inform(i.UPDATE_SELECTION, j);\n        },\n        submitReply: function() {\n            this.inform(i.SUBMIT_REPLY);\n        }\n    });\n    e.exports = i;\n});\n__d(\"WebMessengerSubscriptionsHandler\", [\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"SubscriptionsHandler\"), h = new g(\"webmessenger\");\n    e.exports = h;\n});\n__d(\"isWebMessengerURI\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/^(\\/messages)/).test(h.getPath());\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerWidthControl\", [\"Arbiter\",\"CSS\",\"CSSClassTransition\",\"DOMDimensions\",\"Event\",\"Style\",\"URI\",\"ViewportBounds\",\"WebMessengerEvents\",\"shield\",\"WebMessengerSubscriptionsHandler\",\"$\",\"cx\",\"isWebMessengerURI\",\"requestAnimationFrame\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"CSSClassTransition\"), j = b(\"DOMDimensions\"), k = b(\"Event\"), l = b(\"Style\"), m = b(\"URI\"), n = b(\"ViewportBounds\"), o = b(\"WebMessengerEvents\"), p = b(\"shield\"), q = b(\"WebMessengerSubscriptionsHandler\"), r = b(\"$\"), s = b(\"cx\"), t = b(\"isWebMessengerURI\"), u = b(\"requestAnimationFrame\"), v = b(\"throttle\"), w = 205, x = 981, y = 257, z = 18, aa = 848, ba = 724, ca = 35554, da = 56, ea, fa, ga;\n    function ha(ma, na, oa) {\n        this.masterChanged = ma;\n        this.detailChaned = na;\n        q.addSubscriptions(k.listen(window, \"resize\", v(p(ia, this, this), 100)), g.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], p(ia, this, this), g.SUBSCRIBE_NEW));\n        var pa = (la() ? da : 0);\n        if (oa) {\n            pa = w;\n        };\n        this._width = (la() ? 0 : aa);\n        ga = true;\n        ia(this, pa);\n    };\n    function ia(ma, na) {\n        var oa = (n.getRight() + n.getLeft());\n        oa = ((oa || na) || 0);\n        var pa = (j.getViewportWithoutScrollbarDimensions().width - oa), qa = Math.round(Math.max(0, ((pa / 2) - (x / 2))));\n        pa = ((x + qa) - y);\n        pa -= z;\n        pa = Math.max(ba, Math.min(aa, pa));\n        if ((!isNaN(pa) && (ma._width !== pa))) {\n            ma._width = pa;\n            var ra = Math.round((pa / ((1 + ca)))), sa = (pa - ra);\n            ma.masterChanged(sa);\n            ma.detailChaned(ra);\n            if (la()) {\n                var ta = (pa + y);\n                ja(function() {\n                    if (fa) {\n                        document.body.className = fa;\n                        fa = \"\";\n                    }\n                ;\n                    ka((ta + \"px\"));\n                    h.removeClass(document.body, \"-cx-PRIVATE-fbWMWidthControl__firstload\");\n                    (ga && o.detailDOMChanged());\n                    ga = false;\n                }, fa);\n            }\n        ;\n        }\n    ;\n    };\n    function ja(ma, na) {\n        (na && h.addClass(document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\"));\n        u(ma);\n        (na && h.removeClass.curry(document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\").defer(1000, false));\n    };\n    function ka(ma) {\n        l.set(r(\"pageHead\"), \"width\", ma);\n        l.set(r(\"globalContainer\"), \"width\", ma);\n    };\n    function la() {\n        if (!ea) {\n            ea = h.hasClass(document.body, \"-cx-PUBLIC-hasLitestand__body\");\n        };\n        return ea;\n    };\n    i.registerHandler(function(ma, na, oa, pa) {\n        function qa(ra) {\n            return (la() && t(m(ra)));\n        };\n        if (qa(pa)) {\n            fa = na;\n            return true;\n        }\n         else if (qa(oa)) {\n            ja(function() {\n                ma.className = na;\n                ka(\"\");\n            }, true);\n            return true;\n        }\n        \n    ;\n    });\n    e.exports = ha;\n});\n__d(\"TextInputControl\", [\"Event\",\"function-extensions\",\"Class\",\"DOMControl\",\"Input\",\"copyProperties\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Class\"), i = b(\"DOMControl\"), j = b(\"Input\"), k = b(\"copyProperties\"), l = b(\"debounce\");\n    function m(n) {\n        this.parent.construct(this, n);\n        var o = this.getRoot(), p = l(this.update.bind(this), 0);\n        g.listen(o, {\n            input: p,\n            keydown: p,\n            paste: p\n        });\n    };\n    h.extend(m, i);\n    k(m.prototype, {\n        setMaxLength: function(n) {\n            j.setMaxLength(this.getRoot(), n);\n            return this;\n        },\n        getValue: function() {\n            return j.getValue(this.getRoot());\n        },\n        isEmpty: function() {\n            return j.isEmpty(this.getRoot());\n        },\n        setValue: function(n) {\n            j.setValue(this.getRoot(), n);\n            this.update();\n            return this;\n        },\n        clear: function() {\n            return this.setValue(\"\");\n        },\n        setPlaceholderText: function(n) {\n            j.setPlaceholder(this.getRoot(), n);\n            return this;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TextMetrics\", [\"Event\",\"DOM\",\"Style\",\"UserAgent\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"debounce\"), l;\n    function m() {\n        if ((typeof l === \"undefined\")) {\n            var o = h.create(\"div\", {\n                className: \"webkitZoomTest\"\n            }), p = function() {\n                h.appendContent(document.body, o);\n                l = (100 / o.clientHeight);\n                h.remove(o);\n            };\n            g.listen(window, \"resize\", k(p, 100));\n            p();\n        }\n    ;\n        return l;\n    };\n    function n(o, p) {\n        this._node = o;\n        this._flexible = !!p;\n        var q = \"textarea\", r = \"textMetrics\";\n        if (this._flexible) {\n            q = \"div\";\n            r += \" textMetricsInline\";\n        }\n    ;\n        this._shadow = h.create(q, {\n            className: r\n        });\n        var s = [\"fontSize\",\"fontStyle\",\"fontWeight\",\"fontFamily\",\"wordWrap\",];\n        s.forEach(function(u) {\n            i.set(this._shadow, u, i.get(o, u));\n        }.bind(this));\n        var t = i.get(o, \"lineHeight\");\n        if ((j.chrome() || j.webkit())) {\n            t = (Math.round((parseInt(t, 10) * m())) + \"px\");\n        };\n        i.set(this._shadow, \"lineHeight\", t);\n        document.body.appendChild(this._shadow);\n    };\n    n.prototype.measure = function(o) {\n        var p = this._node, q = this._shadow;\n        o = (((o || p.value)) + \"...\");\n        if (!this._flexible) {\n            var r = ((p.clientWidth - i.getFloat(p, \"paddingLeft\")) - i.getFloat(p, \"paddingRight\"));\n            i.set(q, \"width\", (Math.max(r, 0) + \"px\"));\n        }\n    ;\n        h.setContent(q, o);\n        return {\n            width: q.scrollWidth,\n            height: q.scrollHeight\n        };\n    };\n    n.prototype.destroy = function() {\n        h.remove(this._shadow);\n    };\n    e.exports = n;\n});\n__d(\"TextAreaControl\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"CSS\",\"DOMControl\",\"Style\",\"TextInputControl\",\"TextMetrics\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"CSS\"), l = b(\"DOMControl\"), m = b(\"Style\"), n = b(\"TextInputControl\"), o = b(\"TextMetrics\"), p = b(\"copyProperties\");\n    function q(s, t) {\n        return (m.getFloat(s, t) || 0);\n    };\n    function r(s) {\n        this.autogrow = k.hasClass(s, \"uiTextareaAutogrow\");\n        this.parent.construct(this, s);\n        this.width = null;\n        g.listen(s, \"focus\", this._handleFocus.bind(this));\n    };\n    j.extend(r, n);\n    p(r.prototype, i, {\n        setAutogrow: function(s) {\n            this.autogrow = s;\n            return this;\n        },\n        onupdate: function() {\n            this.parent.onupdate();\n            if (this.autogrow) {\n                var s = this.getRoot();\n                if (!this.metrics) {\n                    this.metrics = new o(s);\n                };\n                if ((typeof this.initialHeight === \"undefined\")) {\n                    this.isBorderBox = (((m.get(s, \"box-sizing\") === \"border-box\") || (m.get(s, \"-moz-box-sizing\") === \"border-box\")) || (m.get(s, \"-webkit-box-sizing\") === \"border-box\"));\n                    this.borderBoxOffset = (((q(s, \"padding-top\") + q(s, \"padding-bottom\")) + q(s, \"border-top-width\")) + q(s, \"border-bottom-width\"));\n                    this.initialHeight = (s.offsetHeight - this.borderBoxOffset);\n                }\n            ;\n                var t = this.metrics.measure(), u = Math.max(this.initialHeight, t.height);\n                if (this.isBorderBox) {\n                    u += this.borderBoxOffset;\n                };\n                if ((u !== this.height)) {\n                    this.height = u;\n                    m.set(s, \"height\", (u + \"px\"));\n                    h.inform(\"reflow\");\n                    this.inform(\"resize\");\n                }\n            ;\n            }\n             else if (this.metrics) {\n                this.metrics.destroy();\n                this.metrics = null;\n            }\n            \n        ;\n        },\n        resetHeight: function() {\n            this.height = -1;\n            this.update();\n        },\n        _handleFocus: function() {\n            this.width = null;\n        }\n    });\n    r.getInstance = function(s) {\n        return (l.getInstance(s) || new r(s));\n    };\n    e.exports = r;\n});\n__d(\"MessagesEmoticonView\", [\"DOM\",\"EmoticonsList\",\"Event\",\"Focus\",\"InputSelection\",\"Keys\",\"Parent\",\"SubscriptionsHandler\",\"TextAreaControl\",\"Toggler\",\"copyProperties\",\"endsWith\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoticonsList\"), i = b(\"Event\"), j = b(\"Focus\"), k = b(\"InputSelection\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"SubscriptionsHandler\"), o = b(\"TextAreaControl\"), p = b(\"Toggler\"), q = b(\"copyProperties\"), r = b(\"endsWith\"), s = b(\"startsWith\"), t = h.symbols;\n    function u(w, x, y) {\n        var z = m.byClass(w, \"emoticon\");\n        if (!z) {\n            return\n        };\n        var aa = \"emoticon_\", ba = null;\n        z.className.split(\" \").forEach(function(ia) {\n            if (s(ia, aa)) {\n                ba = ia.substring(aa.length);\n            };\n        });\n        if (!t[ba]) {\n            return\n        };\n        var ca = o.getInstance(x), da = ca.getValue(), ea = t[ba], fa = da.substring(0, y.start), ga = da.substring(y.end);\n        if (((y.start > 0) && !r(fa, \" \"))) {\n            ea = (\" \" + ea);\n        };\n        if (!s(ga, \" \")) {\n            ea += \" \";\n        };\n        var ha = ((fa + ea) + ga);\n        y.start += ea.length;\n        y.end = y.start;\n        ca.setValue(ha);\n        k.set(x, y.start, y.end);\n        return true;\n    };\n    function v(w, x) {\n        var y = {\n            start: 0,\n            end: 0\n        };\n        function z() {\n            y = k.get(x);\n        };\n        var aa = g.find(w, \".uiToggleFlyout\");\n        this._subscriptions = new n();\n        this._subscriptions.addSubscriptions(p.subscribe(\"show\", function(ba, ca) {\n            if ((ca.active && g.contains(w, ca.active))) {\n                k.set(x, y.start, y.end);\n                var da = g.scry(aa, \"a.emoticon\")[0];\n                j.setWithoutOutline(da);\n            }\n        ;\n        }), i.listen(aa, \"click\", function(event) {\n            var ba = u(event.getTarget(), x, y);\n            (ba && p.hide(w));\n        }), i.listen(aa, \"keyup\", function(event) {\n            if ((event.keyCode === l.ESC)) {\n                p.hide(w);\n                k.set(x, y.start, y.end);\n            }\n        ;\n        }), i.listen(x, \"keyup\", z), i.listen(x, \"click\", z));\n    };\n    q(v.prototype, {\n        destroy: function() {\n            this._subscriptions.release();\n            this._subscriptions = null;\n        }\n    });\n    q(v, {\n        create: function(w, x) {\n            return new v(w, x);\n        }\n    });\n    e.exports = v;\n});\n__d(\"MercuryTypingReceiver\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryParticipants\",\"MercuryPayloadSource\",\"MercuryServerRequests\",\"MercuryThreads\",\"TypingDetector\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"TypingDetector\"), o = b(\"setTimeoutAcrossTransitions\"), p, q = {\n    }, r = 30000, s = new g();\n    function t(y) {\n        var z = (q[y] || {\n        }), aa = Object.keys(z);\n        aa.sort(function(ba, ca) {\n            return (z[ba] - z[ca]);\n        });\n        return aa;\n    };\n    function u() {\n        p = null;\n        var y = Date.now(), z = {\n        }, aa = false;\n        for (var ba in q) {\n            var ca = false;\n            for (var da in (q[ba] || {\n            })) {\n                if ((q[ba][da] < (y - r))) {\n                    delete q[ba][da];\n                    ca = true;\n                }\n                 else aa = true;\n            ;\n            };\n            if (ca) {\n                z[ba] = t(ba);\n            };\n        };\n        for (var ea in z) {\n            s.inform(\"state-changed\", z);\n            break;\n        };\n        if (aa) {\n            p = o(u, 3000);\n        };\n    };\n    function v(y, z) {\n        if ((y in q)) {\n            if ((z in q[y])) {\n                delete q[y][z];\n                w(y);\n            }\n        \n        };\n    };\n    function w(y) {\n        var z = {\n        };\n        z[y] = t(y);\n        s.inform(\"state-changed\", z);\n    };\n    function x(y) {\n        if (y.thread) {\n            return l.getClientThreadIDNow(y.thread)\n        };\n        if ((y.type === \"typ\")) {\n            return m.getThreadIdForUser(y.from)\n        };\n        return null;\n    };\n    g.subscribe([h.getArbiterType(\"typ\"),h.getArbiterType(\"ttyp\"),], function(y, z) {\n        var aa = z.obj, ba = x(aa);\n        if (ba) {\n            var ca = j.getIDForUser(aa.from);\n            if ((aa.st == n.TYPING)) {\n                q[ba] = (q[ba] || {\n                });\n                var da = q[ba][ca];\n                q[ba][ca] = Date.now();\n                if (!p) {\n                    p = o(u, 3000);\n                };\n                (!da && w(ba));\n            }\n             else if ((aa.st == n.INACTIVE)) {\n                v(ba, ca);\n            }\n        ;\n        }\n    ;\n    });\n    l.subscribe(\"update-typing-state\", function(y, z) {\n        var aa = z.payload_source;\n        if (((aa != k.CLIENT_CHANNEL_MESSAGE) && (aa != k.SERVER_ZAP))) {\n            return\n        };\n        var ba = z.actions;\n        if ((!ba || !ba.length)) {\n            return\n        };\n        var ca = i.USER_GENERATED_MESSAGE;\n        ba.forEach(function(da) {\n            if (((da.action_type == ca) && (da.author != j.user))) {\n                v(da.thread_id, da.author);\n            };\n        });\n    });\n    e.exports = s;\n});\n__d(\"formatUnixTimestamp\", [\"formatDate\",], function(a, b, c, d, e, f) {\n    var g = b(\"formatDate\");\n    function h(i, j, k, l) {\n        var m = new Date((i * 1000));\n        return g(m, j, k, l);\n    };\n    e.exports = h;\n});\n__d(\"MercuryIndicatorController\", [\"ArbiterMixin\",\"DOM\",\"MercuryActionTypeConstants\",\"MercuryConfig\",\"MercuryDelayedRoger\",\"MercuryMessageSourceTags\",\"MercuryParticipants\",\"MercuryRoger\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"DateFormatConfig\",\"arrayContains\",\"copyProperties\",\"formatUnixTimestamp\",\"removeFromArray\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryConfig\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryMessageSourceTags\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryRoger\"), o = b(\"MercuryThreads\").get(), p = b(\"MercuryTypingReceiver\"), q = b(\"DateFormatConfig\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = b(\"formatUnixTimestamp\"), u = b(\"removeFromArray\"), v = b(\"tx\"), w = [];\n    function x(y) {\n        this._threadID = y;\n        this._canonicalUser = o.getCanonicalUserInThread(y);\n        w.push(this);\n    };\n    s(x.prototype, g, {\n        destroy: function() {\n            u(w, this);\n        },\n        setLastMessage: function(y) {\n            this._lastMsg = y;\n            this._handleStateChange();\n        },\n        _informStateChanged: function(y) {\n            if (((y.activity == \"none\") && (this._currentActivity == \"none\"))) {\n                return\n            };\n            if ((this._lastMsg && m.isAuthor(this._lastMsg.author))) {\n                y.self_authored = true;\n            };\n            this._currentActivity = y.activity;\n            this.inform(\"state-changed\", y);\n        },\n        _notifySentFrom: function() {\n            var y, z, aa = this._lastMsg.location_text, ba = (this._lastMsg.source_tags || []);\n            if (aa) {\n                y = v._(\"Sent from {location}\", {\n                    location: aa\n                });\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MESSENGER)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile/messenger\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Messenger\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MOBILE)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Mobile\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.EMAIL)) {\n                y = \"Sent from email\";\n                z = \"sentFromEmail\";\n            }\n             else {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n            \n            \n            \n        ;\n            this._informStateChanged({\n                activity: z,\n                text: y\n            });\n        },\n        _notifySeenTimestamp: function(y) {\n            var z = (n.getSeenTimestamp(this._threadID, y[0]) * 45986), aa = (Date.now() * 46005);\n            if ((z < (aa - 518400))) {\n                ba = \"M j\";\n            }\n             else if ((z < (aa - 86400))) {\n                ba = \"D g:ia\";\n            }\n             else ba = \"g:ia\";\n            \n        ;\n            var ba = (q.formats[ba] || ba), ca = t(z, ba, false, true);\n            this._informStateChanged({\n                activity: \"seen-timestamp\",\n                text: v._(\"Seen {timestamp}\", {\n                    timestamp: ca\n                })\n            });\n        },\n        _checkNamesForCollision: function(y, z) {\n            var aa = false;\n            m.getMulti(y, function(ba) {\n                function ca(fa) {\n                    if ((typeof ba[fa] !== \"undefined\")) {\n                        return ba[fa].short_name.toLowerCase();\n                    }\n                     else return fa\n                ;\n                };\n                var da = z.map(ca), ea = y.map(ca);\n                aa = da.some(function(fa) {\n                    return (ea.indexOf(fa) !== ea.lastIndexOf(fa));\n                });\n            });\n            return aa;\n        },\n        _notifySeenBy: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if ((this._lastMsg != z)) {\n                    return\n                };\n                var ca = o.getThreadMetaNow(this._threadID), da = (ca ? ca.participants.length : 0), ea = (y.length + ((z.author != m.user))), fa, ga = false, ha = false, ia = ((da > 2) && (ea >= (da - 1)));\n                if ((!(ia) && (da > 0))) {\n                    ha = this._checkNamesForCollision(ca.participants, y);\n                };\n                if (ia) {\n                    fa = \"Seen by everyone\";\n                }\n                 else if ((y.length == 1)) {\n                    fa = v._(\"Seen by {user}\", {\n                        user: ba[y[0]].short_name\n                    });\n                }\n                 else if ((y.length == 2)) {\n                    fa = v._(\"Seen by {user1}, {user2}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name\n                    });\n                }\n                 else if ((y.length == 3)) {\n                    fa = v._(\"Seen by {user1}, {user2}, {user3}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        user3: ba[y[2]].short_name\n                    });\n                }\n                 else if ((y.length > 3)) {\n                    var ja = (Object.keys(ba).length - 2), ka = v._(\"{num} more\", {\n                        num: ja\n                    }), la = h.create(\"span\", {\n                        className: \"more\"\n                    }, ka);\n                    fa = h.tx._(\"Seen by {user1}, {user2}, {=num more link}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        \"=num more link\": la\n                    });\n                    ga = true;\n                }\n                \n                \n                \n                \n            ;\n                ga = (ga || ha);\n                this._informStateChanged({\n                    activity: \"seen-by\",\n                    text: fa,\n                    seenBy: y,\n                    hasNameCollision: ha,\n                    tooltip: ga\n                });\n            }.bind(this));\n            (aa && this._informStateChanged({\n                activity: \"none\"\n            }));\n        },\n        _notifyTyping: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if ((this._lastMsg != z)) {\n                    return\n                };\n                if ((this._canonicalUser || j.ChatMultiTypGK)) {\n                    var ca = o.getThreadMetaNow(this._threadID), da = (ca ? ca.participants.length : 0), ea, fa = false;\n                    if (((da > 2) && (y.length >= (da - 1)))) {\n                        ea = \"Everyone is typing...\";\n                    }\n                     else if ((y.length == 1)) {\n                        ea = v._(\"{name} is typing...\", {\n                            name: ba[y[0]].short_name\n                        });\n                    }\n                     else if ((y.length == 2)) {\n                        ea = v._(\"{user1} and {user2} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name\n                        });\n                    }\n                     else if ((y.length == 3)) {\n                        ea = v._(\"{user1}, {user2}, and {user3} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            user3: ba[y[2]].short_name\n                        });\n                    }\n                     else if ((y.length > 3)) {\n                        var ga = (Object.keys(ba).length - 2), ha = v._(\"{num} more\", {\n                            num: ga\n                        }), ia = h.create(\"a\", {\n                            href: \"#\"\n                        }, ha);\n                        ea = h.tx._(\"{user1}, {user2}, and {=num more link} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            \"=num more link\": ia\n                        });\n                        fa = true;\n                    }\n                    \n                    \n                    \n                    \n                ;\n                    this._informStateChanged({\n                        activity: \"typing\",\n                        text: ea,\n                        typing: y,\n                        tooltip: fa\n                    });\n                }\n            ;\n            }.bind(this));\n            (aa && this._informStateChanged({\n                activity: \"none\"\n            }));\n        },\n        _handleStateChange: function() {\n            var y = i.LOG_MESSAGE;\n            if ((!this._lastMsg || (this._lastMsg.action_type == y))) {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n        ;\n            if ((this._typing && this._typing.length)) {\n                this._notifyTyping(this._typing);\n                return;\n            }\n        ;\n            if ((this._canonicalUser && (this._lastMsg.author != m.user))) {\n                this._notifySentFrom();\n                return;\n            }\n        ;\n            var z = k.getSeenBy(this._threadID, true);\n            if (z.length) {\n                if (this._canonicalUser) {\n                    this._notifySeenTimestamp(z);\n                    return;\n                }\n                 else {\n                    this._notifySeenBy(z);\n                    return;\n                }\n            \n            };\n            this._informStateChanged({\n                activity: \"none\"\n            });\n        }\n    });\n    p.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            var ba = z[aa._threadID];\n            if ((ba !== undefined)) {\n                aa._typing = ba;\n                aa._handleStateChange();\n            }\n        ;\n        });\n    });\n    k.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            (z[aa._threadID] && aa._handleStateChange());\n        });\n    });\n    e.exports = x;\n});\n__d(\"MercuryLastMessageIndicator\", [\"CSS\",\"MercuryIndicatorController\",\"DOM\",\"MercuryParticipants\",\"Tooltip\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"MercuryIndicatorController\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"Tooltip\"), l = b(\"copyProperties\"), m = b(\"csx\"), n = b(\"cx\");\n    function o(p, q, r, s) {\n        this._lastMessageIndicator = q;\n        this._hideTyping = (r || false);\n        this._messagesView = s;\n        this._controller = new h(p);\n        this._subscription = this._controller.subscribe(\"state-changed\", this._handleStateChanged.bind(this));\n    };\n    l(o.prototype, {\n        destroy: function() {\n            this._setClass(null);\n            this._subscription.unsubscribe();\n            this._controller.destroy();\n        },\n        setLastMessage: function(p) {\n            this._controller.setLastMessage(p);\n        },\n        _handleStateChanged: function(p, q) {\n            var r = this._messagesView.isScrolledToBottom();\n            this._rerender(q);\n            (r && this._messagesView.scrollToBottom());\n        },\n        _rerender: function(p) {\n            if ((p.activity == \"none\")) {\n                this._setClass(null);\n                return;\n            }\n        ;\n            if ((this._hideTyping && (p.activity == \"typing\"))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n            g.conditionClass(this._lastMessageIndicator, \"-cx-PRIVATE-mercuryLastMessageIndicator__selfauthored\", p.self_authored);\n            var q = i.find(this._lastMessageIndicator, \".-cx-PRIVATE-mercuryLastMessageIndicator__text\");\n            if (p.text) {\n                i.setContent(q, p.text);\n            }\n             else i.empty(q);\n        ;\n            if ((p.activity.substring(0, 4) == \"seen\")) {\n                this._setClass(\"seen\");\n                if (((p.activity == \"seen-by\") && p.tooltip)) {\n                    j.getMulti(p.seenBy, function(r) {\n                        var s = i.create(\"div\");\n                        for (var t in r) {\n                            var u = i.create(\"div\");\n                            i.setContent(u, r[t].name);\n                            i.appendContent(s, u);\n                        };\n                        var v = p.hasNameCollision, w;\n                        if (v) {\n                            w = this._lastMessageIndicator;\n                        }\n                         else w = i.find(this._lastMessageIndicator, \"span.more\");\n                    ;\n                        k.set(w, s, \"above\", \"center\");\n                    }.bind(this));\n                }\n                 else k.remove(this._lastMessageIndicator);\n            ;\n            }\n             else this._setClass(p.activity);\n        ;\n        },\n        _setClass: function(p) {\n            if ((this._lastClass === p)) {\n                return\n            };\n            (this._lastClass && g.removeClass(this._lastMessageIndicator, this._lastClass));\n            (p && g.addClass(this._lastMessageIndicator, p));\n            this._lastClass = p;\n        }\n    });\n    e.exports = o;\n});\n__d(\"MercuryStateCheck\", [\"Arbiter\",\"ChannelConstants\",\"MercuryFolders\",\"MessagingTag\",\"MercuryServerRequests\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryFolders\"), j = b(\"MessagingTag\"), k = b(\"MercuryServerRequests\").get(), l = b(\"URI\"), m = b(\"copyProperties\"), n = m(new g(), {\n        initialize: function() {\n            g.subscribe(h.ON_INVALID_HISTORY, o);\n            d([\"ChannelConnection\",], function(p) {\n                p.subscribe(p.CONNECTED, function(q, r) {\n                    if (!r.init) {\n                        o();\n                    };\n                });\n            });\n        }\n    });\n    function o() {\n        var p;\n        if ((l.getRequestURI().getPath().search(/messages/) !== -1)) {\n            p = i.getSupportedFolders();\n        }\n         else p = [j.INBOX,];\n    ;\n        k.fetchMissedMessages(p);\n    };\n    n.initialize();\n    e.exports = n;\n});\n__d(\"MercuryAttachmentRenderer\", [\"MercuryAttachmentTemplates\",\"MercuryAttachmentAudioClip.react\",\"CSS\",\"MercuryConstants\",\"DOM\",\"Image.react\",\"JSXDOM\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessages\",\"MercuryParticipants\",\"React\",\"Style\",\"URI\",\"UserAgent\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentTemplates\"), h = b(\"MercuryAttachmentAudioClip.react\"), i = b(\"CSS\"), j = b(\"MercuryConstants\"), k = b(\"DOM\"), l = b(\"Image.react\"), m = b(\"JSXDOM\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryMessages\").get(), q = b(\"MercuryParticipants\"), r = b(\"React\"), s = b(\"Style\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"cx\"), w = b(\"tx\"), x = (u.ie() <= 8);\n    function y(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.name), ea = da.getNode(\"link\");\n        ea.setAttribute(\"href\", ba.url);\n        (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n    function z(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.name);\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n    var aa = {\n        renderAttachment: function(ba, ca, da, ea, fa) {\n            var ga = 100, ha = (ba ? 160 : 400), ia = ca.attach_type, ja = null, ka = null, la = true, ma = j.MercurySupportedShareType;\n            if ((ia == o.ERROR)) {\n                ja = aa.renderError(ca);\n            };\n            if (((!ba && (ia == o.SHARE)) && ca.share_xhp)) {\n                ka = aa.renderShareXHP(ca, da.id);\n            };\n            if ((ia == o.STICKER)) {\n                la = false;\n                ka = aa.renderSticker(ca);\n            }\n        ;\n            if ((!ka && (ia == o.SHARE))) {\n                var na = ca.share_data_type;\n                switch (na) {\n                  case ma.FB_PHOTO:\n                    ka = aa.renderPreview(ca, da, ea, fa);\n                    break;\n                  case ma.FB_VIDEO:\n                    ka = aa.renderVideoThumb(ca);\n                    break;\n                  case ma.FB_MUSIC_ALBUM:\n                \n                  case ma.FB_SONG:\n                \n                  case ma.FB_PLAYLIST:\n                \n                  case ma.FB_MUSICIAN:\n                \n                  case ma.FB_RADIO_STATION:\n                    ka = aa.renderMusic(ca);\n                    break;\n                  case ma.EXTERNAL:\n                \n                  case ma.FB_TEMPLATE:\n                \n                  case ma.FB_COUPON:\n                \n                  case ma.FB_SOCIAL_REPORT_PHOTO:\n                    ka = aa.renderExternalLink(ca);\n                    break;\n                  default:\n                    if (ca.name) {\n                        ka = aa.renderShareLink(ca, (da && da.id), ba);\n                    };\n                    break;\n                };\n            }\n        ;\n            if ((!ka && ca.preview_loading)) {\n                ka = aa.renderPreview(null);\n            };\n            if ((!ka && ca.preview_url)) {\n                ka = aa.renderPreview(ca, da, ea, fa);\n            };\n            if ((!ka && (ia == o.FILE))) {\n                if ((ca.metadata && (ca.metadata.type == j.MercuryAttachmentAudioClip))) {\n                    ka = k.create(\"div\");\n                    var oa = aa.renderAudioClip(ca, da.message_id, ga, ha);\n                    r.renderComponent(oa, ka);\n                }\n                 else ka = (ba ? aa.renderFileLink(ca) : aa.renderExtendedFileLink(ca));\n            \n            };\n            return {\n                error: ja,\n                content: ka,\n                bubblePreferred: la\n            };\n        },\n        renderError: function(ba) {\n            var ca = g[\":fb:mercury:attachment:error\"].build();\n            k.appendContent(ca.getNode(\"error\"), ba.error_msg);\n            return ca.getRoot();\n        },\n        renderExternalLink: function(ba) {\n            var ca = g[\":fb:mercury:attachment:external-link\"].build().setNodeContent(\"name\", ba.name);\n            (ba.base_url && ca.setNodeContent(\"shortLink\", ba.base_url));\n            var da = ca.getNode(\"preview\"), ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n            if (ba.preview_url) {\n                var fa = ca.getNode(\"preview-image\");\n                fa.setAttribute(\"src\", ba.preview_url);\n                i.addClass(da, ba.preview_class);\n                i.show(fa);\n            }\n             else {\n                i.addClass(ca.getRoot(), \"noMedia\");\n                i.hide(da);\n            }\n        ;\n            ca.getNode(\"name\").setAttribute(\"href\", ba.url);\n            d([\"LinkshimHandler\",], function(ga) {\n                ga.setUpLinkshimHandling(ca.getNode(\"name\"));\n                ga.setUpLinkshimHandling(ca.getNode(\"image-link\"));\n            });\n            if (ba.rel) {\n                ca.getNode(\"name\").setAttribute(\"rel\", ba.rel);\n            };\n            return ca.getRoot();\n        },\n        renderFileLink: function(ba) {\n            var ca = null;\n            if ((ba.url === \"\")) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n             else {\n                ca = \":fb:mercury:attachment:file-link\";\n                return y(ba, ca).getRoot();\n            }\n        ;\n        },\n        renderAudioClip: function(ba, ca, da, ea) {\n            var fa = (ba.metadata.duration / 1000), ga = 200;\n            if ((da && ea)) {\n                if ((fa < 5)) {\n                    ga = da;\n                }\n                 else ga = ((((1 - Math.pow(10, (((fa - 5)) / -30)))) * ((ea - da))) + da);\n            \n            };\n            return h({\n                src: ba.url,\n                duration: (ba.metadata.duration / 1000),\n                showHelp: false,\n                width: ga\n            });\n        },\n        renderExtendedFileLink: function(ba) {\n            var ca = null;\n            if ((ba.url === \"\")) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n        ;\n            var ca = \":fb:mercury:attachment:extended-file-link\", da = y(ba, ca);\n            if (ba.open_url) {\n                var ea = da.getNode(\"openLinkContainer\");\n                i.show(ea);\n                var fa = da.getNode(\"openFile\");\n                fa.setAttribute(\"href\", ba.open_url);\n            }\n        ;\n            var ga = da.getNode(\"downloadFile\");\n            ga.setAttribute(\"href\", ba.url);\n            (ba.rel && ga.setAttribute(\"rel\", ba.rel));\n            return da.getRoot();\n        },\n        renderMusic: function(ba) {\n            var ca = g[\":fb:mercury:attachment:music\"].build().setNodeContent(\"filename\", ba.name), da = ca.getNode(\"link\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"target\", \"_blank\");\n            (ba.rel && da.setAttribute(\"rel\", ba.rel));\n            var ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n            var fa = ca.getNode(\"preview-image\");\n            fa.setAttribute(\"src\", ba.preview_url);\n            i.show(fa);\n            i.addClass(ca.getNode(\"icon_link\"), \"MercuryMusicIcon\");\n            return ca.getRoot();\n        },\n        resizeContain: function(ba, ca) {\n            var da = (ba.width / ba.height), ea = (ca.width / ca.height);\n            if ((ea < da)) {\n                return {\n                    width: Math.min((ba.height * ea), ca.width),\n                    height: Math.min(ba.height, ca.height)\n                };\n            }\n             else return {\n                width: Math.min(ba.width, ca.width),\n                height: Math.min((ba.width / ea), ca.height)\n            }\n        ;\n        },\n        renderPreview: function(ba, ca, da, ea) {\n            var fa = g[\":fb:mercury:attachment:preview\"].build(), ga = fa.getNode(\"image-link\");\n            if (ba) {\n                (ba.url && ga.setAttribute(\"href\", ba.url));\n                (ba.rel && ga.setAttribute(\"rel\", ba.rel));\n                var ha;\n                if (ba.preview_uploading) {\n                    i.addClass(ga, \"-cx-PRIVATE-mercuryImages__uploading\");\n                    if ((da >= 176)) {\n                        ha = \"/images/photos/dots_large.png\";\n                    }\n                     else if ((da >= 86)) {\n                        ha = \"/images/photos/dots_medium.png\";\n                    }\n                     else ha = \"/images/photos/dots_small.png\";\n                    \n                ;\n                    s.set(ga, \"width\", (da + \"px\"));\n                    s.set(ga, \"max-width\", (da + \"px\"));\n                    if ((ba.preview_width && ba.preview_height)) {\n                        s.set(ga, \"padding-bottom\", (((((ba.preview_height / ba.preview_width)) * 100)) + \"%\"));\n                    };\n                }\n                 else if ((ba.metadata && ba.metadata.fbid)) {\n                    ha = t(\"/ajax/mercury/attachments/photo.php\").addQueryData({\n                        fbid: ba.metadata.fbid,\n                        mode: ea,\n                        width: da,\n                        height: da\n                    }).toString();\n                }\n                 else ha = t(ba.preview_url).addQueryData({\n                    mode: ea,\n                    width: da,\n                    height: da\n                }).toString();\n                \n            ;\n                var ia = fa.getNode(\"preview-image\");\n                if (ha) {\n                    if ((((ea === \"contain\") && ba.preview_width) && ba.preview_height)) {\n                        var ja = aa.resizeContain({\n                            width: da,\n                            height: da\n                        }, {\n                            width: ba.preview_width,\n                            height: ba.preview_height\n                        });\n                        ia.setAttribute(\"width\", ja.width);\n                        ia.setAttribute(\"height\", ja.height);\n                    }\n                ;\n                    if ((ba.preview_uploading || (((ea === \"cover\") && !x)))) {\n                        i.addClass(ga, \"-cx-PRIVATE-mercuryImages__usebackgroundimage\");\n                        s.set(ga, \"backgroundImage\", ((\"url(\" + ha) + \")\"));\n                    }\n                     else {\n                        ia.onload = function() {\n                            ia.removeAttribute(\"width\");\n                            ia.removeAttribute(\"height\");\n                        };\n                        ia.setAttribute(\"src\", ha);\n                    }\n                ;\n                }\n            ;\n                if (ca) {\n                    this.renderReportRespondLink(fa.getRoot(), ba, ca.message_id);\n                };\n            }\n             else i.addClass(ga, \"-cx-PUBLIC-mercuryImages__loading\");\n        ;\n            return fa.getRoot();\n        },\n        renderShareLink: function(ba, ca, da) {\n            var ea = g[\":fb:mercury:attachment:share-link\"].build().setNodeContent(\"name\", ba.name), fa = ea.getNode(\"link\");\n            fa.setAttribute(\"href\", ba.url);\n            (ba.rel && fa.setAttribute(\"rel\", ba.rel));\n            return ea.getRoot();\n        },\n        renderVideoThumb: function(ba) {\n            var ca = g[\":fb:mercury:attachment:video-thumb\"].build(), da = ca.getNode(\"thumb\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"rel\", ba.rel);\n            var ea = k.find(ca.getRoot(), \"img\");\n            ea.src = ba.preview_url;\n            return ca.getRoot();\n        },\n        renderShareXHP: function(ba, ca) {\n            var da = k.create(\"div\");\n            if (ba) {\n                k.appendContent(da, ba.share_xhp);\n                this.renderReportRespondLink(da, ba, ca);\n            }\n        ;\n            return da;\n        },\n        renderSticker: function(ba) {\n            var ca = k.create(\"div\"), da = {\n                uri: ba.url,\n                width: ba.metadata.width,\n                height: ba.metadata.height\n            }, ea = l({\n                className: \"mvs\",\n                src: da\n            });\n            r.renderComponent(ea, ca);\n            return ca;\n        },\n        renderReportRespondLink: function(ba, ca, da) {\n            if (!ca.is_social_report_attachment) {\n                return null\n            };\n            switch (ca.share_data_type) {\n              case j.MercurySupportedShareType.FB_PHOTO:\n                break;\n              case j.MercurySupportedShareType.FB_SOCIAL_REPORT_PHOTO:\n                return null;\n              default:\n                return null;\n            };\n            var ea = null;\n            if (da) {\n                ea = p.getMessagesFromIDs([da,])[0];\n            };\n            if (!ea) {\n                return null\n            };\n            if ((ea.author === q.user)) {\n                return null\n            };\n            var fa = null;\n            q.get(ea.author, function(ga) {\n                fa = k.create(\"a\", {\n                    rel: \"dialog-post\",\n                    className: \"-cx-PRIVATE-fbChatMessage__socialreportlink\",\n                    id: \"respond-link\",\n                    ajaxify: t(\"/ajax/report/social_resolution/photo/\").setQueryData({\n                        attachment_fbid: ca.attach_id,\n                        photo_fbid: ca.shared_object_id,\n                        sender_id: q.getUserID(ga.id)\n                    }).toString()\n                });\n                k.setContent(fa, w._(\"Respond to {name}'s request\", {\n                    name: ga.name\n                }));\n                k.appendContent(ba, fa);\n            });\n        },\n        renderPhotoAttachments: function(ba, ca, da, ea) {\n            var fa = ba.length;\n            if (!fa) {\n                return null\n            };\n            var ga = m.div({\n                className: \"-cx-PRIVATE-mercuryImages__photoattachment\"\n            }), ha = (m.div({\n                className: \"-cx-PUBLIC-fbChatMessage__resetpadding\"\n            }, ga));\n            if ((fa === 1)) {\n                var ia = aa.renderPreview(ba[0], ca, da, \"contain\");\n                k.appendContent(ga, ia);\n                return ha;\n            }\n        ;\n            var ja = ((((fa == 2) || (fa == 4))) ? 2 : 3), ka = (((da - (((ja - 1)) * ea))) / ja), la = Math.ceil((fa / ja)), ma = ((la * ka) + (((la - 1)) * ea)), na = (m.div({\n                className: \"-cx-PRIVATE-mercuryImages__grid\",\n                style: ((\"padding-bottom: \" + (((ma / da) * 100))) + \"%;\")\n            }));\n            k.appendContent(ga, na);\n            for (var oa = 0; (oa < fa); ++oa) {\n                var pa = aa.renderPreview(ba[oa], ca, ka, \"cover\"), qa = (oa % ja), ra = Math.floor((oa / ja));\n                i.addClass(pa, \"-cx-PRIVATE-mercuryImages__griditem\");\n                s.apply(pa, {\n                    width: ((((ka / da) * 100)) + \"%\"),\n                    left: ((((((qa * ((ka + ea)))) / da) * 100)) + \"%\"),\n                    top: ((((((ra * ((ka + ea)))) / ma) * 100)) + \"%\")\n                });\n                k.appendContent(na, pa);\n            };\n            return ha;\n        },\n        isPhotoAttachment: function(ba) {\n            return ((ba.attach_type == o.PHOTO) || (((ba.attach_type == o.FILE) && ba.preview_url)));\n        },\n        isShareAttachment: function(ba) {\n            return (ba.attach_type == o.SHARE);\n        },\n        isFileAttachment: function(ba) {\n            return (ba.attach_type == o.FILE);\n        },\n        isErrorAttachment: function(ba) {\n            return (ba.attach_type == o.ERROR);\n        },\n        booleanLexicographicComparator: function(ba) {\n            return function(ca, da) {\n                for (var ea = 0; (ea < ba.length); ++ea) {\n                    var fa = ba[ea](ca), ga = ba[ea](da);\n                    if ((fa && !ga)) {\n                        return -1;\n                    }\n                     else if ((!fa && ga)) {\n                        return 1\n                    }\n                ;\n                };\n                return 0;\n            };\n        }\n    };\n    e.exports = aa;\n});\n__d(\"URLScraper\", [\"ArbiterMixin\",\"DataStore\",\"Event\",\"URLMatcher\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DataStore\"), i = b(\"Event\"), j = b(\"URLMatcher\"), k = b(\"copyProperties\"), l = \"scraperLastPermissiveMatch\";\n    function m(n) {\n        this.input = n;\n        this.enable();\n    };\n    k(m.prototype, g, {\n        reset: function() {\n            h.set(this.input, l, null);\n        },\n        enable: function() {\n            if (this.events) {\n                return\n            };\n            var n = function(o) {\n                setTimeout(this.check.bind(this, o), 30);\n            };\n            this.events = i.listen(this.input, {\n                paste: n.bind(this, false),\n                keydown: n.bind(this, true)\n            });\n        },\n        disable: function() {\n            if (!this.events) {\n                return\n            };\n            for (var event in this.events) {\n                this.events[event].remove();;\n            };\n            this.events = null;\n        },\n        check: function(n) {\n            var o = this.input.value;\n            if ((n && m.trigger(o))) {\n                return\n            };\n            var p = m.match(o), q = j.permissiveMatch(o);\n            if ((q && ((q != h.get(this.input, l))))) {\n                h.set(this.input, l, q);\n                this.inform(\"match\", {\n                    url: (p || q),\n                    alt_url: q\n                });\n            }\n        ;\n        }\n    });\n    k(m, j);\n    e.exports = m;\n});\n__d(\"htmlHyperlink\", [\"Env\",\"htmlize\",\"UntrustedLink\",\"URI\",\"URLScraper\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"htmlize\"), i = b(\"UntrustedLink\"), j = b(\"URI\"), k = b(\"URLScraper\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        if (((typeof n === \"undefined\") || !n.toString)) {\n            return \"\"\n        };\n        if ((typeof o !== \"function\")) {\n            o = h;\n        };\n        if ((typeof p !== \"function\")) {\n            p = h;\n        };\n        var n = n.toString(), r = [], s;\n        while ((s = k.match(n))) {\n            var t = n.indexOf(s);\n            if ((t >= 0)) {\n                r.push(o(n.substring(0, t)));\n            };\n            var u = p(s), v = s.replace(/\"/g, \"%22\");\n            if (!(/^[a-z][a-z0-9\\-+.]+:\\/\\//i.test(s))) {\n                v = (\"http://\" + v);\n            };\n            if (j.isValidURI(v)) {\n                r.push(((((((\"\\u003Ca target=\\\"_blank\\\" rel=\\\"nofollow\\\" \" + \"class=\\\"\") + \"-cx-PUBLIC-fbHTMLHyperlink__link\") + \"\\\" \") + \"href=\\\"\") + v) + \"\\\"\"));\n                if ((q && !j(v).isFacebookURI())) {\n                    a.UntrustedLink = i;\n                    r.push(((\" onmousedown=\\\"UntrustedLink.bootstrap(this, '\" + g.lhsh) + \"', event)\\\"\"));\n                }\n            ;\n                r.push(((\"\\u003E\" + u) + \"\\u003C/a\\u003E\"));\n            }\n             else r.push(u);\n        ;\n            n = n.substring((t + s.length));\n        };\n        (n && r.push(o(n)));\n        return r.join(\"\");\n    };\n    e.exports = m;\n});\n__d(\"MercuryMessageRenderer\", [\"MercuryAttachmentRenderer\",\"CSS\",\"DOM\",\"DOMQuery\",\"HTML\",\"MercuryEmoji\",\"MercuryLogMessageType\",\"MercuryParticipants\",\"Tooltip\",\"cx\",\"htmlHyperlink\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentRenderer\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"HTML\"), l = b(\"MercuryEmoji\"), m = b(\"MercuryLogMessageType\"), n = b(\"MercuryParticipants\"), o = b(\"Tooltip\"), p = b(\"cx\"), q = b(\"htmlHyperlink\"), r = b(\"tx\"), s = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",], t = {\n        renderDate: function(ma) {\n            var na = new Date();\n            na.setHours(0);\n            na.setMinutes(0);\n            na.setSeconds(0);\n            na.setMilliseconds(0);\n            var oa = (((24 * 60) * 60) * 1000), pa = (na.getTime() - ma.getTime());\n            if ((pa <= 0)) {\n                return \"Today\";\n            }\n             else if ((pa < oa)) {\n                return \"Yesterday\"\n            }\n        ;\n            var qa = s[ma.getMonth()], ra = ma.getDate(), sa = ma.getFullYear();\n            if ((sa != na.getFullYear())) {\n                return r._(\"{month} {date}, {year}\", {\n                    month: qa,\n                    date: ra,\n                    year: sa\n                });\n            }\n             else return r._(\"{month} {date}\", {\n                month: qa,\n                date: ra\n            })\n        ;\n        },\n        renderTooltipFlyout: function(ma, na) {\n            na.forEach(function(oa) {\n                var pa = i.create(\"div\");\n                i.setContent(pa, oa.name);\n                i.appendContent(ma, pa);\n            });\n        },\n        renderLogMessage: function(ma, na, oa, pa) {\n            w(ma, pa);\n            x(na, pa);\n            y(oa, pa);\n        },\n        formatMessageBody: function(ma, na, oa) {\n            var pa = ((ma || \"\")).replace(/\\s+$/, \"\");\n            if (!na) {\n                return v(pa, false, oa)\n            };\n            var qa = Object.keys(na).map(function(ta) {\n                return window.parseInt(ta);\n            }).sort(function(ta, ua) {\n                return (ta - ua);\n            }), ra = [], sa = 0;\n            qa.forEach(function(ta) {\n                var ua = pa.slice(sa, ta);\n                if (ua) {\n                    ra.push(v(ua, false, oa));\n                };\n                sa = (ta + na[ta].length);\n                var va = pa.slice(ta, sa);\n                if (va) {\n                    ra.push(v(va, true, oa));\n                };\n            });\n            if ((sa < pa.length)) {\n                ra.push(v(pa.slice(sa), false, oa));\n            };\n            return ((ra.length === 0) ? null : ((ra.length === 1) ? ra[0] : i.create(\"span\", {\n            }, ra)));\n        }\n    };\n    function u(ma, na) {\n        var oa = ma.replace(/\\r\\n?/g, \"\\u000a\").split(/\\n{2,}/), pa = [];\n        for (var qa = 0; (qa < oa.length); qa++) {\n            var ra = oa[qa];\n            if (ra.length) {\n                pa.push(\"\\u003Cp\\u003E\");\n                pa.push(na(ra));\n                pa.push(\"\\u003C/p\\u003E\");\n            }\n        ;\n        };\n        return pa.join(\"\");\n    };\n    function v(ma, na, oa) {\n        var pa = null;\n        if (((ma.length === 0) && !na)) {\n            return pa\n        };\n        function qa(ra) {\n            return q(ra, l.htmlEmojiAndEmote, null, true);\n        };\n        pa = (oa ? u(ma, qa) : qa(ma));\n        if (na) {\n            return i.create(\"span\", {\n                className: \"highlight\"\n            }, k(pa))\n        };\n        return k(pa);\n    };\n    function w(ma, na) {\n        var oa = \"\", pa;\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n        \n          case m.JOINABLE_JOINED:\n        \n          case m.SUBSCRIBE:\n            oa = \"mercurySubscribeIcon\";\n            break;\n          case m.UNSUBSCRIBE:\n            oa = \"mercuryUnsubscribeIcon\";\n            break;\n          case m.THREAD_NAME:\n            oa = \"mercuryThreadNameIcon\";\n            break;\n          case m.THREAD_IMAGE:\n            oa = \"mercuryThreadImageIcon\";\n            break;\n          case m.VIDEO_CALL:\n            pa = na.log_message_data.answered;\n            if ((pa || la(na))) {\n                oa = \"mercuryVideoCallIcon\";\n            }\n             else oa = \"mercuryMissedVideoCallIcon\";\n        ;\n            break;\n          case m.PHONE_CALL:\n            pa = na.log_message_data.answered;\n            if (pa) {\n                oa = \"mercuryPhoneCallIcon\";\n            }\n             else oa = \"mercuryMissedPhoneCallIcon\";\n        ;\n            break;\n          case m.SERVER_ERROR:\n            oa = \"mercuryErrorIcon\";\n            break;\n        };\n        h.addClass(ma, oa);\n    };\n    function x(ma, na) {\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n            da(ma, na);\n            break;\n          case m.JOINABLE_JOINED:\n            ea(ma, na);\n            break;\n          case m.SUBSCRIBE:\n            ia(ma, na);\n            break;\n          case m.UNSUBSCRIBE:\n            ja(ma, na);\n            break;\n          case m.VIDEO_CALL:\n            if (la(na)) {\n                z(ma, na);\n            }\n             else ba(ma, na);\n        ;\n            break;\n          case m.PHONE_CALL:\n            aa(ma, na);\n            break;\n          case m.THREAD_NAME:\n            ca(ma, na);\n            break;\n          case m.THREAD_IMAGE:\n            fa(ma, na);\n            break;\n          case m.SERVER_ERROR:\n            ka(ma, na);\n            break;\n        };\n    };\n    function y(ma, na) {\n        var oa = na.log_message_type;\n        if ((oa == m.THREAD_IMAGE)) {\n            var pa = na.log_message_data.image;\n            if (pa) {\n                var qa = g.renderPreview((pa.preview_url ? pa : null));\n                i.setContent(ma, qa);\n                h.addClass(qa, \"-cx-PRIVATE-mercuryImages__logmessageattachment\");\n                h.show(ma);\n            }\n        ;\n        }\n    ;\n    };\n    var z = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa = i.create(\"span\", {\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, oa.short_name), qa;\n            switch (na.log_message_data.event_name) {\n              case \"installing\":\n                qa = i.tx._(\"{firstname} is setting up video calling...\", {\n                    firstname: pa\n                });\n                break;\n              case \"installed\":\n                qa = i.tx._(\"{firstname} finished setting up video calling.\", {\n                    firstname: pa\n                });\n                break;\n              case \"install_canceled\":\n                qa = i.tx._(\"You canceled the video calling installation. \", {\n                    firstname: pa\n                });\n                break;\n            };\n            if (qa) {\n                i.setContent(ma, qa);\n            };\n        });\n    }, aa = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if ((oa == n.user)) {\n                var sa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            }\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ba = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if ((oa == n.user)) {\n                var sa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            }\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ca = function(ma, na) {\n        var oa = na.log_message_data.name, pa = i.create(\"b\", {\n        }, oa);\n        if ((na.author == n.user)) {\n            if (oa) {\n                i.setContent(ma, i.tx._(\"You named the conversation: {name}.\", {\n                    name: pa\n                }));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation name.\"));\n        ;\n        }\n         else n.get(na.author, function(qa) {\n            var ra, sa = ga(qa);\n            if (oa) {\n                ra = i.tx._(\"{actor} named the conversation: {name}.\", {\n                    actor: sa,\n                    name: pa\n                });\n            }\n             else ra = i.tx._(\"{actor} removed the conversation name.\", {\n                actor: sa\n            });\n        ;\n            i.setContent(ma, ra);\n        });\n    ;\n    }, da = function(ma, na) {\n        if ((na.author == n.user)) {\n            i.setContent(ma, i.tx._(\"Other people can join this chat from News Feed and add their friends.\"));\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa);\n            i.setContent(ma, i.tx._(\"{actor} shared this chat to News Feed. Other people can join and add their friends.\", {\n                actor: pa\n            }));\n        });\n    ;\n    }, ea = function(ma, na) {\n        var oa = na.log_message_data.joined_participant;\n        if ((oa == n.user)) {\n            i.setContent(ma, i.tx._(\"You joined the chat. Other people can join from News Feed and add their friends.\"));\n        }\n         else n.get(oa, function(pa) {\n            var qa = ga(pa);\n            i.setContent(ma, i.tx._(\"{actor} joined the chat.\", {\n                actor: qa\n            }));\n        });\n    ;\n    }, fa = function(ma, na) {\n        if ((na.author == n.user)) {\n            if (na.log_message_data.image) {\n                i.setContent(ma, i.tx._(\"You changed the conversation picture.\"));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation picture.\"));\n        ;\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa), qa;\n            if (na.log_message_data.image) {\n                qa = i.tx._(\"{actor} changed the conversation picture.\", {\n                    actor: pa\n                });\n            }\n             else qa = i.tx._(\"{actor} removed the conversation picture.\", {\n                actor: pa\n            });\n        ;\n            i.setContent(ma, qa);\n        });\n    ;\n    }, ga = function(ma) {\n        if (ma.href) {\n            return i.create(\"a\", {\n                href: ma.href,\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, ma.name)\n        };\n        return ma.name;\n    }, ha = function(ma) {\n        var na = ma.indexOf(n.user);\n        if ((na > 0)) {\n            return ma.splice(na, 1).concat(ma)\n        };\n        return ma;\n    }, ia = function(ma, na) {\n        var oa = ha(na.log_message_data.added_participants), pa = null, qa;\n        if ((oa.length == 1)) {\n            pa = [na.author,oa[0],];\n            n.getMulti(pa, function(ra) {\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1}.\", {\n                        subscriber1: ga(ra[oa[0]])\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you.\", {\n                        actor: ga(ra[na.author])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]])\n                });\n                \n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if ((oa.length == 2)) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1} and {subscriber2}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you and {subscriber2}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1} and {subscriber2}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]])\n                });\n                \n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if ((oa.length == 3)) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {subscriber3}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    subscriber3: ga(ra[oa[2]])\n                });\n                \n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                var sa = i.tx._(\"{num} more\", {\n                    num: (oa.length - 2)\n                }), ta = i.create(\"span\", {\n                    className: \"more\"\n                }, sa), ua = i.create(\"div\");\n                t.renderTooltipFlyout(ua, oa.slice(2).map(function(wa) {\n                    return ra[wa];\n                }));\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {more_people}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {more_people}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {more_people}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    more_people: ta\n                });\n                \n            ;\n                i.setContent(ma, qa);\n                var va = j.find(ma, \"span.more\");\n                o.set(va, ua, \"above\", \"center\");\n            });\n        }\n        \n        \n    ;\n    }, ja = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa;\n            if ((na.author == n.user)) {\n                pa = i.tx._(\"You left the conversation.\");\n            }\n             else pa = i.tx._(\"{actor} left the conversation.\", {\n                actor: ga(oa)\n            });\n        ;\n            i.setContent(ma, pa);\n        });\n    }, ka = function(ma, na) {\n        var oa = \"We were unable to fetch previous messages in this conversation.\";\n        i.setContent(ma, oa);\n    }, la = function(ma) {\n        return ((ma.log_message_data.event_name === \"installing\") || (ma.log_message_data.event_name === \"install_canceled\"));\n    };\n    e.exports = t;\n});\n__d(\"MercurySheetPolicy\", [], function(a, b, c, d, e, f) {\n    var g = {\n        canReplaceOpenSheet: function(h, i) {\n            if ((h.getType() == i.getType())) {\n                return false\n            };\n            if ((h.isPermanent() && !i.isPermanent())) {\n                return false\n            };\n            return true;\n        }\n    };\n    e.exports = g;\n});\n__d(\"MercurySheetView\", [\"Animation\",\"ArbiterMixin\",\"MercurySheetPolicy\",\"CSS\",\"DOM\",\"Style\",\"MercurySheetTemplates\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"MercurySheetPolicy\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"MercurySheetTemplates\"), n = b(\"Vector\"), o = b(\"copyProperties\"), p = b(\"cx\"), q = 5000, r = function(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._tabMainElement = u;\n        this._openSheet = null;\n    };\n    o(r.prototype, h, {\n        destroy: function() {\n            k.empty(this._rootElement);\n        },\n        _openCommon: function(s, t) {\n            if ((this._openSheet && !i.canReplaceOpenSheet(this._openSheet, s))) {\n                if (s.couldNotReplace) {\n                    s.couldNotReplace();\n                };\n                return;\n            }\n        ;\n            this.clear(function() {\n                this._openSheet = s;\n                var u = m[\":fb:mercury:tab-sheet:loading\"].build().getRoot();\n                k.setContent(this._rootElement, u);\n                j.show(u);\n                j.show(this._rootElement);\n                s.render();\n                if (t) {\n                    j.addClass(this._tabMainElement, \"sheetSlide\");\n                    j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                    var v = n.getElementDimensions(this._rootElement).y;\n                    l.set(this._rootElement, \"bottom\", (v + \"px\"));\n                    this.inform(\"resize\");\n                    this._animation = new g(this._rootElement).to(\"bottom\", 0).duration(150).ease(g.ease.both).ondone(function() {\n                        j.removeClass(this._tabMainElement, \"sheetSlide\");\n                        j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                        this.inform(\"resize\");\n                    }.bind(this)).go();\n                }\n                 else this.inform(\"resize\");\n            ;\n                if (!s.isPermanent()) {\n                    var w = q;\n                    if (s.getCloseTimeout) {\n                        w = s.getCloseTimeout();\n                    };\n                    var x = this.getAutoCloseCallback(s);\n                    this._sheetCloseHandler = this.close.bind(this, s, x).defer(w, false);\n                    if (s.timeoutCanBeReset) {\n                        s.setResetTimeoutCallback(this.resetTimeout.bind(this));\n                    };\n                }\n            ;\n            }.bind(this));\n        },\n        getAutoCloseCallback: function(s) {\n            if (!s.autoCloseCallback) {\n                return null\n            };\n            return s.autoCloseCallback.bind(s);\n        },\n        resetTimeout: function(s, t) {\n            clearTimeout(this._sheetCloseHandler);\n            var u = this.getAutoCloseCallback(s);\n            this._sheetCloseHandler = this.close.bind(this, s, u).defer(t, false);\n        },\n        set: function(s) {\n            return this._openCommon(s, false);\n        },\n        open: function(s) {\n            return this._openCommon(s, true);\n        },\n        close: function(s, t) {\n            if ((this._openSheet != s)) {\n                return\n            };\n            if (!this._openSheet) {\n                (t && t());\n                return;\n            }\n        ;\n            if (this._animation) {\n                this._animation.stop();\n            };\n            if (this._sheetCloseHandler) {\n                clearTimeout(this._sheetCloseHandler);\n                this._sheetCloseHandler = null;\n            }\n        ;\n            j.addClass(this._tabMainElement, \"sheetSlide\");\n            j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n            var u = n.getElementDimensions(this._rootElement).y;\n            this.inform(\"resize\");\n            this._animation = new g(this._rootElement).to(\"bottom\", (u + \"px\")).duration(100).ease(g.ease.begin).ondone(function() {\n                k.empty(this._rootElement);\n                j.hide(this._rootElement);\n                j.removeClass(this._tabMainElement, \"sheetSlide\");\n                j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                this._openSheet = null;\n                this.inform(\"resize\");\n                (t && t());\n            }.bind(this)).go();\n        },\n        clear: function(s) {\n            this.close(this._openSheet, s);\n        }\n    });\n    e.exports = r;\n});\n__d(\"MercuryStickersData\", [\"Arbiter\",\"MercuryStickersInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryStickersInitialData\"), i = h.packs, j = {\n        getPacks: function() {\n            return i;\n        },\n        updatePackData: function(k) {\n            i = k.packs;\n            g.inform(\"MercuryStickers/updatedPacks\");\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryStickers\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"Event\",\"MercuryStickersData\",\"MercuryStickersFlyoutList.react\",\"Parent\",\"React\",\"SubscriptionsHandler\",\"Toggler\",\"UIPagelet\",\"XUISpinner.react\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"MercuryStickersData\"), m = b(\"MercuryStickersFlyoutList.react\"), n = b(\"Parent\"), o = b(\"React\"), p = b(\"SubscriptionsHandler\"), q = b(\"Toggler\"), r = b(\"UIPagelet\"), s = b(\"XUISpinner.react\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"cx\");\n    function w(x) {\n        this._packs = j.find(x, \".-cx-PRIVATE-fbMercuryStickersFlyout__packs\");\n        this._packSelector = j.find(x, \".-cx-PRIVATE-fbMercuryStickersFlyout__selector\");\n        this._loadedPacks = {\n            emoticons: true\n        };\n        var y = n.byClass(x, \"uiToggle\"), z = q.listen(\"show\", y, function() {\n            this._renderPackList();\n            this._subscriptions.addSubscriptions(g.subscribe(\"MercuryStickers/updatedPacks\", this._renderPackList.bind(this)));\n            this._selectPack(l.getPacks()[0].id);\n            q.unsubscribe(z);\n        }.bind(this));\n        this._subscriptions = new p();\n        this._subscriptions.addSubscriptions(k.listen(this._packs, \"click\", function(event) {\n            var aa = n.byClass(event.getTarget(), \"-cx-PRIVATE-fbMercuryStickersFlyout__sticker\");\n            if (aa) {\n                this._selectedSticker(aa);\n                q.hide(y);\n            }\n        ;\n        }.bind(this)));\n    };\n    t(w.prototype, h, {\n        _renderPackList: function() {\n            o.renderComponent(m({\n                onPackClick: this._selectPack.bind(this),\n                packs: l.getPacks()\n            }), this._packSelector);\n        },\n        _loadPack: function(x) {\n            if (this._loadedPacks[x]) {\n                return\n            };\n            var y = this._getPackWithID(x);\n            o.renderComponent(s({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__spinner\"\n            }), y);\n            this._loadedPacks[x] = true;\n            r.loadFromEndpoint(\"StickerPackPagelet\", y, {\n                id: x\n            });\n        },\n        _getPackWithID: function(x) {\n            var y = j.scry(this._packs, (((\".-cx-PRIVATE-fbMercuryStickersFlyout__pack\" + \"[data-id=\\\"\") + x) + \"\\\"]\"))[0];\n            if (!y) {\n                y = j.create(\"div\", {\n                    className: \"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\",\n                    \"data-id\": x\n                });\n                j.appendContent(this._packs, y);\n            }\n        ;\n            return y;\n        },\n        _selectedSticker: function(x) {\n            var y = parseInt(x.getAttribute(\"data-id\"), 10);\n            this.inform(\"stickerselected\", {\n                id: y\n            });\n        },\n        _selectPack: function(x) {\n            j.scry(this._packs, \".-cx-PRIVATE-fbMercuryStickersFlyout__pack\").forEach(i.hide);\n            this._loadPack(x);\n            i.show(this._getPackWithID(x));\n        },\n        destroy: function() {\n            (this._subscriptions && this._subscriptions.release());\n            this._subscriptions = null;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Token\", [\"CSS\",\"DataStore\",\"DOM\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m, n) {\n        this.info = m;\n        this.paramName = n;\n    };\n    j(l.prototype, {\n        getInfo: function() {\n            return this.info;\n        },\n        getText: function() {\n            return this.info.text;\n        },\n        getValue: function() {\n            return this.info.uid;\n        },\n        isFreeform: function() {\n            return !!this.info.freeform;\n        },\n        setSelected: function(m) {\n            g.conditionClass(this.getElement(), \"uiTokenSelected\", m);\n            return this;\n        },\n        getElement: function() {\n            if (!this.element) {\n                this.setElement(this.createElement());\n            };\n            return this.element;\n        },\n        setElement: function(m) {\n            h.set(m, \"Token\", this);\n            this.element = m;\n            return this;\n        },\n        isRemovable: function() {\n            return g.hasClass(this.element, \"removable\");\n        },\n        createElement: function(m, n) {\n            var o = this.paramName, p = this.getText(), q = this.getValue(), r = i.create(\"a\", {\n                href: \"#\",\n                \"aria-label\": k._(\"Remove {item}\", {\n                    item: p\n                }),\n                className: \"remove uiCloseButton uiCloseButtonSmall\"\n            });\n            if (m) {\n                g.addClass(r, \"uiCloseButtonSmallGray\");\n            };\n            var s = i.create(\"input\", {\n                type: \"hidden\",\n                value: q,\n                name: (o + \"[]\"),\n                autocomplete: \"off\"\n            }), t = i.create(\"input\", {\n                type: \"hidden\",\n                value: p,\n                name: ((\"text_\" + o) + \"[]\"),\n                autocomplete: \"off\"\n            }), u = i.create(\"span\", {\n                className: \"removable uiToken\"\n            }, [p,s,t,r,]);\n            if (m) {\n                g.addClass(u, \"uiTokenGray\");\n            };\n            if (n) {\n                var v = i.create(\"i\", {\n                    className: n\n                });\n                i.prependContent(u, v);\n            }\n        ;\n            return u;\n        }\n    });\n    e.exports = l;\n});\n__d(\"WeakToken\", [\"Class\",\"CSS\",\"Token\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"Token\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, i);\n    j(k.prototype, {\n        createElement: function() {\n            var l = this.parent.createElement(true, \"UFIWeakReferenceIcon\");\n            h.addClass(l, \"uiTokenWeakReference\");\n            return l;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Tokenizer\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMQuery\",\"DataStore\",\"Event\",\"Focus\",\"Input\",\"Keys\",\"Parent\",\"StickyPlaceholderInput\",\"Style\",\"TextMetrics\",\"Token\",\"UserAgent\",\"WeakToken\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DataStore\"), m = b(\"Event\"), n = b(\"Focus\"), o = b(\"Input\"), p = b(\"Keys\"), q = b(\"Parent\"), r = b(\"StickyPlaceholderInput\"), s = b(\"Style\"), t = b(\"TextMetrics\"), u = b(\"Token\"), v = b(\"UserAgent\"), w = b(\"WeakToken\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"emptyFunction\"), aa = 20;\n    function ba(ca, da) {\n        this.element = ca;\n        this.typeahead = da;\n        this.input = da.getCore().getElement();\n        l.set(this.element, \"Tokenizer\", this);\n    };\n    ba.getInstance = function(ca) {\n        var da = q.byClass(ca, \"uiTokenizer\");\n        return (da ? l.get(da, \"Tokenizer\") : null);\n    };\n    x(ba.prototype, h, {\n        inline: false,\n        maxTokens: null,\n        excludeDuplicates: true,\n        placeholder: \"\",\n        init: function(ca, da, ea, fa) {\n            this.init = z;\n            this.tokenarea = ca;\n            this.paramName = da;\n            if (!this.placeholder) {\n                this.placeholder = (this.input.getAttribute(\"data-placeholder\") || \"\");\n            };\n            x(this, (fa || {\n            }));\n            this.initEvents();\n            this.initTypeahead();\n            this.reset(ea);\n            this.initBehaviors();\n            this.adjustWidth.bind(this).defer();\n            g.inform(\"Tokenizer/init\", this, g.BEHAVIOR_PERSISTENT);\n        },\n        reset: function(ca) {\n            this.tokens = [];\n            this.unique = {\n            };\n            if (ca) {\n                this.populate(ca);\n            }\n             else j.empty(this.tokenarea);\n        ;\n            this.updateTokenarea();\n        },\n        populate: function(ca) {\n            var da = [];\n            this.tokens = this.getTokenElements().map(function(ea, fa) {\n                var ga = ca[fa];\n                da.push(this._tokenKey(ga));\n                return this.createToken(ga, ea);\n            }, this);\n            this.unique = y(da, this.tokens);\n        },\n        getElement: function() {\n            return this.element;\n        },\n        getTypeahead: function() {\n            return this.typeahead;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        initBehaviors: function() {\n            this.behaviors = (this.behaviors || []);\n            if ((this.behaviors instanceof Array)) {\n                this.behaviors.forEach(function(ea) {\n                    ea.behavior(this, ea.config);\n                }.bind(this));\n            }\n             else for (var ca in ((this.behaviors || {\n            }))) {\n                var da = (window.TokenizerBehaviors && window.TokenizerBehaviors[ca]);\n                da.call(null, this, this.behaviors[ca]);\n            }\n        ;\n        },\n        initTypeahead: function() {\n            var ca = this.typeahead.getCore();\n            ca.resetOnSelect = true;\n            ca.setValueOnSelect = false;\n            ca.preventFocusChangeOnTab = true;\n            if (this.inline) {\n                var da = this.typeahead.getView();\n                i.addClass(da.getElement(), \"uiInlineTokenizerView\");\n            }\n        ;\n            this.typeahead.subscribe(\"select\", function(ea, fa) {\n                var ga = fa.selected;\n                if ((\"uid\" in ga)) {\n                    this.updateInput();\n                    this.addToken(this.createToken(ga));\n                }\n            ;\n            }.bind(this));\n            this.typeahead.subscribe(\"blur\", this.handleBlur.bind(this));\n        },\n        handleBlur: function(event) {\n            this.inform(\"blur\", {\n                event: event\n            });\n            this.updatePlaceholder();\n        },\n        initEvents: function() {\n            var ca = this.handleEvents.bind(this), da = ((v.firefox() < 4) ? \"keypress\" : \"keydown\");\n            m.listen(this.tokenarea, {\n                click: ca,\n                keydown: ca\n            });\n            m.listen(this.input, \"paste\", this.paste.bind(this));\n            m.listen(this.input, da, this.keydown.bind(this));\n        },\n        handleEvents: function(event) {\n            var ca = event.getTarget(), da = (ca && this.getTokenElementFromTarget(ca));\n            if (!da) {\n                return\n            };\n            if (((event.type != \"keydown\") || (m.getKeyCode(event) == p.RETURN))) {\n                this.processEvents(event, ca, da);\n            };\n        },\n        processEvents: function(event, ca, da) {\n            if (q.byClass(ca, \"remove\")) {\n                var ea = da.nextSibling;\n                ea = (ea && k.scry(da.nextSibling, \".remove\")[0]);\n                var fa = this.getTokenFromElement(da);\n                fa = this.addTokenData(fa, ca);\n                this.removeToken(fa);\n                this.focusOnTokenRemoval(event, ea);\n                event.kill();\n            }\n        ;\n        },\n        focusOnTokenRemoval: function(event, ca) {\n            n.set((((event.type == \"keydown\") && ca) || this.input));\n        },\n        addTokenData: function(ca, da) {\n            return ca;\n        },\n        keydown: function(event) {\n            this.inform(\"keydown\", {\n                event: event\n            });\n            var ca = m.getKeyCode(event), da = this.input;\n            if (((this.inline && (ca == p.BACKSPACE)) && o.isEmpty(da))) {\n                var ea = this.getLastToken();\n                if ((ea && ea.isRemovable())) {\n                    this.removeToken(ea);\n                };\n            }\n        ;\n            this.updateInput();\n        },\n        paste: function(event) {\n            this.inform(\"paste\", {\n                event: event\n            });\n            this.updateInput(true);\n        },\n        focusInput: function() {\n            n.set(this.input);\n        },\n        updateInput: function(ca) {\n            if (!this.inline) {\n                return\n            };\n            setTimeout(function() {\n                this.adjustWidth(this.input.value);\n                if (ca) {\n                    this.input.value = this.input.value;\n                };\n            }.bind(this), 20);\n            r.setPlaceholderText(this.input, \"\");\n            this.inform(\"resize\");\n        },\n        setPlaceholder: function(ca) {\n            this.placeholder = ca;\n            if (this.stickyPlaceholder) {\n                r.setPlaceholderText(this.input, ca);\n            };\n            this.updatePlaceholder();\n        },\n        updatePlaceholder: function() {\n            if ((!this.inline || this.input.value)) {\n                return\n            };\n            var ca = !this.tokens.length, da = \"\";\n            if ((ca || this.stickyPlaceholder)) {\n                this.adjustWidth(this.placeholder);\n                da = this.placeholder;\n            }\n             else this.adjustWidth(this.input.value);\n        ;\n            r.setPlaceholderText(this.input, da);\n        },\n        adjustWidth: function(ca) {\n            if ((!this.inline || !this._getIsInDOM())) {\n                return\n            };\n            if ((!ca && (this.input.value === \"\"))) {\n                ca = this.placeholder;\n            };\n            var da = aa;\n            if ((((ca !== this.placeholder) || !this.getTokens().length) || this.stickyPlaceholder)) {\n                var ea = this._getMetrics().measure(ca);\n                da = ((ea.width + this._getWidthOffset()) + 10);\n            }\n        ;\n            s.set(this.input, \"width\", (da + \"px\"));\n            this.inform(\"resize\");\n        },\n        getToken: function(ca) {\n            return (this.unique[ca] || null);\n        },\n        getTokens: function() {\n            return (this.tokens || []);\n        },\n        getTokenElements: function() {\n            return k.scry(this.tokenarea, \"span.uiToken\");\n        },\n        getTokenElementFromTarget: function(ca) {\n            return q.byClass(ca, \"uiToken\");\n        },\n        getTokenFromElement: function(ca) {\n            return l.get(ca, \"Token\");\n        },\n        getTokenValues: function() {\n            if (!this.tokens) {\n                return []\n            };\n            return this.tokens.map(function(ca) {\n                return ca.getValue();\n            });\n        },\n        getFirstToken: function() {\n            return (this.tokens[0] || null);\n        },\n        getLastToken: function() {\n            return (this.tokens[(this.tokens.length - 1)] || null);\n        },\n        hasMaxTokens: function() {\n            return (this.maxTokens && (this.maxTokens <= this.tokens.length));\n        },\n        createToken: function(ca, da) {\n            var ea = this.getToken(this._tokenKey(ca));\n            if (!ea) {\n                ea = (ca.weak_reference ? new w(ca, this.paramName) : new u(ca, this.paramName));\n            };\n            (da && ea.setElement(da));\n            return ea;\n        },\n        addToken: function(ca) {\n            if (this.hasMaxTokens()) {\n                return\n            };\n            var da = this._tokenKey(ca.getInfo());\n            if ((da in this.unique)) {\n                return\n            };\n            this.unique[da] = ca;\n            this.tokens.push(ca);\n            this.insertToken(ca);\n            this.updateTokenarea();\n            this.inform(\"addToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        insertToken: function(ca) {\n            j.appendContent(this.tokenarea, ca.getElement());\n        },\n        removeToken: function(ca) {\n            if (!ca) {\n                return\n            };\n            var da = this.tokens.indexOf(ca);\n            if ((da < 0)) {\n                return\n            };\n            this.tokens.splice(this.tokens.indexOf(ca), 1);\n            delete this.unique[this._tokenKey(ca.getInfo())];\n            j.remove(ca.getElement());\n            this.updateTokenarea();\n            this.inform(\"removeToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        removeAllTokens: function() {\n            this.reset();\n            this.inform(\"removeAllTokens\");\n        },\n        updateTokenarea: function() {\n            var ca = this.typeahead.getCore(), da = this.getTokenValues();\n            if (this.excludeDuplicates) {\n                (this._exclusions || (this._exclusions = ca.getExclusions()));\n                ca.setExclusions(da.concat(this._exclusions));\n            }\n        ;\n            ca.setEnabled(!this.hasMaxTokens());\n            this.updateTokenareaVisibility();\n            this.updatePlaceholder();\n            this.inform(\"resize\");\n        },\n        updateTokenareaVisibility: function() {\n            i.conditionShow(this.tokenarea, (this.tokens.length !== 0));\n        },\n        _tokenKey: function(ca) {\n            return (ca.uid + ((ca.freeform ? \":\" : \"\")));\n        },\n        _widthOffset: null,\n        _getWidthOffset: function() {\n            if ((this._widthOffset === null)) {\n                var ca = this.input.clientWidth, da = s.getFloat(this.input, \"width\");\n                if ((ca == da)) {\n                    this._widthOffset = (s.getFloat(this.input, \"paddingLeft\") + s.getFloat(this.input, \"paddingRight\"));\n                }\n                 else this._widthOffset = 0;\n            ;\n            }\n        ;\n            return this._widthOffset;\n        },\n        _metrics: null,\n        _getMetrics: function() {\n            if (!this._metrics) {\n                this._metrics = new t(this.input, this.inline);\n            };\n            return this._metrics;\n        },\n        _getIsInDOM: function() {\n            return (this._isInDOM || (this._isInDOM = k.contains(document.body, this.input)));\n        }\n    });\n    ba.init = function(ca, da) {\n        ca.init(da.tokenarea, da.param_name, da.initial_info, da.options);\n    };\n    e.exports = ba;\n});\n__d(\"MercuryTypeahead\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"DOMDimensions\",\"Input\",\"Keys\",\"MercuryTypeaheadTemplates\",\"Tokenizer\",\"Typeahead\",\"TypeaheadCore\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"Input\"), l = b(\"Keys\"), m = b(\"MercuryTypeaheadTemplates\"), n = b(\"Tokenizer\"), o = b(\"Typeahead\"), p = b(\"TypeaheadCore\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = function(t, u) {\n        this._domElement = null;\n        this._typeahead = null;\n        this._tokenizer = null;\n        this._placeholder = \"\";\n        this._exclusions = [];\n        this._viewNodeOrID = null;\n        this._viewOptions = {\n            renderer: \"compact\",\n            autoSelect: true\n        };\n        this._tokenizerBehaviors = [];\n        this._heightPrev = null;\n        this._dataSource = t;\n        this._view = u;\n    };\n    q(s.prototype, h);\n    q(s.prototype, {\n        setPlaceholder: function(t) {\n            this._placeholder = t;\n            return this;\n        },\n        setExcludedParticipants: function(t) {\n            this._exclusions = [];\n            t.forEach(function(u) {\n                var v = u.indexOf(\":\");\n                if ((u.substr(0, v) == \"fbid\")) {\n                    this._exclusions.push(u.substr((v + 1)));\n                };\n            }.bind(this));\n            return this;\n        },\n        setViewNodeID: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setViewNode: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setFullWidthView: function(t) {\n            var u = i.create(\"div\", {\n                className: \"-cx-PRIVATE-mercuryTypeahead__typeaheadview uiTypeaheadView\"\n            });\n            i.setContent(t, u);\n            this.setViewNode(u);\n        },\n        setViewOption: function(t, u) {\n            this._viewOptions[t] = u;\n        },\n        addTokenizerBehavior: function(t) {\n            this._tokenizerBehaviors.push(t);\n        },\n        build: function(t) {\n            if (this._domElement) {\n                return\n            };\n            var u = m[\":fb:mercury:tokenizer\"].build(), v = m[\":fb:mercury:typeahead\"].build();\n            this._domElement = u.getRoot();\n            i.appendContent(this._domElement, v.getRoot());\n            var w = v.getNode(\"textfield\");\n            k.setPlaceholder(w, this._placeholder);\n            w.setAttribute(\"data-placeholder\", this._placeholder);\n            this._input = w;\n            var x = {\n                node_id: this._viewNodeOrID,\n                ctor: this._view,\n                options: this._viewOptions\n            }, y = {\n                ctor: p,\n                options: {\n                    setValueOnSelect: true\n                }\n            };\n            this._typeahead = new o(this._dataSource, x, y, v.getRoot());\n            this._typeahead.init();\n            var z = {\n                inline: true,\n                behaviors: this._tokenizerBehaviors\n            };\n            this._tokenizer = new n(this._domElement, this._typeahead);\n            this._tokenizer.init(u.getNode(\"tokenarea\"), \"participants\", [], z);\n            this._tokenizer.subscribe([\"addToken\",\"removeToken\",\"removeAllTokens\",], this._tokensChanged.bind(this));\n            this._tokenizer.subscribe(\"resize\", function() {\n                this.inform(\"resize\");\n            }.bind(this));\n            g.listen(w, \"focus\", function() {\n                this._resetDataSource();\n                this._typeahead.init();\n            }.bind(this));\n            g.listen(this._domElement, \"click\", this.focus.bind(this));\n            g.listen(w, \"keydown\", this.keydown.bind(this));\n            this._heightPrev = j.getElementDimensions(this._domElement).height;\n        },\n        getElement: function() {\n            return this._domElement;\n        },\n        getSelectedParticipantIDs: function() {\n            var t = [];\n            if (this._tokenizer) {\n                ((this._tokenizer.getTokenValues() || [])).forEach(function(u) {\n                    t.push((\"fbid:\" + u));\n                });\n            };\n            return t;\n        },\n        getTokens: function() {\n            var t = [];\n            if (this._tokenizer) {\n                t = this._tokenizer.getTokens();\n            };\n            return t;\n        },\n        getTokenizer: function() {\n            return this._tokenizer;\n        },\n        keydown: function(event) {\n            if ((this._tokenizer.inline && (event.keyCode == l.ESC))) {\n                if (k.isEmpty(this._input)) {\n                    var t = this._tokenizer.getLastToken();\n                    if ((t && t.isRemovable())) {\n                        this._tokenizer.removeToken(t);\n                    };\n                }\n                 else this._typeahead.getCore().reset();\n            ;\n                return false;\n            }\n        ;\n        },\n        reset: function() {\n            (this._tokenizer && this._tokenizer.removeAllTokens());\n            (this._typeahead && this._typeahead.getCore().reset());\n        },\n        focus: function() {\n            (this._tokenizer && this._tokenizer.focusInput());\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _resetDataSource: function() {\n            this._dataSource.setExclusions(this._exclusions);\n        },\n        _tokensChanged: function() {\n            this.inform(\"tokens-changed\");\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotosUploadWaterfall\", [\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = {\n        APP_FLASH: \"flash_pro\",\n        APP_SIMPLE: \"simple\",\n        APP_ARCHIVE: \"archive\",\n        APP_COMPOSER: \"composer\",\n        APP_MESSENGER: \"messenger\",\n        APP_HTML5: \"html5\",\n        APP_CHAT: \"chat\",\n        INSTALL_CANCEL: 1,\n        INSTALL_INSTALL: 2,\n        INSTALL_UPDATE: 3,\n        INSTALL_REINSTALL: 4,\n        INSTALL_PERMA_CANCEL: 5,\n        INSTALL_SILENT_SKIP: 6,\n        INSTALL_DOWNLOAD: 7,\n        CERROR_RESIZING_FAILED: 6,\n        CERROR_MARKER_EXTRACTION_FAILED: 9,\n        BEGIN: 1,\n        UPLOAD_START: 4,\n        ALL_UPLOADS_DONE: 6,\n        CLIENT_ERROR: 7,\n        RECOVERABLE_CLIENT_ERROR: 12,\n        IMAGES_SELECTED: 9,\n        UPGRADE_REQUIRED: 11,\n        VERSION: 15,\n        SELECT_START: 18,\n        SELECT_CANCELED: 19,\n        CANCEL: 22,\n        CANCEL_DURING_UPLOAD: 83,\n        ONE_RESIZING_START: 2,\n        ONE_UPLOAD_DONE: 29,\n        ONE_RESIZING_DONE: 34,\n        PROGRESS_BAR_STOPPED: 44,\n        MISSED_BEAT: 45,\n        HEART_ATTACK: 46,\n        PUBLISH_START: 100,\n        PUBLISH_SUCCESS: 101,\n        PUBLISH_FAILURE: 102,\n        SESSION_POSTED: 72,\n        POST_PUBLISHED: 80,\n        ONE_UPLOAD_CANCELED: 81,\n        ONE_UPLOAD_CANCELED_DURING_UPLOAD: 82,\n        RESIZER_AVAILABLE: 20,\n        OVERLAY_FIRST: 61,\n        ASYNC_AVAILABLE: 63,\n        FALLBACK_TO_FLASH: 13,\n        RETRY_UPLOAD: 17,\n        TAGGED_ALL_FACES: 14,\n        VAULT_IMAGES_SELECTED: 62,\n        VAULT_CREATE_POST_CANCEL: 65,\n        VAULT_SEND_IN_MESSAGE_CLICKED: 66,\n        VAULT_DELETE_CANCEL: 68,\n        VAULT_ADD_TO_ALBUM_CANCEL: 74,\n        VAULT_SHARE_IN_AN_ALBUM_CLICKED: 76,\n        VAULT_SHARE_OWN_TIMELINE_CLICKED: 77,\n        VAULT_SHARE_FRIENDS_TIMELINE_CLICKED: 78,\n        VAULT_SHARE_IN_A_GROUP_CLICKED: 79,\n        METHOD_DRAGDROP: \"dragdrop\",\n        METHOD_FILE_SELECTOR: \"file_selector\",\n        METHOD_VAULT: \"vault\",\n        METHOD_PHOTOS_OF_YOU: \"photos_of_you\",\n        METHOD_RECENT_PHOTOS: \"recent_photos\",\n        VAULTBOX: \"vaultbox\",\n        GRID: \"grid\",\n        SPOTLIGHT_VAULT_VIEWER: \"spotlight_vault_viewer\",\n        sendSignal: function(i, j) {\n            new g(\"/ajax/photos/waterfall.php\", {\n                data: JSON.stringify(i)\n            }).setHandler(j).send();\n        }\n    };\n    e.exports = h;\n});\n__d(\"FreeformTokenizerBehavior\", [\"Input\",\"Keys\",\"Event\",\"function-extensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Input\"), h = b(\"Keys\"), i = b(\"Event\");\n    b(\"function-extensions\");\n    function j(k, l) {\n        var m = (l.tokenize_on_blur !== false), n = (l.tokenize_on_paste !== false), o = (l.matcher && new RegExp(l.matcher, \"i\")), p = (l.paste_split && new RegExp(l.paste_split)), q = (l.select_on_comma !== false), r = (l.never_submit === true);\n        function s(event) {\n            var t = g.getValue(k.getInput()).trim();\n            if (((p && event) && (event.type == \"paste\"))) {\n                t = t.split(p);\n            }\n             else t = [t,];\n        ;\n            var u = false;\n            for (var v = 0; (v < t.length); v++) {\n                var w = t[v].trim();\n                if ((w && ((!o || o.test(w))))) {\n                    var x = {\n                        uid: w,\n                        text: w,\n                        freeform: true\n                    };\n                    k.addToken(k.createToken(x));\n                    u = true;\n                }\n            ;\n            };\n            if ((event && u)) {\n                k.getTypeahead().getCore().afterSelect();\n                event.kill();\n            }\n        ;\n        };\n        k.subscribe(\"keydown\", function(t, u) {\n            var event = u.event, v = i.getKeyCode(event);\n            if ((((q && (v == h.COMMA))) || (v == h.RETURN))) {\n                var w = k.getTypeahead().getView();\n                if (w.getSelection()) {\n                    w.select();\n                    event.kill();\n                }\n                 else s(event);\n            ;\n            }\n        ;\n            if (((v == h.RETURN) && r)) {\n                event.kill();\n            };\n        });\n        k.subscribe(\"paste\", function(t, u) {\n            if (n) {\n                s.bind(null, u.event).defer(20);\n            };\n        });\n        k.subscribe(\"blur\", function(t, u) {\n            if (m) {\n                s();\n            };\n            k.getTypeahead().getCore().reset();\n        });\n    };\n    e.exports = j;\n});");
// 14205
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_1[0], o7,"s8ab62f2bda6651f134e0d96fc001c56c4a8eab12");
// undefined
o7 = null;
// 14206
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"LpC/l\",]);\n}\n;\n;\n__d(\"DOMWrapper\", [], function(a, b, c, d, e, f) {\n    var g, h, i = {\n        setRoot: function(j) {\n            g = j;\n        },\n        getRoot: function() {\n            return ((g || JSBNG__document.body));\n        },\n        setWindow: function(j) {\n            h = j;\n        },\n        getWindow: function() {\n            return ((h || JSBNG__self));\n        }\n    };\n    e.exports = i;\n});\n__d(\"Flash\", [\"DOMWrapper\",\"QueryString\",\"UserAgent\",\"copyProperties\",\"guid\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMWrapper\"), h = b(\"QueryString\"), i = b(\"UserAgent\"), j = b(\"copyProperties\"), k = b(\"guid\"), l = {\n    }, m, n = g.getWindow().JSBNG__document;\n    function o(t) {\n        var u = n.getElementById(t);\n        if (u) {\n            u.parentNode.removeChild(u);\n        }\n    ;\n    ;\n        delete l[t];\n    };\n;\n    function p() {\n        {\n            var fin289keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin289i = (0);\n            var t;\n            for (; (fin289i < fin289keys.length); (fin289i++)) {\n                ((t) = (fin289keys[fin289i]));\n                {\n                    if (l.hasOwnProperty(t)) {\n                        o(t);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function q(t) {\n        return t.replace(/\\d+/g, function(u) {\n            return ((\"000\".substring(u.length) + u));\n        });\n    };\n;\n    function r(t) {\n        if (!m) {\n            if (((i.ie() >= 9))) {\n                window.JSBNG__attachEvent(\"JSBNG__onunload\", p);\n            }\n        ;\n        ;\n            m = true;\n        }\n    ;\n    ;\n        l[t] = t;\n    };\n;\n    var s = {\n        embed: function(t, u, v, w) {\n            var x = k();\n            t = encodeURI(t);\n            v = j({\n                allowscriptaccess: \"always\",\n                flashvars: w,\n                movie: t\n            }, ((v || {\n            })));\n            if (((typeof v.flashvars == \"object\"))) {\n                v.flashvars = h.encode(v.flashvars);\n            }\n        ;\n        ;\n            var y = [];\n            {\n                var fin290keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin290i = (0);\n                var z;\n                for (; (fin290i < fin290keys.length); (fin290i++)) {\n                    ((z) = (fin290keys[fin290i]));\n                    {\n                        if (((v.hasOwnProperty(z) && v[z]))) {\n                            y.push(((((((((\"\\u003Cparam name=\\\"\" + encodeURI(z))) + \"\\\" value=\\\"\")) + encodeURI(v[z]))) + \"\\\"\\u003E\")));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var aa = n.createElement(\"div\"), ba = ((((((((((((((((((\"\\u003Cobject \" + ((i.ie() ? \"classid=\\\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\\\" \" : \"type=\\\"application/x-shockwave-flash\\\"\")))) + \"data=\\\"\")) + t)) + \"\\\" \")) + \"id=\\\"\")) + x)) + \"\\\"\\u003E\")) + y.join(\"\"))) + \"\\u003C/object\\u003E\"));\n            aa.innerHTML = ba;\n            var ca = u.appendChild(aa.firstChild);\n            r(x);\n            return ca;\n        },\n        remove: o,\n        getVersion: function() {\n            var t = \"Shockwave Flash\", u = \"application/x-shockwave-flash\", v = \"ShockwaveFlash.ShockwaveFlash\", w;\n            if (((JSBNG__navigator.plugins && ((typeof JSBNG__navigator.plugins[t] == \"object\"))))) {\n                var x = JSBNG__navigator.plugins[t].description;\n                if (((((((x && JSBNG__navigator.mimeTypes)) && JSBNG__navigator.mimeTypes[u])) && JSBNG__navigator.mimeTypes[u].enabledPlugin))) {\n                    w = x.match(/\\d+/g);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!w) {\n                try {\n                    w = (new ActiveXObject(v)).GetVariable(\"$version\").match(/(\\d+),(\\d+),(\\d+),(\\d+)/);\n                    w = Array.prototype.slice.call(w, 1);\n                } catch (y) {\n                \n                };\n            }\n        ;\n        ;\n            return w;\n        },\n        checkMinVersion: function(t) {\n            var u = s.getVersion();\n            if (!u) {\n                return false;\n            }\n        ;\n        ;\n            return ((q(u.join(\".\")) >= q(t)));\n        },\n        isAvailable: function() {\n            return !!s.getVersion();\n        }\n    };\n    e.exports = s;\n});\n__d(\"MercuryAudioPlayer\", [\"JSBNG__Event\",\"Arbiter\",\"DOM\",\"Flash\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"Flash\"), k = b(\"copyProperties\"), l = 200;\n    function m() {\n        var v = i.create(\"audio\"), w = false;\n        try {\n            if (!!v.canPlayType) {\n                if (v.canPlayType(\"video/mp4;\").replace(/^no$/, \"\")) {\n                    w = true;\n                }\n            ;\n            }\n        ;\n        ;\n        } finally {\n            return w;\n        };\n    ;\n    };\n;\n    function n() {\n        return j.isAvailable();\n    };\n;\n    var o = function() {\n        this.interval = null;\n        this.arbiterInstance = null;\n        this.audio = i.create(\"audio\");\n        g.listen(this.audio, \"playing\", function() {\n            this.informAttachment(\"playing\", this.audio.currentTime);\n            this.interval = JSBNG__setInterval(function() {\n                this.informAttachment(\"playing\", this.audio.currentTime);\n            }.bind(this), l);\n        }.bind(this));\n        g.listen(this.audio, \"ended\", function() {\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(o.prototype, {\n        setAudio: function(v, w) {\n            this.audio.setAttribute(\"src\", v);\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            }\n        ;\n        ;\n        },\n        play: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            this.audio.pause();\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"html5\";\n        }\n    });\n    var p = function() {\n        this.src = null;\n        this.arbiterInstance = null;\n        var v = i.create(\"div\");\n        JSBNG__document.body.appendChild(v);\n        this.swf = j.embed(\"/swf/SoundStreamPlayer.swf\", v, null, {\n        });\n        this.interval = null;\n        h.subscribe(\"soundstream/finished\", function() {\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(p.prototype, {\n        setAudio: function(v, w) {\n            this.src = v;\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            }\n        ;\n        ;\n        },\n        play: function() {\n            this.swf.playSound(this.src);\n            this.interval = JSBNG__setInterval(function() {\n                var v = this.swf.getCurrentTime();\n                this.informAttachment(\"playing\", v);\n            }.bind(this), l);\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.swf.resume();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            JSBNG__clearInterval(this.interval);\n            this.swf.pause();\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"flash\";\n        }\n    });\n    function q() {\n        if (m()) {\n            return new o();\n        }\n         else if (n()) {\n            return new p();\n        }\n        \n    ;\n    ;\n        return false;\n    };\n;\n    var r = null, s = null, t = 0;\n    function u(v, w) {\n        this.src = v;\n        this.arbiterInstance = w;\n        this.audio_id = ++t;\n        ((((r !== null)) || (r = q())));\n        if (!r) {\n            return false;\n        }\n    ;\n    ;\n    };\n;\n    k(u.prototype, {\n        getType: function() {\n            if (!r) {\n                return false;\n            }\n             else return r.getType()\n        ;\n        },\n        play: function(v) {\n            if (((v && ((s == this.audio_id))))) {\n                r.resume();\n            }\n             else {\n                this.pause();\n                s = this.audio_id;\n                r.setAudio(this.src, this.arbiterInstance);\n                r.play();\n            }\n        ;\n        ;\n        },\n        pause: function() {\n            r.pause();\n        }\n    });\n    e.exports = u;\n});\n__d(\"MercuryAttachmentAudioClip.react\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryAudioPlayer\",\"Env\",\"JSLogger\",\"LeftRight.react\",\"React\",\"cx\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryAudioPlayer\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"LeftRight.react\"), m = b(\"React\"), n = b(\"cx\"), o = b(\"shield\"), p = b(\"tx\"), q = \"MercuryAttachmentAudioClip/play\", r = k.create(\"mercury_audio_clip\"), s = m.createClass({\n        displayName: \"AudioClip\",\n        mixins: [h,],\n        getInitialState: function() {\n            this.subscribe(\"playing\", this.updateTime);\n            this.subscribe(\"played\", o(this.setState, this, {\n                playing: true,\n                started: true\n            }));\n            this.subscribe(\"paused\", o(this.setState, this, {\n                playing: false\n            }));\n            this.subscribe(\"finished\", o(this.setState, this, {\n                playing: false,\n                started: false,\n                time: this.props.duration\n            }));\n            this.logged = false;\n            var t = ((this.props.downloadOnly ? false : new i(this.props.src, this)));\n            g.subscribe(q, function(u, v) {\n                if (((this.props.src != v))) {\n                    this.setState({\n                        time: 0\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return {\n                time: 0,\n                playing: false,\n                started: false,\n                duration: this.props.duration,\n                audioPlayer: t\n            };\n        },\n        updateTime: function(t, u) {\n            this.setState({\n                time: u\n            });\n        },\n        play: function() {\n            if (this.state.playing) {\n                this.state.audioPlayer.pause();\n            }\n             else {\n                this.state.audioPlayer.play(this.state.started);\n                g.inform(q, this.props.src);\n                if (!this.logged) {\n                    this.logged = true;\n                    r.log(\"play\", {\n                        uid: j.user,\n                        duration: this.props.duration\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _formatSeconds: function(t) {\n            if (t) {\n                t = Math.ceil(t);\n                var u = ((t % 60));\n                if (((u < 10))) {\n                    u = ((\"0\" + u));\n                }\n            ;\n            ;\n                var v = Math.floor(((t / 60)));\n                return ((((v + \":\")) + u));\n            }\n             else return null\n        ;\n        },\n        _renderPlayer: function(t, u) {\n            return (m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\",\n                style: {\n                    width: t\n                },\n                onClick: this.play\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__play\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__playicon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__duration\"\n            }, u), m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__scrubber\"\n            })));\n        },\n        render: function() {\n            var t = this.state.time, u = this.state.playing, v = this._formatSeconds(this.state.duration), w = ((this.props.width || 170)), x = null, y = Math.ceil(((((t * ((w + 2)))) / this.state.duration)));\n            if (((this.state.audioPlayer && this.state.audioPlayer.getType()))) {\n                var z = this._renderPlayer(w, v), aa = this._renderPlayer(w, v), ba = (((((\"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\") + ((((u && ((t !== 0)))) ? ((\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__playing\")) : \"\")))) + ((((u && ((t === 0)))) ? ((\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__loading\")) : \"\"))));\n                x = (m.DOM.div({\n                    className: ba\n                }, z, m.DOM.div({\n                    className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__progresser\",\n                    style: {\n                        width: y\n                    }\n                }, aa)));\n            }\n             else x = (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\"\n            }, l(null, m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadbox\",\n                href: this.props.src\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speaker\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speakericon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadtext\"\n            }, \"Voice Message\"), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__durationinline\"\n            }, v)), m.DOM.a({\n                href: this.props.src,\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__download\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadicon\"\n            }))))));\n        ;\n        ;\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__root\"\n            }, x));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryStickersFlyoutList.react\", [\"Animation\",\"React\",\"JSBNG__Image.react\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"React\"), i = b(\"JSBNG__Image.react\"), j = b(\"cx\"), k = b(\"fbt\"), l = b(\"ix\"), m = 5, n = \"Sticker Store\", o = h.createClass({\n        displayName: \"MercuryStickersFlyoutList\",\n        _calculateNumPages: function(q) {\n            return Math.max(1, Math.ceil(((((q.length - 1)) / m))));\n        },\n        getInitialState: function() {\n            return {\n                animating: false,\n                selectedId: this.props.packs[0].id,\n                page: 0,\n                numPages: this._calculateNumPages(this.props.packs)\n            };\n        },\n        componentWillReceiveProps: function(q) {\n            this.setState({\n                numPages: this._calculateNumPages(q.packs)\n            });\n        },\n        shouldComponentUpdate: function(q, r) {\n            return !r.animating;\n        },\n        _canGoPrev: function() {\n            return ((this.state.page > 0));\n        },\n        _canGoNext: function() {\n            return ((((this.state.page + 1)) < this.state.numPages));\n        },\n        _setPage: function(q) {\n            if (this.state.animating) {\n                return;\n            }\n        ;\n        ;\n            this.setState({\n                animating: true,\n                page: q\n            });\n            var r = this.refs.positioner.getDOMNode();\n            new g(r).to(\"marginLeft\", ((-r.childNodes[q].offsetLeft + \"px\"))).ondone(function() {\n                this.setState({\n                    animating: false\n                });\n            }.bind(this)).duration(200).go();\n        },\n        _back: function() {\n            ((this._canGoPrev() && this._setPage(((this.state.page - 1)))));\n        },\n        _next: function() {\n            ((this._canGoNext() && this._setPage(((this.state.page + 1)))));\n        },\n        render: function() {\n            var q = this.props.packs, r = this.props.onPackClick, s = [];\n            q.forEach(function(y, z) {\n                s.push(p({\n                    key: y.id,\n                    onClick: function() {\n                        ((r && r(y.id)));\n                        this.setState({\n                            selectedId: y.id\n                        });\n                    }.bind(this),\n                    pack: y,\n                    selected: ((this.state.selectedId === y.id))\n                }));\n            }.bind(this));\n            var t = [], u = [];\n            s.forEach(function(y, z) {\n                u.push(y);\n                if (((((z > 0)) && ((((((z % m)) === 0)) || ((z === ((s.length - 1))))))))) {\n                    t.push(h.DOM.div({\n                        className: \"-cx-PRIVATE-fbMercuryStickersSelector__page\"\n                    }, u));\n                    u = [];\n                }\n            ;\n            ;\n            });\n            var v = (((((\"-cx-PRIVATE-fbMercuryStickersSelector__left\") + ((\" \" + \"lfloat\")))) + ((!this._canGoPrev() ? ((\" \" + \"hidden_elem\")) : \"\")))), w = (((((\"-cx-PRIVATE-fbMercuryStickersSelector__right\") + ((\" \" + \"rfloat\")))) + ((!this._canGoNext() ? ((\" \" + \"hidden_elem\")) : \"\")))), x;\n            if (((t.length > 1))) {\n                x = h.DOM.a({\n                    className: w,\n                    onClick: this._next\n                }, i({\n                    className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                    src: l(\"/images/messaging/stickers/selector/rightarrow.png\")\n                }));\n            }\n        ;\n        ;\n            return (h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__root\"\n            }, h.DOM.a({\n                ajaxify: \"/ajax/messaging/stickers/store\",\n                \"aria-label\": n,\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__store rfloat\",\n                \"data-hover\": \"tooltip\",\n                ref: \"store\",\n                rel: \"dialog\"\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__storeicon\",\n                src: l(\"/images/messaging/stickers/selector/store.png\")\n            })), h.DOM.a({\n                className: v,\n                onClick: this._back\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                src: l(\"/images/messaging/stickers/selector/leftarrow.png\")\n            })), x, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__icons\"\n            }, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__positioner\",\n                ref: \"positioner\"\n            }, t))));\n        }\n    }), p = h.createClass({\n        displayName: \"PackIcon\",\n        render: function() {\n            var q = this.props.pack, r = (((\"-cx-PRIVATE-fbMercuryStickersFlyout__packselector\") + ((this.props.selected ? ((\" \" + \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedpack\")) : \"\"))));\n            return (h.DOM.a({\n                \"aria-label\": q.JSBNG__name,\n                className: r,\n                \"data-id\": q.id,\n                \"data-hover\": \"tooltip\",\n                onClick: function() {\n                    ((this.props.onClick && this.props.onClick(q.id)));\n                }.bind(this)\n            }, h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__packicon\",\n                src: q.icon\n            }), h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedicon\",\n                src: q.selectedIcon\n            })));\n        }\n    });\n    e.exports = o;\n});\n__d(\"str2rstr\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = \"\", j, k;\n        for (var l = 0; ((l < h.length)); l++) {\n            j = h.charCodeAt(l);\n            k = ((((((l + 1)) < h.length)) ? h.charCodeAt(((l + 1))) : 0));\n            if (((((((((55296 <= j)) && ((j <= 56319)))) && ((56320 <= k)))) && ((k <= 57343))))) {\n                j = ((((65536 + ((((j & 1023)) << 10)))) + ((k & 1023))));\n                l++;\n            }\n        ;\n        ;\n            if (((j <= 127))) {\n                i += String.fromCharCode(j);\n            }\n             else if (((j <= 2047))) {\n                i += String.fromCharCode(((192 | ((((j >>> 6)) & 31)))), ((128 | ((j & 63)))));\n            }\n             else if (((j <= 65535))) {\n                i += String.fromCharCode(((224 | ((((j >>> 12)) & 15)))), ((128 | ((((j >>> 6)) & 63)))), ((128 | ((j & 63)))));\n            }\n             else if (((j <= 2097151))) {\n                i += String.fromCharCode(((240 | ((((j >>> 18)) & 7)))), ((128 | ((((j >>> 12)) & 63)))), ((128 | ((((j >>> 6)) & 63)))), ((128 | ((j & 63)))));\n            }\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        return i;\n    };\n;\n    e.exports = g;\n});\n__d(\"md5\", [\"str2rstr\",], function(a, b, c, d, e, f) {\n    var g = b(\"str2rstr\");\n    function h(u, v) {\n        var w = u[0], x = u[1], y = u[2], z = u[3];\n        w = j(w, x, y, z, v[0], 7, -680876936);\n        z = j(z, w, x, y, v[1], 12, -389564586);\n        y = j(y, z, w, x, v[2], 17, 606105819);\n        x = j(x, y, z, w, v[3], 22, -1044525330);\n        w = j(w, x, y, z, v[4], 7, -176418897);\n        z = j(z, w, x, y, v[5], 12, 1200080426);\n        y = j(y, z, w, x, v[6], 17, -1473231341);\n        x = j(x, y, z, w, v[7], 22, -45705983);\n        w = j(w, x, y, z, v[8], 7, 1770035416);\n        z = j(z, w, x, y, v[9], 12, -1958414417);\n        y = j(y, z, w, x, v[10], 17, -42063);\n        x = j(x, y, z, w, v[11], 22, -1990404162);\n        w = j(w, x, y, z, v[12], 7, 1804603682);\n        z = j(z, w, x, y, v[13], 12, -40341101);\n        y = j(y, z, w, x, v[14], 17, -1502002290);\n        x = j(x, y, z, w, v[15], 22, 1236535329);\n        w = k(w, x, y, z, v[1], 5, -165796510);\n        z = k(z, w, x, y, v[6], 9, -1069501632);\n        y = k(y, z, w, x, v[11], 14, 643717713);\n        x = k(x, y, z, w, v[0], 20, -373897302);\n        w = k(w, x, y, z, v[5], 5, -701558691);\n        z = k(z, w, x, y, v[10], 9, 38016083);\n        y = k(y, z, w, x, v[15], 14, -660478335);\n        x = k(x, y, z, w, v[4], 20, -405537848);\n        w = k(w, x, y, z, v[9], 5, 568446438);\n        z = k(z, w, x, y, v[14], 9, -1019803690);\n        y = k(y, z, w, x, v[3], 14, -187363961);\n        x = k(x, y, z, w, v[8], 20, 1163531501);\n        w = k(w, x, y, z, v[13], 5, -1444681467);\n        z = k(z, w, x, y, v[2], 9, -51403784);\n        y = k(y, z, w, x, v[7], 14, 1735328473);\n        x = k(x, y, z, w, v[12], 20, -1926607734);\n        w = l(w, x, y, z, v[5], 4, -378558);\n        z = l(z, w, x, y, v[8], 11, -2022574463);\n        y = l(y, z, w, x, v[11], 16, 1839030562);\n        x = l(x, y, z, w, v[14], 23, -35309556);\n        w = l(w, x, y, z, v[1], 4, -1530992060);\n        z = l(z, w, x, y, v[4], 11, 1272893353);\n        y = l(y, z, w, x, v[7], 16, -155497632);\n        x = l(x, y, z, w, v[10], 23, -1094730640);\n        w = l(w, x, y, z, v[13], 4, 681279174);\n        z = l(z, w, x, y, v[0], 11, -358537222);\n        y = l(y, z, w, x, v[3], 16, -722521979);\n        x = l(x, y, z, w, v[6], 23, 76029189);\n        w = l(w, x, y, z, v[9], 4, -640364487);\n        z = l(z, w, x, y, v[12], 11, -421815835);\n        y = l(y, z, w, x, v[15], 16, 530742520);\n        x = l(x, y, z, w, v[2], 23, -995338651);\n        w = m(w, x, y, z, v[0], 6, -198630844);\n        z = m(z, w, x, y, v[7], 10, 1126891415);\n        y = m(y, z, w, x, v[14], 15, -1416354905);\n        x = m(x, y, z, w, v[5], 21, -57434055);\n        w = m(w, x, y, z, v[12], 6, 1700485571);\n        z = m(z, w, x, y, v[3], 10, -1894986606);\n        y = m(y, z, w, x, v[10], 15, -1051523);\n        x = m(x, y, z, w, v[1], 21, -2054922799);\n        w = m(w, x, y, z, v[8], 6, 1873313359);\n        z = m(z, w, x, y, v[15], 10, -30611744);\n        y = m(y, z, w, x, v[6], 15, -1560198380);\n        x = m(x, y, z, w, v[13], 21, 1309151649);\n        w = m(w, x, y, z, v[4], 6, -145523070);\n        z = m(z, w, x, y, v[11], 10, -1120210379);\n        y = m(y, z, w, x, v[2], 15, 718787259);\n        x = m(x, y, z, w, v[9], 21, -343485551);\n        u[0] = s(w, u[0]);\n        u[1] = s(x, u[1]);\n        u[2] = s(y, u[2]);\n        u[3] = s(z, u[3]);\n    };\n;\n    function i(u, v, w, x, y, z) {\n        v = s(s(v, u), s(x, z));\n        return s(((((v << y)) | ((v >>> ((32 - y)))))), w);\n    };\n;\n    function j(u, v, w, x, y, z, aa) {\n        return i(((((v & w)) | (((~v) & x)))), u, v, y, z, aa);\n    };\n;\n    function k(u, v, w, x, y, z, aa) {\n        return i(((((v & x)) | ((w & (~x))))), u, v, y, z, aa);\n    };\n;\n    function l(u, v, w, x, y, z, aa) {\n        return i(((((v ^ w)) ^ x)), u, v, y, z, aa);\n    };\n;\n    function m(u, v, w, x, y, z, aa) {\n        return i(((w ^ ((v | (~x))))), u, v, y, z, aa);\n    };\n;\n    function n(u) {\n        var v = u.length, w = [1732584193,-271733879,-1732584194,271733878,], x;\n        for (x = 64; ((x <= u.length)); x += 64) {\n            h(w, o(u.substring(((x - 64)), x)));\n        ;\n        };\n    ;\n        u = u.substring(((x - 64)));\n        var y = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,];\n        for (x = 0; ((x < u.length)); x++) {\n            y[((x >> 2))] |= ((u.charCodeAt(x) << ((((x & 3)) << 3))));\n        ;\n        };\n    ;\n        y[((x >> 2))] |= ((128 << ((((x & 3)) << 3))));\n        if (((x > 55))) {\n            h(w, y);\n            for (x = 0; ((x < 16)); x++) {\n                y[x] = 0;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        y[14] = ((v * 8));\n        h(w, y);\n        return w;\n    };\n;\n    function o(u) {\n        var v = [], w = 0;\n        while (((w < 64))) {\n            v[((w >> 2))] = ((((((u.charCodeAt(w++) | ((u.charCodeAt(w++) << 8)))) | ((u.charCodeAt(w++) << 16)))) | ((u.charCodeAt(w++) << 24))));\n        ;\n        };\n    ;\n        return v;\n    };\n;\n    var p = \"0123456789abcdef\".split(\"\");\n    function q(u) {\n        var v = \"\", w = 0;\n        for (; ((w < 4)); w++) {\n            v += ((p[((((u >> ((((w << 3)) + 4)))) & 15))] + p[((((u >> ((w << 3)))) & 15))]));\n        ;\n        };\n    ;\n        return v;\n    };\n;\n    function r(u) {\n        for (var v = 0; ((v < u.length)); v++) {\n            u[v] = q(u[v]);\n        ;\n        };\n    ;\n        return u.join(\"\");\n    };\n;\n    var s = function(u, v) {\n        return ((((u + v)) & 4294967295));\n    };\n    function t(u) {\n        if (((((null === u)) || ((undefined === u))))) {\n            return null;\n        }\n         else {\n            for (var v = 0; ((v < u.length)); v++) {\n                if (((u[v] > \"\"))) {\n                    u = g(u);\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return r(n(u));\n        }\n    ;\n    ;\n    };\n;\n    if (((t(\"hello\") != \"5d41402abc4b2a76b9719d911017c592\"))) {\n        s = function(u, v) {\n            var w = ((((u & 65535)) + ((v & 65535)))), x = ((((((u >> 16)) + ((v >> 16)))) + ((w >> 16))));\n            return ((((x << 16)) | ((w & 65535))));\n        };\n    }\n;\n;\n    e.exports = t;\n});\n__d(\"isRTL\", [], function(a, b, c, d, e, f) {\n    var g = ((\"A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02b8\\u0300-\\u0590\\u0800-\\u1fff\" + \"\\u200e\\u2c00-\\ufb1c\\ufe00-\\ufe6f\\ufefd-\\uffff\")), h = \"\\u0591-\\u07ff\\u200f\\ufb1d-\\ufdff\\ufe70-\\ufefc\", i = new RegExp(((((((((\"^[^\" + g)) + \"]*[\")) + h)) + \"]\"))), j = new RegExp(((((\"[\" + g)) + \"]\")));\n    function k(l) {\n        var m = 0, n = 0;\n        l.split(/\\s+/, 20).forEach(function(o) {\n            if (/^https?:\\/\\//.test(o)) {\n                return;\n            }\n        ;\n        ;\n            if (i.test(o)) {\n                n++;\n                m++;\n            }\n             else if (j.test(o)) {\n                m++;\n            }\n            \n        ;\n        ;\n        });\n        return !!((m && ((((n / m)) > 15895))));\n    };\n;\n    e.exports = k;\n});\n__d(\"WaterfallIDGenerator\", [\"Env\",\"md5\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"md5\");\n    function i() {\n        var l = 2147483647;\n        return ((Math.JSBNG__random() * l));\n    };\n;\n    function j() {\n        return Math.floor(((JSBNG__Date.now() / 1000)));\n    };\n;\n    var k = {\n        generate: function() {\n            return h([g.user,j(),i(),].join(\":\"));\n        }\n    };\n    e.exports = k;\n});\n__d(\"FeatureDetection\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\");\n    e.exports = {\n        isFileAPISupported: function() {\n            if (((((g.webkit() && !g.chrome())) && g.windows()))) {\n                return false;\n            }\n        ;\n        ;\n            return ((((\"JSBNG__FileList\" in window)) && ((\"JSBNG__FormData\" in window))));\n        },\n        isBlobFactorySupported: function() {\n            return !!a.JSBNG__Blob;\n        }\n    };\n});\n__d(\"AsyncUploadBase\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"Form\",\"FeatureDetection\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Form\"), k = b(\"FeatureDetection\"), l = b(\"copyProperties\"), m = b(\"removeFromArray\");\n    function n(p) {\n        this.setURI(p);\n    };\n;\n    n.isSupported = function() {\n        return k.isFileAPISupported();\n    };\n    l(n.prototype, g, {\n        _limit: 10,\n        setAllowCrossOrigin: function(p) {\n            this._allowCrossOrigin = !!p;\n            return this;\n        },\n        setData: function(p) {\n            this._data = p;\n            return this;\n        },\n        setLimit: function(p) {\n            this._limit = p;\n            return this;\n        },\n        setRelativeTo: function(p) {\n            this._relativeTo = p;\n            return this;\n        },\n        setStatusElement: function(p) {\n            this._statusElement = p;\n            return this;\n        },\n        setURI: function(p) {\n            this._uri = p;\n            return this;\n        },\n        suspend: function() {\n            this._suspended = true;\n            return this;\n        },\n        resume: function() {\n            this._suspended = false;\n            this._processQueue();\n            return this;\n        },\n        isUploading: function() {\n            return this._inFlight;\n        },\n        _createFileUpload: function(p, q, r) {\n            return new o(p, q, r);\n        },\n        _parseFiles: function(p) {\n            var q = {\n            };\n            {\n                var fin291keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin291i = (0);\n                var r;\n                for (; (fin291i < fin291keys.length); (fin291i++)) {\n                    ((r) = (fin291keys[fin291i]));\n                    {\n                        var s = p[r];\n                        if (Array.isArray(s)) {\n                            q[r] = s;\n                        }\n                         else {\n                            q[r] = [];\n                            if (((s instanceof window.JSBNG__FileList))) {\n                                for (var t = 0; ((t < s.length)); t++) {\n                                    q[r].push(s.item(t));\n                                ;\n                                };\n                            ;\n                            }\n                             else if (((((s instanceof window.JSBNG__File)) || ((s instanceof window.JSBNG__Blob))))) {\n                                q[r].push(s);\n                            }\n                            \n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return q;\n        },\n        _processQueue: function() {\n            if (this._suspended) {\n                return;\n            }\n        ;\n        ;\n            while (((this._pending.length < this._limit))) {\n                if (!this._waiting.length) {\n                    break;\n                }\n            ;\n            ;\n                var p = this._waiting.shift();\n                this._processUpload(p);\n                this._pending.push(p);\n            };\n        ;\n        },\n        _processUpload: function(p) {\n            var q = j.createFormData(((p.getData() || this._data)));\n            if (p.getFile()) {\n                q.append(p.getName(), p.getFile());\n                q.append(\"upload_id\", p.getFile().uploadID);\n            }\n        ;\n        ;\n            var r = new h().setAllowCrossOrigin(this._allowCrossOrigin).setURI(this._uri).setRawData(q).setRelativeTo(this._relativeTo).setStatusElement(this._statusElement).setHandler(this._success.bind(this, p)).setErrorHandler(this._failure.bind(this, p)).setUploadProgressHandler(this._progress.bind(this, p)).setInitialHandler(this._initial.bind(this, p));\n            r.send();\n            p.setAsyncRequest(r);\n            this._inFlight = true;\n            this.inform(\"start\", p);\n        },\n        _abort: function(p) {\n            m(this._waiting, p);\n            p.abort();\n        },\n        _initial: function(p) {\n            this.inform(\"initial\", p);\n        },\n        _success: function(p, q) {\n            this._complete(p);\n            this.inform(\"success\", p.handleSuccess(q));\n            this._processQueue();\n        },\n        _failure: function(p, q) {\n            this._complete(p);\n            if (((this.inform(\"failure\", p.handleFailure(q)) !== false))) {\n                i.defaultErrorHandler(q);\n            }\n        ;\n        ;\n            this._processQueue();\n        },\n        _progress: function(p, JSBNG__event) {\n            this.inform(\"progress\", p.handleProgress(JSBNG__event));\n        },\n        _complete: function(p) {\n            m(this._pending, p);\n            if (!this._pending.length) {\n                this._inFlight = false;\n            }\n        ;\n        ;\n        }\n    });\n    var o = function(p, q, r) {\n        this._name = p;\n        this._file = q;\n        this._data = r;\n        this._success = null;\n        this._response = null;\n        this._progressEvent = null;\n        this._request = null;\n    };\n    l(o.prototype, {\n        getName: function() {\n            return this._name;\n        },\n        getFile: function() {\n            return this._file;\n        },\n        getData: function() {\n            return this._data;\n        },\n        isComplete: function() {\n            return ((this._success !== null));\n        },\n        isSuccess: function() {\n            return ((this._success === true));\n        },\n        getResponse: function() {\n            return this._response;\n        },\n        getProgressEvent: function() {\n            return this._progressEvent;\n        },\n        setAsyncRequest: function(p) {\n            this._request = p;\n            return this;\n        },\n        isWaiting: function() {\n            return !this._request;\n        },\n        abort: function() {\n            ((this._request && this._request.abort()));\n            this._request = null;\n        },\n        handleSuccess: function(p) {\n            this._success = true;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleFailure: function(p) {\n            this._success = false;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleProgress: function(JSBNG__event) {\n            this._progressEvent = JSBNG__event;\n            return this;\n        }\n    });\n    e.exports = n;\n});\n__d(\"AsyncUploadRequest\", [\"AsyncUploadBase\",\"Class\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncUploadBase\"), h = b(\"Class\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n;\n    j.isSupported = function() {\n        return g.isSupported();\n    };\n    h.extend(j, g);\n    i(j.prototype, {\n        setFiles: function(k) {\n            this._files = this._parseFiles(k);\n            return this;\n        },\n        send: function() {\n            if (this._inFlight) {\n                return;\n            }\n        ;\n        ;\n            this._inFlight = true;\n            this._uploads = [];\n            {\n                var fin292keys = ((window.top.JSBNG_Replay.forInKeys)((this._files))), fin292i = (0);\n                var k;\n                for (; (fin292i < fin292keys.length); (fin292i++)) {\n                    ((k) = (fin292keys[fin292i]));\n                    {\n                        this._files[k].forEach(function(l) {\n                            this._uploads.push(this._createFileUpload(k, l));\n                        }.bind(this));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (this._uploads.length) {\n                this._waiting = this._uploads.slice(0);\n                this._pending = [];\n                this._processQueue();\n            }\n             else this._processUpload(this._createFileUpload(null, null));\n        ;\n        ;\n        },\n        _processQueue: function() {\n            this.parent._processQueue();\n            if (((!this._pending.length && !this._waiting.length))) {\n                this.inform(\"complete\", this._uploads);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"FileForm\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"AsyncUploadRequest\",\"BehaviorsMixin\",\"DataStore\",\"DOMQuery\",\"Env\",\"JSBNG__Event\",\"Form\",\"JSONPTransport\",\"Parent\",\"URI\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"AsyncUploadRequest\"), k = b(\"BehaviorsMixin\"), l = b(\"DataStore\"), m = b(\"DOMQuery\"), n = b(\"Env\"), o = b(\"JSBNG__Event\"), p = b(\"Form\"), q = b(\"JSONPTransport\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"copyProperties\"), u = b(\"shield\");\n    function v(y) {\n        var z = {\n        }, aa = m.scry(y, \"input[type=\\\"file\\\"]\");\n        aa.forEach(function(ba) {\n            z[ba.JSBNG__name] = ba.files;\n        });\n        return z;\n    };\n;\n    function w(y) {\n        var z = m.scry(y, \"input[type=\\\"file\\\"]\");\n        z.forEach(function(aa) {\n            aa.files = null;\n        });\n    };\n;\n    function x(y, z, aa) {\n        if (((y.getAttribute(\"rel\") === \"async\"))) {\n            throw new Error(\"FileForm cannot be used with Primer forms.\");\n        }\n    ;\n    ;\n        if (((y.getAttribute(\"method\").toUpperCase() !== \"POST\"))) {\n            throw new Error(\"FileForm must be used with POST forms.\");\n        }\n    ;\n    ;\n        this._form = y;\n        this._previousEncoding = this._form.enctype;\n        this._form.enctype = this._form.encoding = \"multipart/form-data\";\n        ((z && this.enableBehaviors(z)));\n        this._options = ((aa || {\n        }));\n        this.setAllowCrossOrigin(this._options.allowCrossOrigin);\n        this.setUploadInParallel(this._options.uploadInParallel);\n        this._listener = o.listen(this._form, \"submit\", this._submit.bind(this));\n        l.set(this._form, \"FileForm\", this);\n    };\n;\n    t(x, {\n        EVENTS: [\"start\",\"submit\",\"initial\",\"progress\",\"success\",\"failure\",],\n        getInstance: function(y) {\n            return l.get(y, \"FileForm\");\n        }\n    });\n    t(x.prototype, g, k, {\n        getRoot: function() {\n            return this._form;\n        },\n        setAllowCrossOrigin: function(y) {\n            this._allowCrossOrigin = !!y;\n            return this;\n        },\n        setUploadInParallel: function(y) {\n            this._uploadInParallel = !!y;\n            return this;\n        },\n        _submit: function(JSBNG__event) {\n            if (((this.inform(\"submit\") === false))) {\n                JSBNG__event.prevent();\n                return;\n            }\n        ;\n        ;\n            var y = ((\"JSBNG__FormData\" in window));\n            if (y) {\n                if (((!s(this._form.action).isSameOrigin() && !this._allowCrossOrigin))) {\n                    y = false;\n                }\n            ;\n            }\n        ;\n        ;\n            return ((y ? this._sendViaXHR(JSBNG__event) : this._sendViaFrame(JSBNG__event)));\n        },\n        _sendViaFrame: function(JSBNG__event) {\n            var y = this._request = new h();\n            y.setStatusElement(this._getStatusElement());\n            y.addStatusIndicator();\n            y.setOption(\"useIframeTransport\", true);\n            var z = y.handleResponse.bind(y), aa = new q(\"div\", this._form.action, z), ba = aa.getTransportFrame(), ca = aa.getRequestURI().addQueryData({\n                __iframe: true,\n                __user: n.user\n            });\n            this._form.setAttribute(\"action\", ca.toString());\n            this._form.setAttribute(\"target\", ba.JSBNG__name);\n            y.setJSONPTransport(aa);\n            y.setURI(ca);\n            y.setHandler(this.success.bind(this, null));\n            y.setErrorHandler(this.failure.bind(this, null));\n            y.setInitialHandler(u(this.initial, this, null));\n        },\n        _sendViaXHR: function(JSBNG__event) {\n            var y;\n            if (((this._uploadInParallel && j.isSupported()))) {\n                y = new j().setData(p.serialize(this._form)).setFiles(v(this._form));\n                var z = [y.subscribe(\"progress\", function(aa, ba) {\n                    this.progress(ba, ba.getProgressEvent());\n                }.bind(this)),y.subscribe(\"initial\", function(aa, ba) {\n                    this.initial(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"success\", function(aa, ba) {\n                    this.success(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"start\", function(aa, ba) {\n                    this.inform(\"start\", {\n                        upload: ba\n                    });\n                }.bind(this)),y.subscribe(\"failure\", function(aa, ba) {\n                    this.failure(ba, ba.getResponse());\n                    return false;\n                }.bind(this)),y.subscribe(\"complete\", function() {\n                    while (z.length) {\n                        z.pop().unsubscribe();\n                    ;\n                    };\n                ;\n                }),];\n            }\n             else y = new h().setRawData(p.createFormData(this._form)).setHandler(this.success.bind(this, null)).setErrorHandler(this.failure.bind(this, null)).setUploadProgressHandler(this.progress.bind(this, null)).setInitialHandler(u(this.initial, this, null));\n        ;\n        ;\n            y.setAllowCrossOrigin(this._allowCrossOrigin).setRelativeTo(this._form).setStatusElement(this._getStatusElement()).setURI(this._form.action).send();\n            this._request = y;\n            JSBNG__event.prevent();\n        },\n        initial: function(y) {\n            return this.inform(\"initial\", {\n                upload: y\n            });\n        },\n        success: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if (((this.inform(\"success\", aa) !== false))) {\n                o.fire(this._form, \"success\", aa);\n            }\n        ;\n        ;\n            this._cleanup();\n        },\n        failure: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if (((this.inform(\"failure\", aa) !== false))) {\n                if (((o.fire(this._form, \"error\", aa) !== false))) {\n                    i.defaultErrorHandler(z);\n                }\n            ;\n            }\n        ;\n        ;\n            this._cleanup();\n        },\n        progress: function(y, JSBNG__event) {\n            this.inform(\"progress\", {\n                JSBNG__event: JSBNG__event,\n                upload: y\n            });\n        },\n        abort: function() {\n            if (this._request) {\n                this._request.abort();\n                this._cleanup();\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            w(this._form);\n        },\n        destroy: function() {\n            this._cleanup();\n            this._listener.remove();\n            this._listener = null;\n            this._form.enctype = this._form.encoding = this._previousEncoding;\n            l.remove(this._form, \"FileForm\");\n        },\n        _cleanup: function() {\n            this._request = null;\n        },\n        _getStatusElement: function() {\n            return ((r.byClass(this._form, \"stat_elem\") || this._form));\n        }\n    });\n    e.exports = x;\n});\n__d(\"FileFormResetOnSubmit\", [\"DOMQuery\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._form = j;\n    };\n;\n    h(i.prototype, {\n        enable: function() {\n            this._subscription = this._form.subscribe(\"submit\", Function.prototype.defer.bind(this._reset.bind(this)));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _reset: function() {\n            var j = g.scry(this._form.getRoot(), \"input[type=\\\"file\\\"]\");\n            j.forEach(function(k) {\n                k.value = \"\";\n            });\n        }\n    });\n    e.exports = i;\n});\n__d(\"submitForm\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = function(i) {\n        var j = g.scry(i, \"input[type=\\\"submit\\\"]\")[0];\n        if (j) {\n            j.click();\n        }\n         else {\n            j = g.create(\"input\", {\n                type: \"submit\",\n                className: \"hidden_elem\"\n            });\n            g.appendContent(i, j);\n            j.click();\n            g.remove(j);\n        }\n    ;\n    ;\n    };\n    e.exports = h;\n});\n__d(\"FormSubmitOnChange\", [\"JSBNG__Event\",\"copyProperties\",\"submitForm\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"submitForm\");\n    function j(k) {\n        this._form = k;\n    };\n;\n    h(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._form.getRoot(), \"change\", this._submit.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _submit: function() {\n            i(this._form.getRoot());\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFileUploader\", [\"ArbiterMixin\",\"CSS\",\"Dialog\",\"DOM\",\"JSBNG__Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachment\",\"MercuryAttachmentTemplates\",\"MercuryConstants\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getObjectValues\",\"shield\",\"startsWith\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"Dialog\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"FileForm\"), m = b(\"FileFormResetOnSubmit\"), n = b(\"FileInput\"), o = b(\"FormSubmitOnChange\"), p = b(\"MercuryAttachment\"), q = b(\"MercuryAttachmentTemplates\"), r = b(\"MercuryConstants\"), s = b(\"SubscriptionsHandler\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"getObjectValues\"), w = b(\"shield\"), x = b(\"startsWith\"), y = b(\"tx\"), z = 0;\n    function aa(ca, da, ea, fa) {\n        this._parentElem = ca;\n        this._attachments = {\n        };\n        this._imageIDs = {\n        };\n        this._uploading = {\n        };\n        this._uploadTemplates = {\n        };\n        this._uploadStartTimes = {\n        };\n        this._subscriptionsHandler = new s();\n        this._fileForm = new l(da, [o,m,]);\n        this._fileForm.setAllowCrossOrigin(true);\n        this._fileForm.setUploadInParallel(true);\n        var ga = j.JSBNG__find(da, \".-cx-PRIVATE-mercuryFileUploader__root\"), ha = j.JSBNG__find(ga, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new n(ga, ha, ea);\n        h.hide(this._parentElem);\n        this._subscriptionsHandler.addSubscriptions(this._fileForm.subscribe(\"submit\", function() {\n            var ia = ((\"upload_\" + z++));\n            fa.value = ia;\n            var ja = {\n                count: 0,\n                file_sizes: []\n            };\n            if (ea.files) {\n                for (var ka = 0; ((ka < ea.files.length)); ka++) {\n                    if (((ea.files[ka].size > r.AttachmentMaxSize))) {\n                        this._fileForm.abort();\n                        this._fileForm.clear();\n                        new i().setTitle(\"The file you have selected is too large\").setBody(\"The file you have selected is too large. The maximum size is 25MB.\").setButtons(i.OK).setSemiModal(true).show();\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n                for (var la = 0; ((la < ea.files.length)); la++) {\n                    this._addFileUploadRow(ia, ea.files[la].JSBNG__name);\n                    ja.count++;\n                    ja.file_sizes.push(ea.files[la].size);\n                };\n            ;\n            }\n             else {\n                this._addFileUploadRow(ia, ea.value);\n                ja.count = 1;\n            }\n        ;\n        ;\n            this.inform(\"submit\", ja);\n        }.bind(this)), this._fileForm.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), this._fileForm.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), k.listen(ha, \"click\", w(this.inform, this, \"open\")));\n    };\n;\n    t(aa.prototype, g, {\n        isUploading: function() {\n            return !!Object.keys(this._uploading).length;\n        },\n        getAttachments: function() {\n            return v(this._attachments);\n        },\n        getImageIDs: function() {\n            return v(this._imageIDs);\n        },\n        removeAttachments: function() {\n            v(this._uploadTemplates).forEach(function(ca) {\n                if (ca) {\n                    j.remove(ca.getRoot());\n                }\n            ;\n            ;\n            });\n            this._attachments = {\n            };\n            this._imageIDs = {\n            };\n            this._uploadTemplates = {\n            };\n            this._uploading = {\n            };\n            this._uploadStartTimes = {\n            };\n            h.hide(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n            this._fileForm.destroy();\n            this.removeAttachments();\n        },\n        _addFileUploadRow: function(ca, da) {\n            var ea = q[\":fb:mercury:upload-file-row\"].build(), fa = ba(da), ga = ((((ca + \"/\")) + fa));\n            this._uploadTemplates[ga] = ea;\n            this._uploading[ga] = true;\n            this._uploadStartTimes[ga] = JSBNG__Date.now();\n            j.appendContent(ea.getNode(\"iconText\"), fa);\n            k.listen(ea.getNode(\"closeFileUpload\"), \"click\", this._removeFileUploader.bind(this, ga));\n            j.appendContent(this._parentElem, ea.getRoot());\n            h.show(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        _removeFileUploader: function(ca, JSBNG__event) {\n            if (this._uploading[ca]) {\n                this.inform(\"upload-canceled-during-upload\");\n            }\n             else if (((this._attachments[ca] || this._imageIDs[ca]))) {\n                this.inform(\"upload-canceled-after-uploaded\");\n            }\n            \n        ;\n        ;\n            delete this._attachments[ca];\n            delete this._imageIDs[ca];\n            delete this._uploading[ca];\n            delete this._uploadStartTimes[ca];\n            var da = this._uploadTemplates[ca];\n            delete this._uploadTemplates[ca];\n            if (da) {\n                j.remove(da.getRoot());\n                this.inform(\"dom-updated\");\n            }\n        ;\n        ;\n            this.inform(\"upload-canceled\");\n            return false;\n        },\n        _updateFileUploader: function(ca, da) {\n            var ea = this._uploadTemplates[ca], fa = p.getAttachIconClassByMime(da);\n            h.addClass(ea.getNode(\"iconText\"), fa);\n            h.addClass(ea.getRoot(), \"done\");\n        },\n        _onFileUploadSuccess: function(JSBNG__event, ca) {\n            var da = ca.response.getPayload(), ea = da.uploadID, fa = da.metadata;\n            for (var ga = 0; ((ga < fa.length)); ga++) {\n                var ha = ((((ea + \"/\")) + fa[ga].filename));\n                if (this._uploading[ha]) {\n                    delete this._uploading[ha];\n                    if (fa[ga].image_id) {\n                        this._imageIDs[ha] = fa[ga].image_id;\n                    }\n                     else this._attachments[ha] = fa[ga];\n                ;\n                ;\n                    this._updateFileUploader(ha, fa[ga].filetype);\n                    this.inform(\"one-upload-completed\", {\n                        upload_time_ms: ((JSBNG__Date.now() - this._uploadStartTimes[ha]))\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            if (!this.isUploading()) {\n                this.inform(\"all-uploads-completed\", {\n                    count: this.getAttachments().length\n                });\n            }\n        ;\n        ;\n        },\n        _onFileUploadFailure: function(JSBNG__event, ca) {\n            this.inform(\"one-upload-failed\");\n        }\n    });\n    function ba(ca) {\n        if (((ca && x(ca, \"C:\\\\fakepath\\\\\")))) {\n            return ca.substring(12);\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    e.exports = aa;\n});\n__d(\"JoinableConversationMessageFilter\", [\"MercuryLogMessageType\",\"MercuryThreads\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryLogMessageType\"), h = b(\"MercuryThreads\").get(), i = b(\"MercuryParticipants\"), j = {\n        _isFilterable: function(k) {\n            var l = k.log_message_type;\n            if (!l) {\n                return false;\n            }\n        ;\n        ;\n            if (((l == g.JOINABLE_JOINED))) {\n                return ((k.log_message_data.joined_participant !== i.user));\n            }\n        ;\n        ;\n            if (((((l == g.UNSUBSCRIBE)) || ((l == g.SUBSCRIBE))))) {\n                var m = h.getThreadMetaNow(k.thread_id);\n                if (((m && m.is_joinable))) {\n                    return ((k.author !== i.user));\n                }\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n            return false;\n        },\n        filterMessages: function(k, l, m) {\n            var n = [];\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = l[o];\n                if (j._isFilterable(p)) {\n                    if (m) {\n                        k(p);\n                    }\n                ;\n                ;\n                }\n                 else n.push(p);\n            ;\n            ;\n            };\n        ;\n            return n;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreadMuter\", [\"AsyncDialog\",\"AsyncRequest\",\"Env\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"MercuryThreads\").get(), k = {\n        getUserIDEmail: function() {\n            return ((i.user + \"@facebook.com\"));\n        },\n        getThreadMuteSettingForUser: function(l) {\n            return ((l.mute_settings && l.mute_settings[k.getUserIDEmail()]));\n        },\n        isThreadMuted: function(l) {\n            return ((k.getThreadMuteSettingForUser(l) !== undefined));\n        },\n        showMuteChangeDialog: function(l, m) {\n            g.send(new h(\"/ajax/mercury/mute_thread_dialog.php\").setData({\n                muting: l\n            }), function(n) {\n                n.subscribe(\"JSBNG__confirm\", function() {\n                    this.hide();\n                    j.updateThreadMuteSetting(m, l);\n                }.bind(n));\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"JoinStatusTabSheet\", [\"copyProperties\",\"DOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"DOM\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercuryParticipants\");\n    function k(l, m) {\n        this._rootElement = l;\n        this._messageQueue = [];\n        this._sheetView = m;\n    };\n;\n    g(k.prototype, {\n        _setMessage: function(l, m) {\n            var n = l.author, o = l.log_message_type;\n            if (((o == i.JOINABLE_JOINED))) {\n                var p = l.log_message_data.joined_participant;\n                if (((p !== j.user))) {\n                    j.get(p, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} joined the chat.\", {\n                            actor: s.JSBNG__name\n                        }));\n                    });\n                }\n            ;\n            ;\n            }\n             else if (((o == i.UNSUBSCRIBE))) {\n                if (((n !== j.user))) {\n                    j.get(n, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} left the conversation.\", {\n                            actor: s.JSBNG__name\n                        }));\n                    });\n                }\n            ;\n            ;\n            }\n             else if (((o == i.SUBSCRIBE))) {\n                if (((n !== j.user))) {\n                    var q = l.log_message_data.added_participants;\n                    if (((q && ((q.length > 0))))) {\n                        var r = [n,q[0],];\n                        j.getMulti(r, function(s) {\n                            h.setContent(m, h.tx._(\"{actor} added {subscriber1}.\", {\n                                actor: s[n].JSBNG__name,\n                                subscriber1: s[q[0]].JSBNG__name\n                            }));\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n            \n            \n        ;\n        ;\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getCloseTimeout: function() {\n            return 2000;\n        },\n        getType: function() {\n            return \"join_status_type\";\n        },\n        addToQueue: function(l) {\n            this._messageQueue.push(l);\n            if (((this._messageQueue.length === 1))) {\n                this._open();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var l = this._messageQueue[0], m = this._getTemplate().build();\n            this._setMessage(l, m.getNode(\"text\"));\n            h.setContent(this._rootElement, m.getRoot());\n        },\n        _open: function() {\n            this._sheetView.open(this);\n        },\n        autoCloseCallback: function() {\n            this._messageQueue.shift();\n            if (((this._messageQueue.length > 0))) {\n                this._open();\n            }\n        ;\n        ;\n        },\n        couldNotReplace: function() {\n            this._open.bind(this).defer(this.getCloseTimeout(), false);\n        }\n    });\n    e.exports = k;\n});\n__d(\"WebMessengerEvents\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = h(new g(), {\n        MASTER_DOM_CHANGED: \"master-dom-changed\",\n        DETAIL_DOM_CHANGED: \"detail-dom-changed\",\n        FOCUS_COMPOSER: \"focus-composer\",\n        FOCUS_SEARCH: \"focus-search\",\n        FOCUS_AND_SELECT_SEARCH: \"focus-and-select-search\",\n        SUBMIT_REPLY: \"submit-reply\",\n        UPDATE_SELECTION: \"update-selection\",\n        masterDOMChanged: function() {\n            this.inform(i.MASTER_DOM_CHANGED);\n        },\n        detailDOMChanged: function() {\n            this.inform(i.DETAIL_DOM_CHANGED);\n        },\n        focusComposer: function() {\n            this.inform(i.FOCUS_COMPOSER);\n        },\n        focusSearch: function() {\n            this.inform(i.FOCUS_SEARCH);\n        },\n        focusAndSelectSearch: function() {\n            this.inform(i.FOCUS_AND_SELECT_SEARCH);\n        },\n        updateSelection: function(j) {\n            this.inform(i.UPDATE_SELECTION, j);\n        },\n        submitReply: function() {\n            this.inform(i.SUBMIT_REPLY);\n        }\n    });\n    e.exports = i;\n});\n__d(\"WebMessengerSubscriptionsHandler\", [\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"SubscriptionsHandler\"), h = new g(\"webmessenger\");\n    e.exports = h;\n});\n__d(\"isWebMessengerURI\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/^(\\/messages)/).test(h.getPath());\n    };\n;\n    e.exports = g;\n});\n__d(\"WebMessengerWidthControl\", [\"Arbiter\",\"CSS\",\"CSSClassTransition\",\"DOMDimensions\",\"JSBNG__Event\",\"Style\",\"URI\",\"ViewportBounds\",\"WebMessengerEvents\",\"shield\",\"WebMessengerSubscriptionsHandler\",\"$\",\"cx\",\"isWebMessengerURI\",\"JSBNG__requestAnimationFrame\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"CSSClassTransition\"), j = b(\"DOMDimensions\"), k = b(\"JSBNG__Event\"), l = b(\"Style\"), m = b(\"URI\"), n = b(\"ViewportBounds\"), o = b(\"WebMessengerEvents\"), p = b(\"shield\"), q = b(\"WebMessengerSubscriptionsHandler\"), r = b(\"$\"), s = b(\"cx\"), t = b(\"isWebMessengerURI\"), u = b(\"JSBNG__requestAnimationFrame\"), v = b(\"throttle\"), w = 205, x = 981, y = 257, z = 18, aa = 848, ba = 724, ca = 35554, da = 56, ea, fa, ga;\n    function ha(ma, na, oa) {\n        this.masterChanged = ma;\n        this.detailChaned = na;\n        q.addSubscriptions(k.listen(window, \"resize\", v(p(ia, this, this), 100)), g.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], p(ia, this, this), g.SUBSCRIBE_NEW));\n        var pa = ((la() ? da : 0));\n        if (oa) {\n            pa = w;\n        }\n    ;\n    ;\n        this._width = ((la() ? 0 : aa));\n        ga = true;\n        ia(this, pa);\n    };\n;\n    function ia(ma, na) {\n        var oa = ((n.getRight() + n.getLeft()));\n        oa = ((((oa || na)) || 0));\n        var pa = ((j.getViewportWithoutScrollbarDimensions().width - oa)), qa = Math.round(Math.max(0, ((((pa / 2)) - ((x / 2))))));\n        pa = ((((x + qa)) - y));\n        pa -= z;\n        pa = Math.max(ba, Math.min(aa, pa));\n        if (((!isNaN(pa) && ((ma._width !== pa))))) {\n            ma._width = pa;\n            var ra = Math.round(((pa / ((1 + ca))))), sa = ((pa - ra));\n            ma.masterChanged(sa);\n            ma.detailChaned(ra);\n            if (la()) {\n                var ta = ((pa + y));\n                ja(function() {\n                    if (fa) {\n                        JSBNG__document.body.className = fa;\n                        fa = \"\";\n                    }\n                ;\n                ;\n                    ka(((ta + \"px\")));\n                    h.removeClass(JSBNG__document.body, \"-cx-PRIVATE-fbWMWidthControl__firstload\");\n                    ((ga && o.detailDOMChanged()));\n                    ga = false;\n                }, fa);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ja(ma, na) {\n        ((na && h.addClass(JSBNG__document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\")));\n        u(ma);\n        ((na && h.removeClass.curry(JSBNG__document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\").defer(1000, false)));\n    };\n;\n    function ka(ma) {\n        l.set(r(\"pageHead\"), \"width\", ma);\n        l.set(r(\"globalContainer\"), \"width\", ma);\n    };\n;\n    function la() {\n        if (!ea) {\n            ea = h.hasClass(JSBNG__document.body, \"-cx-PUBLIC-hasLitestand__body\");\n        }\n    ;\n    ;\n        return ea;\n    };\n;\n    i.registerHandler(function(ma, na, oa, pa) {\n        function qa(ra) {\n            return ((la() && t(m(ra))));\n        };\n    ;\n        if (qa(pa)) {\n            fa = na;\n            return true;\n        }\n         else if (qa(oa)) {\n            ja(function() {\n                ma.className = na;\n                ka(\"\");\n            }, true);\n            return true;\n        }\n        \n    ;\n    ;\n    });\n    e.exports = ha;\n});\n__d(\"TextInputControl\", [\"JSBNG__Event\",\"function-extensions\",\"Class\",\"DOMControl\",\"Input\",\"copyProperties\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Class\"), i = b(\"DOMControl\"), j = b(\"Input\"), k = b(\"copyProperties\"), l = b(\"debounce\");\n    function m(n) {\n        this.parent.construct(this, n);\n        var o = this.getRoot(), p = l(this.update.bind(this), 0);\n        g.listen(o, {\n            input: p,\n            keydown: p,\n            paste: p\n        });\n    };\n;\n    h.extend(m, i);\n    k(m.prototype, {\n        setMaxLength: function(n) {\n            j.setMaxLength(this.getRoot(), n);\n            return this;\n        },\n        getValue: function() {\n            return j.getValue(this.getRoot());\n        },\n        isEmpty: function() {\n            return j.isEmpty(this.getRoot());\n        },\n        setValue: function(n) {\n            j.setValue(this.getRoot(), n);\n            this.update();\n            return this;\n        },\n        clear: function() {\n            return this.setValue(\"\");\n        },\n        setPlaceholderText: function(n) {\n            j.setPlaceholder(this.getRoot(), n);\n            return this;\n        }\n    });\n    e.exports = m;\n});\n__d(\"JSBNG__TextMetrics\", [\"JSBNG__Event\",\"DOM\",\"Style\",\"UserAgent\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"debounce\"), l;\n    function m() {\n        if (((typeof l === \"undefined\"))) {\n            var o = h.create(\"div\", {\n                className: \"webkitZoomTest\"\n            }), p = function() {\n                h.appendContent(JSBNG__document.body, o);\n                l = ((100 / o.clientHeight));\n                h.remove(o);\n            };\n            g.listen(window, \"resize\", k(p, 100));\n            p();\n        }\n    ;\n    ;\n        return l;\n    };\n;\n    function n(o, p) {\n        this._node = o;\n        this._flexible = !!p;\n        var q = \"textarea\", r = \"textMetrics\";\n        if (this._flexible) {\n            q = \"div\";\n            r += \" textMetricsInline\";\n        }\n    ;\n    ;\n        this._shadow = h.create(q, {\n            className: r\n        });\n        var s = [\"fontSize\",\"fontStyle\",\"fontWeight\",\"fontFamily\",\"wordWrap\",];\n        s.forEach(function(u) {\n            i.set(this._shadow, u, i.get(o, u));\n        }.bind(this));\n        var t = i.get(o, \"lineHeight\");\n        if (((j.chrome() || j.webkit()))) {\n            t = ((Math.round(((parseInt(t, 10) * m()))) + \"px\"));\n        }\n    ;\n    ;\n        i.set(this._shadow, \"lineHeight\", t);\n        JSBNG__document.body.appendChild(this._shadow);\n    };\n;\n    n.prototype.measure = function(o) {\n        var p = this._node, q = this._shadow;\n        o = ((((o || p.value)) + \"...\"));\n        if (!this._flexible) {\n            var r = ((((p.clientWidth - i.getFloat(p, \"paddingLeft\"))) - i.getFloat(p, \"paddingRight\")));\n            i.set(q, \"width\", ((Math.max(r, 0) + \"px\")));\n        }\n    ;\n    ;\n        h.setContent(q, o);\n        return {\n            width: q.scrollWidth,\n            height: q.scrollHeight\n        };\n    };\n    n.prototype.destroy = function() {\n        h.remove(this._shadow);\n    };\n    e.exports = n;\n});\n__d(\"TextAreaControl\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"CSS\",\"DOMControl\",\"Style\",\"TextInputControl\",\"JSBNG__TextMetrics\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"CSS\"), l = b(\"DOMControl\"), m = b(\"Style\"), n = b(\"TextInputControl\"), o = b(\"JSBNG__TextMetrics\"), p = b(\"copyProperties\");\n    function q(s, t) {\n        return ((m.getFloat(s, t) || 0));\n    };\n;\n    function r(s) {\n        this.autogrow = k.hasClass(s, \"uiTextareaAutogrow\");\n        this.parent.construct(this, s);\n        this.width = null;\n        g.listen(s, \"JSBNG__focus\", this._handleFocus.bind(this));\n    };\n;\n    j.extend(r, n);\n    p(r.prototype, i, {\n        setAutogrow: function(s) {\n            this.autogrow = s;\n            return this;\n        },\n        onupdate: function() {\n            this.parent.onupdate();\n            if (this.autogrow) {\n                var s = this.getRoot();\n                if (!this.metrics) {\n                    this.metrics = new o(s);\n                }\n            ;\n            ;\n                if (((typeof this.initialHeight === \"undefined\"))) {\n                    this.isBorderBox = ((((((m.get(s, \"box-sizing\") === \"border-box\")) || ((m.get(s, \"-moz-box-sizing\") === \"border-box\")))) || ((m.get(s, \"-webkit-box-sizing\") === \"border-box\"))));\n                    this.borderBoxOffset = ((((((q(s, \"padding-top\") + q(s, \"padding-bottom\"))) + q(s, \"border-top-width\"))) + q(s, \"border-bottom-width\")));\n                    this.initialHeight = ((s.offsetHeight - this.borderBoxOffset));\n                }\n            ;\n            ;\n                var t = this.metrics.measure(), u = Math.max(this.initialHeight, t.height);\n                if (this.isBorderBox) {\n                    u += this.borderBoxOffset;\n                }\n            ;\n            ;\n                if (((u !== this.height))) {\n                    this.height = u;\n                    m.set(s, \"height\", ((u + \"px\")));\n                    h.inform(\"reflow\");\n                    this.inform(\"resize\");\n                }\n            ;\n            ;\n            }\n             else if (this.metrics) {\n                this.metrics.destroy();\n                this.metrics = null;\n            }\n            \n        ;\n        ;\n        },\n        resetHeight: function() {\n            this.height = -1;\n            this.update();\n        },\n        _handleFocus: function() {\n            this.width = null;\n        }\n    });\n    r.getInstance = function(s) {\n        return ((l.getInstance(s) || new r(s)));\n    };\n    e.exports = r;\n});\n__d(\"MessagesEmoticonView\", [\"DOM\",\"EmoticonsList\",\"JSBNG__Event\",\"Focus\",\"InputSelection\",\"Keys\",\"Parent\",\"SubscriptionsHandler\",\"TextAreaControl\",\"Toggler\",\"copyProperties\",\"endsWith\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoticonsList\"), i = b(\"JSBNG__Event\"), j = b(\"Focus\"), k = b(\"InputSelection\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"SubscriptionsHandler\"), o = b(\"TextAreaControl\"), p = b(\"Toggler\"), q = b(\"copyProperties\"), r = b(\"endsWith\"), s = b(\"startsWith\"), t = h.symbols;\n    function u(w, x, y) {\n        var z = m.byClass(w, \"emoticon\");\n        if (!z) {\n            return;\n        }\n    ;\n    ;\n        var aa = \"emoticon_\", ba = null;\n        z.className.split(\" \").forEach(function(ia) {\n            if (s(ia, aa)) {\n                ba = ia.substring(aa.length);\n            }\n        ;\n        ;\n        });\n        if (!t[ba]) {\n            return;\n        }\n    ;\n    ;\n        var ca = o.getInstance(x), da = ca.getValue(), ea = t[ba], fa = da.substring(0, y.start), ga = da.substring(y.end);\n        if (((((y.start > 0)) && !r(fa, \" \")))) {\n            ea = ((\" \" + ea));\n        }\n    ;\n    ;\n        if (!s(ga, \" \")) {\n            ea += \" \";\n        }\n    ;\n    ;\n        var ha = ((((fa + ea)) + ga));\n        y.start += ea.length;\n        y.end = y.start;\n        ca.setValue(ha);\n        k.set(x, y.start, y.end);\n        return true;\n    };\n;\n    function v(w, x) {\n        var y = {\n            start: 0,\n            end: 0\n        };\n        function z() {\n            y = k.get(x);\n        };\n    ;\n        var aa = g.JSBNG__find(w, \".uiToggleFlyout\");\n        this._subscriptions = new n();\n        this._subscriptions.addSubscriptions(p.subscribe(\"show\", function(ba, ca) {\n            if (((ca.active && g.contains(w, ca.active)))) {\n                k.set(x, y.start, y.end);\n                var da = g.scry(aa, \"a.emoticon\")[0];\n                j.setWithoutOutline(da);\n            }\n        ;\n        ;\n        }), i.listen(aa, \"click\", function(JSBNG__event) {\n            var ba = u(JSBNG__event.getTarget(), x, y);\n            ((ba && p.hide(w)));\n        }), i.listen(aa, \"keyup\", function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === l.ESC))) {\n                p.hide(w);\n                k.set(x, y.start, y.end);\n            }\n        ;\n        ;\n        }), i.listen(x, \"keyup\", z), i.listen(x, \"click\", z));\n    };\n;\n    q(v.prototype, {\n        destroy: function() {\n            this._subscriptions.release();\n            this._subscriptions = null;\n        }\n    });\n    q(v, {\n        create: function(w, x) {\n            return new v(w, x);\n        }\n    });\n    e.exports = v;\n});\n__d(\"MercuryTypingReceiver\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryParticipants\",\"MercuryPayloadSource\",\"MercuryServerRequests\",\"MercuryThreads\",\"TypingDetector\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"TypingDetector\"), o = b(\"setTimeoutAcrossTransitions\"), p, q = {\n    }, r = 30000, s = new g();\n    function t(y) {\n        var z = ((q[y] || {\n        })), aa = Object.keys(z);\n        aa.sort(function(ba, ca) {\n            return ((z[ba] - z[ca]));\n        });\n        return aa;\n    };\n;\n    function u() {\n        p = null;\n        var y = JSBNG__Date.now(), z = {\n        }, aa = false;\n        {\n            var fin293keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin293i = (0);\n            var ba;\n            for (; (fin293i < fin293keys.length); (fin293i++)) {\n                ((ba) = (fin293keys[fin293i]));\n                {\n                    var ca = false;\n                    {\n                        var fin294keys = ((window.top.JSBNG_Replay.forInKeys)(((q[ba] || {\n                        })))), fin294i = (0);\n                        var da;\n                        for (; (fin294i < fin294keys.length); (fin294i++)) {\n                            ((da) = (fin294keys[fin294i]));\n                            {\n                                if (((q[ba][da] < ((y - r))))) {\n                                    delete q[ba][da];\n                                    ca = true;\n                                }\n                                 else aa = true;\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (ca) {\n                        z[ba] = t(ba);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin295keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin295i = (0);\n            var ea;\n            for (; (fin295i < fin295keys.length); (fin295i++)) {\n                ((ea) = (fin295keys[fin295i]));\n                {\n                    s.inform(\"state-changed\", z);\n                    break;\n                };\n            };\n        };\n    ;\n        if (aa) {\n            p = o(u, 3000);\n        }\n    ;\n    ;\n    };\n;\n    function v(y, z) {\n        if (((y in q))) {\n            if (((z in q[y]))) {\n                delete q[y][z];\n                w(y);\n            }\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function w(y) {\n        var z = {\n        };\n        z[y] = t(y);\n        s.inform(\"state-changed\", z);\n    };\n;\n    function x(y) {\n        if (y.thread) {\n            return l.getClientThreadIDNow(y.thread);\n        }\n    ;\n    ;\n        if (((y.type === \"typ\"))) {\n            return m.getThreadIdForUser(y.from);\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    g.subscribe([h.getArbiterType(\"typ\"),h.getArbiterType(\"ttyp\"),], function(y, z) {\n        var aa = z.obj, ba = x(aa);\n        if (ba) {\n            var ca = j.getIDForUser(aa.from);\n            if (((aa.st == n.TYPING))) {\n                q[ba] = ((q[ba] || {\n                }));\n                var da = q[ba][ca];\n                q[ba][ca] = JSBNG__Date.now();\n                if (!p) {\n                    p = o(u, 3000);\n                }\n            ;\n            ;\n                ((!da && w(ba)));\n            }\n             else if (((aa.st == n.INACTIVE))) {\n                v(ba, ca);\n            }\n            \n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-typing-state\", function(y, z) {\n        var aa = z.payload_source;\n        if (((((aa != k.CLIENT_CHANNEL_MESSAGE)) && ((aa != k.SERVER_ZAP))))) {\n            return;\n        }\n    ;\n    ;\n        var ba = z.actions;\n        if (((!ba || !ba.length))) {\n            return;\n        }\n    ;\n    ;\n        var ca = i.USER_GENERATED_MESSAGE;\n        ba.forEach(function(da) {\n            if (((((da.action_type == ca)) && ((da.author != j.user))))) {\n                v(da.thread_id, da.author);\n            }\n        ;\n        ;\n        });\n    });\n    e.exports = s;\n});\n__d(\"formatUnixTimestamp\", [\"formatDate\",], function(a, b, c, d, e, f) {\n    var g = b(\"formatDate\");\n    function h(i, j, k, l) {\n        var m = new JSBNG__Date(((i * 1000)));\n        return g(m, j, k, l);\n    };\n;\n    e.exports = h;\n});\n__d(\"MercuryIndicatorController\", [\"ArbiterMixin\",\"DOM\",\"MercuryActionTypeConstants\",\"MercuryConfig\",\"MercuryDelayedRoger\",\"MercuryMessageSourceTags\",\"MercuryParticipants\",\"MercuryRoger\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"DateFormatConfig\",\"arrayContains\",\"copyProperties\",\"formatUnixTimestamp\",\"removeFromArray\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryConfig\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryMessageSourceTags\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryRoger\"), o = b(\"MercuryThreads\").get(), p = b(\"MercuryTypingReceiver\"), q = b(\"DateFormatConfig\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = b(\"formatUnixTimestamp\"), u = b(\"removeFromArray\"), v = b(\"tx\"), w = [];\n    function x(y) {\n        this._threadID = y;\n        this._canonicalUser = o.getCanonicalUserInThread(y);\n        w.push(this);\n    };\n;\n    s(x.prototype, g, {\n        destroy: function() {\n            u(w, this);\n        },\n        setLastMessage: function(y) {\n            this._lastMsg = y;\n            this._handleStateChange();\n        },\n        _informStateChanged: function(y) {\n            if (((((y.activity == \"none\")) && ((this._currentActivity == \"none\"))))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._lastMsg && m.isAuthor(this._lastMsg.author)))) {\n                y.self_authored = true;\n            }\n        ;\n        ;\n            this._currentActivity = y.activity;\n            this.inform(\"state-changed\", y);\n        },\n        _notifySentFrom: function() {\n            var y, z, aa = this._lastMsg.location_text, ba = ((this._lastMsg.source_tags || []));\n            if (aa) {\n                y = v._(\"Sent from {location}\", {\n                    JSBNG__location: aa\n                });\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MESSENGER)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile/messenger\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Messenger\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MOBILE)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Mobile\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.EMAIL)) {\n                y = \"Sent from email\";\n                z = \"sentFromEmail\";\n            }\n             else {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n            \n            \n            \n        ;\n        ;\n            this._informStateChanged({\n                activity: z,\n                text: y\n            });\n        },\n        _notifySeenTimestamp: function(y) {\n            var z = ((n.getSeenTimestamp(this._threadID, y[0]) * 45986)), aa = ((JSBNG__Date.now() * 46005));\n            if (((z < ((aa - 518400))))) {\n                ba = \"M j\";\n            }\n             else if (((z < ((aa - 86400))))) {\n                ba = \"D g:ia\";\n            }\n             else ba = \"g:ia\";\n            \n        ;\n        ;\n            var ba = ((q.formats[ba] || ba)), ca = t(z, ba, false, true);\n            this._informStateChanged({\n                activity: \"seen-timestamp\",\n                text: v._(\"Seen {timestamp}\", {\n                    timestamp: ca\n                })\n            });\n        },\n        _checkNamesForCollision: function(y, z) {\n            var aa = false;\n            m.getMulti(y, function(ba) {\n                function ca(fa) {\n                    if (((typeof ba[fa] !== \"undefined\"))) {\n                        return ba[fa].short_name.toLowerCase();\n                    }\n                     else return fa\n                ;\n                };\n            ;\n                var da = z.map(ca), ea = y.map(ca);\n                aa = da.some(function(fa) {\n                    return ((ea.indexOf(fa) !== ea.lastIndexOf(fa)));\n                });\n            });\n            return aa;\n        },\n        _notifySeenBy: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if (((this._lastMsg != z))) {\n                    return;\n                }\n            ;\n            ;\n                var ca = o.getThreadMetaNow(this._threadID), da = ((ca ? ca.participants.length : 0)), ea = ((y.length + ((z.author != m.user)))), fa, ga = false, ha = false, ia = ((((da > 2)) && ((ea >= ((da - 1))))));\n                if (((!(ia) && ((da > 0))))) {\n                    ha = this._checkNamesForCollision(ca.participants, y);\n                }\n            ;\n            ;\n                if (ia) {\n                    fa = \"Seen by everyone\";\n                }\n                 else if (((y.length == 1))) {\n                    fa = v._(\"Seen by {user}\", {\n                        user: ba[y[0]].short_name\n                    });\n                }\n                 else if (((y.length == 2))) {\n                    fa = v._(\"Seen by {user1}, {user2}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name\n                    });\n                }\n                 else if (((y.length == 3))) {\n                    fa = v._(\"Seen by {user1}, {user2}, {user3}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        user3: ba[y[2]].short_name\n                    });\n                }\n                 else if (((y.length > 3))) {\n                    var ja = ((Object.keys(ba).length - 2)), ka = v._(\"{num} more\", {\n                        num: ja\n                    }), la = h.create(\"span\", {\n                        className: \"more\"\n                    }, ka);\n                    fa = h.tx._(\"Seen by {user1}, {user2}, {=num more link}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        \"=num more link\": la\n                    });\n                    ga = true;\n                }\n                \n                \n                \n                \n            ;\n            ;\n                ga = ((ga || ha));\n                this._informStateChanged({\n                    activity: \"seen-by\",\n                    text: fa,\n                    seenBy: y,\n                    hasNameCollision: ha,\n                    tooltip: ga\n                });\n            }.bind(this));\n            ((aa && this._informStateChanged({\n                activity: \"none\"\n            })));\n        },\n        _notifyTyping: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if (((this._lastMsg != z))) {\n                    return;\n                }\n            ;\n            ;\n                if (((this._canonicalUser || j.ChatMultiTypGK))) {\n                    var ca = o.getThreadMetaNow(this._threadID), da = ((ca ? ca.participants.length : 0)), ea, fa = false;\n                    if (((((da > 2)) && ((y.length >= ((da - 1))))))) {\n                        ea = \"Everyone is typing...\";\n                    }\n                     else if (((y.length == 1))) {\n                        ea = v._(\"{name} is typing...\", {\n                            JSBNG__name: ba[y[0]].short_name\n                        });\n                    }\n                     else if (((y.length == 2))) {\n                        ea = v._(\"{user1} and {user2} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name\n                        });\n                    }\n                     else if (((y.length == 3))) {\n                        ea = v._(\"{user1}, {user2}, and {user3} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            user3: ba[y[2]].short_name\n                        });\n                    }\n                     else if (((y.length > 3))) {\n                        var ga = ((Object.keys(ba).length - 2)), ha = v._(\"{num} more\", {\n                            num: ga\n                        }), ia = h.create(\"a\", {\n                            href: \"#\"\n                        }, ha);\n                        ea = h.tx._(\"{user1}, {user2}, and {=num more link} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            \"=num more link\": ia\n                        });\n                        fa = true;\n                    }\n                    \n                    \n                    \n                    \n                ;\n                ;\n                    this._informStateChanged({\n                        activity: \"typing\",\n                        text: ea,\n                        typing: y,\n                        tooltip: fa\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            ((aa && this._informStateChanged({\n                activity: \"none\"\n            })));\n        },\n        _handleStateChange: function() {\n            var y = i.LOG_MESSAGE;\n            if (((!this._lastMsg || ((this._lastMsg.action_type == y))))) {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n        ;\n        ;\n            if (((this._typing && this._typing.length))) {\n                this._notifyTyping(this._typing);\n                return;\n            }\n        ;\n        ;\n            if (((this._canonicalUser && ((this._lastMsg.author != m.user))))) {\n                this._notifySentFrom();\n                return;\n            }\n        ;\n        ;\n            var z = k.getSeenBy(this._threadID, true);\n            if (z.length) {\n                if (this._canonicalUser) {\n                    this._notifySeenTimestamp(z);\n                    return;\n                }\n                 else {\n                    this._notifySeenBy(z);\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            this._informStateChanged({\n                activity: \"none\"\n            });\n        }\n    });\n    p.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            var ba = z[aa._threadID];\n            if (((ba !== undefined))) {\n                aa._typing = ba;\n                aa._handleStateChange();\n            }\n        ;\n        ;\n        });\n    });\n    k.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            ((z[aa._threadID] && aa._handleStateChange()));\n        });\n    });\n    e.exports = x;\n});\n__d(\"MercuryLastMessageIndicator\", [\"CSS\",\"MercuryIndicatorController\",\"DOM\",\"MercuryParticipants\",\"Tooltip\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"MercuryIndicatorController\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"Tooltip\"), l = b(\"copyProperties\"), m = b(\"csx\"), n = b(\"cx\");\n    function o(p, q, r, s) {\n        this._lastMessageIndicator = q;\n        this._hideTyping = ((r || false));\n        this._messagesView = s;\n        this._controller = new h(p);\n        this._subscription = this._controller.subscribe(\"state-changed\", this._handleStateChanged.bind(this));\n    };\n;\n    l(o.prototype, {\n        destroy: function() {\n            this._setClass(null);\n            this._subscription.unsubscribe();\n            this._controller.destroy();\n        },\n        setLastMessage: function(p) {\n            this._controller.setLastMessage(p);\n        },\n        _handleStateChanged: function(p, q) {\n            var r = this._messagesView.isScrolledToBottom();\n            this._rerender(q);\n            ((r && this._messagesView.scrollToBottom()));\n        },\n        _rerender: function(p) {\n            if (((p.activity == \"none\"))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n        ;\n            if (((this._hideTyping && ((p.activity == \"typing\"))))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n        ;\n            g.conditionClass(this._lastMessageIndicator, \"-cx-PRIVATE-mercuryLastMessageIndicator__selfauthored\", p.self_authored);\n            var q = i.JSBNG__find(this._lastMessageIndicator, \".-cx-PRIVATE-mercuryLastMessageIndicator__text\");\n            if (p.text) {\n                i.setContent(q, p.text);\n            }\n             else i.empty(q);\n        ;\n        ;\n            if (((p.activity.substring(0, 4) == \"seen\"))) {\n                this._setClass(\"seen\");\n                if (((((p.activity == \"seen-by\")) && p.tooltip))) {\n                    j.getMulti(p.seenBy, function(r) {\n                        var s = i.create(\"div\");\n                        {\n                            var fin296keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin296i = (0);\n                            var t;\n                            for (; (fin296i < fin296keys.length); (fin296i++)) {\n                                ((t) = (fin296keys[fin296i]));\n                                {\n                                    var u = i.create(\"div\");\n                                    i.setContent(u, r[t].JSBNG__name);\n                                    i.appendContent(s, u);\n                                };\n                            };\n                        };\n                    ;\n                        var v = p.hasNameCollision, w;\n                        if (v) {\n                            w = this._lastMessageIndicator;\n                        }\n                         else w = i.JSBNG__find(this._lastMessageIndicator, \"span.more\");\n                    ;\n                    ;\n                        k.set(w, s, \"above\", \"center\");\n                    }.bind(this));\n                }\n                 else k.remove(this._lastMessageIndicator);\n            ;\n            ;\n            }\n             else this._setClass(p.activity);\n        ;\n        ;\n        },\n        _setClass: function(p) {\n            if (((this._lastClass === p))) {\n                return;\n            }\n        ;\n        ;\n            ((this._lastClass && g.removeClass(this._lastMessageIndicator, this._lastClass)));\n            ((p && g.addClass(this._lastMessageIndicator, p)));\n            this._lastClass = p;\n        }\n    });\n    e.exports = o;\n});\n__d(\"MercuryStateCheck\", [\"Arbiter\",\"ChannelConstants\",\"MercuryFolders\",\"MessagingTag\",\"MercuryServerRequests\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryFolders\"), j = b(\"MessagingTag\"), k = b(\"MercuryServerRequests\").get(), l = b(\"URI\"), m = b(\"copyProperties\"), n = m(new g(), {\n        initialize: function() {\n            g.subscribe(h.ON_INVALID_HISTORY, o);\n            d([\"ChannelConnection\",], function(p) {\n                p.subscribe(p.CONNECTED, function(q, r) {\n                    if (!r.init) {\n                        o();\n                    }\n                ;\n                ;\n                });\n            });\n        }\n    });\n    function o() {\n        var p;\n        if (((l.getRequestURI().getPath().search(/messages/) !== -1))) {\n            p = i.getSupportedFolders();\n        }\n         else p = [j.INBOX,];\n    ;\n    ;\n        k.fetchMissedMessages(p);\n    };\n;\n    n.initialize();\n    e.exports = n;\n});\n__d(\"MercuryAttachmentRenderer\", [\"MercuryAttachmentTemplates\",\"MercuryAttachmentAudioClip.react\",\"CSS\",\"MercuryConstants\",\"DOM\",\"JSBNG__Image.react\",\"JSXDOM\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessages\",\"MercuryParticipants\",\"React\",\"Style\",\"URI\",\"UserAgent\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentTemplates\"), h = b(\"MercuryAttachmentAudioClip.react\"), i = b(\"CSS\"), j = b(\"MercuryConstants\"), k = b(\"DOM\"), l = b(\"JSBNG__Image.react\"), m = b(\"JSXDOM\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryMessages\").get(), q = b(\"MercuryParticipants\"), r = b(\"React\"), s = b(\"Style\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"cx\"), w = b(\"tx\"), x = ((u.ie() <= 8));\n    function y(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.JSBNG__name), ea = da.getNode(\"link\");\n        ea.setAttribute(\"href\", ba.url);\n        ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n;\n    function z(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.JSBNG__name);\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n;\n    var aa = {\n        renderAttachment: function(ba, ca, da, ea, fa) {\n            var ga = 100, ha = ((ba ? 160 : 400)), ia = ca.attach_type, ja = null, ka = null, la = true, ma = j.MercurySupportedShareType;\n            if (((ia == o.ERROR))) {\n                ja = aa.renderError(ca);\n            }\n        ;\n        ;\n            if (((((!ba && ((ia == o.SHARE)))) && ca.share_xhp))) {\n                ka = aa.renderShareXHP(ca, da.id);\n            }\n        ;\n        ;\n            if (((ia == o.STICKER))) {\n                la = false;\n                ka = aa.renderSticker(ca);\n            }\n        ;\n        ;\n            if (((!ka && ((ia == o.SHARE))))) {\n                var na = ca.share_data_type;\n                switch (na) {\n                  case ma.FB_PHOTO:\n                    ka = aa.renderPreview(ca, da, ea, fa);\n                    break;\n                  case ma.FB_VIDEO:\n                    ka = aa.renderVideoThumb(ca);\n                    break;\n                  case ma.FB_MUSIC_ALBUM:\n                \n                  case ma.FB_SONG:\n                \n                  case ma.FB_PLAYLIST:\n                \n                  case ma.FB_MUSICIAN:\n                \n                  case ma.FB_RADIO_STATION:\n                    ka = aa.renderMusic(ca);\n                    break;\n                  case ma.EXTERNAL:\n                \n                  case ma.FB_TEMPLATE:\n                \n                  case ma.FB_COUPON:\n                \n                  case ma.FB_SOCIAL_REPORT_PHOTO:\n                    ka = aa.renderExternalLink(ca);\n                    break;\n                  default:\n                    if (ca.JSBNG__name) {\n                        ka = aa.renderShareLink(ca, ((da && da.id)), ba);\n                    }\n                ;\n                ;\n                    break;\n                };\n            ;\n            }\n        ;\n        ;\n            if (((!ka && ca.preview_loading))) {\n                ka = aa.renderPreview(null);\n            }\n        ;\n        ;\n            if (((!ka && ca.preview_url))) {\n                ka = aa.renderPreview(ca, da, ea, fa);\n            }\n        ;\n        ;\n            if (((!ka && ((ia == o.FILE))))) {\n                if (((ca.metadata && ((ca.metadata.type == j.MercuryAttachmentAudioClip))))) {\n                    ka = k.create(\"div\");\n                    var oa = aa.renderAudioClip(ca, da.message_id, ga, ha);\n                    r.renderComponent(oa, ka);\n                }\n                 else ka = ((ba ? aa.renderFileLink(ca) : aa.renderExtendedFileLink(ca)));\n            ;\n            }\n        ;\n        ;\n            return {\n                error: ja,\n                JSBNG__content: ka,\n                bubblePreferred: la\n            };\n        },\n        renderError: function(ba) {\n            var ca = g[\":fb:mercury:attachment:error\"].build();\n            k.appendContent(ca.getNode(\"error\"), ba.error_msg);\n            return ca.getRoot();\n        },\n        renderExternalLink: function(ba) {\n            var ca = g[\":fb:mercury:attachment:external-link\"].build().setNodeContent(\"JSBNG__name\", ba.JSBNG__name);\n            ((ba.base_url && ca.setNodeContent(\"shortLink\", ba.base_url)));\n            var da = ca.getNode(\"preview\"), ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n            if (ba.preview_url) {\n                var fa = ca.getNode(\"preview-image\");\n                fa.setAttribute(\"src\", ba.preview_url);\n                i.addClass(da, ba.preview_class);\n                i.show(fa);\n            }\n             else {\n                i.addClass(ca.getRoot(), \"noMedia\");\n                i.hide(da);\n            }\n        ;\n        ;\n            ca.getNode(\"JSBNG__name\").setAttribute(\"href\", ba.url);\n            d([\"LinkshimHandler\",], function(ga) {\n                ga.setUpLinkshimHandling(ca.getNode(\"JSBNG__name\"));\n                ga.setUpLinkshimHandling(ca.getNode(\"image-link\"));\n            });\n            if (ba.rel) {\n                ca.getNode(\"JSBNG__name\").setAttribute(\"rel\", ba.rel);\n            }\n        ;\n        ;\n            return ca.getRoot();\n        },\n        renderFileLink: function(ba) {\n            var ca = null;\n            if (((ba.url === \"\"))) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n             else {\n                ca = \":fb:mercury:attachment:file-link\";\n                return y(ba, ca).getRoot();\n            }\n        ;\n        ;\n        },\n        renderAudioClip: function(ba, ca, da, ea) {\n            var fa = ((ba.metadata.duration / 1000)), ga = 200;\n            if (((da && ea))) {\n                if (((fa < 5))) {\n                    ga = da;\n                }\n                 else ga = ((((((1 - Math.pow(10, ((((fa - 5)) / -30))))) * ((ea - da)))) + da));\n            ;\n            }\n        ;\n        ;\n            return h({\n                src: ba.url,\n                duration: ((ba.metadata.duration / 1000)),\n                showHelp: false,\n                width: ga\n            });\n        },\n        renderExtendedFileLink: function(ba) {\n            var ca = null;\n            if (((ba.url === \"\"))) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n        ;\n        ;\n            var ca = \":fb:mercury:attachment:extended-file-link\", da = y(ba, ca);\n            if (ba.open_url) {\n                var ea = da.getNode(\"openLinkContainer\");\n                i.show(ea);\n                var fa = da.getNode(\"openFile\");\n                fa.setAttribute(\"href\", ba.open_url);\n            }\n        ;\n        ;\n            var ga = da.getNode(\"downloadFile\");\n            ga.setAttribute(\"href\", ba.url);\n            ((ba.rel && ga.setAttribute(\"rel\", ba.rel)));\n            return da.getRoot();\n        },\n        renderMusic: function(ba) {\n            var ca = g[\":fb:mercury:attachment:music\"].build().setNodeContent(\"filename\", ba.JSBNG__name), da = ca.getNode(\"link\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"target\", \"_blank\");\n            ((ba.rel && da.setAttribute(\"rel\", ba.rel)));\n            var ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n            var fa = ca.getNode(\"preview-image\");\n            fa.setAttribute(\"src\", ba.preview_url);\n            i.show(fa);\n            i.addClass(ca.getNode(\"icon_link\"), \"MercuryMusicIcon\");\n            return ca.getRoot();\n        },\n        resizeContain: function(ba, ca) {\n            var da = ((ba.width / ba.height)), ea = ((ca.width / ca.height));\n            if (((ea < da))) {\n                return {\n                    width: Math.min(((ba.height * ea)), ca.width),\n                    height: Math.min(ba.height, ca.height)\n                };\n            }\n             else return {\n                width: Math.min(ba.width, ca.width),\n                height: Math.min(((ba.width / ea)), ca.height)\n            }\n        ;\n        },\n        renderPreview: function(ba, ca, da, ea) {\n            var fa = g[\":fb:mercury:attachment:preview\"].build(), ga = fa.getNode(\"image-link\");\n            if (ba) {\n                ((ba.url && ga.setAttribute(\"href\", ba.url)));\n                ((ba.rel && ga.setAttribute(\"rel\", ba.rel)));\n                var ha;\n                if (ba.preview_uploading) {\n                    i.addClass(ga, \"-cx-PRIVATE-mercuryImages__uploading\");\n                    if (((da >= 176))) {\n                        ha = \"/images/photos/dots_large.png\";\n                    }\n                     else if (((da >= 86))) {\n                        ha = \"/images/photos/dots_medium.png\";\n                    }\n                     else ha = \"/images/photos/dots_small.png\";\n                    \n                ;\n                ;\n                    s.set(ga, \"width\", ((da + \"px\")));\n                    s.set(ga, \"max-width\", ((da + \"px\")));\n                    if (((ba.preview_width && ba.preview_height))) {\n                        s.set(ga, \"padding-bottom\", ((((((ba.preview_height / ba.preview_width)) * 100)) + \"%\")));\n                    }\n                ;\n                ;\n                }\n                 else if (((ba.metadata && ba.metadata.fbid))) {\n                    ha = t(\"/ajax/mercury/attachments/photo.php\").addQueryData({\n                        fbid: ba.metadata.fbid,\n                        mode: ea,\n                        width: da,\n                        height: da\n                    }).toString();\n                }\n                 else ha = t(ba.preview_url).addQueryData({\n                    mode: ea,\n                    width: da,\n                    height: da\n                }).toString();\n                \n            ;\n            ;\n                var ia = fa.getNode(\"preview-image\");\n                if (ha) {\n                    if (((((((ea === \"contain\")) && ba.preview_width)) && ba.preview_height))) {\n                        var ja = aa.resizeContain({\n                            width: da,\n                            height: da\n                        }, {\n                            width: ba.preview_width,\n                            height: ba.preview_height\n                        });\n                        ia.setAttribute(\"width\", ja.width);\n                        ia.setAttribute(\"height\", ja.height);\n                    }\n                ;\n                ;\n                    if (((ba.preview_uploading || ((((ea === \"cover\")) && !x))))) {\n                        i.addClass(ga, \"-cx-PRIVATE-mercuryImages__usebackgroundimage\");\n                        s.set(ga, \"backgroundImage\", ((((\"url(\" + ha)) + \")\")));\n                    }\n                     else {\n                        ia.JSBNG__onload = function() {\n                            ia.removeAttribute(\"width\");\n                            ia.removeAttribute(\"height\");\n                        };\n                        ia.setAttribute(\"src\", ha);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (ca) {\n                    this.renderReportRespondLink(fa.getRoot(), ba, ca.message_id);\n                }\n            ;\n            ;\n            }\n             else i.addClass(ga, \"-cx-PUBLIC-mercuryImages__loading\");\n        ;\n        ;\n            return fa.getRoot();\n        },\n        renderShareLink: function(ba, ca, da) {\n            var ea = g[\":fb:mercury:attachment:share-link\"].build().setNodeContent(\"JSBNG__name\", ba.JSBNG__name), fa = ea.getNode(\"link\");\n            fa.setAttribute(\"href\", ba.url);\n            ((ba.rel && fa.setAttribute(\"rel\", ba.rel)));\n            return ea.getRoot();\n        },\n        renderVideoThumb: function(ba) {\n            var ca = g[\":fb:mercury:attachment:video-thumb\"].build(), da = ca.getNode(\"thumb\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"rel\", ba.rel);\n            var ea = k.JSBNG__find(ca.getRoot(), \"img\");\n            ea.src = ba.preview_url;\n            return ca.getRoot();\n        },\n        renderShareXHP: function(ba, ca) {\n            var da = k.create(\"div\");\n            if (ba) {\n                k.appendContent(da, ba.share_xhp);\n                this.renderReportRespondLink(da, ba, ca);\n            }\n        ;\n        ;\n            return da;\n        },\n        renderSticker: function(ba) {\n            var ca = k.create(\"div\"), da = {\n                uri: ba.url,\n                width: ba.metadata.width,\n                height: ba.metadata.height\n            }, ea = l({\n                className: \"mvs\",\n                src: da\n            });\n            r.renderComponent(ea, ca);\n            return ca;\n        },\n        renderReportRespondLink: function(ba, ca, da) {\n            if (!ca.is_social_report_attachment) {\n                return null;\n            }\n        ;\n        ;\n            switch (ca.share_data_type) {\n              case j.MercurySupportedShareType.FB_PHOTO:\n                break;\n              case j.MercurySupportedShareType.FB_SOCIAL_REPORT_PHOTO:\n                return null;\n              default:\n                return null;\n            };\n        ;\n            var ea = null;\n            if (da) {\n                ea = p.getMessagesFromIDs([da,])[0];\n            }\n        ;\n        ;\n            if (!ea) {\n                return null;\n            }\n        ;\n        ;\n            if (((ea.author === q.user))) {\n                return null;\n            }\n        ;\n        ;\n            var fa = null;\n            q.get(ea.author, function(ga) {\n                fa = k.create(\"a\", {\n                    rel: \"dialog-post\",\n                    className: \"-cx-PRIVATE-fbChatMessage__socialreportlink\",\n                    id: \"respond-link\",\n                    ajaxify: t(\"/ajax/report/social_resolution/photo/\").setQueryData({\n                        attachment_fbid: ca.attach_id,\n                        photo_fbid: ca.shared_object_id,\n                        sender_id: q.getUserID(ga.id)\n                    }).toString()\n                });\n                k.setContent(fa, w._(\"Respond to {name}'s request\", {\n                    JSBNG__name: ga.JSBNG__name\n                }));\n                k.appendContent(ba, fa);\n            });\n        },\n        renderPhotoAttachments: function(ba, ca, da, ea) {\n            var fa = ba.length;\n            if (!fa) {\n                return null;\n            }\n        ;\n        ;\n            var ga = m.div({\n                className: \"-cx-PRIVATE-mercuryImages__photoattachment\"\n            }), ha = (m.div({\n                className: \"-cx-PUBLIC-fbChatMessage__resetpadding\"\n            }, ga));\n            if (((fa === 1))) {\n                var ia = aa.renderPreview(ba[0], ca, da, \"contain\");\n                k.appendContent(ga, ia);\n                return ha;\n            }\n        ;\n        ;\n            var ja = ((((((fa == 2)) || ((fa == 4)))) ? 2 : 3)), ka = ((((da - ((((ja - 1)) * ea)))) / ja)), la = Math.ceil(((fa / ja))), ma = ((((la * ka)) + ((((la - 1)) * ea)))), na = (m.div({\n                className: \"-cx-PRIVATE-mercuryImages__grid\",\n                style: ((((\"padding-bottom: \" + ((((ma / da)) * 100)))) + \"%;\"))\n            }));\n            k.appendContent(ga, na);\n            for (var oa = 0; ((oa < fa)); ++oa) {\n                var pa = aa.renderPreview(ba[oa], ca, ka, \"cover\"), qa = ((oa % ja)), ra = Math.floor(((oa / ja)));\n                i.addClass(pa, \"-cx-PRIVATE-mercuryImages__griditem\");\n                s.apply(pa, {\n                    width: ((((((ka / da)) * 100)) + \"%\")),\n                    left: ((((((((qa * ((ka + ea)))) / da)) * 100)) + \"%\")),\n                    JSBNG__top: ((((((((ra * ((ka + ea)))) / ma)) * 100)) + \"%\"))\n                });\n                k.appendContent(na, pa);\n            };\n        ;\n            return ha;\n        },\n        isPhotoAttachment: function(ba) {\n            return ((((ba.attach_type == o.PHOTO)) || ((((ba.attach_type == o.FILE)) && ba.preview_url))));\n        },\n        isShareAttachment: function(ba) {\n            return ((ba.attach_type == o.SHARE));\n        },\n        isFileAttachment: function(ba) {\n            return ((ba.attach_type == o.FILE));\n        },\n        isErrorAttachment: function(ba) {\n            return ((ba.attach_type == o.ERROR));\n        },\n        booleanLexicographicComparator: function(ba) {\n            return function(ca, da) {\n                for (var ea = 0; ((ea < ba.length)); ++ea) {\n                    var fa = ba[ea](ca), ga = ba[ea](da);\n                    if (((fa && !ga))) {\n                        return -1;\n                    }\n                     else if (((!fa && ga))) {\n                        return 1;\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n                return 0;\n            };\n        }\n    };\n    e.exports = aa;\n});\n__d(\"URLScraper\", [\"ArbiterMixin\",\"DataStore\",\"JSBNG__Event\",\"URLMatcher\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DataStore\"), i = b(\"JSBNG__Event\"), j = b(\"URLMatcher\"), k = b(\"copyProperties\"), l = \"scraperLastPermissiveMatch\";\n    function m(n) {\n        this.input = n;\n        this.enable();\n    };\n;\n    k(m.prototype, g, {\n        reset: function() {\n            h.set(this.input, l, null);\n        },\n        enable: function() {\n            if (this.events) {\n                return;\n            }\n        ;\n        ;\n            var n = function(o) {\n                JSBNG__setTimeout(this.check.bind(this, o), 30);\n            };\n            this.events = i.listen(this.input, {\n                paste: n.bind(this, false),\n                keydown: n.bind(this, true)\n            });\n        },\n        disable: function() {\n            if (!this.events) {\n                return;\n            }\n        ;\n        ;\n            {\n                var fin297keys = ((window.top.JSBNG_Replay.forInKeys)((this.events))), fin297i = (0);\n                var JSBNG__event;\n                for (; (fin297i < fin297keys.length); (fin297i++)) {\n                    ((event) = (fin297keys[fin297i]));\n                    {\n                        this.events[JSBNG__event].remove();\n                    ;\n                    };\n                };\n            };\n        ;\n            this.events = null;\n        },\n        check: function(n) {\n            var o = this.input.value;\n            if (((n && m.trigger(o)))) {\n                return;\n            }\n        ;\n        ;\n            var p = m.match(o), q = j.permissiveMatch(o);\n            if (((q && ((q != h.get(this.input, l)))))) {\n                h.set(this.input, l, q);\n                this.inform(\"match\", {\n                    url: ((p || q)),\n                    alt_url: q\n                });\n            }\n        ;\n        ;\n        }\n    });\n    k(m, j);\n    e.exports = m;\n});\n__d(\"htmlHyperlink\", [\"Env\",\"htmlize\",\"UntrustedLink\",\"URI\",\"URLScraper\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"htmlize\"), i = b(\"UntrustedLink\"), j = b(\"URI\"), k = b(\"URLScraper\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        if (((((typeof n === \"undefined\")) || !n.toString))) {\n            return \"\";\n        }\n    ;\n    ;\n        if (((typeof o !== \"function\"))) {\n            o = h;\n        }\n    ;\n    ;\n        if (((typeof p !== \"function\"))) {\n            p = h;\n        }\n    ;\n    ;\n        var n = n.toString(), r = [], s;\n        while ((s = k.match(n))) {\n            var t = n.indexOf(s);\n            if (((t >= 0))) {\n                r.push(o(n.substring(0, t)));\n            }\n        ;\n        ;\n            var u = p(s), v = s.replace(/\"/g, \"%22\");\n            if (!(/^[a-z][a-z0-9\\-+.]+:\\/\\//i.test(s))) {\n                v = ((\"http://\" + v));\n            }\n        ;\n        ;\n            if (j.isValidURI(v)) {\n                r.push(((((((((((((\"\\u003Ca target=\\\"_blank\\\" rel=\\\"nofollow\\\" \" + \"class=\\\"\")) + \"-cx-PUBLIC-fbHTMLHyperlink__link\")) + \"\\\" \")) + \"href=\\\"\")) + v)) + \"\\\"\")));\n                if (((q && !j(v).isFacebookURI()))) {\n                    a.UntrustedLink = i;\n                    r.push(((((\" onmousedown=\\\"UntrustedLink.bootstrap(this, '\" + g.lhsh)) + \"', event)\\\"\")));\n                }\n            ;\n            ;\n                r.push(((((\"\\u003E\" + u)) + \"\\u003C/a\\u003E\")));\n            }\n             else r.push(u);\n        ;\n        ;\n            n = n.substring(((t + s.length)));\n        };\n    ;\n        ((n && r.push(o(n))));\n        return r.join(\"\");\n    };\n;\n    e.exports = m;\n});\n__d(\"MercuryMessageRenderer\", [\"MercuryAttachmentRenderer\",\"CSS\",\"DOM\",\"DOMQuery\",\"HTML\",\"MercuryEmoji\",\"MercuryLogMessageType\",\"MercuryParticipants\",\"Tooltip\",\"cx\",\"htmlHyperlink\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentRenderer\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"HTML\"), l = b(\"MercuryEmoji\"), m = b(\"MercuryLogMessageType\"), n = b(\"MercuryParticipants\"), o = b(\"Tooltip\"), p = b(\"cx\"), q = b(\"htmlHyperlink\"), r = b(\"tx\"), s = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",], t = {\n        renderDate: function(ma) {\n            var na = new JSBNG__Date();\n            na.setHours(0);\n            na.setMinutes(0);\n            na.setSeconds(0);\n            na.setMilliseconds(0);\n            var oa = ((((((24 * 60)) * 60)) * 1000)), pa = ((na.getTime() - ma.getTime()));\n            if (((pa <= 0))) {\n                return \"Today\";\n            }\n             else if (((pa < oa))) {\n                return \"Yesterday\";\n            }\n            \n        ;\n        ;\n            var qa = s[ma.getMonth()], ra = ma.getDate(), sa = ma.getFullYear();\n            if (((sa != na.getFullYear()))) {\n                return r._(\"{month} {date}, {year}\", {\n                    month: qa,\n                    date: ra,\n                    year: sa\n                });\n            }\n             else return r._(\"{month} {date}\", {\n                month: qa,\n                date: ra\n            })\n        ;\n        },\n        renderTooltipFlyout: function(ma, na) {\n            na.forEach(function(oa) {\n                var pa = i.create(\"div\");\n                i.setContent(pa, oa.JSBNG__name);\n                i.appendContent(ma, pa);\n            });\n        },\n        renderLogMessage: function(ma, na, oa, pa) {\n            w(ma, pa);\n            x(na, pa);\n            y(oa, pa);\n        },\n        formatMessageBody: function(ma, na, oa) {\n            var pa = ((ma || \"\")).replace(/\\s+$/, \"\");\n            if (!na) {\n                return v(pa, false, oa);\n            }\n        ;\n        ;\n            var qa = Object.keys(na).map(function(ta) {\n                return window.parseInt(ta);\n            }).sort(function(ta, ua) {\n                return ((ta - ua));\n            }), ra = [], sa = 0;\n            qa.forEach(function(ta) {\n                var ua = pa.slice(sa, ta);\n                if (ua) {\n                    ra.push(v(ua, false, oa));\n                }\n            ;\n            ;\n                sa = ((ta + na[ta].length));\n                var va = pa.slice(ta, sa);\n                if (va) {\n                    ra.push(v(va, true, oa));\n                }\n            ;\n            ;\n            });\n            if (((sa < pa.length))) {\n                ra.push(v(pa.slice(sa), false, oa));\n            }\n        ;\n        ;\n            return ((((ra.length === 0)) ? null : ((((ra.length === 1)) ? ra[0] : i.create(\"span\", {\n            }, ra)))));\n        }\n    };\n    function u(ma, na) {\n        var oa = ma.replace(/\\r\\n?/g, \"\\u000a\").split(/\\n{2,}/), pa = [];\n        for (var qa = 0; ((qa < oa.length)); qa++) {\n            var ra = oa[qa];\n            if (ra.length) {\n                pa.push(\"\\u003Cp\\u003E\");\n                pa.push(na(ra));\n                pa.push(\"\\u003C/p\\u003E\");\n            }\n        ;\n        ;\n        };\n    ;\n        return pa.join(\"\");\n    };\n;\n    function v(ma, na, oa) {\n        var pa = null;\n        if (((((ma.length === 0)) && !na))) {\n            return pa;\n        }\n    ;\n    ;\n        function qa(ra) {\n            return q(ra, l.htmlEmojiAndEmote, null, true);\n        };\n    ;\n        pa = ((oa ? u(ma, qa) : qa(ma)));\n        if (na) {\n            return i.create(\"span\", {\n                className: \"highlight\"\n            }, k(pa));\n        }\n    ;\n    ;\n        return k(pa);\n    };\n;\n    function w(ma, na) {\n        var oa = \"\", pa;\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n        \n          case m.JOINABLE_JOINED:\n        \n          case m.SUBSCRIBE:\n            oa = \"mercurySubscribeIcon\";\n            break;\n          case m.UNSUBSCRIBE:\n            oa = \"mercuryUnsubscribeIcon\";\n            break;\n          case m.THREAD_NAME:\n            oa = \"mercuryThreadNameIcon\";\n            break;\n          case m.THREAD_IMAGE:\n            oa = \"mercuryThreadImageIcon\";\n            break;\n          case m.VIDEO_CALL:\n            pa = na.log_message_data.answered;\n            if (((pa || la(na)))) {\n                oa = \"mercuryVideoCallIcon\";\n            }\n             else oa = \"mercuryMissedVideoCallIcon\";\n        ;\n        ;\n            break;\n          case m.PHONE_CALL:\n            pa = na.log_message_data.answered;\n            if (pa) {\n                oa = \"mercuryPhoneCallIcon\";\n            }\n             else oa = \"mercuryMissedPhoneCallIcon\";\n        ;\n        ;\n            break;\n          case m.SERVER_ERROR:\n            oa = \"mercuryErrorIcon\";\n            break;\n        };\n    ;\n        h.addClass(ma, oa);\n    };\n;\n    function x(ma, na) {\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n            da(ma, na);\n            break;\n          case m.JOINABLE_JOINED:\n            ea(ma, na);\n            break;\n          case m.SUBSCRIBE:\n            ia(ma, na);\n            break;\n          case m.UNSUBSCRIBE:\n            ja(ma, na);\n            break;\n          case m.VIDEO_CALL:\n            if (la(na)) {\n                z(ma, na);\n            }\n             else ba(ma, na);\n        ;\n        ;\n            break;\n          case m.PHONE_CALL:\n            aa(ma, na);\n            break;\n          case m.THREAD_NAME:\n            ca(ma, na);\n            break;\n          case m.THREAD_IMAGE:\n            fa(ma, na);\n            break;\n          case m.SERVER_ERROR:\n            ka(ma, na);\n            break;\n        };\n    ;\n    };\n;\n    function y(ma, na) {\n        var oa = na.log_message_type;\n        if (((oa == m.THREAD_IMAGE))) {\n            var pa = na.log_message_data.image;\n            if (pa) {\n                var qa = g.renderPreview(((pa.preview_url ? pa : null)));\n                i.setContent(ma, qa);\n                h.addClass(qa, \"-cx-PRIVATE-mercuryImages__logmessageattachment\");\n                h.show(ma);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var z = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa = i.create(\"span\", {\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, oa.short_name), qa;\n            switch (na.log_message_data.event_name) {\n              case \"installing\":\n                qa = i.tx._(\"{firstname} is setting up video calling...\", {\n                    firstname: pa\n                });\n                break;\n              case \"installed\":\n                qa = i.tx._(\"{firstname} finished setting up video calling.\", {\n                    firstname: pa\n                });\n                break;\n              case \"install_canceled\":\n                qa = i.tx._(\"You canceled the video calling installation. \", {\n                    firstname: pa\n                });\n                break;\n            };\n        ;\n            if (qa) {\n                i.setContent(ma, qa);\n            }\n        ;\n        ;\n        });\n    }, aa = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if (((oa == n.user))) {\n                var sa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            ;\n            }\n        ;\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ba = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if (((oa == n.user))) {\n                var sa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            ;\n            }\n        ;\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ca = function(ma, na) {\n        var oa = na.log_message_data.JSBNG__name, pa = i.create(\"b\", {\n        }, oa);\n        if (((na.author == n.user))) {\n            if (oa) {\n                i.setContent(ma, i.tx._(\"You named the conversation: {name}.\", {\n                    JSBNG__name: pa\n                }));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation name.\"));\n        ;\n        ;\n        }\n         else n.get(na.author, function(qa) {\n            var ra, sa = ga(qa);\n            if (oa) {\n                ra = i.tx._(\"{actor} named the conversation: {name}.\", {\n                    actor: sa,\n                    JSBNG__name: pa\n                });\n            }\n             else ra = i.tx._(\"{actor} removed the conversation name.\", {\n                actor: sa\n            });\n        ;\n        ;\n            i.setContent(ma, ra);\n        });\n    ;\n    ;\n    }, da = function(ma, na) {\n        if (((na.author == n.user))) {\n            i.setContent(ma, i.tx._(\"Other people can join this chat from News Feed and add their friends.\"));\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa);\n            i.setContent(ma, i.tx._(\"{actor} shared this chat to News Feed. Other people can join and add their friends.\", {\n                actor: pa\n            }));\n        });\n    ;\n    ;\n    }, ea = function(ma, na) {\n        var oa = na.log_message_data.joined_participant;\n        if (((oa == n.user))) {\n            i.setContent(ma, i.tx._(\"You joined the chat. Other people can join from News Feed and add their friends.\"));\n        }\n         else n.get(oa, function(pa) {\n            var qa = ga(pa);\n            i.setContent(ma, i.tx._(\"{actor} joined the chat.\", {\n                actor: qa\n            }));\n        });\n    ;\n    ;\n    }, fa = function(ma, na) {\n        if (((na.author == n.user))) {\n            if (na.log_message_data.image) {\n                i.setContent(ma, i.tx._(\"You changed the conversation picture.\"));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation picture.\"));\n        ;\n        ;\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa), qa;\n            if (na.log_message_data.image) {\n                qa = i.tx._(\"{actor} changed the conversation picture.\", {\n                    actor: pa\n                });\n            }\n             else qa = i.tx._(\"{actor} removed the conversation picture.\", {\n                actor: pa\n            });\n        ;\n        ;\n            i.setContent(ma, qa);\n        });\n    ;\n    ;\n    }, ga = function(ma) {\n        if (ma.href) {\n            return i.create(\"a\", {\n                href: ma.href,\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, ma.JSBNG__name);\n        }\n    ;\n    ;\n        return ma.JSBNG__name;\n    }, ha = function(ma) {\n        var na = ma.indexOf(n.user);\n        if (((na > 0))) {\n            return ma.splice(na, 1).concat(ma);\n        }\n    ;\n    ;\n        return ma;\n    }, ia = function(ma, na) {\n        var oa = ha(na.log_message_data.added_participants), pa = null, qa;\n        if (((oa.length == 1))) {\n            pa = [na.author,oa[0],];\n            n.getMulti(pa, function(ra) {\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1}.\", {\n                        subscriber1: ga(ra[oa[0]])\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you.\", {\n                        actor: ga(ra[na.author])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]])\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if (((oa.length == 2))) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1} and {subscriber2}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you and {subscriber2}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1} and {subscriber2}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]])\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if (((oa.length == 3))) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {subscriber3}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    subscriber3: ga(ra[oa[2]])\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                var sa = i.tx._(\"{num} more\", {\n                    num: ((oa.length - 2))\n                }), ta = i.create(\"span\", {\n                    className: \"more\"\n                }, sa), ua = i.create(\"div\");\n                t.renderTooltipFlyout(ua, oa.slice(2).map(function(wa) {\n                    return ra[wa];\n                }));\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {more_people}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {more_people}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {more_people}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    more_people: ta\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n                var va = j.JSBNG__find(ma, \"span.more\");\n                o.set(va, ua, \"above\", \"center\");\n            });\n        }\n        \n        \n    ;\n    ;\n    }, ja = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa;\n            if (((na.author == n.user))) {\n                pa = i.tx._(\"You left the conversation.\");\n            }\n             else pa = i.tx._(\"{actor} left the conversation.\", {\n                actor: ga(oa)\n            });\n        ;\n        ;\n            i.setContent(ma, pa);\n        });\n    }, ka = function(ma, na) {\n        var oa = \"We were unable to fetch previous messages in this conversation.\";\n        i.setContent(ma, oa);\n    }, la = function(ma) {\n        return ((((ma.log_message_data.event_name === \"installing\")) || ((ma.log_message_data.event_name === \"install_canceled\"))));\n    };\n    e.exports = t;\n});\n__d(\"MercurySheetPolicy\", [], function(a, b, c, d, e, f) {\n    var g = {\n        canReplaceOpenSheet: function(h, i) {\n            if (((h.getType() == i.getType()))) {\n                return false;\n            }\n        ;\n        ;\n            if (((h.isPermanent() && !i.isPermanent()))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        }\n    };\n    e.exports = g;\n});\n__d(\"MercurySheetView\", [\"Animation\",\"ArbiterMixin\",\"MercurySheetPolicy\",\"CSS\",\"DOM\",\"Style\",\"MercurySheetTemplates\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"MercurySheetPolicy\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"MercurySheetTemplates\"), n = b(\"Vector\"), o = b(\"copyProperties\"), p = b(\"cx\"), q = 5000, r = function(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._tabMainElement = u;\n        this._openSheet = null;\n    };\n    o(r.prototype, h, {\n        destroy: function() {\n            k.empty(this._rootElement);\n        },\n        _openCommon: function(s, t) {\n            if (((this._openSheet && !i.canReplaceOpenSheet(this._openSheet, s)))) {\n                if (s.couldNotReplace) {\n                    s.couldNotReplace();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            this.clear(function() {\n                this._openSheet = s;\n                var u = m[\":fb:mercury:tab-sheet:loading\"].build().getRoot();\n                k.setContent(this._rootElement, u);\n                j.show(u);\n                j.show(this._rootElement);\n                s.render();\n                if (t) {\n                    j.addClass(this._tabMainElement, \"sheetSlide\");\n                    j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                    var v = n.getElementDimensions(this._rootElement).y;\n                    l.set(this._rootElement, \"bottom\", ((v + \"px\")));\n                    this.inform(\"resize\");\n                    this._animation = new g(this._rootElement).to(\"bottom\", 0).duration(150).ease(g.ease.both).ondone(function() {\n                        j.removeClass(this._tabMainElement, \"sheetSlide\");\n                        j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                        this.inform(\"resize\");\n                    }.bind(this)).go();\n                }\n                 else this.inform(\"resize\");\n            ;\n            ;\n                if (!s.isPermanent()) {\n                    var w = q;\n                    if (s.getCloseTimeout) {\n                        w = s.getCloseTimeout();\n                    }\n                ;\n                ;\n                    var x = this.getAutoCloseCallback(s);\n                    this._sheetCloseHandler = this.close.bind(this, s, x).defer(w, false);\n                    if (s.timeoutCanBeReset) {\n                        s.setResetTimeoutCallback(this.resetTimeout.bind(this));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        getAutoCloseCallback: function(s) {\n            if (!s.autoCloseCallback) {\n                return null;\n            }\n        ;\n        ;\n            return s.autoCloseCallback.bind(s);\n        },\n        resetTimeout: function(s, t) {\n            JSBNG__clearTimeout(this._sheetCloseHandler);\n            var u = this.getAutoCloseCallback(s);\n            this._sheetCloseHandler = this.close.bind(this, s, u).defer(t, false);\n        },\n        set: function(s) {\n            return this._openCommon(s, false);\n        },\n        open: function(s) {\n            return this._openCommon(s, true);\n        },\n        close: function(s, t) {\n            if (((this._openSheet != s))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._openSheet) {\n                ((t && t()));\n                return;\n            }\n        ;\n        ;\n            if (this._animation) {\n                this._animation.JSBNG__stop();\n            }\n        ;\n        ;\n            if (this._sheetCloseHandler) {\n                JSBNG__clearTimeout(this._sheetCloseHandler);\n                this._sheetCloseHandler = null;\n            }\n        ;\n        ;\n            j.addClass(this._tabMainElement, \"sheetSlide\");\n            j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n            var u = n.getElementDimensions(this._rootElement).y;\n            this.inform(\"resize\");\n            this._animation = new g(this._rootElement).to(\"bottom\", ((u + \"px\"))).duration(100).ease(g.ease.begin).ondone(function() {\n                k.empty(this._rootElement);\n                j.hide(this._rootElement);\n                j.removeClass(this._tabMainElement, \"sheetSlide\");\n                j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                this._openSheet = null;\n                this.inform(\"resize\");\n                ((t && t()));\n            }.bind(this)).go();\n        },\n        clear: function(s) {\n            this.close(this._openSheet, s);\n        }\n    });\n    e.exports = r;\n});\n__d(\"MercuryStickersData\", [\"Arbiter\",\"MercuryStickersInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryStickersInitialData\"), i = h.packs, j = {\n        getPacks: function() {\n            return i;\n        },\n        updatePackData: function(k) {\n            i = k.packs;\n            g.inform(\"MercuryStickers/updatedPacks\");\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryStickers\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"MercuryStickersData\",\"MercuryStickersFlyoutList.react\",\"Parent\",\"React\",\"SubscriptionsHandler\",\"Toggler\",\"UIPagelet\",\"XUISpinner.react\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryStickersData\"), m = b(\"MercuryStickersFlyoutList.react\"), n = b(\"Parent\"), o = b(\"React\"), p = b(\"SubscriptionsHandler\"), q = b(\"Toggler\"), r = b(\"UIPagelet\"), s = b(\"XUISpinner.react\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"cx\");\n    function w(x) {\n        this._packs = j.JSBNG__find(x, \".-cx-PRIVATE-fbMercuryStickersFlyout__packs\");\n        this._packSelector = j.JSBNG__find(x, \".-cx-PRIVATE-fbMercuryStickersFlyout__selector\");\n        this._loadedPacks = {\n            emoticons: true\n        };\n        var y = n.byClass(x, \"uiToggle\"), z = q.listen(\"show\", y, function() {\n            this._renderPackList();\n            this._subscriptions.addSubscriptions(g.subscribe(\"MercuryStickers/updatedPacks\", this._renderPackList.bind(this)));\n            this._selectPack(l.getPacks()[0].id);\n            q.unsubscribe(z);\n        }.bind(this));\n        this._subscriptions = new p();\n        this._subscriptions.addSubscriptions(k.listen(this._packs, \"click\", function(JSBNG__event) {\n            var aa = n.byClass(JSBNG__event.getTarget(), \"-cx-PRIVATE-fbMercuryStickersFlyout__sticker\");\n            if (aa) {\n                this._selectedSticker(aa);\n                q.hide(y);\n            }\n        ;\n        ;\n        }.bind(this)));\n    };\n;\n    t(w.prototype, h, {\n        _renderPackList: function() {\n            o.renderComponent(m({\n                onPackClick: this._selectPack.bind(this),\n                packs: l.getPacks()\n            }), this._packSelector);\n        },\n        _loadPack: function(x) {\n            if (this._loadedPacks[x]) {\n                return;\n            }\n        ;\n        ;\n            var y = this._getPackWithID(x);\n            o.renderComponent(s({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__spinner\"\n            }), y);\n            this._loadedPacks[x] = true;\n            r.loadFromEndpoint(\"StickerPackPagelet\", y, {\n                id: x\n            });\n        },\n        _getPackWithID: function(x) {\n            var y = j.scry(this._packs, ((((((\".-cx-PRIVATE-fbMercuryStickersFlyout__pack\" + \"[data-id=\\\"\")) + x)) + \"\\\"]\")))[0];\n            if (!y) {\n                y = j.create(\"div\", {\n                    className: \"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\",\n                    \"data-id\": x\n                });\n                j.appendContent(this._packs, y);\n            }\n        ;\n        ;\n            return y;\n        },\n        _selectedSticker: function(x) {\n            var y = parseInt(x.getAttribute(\"data-id\"), 10);\n            this.inform(\"stickerselected\", {\n                id: y\n            });\n        },\n        _selectPack: function(x) {\n            j.scry(this._packs, \".-cx-PRIVATE-fbMercuryStickersFlyout__pack\").forEach(i.hide);\n            this._loadPack(x);\n            i.show(this._getPackWithID(x));\n        },\n        destroy: function() {\n            ((this._subscriptions && this._subscriptions.release()));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Token\", [\"CSS\",\"DataStore\",\"DOM\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m, n) {\n        this.info = m;\n        this.paramName = n;\n    };\n;\n    j(l.prototype, {\n        getInfo: function() {\n            return this.info;\n        },\n        getText: function() {\n            return this.info.text;\n        },\n        getValue: function() {\n            return this.info.uid;\n        },\n        isFreeform: function() {\n            return !!this.info.freeform;\n        },\n        setSelected: function(m) {\n            g.conditionClass(this.getElement(), \"uiTokenSelected\", m);\n            return this;\n        },\n        getElement: function() {\n            if (!this.element) {\n                this.setElement(this.createElement());\n            }\n        ;\n        ;\n            return this.element;\n        },\n        setElement: function(m) {\n            h.set(m, \"Token\", this);\n            this.element = m;\n            return this;\n        },\n        isRemovable: function() {\n            return g.hasClass(this.element, \"removable\");\n        },\n        createElement: function(m, n) {\n            var o = this.paramName, p = this.getText(), q = this.getValue(), r = i.create(\"a\", {\n                href: \"#\",\n                \"aria-label\": k._(\"Remove {item}\", {\n                    item: p\n                }),\n                className: \"remove uiCloseButton uiCloseButtonSmall\"\n            });\n            if (m) {\n                g.addClass(r, \"uiCloseButtonSmallGray\");\n            }\n        ;\n        ;\n            var s = i.create(\"input\", {\n                type: \"hidden\",\n                value: q,\n                JSBNG__name: ((o + \"[]\")),\n                autocomplete: \"off\"\n            }), t = i.create(\"input\", {\n                type: \"hidden\",\n                value: p,\n                JSBNG__name: ((((\"text_\" + o)) + \"[]\")),\n                autocomplete: \"off\"\n            }), u = i.create(\"span\", {\n                className: \"removable uiToken\"\n            }, [p,s,t,r,]);\n            if (m) {\n                g.addClass(u, \"uiTokenGray\");\n            }\n        ;\n        ;\n            if (n) {\n                var v = i.create(\"i\", {\n                    className: n\n                });\n                i.prependContent(u, v);\n            }\n        ;\n        ;\n            return u;\n        }\n    });\n    e.exports = l;\n});\n__d(\"WeakToken\", [\"Class\",\"CSS\",\"Token\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"Token\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, i);\n    j(k.prototype, {\n        createElement: function() {\n            var l = this.parent.createElement(true, \"UFIWeakReferenceIcon\");\n            h.addClass(l, \"uiTokenWeakReference\");\n            return l;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Tokenizer\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMQuery\",\"DataStore\",\"JSBNG__Event\",\"Focus\",\"Input\",\"Keys\",\"Parent\",\"StickyPlaceholderInput\",\"Style\",\"JSBNG__TextMetrics\",\"Token\",\"UserAgent\",\"WeakToken\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DataStore\"), m = b(\"JSBNG__Event\"), n = b(\"Focus\"), o = b(\"Input\"), p = b(\"Keys\"), q = b(\"Parent\"), r = b(\"StickyPlaceholderInput\"), s = b(\"Style\"), t = b(\"JSBNG__TextMetrics\"), u = b(\"Token\"), v = b(\"UserAgent\"), w = b(\"WeakToken\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"emptyFunction\"), aa = 20;\n    function ba(ca, da) {\n        this.element = ca;\n        this.typeahead = da;\n        this.input = da.getCore().getElement();\n        l.set(this.element, \"Tokenizer\", this);\n    };\n;\n    ba.getInstance = function(ca) {\n        var da = q.byClass(ca, \"uiTokenizer\");\n        return ((da ? l.get(da, \"Tokenizer\") : null));\n    };\n    x(ba.prototype, h, {\n        inline: false,\n        maxTokens: null,\n        excludeDuplicates: true,\n        placeholder: \"\",\n        init: function(ca, da, ea, fa) {\n            this.init = z;\n            this.tokenarea = ca;\n            this.paramName = da;\n            if (!this.placeholder) {\n                this.placeholder = ((this.input.getAttribute(\"data-placeholder\") || \"\"));\n            }\n        ;\n        ;\n            x(this, ((fa || {\n            })));\n            this.initEvents();\n            this.initTypeahead();\n            this.reset(ea);\n            this.initBehaviors();\n            this.adjustWidth.bind(this).defer();\n            g.inform(\"Tokenizer/init\", this, g.BEHAVIOR_PERSISTENT);\n        },\n        reset: function(ca) {\n            this.tokens = [];\n            this.unique = {\n            };\n            if (ca) {\n                this.populate(ca);\n            }\n             else j.empty(this.tokenarea);\n        ;\n        ;\n            this.updateTokenarea();\n        },\n        populate: function(ca) {\n            var da = [];\n            this.tokens = this.getTokenElements().map(function(ea, fa) {\n                var ga = ca[fa];\n                da.push(this._tokenKey(ga));\n                return this.createToken(ga, ea);\n            }, this);\n            this.unique = y(da, this.tokens);\n        },\n        getElement: function() {\n            return this.element;\n        },\n        getTypeahead: function() {\n            return this.typeahead;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        initBehaviors: function() {\n            this.behaviors = ((this.behaviors || []));\n            if (((this.behaviors instanceof Array))) {\n                this.behaviors.forEach(function(ea) {\n                    ea.behavior(this, ea.config);\n                }.bind(this));\n            }\n             else {\n                var fin298keys = ((window.top.JSBNG_Replay.forInKeys)(((this.behaviors || {\n                })))), fin298i = (0);\n                var ca;\n                for (; (fin298i < fin298keys.length); (fin298i++)) {\n                    ((ca) = (fin298keys[fin298i]));\n                    {\n                        var da = ((window.TokenizerBehaviors && window.TokenizerBehaviors[ca]));\n                        da.call(null, this, this.behaviors[ca]);\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        initTypeahead: function() {\n            var ca = this.typeahead.getCore();\n            ca.resetOnSelect = true;\n            ca.setValueOnSelect = false;\n            ca.preventFocusChangeOnTab = true;\n            if (this.inline) {\n                var da = this.typeahead.getView();\n                i.addClass(da.getElement(), \"uiInlineTokenizerView\");\n            }\n        ;\n        ;\n            this.typeahead.subscribe(\"select\", function(ea, fa) {\n                var ga = fa.selected;\n                if (((\"uid\" in ga))) {\n                    this.updateInput();\n                    this.addToken(this.createToken(ga));\n                }\n            ;\n            ;\n            }.bind(this));\n            this.typeahead.subscribe(\"JSBNG__blur\", this.handleBlur.bind(this));\n        },\n        handleBlur: function(JSBNG__event) {\n            this.inform(\"JSBNG__blur\", {\n                JSBNG__event: JSBNG__event\n            });\n            this.updatePlaceholder();\n        },\n        initEvents: function() {\n            var ca = this.handleEvents.bind(this), da = ((((v.firefox() < 4)) ? \"keypress\" : \"keydown\"));\n            m.listen(this.tokenarea, {\n                click: ca,\n                keydown: ca\n            });\n            m.listen(this.input, \"paste\", this.paste.bind(this));\n            m.listen(this.input, da, this.keydown.bind(this));\n        },\n        handleEvents: function(JSBNG__event) {\n            var ca = JSBNG__event.getTarget(), da = ((ca && this.getTokenElementFromTarget(ca)));\n            if (!da) {\n                return;\n            }\n        ;\n        ;\n            if (((((JSBNG__event.type != \"keydown\")) || ((m.getKeyCode(JSBNG__event) == p.RETURN))))) {\n                this.processEvents(JSBNG__event, ca, da);\n            }\n        ;\n        ;\n        },\n        processEvents: function(JSBNG__event, ca, da) {\n            if (q.byClass(ca, \"remove\")) {\n                var ea = da.nextSibling;\n                ea = ((ea && k.scry(da.nextSibling, \".remove\")[0]));\n                var fa = this.getTokenFromElement(da);\n                fa = this.addTokenData(fa, ca);\n                this.removeToken(fa);\n                this.focusOnTokenRemoval(JSBNG__event, ea);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        focusOnTokenRemoval: function(JSBNG__event, ca) {\n            n.set(((((((JSBNG__event.type == \"keydown\")) && ca)) || this.input)));\n        },\n        addTokenData: function(ca, da) {\n            return ca;\n        },\n        keydown: function(JSBNG__event) {\n            this.inform(\"keydown\", {\n                JSBNG__event: JSBNG__event\n            });\n            var ca = m.getKeyCode(JSBNG__event), da = this.input;\n            if (((((this.inline && ((ca == p.BACKSPACE)))) && o.isEmpty(da)))) {\n                var ea = this.getLastToken();\n                if (((ea && ea.isRemovable()))) {\n                    this.removeToken(ea);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.updateInput();\n        },\n        paste: function(JSBNG__event) {\n            this.inform(\"paste\", {\n                JSBNG__event: JSBNG__event\n            });\n            this.updateInput(true);\n        },\n        focusInput: function() {\n            n.set(this.input);\n        },\n        updateInput: function(ca) {\n            if (!this.inline) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__setTimeout(function() {\n                this.adjustWidth(this.input.value);\n                if (ca) {\n                    this.input.value = this.input.value;\n                }\n            ;\n            ;\n            }.bind(this), 20);\n            r.setPlaceholderText(this.input, \"\");\n            this.inform(\"resize\");\n        },\n        setPlaceholder: function(ca) {\n            this.placeholder = ca;\n            if (this.stickyPlaceholder) {\n                r.setPlaceholderText(this.input, ca);\n            }\n        ;\n        ;\n            this.updatePlaceholder();\n        },\n        updatePlaceholder: function() {\n            if (((!this.inline || this.input.value))) {\n                return;\n            }\n        ;\n        ;\n            var ca = !this.tokens.length, da = \"\";\n            if (((ca || this.stickyPlaceholder))) {\n                this.adjustWidth(this.placeholder);\n                da = this.placeholder;\n            }\n             else this.adjustWidth(this.input.value);\n        ;\n        ;\n            r.setPlaceholderText(this.input, da);\n        },\n        adjustWidth: function(ca) {\n            if (((!this.inline || !this._getIsInDOM()))) {\n                return;\n            }\n        ;\n        ;\n            if (((!ca && ((this.input.value === \"\"))))) {\n                ca = this.placeholder;\n            }\n        ;\n        ;\n            var da = aa;\n            if (((((((ca !== this.placeholder)) || !this.getTokens().length)) || this.stickyPlaceholder))) {\n                var ea = this._getMetrics().measure(ca);\n                da = ((((ea.width + this._getWidthOffset())) + 10));\n            }\n        ;\n        ;\n            s.set(this.input, \"width\", ((da + \"px\")));\n            this.inform(\"resize\");\n        },\n        getToken: function(ca) {\n            return ((this.unique[ca] || null));\n        },\n        getTokens: function() {\n            return ((this.tokens || []));\n        },\n        getTokenElements: function() {\n            return k.scry(this.tokenarea, \"span.uiToken\");\n        },\n        getTokenElementFromTarget: function(ca) {\n            return q.byClass(ca, \"uiToken\");\n        },\n        getTokenFromElement: function(ca) {\n            return l.get(ca, \"Token\");\n        },\n        getTokenValues: function() {\n            if (!this.tokens) {\n                return [];\n            }\n        ;\n        ;\n            return this.tokens.map(function(ca) {\n                return ca.getValue();\n            });\n        },\n        getFirstToken: function() {\n            return ((this.tokens[0] || null));\n        },\n        getLastToken: function() {\n            return ((this.tokens[((this.tokens.length - 1))] || null));\n        },\n        hasMaxTokens: function() {\n            return ((this.maxTokens && ((this.maxTokens <= this.tokens.length))));\n        },\n        createToken: function(ca, da) {\n            var ea = this.getToken(this._tokenKey(ca));\n            if (!ea) {\n                ea = ((ca.weak_reference ? new w(ca, this.paramName) : new u(ca, this.paramName)));\n            }\n        ;\n        ;\n            ((da && ea.setElement(da)));\n            return ea;\n        },\n        addToken: function(ca) {\n            if (this.hasMaxTokens()) {\n                return;\n            }\n        ;\n        ;\n            var da = this._tokenKey(ca.getInfo());\n            if (((da in this.unique))) {\n                return;\n            }\n        ;\n        ;\n            this.unique[da] = ca;\n            this.tokens.push(ca);\n            this.insertToken(ca);\n            this.updateTokenarea();\n            this.inform(\"addToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        insertToken: function(ca) {\n            j.appendContent(this.tokenarea, ca.getElement());\n        },\n        removeToken: function(ca) {\n            if (!ca) {\n                return;\n            }\n        ;\n        ;\n            var da = this.tokens.indexOf(ca);\n            if (((da < 0))) {\n                return;\n            }\n        ;\n        ;\n            this.tokens.splice(this.tokens.indexOf(ca), 1);\n            delete this.unique[this._tokenKey(ca.getInfo())];\n            j.remove(ca.getElement());\n            this.updateTokenarea();\n            this.inform(\"removeToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        removeAllTokens: function() {\n            this.reset();\n            this.inform(\"removeAllTokens\");\n        },\n        updateTokenarea: function() {\n            var ca = this.typeahead.getCore(), da = this.getTokenValues();\n            if (this.excludeDuplicates) {\n                ((this._exclusions || (this._exclusions = ca.getExclusions())));\n                ca.setExclusions(da.concat(this._exclusions));\n            }\n        ;\n        ;\n            ca.setEnabled(!this.hasMaxTokens());\n            this.updateTokenareaVisibility();\n            this.updatePlaceholder();\n            this.inform(\"resize\");\n        },\n        updateTokenareaVisibility: function() {\n            i.conditionShow(this.tokenarea, ((this.tokens.length !== 0)));\n        },\n        _tokenKey: function(ca) {\n            return ((ca.uid + ((ca.freeform ? \":\" : \"\"))));\n        },\n        _widthOffset: null,\n        _getWidthOffset: function() {\n            if (((this._widthOffset === null))) {\n                var ca = this.input.clientWidth, da = s.getFloat(this.input, \"width\");\n                if (((ca == da))) {\n                    this._widthOffset = ((s.getFloat(this.input, \"paddingLeft\") + s.getFloat(this.input, \"paddingRight\")));\n                }\n                 else this._widthOffset = 0;\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._widthOffset;\n        },\n        _metrics: null,\n        _getMetrics: function() {\n            if (!this._metrics) {\n                this._metrics = new t(this.input, this.inline);\n            }\n        ;\n        ;\n            return this._metrics;\n        },\n        _getIsInDOM: function() {\n            return ((this._isInDOM || (this._isInDOM = k.contains(JSBNG__document.body, this.input))));\n        }\n    });\n    ba.init = function(ca, da) {\n        ca.init(da.tokenarea, da.param_name, da.initial_info, da.options);\n    };\n    e.exports = ba;\n});\n__d(\"MercuryTypeahead\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"DOMDimensions\",\"Input\",\"Keys\",\"MercuryTypeaheadTemplates\",\"Tokenizer\",\"Typeahead\",\"TypeaheadCore\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"Input\"), l = b(\"Keys\"), m = b(\"MercuryTypeaheadTemplates\"), n = b(\"Tokenizer\"), o = b(\"Typeahead\"), p = b(\"TypeaheadCore\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = function(t, u) {\n        this._domElement = null;\n        this._typeahead = null;\n        this._tokenizer = null;\n        this._placeholder = \"\";\n        this._exclusions = [];\n        this._viewNodeOrID = null;\n        this._viewOptions = {\n            renderer: \"compact\",\n            autoSelect: true\n        };\n        this._tokenizerBehaviors = [];\n        this._heightPrev = null;\n        this._dataSource = t;\n        this._view = u;\n    };\n    q(s.prototype, h);\n    q(s.prototype, {\n        setPlaceholder: function(t) {\n            this._placeholder = t;\n            return this;\n        },\n        setExcludedParticipants: function(t) {\n            this._exclusions = [];\n            t.forEach(function(u) {\n                var v = u.indexOf(\":\");\n                if (((u.substr(0, v) == \"fbid\"))) {\n                    this._exclusions.push(u.substr(((v + 1))));\n                }\n            ;\n            ;\n            }.bind(this));\n            return this;\n        },\n        setViewNodeID: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setViewNode: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setFullWidthView: function(t) {\n            var u = i.create(\"div\", {\n                className: \"-cx-PRIVATE-mercuryTypeahead__typeaheadview uiTypeaheadView\"\n            });\n            i.setContent(t, u);\n            this.setViewNode(u);\n        },\n        setViewOption: function(t, u) {\n            this._viewOptions[t] = u;\n        },\n        addTokenizerBehavior: function(t) {\n            this._tokenizerBehaviors.push(t);\n        },\n        build: function(t) {\n            if (this._domElement) {\n                return;\n            }\n        ;\n        ;\n            var u = m[\":fb:mercury:tokenizer\"].build(), v = m[\":fb:mercury:typeahead\"].build();\n            this._domElement = u.getRoot();\n            i.appendContent(this._domElement, v.getRoot());\n            var w = v.getNode(\"textfield\");\n            k.setPlaceholder(w, this._placeholder);\n            w.setAttribute(\"data-placeholder\", this._placeholder);\n            this._input = w;\n            var x = {\n                node_id: this._viewNodeOrID,\n                ctor: this._view,\n                options: this._viewOptions\n            }, y = {\n                ctor: p,\n                options: {\n                    setValueOnSelect: true\n                }\n            };\n            this._typeahead = new o(this._dataSource, x, y, v.getRoot());\n            this._typeahead.init();\n            var z = {\n                inline: true,\n                behaviors: this._tokenizerBehaviors\n            };\n            this._tokenizer = new n(this._domElement, this._typeahead);\n            this._tokenizer.init(u.getNode(\"tokenarea\"), \"participants\", [], z);\n            this._tokenizer.subscribe([\"addToken\",\"removeToken\",\"removeAllTokens\",], this._tokensChanged.bind(this));\n            this._tokenizer.subscribe(\"resize\", function() {\n                this.inform(\"resize\");\n            }.bind(this));\n            g.listen(w, \"JSBNG__focus\", function() {\n                this._resetDataSource();\n                this._typeahead.init();\n            }.bind(this));\n            g.listen(this._domElement, \"click\", this.JSBNG__focus.bind(this));\n            g.listen(w, \"keydown\", this.keydown.bind(this));\n            this._heightPrev = j.getElementDimensions(this._domElement).height;\n        },\n        getElement: function() {\n            return this._domElement;\n        },\n        getSelectedParticipantIDs: function() {\n            var t = [];\n            if (this._tokenizer) {\n                ((this._tokenizer.getTokenValues() || [])).forEach(function(u) {\n                    t.push(((\"fbid:\" + u)));\n                });\n            }\n        ;\n        ;\n            return t;\n        },\n        getTokens: function() {\n            var t = [];\n            if (this._tokenizer) {\n                t = this._tokenizer.getTokens();\n            }\n        ;\n        ;\n            return t;\n        },\n        getTokenizer: function() {\n            return this._tokenizer;\n        },\n        keydown: function(JSBNG__event) {\n            if (((this._tokenizer.inline && ((JSBNG__event.keyCode == l.ESC))))) {\n                if (k.isEmpty(this._input)) {\n                    var t = this._tokenizer.getLastToken();\n                    if (((t && t.isRemovable()))) {\n                        this._tokenizer.removeToken(t);\n                    }\n                ;\n                ;\n                }\n                 else this._typeahead.getCore().reset();\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            ((this._tokenizer && this._tokenizer.removeAllTokens()));\n            ((this._typeahead && this._typeahead.getCore().reset()));\n        },\n        JSBNG__focus: function() {\n            ((this._tokenizer && this._tokenizer.focusInput()));\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _resetDataSource: function() {\n            this._dataSource.setExclusions(this._exclusions);\n        },\n        _tokensChanged: function() {\n            this.inform(\"tokens-changed\");\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotosUploadWaterfall\", [\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = {\n        APP_FLASH: \"flash_pro\",\n        APP_SIMPLE: \"simple\",\n        APP_ARCHIVE: \"archive\",\n        APP_COMPOSER: \"composer\",\n        APP_MESSENGER: \"messenger\",\n        APP_HTML5: \"html5\",\n        APP_CHAT: \"chat\",\n        INSTALL_CANCEL: 1,\n        INSTALL_INSTALL: 2,\n        INSTALL_UPDATE: 3,\n        INSTALL_REINSTALL: 4,\n        INSTALL_PERMA_CANCEL: 5,\n        INSTALL_SILENT_SKIP: 6,\n        INSTALL_DOWNLOAD: 7,\n        CERROR_RESIZING_FAILED: 6,\n        CERROR_MARKER_EXTRACTION_FAILED: 9,\n        BEGIN: 1,\n        UPLOAD_START: 4,\n        ALL_UPLOADS_DONE: 6,\n        CLIENT_ERROR: 7,\n        RECOVERABLE_CLIENT_ERROR: 12,\n        IMAGES_SELECTED: 9,\n        UPGRADE_REQUIRED: 11,\n        VERSION: 15,\n        SELECT_START: 18,\n        SELECT_CANCELED: 19,\n        CANCEL: 22,\n        CANCEL_DURING_UPLOAD: 83,\n        ONE_RESIZING_START: 2,\n        ONE_UPLOAD_DONE: 29,\n        ONE_RESIZING_DONE: 34,\n        PROGRESS_BAR_STOPPED: 44,\n        MISSED_BEAT: 45,\n        HEART_ATTACK: 46,\n        PUBLISH_START: 100,\n        PUBLISH_SUCCESS: 101,\n        PUBLISH_FAILURE: 102,\n        SESSION_POSTED: 72,\n        POST_PUBLISHED: 80,\n        ONE_UPLOAD_CANCELED: 81,\n        ONE_UPLOAD_CANCELED_DURING_UPLOAD: 82,\n        RESIZER_AVAILABLE: 20,\n        OVERLAY_FIRST: 61,\n        ASYNC_AVAILABLE: 63,\n        FALLBACK_TO_FLASH: 13,\n        RETRY_UPLOAD: 17,\n        TAGGED_ALL_FACES: 14,\n        VAULT_IMAGES_SELECTED: 62,\n        VAULT_CREATE_POST_CANCEL: 65,\n        VAULT_SEND_IN_MESSAGE_CLICKED: 66,\n        VAULT_DELETE_CANCEL: 68,\n        VAULT_ADD_TO_ALBUM_CANCEL: 74,\n        VAULT_SHARE_IN_AN_ALBUM_CLICKED: 76,\n        VAULT_SHARE_OWN_TIMELINE_CLICKED: 77,\n        VAULT_SHARE_FRIENDS_TIMELINE_CLICKED: 78,\n        VAULT_SHARE_IN_A_GROUP_CLICKED: 79,\n        METHOD_DRAGDROP: \"dragdrop\",\n        METHOD_FILE_SELECTOR: \"file_selector\",\n        METHOD_VAULT: \"vault\",\n        METHOD_PHOTOS_OF_YOU: \"photos_of_you\",\n        METHOD_RECENT_PHOTOS: \"recent_photos\",\n        VAULTBOX: \"vaultbox\",\n        GRID: \"grid\",\n        SPOTLIGHT_VAULT_VIEWER: \"spotlight_vault_viewer\",\n        sendSignal: function(i, j) {\n            new g(\"/ajax/photos/waterfall.php\", {\n                data: JSON.stringify(i)\n            }).setHandler(j).send();\n        }\n    };\n    e.exports = h;\n});\n__d(\"FreeformTokenizerBehavior\", [\"Input\",\"Keys\",\"JSBNG__Event\",\"function-extensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Input\"), h = b(\"Keys\"), i = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    function j(k, l) {\n        var m = ((l.tokenize_on_blur !== false)), n = ((l.tokenize_on_paste !== false)), o = ((l.matcher && new RegExp(l.matcher, \"i\"))), p = ((l.paste_split && new RegExp(l.paste_split))), q = ((l.select_on_comma !== false)), r = ((l.never_submit === true));\n        function s(JSBNG__event) {\n            var t = g.getValue(k.getInput()).trim();\n            if (((((p && JSBNG__event)) && ((JSBNG__event.type == \"paste\"))))) {\n                t = t.split(p);\n            }\n             else t = [t,];\n        ;\n        ;\n            var u = false;\n            for (var v = 0; ((v < t.length)); v++) {\n                var w = t[v].trim();\n                if (((w && ((!o || o.test(w)))))) {\n                    var x = {\n                        uid: w,\n                        text: w,\n                        freeform: true\n                    };\n                    k.addToken(k.createToken(x));\n                    u = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((JSBNG__event && u))) {\n                k.getTypeahead().getCore().afterSelect();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        };\n    ;\n        k.subscribe(\"keydown\", function(t, u) {\n            var JSBNG__event = u.JSBNG__event, v = i.getKeyCode(JSBNG__event);\n            if (((((q && ((v == h.COMMA)))) || ((v == h.RETURN))))) {\n                var w = k.getTypeahead().getView();\n                if (w.JSBNG__getSelection()) {\n                    w.select();\n                    JSBNG__event.kill();\n                }\n                 else s(JSBNG__event);\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((v == h.RETURN)) && r))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        });\n        k.subscribe(\"paste\", function(t, u) {\n            if (n) {\n                s.bind(null, u.JSBNG__event).defer(20);\n            }\n        ;\n        ;\n        });\n        k.subscribe(\"JSBNG__blur\", function(t, u) {\n            if (m) {\n                s();\n            }\n        ;\n        ;\n            k.getTypeahead().getCore().reset();\n        });\n    };\n;\n    e.exports = j;\n});");
// 15223
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_190[0](o59,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yh/r/SefZhlvAyH0.js",o60);
// undefined
o59 = null;
// undefined
o60 = null;
// 15559
fpc.call(JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_96[0], f920654002_2377,1373491956536);
// 15814
JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_512[0](undefined);
// 15819
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 16045
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o6,o72);
// undefined
o72 = null;
// 16121
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361[0](true);
// 16131
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_2[0]();
// 16137
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361[8](true);
// 16144
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361[2](true);
// 16148
fpc.call(JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_739[0], o79,undefined);
// undefined
o79 = null;
// 16171
o2.readyState = 3;
// undefined
o2 = null;
// 16169
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o61,o82);
// undefined
o82 = null;
// 16173
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o61,o83);
// undefined
o61 = null;
// undefined
o83 = null;
// 16176
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361[4](true);
// 16268
o66.JSBNG__status = null;
// 16315
o66.JSBNG__status = null;
// 16354
o66.JSBNG__status = null;
// undefined
o66 = null;
// 16206
fpc.call(JSBNG_Replay.s48bc6385ad36661d437816c45525368eecdb65f2_257[0], o78,undefined);
// undefined
o78 = null;
// 16381
fpc.call(JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_523[0], o87,undefined);
// undefined
o87 = null;
// 16452
o69.readyState = 4;
// undefined
o69 = null;
// 16504
o92.toString = f920654002_2485;
// undefined
o92 = null;
// 16450
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o6,o80);
// undefined
o80 = null;
// 16535
o6.transport = void 0;
// 16534
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o6,o97);
// undefined
o97 = null;
// 16622
o6.transport = void 0;
// 16621
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o6,o91);
// undefined
o6 = null;
// undefined
o91 = null;
// 16664
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 16672
fpc.call(JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_523[0], o77,undefined);
// undefined
o77 = null;
// 16678
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361[6](true);
// 16681
JSBNG_Replay.sbf5a653251628e13e041c7dc1bee5c6e52b9508d_361[10](true);
// 17210
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o9);
// undefined
o9 = null;
// 17785
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o24);
// undefined
o24 = null;
// 17852
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o33);
// undefined
o33 = null;
// 17919
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o39);
// undefined
o39 = null;
// 17986
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o40);
// undefined
o40 = null;
// 18053
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o54);
// undefined
o54 = null;
// 18120
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o65);
// undefined
o65 = null;
// 18127
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 18189
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o68);
// undefined
o68 = null;
// 18256
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o70);
// undefined
o70 = null;
// 18263
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 18489
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o75,o76);
// undefined
o76 = null;
// 18630
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o73);
// undefined
o73 = null;
// 18701
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o74);
// undefined
o74 = null;
// 18768
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o81);
// undefined
o81 = null;
// 18835
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o101);
// undefined
o101 = null;
// 18902
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o104);
// undefined
o104 = null;
// 18969
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o105);
// undefined
o105 = null;
// 19036
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o106);
// undefined
o106 = null;
// 19103
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o107);
// undefined
o107 = null;
// 19170
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o108);
// undefined
o108 = null;
// 19237
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o109);
// undefined
o109 = null;
// 19246
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 19251
o71.readyState = 2;
// 19249
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o75,o110);
// undefined
o110 = null;
// 19255
o71.readyState = 3;
// 19253
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o75,o111);
// undefined
o111 = null;
// 19259
o71.readyState = 4;
// undefined
o71 = null;
// 19301
o114.toString = f920654002_2485;
// undefined
o114 = null;
// 19257
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_270[0], o75,o112);
// undefined
o75 = null;
// undefined
o112 = null;
// 19424
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o113);
// undefined
o113 = null;
// 19431
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 19433
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 19534
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o116);
// undefined
o116 = null;
// 19652
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o115);
// undefined
o115 = null;
// 19675
o118.JSBNG__status = null;
// undefined
o118 = null;
// 19659
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 19744
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 19746
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 19814
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o117);
// undefined
o117 = null;
// 19821
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 19823
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 19825
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 20558
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o8);
// undefined
o8 = null;
// 21259
JSBNG_Replay.sedba73fa8ed79e84359ef405d7a57caf24a0f008_91[0]();
// 21322
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o23);
// undefined
o23 = null;
// 21329
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 21350
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 21408
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 21820
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o27);
// undefined
o27 = null;
// 21887
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o30);
// undefined
o30 = null;
// 21894
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 21896
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 21900
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 21966
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o31);
// undefined
o31 = null;
// 21973
JSBNG_Replay.scb38ed7c6aaa195a276ac7856568a7b9e8f51b72_133[0](false);
// 22001
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 22063
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o38);
// undefined
o38 = null;
// 22431
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o47);
// undefined
o47 = null;
// 22466
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 22506
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 23235
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o29);
// undefined
o29 = null;
// 23929
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 24019
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o34);
// undefined
o34 = null;
// 24071
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 24084
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 24976
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o28);
// undefined
o28 = null;
// 25047
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 25435
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 25499
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o32);
// undefined
o32 = null;
// 25761
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 26198
JSBNG_Replay.sedba73fa8ed79e84359ef405d7a57caf24a0f008_91[1]();
// 26261
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o42);
// undefined
o42 = null;
// 26455
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o43);
// undefined
o43 = null;
// 26541
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o48);
// undefined
o48 = null;
// 26548
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 26836
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o50);
// undefined
o50 = null;
// 26843
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 27133
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o51);
// undefined
o51 = null;
// 27140
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 27206
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o53);
// undefined
o53 = null;
// 27213
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 27215
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 27219
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 27285
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeyup",o119);
// undefined
o119 = null;
// 27292
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 27294
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_757[0](false);
// 27442
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeydown",o64);
// undefined
o64 = null;
// 27503
fpc.call(JSBNG_Replay.sbc5321dc786fbc14e87e4afbbcf739a7b46d985c_545[0], o17,"JSBNG__onkeypress",o120);
// undefined
o17 = null;
// undefined
o120 = null;
// 27510
JSBNG_Replay.s9e837b2f10d5863fbc6c047ef503c649f3a4a5d6_839[0](false);
// 27513
JSBNG_Replay.s3df1edd82977e382ad955fbdf4db49d8fb9307ea_226[0](o16);
// undefined
o16 = null;
// 27533
cb(); return null; }
finalize(); })();
